1package org.bouncycastle.asn1.x509;
2
3import org.bouncycastle.asn1.ASN1Choice;
4import org.bouncycastle.asn1.ASN1Encodable;
5import org.bouncycastle.asn1.ASN1Sequence;
6import org.bouncycastle.asn1.ASN1TaggedObject;
7import org.bouncycastle.asn1.DERObject;
8import org.bouncycastle.asn1.DERTaggedObject;
9
10public class AttCertIssuer
11    extends ASN1Encodable
12    implements ASN1Choice
13{
14    ASN1Encodable   obj;
15    DERObject       choiceObj;
16
17    public static AttCertIssuer getInstance(
18        Object  obj)
19    {
20        if (obj instanceof AttCertIssuer)
21        {
22            return (AttCertIssuer)obj;
23        }
24        else if (obj instanceof V2Form)
25        {
26            return new AttCertIssuer(V2Form.getInstance(obj));
27        }
28        else if (obj instanceof GeneralNames)
29        {
30            return new AttCertIssuer((GeneralNames)obj);
31        }
32        else if (obj instanceof ASN1TaggedObject)
33        {
34            return new AttCertIssuer(V2Form.getInstance((ASN1TaggedObject)obj, false));
35        }
36        else if (obj instanceof ASN1Sequence)
37        {
38            return new AttCertIssuer(GeneralNames.getInstance(obj));
39        }
40
41        throw new IllegalArgumentException("unknown object in factory: " + obj.getClass().getName());
42    }
43
44    public static AttCertIssuer getInstance(
45        ASN1TaggedObject obj,
46        boolean          explicit)
47    {
48        return getInstance(obj.getObject()); // must be explicitly tagged
49    }
50
51    /**
52     * Don't use this one if you are trying to be RFC 3281 compliant.
53     * Use it for v1 attribute certificates only.
54     *
55     * @param names our GeneralNames structure
56     */
57    public AttCertIssuer(
58        GeneralNames  names)
59    {
60        obj = names;
61        choiceObj = obj.getDERObject();
62    }
63
64    public AttCertIssuer(
65        V2Form  v2Form)
66    {
67        obj = v2Form;
68        choiceObj = new DERTaggedObject(false, 0, obj);
69    }
70
71    public ASN1Encodable getIssuer()
72    {
73        return obj;
74    }
75
76    /**
77     * Produce an object suitable for an ASN1OutputStream.
78     * <pre>
79     *  AttCertIssuer ::= CHOICE {
80     *       v1Form   GeneralNames,  -- MUST NOT be used in this
81     *                               -- profile
82     *       v2Form   [0] V2Form     -- v2 only
83     *  }
84     * </pre>
85     */
86    public DERObject toASN1Object()
87    {
88        return choiceObj;
89    }
90}
91