1 package org.bouncycastle.asn1.x509;
3 import org.bouncycastle.asn1.*;
4 import org.bouncycastle.asn1.pkcs.*;
8 * TBSCertificate ::= SEQUENCE {
9 * version [ 0 ] Version DEFAULT v1(0),
10 * serialNumber CertificateSerialNumber,
11 * signature AlgorithmIdentifier,
15 * subjectPublicKeyInfo SubjectPublicKeyInfo,
16 * issuerUniqueID [ 1 ] IMPLICIT UniqueIdentifier OPTIONAL,
17 * subjectUniqueID [ 2 ] IMPLICIT UniqueIdentifier OPTIONAL,
18 * extensions [ 3 ] Extensions OPTIONAL
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.
25 public class TBSCertificateStructure
26 implements DEREncodable, X509ObjectIdentifiers, PKCSObjectIdentifiers
31 DERInteger serialNumber;
32 AlgorithmIdentifier signature;
34 Time startDate, endDate;
36 SubjectPublicKeyInfo subjectPublicKeyInfo;
37 DERBitString issuerUniqueId;
38 DERBitString subjectUniqueId;
39 X509Extensions extensions;
41 public static TBSCertificateStructure getInstance(
45 return getInstance(ASN1Sequence.getInstance(obj, explicit));
48 public static TBSCertificateStructure getInstance(
51 if (obj instanceof TBSCertificateStructure)
53 return (TBSCertificateStructure)obj;
55 else if (obj instanceof ASN1Sequence)
57 return new TBSCertificateStructure((ASN1Sequence)obj);
60 throw new IllegalArgumentException("unknown object in factory");
63 public TBSCertificateStructure(
71 // some certficates don't include a version number - we assume v1
73 if (seq.getObjectAt(0) instanceof DERTaggedObject)
75 version = DERInteger.getInstance(seq.getObjectAt(0));
79 seqStart = -1; // field 0 is missing!
80 version = new DERInteger(0);
83 serialNumber = DERInteger.getInstance(seq.getObjectAt(seqStart + 1));
85 signature = AlgorithmIdentifier.getInstance(seq.getObjectAt(seqStart + 2));
86 issuer = X509Name.getInstance(seq.getObjectAt(seqStart + 3));
89 // before and after dates
91 ASN1Sequence dates = (ASN1Sequence)seq.getObjectAt(seqStart + 4);
93 startDate = Time.getInstance(dates.getObjectAt(0));
94 endDate = Time.getInstance(dates.getObjectAt(1));
96 subject = X509Name.getInstance(seq.getObjectAt(seqStart + 5));
101 subjectPublicKeyInfo = SubjectPublicKeyInfo.getInstance(seq.getObjectAt(seqStart + 6));
103 for (int extras = seq.size() - (seqStart + 6) - 1; extras > 0; extras--)
105 DERTaggedObject extra = (DERTaggedObject)seq.getObjectAt(seqStart + 6 + extras);
107 switch (extra.getTagNo())
110 issuerUniqueId = DERBitString.getInstance(extra);
113 subjectUniqueId = DERBitString.getInstance(extra);
116 extensions = X509Extensions.getInstance(extra);
121 public int getVersion()
123 return version.getValue().intValue() + 1;
126 public DERInteger getVersionNumber()
131 public DERInteger getSerialNumber()
136 public AlgorithmIdentifier getSignature()
141 public X509Name getIssuer()
146 public Time getStartDate()
151 public Time getEndDate()
156 public X509Name getSubject()
161 public SubjectPublicKeyInfo getSubjectPublicKeyInfo()
163 return subjectPublicKeyInfo;
166 public DERBitString getIssuerUniqueId()
168 return issuerUniqueId;
171 public DERBitString getSubjectUniqueId()
173 return subjectUniqueId;
176 public X509Extensions getExtensions()
181 public DERObject getDERObject()