1b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallampackage org.bouncycastle.asn1.pkcs;
2b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam
3b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallamimport java.util.Enumeration;
4b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam
5b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallamimport org.bouncycastle.asn1.ASN1EncodableVector;
64c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstromimport org.bouncycastle.asn1.ASN1Integer;
74c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstromimport org.bouncycastle.asn1.ASN1Object;
84c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstromimport org.bouncycastle.asn1.ASN1Primitive;
9b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallamimport org.bouncycastle.asn1.ASN1Sequence;
10b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallamimport org.bouncycastle.asn1.ASN1Set;
11b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallamimport org.bouncycastle.asn1.BERSequence;
12b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallamimport org.bouncycastle.asn1.DERTaggedObject;
13b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam
14b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam/**
15b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam * a PKCS#7 signed data object.
16b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam */
17b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallampublic class SignedData
184c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    extends ASN1Object
19b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    implements PKCSObjectIdentifiers
20b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam{
214c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    private ASN1Integer              version;
22b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    private ASN1Set                 digestAlgorithms;
23b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    private ContentInfo             contentInfo;
24b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    private ASN1Set                 certificates;
25b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    private ASN1Set                 crls;
26b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    private ASN1Set                 signerInfos;
27b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam
28b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    public static SignedData getInstance(
29b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        Object  o)
30b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    {
31b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        if (o instanceof SignedData)
32b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        {
33b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam            return (SignedData)o;
34b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        }
354c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        else if (o != null)
36b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        {
374c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom            return new SignedData(ASN1Sequence.getInstance(o));
38b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        }
39b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam
404c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        return null;
41b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    }
42b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam
43b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    public SignedData(
444c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        ASN1Integer        _version,
45b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        ASN1Set           _digestAlgorithms,
46b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        ContentInfo       _contentInfo,
47b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        ASN1Set           _certificates,
48b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        ASN1Set           _crls,
49b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        ASN1Set           _signerInfos)
50b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    {
51b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        version          = _version;
52b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        digestAlgorithms = _digestAlgorithms;
53b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        contentInfo      = _contentInfo;
54b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        certificates     = _certificates;
55b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        crls             = _crls;
56b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        signerInfos      = _signerInfos;
57b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    }
58b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam
59b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    public SignedData(
60b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        ASN1Sequence seq)
61b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    {
62b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        Enumeration     e = seq.getObjects();
63b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam
644c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        version = (ASN1Integer)e.nextElement();
65b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        digestAlgorithms = ((ASN1Set)e.nextElement());
66b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        contentInfo = ContentInfo.getInstance(e.nextElement());
67b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam
68b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        while (e.hasMoreElements())
69b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        {
704c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom            ASN1Primitive o = (ASN1Primitive)e.nextElement();
71b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam
72b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam            //
73b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam            // an interesting feature of SignedData is that there appear to be varying implementations...
74b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam            // for the moment we ignore anything which doesn't fit.
75b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam            //
76b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam            if (o instanceof DERTaggedObject)
77b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam            {
78b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam                DERTaggedObject tagged = (DERTaggedObject)o;
79b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam
80b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam                switch (tagged.getTagNo())
81b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam                {
82b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam                case 0:
83b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam                    certificates = ASN1Set.getInstance(tagged, false);
84b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam                    break;
85b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam                case 1:
86b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam                    crls = ASN1Set.getInstance(tagged, false);
87b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam                    break;
88b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam                default:
89b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam                    throw new IllegalArgumentException("unknown tag value " + tagged.getTagNo());
90b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam                }
91b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam            }
92b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam            else
93b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam            {
94b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam                signerInfos = (ASN1Set)o;
95b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam            }
96b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        }
97b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    }
98b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam
994c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    public ASN1Integer getVersion()
100b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    {
101b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        return version;
102b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    }
103b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam
104b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    public ASN1Set getDigestAlgorithms()
105b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    {
106b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        return digestAlgorithms;
107b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    }
108b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam
109b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    public ContentInfo getContentInfo()
110b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    {
111b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        return contentInfo;
112b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    }
113b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam
114b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    public ASN1Set getCertificates()
115b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    {
116b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        return certificates;
117b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    }
118b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam
119b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    public ASN1Set getCRLs()
120b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    {
121b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        return crls;
122b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    }
123b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam
124b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    public ASN1Set getSignerInfos()
125b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    {
126b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        return signerInfos;
127b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    }
128b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam
129b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    /**
130b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam     * Produce an object suitable for an ASN1OutputStream.
131b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam     * <pre>
132b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam     *  SignedData ::= SEQUENCE {
133b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam     *      version Version,
134b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam     *      digestAlgorithms DigestAlgorithmIdentifiers,
135b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam     *      contentInfo ContentInfo,
136b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam     *      certificates
137b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam     *          [0] IMPLICIT ExtendedCertificatesAndCertificates
138b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam     *                   OPTIONAL,
139b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam     *      crls
140b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam     *          [1] IMPLICIT CertificateRevocationLists OPTIONAL,
141b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam     *      signerInfos SignerInfos }
142b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam     * </pre>
143b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam     */
1444c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    public ASN1Primitive toASN1Primitive()
145b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    {
146b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        ASN1EncodableVector v = new ASN1EncodableVector();
147b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam
148b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        v.add(version);
149b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        v.add(digestAlgorithms);
150b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        v.add(contentInfo);
151b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam
152b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        if (certificates != null)
153b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        {
154b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam            v.add(new DERTaggedObject(false, 0, certificates));
155b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        }
156b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam
157b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        if (crls != null)
158b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        {
159b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam            v.add(new DERTaggedObject(false, 1, crls));
160b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        }
161b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam
162b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        v.add(signerInfos);
163b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam
164b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        return new BERSequence(v);
165b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    }
166b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam}
167