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.ASN1OctetString;
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.DEROctetString;
14e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstromimport org.bouncycastle.asn1.DERSequence;
15e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstromimport org.bouncycastle.asn1.DERTaggedObject;
16e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstromimport org.bouncycastle.asn1.x509.AlgorithmIdentifier;
17e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom
18e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrompublic class SignerInfo
19e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom    extends ASN1Object
20e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom{
21e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom    private ASN1Integer              version;
22e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom    private SignerIdentifier        sid;
23e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom    private AlgorithmIdentifier     digAlgorithm;
24e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom    private ASN1Set                 authenticatedAttributes;
25e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom    private AlgorithmIdentifier     digEncryptionAlgorithm;
26e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom    private ASN1OctetString         encryptedDigest;
27e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom    private ASN1Set                 unauthenticatedAttributes;
28e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom
29e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom    public static SignerInfo getInstance(
30e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom        Object  o)
31e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom        throws IllegalArgumentException
32e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom    {
33e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom        if (o == null || o instanceof SignerInfo)
34e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom        {
35e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom            return (SignerInfo)o;
36e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom        }
37e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom        else if (o instanceof ASN1Sequence)
38e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom        {
39e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom            return new SignerInfo((ASN1Sequence)o);
40e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom        }
41e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom
42e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom        throw new IllegalArgumentException("unknown object in factory: " + o.getClass().getName());
43e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom    }
44e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom
45e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom    public SignerInfo(
46e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom        SignerIdentifier        sid,
47e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom        AlgorithmIdentifier     digAlgorithm,
48e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom        ASN1Set                 authenticatedAttributes,
49e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom        AlgorithmIdentifier     digEncryptionAlgorithm,
50e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom        ASN1OctetString         encryptedDigest,
51e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom        ASN1Set                 unauthenticatedAttributes)
52e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom    {
53e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom        if (sid.isTagged())
54e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom        {
55e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom            this.version = new ASN1Integer(3);
56e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom        }
57e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom        else
58e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom        {
59e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom            this.version = new ASN1Integer(1);
60e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom        }
61e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom
62e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom        this.sid = sid;
63e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom        this.digAlgorithm = digAlgorithm;
64e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom        this.authenticatedAttributes = authenticatedAttributes;
65e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom        this.digEncryptionAlgorithm = digEncryptionAlgorithm;
66e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom        this.encryptedDigest = encryptedDigest;
67e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom        this.unauthenticatedAttributes = unauthenticatedAttributes;
68e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom    }
69e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom
70e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom    public SignerInfo(
71a198e1ecc615e26a167d0f2dca9fa7e5fc62de10Brian Carlstrom        SignerIdentifier        sid,
72a198e1ecc615e26a167d0f2dca9fa7e5fc62de10Brian Carlstrom        AlgorithmIdentifier     digAlgorithm,
73a198e1ecc615e26a167d0f2dca9fa7e5fc62de10Brian Carlstrom        Attributes              authenticatedAttributes,
74a198e1ecc615e26a167d0f2dca9fa7e5fc62de10Brian Carlstrom        AlgorithmIdentifier     digEncryptionAlgorithm,
75a198e1ecc615e26a167d0f2dca9fa7e5fc62de10Brian Carlstrom        ASN1OctetString         encryptedDigest,
76a198e1ecc615e26a167d0f2dca9fa7e5fc62de10Brian Carlstrom        Attributes              unauthenticatedAttributes)
77a198e1ecc615e26a167d0f2dca9fa7e5fc62de10Brian Carlstrom    {
78a198e1ecc615e26a167d0f2dca9fa7e5fc62de10Brian Carlstrom        if (sid.isTagged())
79a198e1ecc615e26a167d0f2dca9fa7e5fc62de10Brian Carlstrom        {
80a198e1ecc615e26a167d0f2dca9fa7e5fc62de10Brian Carlstrom            this.version = new ASN1Integer(3);
81a198e1ecc615e26a167d0f2dca9fa7e5fc62de10Brian Carlstrom        }
82a198e1ecc615e26a167d0f2dca9fa7e5fc62de10Brian Carlstrom        else
83a198e1ecc615e26a167d0f2dca9fa7e5fc62de10Brian Carlstrom        {
84a198e1ecc615e26a167d0f2dca9fa7e5fc62de10Brian Carlstrom            this.version = new ASN1Integer(1);
85a198e1ecc615e26a167d0f2dca9fa7e5fc62de10Brian Carlstrom        }
86a198e1ecc615e26a167d0f2dca9fa7e5fc62de10Brian Carlstrom
87a198e1ecc615e26a167d0f2dca9fa7e5fc62de10Brian Carlstrom        this.sid = sid;
88a198e1ecc615e26a167d0f2dca9fa7e5fc62de10Brian Carlstrom        this.digAlgorithm = digAlgorithm;
89a198e1ecc615e26a167d0f2dca9fa7e5fc62de10Brian Carlstrom        this.authenticatedAttributes = ASN1Set.getInstance(authenticatedAttributes);
90a198e1ecc615e26a167d0f2dca9fa7e5fc62de10Brian Carlstrom        this.digEncryptionAlgorithm = digEncryptionAlgorithm;
91a198e1ecc615e26a167d0f2dca9fa7e5fc62de10Brian Carlstrom        this.encryptedDigest = encryptedDigest;
92a198e1ecc615e26a167d0f2dca9fa7e5fc62de10Brian Carlstrom        this.unauthenticatedAttributes = ASN1Set.getInstance(unauthenticatedAttributes);
93a198e1ecc615e26a167d0f2dca9fa7e5fc62de10Brian Carlstrom    }
94a198e1ecc615e26a167d0f2dca9fa7e5fc62de10Brian Carlstrom
95a198e1ecc615e26a167d0f2dca9fa7e5fc62de10Brian Carlstrom    /**
96a198e1ecc615e26a167d0f2dca9fa7e5fc62de10Brian Carlstrom     * @deprecated use getInstance() method.
97a198e1ecc615e26a167d0f2dca9fa7e5fc62de10Brian Carlstrom     */
98a198e1ecc615e26a167d0f2dca9fa7e5fc62de10Brian Carlstrom    public SignerInfo(
99e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom        ASN1Sequence seq)
100e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom    {
101e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom        Enumeration     e = seq.getObjects();
102e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom
103e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom        version = (ASN1Integer)e.nextElement();
104e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom        sid = SignerIdentifier.getInstance(e.nextElement());
105e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom        digAlgorithm = AlgorithmIdentifier.getInstance(e.nextElement());
106e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom
107e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom        Object obj = e.nextElement();
108e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom
109e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom        if (obj instanceof ASN1TaggedObject)
110e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom        {
111e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom            authenticatedAttributes = ASN1Set.getInstance((ASN1TaggedObject)obj, false);
112e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom
113e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom            digEncryptionAlgorithm = AlgorithmIdentifier.getInstance(e.nextElement());
114e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom        }
115e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom        else
116e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom        {
117e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom            authenticatedAttributes = null;
118e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom            digEncryptionAlgorithm = AlgorithmIdentifier.getInstance(obj);
119e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom        }
120e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom
121e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom        encryptedDigest = DEROctetString.getInstance(e.nextElement());
122e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom
123e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom        if (e.hasMoreElements())
124e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom        {
125e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom            unauthenticatedAttributes = ASN1Set.getInstance((ASN1TaggedObject)e.nextElement(), false);
126e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom        }
127e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom        else
128e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom        {
129e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom            unauthenticatedAttributes = null;
130e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom        }
131e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom    }
132e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom
133e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom    public ASN1Integer getVersion()
134e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom    {
135e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom        return version;
136e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom    }
137e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom
138e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom    public SignerIdentifier getSID()
139e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom    {
140e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom        return sid;
141e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom    }
142e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom
143e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom    public ASN1Set getAuthenticatedAttributes()
144e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom    {
145e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom        return authenticatedAttributes;
146e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom    }
147e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom
148e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom    public AlgorithmIdentifier getDigestAlgorithm()
149e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom    {
150e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom        return digAlgorithm;
151e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom    }
152e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom
153e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom    public ASN1OctetString getEncryptedDigest()
154e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom    {
155e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom        return encryptedDigest;
156e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom    }
157e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom
158e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom    public AlgorithmIdentifier getDigestEncryptionAlgorithm()
159e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom    {
160e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom        return digEncryptionAlgorithm;
161e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom    }
162e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom
163e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom    public ASN1Set getUnauthenticatedAttributes()
164e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom    {
165e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom        return unauthenticatedAttributes;
166e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom    }
167e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom
168e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom    /**
169e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom     * Produce an object suitable for an ASN1OutputStream.
170e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom     * <pre>
171e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom     *  SignerInfo ::= SEQUENCE {
172e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom     *      version Version,
173e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom     *      SignerIdentifier sid,
174e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom     *      digestAlgorithm DigestAlgorithmIdentifier,
175e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom     *      authenticatedAttributes [0] IMPLICIT Attributes OPTIONAL,
176e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom     *      digestEncryptionAlgorithm DigestEncryptionAlgorithmIdentifier,
177e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom     *      encryptedDigest EncryptedDigest,
178e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom     *      unauthenticatedAttributes [1] IMPLICIT Attributes OPTIONAL
179e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom     *  }
180e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom     *
181e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom     *  EncryptedDigest ::= OCTET STRING
182e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom     *
183e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom     *  DigestAlgorithmIdentifier ::= AlgorithmIdentifier
184e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom     *
185e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom     *  DigestEncryptionAlgorithmIdentifier ::= AlgorithmIdentifier
186e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom     * </pre>
187e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom     */
188e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom    public ASN1Primitive toASN1Primitive()
189e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom    {
190e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom        ASN1EncodableVector v = new ASN1EncodableVector();
191e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom
192e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom        v.add(version);
193e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom        v.add(sid);
194e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom        v.add(digAlgorithm);
195e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom
196e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom        if (authenticatedAttributes != null)
197e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom        {
198e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom            v.add(new DERTaggedObject(false, 0, authenticatedAttributes));
199e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom        }
200e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom
201e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom        v.add(digEncryptionAlgorithm);
202e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom        v.add(encryptedDigest);
203e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom
204e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom        if (unauthenticatedAttributes != null)
205e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom        {
206e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom            v.add(new DERTaggedObject(false, 1, unauthenticatedAttributes));
207e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom        }
208e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom
209e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom        return new DERSequence(v);
210e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom    }
211e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom}
212