1package org.bouncycastle.asn1.x509;
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.ASN1TaggedObject;
11import org.bouncycastle.asn1.DERBitString;
12import org.bouncycastle.asn1.DERSequence;
13import org.bouncycastle.asn1.x500.X500Name;
14
15public class IssuerSerial
16    extends ASN1Object
17{
18    GeneralNames            issuer;
19    ASN1Integer              serial;
20    DERBitString            issuerUID;
21
22    public static IssuerSerial getInstance(
23            Object  obj)
24    {
25        if (obj instanceof IssuerSerial)
26        {
27            return (IssuerSerial)obj;
28        }
29
30        if (obj != null)
31        {
32            return new IssuerSerial(ASN1Sequence.getInstance(obj));
33        }
34
35        return null;
36    }
37
38    public static IssuerSerial getInstance(
39        ASN1TaggedObject obj,
40        boolean          explicit)
41    {
42        return getInstance(ASN1Sequence.getInstance(obj, explicit));
43    }
44
45    private IssuerSerial(
46        ASN1Sequence    seq)
47    {
48        if (seq.size() != 2 && seq.size() != 3)
49        {
50            throw new IllegalArgumentException("Bad sequence size: " + seq.size());
51        }
52
53        issuer = GeneralNames.getInstance(seq.getObjectAt(0));
54        serial = ASN1Integer.getInstance(seq.getObjectAt(1));
55
56        if (seq.size() == 3)
57        {
58            issuerUID = DERBitString.getInstance(seq.getObjectAt(2));
59        }
60    }
61
62    public IssuerSerial(
63        X500Name   issuer,
64        BigInteger serial)
65    {
66        this(new GeneralNames(new GeneralName(issuer)), new ASN1Integer(serial));
67    }
68
69    public IssuerSerial(
70        GeneralNames    issuer,
71        BigInteger serial)
72    {
73        this(issuer, new ASN1Integer(serial));
74    }
75
76    public IssuerSerial(
77        GeneralNames    issuer,
78        ASN1Integer      serial)
79    {
80        this.issuer = issuer;
81        this.serial = serial;
82    }
83
84    public GeneralNames getIssuer()
85    {
86        return issuer;
87    }
88
89    public ASN1Integer getSerial()
90    {
91        return serial;
92    }
93
94    public DERBitString getIssuerUID()
95    {
96        return issuerUID;
97    }
98
99    /**
100     * Produce an object suitable for an ASN1OutputStream.
101     * <pre>
102     *  IssuerSerial  ::=  SEQUENCE {
103     *       issuer         GeneralNames,
104     *       serial         CertificateSerialNumber,
105     *       issuerUID      UniqueIdentifier OPTIONAL
106     *  }
107     * </pre>
108     */
109    public ASN1Primitive toASN1Primitive()
110    {
111        ASN1EncodableVector  v = new ASN1EncodableVector();
112
113        v.add(issuer);
114        v.add(serial);
115
116        if (issuerUID != null)
117        {
118            v.add(issuerUID);
119        }
120
121        return new DERSequence(v);
122    }
123}
124