14c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrompackage org.bouncycastle.asn1.x509;
24c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom
34c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstromimport org.bouncycastle.asn1.ASN1Integer;
44c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstromimport org.bouncycastle.asn1.ASN1Object;
54c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstromimport org.bouncycastle.asn1.ASN1Primitive;
64c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstromimport org.bouncycastle.asn1.ASN1Sequence;
74c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstromimport org.bouncycastle.asn1.ASN1TaggedObject;
84c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstromimport org.bouncycastle.asn1.DERBitString;
94c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstromimport org.bouncycastle.asn1.x500.X500Name;
104c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom
114c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom/**
124c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom * an X509Certificate structure.
134c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom * <pre>
144c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom *  Certificate ::= SEQUENCE {
154c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom *      tbsCertificate          TBSCertificate,
164c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom *      signatureAlgorithm      AlgorithmIdentifier,
174c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom *      signature               BIT STRING
184c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom *  }
194c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom * </pre>
204c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom */
214c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrompublic class Certificate
224c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    extends ASN1Object
234c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom{
244c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    ASN1Sequence  seq;
254c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    TBSCertificate tbsCert;
264c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    AlgorithmIdentifier     sigAlgId;
274c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    DERBitString            sig;
284c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom
294c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    public static Certificate getInstance(
304c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        ASN1TaggedObject obj,
314c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        boolean          explicit)
324c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    {
334c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        return getInstance(ASN1Sequence.getInstance(obj, explicit));
344c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    }
354c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom
364c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    public static Certificate getInstance(
374c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        Object  obj)
384c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    {
394c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        if (obj instanceof Certificate)
404c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        {
414c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom            return (Certificate)obj;
424c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        }
434c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        else if (obj != null)
444c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        {
454c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom            return new Certificate(ASN1Sequence.getInstance(obj));
464c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        }
474c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom
484c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        return null;
494c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    }
504c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom
514c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    private Certificate(
524c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        ASN1Sequence seq)
534c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    {
544c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        this.seq = seq;
554c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom
564c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        //
574c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        // correct x509 certficate
584c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        //
594c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        if (seq.size() == 3)
604c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        {
614c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom            tbsCert = TBSCertificate.getInstance(seq.getObjectAt(0));
624c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom            sigAlgId = AlgorithmIdentifier.getInstance(seq.getObjectAt(1));
634c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom
644c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom            sig = DERBitString.getInstance(seq.getObjectAt(2));
654c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        }
664c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        else
674c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        {
684c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom            throw new IllegalArgumentException("sequence wrong size for a certificate");
694c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        }
704c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    }
714c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom
724c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    public TBSCertificate getTBSCertificate()
734c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    {
744c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        return tbsCert;
754c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    }
764c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom
774c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    public ASN1Integer getVersion()
784c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    {
794c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        return tbsCert.getVersion();
804c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    }
814c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom
824c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    public int getVersionNumber()
834c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    {
844c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        return tbsCert.getVersionNumber();
854c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    }
864c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom
874c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    public ASN1Integer getSerialNumber()
884c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    {
894c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        return tbsCert.getSerialNumber();
904c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    }
914c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom
924c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    public X500Name getIssuer()
934c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    {
944c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        return tbsCert.getIssuer();
954c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    }
964c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom
974c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    public Time getStartDate()
984c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    {
994c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        return tbsCert.getStartDate();
1004c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    }
1014c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom
1024c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    public Time getEndDate()
1034c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    {
1044c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        return tbsCert.getEndDate();
1054c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    }
1064c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom
1074c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    public X500Name getSubject()
1084c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    {
1094c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        return tbsCert.getSubject();
1104c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    }
1114c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom
1124c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    public SubjectPublicKeyInfo getSubjectPublicKeyInfo()
1134c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    {
1144c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        return tbsCert.getSubjectPublicKeyInfo();
1154c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    }
1164c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom
1174c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    public AlgorithmIdentifier getSignatureAlgorithm()
1184c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    {
1194c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        return sigAlgId;
1204c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    }
1214c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom
1224c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    public DERBitString getSignature()
1234c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    {
1244c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        return sig;
1254c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    }
1264c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom
1274c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    public ASN1Primitive toASN1Primitive()
1284c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    {
1294c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        return seq;
1304c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    }
1314c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom}
132