2002/03/21 01:19:32
[org.ibex.core.git] / src / org / bouncycastle / asn1 / x509 / TBSCertificateStructure.java
diff --git a/src/org/bouncycastle/asn1/x509/TBSCertificateStructure.java b/src/org/bouncycastle/asn1/x509/TBSCertificateStructure.java
new file mode 100644 (file)
index 0000000..d5c7cf7
--- /dev/null
@@ -0,0 +1,191 @@
+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;
+    }
+}