FileDocCategorySizeDatePackage
CMSSignedData.javaAPI DocBouncy Castle Crypto API 1.41 (Java 1.5)18869Wed Oct 01 10:55:28 BST 2008org.bouncycastle.cms

CMSSignedData

public class CMSSignedData extends Object
general class for handling a pkcs7-signature message. A simple example of usage - note, in the example below the validity of the certificate isn't verified, just the fact that one of the certs matches the given signer...
CertStore certs = s.getCertificatesAndCRLs("Collection", "BC");
SignerInformationStore signers = s.getSignerInfos();
Collection c = signers.getSigners();
Iterator it = c.iterator();

while (it.hasNext())
{
SignerInformation signer = (SignerInformation)it.next();
Collection certCollection = certs.getCertificates(signer.getSID());

Iterator certIt = certCollection.iterator();
X509Certificate cert = (X509Certificate)certIt.next();

if (signer.verify(cert.getPublicKey()))
{
verified++;
}
}

Fields Summary
private static final CMSSignedHelper
HELPER
org.bouncycastle.asn1.cms.SignedData
signedData
org.bouncycastle.asn1.cms.ContentInfo
contentInfo
CMSProcessable
signedContent
CertStore
certStore
SignerInformationStore
signerInfoStore
org.bouncycastle.x509.X509Store
attributeStore
org.bouncycastle.x509.X509Store
certificateStore
org.bouncycastle.x509.X509Store
crlStore
private Map
hashes
Constructors Summary
private CMSSignedData(CMSSignedData c)


     
           
    
        this.signedData = c.signedData;
        this.contentInfo = c.contentInfo;
        this.signedContent = c.signedContent;
        this.certStore = c.certStore;
        this.signerInfoStore = c.signerInfoStore;
    
public CMSSignedData(byte[] sigBlock)

        this(CMSUtils.readContentInfo(sigBlock));
    
public CMSSignedData(CMSProcessable signedContent, byte[] sigBlock)

        this(signedContent, CMSUtils.readContentInfo(sigBlock));
    
public CMSSignedData(Map hashes, byte[] sigBlock)
Content with detached signature, digests precomputed

param
hashes a map of precomputed digests for content indexed by name of hash.
param
sigBlock the signature object.

        this(hashes, CMSUtils.readContentInfo(sigBlock));
    
public CMSSignedData(CMSProcessable signedContent, InputStream sigData)
base constructor - content with detached signature.

param
signedContent the content that was signed.
param
sigData the signature object.

        this(signedContent, CMSUtils.readContentInfo(new ASN1InputStream(sigData)));
    
public CMSSignedData(InputStream sigData)
base constructor - with encapsulated content

        this(CMSUtils.readContentInfo(sigData));
    
public CMSSignedData(CMSProcessable signedContent, org.bouncycastle.asn1.cms.ContentInfo sigData)

        this.signedContent = signedContent;
        this.contentInfo = sigData;
        this.signedData = SignedData.getInstance(contentInfo.getContent());
    
public CMSSignedData(Map hashes, org.bouncycastle.asn1.cms.ContentInfo sigData)

        this.hashes = hashes;
        this.contentInfo = sigData;
        this.signedData = SignedData.getInstance(contentInfo.getContent());
    
public CMSSignedData(org.bouncycastle.asn1.cms.ContentInfo sigData)

        this.contentInfo = sigData;
        this.signedData = SignedData.getInstance(contentInfo.getContent());

        //
        // this can happen if the signed message is sent simply to send a
        // certificate chain.
        //
        if (signedData.getEncapContentInfo().getContent() != null)
        {
            this.signedContent = new CMSProcessableByteArray(
                    ((ASN1OctetString)(signedData.getEncapContentInfo()
                                                .getContent())).getOctets());
        }
        else
        {
            this.signedContent = null;
        }
    
Methods Summary
public org.bouncycastle.x509.X509StoregetAttributeCertificates(java.lang.String type, java.lang.String provider)
return a X509Store containing the attribute certificates, if any, contained in this message.

param
type type of store to create
param
provider name of provider to use
return
a store of attribute certificates
exception
NoSuchProviderException if the provider requested isn't available.
exception
NoSuchStoreException if the store type isn't available.
exception
CMSException if a general exception prevents creation of the X509Store

        return getAttributeCertificates(type, CMSUtils.getProvider(provider));
    
public org.bouncycastle.x509.X509StoregetAttributeCertificates(java.lang.String type, java.security.Provider provider)
return a X509Store containing the attribute certificates, if any, contained in this message.

param
type type of store to create
param
provider provider to use
return
a store of attribute certificates
exception
NoSuchStoreException if the store type isn't available.
exception
CMSException if a general exception prevents creation of the X509Store

        if (attributeStore == null)
        {
            attributeStore = HELPER.createAttributeStore(type, provider, signedData.getCertificates());
        }

        return attributeStore;
    
public org.bouncycastle.x509.X509StoregetCRLs(java.lang.String type, java.lang.String provider)
return a X509Store containing CRLs, if any, contained in this message.

param
type type of store to create
param
provider name of provider to use
return
a store of CRLs
exception
NoSuchProviderException if the provider requested isn't available.
exception
NoSuchStoreException if the store type isn't available.
exception
CMSException if a general exception prevents creation of the X509Store

        return getCRLs(type, CMSUtils.getProvider(provider));
    
public org.bouncycastle.x509.X509StoregetCRLs(java.lang.String type, java.security.Provider provider)
return a X509Store containing CRLs, if any, contained in this message.

param
type type of store to create
param
provider provider to use
return
a store of CRLs
exception
NoSuchStoreException if the store type isn't available.
exception
CMSException if a general exception prevents creation of the X509Store

        if (crlStore == null)
        {
            crlStore = HELPER.createCRLsStore(type, provider, signedData.getCRLs());
        }

        return crlStore;
    
public org.bouncycastle.x509.X509StoregetCertificates(java.lang.String type, java.lang.String provider)
return a X509Store containing the public key certificates, if any, contained in this message.

param
type type of store to create
param
provider name of provider to use
return
a store of public key certificates
exception
NoSuchProviderException if the provider requested isn't available.
exception
NoSuchStoreException if the store type isn't available.
exception
CMSException if a general exception prevents creation of the X509Store

        return getCertificates(type, CMSUtils.getProvider(provider));
    
public org.bouncycastle.x509.X509StoregetCertificates(java.lang.String type, java.security.Provider provider)
return a X509Store containing the public key certificates, if any, contained in this message.

param
type type of store to create
param
provider provider to use
return
a store of public key certificates
exception
NoSuchStoreException if the store type isn't available.
exception
CMSException if a general exception prevents creation of the X509Store

        if (certificateStore == null)
        {
            certificateStore = HELPER.createCertificateStore(type, provider, signedData.getCertificates());
        }

        return certificateStore;
    
public java.security.cert.CertStoregetCertificatesAndCRLs(java.lang.String type, java.lang.String provider)
return a CertStore containing the certificates and CRLs associated with this message.

exception
NoSuchProviderException if the provider requested isn't available.
exception
NoSuchAlgorithmException if the cert store isn't available.
exception
CMSException if a general exception prevents creation of the CertStore

        return getCertificatesAndCRLs(type, CMSUtils.getProvider(provider));
    
public java.security.cert.CertStoregetCertificatesAndCRLs(java.lang.String type, java.security.Provider provider)
return a CertStore containing the certificates and CRLs associated with this message.

exception
NoSuchAlgorithmException if the cert store isn't available.
exception
CMSException if a general exception prevents creation of the CertStore

        if (certStore == null)
        {
            ASN1Set certSet = signedData.getCertificates();
            ASN1Set crlSet = signedData.getCRLs();

            certStore = HELPER.createCertStore(type, provider, certSet, crlSet);
        }

        return certStore;
    
public org.bouncycastle.asn1.cms.ContentInfogetContentInfo()
return the ContentInfo

        return contentInfo;
    
public byte[]getEncoded()
return the ASN.1 encoded representation of this object.

        return contentInfo.getEncoded();
    
public CMSProcessablegetSignedContent()

        return signedContent;
    
public java.lang.StringgetSignedContentTypeOID()
Return the a string representation of the OID associated with the encapsulated content info structure carried in the signed data.

return
the OID for the content type.

        return signedData.getEncapContentInfo().getContentType().getId();
    
public SignerInformationStoregetSignerInfos()
return the collection of signers that are associated with the signatures for the message.

        if (signerInfoStore == null)
        {
            ASN1Set         s = signedData.getSignerInfos();
            List            signerInfos = new ArrayList();

            for (int i = 0; i != s.size(); i++)
            {
                if (hashes == null)
                {
                    signerInfos.add(new SignerInformation(SignerInfo.getInstance(s.getObjectAt(i)), signedData.getEncapContentInfo().getContentType(), signedContent, null));
                }
                else
                {
                    SignerInfo info = SignerInfo.getInstance(s.getObjectAt(i));

                    byte[] hash = (byte[])hashes.get(info.getDigestAlgorithm().getObjectId().getId());

                    signerInfos.add(new SignerInformation(info, signedData.getEncapContentInfo().getContentType(), null, new BaseDigestCalculator(hash)));
                }
            }

            signerInfoStore = new SignerInformationStore(signerInfos);
        }

        return signerInfoStore;
    
public intgetVersion()
Return the version number for this object

        return signedData.getVersion().getValue().intValue();
    
private static org.bouncycastle.asn1.x509.AlgorithmIdentifiermakeAlgId(java.lang.String oid, byte[] params)

        if (params != null)
        {
            return new AlgorithmIdentifier(
                            new DERObjectIdentifier(oid), makeObj(params));
        }
        else
        {
            return new AlgorithmIdentifier(
                            new DERObjectIdentifier(oid), new DERNull());
        }
    
private static org.bouncycastle.asn1.DERObjectmakeObj(byte[] encoding)

        if (encoding == null)
        {
            return null;
        }

        ASN1InputStream         aIn = new ASN1InputStream(encoding);

        return aIn.readObject();
    
public static org.bouncycastle.cms.CMSSignedDatareplaceCertificatesAndCRLs(org.bouncycastle.cms.CMSSignedData signedData, java.security.cert.CertStore certsAndCrls)
Replace the certificate and CRL information associated with this CMSSignedData object with the new one passed in.

param
signedData the signed data object to be used as a base.
param
certsAndCrls the new certificates and CRLs to be used.
return
a new signed data object.
exception
CMSException if there is an error processing the CertStore

        //
        // copy
        //
        CMSSignedData   cms = new CMSSignedData(signedData);
        
        //
        // replace the store
        //
        cms.certStore = certsAndCrls;
        
        //
        // replace the certs and crls in the SignedData object
        //
        ASN1Set             certs = null;
        ASN1Set             crls = null;

        try
        {
            ASN1Set set = CMSUtils.createBerSetFromList(CMSUtils.getCertificatesFromStore(certsAndCrls));

            if (set.size() != 0)
            {
                certs = set;
            }
        }
        catch (CertStoreException e)
        {
            throw new CMSException("error getting certs from certStore", e);
        }

        try
        {
            ASN1Set set = CMSUtils.createBerSetFromList(CMSUtils.getCRLsFromStore(certsAndCrls));

            if (set.size() != 0)
            {
                crls = set;
            }
        }
        catch (CertStoreException e)
        {
            throw new CMSException("error getting crls from certStore", e);
        }
        
        //
        // replace the CMS structure.
        //
        cms.signedData = new SignedData(signedData.signedData.getDigestAlgorithms(), 
                                   signedData.signedData.getEncapContentInfo(),
                                   certs,
                                   crls,
                                   signedData.signedData.getSignerInfos());
        
        //
        // replace the contentInfo with the new one
        //
        cms.contentInfo = new ContentInfo(cms.contentInfo.getContentType(), cms.signedData);
        
        return cms;
    
public static org.bouncycastle.cms.CMSSignedDatareplaceSigners(org.bouncycastle.cms.CMSSignedData signedData, SignerInformationStore signerInformationStore)
Replace the signerinformation store associated with this CMSSignedData object with the new one passed in. You would probably only want to do this if you wanted to change the unsigned attributes associated with a signer, or perhaps delete one.

param
signedData the signed data object to be used as a base.
param
signerInformationStore the new signer information store to use.
return
a new signed data object.

        //
        // copy
        //
        CMSSignedData   cms = new CMSSignedData(signedData);
        
        //
        // replace the store
        //
        cms.signerInfoStore = signerInformationStore;

        //
        // replace the signers in the SignedData object
        //
        ASN1EncodableVector digestAlgs = new ASN1EncodableVector();
        ASN1EncodableVector vec = new ASN1EncodableVector();
        
        Iterator    it = signerInformationStore.getSigners().iterator();
        while (it.hasNext())
        {
            SignerInformation   signer = (SignerInformation)it.next();
            AlgorithmIdentifier digAlgId;

            try
            {
                digAlgId = makeAlgId(signer.getDigestAlgOID(),
                                                       signer.getDigestAlgParams());
            }
            catch (IOException e)
            {
                throw new RuntimeException("encoding error.", e);
            }

            digestAlgs.add(digAlgId);
            vec.add(signer.toSignerInfo());
        }

        ASN1Set             digests = new DERSet(digestAlgs);
        ASN1Set             signers = new DERSet(vec);
        ASN1Sequence        sD = (ASN1Sequence)signedData.signedData.getDERObject();

        vec = new ASN1EncodableVector();
        
        //
        // signers are the last item in the sequence.
        //
        vec.add(sD.getObjectAt(0)); // version
        vec.add(digests);

        for (int i = 2; i != sD.size() - 1; i++)
        {
            vec.add(sD.getObjectAt(i));
        }
        
        vec.add(signers);
        
        cms.signedData = SignedData.getInstance(new BERSequence(vec));
        
        //
        // replace the contentInfo with the new one
        //
        cms.contentInfo = new ContentInfo(cms.contentInfo.getContentType(), cms.signedData);
        
        return cms;