blob: b82f1f1763207d08fa6bf4c6beade56ed2807662 [file] [log] [blame]
package org.bouncycastle.dvcs;
import org.bouncycastle.asn1.ASN1Encodable;
import org.bouncycastle.asn1.ASN1OctetString;
import org.bouncycastle.asn1.ASN1Sequence;
import org.bouncycastle.asn1.cms.ContentInfo;
import org.bouncycastle.asn1.cms.SignedData;
import org.bouncycastle.asn1.dvcs.DVCSObjectIdentifiers;
import org.bouncycastle.asn1.dvcs.ServiceType;
import org.bouncycastle.asn1.x509.GeneralName;
import org.bouncycastle.cms.CMSSignedData;
/**
* DVCRequest is general request to DVCS (RFC 3029).
* It represents requests for all types of services.
* Requests for different services differ in DVCData structure.
*/
public class DVCSRequest
extends DVCSMessage
{
private org.bouncycastle.asn1.dvcs.DVCSRequest asn1;
private DVCSRequestInfo reqInfo;
private DVCSRequestData data;
/**
* Constructs DVCRequest from CMS SignedData object.
*
* @param signedData the CMS SignedData object containing the request
* @throws DVCSConstructionException
*/
public DVCSRequest(CMSSignedData signedData)
throws DVCSConstructionException
{
this(SignedData.getInstance(signedData.toASN1Structure().getContent()).getEncapContentInfo());
}
/**
* Construct a DVCS Request from a ContentInfo
*
* @param contentInfo the contentInfo representing the DVCSRequest
* @throws DVCSConstructionException
*/
public DVCSRequest(ContentInfo contentInfo)
throws DVCSConstructionException
{
super(contentInfo);
if (!DVCSObjectIdentifiers.id_ct_DVCSRequestData.equals(contentInfo.getContentType()))
{
throw new DVCSConstructionException("ContentInfo not a DVCS Request");
}
try
{
if (contentInfo.getContent().toASN1Primitive() instanceof ASN1Sequence)
{
this.asn1 = org.bouncycastle.asn1.dvcs.DVCSRequest.getInstance(contentInfo.getContent());
}
else
{
this.asn1 = org.bouncycastle.asn1.dvcs.DVCSRequest.getInstance(ASN1OctetString.getInstance(contentInfo.getContent()).getOctets());
}
}
catch (Exception e)
{
throw new DVCSConstructionException("Unable to parse content: " + e.getMessage(), e);
}
this.reqInfo = new DVCSRequestInfo(asn1.getRequestInformation());
int service = reqInfo.getServiceType();
if (service == ServiceType.CPD.getValue().intValue())
{
this.data = new CPDRequestData(asn1.getData());
}
else if (service == ServiceType.VSD.getValue().intValue())
{
this.data = new VSDRequestData(asn1.getData());
}
else if (service == ServiceType.VPKC.getValue().intValue())
{
this.data = new VPKCRequestData(asn1.getData());
}
else if (service == ServiceType.CCPD.getValue().intValue())
{
this.data = new CCPDRequestData(asn1.getData());
}
else
{
throw new DVCSConstructionException("Unknown service type: " + service);
}
}
/**
* Return the ASN.1 DVCSRequest structure making up the body of this request.
*
* @return an org.bouncycastle.asn1.dvcs.DVCSRequest object.
*/
public ASN1Encodable getContent()
{
return asn1;
}
/**
* Get RequestInformation envelope.
*
* @return the request info object.
*/
public DVCSRequestInfo getRequestInfo()
{
return reqInfo;
}
/**
* Get data of DVCRequest.
* Depending on type of the request it could be different subclasses of DVCRequestData.
*
* @return the request Data object.
*/
public DVCSRequestData getData()
{
return data;
}
/**
* Get the transaction identifier of request.
*
* @return the GeneralName representing the Transaction Identifier.
*/
public GeneralName getTransactionIdentifier()
{
return asn1.getTransactionIdentifier();
}
}