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