14c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrompackage org.bouncycastle.asn1.x509; 24c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom 34c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstromimport org.bouncycastle.asn1.ASN1Integer; 44c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstromimport org.bouncycastle.asn1.ASN1Object; 54c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstromimport org.bouncycastle.asn1.ASN1Primitive; 64c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstromimport org.bouncycastle.asn1.ASN1Sequence; 74c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstromimport org.bouncycastle.asn1.ASN1TaggedObject; 84c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstromimport org.bouncycastle.asn1.DERBitString; 94c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstromimport org.bouncycastle.asn1.DERTaggedObject; 104c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstromimport org.bouncycastle.asn1.x500.X500Name; 114c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom 124c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom/** 134c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom * The TBSCertificate object. 144c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom * <pre> 154c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom * TBSCertificate ::= SEQUENCE { 164c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom * version [ 0 ] Version DEFAULT v1(0), 174c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom * serialNumber CertificateSerialNumber, 184c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom * signature AlgorithmIdentifier, 194c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom * issuer Name, 204c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom * validity Validity, 214c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom * subject Name, 224c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom * subjectPublicKeyInfo SubjectPublicKeyInfo, 234c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom * issuerUniqueID [ 1 ] IMPLICIT UniqueIdentifier OPTIONAL, 244c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom * subjectUniqueID [ 2 ] IMPLICIT UniqueIdentifier OPTIONAL, 254c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom * extensions [ 3 ] Extensions OPTIONAL 264c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom * } 274c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom * </pre> 284c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom * <p> 294c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom * Note: issuerUniqueID and subjectUniqueID are both deprecated by the IETF. This class 304c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom * will parse them, but you really shouldn't be creating new ones. 314c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom */ 324c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrompublic class TBSCertificate 334c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom extends ASN1Object 344c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom{ 354c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom ASN1Sequence seq; 364c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom 374c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom ASN1Integer version; 384c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom ASN1Integer serialNumber; 394c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom AlgorithmIdentifier signature; 404c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom X500Name issuer; 414c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom Time startDate, endDate; 424c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom X500Name subject; 434c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom SubjectPublicKeyInfo subjectPublicKeyInfo; 444c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom DERBitString issuerUniqueId; 454c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom DERBitString subjectUniqueId; 464c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom Extensions extensions; 474c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom 484c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom public static TBSCertificate getInstance( 494c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom ASN1TaggedObject obj, 504c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom boolean explicit) 514c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom { 524c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom return getInstance(ASN1Sequence.getInstance(obj, explicit)); 534c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom } 544c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom 554c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom public static TBSCertificate getInstance( 564c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom Object obj) 574c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom { 584c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom if (obj instanceof TBSCertificate) 594c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom { 604c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom return (TBSCertificate)obj; 614c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom } 624c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom else if (obj != null) 634c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom { 644c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom return new TBSCertificate(ASN1Sequence.getInstance(obj)); 654c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom } 664c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom 674c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom return null; 684c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom } 694c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom 704c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom private TBSCertificate( 714c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom ASN1Sequence seq) 724c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom { 734c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom int seqStart = 0; 744c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom 754c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom this.seq = seq; 764c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom 774c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom // 784c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom // some certficates don't include a version number - we assume v1 794c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom // 804c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom if (seq.getObjectAt(0) instanceof DERTaggedObject) 814c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom { 824c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom version = ASN1Integer.getInstance((ASN1TaggedObject)seq.getObjectAt(0), true); 834c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom } 844c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom else 854c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom { 864c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom seqStart = -1; // field 0 is missing! 874c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom version = new ASN1Integer(0); 884c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom } 894c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom 904c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom serialNumber = ASN1Integer.getInstance(seq.getObjectAt(seqStart + 1)); 914c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom 924c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom signature = AlgorithmIdentifier.getInstance(seq.getObjectAt(seqStart + 2)); 934c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom issuer = X500Name.getInstance(seq.getObjectAt(seqStart + 3)); 944c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom 954c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom // 964c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom // before and after dates 974c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom // 984c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom ASN1Sequence dates = (ASN1Sequence)seq.getObjectAt(seqStart + 4); 994c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom 1004c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom startDate = Time.getInstance(dates.getObjectAt(0)); 1014c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom endDate = Time.getInstance(dates.getObjectAt(1)); 1024c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom 1034c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom subject = X500Name.getInstance(seq.getObjectAt(seqStart + 5)); 1044c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom 1054c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom // 1064c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom // public key info. 1074c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom // 1084c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom subjectPublicKeyInfo = SubjectPublicKeyInfo.getInstance(seq.getObjectAt(seqStart + 6)); 1094c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom 1104c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom for (int extras = seq.size() - (seqStart + 6) - 1; extras > 0; extras--) 1114c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom { 1124c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom DERTaggedObject extra = (DERTaggedObject)seq.getObjectAt(seqStart + 6 + extras); 1134c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom 1144c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom switch (extra.getTagNo()) 1154c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom { 1164c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom case 1: 1174c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom issuerUniqueId = DERBitString.getInstance(extra, false); 1184c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom break; 1194c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom case 2: 1204c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom subjectUniqueId = DERBitString.getInstance(extra, false); 1214c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom break; 1224c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom case 3: 1234c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom extensions = Extensions.getInstance(ASN1Sequence.getInstance(extra, true)); 1244c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom } 1254c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom } 1264c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom } 1274c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom 1284c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom public int getVersionNumber() 1294c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom { 1304c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom return version.getValue().intValue() + 1; 1314c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom } 1324c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom 1334c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom public ASN1Integer getVersion() 1344c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom { 1354c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom return version; 1364c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom } 1374c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom 1384c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom public ASN1Integer getSerialNumber() 1394c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom { 1404c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom return serialNumber; 1414c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom } 1424c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom 1434c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom public AlgorithmIdentifier getSignature() 1444c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom { 1454c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom return signature; 1464c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom } 1474c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom 1484c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom public X500Name getIssuer() 1494c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom { 1504c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom return issuer; 1514c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom } 1524c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom 1534c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom public Time getStartDate() 1544c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom { 1554c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom return startDate; 1564c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom } 1574c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom 1584c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom public Time getEndDate() 1594c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom { 1604c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom return endDate; 1614c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom } 1624c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom 1634c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom public X500Name getSubject() 1644c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom { 1654c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom return subject; 1664c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom } 1674c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom 1684c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom public SubjectPublicKeyInfo getSubjectPublicKeyInfo() 1694c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom { 1704c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom return subjectPublicKeyInfo; 1714c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom } 1724c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom 1734c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom public DERBitString getIssuerUniqueId() 1744c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom { 1754c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom return issuerUniqueId; 1764c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom } 1774c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom 1784c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom public DERBitString getSubjectUniqueId() 1794c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom { 1804c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom return subjectUniqueId; 1814c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom } 1824c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom 1834c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom public Extensions getExtensions() 1844c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom { 1854c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom return extensions; 1864c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom } 1874c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom 1884c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom public ASN1Primitive toASN1Primitive() 1894c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom { 1904c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom return seq; 1914c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom } 1924c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom} 193