1 package org.bouncycastle.asn1.x509;
3 import org.bouncycastle.asn1.*;
5 import org.bouncycastle.asn1.pkcs.PKCSObjectIdentifiers;
9 * TBSCertificate ::= SEQUENCE {
10 * version [ 0 ] Version DEFAULT v1(0),
11 * serialNumber CertificateSerialNumber,
12 * signature AlgorithmIdentifier,
16 * subjectPublicKeyInfo SubjectPublicKeyInfo,
17 * issuerUniqueID [ 1 ] IMPLICIT UniqueIdentifier OPTIONAL,
18 * subjectUniqueID [ 2 ] IMPLICIT UniqueIdentifier OPTIONAL,
19 * extensions [ 3 ] Extensions OPTIONAL
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.
26 public class TBSCertificateStructure
27 implements DEREncodable, X509ObjectIdentifiers, PKCSObjectIdentifiers
32 DERInteger serialNumber;
33 AlgorithmIdentifier signature;
35 Time startDate, endDate;
37 SubjectPublicKeyInfo subjectPublicKeyInfo;
38 DERBitString issuerUniqueId;
39 DERBitString subjectUniqueId;
40 X509Extensions extensions;
42 public static TBSCertificateStructure getInstance(
46 return getInstance(ASN1Sequence.getInstance(obj, explicit));
49 public static TBSCertificateStructure getInstance(
52 if (obj instanceof TBSCertificateStructure)
54 return (TBSCertificateStructure)obj;
56 else if (obj instanceof ASN1Sequence)
58 return new TBSCertificateStructure((ASN1Sequence)obj);
61 throw new IllegalArgumentException("unknown object in factory");
64 public TBSCertificateStructure(
72 // some certficates don't include a version number - we assume v1
74 if (seq.getObjectAt(0) instanceof DERTaggedObject)
76 version = DERInteger.getInstance(seq.getObjectAt(0));
80 seqStart = -1; // field 0 is missing!
81 version = new DERInteger(0);
84 serialNumber = DERInteger.getInstance(seq.getObjectAt(seqStart + 1));
86 signature = AlgorithmIdentifier.getInstance(seq.getObjectAt(seqStart + 2));
87 issuer = X509Name.getInstance(seq.getObjectAt(seqStart + 3));
90 // before and after dates
92 ASN1Sequence dates = (ASN1Sequence)seq.getObjectAt(seqStart + 4);
94 startDate = Time.getInstance(dates.getObjectAt(0));
95 endDate = Time.getInstance(dates.getObjectAt(1));
97 subject = X509Name.getInstance(seq.getObjectAt(seqStart + 5));
102 subjectPublicKeyInfo = SubjectPublicKeyInfo.getInstance(seq.getObjectAt(seqStart + 6));
104 for (int extras = seq.size() - (seqStart + 6) - 1; extras > 0; extras--)
106 DERTaggedObject extra = (DERTaggedObject)seq.getObjectAt(seqStart + 6 + extras);
108 switch (extra.getTagNo())
111 issuerUniqueId = DERBitString.getInstance(extra);
114 subjectUniqueId = DERBitString.getInstance(extra);
117 extensions = X509Extensions.getInstance(extra);
122 public int getVersion()
124 return version.getValue().intValue() + 1;
127 public DERInteger getVersionNumber()
132 public DERInteger getSerialNumber()
137 public AlgorithmIdentifier getSignature()
142 public X509Name getIssuer()
147 public Time getStartDate()
152 public Time getEndDate()
157 public X509Name getSubject()
162 public SubjectPublicKeyInfo getSubjectPublicKeyInfo()
164 return subjectPublicKeyInfo;
167 public DERBitString getIssuerUniqueId()
169 return issuerUniqueId;
172 public DERBitString getSubjectUniqueId()
174 return subjectUniqueId;
177 public X509Extensions getExtensions()
182 public DERObject getDERObject()