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}