001package org.apache.commons.ssl.org.bouncycastle.asn1.x509;
002
003import java.math.BigInteger;
004
005import org.apache.commons.ssl.org.bouncycastle.asn1.ASN1EncodableVector;
006import org.apache.commons.ssl.org.bouncycastle.asn1.ASN1Integer;
007import org.apache.commons.ssl.org.bouncycastle.asn1.ASN1Object;
008import org.apache.commons.ssl.org.bouncycastle.asn1.ASN1Primitive;
009import org.apache.commons.ssl.org.bouncycastle.asn1.ASN1Sequence;
010import org.apache.commons.ssl.org.bouncycastle.asn1.ASN1TaggedObject;
011import org.apache.commons.ssl.org.bouncycastle.asn1.DERBitString;
012import org.apache.commons.ssl.org.bouncycastle.asn1.DERSequence;
013import org.apache.commons.ssl.org.bouncycastle.asn1.x500.X500Name;
014
015public class IssuerSerial
016    extends ASN1Object
017{
018    GeneralNames            issuer;
019    ASN1Integer              serial;
020    DERBitString            issuerUID;
021
022    public static IssuerSerial getInstance(
023            Object  obj)
024    {
025        if (obj instanceof IssuerSerial)
026        {
027            return (IssuerSerial)obj;
028        }
029
030        if (obj != null)
031        {
032            return new IssuerSerial(ASN1Sequence.getInstance(obj));
033        }
034
035        return null;
036    }
037
038    public static IssuerSerial getInstance(
039        ASN1TaggedObject obj,
040        boolean          explicit)
041    {
042        return getInstance(ASN1Sequence.getInstance(obj, explicit));
043    }
044    
045    private IssuerSerial(
046        ASN1Sequence    seq)
047    {
048        if (seq.size() != 2 && seq.size() != 3)
049        {
050            throw new IllegalArgumentException("Bad sequence size: " + seq.size());
051        }
052        
053        issuer = GeneralNames.getInstance(seq.getObjectAt(0));
054        serial = ASN1Integer.getInstance(seq.getObjectAt(1));
055
056        if (seq.size() == 3)
057        {
058            issuerUID = DERBitString.getInstance(seq.getObjectAt(2));
059        }
060    }
061
062    public IssuerSerial(
063        X500Name   issuer,
064        BigInteger serial)
065    {
066        this(new GeneralNames(new GeneralName(issuer)), new ASN1Integer(serial));
067    }
068
069    public IssuerSerial(
070        GeneralNames    issuer,
071        BigInteger serial)
072    {
073        this(issuer, new ASN1Integer(serial));
074    }
075
076    public IssuerSerial(
077        GeneralNames    issuer,
078        ASN1Integer      serial)
079    {
080        this.issuer = issuer;
081        this.serial = serial;
082    }
083
084    public GeneralNames getIssuer()
085    {
086        return issuer;
087    }
088
089    public ASN1Integer getSerial()
090    {
091        return serial;
092    }
093
094    public DERBitString getIssuerUID()
095    {
096        return issuerUID;
097    }
098
099    /**
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}