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