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