SignedData.java revision a198e1ecc615e26a167d0f2dca9fa7e5fc62de10
147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.orgpackage org.bouncycastle.asn1.cms;
247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org
347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.orgimport java.util.Enumeration;
447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org
547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.orgimport org.bouncycastle.asn1.ASN1EncodableVector;
647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.orgimport org.bouncycastle.asn1.ASN1Integer;
747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.orgimport org.bouncycastle.asn1.ASN1Object;
847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.orgimport org.bouncycastle.asn1.ASN1ObjectIdentifier;
947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.orgimport org.bouncycastle.asn1.ASN1Primitive;
1047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.orgimport org.bouncycastle.asn1.ASN1Sequence;
1147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.orgimport org.bouncycastle.asn1.ASN1Set;
1247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.orgimport org.bouncycastle.asn1.ASN1TaggedObject;
1347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.orgimport org.bouncycastle.asn1.BERSequence;
1447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.orgimport org.bouncycastle.asn1.BERSet;
1547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.orgimport org.bouncycastle.asn1.BERTaggedObject;
1647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.orgimport org.bouncycastle.asn1.DERTaggedObject;
1747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org
1847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org/**
1947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org * a signed data object.
2047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org */
2147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.orgpublic class SignedData
2247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org    extends ASN1Object
2347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org{
2447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org    private static final ASN1Integer VERSION_1 = new ASN1Integer(1);
2547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org    private static final ASN1Integer VERSION_3 = new ASN1Integer(3);
2647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org    private static final ASN1Integer VERSION_4 = new ASN1Integer(4);
2747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org    private static final ASN1Integer VERSION_5 = new ASN1Integer(5);
2847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org
2947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org    private ASN1Integer version;
3047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org    private ASN1Set     digestAlgorithms;
3147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org    private ContentInfo contentInfo;
3247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org    private ASN1Set     certificates;
3347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org    private ASN1Set     crls;
3447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org    private ASN1Set     signerInfos;
3547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org    private boolean certsBer;
3647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org    private boolean        crlsBer;
3747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org
3847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org    public static SignedData getInstance(
3947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org        Object  o)
4047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org    {
4147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org        if (o instanceof SignedData)
4247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org        {
4347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org            return (SignedData)o;
4447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org        }
4547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org        else if (o != null)
4647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org        {
4747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org            return new SignedData(ASN1Sequence.getInstance(o));
4847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org        }
4947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org
5047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org        return null;
5147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org    }
5247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org
5347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org    public SignedData(
5447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org        ASN1Set     digestAlgorithms,
5547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org        ContentInfo contentInfo,
5647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org        ASN1Set     certificates,
5747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org        ASN1Set     crls,
5847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org        ASN1Set     signerInfos)
5947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org    {
6047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org        this.version = calculateVersion(contentInfo.getContentType(), certificates, crls, signerInfos);
6147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org        this.digestAlgorithms = digestAlgorithms;
6247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org        this.contentInfo = contentInfo;
6347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org        this.certificates = certificates;
6447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org        this.crls = crls;
6547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org        this.signerInfos = signerInfos;
6647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org        this.crlsBer = crls instanceof BERSet;
6747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org        this.certsBer = certificates instanceof BERSet;
6847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org    }
6947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org
7047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org
7147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org    // RFC3852, section 5.1:
7247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org    // IF ((certificates is present) AND
7347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org    //    (any certificates with a type of other are present)) OR
7447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org    //    ((crls is present) AND
7547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org    //    (any crls with a type of other are present))
7647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org    // THEN version MUST be 5
7747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org    // ELSE
7847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org    //    IF (certificates is present) AND
7947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org    //       (any version 2 attribute certificates are present)
8047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org    //    THEN version MUST be 4
8147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org    //    ELSE
8247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org    //       IF ((certificates is present) AND
8347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org    //          (any version 1 attribute certificates are present)) OR
8447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org    //          (any SignerInfo structures are version 3) OR
8547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org    //          (encapContentInfo eContentType is other than id-data)
8647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org    //       THEN version MUST be 3
8747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org    //       ELSE version MUST be 1
8847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org    //
8947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org    private ASN1Integer calculateVersion(
9047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org        ASN1ObjectIdentifier contentOid,
9147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org        ASN1Set certs,
9247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org        ASN1Set crls,
9347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org        ASN1Set signerInfs)
9447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org    {
9547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org        boolean otherCert = false;
9647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org        boolean otherCrl = false;
9747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org        boolean attrCertV1Found = false;
9847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org        boolean attrCertV2Found = false;
9947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org
10047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org        if (certs != null)
10147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org        {
10247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org            for (Enumeration en = certs.getObjects(); en.hasMoreElements();)
10347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org            {
10447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org                Object obj = en.nextElement();
10547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org                if (obj instanceof ASN1TaggedObject)
10647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org                {
10747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org                    ASN1TaggedObject tagged = ASN1TaggedObject.getInstance(obj);
10847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org
10947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org                    if (tagged.getTagNo() == 1)
11047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org                    {
11147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org                        attrCertV1Found = true;
11247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org                    }
11347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org                    else if (tagged.getTagNo() == 2)
11447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org                    {
11547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org                        attrCertV2Found = true;
11647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org                    }
11747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org                    else if (tagged.getTagNo() == 3)
11847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org                    {
11947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org                        otherCert = true;
12047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org                    }
12147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org                }
12247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org            }
12347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org        }
12447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org
12547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org        if (otherCert)
12647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org        {
12747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org            return new ASN1Integer(5);
12847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org        }
12947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org
13047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org        if (crls != null)         // no need to check if otherCert is true
13147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org        {
13247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org            for (Enumeration en = crls.getObjects(); en.hasMoreElements();)
13347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org            {
13447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org                Object obj = en.nextElement();
13547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org                if (obj instanceof ASN1TaggedObject)
13647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org                {
13747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org                    otherCrl = true;
13847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org                }
13947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org            }
14047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org        }
14147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org
14247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org        if (otherCrl)
14347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org        {
14447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org            return VERSION_5;
14547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org        }
14647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org
14747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org        if (attrCertV2Found)
14847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org        {
14947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org            return VERSION_4;
15047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org        }
15147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org
15247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org        if (attrCertV1Found)
15347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org        {
15447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org            return VERSION_3;
15547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org        }
15647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org
15747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org        if (checkForVersion3(signerInfs))
15847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org        {
15947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org            return VERSION_3;
16047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org        }
16147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org
16247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org        if (!CMSObjectIdentifiers.data.equals(contentOid))
16347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org        {
16447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org            return VERSION_3;
16547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org        }
16647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org
16747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org        return VERSION_1;
16847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org    }
16947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org
17047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org    private boolean checkForVersion3(ASN1Set signerInfs)
17147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org    {
17247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org        for (Enumeration e = signerInfs.getObjects(); e.hasMoreElements();)
17347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org        {
17447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org            SignerInfo s = SignerInfo.getInstance(e.nextElement());
17547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org
17647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org            if (s.getVersion().getValue().intValue() == 3)
17747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org            {
17847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org                return true;
17947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org            }
18047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org        }
18147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org
18247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org        return false;
18347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org    }
18447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org
18547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org    private SignedData(
18647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org        ASN1Sequence seq)
18747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org    {
18847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org        Enumeration     e = seq.getObjects();
18947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org
19047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org        version = ASN1Integer.getInstance(e.nextElement());
19147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org        digestAlgorithms = ((ASN1Set)e.nextElement());
19247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org        contentInfo = ContentInfo.getInstance(e.nextElement());
19347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org
19447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org        while (e.hasMoreElements())
19547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org        {
19647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org            ASN1Primitive o = (ASN1Primitive)e.nextElement();
19747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org
19847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org            //
19947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org            // an interesting feature of SignedData is that there appear
20047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org            // to be varying implementations...
20147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org            // for the moment we ignore anything which doesn't fit.
20247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org            //
20347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org            if (o instanceof ASN1TaggedObject)
20447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org            {
20547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org                ASN1TaggedObject tagged = (ASN1TaggedObject)o;
20647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org
20747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org                switch (tagged.getTagNo())
20847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org                {
20947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org                case 0:
21047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org                    certsBer = tagged instanceof BERTaggedObject;
21147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org                    certificates = ASN1Set.getInstance(tagged, false);
21247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org                    break;
21347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org                case 1:
21447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org                    crlsBer = tagged instanceof BERTaggedObject;
21547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org                    crls = ASN1Set.getInstance(tagged, false);
21647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org                    break;
21747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org                default:
21847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org                    throw new IllegalArgumentException("unknown tag value " + tagged.getTagNo());
21947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org                }
22047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org            }
22147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org            else
22247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org            {
22347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org                signerInfos = (ASN1Set)o;
22447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org            }
22547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org        }
22647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org    }
22747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org
22847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org    public ASN1Integer getVersion()
22947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org    {
23047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org        return version;
23147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org    }
23247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org
23347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org    public ASN1Set getDigestAlgorithms()
23447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org    {
23547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org        return digestAlgorithms;
23647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org    }
23747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org
23847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org    public ContentInfo getEncapContentInfo()
23947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org    {
24047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org        return contentInfo;
24147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org    }
24247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org
24347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org    public ASN1Set getCertificates()
24447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org    {
24547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org        return certificates;
24647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org    }
24747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org
24847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org    public ASN1Set getCRLs()
24947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org    {
25047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org        return crls;
25147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org    }
25247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org
25347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org    public ASN1Set getSignerInfos()
25447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org    {
25547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org        return signerInfos;
25647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org    }
25747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org
25847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org    /**
25947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org     * Produce an object suitable for an ASN1OutputStream.
26047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org     * <pre>
261     * SignedData ::= SEQUENCE {
262     *     version CMSVersion,
263     *     digestAlgorithms DigestAlgorithmIdentifiers,
264     *     encapContentInfo EncapsulatedContentInfo,
265     *     certificates [0] IMPLICIT CertificateSet OPTIONAL,
266     *     crls [1] IMPLICIT CertificateRevocationLists OPTIONAL,
267     *     signerInfos SignerInfos
268     *   }
269     * </pre>
270     */
271    public ASN1Primitive toASN1Primitive()
272    {
273        ASN1EncodableVector  v = new ASN1EncodableVector();
274
275        v.add(version);
276        v.add(digestAlgorithms);
277        v.add(contentInfo);
278
279        if (certificates != null)
280        {
281            if (certsBer)
282            {
283                v.add(new BERTaggedObject(false, 0, certificates));
284            }
285            else
286            {
287                v.add(new DERTaggedObject(false, 0, certificates));
288            }
289        }
290
291        if (crls != null)
292        {
293            if (crlsBer)
294            {
295                v.add(new BERTaggedObject(false, 1, crls));
296            }
297            else
298            {
299                v.add(new DERTaggedObject(false, 1, crls));
300            }
301        }
302
303        v.add(signerInfos);
304
305        return new BERSequence(v);
306    }
307}
308