001package org.apache.commons.ssl.org.bouncycastle.asn1.ess; 002 003import org.apache.commons.ssl.org.bouncycastle.asn1.ASN1Encodable; 004import org.apache.commons.ssl.org.bouncycastle.asn1.ASN1EncodableVector; 005import org.apache.commons.ssl.org.bouncycastle.asn1.ASN1Object; 006import org.apache.commons.ssl.org.bouncycastle.asn1.ASN1OctetString; 007import org.apache.commons.ssl.org.bouncycastle.asn1.ASN1Primitive; 008import org.apache.commons.ssl.org.bouncycastle.asn1.ASN1Sequence; 009import org.apache.commons.ssl.org.bouncycastle.asn1.DERSequence; 010import org.apache.commons.ssl.org.bouncycastle.asn1.x509.AlgorithmIdentifier; 011import org.apache.commons.ssl.org.bouncycastle.asn1.x509.DigestInfo; 012import org.apache.commons.ssl.org.bouncycastle.asn1.x509.IssuerSerial; 013 014public class OtherCertID 015 extends ASN1Object 016{ 017 private ASN1Encodable otherCertHash; 018 private IssuerSerial issuerSerial; 019 020 public static OtherCertID getInstance(Object o) 021 { 022 if (o instanceof OtherCertID) 023 { 024 return (OtherCertID) o; 025 } 026 else if (o != null) 027 { 028 return new OtherCertID(ASN1Sequence.getInstance(o)); 029 } 030 031 return null; 032 } 033 034 /** 035 * constructor 036 */ 037 private OtherCertID(ASN1Sequence seq) 038 { 039 if (seq.size() < 1 || seq.size() > 2) 040 { 041 throw new IllegalArgumentException("Bad sequence size: " 042 + seq.size()); 043 } 044 045 if (seq.getObjectAt(0).toASN1Primitive() instanceof ASN1OctetString) 046 { 047 otherCertHash = ASN1OctetString.getInstance(seq.getObjectAt(0)); 048 } 049 else 050 { 051 otherCertHash = DigestInfo.getInstance(seq.getObjectAt(0)); 052 053 } 054 055 if (seq.size() > 1) 056 { 057 issuerSerial = IssuerSerial.getInstance(seq.getObjectAt(1)); 058 } 059 } 060 061 public OtherCertID( 062 AlgorithmIdentifier algId, 063 byte[] digest) 064 { 065 this.otherCertHash = new DigestInfo(algId, digest); 066 } 067 068 public OtherCertID( 069 AlgorithmIdentifier algId, 070 byte[] digest, 071 IssuerSerial issuerSerial) 072 { 073 this.otherCertHash = new DigestInfo(algId, digest); 074 this.issuerSerial = issuerSerial; 075 } 076 077 public AlgorithmIdentifier getAlgorithmHash() 078 { 079 if (otherCertHash.toASN1Primitive() instanceof ASN1OctetString) 080 { 081 // SHA-1 082 return new AlgorithmIdentifier("1.3.14.3.2.26"); 083 } 084 else 085 { 086 return DigestInfo.getInstance(otherCertHash).getAlgorithmId(); 087 } 088 } 089 090 public byte[] getCertHash() 091 { 092 if (otherCertHash.toASN1Primitive() instanceof ASN1OctetString) 093 { 094 // SHA-1 095 return ((ASN1OctetString)otherCertHash.toASN1Primitive()).getOctets(); 096 } 097 else 098 { 099 return DigestInfo.getInstance(otherCertHash).getDigest(); 100 } 101 } 102 103 public IssuerSerial getIssuerSerial() 104 { 105 return issuerSerial; 106 } 107 108 /** 109 * <pre> 110 * OtherCertID ::= SEQUENCE { 111 * otherCertHash OtherHash, 112 * issuerSerial IssuerSerial OPTIONAL } 113 * 114 * OtherHash ::= CHOICE { 115 * sha1Hash OCTET STRING, 116 * otherHash OtherHashAlgAndValue } 117 * 118 * OtherHashAlgAndValue ::= SEQUENCE { 119 * hashAlgorithm AlgorithmIdentifier, 120 * hashValue OCTET STRING } 121 * 122 * </pre> 123 */ 124 public ASN1Primitive toASN1Primitive() 125 { 126 ASN1EncodableVector v = new ASN1EncodableVector(); 127 128 v.add(otherCertHash); 129 130 if (issuerSerial != null) 131 { 132 v.add(issuerSerial); 133 } 134 135 return new DERSequence(v); 136 } 137}