001package org.apache.commons.ssl.org.bouncycastle.asn1.cms;
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.DERSequence;
011import org.apache.commons.ssl.org.bouncycastle.asn1.x500.X500Name;
012import org.apache.commons.ssl.org.bouncycastle.asn1.x509.Certificate;
013import org.apache.commons.ssl.org.bouncycastle.asn1.x509.X509CertificateStructure;
014import org.apache.commons.ssl.org.bouncycastle.asn1.x509.X509Name;
015
016/**
017 * <a href="http://tools.ietf.org/html/rfc5652#section-10.2.4">RFC 5652</a>: IssuerAndSerialNumber object.
018 * <p>
019 * <pre>
020 * IssuerAndSerialNumber ::= SEQUENCE {
021 *     issuer Name,
022 *     serialNumber CertificateSerialNumber
023 * }
024 *
025 * CertificateSerialNumber ::= INTEGER  -- See RFC 5280
026 * </pre>
027 */
028public class IssuerAndSerialNumber
029    extends ASN1Object
030{
031    private X500Name    name;
032    private ASN1Integer  serialNumber;
033
034    /**
035     * Return an IssuerAndSerialNumber object from the given object.
036     * <p>
037     * Accepted inputs:
038     * <ul>
039     * <li> null &rarr; null
040     * <li> {@link IssuerAndSerialNumber} object
041     * <li> {@link org.bouncycastle.asn1.ASN1Sequence#getInstance(java.lang.Object) ASN1Sequence} input formats with IssuerAndSerialNumber structure inside
042     * </ul>
043     *
044     * @param obj the object we want converted.
045     * @exception IllegalArgumentException if the object cannot be converted.
046     */
047    public static IssuerAndSerialNumber getInstance(
048        Object  obj)
049    {
050        if (obj instanceof IssuerAndSerialNumber)
051        {
052            return (IssuerAndSerialNumber)obj;
053        }
054        else if (obj != null)
055        {
056            return new IssuerAndSerialNumber(ASN1Sequence.getInstance(obj));
057        }
058
059        return null;
060    }
061
062    /**
063     * @deprecated  use getInstance() method.
064     */
065    public IssuerAndSerialNumber(
066        ASN1Sequence    seq)
067    {
068        this.name = X500Name.getInstance(seq.getObjectAt(0));
069        this.serialNumber = (ASN1Integer)seq.getObjectAt(1);
070    }
071
072    public IssuerAndSerialNumber(
073        Certificate certificate)
074    {
075        this.name = certificate.getIssuer();
076        this.serialNumber = certificate.getSerialNumber();
077    }
078
079    /**
080     * @deprecated use constructor taking Certificate
081     */
082    public IssuerAndSerialNumber(
083        X509CertificateStructure certificate)
084    {
085        this.name = certificate.getIssuer();
086        this.serialNumber = certificate.getSerialNumber();
087    }
088
089    public IssuerAndSerialNumber(
090        X500Name name,
091        BigInteger  serialNumber)
092    {
093        this.name = name;
094        this.serialNumber = new ASN1Integer(serialNumber);
095    }
096
097    /**
098     * @deprecated use X500Name constructor
099     */
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}