001package org.apache.commons.ssl.org.bouncycastle.asn1.x509;
002
003import org.apache.commons.ssl.org.bouncycastle.asn1.ASN1Integer;
004import org.apache.commons.ssl.org.bouncycastle.asn1.ASN1Object;
005import org.apache.commons.ssl.org.bouncycastle.asn1.ASN1Primitive;
006import org.apache.commons.ssl.org.bouncycastle.asn1.ASN1Sequence;
007import org.apache.commons.ssl.org.bouncycastle.asn1.ASN1TaggedObject;
008import org.apache.commons.ssl.org.bouncycastle.asn1.DERBitString;
009import org.apache.commons.ssl.org.bouncycastle.asn1.x500.X500Name;
010
011/**
012 * an X509Certificate structure.
013 * <pre>
014 *  Certificate ::= SEQUENCE {
015 *      tbsCertificate          TBSCertificate,
016 *      signatureAlgorithm      AlgorithmIdentifier,
017 *      signature               BIT STRING
018 *  }
019 * </pre>
020 */
021public class Certificate
022    extends ASN1Object
023{
024    ASN1Sequence  seq;
025    TBSCertificate tbsCert;
026    AlgorithmIdentifier     sigAlgId;
027    DERBitString            sig;
028
029    public static Certificate getInstance(
030        ASN1TaggedObject obj,
031        boolean          explicit)
032    {
033        return getInstance(ASN1Sequence.getInstance(obj, explicit));
034    }
035
036    public static Certificate getInstance(
037        Object  obj)
038    {
039        if (obj instanceof Certificate)
040        {
041            return (Certificate)obj;
042        }
043        else if (obj != null)
044        {
045            return new Certificate(ASN1Sequence.getInstance(obj));
046        }
047
048        return null;
049    }
050
051    private Certificate(
052        ASN1Sequence seq)
053    {
054        this.seq = seq;
055
056        //
057        // correct x509 certficate
058        //
059        if (seq.size() == 3)
060        {
061            tbsCert = TBSCertificate.getInstance(seq.getObjectAt(0));
062            sigAlgId = AlgorithmIdentifier.getInstance(seq.getObjectAt(1));
063
064            sig = DERBitString.getInstance(seq.getObjectAt(2));
065        }
066        else
067        {
068            throw new IllegalArgumentException("sequence wrong size for a certificate");
069        }
070    }
071
072    public TBSCertificate getTBSCertificate()
073    {
074        return tbsCert;
075    }
076
077    public ASN1Integer getVersion()
078    {
079        return tbsCert.getVersion();
080    }
081
082    public int getVersionNumber()
083    {
084        return tbsCert.getVersionNumber();
085    }
086
087    public ASN1Integer getSerialNumber()
088    {
089        return tbsCert.getSerialNumber();
090    }
091
092    public X500Name getIssuer()
093    {
094        return tbsCert.getIssuer();
095    }
096
097    public Time getStartDate()
098    {
099        return tbsCert.getStartDate();
100    }
101
102    public Time getEndDate()
103    {
104        return tbsCert.getEndDate();
105    }
106
107    public X500Name getSubject()
108    {
109        return tbsCert.getSubject();
110    }
111
112    public SubjectPublicKeyInfo getSubjectPublicKeyInfo()
113    {
114        return tbsCert.getSubjectPublicKeyInfo();
115    }
116
117    public AlgorithmIdentifier getSignatureAlgorithm()
118    {
119        return sigAlgId;
120    }
121
122    public DERBitString getSignature()
123    {
124        return sig;
125    }
126
127    public ASN1Primitive toASN1Primitive()
128    {
129        return seq;
130    }
131}