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(); } }