• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 package org.bouncycastle.asn1.cms;
2 
3 import org.bouncycastle.asn1.ASN1Choice;
4 import org.bouncycastle.asn1.ASN1Encodable;
5 import org.bouncycastle.asn1.ASN1Object;
6 import org.bouncycastle.asn1.ASN1OctetString;
7 import org.bouncycastle.asn1.ASN1Primitive;
8 import org.bouncycastle.asn1.ASN1TaggedObject;
9 import org.bouncycastle.asn1.DERTaggedObject;
10 
11 /**
12  * <a href="http://tools.ietf.org/html/rfc5652#section-5.3">RFC 5652</a>:
13  * Identify who signed the containing {@link SignerInfo} object.
14  * <p>
15  * The certificates referred to by this are at containing {@link SignedData} structure.
16  * <p>
17  * <pre>
18  * SignerIdentifier ::= CHOICE {
19  *     issuerAndSerialNumber IssuerAndSerialNumber,
20  *     subjectKeyIdentifier [0] SubjectKeyIdentifier
21  * }
22  *
23  * SubjectKeyIdentifier ::= OCTET STRING
24  * </pre>
25  */
26 public class SignerIdentifier
27     extends ASN1Object
28     implements ASN1Choice
29 {
30     private ASN1Encodable id;
31 
SignerIdentifier( IssuerAndSerialNumber id)32     public SignerIdentifier(
33         IssuerAndSerialNumber id)
34     {
35         this.id = id;
36     }
37 
SignerIdentifier( ASN1OctetString id)38     public SignerIdentifier(
39         ASN1OctetString id)
40     {
41         this.id = new DERTaggedObject(false, 0, id);
42     }
43 
SignerIdentifier( ASN1Primitive id)44     public SignerIdentifier(
45         ASN1Primitive id)
46     {
47         this.id = id;
48     }
49 
50     /**
51      * Return a SignerIdentifier object from the given object.
52      * <p>
53      * Accepted inputs:
54      * <ul>
55      * <li> null &rarr; null
56      * <li> {@link SignerIdentifier} object
57      * <li> {@link IssuerAndSerialNumber} object
58      * <li> {@link org.bouncycastle.asn1.ASN1OctetString#getInstance(java.lang.Object) ASN1OctetString} input formats with SignerIdentifier structure inside
59      * <li> {@link org.bouncycastle.asn1.ASN1Primitive ASN1Primitive} for SignerIdentifier constructor.
60      * </ul>
61      *
62      * @param o the object we want converted.
63      * @exception IllegalArgumentException if the object cannot be converted.
64      */
getInstance( Object o)65     public static SignerIdentifier getInstance(
66         Object o)
67     {
68         if (o == null || o instanceof SignerIdentifier)
69         {
70             return (SignerIdentifier)o;
71         }
72 
73         if (o instanceof IssuerAndSerialNumber)
74         {
75             return new SignerIdentifier((IssuerAndSerialNumber)o);
76         }
77 
78         if (o instanceof ASN1OctetString)
79         {
80             return new SignerIdentifier((ASN1OctetString)o);
81         }
82 
83         if (o instanceof ASN1Primitive)
84         {
85             return new SignerIdentifier((ASN1Primitive)o);
86         }
87 
88         throw new IllegalArgumentException(
89              "Illegal object in SignerIdentifier: " + o.getClass().getName());
90     }
91 
isTagged()92     public boolean isTagged()
93     {
94         return (id instanceof ASN1TaggedObject);
95     }
96 
getId()97     public ASN1Encodable getId()
98     {
99         if (id instanceof ASN1TaggedObject)
100         {
101             return ASN1OctetString.getInstance((ASN1TaggedObject)id, false);
102         }
103 
104         return id;
105     }
106 
107     /**
108      * Produce an object suitable for an ASN1OutputStream.
109      */
toASN1Primitive()110     public ASN1Primitive toASN1Primitive()
111     {
112         return id.toASN1Primitive();
113     }
114 }
115