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}