1package org.bouncycastle.asn1.x509;
2
3import org.bouncycastle.asn1.ASN1Encodable;
4import org.bouncycastle.asn1.ASN1EncodableVector;
5import org.bouncycastle.asn1.ASN1Sequence;
6import org.bouncycastle.asn1.ASN1TaggedObject;
7import org.bouncycastle.asn1.DERObject;
8import org.bouncycastle.asn1.DERSequence;
9import org.bouncycastle.asn1.DERTaggedObject;
10
11public class V2Form
12    extends ASN1Encodable
13{
14    GeneralNames        issuerName;
15    IssuerSerial        baseCertificateID;
16    ObjectDigestInfo    objectDigestInfo;
17
18    public static V2Form getInstance(
19        ASN1TaggedObject obj,
20        boolean          explicit)
21    {
22        return getInstance(ASN1Sequence.getInstance(obj, explicit));
23    }
24
25    public static V2Form getInstance(
26        Object  obj)
27    {
28        if (obj == null || obj instanceof V2Form)
29        {
30            return (V2Form)obj;
31        }
32        else if (obj instanceof ASN1Sequence)
33        {
34            return new V2Form((ASN1Sequence)obj);
35        }
36
37        throw new IllegalArgumentException("unknown object in factory");
38    }
39
40    public V2Form(
41        GeneralNames    issuerName)
42    {
43        this.issuerName = issuerName;
44    }
45
46    public V2Form(
47        ASN1Sequence seq)
48    {
49        if (seq.size() > 3)
50        {
51            throw new IllegalArgumentException("Bad sequence size: " + seq.size());
52        }
53
54        int    index = 0;
55
56        if (!(seq.getObjectAt(0) instanceof ASN1TaggedObject))
57        {
58            index++;
59            this.issuerName = GeneralNames.getInstance(seq.getObjectAt(0));
60        }
61
62        for (int i = index; i != seq.size(); i++)
63        {
64            ASN1TaggedObject o = ASN1TaggedObject.getInstance(seq.getObjectAt(i));
65            if (o.getTagNo() == 0)
66            {
67                baseCertificateID = IssuerSerial.getInstance(o, false);
68            }
69            else if (o.getTagNo() == 1)
70            {
71                objectDigestInfo = ObjectDigestInfo.getInstance(o, false);
72            }
73            else
74            {
75                throw new IllegalArgumentException("Bad tag number: "
76                        + o.getTagNo());
77            }
78        }
79    }
80
81    public GeneralNames getIssuerName()
82    {
83        return issuerName;
84    }
85
86    public IssuerSerial getBaseCertificateID()
87    {
88        return baseCertificateID;
89    }
90
91    public ObjectDigestInfo getObjectDigestInfo()
92    {
93        return objectDigestInfo;
94    }
95
96    /**
97     * Produce an object suitable for an ASN1OutputStream.
98     * <pre>
99     *  V2Form ::= SEQUENCE {
100     *       issuerName            GeneralNames  OPTIONAL,
101     *       baseCertificateID     [0] IssuerSerial  OPTIONAL,
102     *       objectDigestInfo      [1] ObjectDigestInfo  OPTIONAL
103     *         -- issuerName MUST be present in this profile
104     *         -- baseCertificateID and objectDigestInfo MUST NOT
105     *         -- be present in this profile
106     *  }
107     * </pre>
108     */
109    public DERObject toASN1Object()
110    {
111        ASN1EncodableVector  v = new ASN1EncodableVector();
112
113        if (issuerName != null)
114        {
115            v.add(issuerName);
116        }
117
118        if (baseCertificateID != null)
119        {
120            v.add(new DERTaggedObject(false, 0, baseCertificateID));
121        }
122
123        if (objectDigestInfo != null)
124        {
125            v.add(new DERTaggedObject(false, 1, objectDigestInfo));
126        }
127
128        return new DERSequence(v);
129    }
130}
131