--- /dev/null
+package org.bouncycastle.asn1.x509;
+
+import org.bouncycastle.asn1.*;
+import org.bouncycastle.asn1.pkcs.*;
+
+/**
+ * <pre>
+ * TBSCertificate ::= SEQUENCE {
+ * version [ 0 ] Version DEFAULT v1(0),
+ * serialNumber CertificateSerialNumber,
+ * signature AlgorithmIdentifier,
+ * issuer Name,
+ * validity Validity,
+ * subject Name,
+ * subjectPublicKeyInfo SubjectPublicKeyInfo,
+ * issuerUniqueID [ 1 ] IMPLICIT UniqueIdentifier OPTIONAL,
+ * subjectUniqueID [ 2 ] IMPLICIT UniqueIdentifier OPTIONAL,
+ * extensions [ 3 ] Extensions OPTIONAL
+ * }
+ * </pre>
+ * <p>
+ * Note: issuerUniqueID and subjectUniqueID are both deprecated by the IETF. This class
+ * will parse them, but you really shouldn't be creating new ones.
+ */
+public class TBSCertificateStructure
+ implements DEREncodable, X509ObjectIdentifiers, PKCSObjectIdentifiers
+{
+ DERConstructedSequence seq;
+
+ DERInteger version;
+ DERInteger serialNumber;
+ AlgorithmIdentifier signature;
+ X509Name issuer;
+ DERUTCTime startDate, endDate;
+ X509Name subject;
+ SubjectPublicKeyInfo subjectPublicKeyInfo;
+ DERBitString issuerUniqueId;
+ DERBitString subjectUniqueId;
+ X509Extensions extensions;
+
+ public TBSCertificateStructure(
+ DERConstructedSequence seq)
+ {
+ int seqStart = 0;
+
+ this.seq = seq;
+
+ //
+ // some certficates don't include a version number - we assume v1
+ //
+ if (seq.getObjectAt(0) instanceof DERTaggedObject)
+ {
+ version = (DERInteger)((DERTaggedObject)seq.getObjectAt(0)).getObject();
+ }
+ else
+ {
+ seqStart = -1; // field 0 is missing!
+ version = new DERInteger(0);
+ }
+
+ serialNumber = (DERInteger)seq.getObjectAt(seqStart + 1);
+
+ if (seq.getObjectAt(seqStart + 2) instanceof AlgorithmIdentifier)
+ {
+ signature = (AlgorithmIdentifier)seq.getObjectAt(seqStart + 2);
+ }
+ else
+ {
+ signature = new AlgorithmIdentifier((DERConstructedSequence)seq.getObjectAt(seqStart + 2));
+ }
+
+ if (seq.getObjectAt(seqStart + 3) instanceof X509Name)
+ {
+ issuer = (X509Name)seq.getObjectAt(seqStart + 3);
+ }
+ else
+ {
+ issuer = new X509Name((DERConstructedSequence)seq.getObjectAt(seqStart + 3));
+ }
+
+ //
+ // before and after dates
+ //
+ DERConstructedSequence dates = (DERConstructedSequence)seq.getObjectAt(seqStart + 4);
+ startDate = (DERUTCTime)dates.getObjectAt(0);
+ endDate = (DERUTCTime)dates.getObjectAt(1);
+
+ if (seq.getObjectAt(seqStart + 5) instanceof X509Name)
+ {
+ subject = (X509Name)seq.getObjectAt(seqStart + 5);
+ }
+ else
+ {
+ subject = new X509Name((DERConstructedSequence)seq.getObjectAt(seqStart + 5));
+ }
+
+ //
+ // public key info.
+ //
+ if (seq.getObjectAt(seqStart + 6) instanceof SubjectPublicKeyInfo)
+ {
+ subjectPublicKeyInfo = (SubjectPublicKeyInfo)seq.getObjectAt(seqStart + 6);
+ }
+ else
+ {
+ subjectPublicKeyInfo = new SubjectPublicKeyInfo((DERConstructedSequence)seq.getObjectAt(seqStart + 6));
+ }
+
+ for (int extras = seq.getSize() - (seqStart + 6) - 1; extras > 0; extras--)
+ {
+ DERTaggedObject extra = (DERTaggedObject)seq.getObjectAt(seqStart + 6 + extras);
+
+ switch (extra.getTagNo())
+ {
+ case 1:
+ issuerUniqueId = (DERBitString)extra.getObject();
+ break;
+ case 2:
+ subjectUniqueId = (DERBitString)extra.getObject();
+ break;
+ case 3:
+ extensions = new X509Extensions((DERConstructedSequence)extra.getObject());
+ }
+ }
+ }
+
+ public int getVersion()
+ {
+ return version.getValue().intValue() + 1;
+ }
+
+ public DERInteger getVersionNumber()
+ {
+ return version;
+ }
+
+ public DERInteger getSerialNumber()
+ {
+ return serialNumber;
+ }
+
+ public AlgorithmIdentifier getSignature()
+ {
+ return signature;
+ }
+
+ public X509Name getIssuer()
+ {
+ return issuer;
+ }
+
+ public DERUTCTime getStartDate()
+ {
+ return startDate;
+ }
+
+ public DERUTCTime getEndDate()
+ {
+ return endDate;
+ }
+
+ public X509Name getSubject()
+ {
+ return subject;
+ }
+
+ public SubjectPublicKeyInfo getSubjectPublicKeyInfo()
+ {
+ return subjectPublicKeyInfo;
+ }
+
+ public DERBitString getIssuerUniqueId()
+ {
+ return issuerUniqueId;
+ }
+
+ public DERBitString getSubjectUniqueId()
+ {
+ return subjectUniqueId;
+ }
+
+ public X509Extensions getExtensions()
+ {
+ return extensions;
+ }
+
+ public DERObject getDERObject()
+ {
+ return seq;
+ }
+}