1package org.bouncycastle.asn1.cms;
2
3import java.math.BigInteger;
4
5import org.bouncycastle.asn1.ASN1EncodableVector;
6import org.bouncycastle.asn1.ASN1Integer;
7import org.bouncycastle.asn1.ASN1Object;
8import org.bouncycastle.asn1.ASN1Primitive;
9import org.bouncycastle.asn1.ASN1Sequence;
10import org.bouncycastle.asn1.DERSequence;
11import org.bouncycastle.asn1.x500.X500Name;
12import org.bouncycastle.asn1.x509.Certificate;
13import org.bouncycastle.asn1.x509.X509CertificateStructure;
14import org.bouncycastle.asn1.x509.X509Name;
15
16/**
17 * <a href="http://tools.ietf.org/html/rfc5652#section-10.2.4">RFC 5652</a>: IssuerAndSerialNumber object.
18 * <p>
19 * <pre>
20 * IssuerAndSerialNumber ::= SEQUENCE {
21 *     issuer Name,
22 *     serialNumber CertificateSerialNumber
23 * }
24 *
25 * CertificateSerialNumber ::= INTEGER  -- See RFC 5280
26 * </pre>
27 */
28public class IssuerAndSerialNumber
29    extends ASN1Object
30{
31    private X500Name    name;
32    private ASN1Integer  serialNumber;
33
34    /**
35     * Return an IssuerAndSerialNumber object from the given object.
36     * <p>
37     * Accepted inputs:
38     * <ul>
39     * <li> null &rarr; null
40     * <li> {@link IssuerAndSerialNumber} object
41     * <li> {@link org.bouncycastle.asn1.ASN1Sequence#getInstance(java.lang.Object) ASN1Sequence} input formats with IssuerAndSerialNumber structure inside
42     * </ul>
43     *
44     * @param obj the object we want converted.
45     * @exception IllegalArgumentException if the object cannot be converted.
46     */
47    public static IssuerAndSerialNumber getInstance(
48        Object  obj)
49    {
50        if (obj instanceof IssuerAndSerialNumber)
51        {
52            return (IssuerAndSerialNumber)obj;
53        }
54        else if (obj != null)
55        {
56            return new IssuerAndSerialNumber(ASN1Sequence.getInstance(obj));
57        }
58
59        return null;
60    }
61
62    /**
63     * @deprecated  use getInstance() method.
64     */
65    public IssuerAndSerialNumber(
66        ASN1Sequence    seq)
67    {
68        this.name = X500Name.getInstance(seq.getObjectAt(0));
69        this.serialNumber = (ASN1Integer)seq.getObjectAt(1);
70    }
71
72    public IssuerAndSerialNumber(
73        Certificate certificate)
74    {
75        this.name = certificate.getIssuer();
76        this.serialNumber = certificate.getSerialNumber();
77    }
78
79    /**
80     * @deprecated use constructor taking Certificate
81     */
82    public IssuerAndSerialNumber(
83        X509CertificateStructure certificate)
84    {
85        this.name = certificate.getIssuer();
86        this.serialNumber = certificate.getSerialNumber();
87    }
88
89    public IssuerAndSerialNumber(
90        X500Name name,
91        BigInteger  serialNumber)
92    {
93        this.name = name;
94        this.serialNumber = new ASN1Integer(serialNumber);
95    }
96
97    /**
98     * @deprecated use X500Name constructor
99     */
100    public IssuerAndSerialNumber(
101        X509Name    name,
102        BigInteger  serialNumber)
103    {
104        this.name = X500Name.getInstance(name);
105        this.serialNumber = new ASN1Integer(serialNumber);
106    }
107
108    /**
109     * @deprecated use X500Name constructor
110     */
111    public IssuerAndSerialNumber(
112        X509Name    name,
113        ASN1Integer  serialNumber)
114    {
115        this.name = X500Name.getInstance(name);
116        this.serialNumber = serialNumber;
117    }
118
119    public X500Name getName()
120    {
121        return name;
122    }
123
124    public ASN1Integer getSerialNumber()
125    {
126        return serialNumber;
127    }
128
129    public ASN1Primitive toASN1Primitive()
130    {
131        ASN1EncodableVector    v = new ASN1EncodableVector();
132
133        v.add(name);
134        v.add(serialNumber);
135
136        return new DERSequence(v);
137    }
138}
139