1package org.bouncycastle.asn1.ocsp;
2
3import org.bouncycastle.asn1.ASN1Choice;
4import org.bouncycastle.asn1.ASN1Encodable;
5import org.bouncycastle.asn1.ASN1Object;
6import org.bouncycastle.asn1.ASN1OctetString;
7import org.bouncycastle.asn1.ASN1Primitive;
8import org.bouncycastle.asn1.ASN1TaggedObject;
9import org.bouncycastle.asn1.DEROctetString;
10import org.bouncycastle.asn1.DERTaggedObject;
11import org.bouncycastle.asn1.x500.X500Name;
12
13public class ResponderID
14    extends ASN1Object
15    implements ASN1Choice
16{
17    private ASN1Encodable    value;
18
19    public ResponderID(
20        ASN1OctetString    value)
21    {
22        this.value = value;
23    }
24
25    public ResponderID(
26        X500Name value)
27    {
28        this.value = value;
29    }
30
31    public static ResponderID getInstance(
32        Object  obj)
33    {
34        if (obj instanceof ResponderID)
35        {
36            return (ResponderID)obj;
37        }
38        else if (obj instanceof DEROctetString)
39        {
40            return new ResponderID((DEROctetString)obj);
41        }
42        else if (obj instanceof ASN1TaggedObject)
43        {
44            ASN1TaggedObject    o = (ASN1TaggedObject)obj;
45
46            if (o.getTagNo() == 1)
47            {
48                return new ResponderID(X500Name.getInstance(o, true));
49            }
50            else
51            {
52                return new ResponderID(ASN1OctetString.getInstance(o, true));
53            }
54        }
55
56        return new ResponderID(X500Name.getInstance(obj));
57    }
58
59    public static ResponderID getInstance(
60        ASN1TaggedObject obj,
61        boolean          explicit)
62    {
63        return getInstance(obj.getObject()); // must be explicitly tagged
64    }
65
66    public byte[] getKeyHash()
67    {
68        if (this.value instanceof ASN1OctetString)
69        {
70            ASN1OctetString octetString = (ASN1OctetString)this.value;
71            return octetString.getOctets();
72        }
73
74        return null;
75    }
76
77    public X500Name getName()
78    {
79        if (this.value instanceof ASN1OctetString)
80        {
81            return null;
82        }
83
84        return X500Name.getInstance(value);
85    }
86
87    /**
88     * Produce an object suitable for an ASN1OutputStream.
89     * <pre>
90     * ResponderID ::= CHOICE {
91     *      byName          [1] Name,
92     *      byKey           [2] KeyHash }
93     * </pre>
94     */
95    public ASN1Primitive toASN1Primitive()
96    {
97        if (value instanceof ASN1OctetString)
98        {
99            return new DERTaggedObject(true, 2, value);
100        }
101
102        return new DERTaggedObject(true, 1, value);
103    }
104}
105