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}