001package org.apache.commons.ssl.org.bouncycastle.asn1.ess; 002 003import org.apache.commons.ssl.org.bouncycastle.asn1.ASN1EncodableVector; 004import org.apache.commons.ssl.org.bouncycastle.asn1.ASN1Object; 005import org.apache.commons.ssl.org.bouncycastle.asn1.ASN1OctetString; 006import org.apache.commons.ssl.org.bouncycastle.asn1.ASN1Primitive; 007import org.apache.commons.ssl.org.bouncycastle.asn1.ASN1Sequence; 008import org.apache.commons.ssl.org.bouncycastle.asn1.DEROctetString; 009import org.apache.commons.ssl.org.bouncycastle.asn1.DERSequence; 010import org.apache.commons.ssl.org.bouncycastle.asn1.nist.NISTObjectIdentifiers; 011import org.apache.commons.ssl.org.bouncycastle.asn1.x509.AlgorithmIdentifier; 012import org.apache.commons.ssl.org.bouncycastle.asn1.x509.IssuerSerial; 013 014public class ESSCertIDv2 015 extends ASN1Object 016{ 017 private AlgorithmIdentifier hashAlgorithm; 018 private byte[] certHash; 019 private IssuerSerial issuerSerial; 020 private static final AlgorithmIdentifier DEFAULT_ALG_ID = new AlgorithmIdentifier(NISTObjectIdentifiers.id_sha256); 021 022 public static ESSCertIDv2 getInstance( 023 Object o) 024 { 025 if (o instanceof ESSCertIDv2) 026 { 027 return (ESSCertIDv2) o; 028 } 029 else if (o != null) 030 { 031 return new ESSCertIDv2(ASN1Sequence.getInstance(o)); 032 } 033 034 return null; 035 } 036 037 private ESSCertIDv2( 038 ASN1Sequence seq) 039 { 040 if (seq.size() > 3) 041 { 042 throw new IllegalArgumentException("Bad sequence size: " + seq.size()); 043 } 044 045 int count = 0; 046 047 if (seq.getObjectAt(0) instanceof ASN1OctetString) 048 { 049 // Default value 050 this.hashAlgorithm = DEFAULT_ALG_ID; 051 } 052 else 053 { 054 this.hashAlgorithm = AlgorithmIdentifier.getInstance(seq.getObjectAt(count++).toASN1Primitive()); 055 } 056 057 this.certHash = ASN1OctetString.getInstance(seq.getObjectAt(count++).toASN1Primitive()).getOctets(); 058 059 if (seq.size() > count) 060 { 061 this.issuerSerial = IssuerSerial.getInstance(seq.getObjectAt(count)); 062 } 063 } 064 065 public ESSCertIDv2( 066 byte[] certHash) 067 { 068 this(null, certHash, null); 069 } 070 071 public ESSCertIDv2( 072 AlgorithmIdentifier algId, 073 byte[] certHash) 074 { 075 this(algId, certHash, null); 076 } 077 078 public ESSCertIDv2( 079 byte[] certHash, 080 IssuerSerial issuerSerial) 081 { 082 this(null, certHash, issuerSerial); 083 } 084 085 public ESSCertIDv2( 086 AlgorithmIdentifier algId, 087 byte[] certHash, 088 IssuerSerial issuerSerial) 089 { 090 if (algId == null) 091 { 092 // Default value 093 this.hashAlgorithm = DEFAULT_ALG_ID; 094 } 095 else 096 { 097 this.hashAlgorithm = algId; 098 } 099 100 this.certHash = certHash; 101 this.issuerSerial = issuerSerial; 102 } 103 104 public AlgorithmIdentifier getHashAlgorithm() 105 { 106 return this.hashAlgorithm; 107 } 108 109 public byte[] getCertHash() 110 { 111 return certHash; 112 } 113 114 public IssuerSerial getIssuerSerial() 115 { 116 return issuerSerial; 117 } 118 119 /** 120 * <pre> 121 * ESSCertIDv2 ::= SEQUENCE { 122 * hashAlgorithm AlgorithmIdentifier 123 * DEFAULT {algorithm id-sha256}, 124 * certHash Hash, 125 * issuerSerial IssuerSerial OPTIONAL 126 * } 127 * 128 * Hash ::= OCTET STRING 129 * 130 * IssuerSerial ::= SEQUENCE { 131 * issuer GeneralNames, 132 * serialNumber CertificateSerialNumber 133 * } 134 * </pre> 135 */ 136 public ASN1Primitive toASN1Primitive() 137 { 138 ASN1EncodableVector v = new ASN1EncodableVector(); 139 140 if (!hashAlgorithm.equals(DEFAULT_ALG_ID)) 141 { 142 v.add(hashAlgorithm); 143 } 144 145 v.add(new DEROctetString(certHash).toASN1Primitive()); 146 147 if (issuerSerial != null) 148 { 149 v.add(issuerSerial); 150 } 151 152 return new DERSequence(v); 153 } 154 155}