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