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.DERTaggedObject;
104c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstromimport org.bouncycastle.asn1.x500.X500Name;
114c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom
124c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom/**
134c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom * The TBSCertificate object.
144c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom * <pre>
154c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom * TBSCertificate ::= SEQUENCE {
164c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom *      version          [ 0 ]  Version DEFAULT v1(0),
174c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom *      serialNumber            CertificateSerialNumber,
184c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom *      signature               AlgorithmIdentifier,
194c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom *      issuer                  Name,
204c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom *      validity                Validity,
214c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom *      subject                 Name,
224c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom *      subjectPublicKeyInfo    SubjectPublicKeyInfo,
234c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom *      issuerUniqueID    [ 1 ] IMPLICIT UniqueIdentifier OPTIONAL,
244c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom *      subjectUniqueID   [ 2 ] IMPLICIT UniqueIdentifier OPTIONAL,
254c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom *      extensions        [ 3 ] Extensions OPTIONAL
264c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom *      }
274c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom * </pre>
284c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom * <p>
294c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom * Note: issuerUniqueID and subjectUniqueID are both deprecated by the IETF. This class
304c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom * will parse them, but you really shouldn't be creating new ones.
314c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom */
324c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrompublic class TBSCertificate
334c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    extends ASN1Object
344c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom{
354c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    ASN1Sequence            seq;
364c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom
374c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    ASN1Integer             version;
384c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    ASN1Integer             serialNumber;
394c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    AlgorithmIdentifier     signature;
404c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    X500Name                issuer;
414c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    Time                    startDate, endDate;
424c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    X500Name                subject;
434c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    SubjectPublicKeyInfo    subjectPublicKeyInfo;
444c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    DERBitString            issuerUniqueId;
454c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    DERBitString            subjectUniqueId;
464c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    Extensions              extensions;
474c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom
484c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    public static TBSCertificate getInstance(
494c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        ASN1TaggedObject obj,
504c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        boolean          explicit)
514c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    {
524c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        return getInstance(ASN1Sequence.getInstance(obj, explicit));
534c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    }
544c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom
554c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    public static TBSCertificate getInstance(
564c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        Object  obj)
574c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    {
584c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        if (obj instanceof TBSCertificate)
594c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        {
604c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom            return (TBSCertificate)obj;
614c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        }
624c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        else if (obj != null)
634c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        {
644c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom            return new TBSCertificate(ASN1Sequence.getInstance(obj));
654c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        }
664c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom
674c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        return null;
684c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    }
694c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom
704c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    private TBSCertificate(
714c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        ASN1Sequence seq)
724c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    {
734c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        int         seqStart = 0;
744c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom
754c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        this.seq = seq;
764c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom
774c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        //
784c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        // some certficates don't include a version number - we assume v1
794c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        //
804c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        if (seq.getObjectAt(0) instanceof DERTaggedObject)
814c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        {
824c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom            version = ASN1Integer.getInstance((ASN1TaggedObject)seq.getObjectAt(0), true);
834c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        }
844c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        else
854c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        {
864c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom            seqStart = -1;          // field 0 is missing!
874c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom            version = new ASN1Integer(0);
884c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        }
894c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom
904c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        serialNumber = ASN1Integer.getInstance(seq.getObjectAt(seqStart + 1));
914c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom
924c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        signature = AlgorithmIdentifier.getInstance(seq.getObjectAt(seqStart + 2));
934c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        issuer = X500Name.getInstance(seq.getObjectAt(seqStart + 3));
944c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom
954c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        //
964c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        // before and after dates
974c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        //
984c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        ASN1Sequence  dates = (ASN1Sequence)seq.getObjectAt(seqStart + 4);
994c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom
1004c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        startDate = Time.getInstance(dates.getObjectAt(0));
1014c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        endDate = Time.getInstance(dates.getObjectAt(1));
1024c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom
1034c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        subject = X500Name.getInstance(seq.getObjectAt(seqStart + 5));
1044c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom
1054c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        //
1064c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        // public key info.
1074c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        //
1084c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        subjectPublicKeyInfo = SubjectPublicKeyInfo.getInstance(seq.getObjectAt(seqStart + 6));
1094c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom
1104c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        for (int extras = seq.size() - (seqStart + 6) - 1; extras > 0; extras--)
1114c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        {
1124c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom            DERTaggedObject extra = (DERTaggedObject)seq.getObjectAt(seqStart + 6 + extras);
1134c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom
1144c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom            switch (extra.getTagNo())
1154c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom            {
1164c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom            case 1:
1174c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom                issuerUniqueId = DERBitString.getInstance(extra, false);
1184c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom                break;
1194c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom            case 2:
1204c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom                subjectUniqueId = DERBitString.getInstance(extra, false);
1214c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom                break;
1224c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom            case 3:
1234c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom                extensions = Extensions.getInstance(ASN1Sequence.getInstance(extra, true));
1244c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom            }
1254c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        }
1264c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    }
1274c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom
1284c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    public int getVersionNumber()
1294c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    {
1304c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        return version.getValue().intValue() + 1;
1314c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    }
1324c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom
1334c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    public ASN1Integer getVersion()
1344c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    {
1354c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        return version;
1364c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    }
1374c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom
1384c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    public ASN1Integer getSerialNumber()
1394c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    {
1404c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        return serialNumber;
1414c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    }
1424c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom
1434c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    public AlgorithmIdentifier getSignature()
1444c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    {
1454c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        return signature;
1464c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    }
1474c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom
1484c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    public X500Name getIssuer()
1494c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    {
1504c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        return issuer;
1514c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    }
1524c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom
1534c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    public Time getStartDate()
1544c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    {
1554c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        return startDate;
1564c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    }
1574c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom
1584c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    public Time getEndDate()
1594c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    {
1604c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        return endDate;
1614c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    }
1624c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom
1634c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    public X500Name getSubject()
1644c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    {
1654c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        return subject;
1664c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    }
1674c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom
1684c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    public SubjectPublicKeyInfo getSubjectPublicKeyInfo()
1694c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    {
1704c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        return subjectPublicKeyInfo;
1714c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    }
1724c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom
1734c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    public DERBitString getIssuerUniqueId()
1744c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    {
1754c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        return issuerUniqueId;
1764c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    }
1774c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom
1784c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    public DERBitString getSubjectUniqueId()
1794c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    {
1804c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        return subjectUniqueId;
1814c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    }
1824c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom
1834c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    public Extensions getExtensions()
1844c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    {
1854c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        return extensions;
1864c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    }
1874c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom
1884c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    public ASN1Primitive toASN1Primitive()
1894c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    {
1904c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        return seq;
1914c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    }
1924c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom}
193