1e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrompackage org.bouncycastle.asn1.cms;
2e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom
3e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstromimport java.util.Enumeration;
4e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom
5e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstromimport org.bouncycastle.asn1.ASN1EncodableVector;
6e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstromimport org.bouncycastle.asn1.ASN1Integer;
7e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstromimport org.bouncycastle.asn1.ASN1Object;
8e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstromimport org.bouncycastle.asn1.ASN1ObjectIdentifier;
9e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstromimport org.bouncycastle.asn1.ASN1Primitive;
10e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstromimport org.bouncycastle.asn1.ASN1Sequence;
11e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstromimport org.bouncycastle.asn1.ASN1Set;
12e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstromimport org.bouncycastle.asn1.ASN1TaggedObject;
13e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstromimport org.bouncycastle.asn1.BERSequence;
14e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstromimport org.bouncycastle.asn1.BERSet;
15e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstromimport org.bouncycastle.asn1.BERTaggedObject;
16e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstromimport org.bouncycastle.asn1.DERTaggedObject;
17e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom
18e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom/**
19e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom * a signed data object.
20e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom */
21e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrompublic class SignedData
22e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom    extends ASN1Object
23e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom{
24e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom    private ASN1Integer version;
25e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom    private ASN1Set     digestAlgorithms;
26e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom    private ContentInfo contentInfo;
27e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom    private ASN1Set     certificates;
28e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom    private ASN1Set     crls;
29e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom    private ASN1Set     signerInfos;
30e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom    private boolean certsBer;
31e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom    private boolean        crlsBer;
32e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom
33e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom    public static SignedData getInstance(
34e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom        Object  o)
35e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom    {
36e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom        if (o instanceof SignedData)
37e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom        {
38e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom            return (SignedData)o;
39e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom        }
40e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom        else if (o != null)
41e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom        {
42e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom            return new SignedData(ASN1Sequence.getInstance(o));
43e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom        }
44e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom
45e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom        return null;
46e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom    }
47e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom
48e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom    public SignedData(
49e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom        ASN1Set     digestAlgorithms,
50e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom        ContentInfo contentInfo,
51e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom        ASN1Set     certificates,
52e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom        ASN1Set     crls,
53e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom        ASN1Set     signerInfos)
54e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom    {
55e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom        this.version = calculateVersion(contentInfo.getContentType(), certificates, crls, signerInfos);
56e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom        this.digestAlgorithms = digestAlgorithms;
57e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom        this.contentInfo = contentInfo;
58e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom        this.certificates = certificates;
59e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom        this.crls = crls;
60e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom        this.signerInfos = signerInfos;
61e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom        this.crlsBer = crls instanceof BERSet;
62e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom        this.certsBer = certificates instanceof BERSet;
63e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom    }
64e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom
65e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom
66e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom    // RFC3852, section 5.1:
67e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom    // IF ((certificates is present) AND
68e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom    //    (any certificates with a type of other are present)) OR
69e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom    //    ((crls is present) AND
70e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom    //    (any crls with a type of other are present))
71e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom    // THEN version MUST be 5
72e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom    // ELSE
73e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom    //    IF (certificates is present) AND
74e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom    //       (any version 2 attribute certificates are present)
75e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom    //    THEN version MUST be 4
76e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom    //    ELSE
77e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom    //       IF ((certificates is present) AND
78e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom    //          (any version 1 attribute certificates are present)) OR
79e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom    //          (any SignerInfo structures are version 3) OR
80e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom    //          (encapContentInfo eContentType is other than id-data)
81e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom    //       THEN version MUST be 3
82e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom    //       ELSE version MUST be 1
83e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom    //
84e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom    private ASN1Integer calculateVersion(
85e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom        ASN1ObjectIdentifier contentOid,
86e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom        ASN1Set certs,
87e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom        ASN1Set crls,
88e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom        ASN1Set signerInfs)
89e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom    {
90e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom        boolean otherCert = false;
91e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom        boolean otherCrl = false;
92e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom        boolean attrCertV1Found = false;
93e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom        boolean attrCertV2Found = false;
94e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom
95e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom        if (certs != null)
96e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom        {
97e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom            for (Enumeration en = certs.getObjects(); en.hasMoreElements();)
98e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom            {
99e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom                Object obj = en.nextElement();
100e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom                if (obj instanceof ASN1TaggedObject)
101e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom                {
102e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom                    ASN1TaggedObject tagged = ASN1TaggedObject.getInstance(obj);
103e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom
104e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom                    if (tagged.getTagNo() == 1)
105e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom                    {
106e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom                        attrCertV1Found = true;
107e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom                    }
108e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom                    else if (tagged.getTagNo() == 2)
109e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom                    {
110e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom                        attrCertV2Found = true;
111e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom                    }
112e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom                    else if (tagged.getTagNo() == 3)
113e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom                    {
114e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom                        otherCert = true;
115e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom                    }
116e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom                }
117e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom            }
118e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom        }
119e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom
120e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom        if (otherCert)
121e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom        {
122e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom            return new ASN1Integer(5);
123e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom        }
124e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom
125e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom        if (crls != null)         // no need to check if otherCert is true
126e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom        {
127e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom            for (Enumeration en = crls.getObjects(); en.hasMoreElements();)
128e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom            {
129e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom                Object obj = en.nextElement();
130e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom                if (obj instanceof ASN1TaggedObject)
131e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom                {
132e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom                    otherCrl = true;
133e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom                }
134e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom            }
135e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom        }
136e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom
137e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom        if (otherCrl)
138e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom        {
139e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom            return new ASN1Integer(5);
140e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom        }
141e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom
142e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom        if (attrCertV2Found)
143e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom        {
144e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom            return new ASN1Integer(4);
145e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom        }
146e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom
147e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom        if (attrCertV1Found)
148e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom        {
149e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom            return new ASN1Integer(3);
150e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom        }
151e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom
152e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom        if (checkForVersion3(signerInfs))
153e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom        {
154e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom            return new ASN1Integer(3);
155e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom        }
156e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom
157e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom        if (!CMSObjectIdentifiers.data.equals(contentOid))
158e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom        {
159e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom            return new ASN1Integer(3);
160e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom        }
161e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom
162e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom        return new ASN1Integer(1);
163e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom    }
164e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom
165e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom    private boolean checkForVersion3(ASN1Set signerInfs)
166e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom    {
167e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom        for (Enumeration e = signerInfs.getObjects(); e.hasMoreElements();)
168e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom        {
169e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom            SignerInfo s = SignerInfo.getInstance(e.nextElement());
170e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom
171e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom            if (s.getVersion().getValue().intValue() == 3)
172e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom            {
173e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom                return true;
174e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom            }
175e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom        }
176e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom
177e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom        return false;
178e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom    }
179e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom
180e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom    private SignedData(
181e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom        ASN1Sequence seq)
182e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom    {
183e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom        Enumeration     e = seq.getObjects();
184e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom
185e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom        version = ASN1Integer.getInstance(e.nextElement());
186e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom        digestAlgorithms = ((ASN1Set)e.nextElement());
187e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom        contentInfo = ContentInfo.getInstance(e.nextElement());
188e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom
189e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom        while (e.hasMoreElements())
190e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom        {
191e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom            ASN1Primitive o = (ASN1Primitive)e.nextElement();
192e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom
193e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom            //
194e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom            // an interesting feature of SignedData is that there appear
195e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom            // to be varying implementations...
196e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom            // for the moment we ignore anything which doesn't fit.
197e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom            //
198e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom            if (o instanceof ASN1TaggedObject)
199e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom            {
200e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom                ASN1TaggedObject tagged = (ASN1TaggedObject)o;
201e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom
202e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom                switch (tagged.getTagNo())
203e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom                {
204e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom                case 0:
205e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom                    certsBer = tagged instanceof BERTaggedObject;
206e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom                    certificates = ASN1Set.getInstance(tagged, false);
207e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom                    break;
208e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom                case 1:
209e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom                    crlsBer = tagged instanceof BERTaggedObject;
210e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom                    crls = ASN1Set.getInstance(tagged, false);
211e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom                    break;
212e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom                default:
213e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom                    throw new IllegalArgumentException("unknown tag value " + tagged.getTagNo());
214e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom                }
215e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom            }
216e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom            else
217e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom            {
218e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom                signerInfos = (ASN1Set)o;
219e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom            }
220e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom        }
221e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom    }
222e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom
223e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom    public ASN1Integer getVersion()
224e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom    {
225e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom        return version;
226e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom    }
227e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom
228e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom    public ASN1Set getDigestAlgorithms()
229e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom    {
230e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom        return digestAlgorithms;
231e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom    }
232e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom
233e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom    public ContentInfo getEncapContentInfo()
234e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom    {
235e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom        return contentInfo;
236e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom    }
237e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom
238e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom    public ASN1Set getCertificates()
239e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom    {
240e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom        return certificates;
241e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom    }
242e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom
243e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom    public ASN1Set getCRLs()
244e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom    {
245e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom        return crls;
246e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom    }
247e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom
248e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom    public ASN1Set getSignerInfos()
249e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom    {
250e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom        return signerInfos;
251e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom    }
252e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom
253e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom    /**
254e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom     * Produce an object suitable for an ASN1OutputStream.
255e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom     * <pre>
256e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom     * SignedData ::= SEQUENCE {
257e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom     *     version CMSVersion,
258e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom     *     digestAlgorithms DigestAlgorithmIdentifiers,
259e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom     *     encapContentInfo EncapsulatedContentInfo,
260e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom     *     certificates [0] IMPLICIT CertificateSet OPTIONAL,
261e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom     *     crls [1] IMPLICIT CertificateRevocationLists OPTIONAL,
262e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom     *     signerInfos SignerInfos
263e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom     *   }
264e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom     * </pre>
265e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom     */
266e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom    public ASN1Primitive toASN1Primitive()
267e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom    {
268e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom        ASN1EncodableVector  v = new ASN1EncodableVector();
269e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom
270e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom        v.add(version);
271e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom        v.add(digestAlgorithms);
272e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom        v.add(contentInfo);
273e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom
274e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom        if (certificates != null)
275e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom        {
276e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom            if (certsBer)
277e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom            {
278e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom                v.add(new BERTaggedObject(false, 0, certificates));
279e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom            }
280e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom            else
281e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom            {
282e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom                v.add(new DERTaggedObject(false, 0, certificates));
283e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom            }
284e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom        }
285e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom
286e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom        if (crls != null)
287e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom        {
288e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom            if (crlsBer)
289e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom            {
290e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom                v.add(new BERTaggedObject(false, 1, crls));
291e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom            }
292e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom            else
293e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom            {
294e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom                v.add(new DERTaggedObject(false, 1, crls));
295e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom            }
296e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom        }
297e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom
298e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom        v.add(signerInfos);
299e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom
300e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom        return new BERSequence(v);
301e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom    }
302e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom}
303