001package org.apache.commons.ssl.org.bouncycastle.asn1.ocsp;
002
003import org.apache.commons.ssl.org.bouncycastle.asn1.ASN1Choice;
004import org.apache.commons.ssl.org.bouncycastle.asn1.ASN1Encodable;
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.ASN1TaggedObject;
009import org.apache.commons.ssl.org.bouncycastle.asn1.DEROctetString;
010import org.apache.commons.ssl.org.bouncycastle.asn1.DERTaggedObject;
011import org.apache.commons.ssl.org.bouncycastle.asn1.x500.X500Name;
012
013public class ResponderID
014    extends ASN1Object
015    implements ASN1Choice
016{
017    private ASN1Encodable    value;
018
019    public ResponderID(
020        ASN1OctetString    value)
021    {
022        this.value = value;
023    }
024
025    public ResponderID(
026        X500Name value)
027    {
028        this.value = value;
029    }
030
031    public static ResponderID getInstance(
032        Object  obj)
033    {
034        if (obj instanceof ResponderID)
035        {
036            return (ResponderID)obj;
037        }
038        else if (obj instanceof DEROctetString)
039        {
040            return new ResponderID((DEROctetString)obj);
041        }
042        else if (obj instanceof ASN1TaggedObject)
043        {
044            ASN1TaggedObject    o = (ASN1TaggedObject)obj;
045
046            if (o.getTagNo() == 1)
047            {
048                return new ResponderID(X500Name.getInstance(o, true));
049            }
050            else
051            {
052                return new ResponderID(ASN1OctetString.getInstance(o, true));
053            }
054        }
055
056        return new ResponderID(X500Name.getInstance(obj));
057    }
058
059    public static ResponderID getInstance(
060        ASN1TaggedObject obj,
061        boolean          explicit)
062    {
063        return getInstance(obj.getObject()); // must be explicitly tagged
064    }
065
066    public byte[] getKeyHash()
067    {
068        if (this.value instanceof ASN1OctetString)
069        {
070            ASN1OctetString octetString = (ASN1OctetString)this.value;
071            return octetString.getOctets();
072        }
073
074        return null;
075    }
076
077    public X500Name getName()
078    {
079        if (this.value instanceof ASN1OctetString)
080        {
081            return null;
082        }
083
084        return X500Name.getInstance(value);
085    }
086
087    /**
088     * Produce an object suitable for an ASN1OutputStream.
089     * <pre>
090     * ResponderID ::= CHOICE {
091     *      byName          [1] Name,
092     *      byKey           [2] KeyHash }
093     * </pre>
094     */
095    public ASN1Primitive toASN1Primitive()
096    {
097        if (value instanceof ASN1OctetString)
098        {
099            return new DERTaggedObject(true, 2, value);
100        }
101
102        return new DERTaggedObject(true, 1, value);
103    }
104}