001package org.apache.commons.ssl.org.bouncycastle.asn1.cmp; 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.ASN1Primitive; 007import org.apache.commons.ssl.org.bouncycastle.asn1.ASN1Sequence; 008import org.apache.commons.ssl.org.bouncycastle.asn1.ASN1TaggedObject; 009import org.apache.commons.ssl.org.bouncycastle.asn1.DERBitString; 010import org.apache.commons.ssl.org.bouncycastle.asn1.DERSequence; 011import org.apache.commons.ssl.org.bouncycastle.asn1.DERTaggedObject; 012import org.apache.commons.ssl.org.bouncycastle.asn1.crmf.CertId; 013import org.apache.commons.ssl.org.bouncycastle.asn1.x509.AlgorithmIdentifier; 014 015public class OOBCertHash 016 extends ASN1Object 017{ 018 private AlgorithmIdentifier hashAlg; 019 private CertId certId; 020 private DERBitString hashVal; 021 022 private OOBCertHash(ASN1Sequence seq) 023 { 024 int index = seq.size() - 1; 025 026 hashVal = DERBitString.getInstance(seq.getObjectAt(index--)); 027 028 for (int i = index; i >= 0; i--) 029 { 030 ASN1TaggedObject tObj = (ASN1TaggedObject)seq.getObjectAt(i); 031 032 if (tObj.getTagNo() == 0) 033 { 034 hashAlg = AlgorithmIdentifier.getInstance(tObj, true); 035 } 036 else 037 { 038 certId = CertId.getInstance(tObj, true); 039 } 040 } 041 042 } 043 044 public static OOBCertHash getInstance(Object o) 045 { 046 if (o instanceof OOBCertHash) 047 { 048 return (OOBCertHash)o; 049 } 050 051 if (o != null) 052 { 053 return new OOBCertHash(ASN1Sequence.getInstance(o)); 054 } 055 056 return null; 057 } 058 059 public OOBCertHash(AlgorithmIdentifier hashAlg, CertId certId, byte[] hashVal) 060 { 061 this(hashAlg, certId, new DERBitString(hashVal)); 062 } 063 064 public OOBCertHash(AlgorithmIdentifier hashAlg, CertId certId, DERBitString hashVal) 065 { 066 this.hashAlg = hashAlg; 067 this.certId = certId; 068 this.hashVal = hashVal; 069 } 070 071 public AlgorithmIdentifier getHashAlg() 072 { 073 return hashAlg; 074 } 075 076 public CertId getCertId() 077 { 078 return certId; 079 } 080 081 public DERBitString getHashVal() 082 { 083 return hashVal; 084 } 085 086 /** 087 * <pre> 088 * OOBCertHash ::= SEQUENCE { 089 * hashAlg [0] AlgorithmIdentifier OPTIONAL, 090 * certId [1] CertId OPTIONAL, 091 * hashVal BIT STRING 092 * -- hashVal is calculated over the DER encoding of the 093 * -- self-signed certificate with the identifier certID. 094 * } 095 * </pre> 096 * @return a basic ASN.1 object representation. 097 */ 098 public ASN1Primitive toASN1Primitive() 099 { 100 ASN1EncodableVector v = new ASN1EncodableVector(); 101 102 addOptional(v, 0, hashAlg); 103 addOptional(v, 1, certId); 104 105 v.add(hashVal); 106 107 return new DERSequence(v); 108 } 109 110 private void addOptional(ASN1EncodableVector v, int tagNo, ASN1Encodable obj) 111 { 112 if (obj != null) 113 { 114 v.add(new DERTaggedObject(true, tagNo, obj)); 115 } 116 } 117}