1 package org.bouncycastle.asn1.pkcs;
2 
3 import java.util.Enumeration;
4 
5 import org.bouncycastle.asn1.ASN1EncodableVector;
6 import org.bouncycastle.asn1.ASN1Integer;
7 import org.bouncycastle.asn1.ASN1Object;
8 import org.bouncycastle.asn1.ASN1OctetString;
9 import org.bouncycastle.asn1.ASN1Primitive;
10 import org.bouncycastle.asn1.ASN1Sequence;
11 import org.bouncycastle.asn1.ASN1Set;
12 import org.bouncycastle.asn1.ASN1TaggedObject;
13 import org.bouncycastle.asn1.DEROctetString;
14 import org.bouncycastle.asn1.DERSequence;
15 import org.bouncycastle.asn1.DERTaggedObject;
16 import org.bouncycastle.asn1.x509.AlgorithmIdentifier;
17 
18 /**
19  * a PKCS#7 signer info object.
20  */
21 public class SignerInfo
22     extends ASN1Object
23 {
24     private ASN1Integer              version;
25     private IssuerAndSerialNumber   issuerAndSerialNumber;
26     private AlgorithmIdentifier     digAlgorithm;
27     private ASN1Set                 authenticatedAttributes;
28     private AlgorithmIdentifier     digEncryptionAlgorithm;
29     private ASN1OctetString         encryptedDigest;
30     private ASN1Set                 unauthenticatedAttributes;
31 
getInstance( Object o)32     public static SignerInfo getInstance(
33         Object  o)
34     {
35         if (o instanceof SignerInfo)
36         {
37             return (SignerInfo)o;
38         }
39         else if (o instanceof ASN1Sequence)
40         {
41             return new SignerInfo((ASN1Sequence)o);
42         }
43 
44         throw new IllegalArgumentException("unknown object in factory: " + o.getClass().getName());
45     }
46 
SignerInfo( ASN1Integer version, IssuerAndSerialNumber issuerAndSerialNumber, AlgorithmIdentifier digAlgorithm, ASN1Set authenticatedAttributes, AlgorithmIdentifier digEncryptionAlgorithm, ASN1OctetString encryptedDigest, ASN1Set unauthenticatedAttributes)47     public SignerInfo(
48         ASN1Integer              version,
49         IssuerAndSerialNumber   issuerAndSerialNumber,
50         AlgorithmIdentifier     digAlgorithm,
51         ASN1Set                 authenticatedAttributes,
52         AlgorithmIdentifier     digEncryptionAlgorithm,
53         ASN1OctetString         encryptedDigest,
54         ASN1Set                 unauthenticatedAttributes)
55     {
56         this.version = version;
57         this.issuerAndSerialNumber = issuerAndSerialNumber;
58         this.digAlgorithm = digAlgorithm;
59         this.authenticatedAttributes = authenticatedAttributes;
60         this.digEncryptionAlgorithm = digEncryptionAlgorithm;
61         this.encryptedDigest = encryptedDigest;
62         this.unauthenticatedAttributes = unauthenticatedAttributes;
63     }
64 
SignerInfo( ASN1Sequence seq)65     public SignerInfo(
66         ASN1Sequence seq)
67     {
68         Enumeration     e = seq.getObjects();
69 
70         version = (ASN1Integer)e.nextElement();
71         issuerAndSerialNumber = IssuerAndSerialNumber.getInstance(e.nextElement());
72         digAlgorithm = AlgorithmIdentifier.getInstance(e.nextElement());
73 
74         Object obj = e.nextElement();
75 
76         if (obj instanceof ASN1TaggedObject)
77         {
78             authenticatedAttributes = ASN1Set.getInstance((ASN1TaggedObject)obj, false);
79 
80             digEncryptionAlgorithm = AlgorithmIdentifier.getInstance(e.nextElement());
81         }
82         else
83         {
84             authenticatedAttributes = null;
85             digEncryptionAlgorithm = AlgorithmIdentifier.getInstance(obj);
86         }
87 
88         encryptedDigest = DEROctetString.getInstance(e.nextElement());
89 
90         if (e.hasMoreElements())
91         {
92             unauthenticatedAttributes = ASN1Set.getInstance((ASN1TaggedObject)e.nextElement(), false);
93         }
94         else
95         {
96             unauthenticatedAttributes = null;
97         }
98     }
99 
getVersion()100     public ASN1Integer getVersion()
101     {
102         return version;
103     }
104 
getIssuerAndSerialNumber()105     public IssuerAndSerialNumber getIssuerAndSerialNumber()
106     {
107         return issuerAndSerialNumber;
108     }
109 
getAuthenticatedAttributes()110     public ASN1Set getAuthenticatedAttributes()
111     {
112         return authenticatedAttributes;
113     }
114 
getDigestAlgorithm()115     public AlgorithmIdentifier getDigestAlgorithm()
116     {
117         return digAlgorithm;
118     }
119 
getEncryptedDigest()120     public ASN1OctetString getEncryptedDigest()
121     {
122         return encryptedDigest;
123     }
124 
getDigestEncryptionAlgorithm()125     public AlgorithmIdentifier getDigestEncryptionAlgorithm()
126     {
127         return digEncryptionAlgorithm;
128     }
129 
getUnauthenticatedAttributes()130     public ASN1Set getUnauthenticatedAttributes()
131     {
132         return unauthenticatedAttributes;
133     }
134 
135     /**
136      * Produce an object suitable for an ASN1OutputStream.
137      * <pre>
138      *  SignerInfo ::= SEQUENCE {
139      *      version Version,
140      *      issuerAndSerialNumber IssuerAndSerialNumber,
141      *      digestAlgorithm DigestAlgorithmIdentifier,
142      *      authenticatedAttributes [0] IMPLICIT Attributes OPTIONAL,
143      *      digestEncryptionAlgorithm DigestEncryptionAlgorithmIdentifier,
144      *      encryptedDigest EncryptedDigest,
145      *      unauthenticatedAttributes [1] IMPLICIT Attributes OPTIONAL
146      *  }
147      *
148      *  EncryptedDigest ::= OCTET STRING
149      *
150      *  DigestAlgorithmIdentifier ::= AlgorithmIdentifier
151      *
152      *  DigestEncryptionAlgorithmIdentifier ::= AlgorithmIdentifier
153      * </pre>
154      */
toASN1Primitive()155     public ASN1Primitive toASN1Primitive()
156     {
157         ASN1EncodableVector v = new ASN1EncodableVector(7);
158 
159         v.add(version);
160         v.add(issuerAndSerialNumber);
161         v.add(digAlgorithm);
162 
163         if (authenticatedAttributes != null)
164         {
165             v.add(new DERTaggedObject(false, 0, authenticatedAttributes));
166         }
167 
168         v.add(digEncryptionAlgorithm);
169         v.add(encryptedDigest);
170 
171         if (unauthenticatedAttributes != null)
172         {
173             v.add(new DERTaggedObject(false, 1, unauthenticatedAttributes));
174         }
175 
176         return new DERSequence(v);
177     }
178 }
179