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(
71e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom        ASN1Sequence seq)
72e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom    {
73e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom        Enumeration     e = seq.getObjects();
74e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom
75e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom        version = (ASN1Integer)e.nextElement();
76e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom        sid = SignerIdentifier.getInstance(e.nextElement());
77e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom        digAlgorithm = AlgorithmIdentifier.getInstance(e.nextElement());
78e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom
79e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom        Object obj = e.nextElement();
80e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom
81e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom        if (obj instanceof ASN1TaggedObject)
82e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom        {
83e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom            authenticatedAttributes = ASN1Set.getInstance((ASN1TaggedObject)obj, false);
84e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom
85e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom            digEncryptionAlgorithm = AlgorithmIdentifier.getInstance(e.nextElement());
86e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom        }
87e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom        else
88e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom        {
89e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom            authenticatedAttributes = null;
90e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom            digEncryptionAlgorithm = AlgorithmIdentifier.getInstance(obj);
91e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom        }
92e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom
93e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom        encryptedDigest = DEROctetString.getInstance(e.nextElement());
94e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom
95e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom        if (e.hasMoreElements())
96e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom        {
97e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom            unauthenticatedAttributes = ASN1Set.getInstance((ASN1TaggedObject)e.nextElement(), false);
98e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom        }
99e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom        else
100e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom        {
101e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom            unauthenticatedAttributes = null;
102e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom        }
103e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom    }
104e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom
105e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom    public ASN1Integer getVersion()
106e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom    {
107e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom        return version;
108e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom    }
109e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom
110e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom    public SignerIdentifier getSID()
111e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom    {
112e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom        return sid;
113e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom    }
114e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom
115e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom    public ASN1Set getAuthenticatedAttributes()
116e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom    {
117e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom        return authenticatedAttributes;
118e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom    }
119e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom
120e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom    public AlgorithmIdentifier getDigestAlgorithm()
121e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom    {
122e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom        return digAlgorithm;
123e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom    }
124e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom
125e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom    public ASN1OctetString getEncryptedDigest()
126e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom    {
127e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom        return encryptedDigest;
128e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom    }
129e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom
130e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom    public AlgorithmIdentifier getDigestEncryptionAlgorithm()
131e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom    {
132e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom        return digEncryptionAlgorithm;
133e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom    }
134e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom
135e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom    public ASN1Set getUnauthenticatedAttributes()
136e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom    {
137e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom        return unauthenticatedAttributes;
138e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom    }
139e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom
140e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom    /**
141e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom     * Produce an object suitable for an ASN1OutputStream.
142e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom     * <pre>
143e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom     *  SignerInfo ::= SEQUENCE {
144e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom     *      version Version,
145e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom     *      SignerIdentifier sid,
146e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom     *      digestAlgorithm DigestAlgorithmIdentifier,
147e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom     *      authenticatedAttributes [0] IMPLICIT Attributes OPTIONAL,
148e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom     *      digestEncryptionAlgorithm DigestEncryptionAlgorithmIdentifier,
149e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom     *      encryptedDigest EncryptedDigest,
150e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom     *      unauthenticatedAttributes [1] IMPLICIT Attributes OPTIONAL
151e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom     *  }
152e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom     *
153e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom     *  EncryptedDigest ::= OCTET STRING
154e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom     *
155e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom     *  DigestAlgorithmIdentifier ::= AlgorithmIdentifier
156e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom     *
157e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom     *  DigestEncryptionAlgorithmIdentifier ::= AlgorithmIdentifier
158e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom     * </pre>
159e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom     */
160e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom    public ASN1Primitive toASN1Primitive()
161e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom    {
162e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom        ASN1EncodableVector v = new ASN1EncodableVector();
163e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom
164e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom        v.add(version);
165e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom        v.add(sid);
166e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom        v.add(digAlgorithm);
167e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom
168e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom        if (authenticatedAttributes != null)
169e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom        {
170e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom            v.add(new DERTaggedObject(false, 0, authenticatedAttributes));
171e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom        }
172e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom
173e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom        v.add(digEncryptionAlgorithm);
174e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom        v.add(encryptedDigest);
175e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom
176e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom        if (unauthenticatedAttributes != null)
177e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom        {
178e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom            v.add(new DERTaggedObject(false, 1, unauthenticatedAttributes));
179e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom        }
180e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom
181e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom        return new DERSequence(v);
182e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom    }
183e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom}
184