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