1b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallampackage org.bouncycastle.asn1.x509;
2b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam
34c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstromimport org.bouncycastle.asn1.ASN1Integer;
44c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstromimport org.bouncycastle.asn1.ASN1Object;
54c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstromimport org.bouncycastle.asn1.ASN1Primitive;
6b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallamimport org.bouncycastle.asn1.ASN1Sequence;
7b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallamimport org.bouncycastle.asn1.ASN1TaggedObject;
8b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallamimport org.bouncycastle.asn1.DERBitString;
9b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallamimport org.bouncycastle.asn1.DERTaggedObject;
10b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallamimport org.bouncycastle.asn1.pkcs.PKCSObjectIdentifiers;
114c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstromimport org.bouncycastle.asn1.x500.X500Name;
12b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam
13b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam/**
14b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam * The TBSCertificate object.
15b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam * <pre>
16b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam * TBSCertificate ::= SEQUENCE {
17b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam *      version          [ 0 ]  Version DEFAULT v1(0),
18b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam *      serialNumber            CertificateSerialNumber,
19b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam *      signature               AlgorithmIdentifier,
20b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam *      issuer                  Name,
21b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam *      validity                Validity,
22b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam *      subject                 Name,
23b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam *      subjectPublicKeyInfo    SubjectPublicKeyInfo,
24b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam *      issuerUniqueID    [ 1 ] IMPLICIT UniqueIdentifier OPTIONAL,
25b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam *      subjectUniqueID   [ 2 ] IMPLICIT UniqueIdentifier OPTIONAL,
26b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam *      extensions        [ 3 ] Extensions OPTIONAL
27b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam *      }
28b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam * </pre>
29b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam * <p>
30b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam * Note: issuerUniqueID and subjectUniqueID are both deprecated by the IETF. This class
31b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam * will parse them, but you really shouldn't be creating new ones.
32b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam */
33b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallampublic class TBSCertificateStructure
344c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    extends ASN1Object
35b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    implements X509ObjectIdentifiers, PKCSObjectIdentifiers
36b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam{
37b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    ASN1Sequence            seq;
38b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam
394c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    ASN1Integer             version;
404c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    ASN1Integer             serialNumber;
41b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    AlgorithmIdentifier     signature;
424c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    X500Name                issuer;
43b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    Time                    startDate, endDate;
444c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    X500Name                subject;
45b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    SubjectPublicKeyInfo    subjectPublicKeyInfo;
46b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    DERBitString            issuerUniqueId;
47b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    DERBitString            subjectUniqueId;
48b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    X509Extensions          extensions;
49b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam
50b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    public static TBSCertificateStructure getInstance(
51b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        ASN1TaggedObject obj,
52b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        boolean          explicit)
53b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    {
54b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        return getInstance(ASN1Sequence.getInstance(obj, explicit));
55b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    }
56b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam
57b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    public static TBSCertificateStructure getInstance(
58b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        Object  obj)
59b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    {
60b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        if (obj instanceof TBSCertificateStructure)
61b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        {
62b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam            return (TBSCertificateStructure)obj;
63b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        }
646e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom        else if (obj != null)
65b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        {
666e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom            return new TBSCertificateStructure(ASN1Sequence.getInstance(obj));
67b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        }
68b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam
696e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom        return null;
70b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    }
71b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam
72b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    public TBSCertificateStructure(
73b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        ASN1Sequence  seq)
74b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    {
75b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        int         seqStart = 0;
76b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam
77b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        this.seq = seq;
78b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam
79b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        //
80b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        // some certficates don't include a version number - we assume v1
81b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        //
82b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        if (seq.getObjectAt(0) instanceof DERTaggedObject)
83b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        {
844c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom            version = ASN1Integer.getInstance((ASN1TaggedObject)seq.getObjectAt(0), true);
85b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        }
86b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        else
87b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        {
88b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam            seqStart = -1;          // field 0 is missing!
894c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom            version = new ASN1Integer(0);
90b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        }
91b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam
924c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        serialNumber = ASN1Integer.getInstance(seq.getObjectAt(seqStart + 1));
93b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam
94b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        signature = AlgorithmIdentifier.getInstance(seq.getObjectAt(seqStart + 2));
954c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        issuer = X500Name.getInstance(seq.getObjectAt(seqStart + 3));
96b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam
97b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        //
98b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        // before and after dates
99b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        //
100b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        ASN1Sequence  dates = (ASN1Sequence)seq.getObjectAt(seqStart + 4);
101b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam
102b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        startDate = Time.getInstance(dates.getObjectAt(0));
103b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        endDate = Time.getInstance(dates.getObjectAt(1));
104b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam
1054c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        subject = X500Name.getInstance(seq.getObjectAt(seqStart + 5));
106b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam
107b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        //
108b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        // public key info.
109b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        //
110b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        subjectPublicKeyInfo = SubjectPublicKeyInfo.getInstance(seq.getObjectAt(seqStart + 6));
111b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam
112b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        for (int extras = seq.size() - (seqStart + 6) - 1; extras > 0; extras--)
113b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        {
114b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam            DERTaggedObject extra = (DERTaggedObject)seq.getObjectAt(seqStart + 6 + extras);
115b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam
116b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam            switch (extra.getTagNo())
117b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam            {
118b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam            case 1:
119b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam                issuerUniqueId = DERBitString.getInstance(extra, false);
120b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam                break;
121b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam            case 2:
122b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam                subjectUniqueId = DERBitString.getInstance(extra, false);
123b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam                break;
124b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam            case 3:
125b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam                extensions = X509Extensions.getInstance(extra);
126b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam            }
127b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        }
128b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    }
129b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam
130b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    public int getVersion()
131b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    {
132b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        return version.getValue().intValue() + 1;
133b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    }
134b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam
1354c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    public ASN1Integer getVersionNumber()
136b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    {
137b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        return version;
138b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    }
139b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam
1404c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    public ASN1Integer getSerialNumber()
141b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    {
142b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        return serialNumber;
143b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    }
144b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam
145b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    public AlgorithmIdentifier getSignature()
146b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    {
147b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        return signature;
148b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    }
149b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam
1504c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    public X500Name getIssuer()
151b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    {
152b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        return issuer;
153b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    }
154b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam
155b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    public Time getStartDate()
156b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    {
157b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        return startDate;
158b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    }
159b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam
160b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    public Time getEndDate()
161b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    {
162b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        return endDate;
163b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    }
164b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam
1654c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    public X500Name getSubject()
166b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    {
167b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        return subject;
168b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    }
169b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam
170b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    public SubjectPublicKeyInfo getSubjectPublicKeyInfo()
171b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    {
172b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        return subjectPublicKeyInfo;
173b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    }
174b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam
175b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    public DERBitString getIssuerUniqueId()
176b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    {
177b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        return issuerUniqueId;
178b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    }
179b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam
180b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    public DERBitString getSubjectUniqueId()
181b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    {
182b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        return subjectUniqueId;
183b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    }
184b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam
185b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    public X509Extensions getExtensions()
186b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    {
187b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        return extensions;
188b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    }
189b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam
1904c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    public ASN1Primitive toASN1Primitive()
191b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    {
192b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        return seq;
193b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    }
194b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam}
195