package org.bouncycastle.cmc; import java.io.IOException; import org.bouncycastle.asn1.ASN1Primitive; import org.bouncycastle.asn1.cms.ContentInfo; import org.bouncycastle.cert.X509CRLHolder; import org.bouncycastle.cert.X509CertificateHolder; import org.bouncycastle.cms.CMSException; import org.bouncycastle.cms.CMSSignedData; import org.bouncycastle.util.Encodable; import org.bouncycastle.util.Store; /** * Carrier for a Simple PKI Response. * <p> * A Simple PKI Response is defined in RFC 5272 as a CMS SignedData object with no EncapsulatedContentInfo * and no SignerInfos attached. * </p> */ public class SimplePKIResponse implements Encodable { private final CMSSignedData certificateResponse; private static ContentInfo parseBytes(byte[] responseEncoding) throws CMCException { try { return ContentInfo.getInstance(ASN1Primitive.fromByteArray(responseEncoding)); } catch (Exception e) { throw new CMCException("malformed data: " + e.getMessage(), e); } } /** * Create a SimplePKIResponse from the passed in bytes. * * @param responseEncoding BER/DER encoding of the certificate. * @throws IOException in the event of corrupted data, or an incorrect structure. */ public SimplePKIResponse(byte[] responseEncoding) throws CMCException { this(parseBytes(responseEncoding)); } /** * Create a SimplePKIResponse from the passed in ASN.1 structure. * * @param signedData a ContentInfo containing a SignedData. */ public SimplePKIResponse(ContentInfo signedData) throws CMCException { try { this.certificateResponse = new CMSSignedData(signedData); } catch (CMSException e) { throw new CMCException("malformed response: " + e.getMessage(), e); } if (certificateResponse.getSignerInfos().size() != 0) { throw new CMCException("malformed response: SignerInfo structures found"); } if (certificateResponse.getSignedContent() != null) { throw new CMCException("malformed response: Signed Content found"); } } /** * Return any X.509 certificate objects in this SimplePKIResponse structure as a Store of X509CertificateHolder objects. * * @return a Store of X509CertificateHolder objects. */ public Store<X509CertificateHolder> getCertificates() { return certificateResponse.getCertificates(); } /** * Return any X.509 CRL objects in this SimplePKIResponse structure as a Store of X509CRLHolder objects. * * @return a Store of X509CRLHolder objects. */ public Store<X509CRLHolder> getCRLs() { return certificateResponse.getCRLs(); } /** * return the ASN.1 encoded representation of this object. */ public byte[] getEncoded() throws IOException { return certificateResponse.getEncoded(); } }