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