1package org.bouncycastle.asn1.ocsp;
2
3import org.bouncycastle.asn1.ASN1Choice;
4import org.bouncycastle.asn1.ASN1OctetString;
5import org.bouncycastle.asn1.ASN1TaggedObject;
6import org.bouncycastle.asn1.ASN1Encodable;
7import org.bouncycastle.asn1.DEREncodable;
8import org.bouncycastle.asn1.DERObject;
9import org.bouncycastle.asn1.DEROctetString;
10import org.bouncycastle.asn1.DERTaggedObject;
11import org.bouncycastle.asn1.x509.X509Name;
12
13public class ResponderID
14    extends ASN1Encodable
15    implements ASN1Choice
16{
17    private DEREncodable    value;
18
19    public ResponderID(
20        ASN1OctetString    value)
21    {
22        this.value = value;
23    }
24
25    public ResponderID(
26        X509Name    value)
27    {
28        this.value = value;
29    }
30
31    public static ResponderID getInstance(
32        Object  obj)
33    {
34        if (obj == null || 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(X509Name.getInstance(o, true));
49            }
50            else
51            {
52                return new ResponderID(ASN1OctetString.getInstance(o, true));
53            }
54        }
55
56        return new ResponderID(X509Name.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    /**
67     * Produce an object suitable for an ASN1OutputStream.
68     * <pre>
69     * ResponderID ::= CHOICE {
70     *      byName          [1] Name,
71     *      byKey           [2] KeyHash }
72     * </pre>
73     */
74    public DERObject toASN1Object()
75    {
76        if (value instanceof ASN1OctetString)
77        {
78            return new DERTaggedObject(true, 2, value);
79        }
80
81        return new DERTaggedObject(true, 1, value);
82    }
83}
84