1package org.bouncycastle.asn1.ocsp;
2
3import org.bouncycastle.asn1.ASN1EncodableVector;
4import org.bouncycastle.asn1.ASN1Sequence;
5import org.bouncycastle.asn1.ASN1TaggedObject;
6import org.bouncycastle.asn1.ASN1Encodable;
7import org.bouncycastle.asn1.DERInteger;
8import org.bouncycastle.asn1.DERObject;
9import org.bouncycastle.asn1.DERSequence;
10import org.bouncycastle.asn1.DERTaggedObject;
11import org.bouncycastle.asn1.x509.GeneralName;
12import org.bouncycastle.asn1.x509.X509Extensions;
13
14public class TBSRequest
15    extends ASN1Encodable
16{
17    private static final DERInteger V1 = new DERInteger(0);
18
19    DERInteger      version;
20    GeneralName     requestorName;
21    ASN1Sequence    requestList;
22    X509Extensions  requestExtensions;
23
24    public TBSRequest(
25        GeneralName     requestorName,
26        ASN1Sequence    requestList,
27        X509Extensions  requestExtensions)
28    {
29        this.version = V1;
30        this.requestorName = requestorName;
31        this.requestList = requestList;
32        this.requestExtensions = requestExtensions;
33    }
34
35    public TBSRequest(
36        ASN1Sequence    seq)
37    {
38        int    index = 0;
39
40        if (seq.getObjectAt(0) instanceof ASN1TaggedObject)
41        {
42            ASN1TaggedObject    o = (ASN1TaggedObject)seq.getObjectAt(0);
43
44            if (o.getTagNo() == 0)
45            {
46                version = DERInteger.getInstance((ASN1TaggedObject)seq.getObjectAt(0), true);
47                index++;
48            }
49            else
50            {
51                version = V1;
52            }
53        }
54        else
55        {
56            version = V1;
57        }
58
59        if (seq.getObjectAt(index) instanceof ASN1TaggedObject)
60        {
61            requestorName = GeneralName.getInstance((ASN1TaggedObject)seq.getObjectAt(index++), true);
62        }
63
64        requestList = (ASN1Sequence)seq.getObjectAt(index++);
65
66        if (seq.size() == (index + 1))
67        {
68            requestExtensions = X509Extensions.getInstance((ASN1TaggedObject)seq.getObjectAt(index), true);
69        }
70    }
71
72    public static TBSRequest getInstance(
73        ASN1TaggedObject obj,
74        boolean          explicit)
75    {
76        return getInstance(ASN1Sequence.getInstance(obj, explicit));
77    }
78
79    public static TBSRequest getInstance(
80        Object  obj)
81    {
82        if (obj == null || obj instanceof TBSRequest)
83        {
84            return (TBSRequest)obj;
85        }
86        else if (obj instanceof ASN1Sequence)
87        {
88            return new TBSRequest((ASN1Sequence)obj);
89        }
90
91        throw new IllegalArgumentException("unknown object in factory");
92    }
93
94    public DERInteger getVersion()
95    {
96        return version;
97    }
98
99    public GeneralName getRequestorName()
100    {
101        return requestorName;
102    }
103
104    public ASN1Sequence getRequestList()
105    {
106        return requestList;
107    }
108
109    public X509Extensions getRequestExtensions()
110    {
111        return requestExtensions;
112    }
113
114    /**
115     * Produce an object suitable for an ASN1OutputStream.
116     * <pre>
117     * TBSRequest      ::=     SEQUENCE {
118     *     version             [0]     EXPLICIT Version DEFAULT v1,
119     *     requestorName       [1]     EXPLICIT GeneralName OPTIONAL,
120     *     requestList                 SEQUENCE OF Request,
121     *     requestExtensions   [2]     EXPLICIT Extensions OPTIONAL }
122     * </pre>
123     */
124    public DERObject toASN1Object()
125    {
126        ASN1EncodableVector    v = new ASN1EncodableVector();
127
128        //
129        // if default don't include.
130        //
131        if (!version.equals(V1))
132        {
133            v.add(new DERTaggedObject(true, 0, version));
134        }
135
136        if (requestorName != null)
137        {
138            v.add(new DERTaggedObject(true, 1, requestorName));
139        }
140
141        v.add(requestList);
142
143        if (requestExtensions != null)
144        {
145            v.add(new DERTaggedObject(true, 2, requestExtensions));
146        }
147
148        return new DERSequence(v);
149    }
150}
151