SignerIdentifier.java revision 5db505e1f6a68c8d5dfdb0fed0b8607dea7bed96
1package org.bouncycastle.asn1.cms;
2
3import org.bouncycastle.asn1.ASN1Choice;
4import org.bouncycastle.asn1.ASN1Encodable;
5import org.bouncycastle.asn1.ASN1Object;
6import org.bouncycastle.asn1.ASN1OctetString;
7import org.bouncycastle.asn1.ASN1Primitive;
8import org.bouncycastle.asn1.ASN1TaggedObject;
9import 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 */
26public class SignerIdentifier
27    extends ASN1Object
28    implements ASN1Choice
29{
30    private ASN1Encodable id;
31
32    public SignerIdentifier(
33        IssuerAndSerialNumber id)
34    {
35        this.id = id;
36    }
37
38    public SignerIdentifier(
39        ASN1OctetString id)
40    {
41        this.id = new DERTaggedObject(false, 0, id);
42    }
43
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     */
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
92    public boolean isTagged()
93    {
94        return (id instanceof ASN1TaggedObject);
95    }
96
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     */
110    public ASN1Primitive toASN1Primitive()
111    {
112        return id.toASN1Primitive();
113    }
114}
115