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