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