1package org.bouncycastle.asn1.ocsp;
2
3import org.bouncycastle.asn1.ASN1EncodableVector;
4import org.bouncycastle.asn1.ASN1Object;
5import org.bouncycastle.asn1.ASN1Primitive;
6import org.bouncycastle.asn1.ASN1Sequence;
7import org.bouncycastle.asn1.ASN1TaggedObject;
8import org.bouncycastle.asn1.DERSequence;
9import org.bouncycastle.asn1.DERTaggedObject;
10
11public class OCSPRequest
12    extends ASN1Object
13{
14    TBSRequest      tbsRequest;
15    Signature       optionalSignature;
16
17    public OCSPRequest(
18        TBSRequest  tbsRequest,
19        Signature   optionalSignature)
20    {
21        this.tbsRequest = tbsRequest;
22        this.optionalSignature = optionalSignature;
23    }
24
25    private OCSPRequest(
26        ASN1Sequence    seq)
27    {
28        tbsRequest = TBSRequest.getInstance(seq.getObjectAt(0));
29
30        if (seq.size() == 2)
31        {
32            optionalSignature = Signature.getInstance(
33                                (ASN1TaggedObject)seq.getObjectAt(1), true);
34        }
35    }
36
37    public static OCSPRequest getInstance(
38        ASN1TaggedObject obj,
39        boolean          explicit)
40    {
41        return getInstance(ASN1Sequence.getInstance(obj, explicit));
42    }
43
44    public static OCSPRequest getInstance(
45        Object  obj)
46    {
47        if (obj instanceof OCSPRequest)
48        {
49            return (OCSPRequest)obj;
50        }
51        else if (obj != null)
52        {
53            return new OCSPRequest(ASN1Sequence.getInstance(obj));
54        }
55
56        return null;
57    }
58
59    public TBSRequest getTbsRequest()
60    {
61        return tbsRequest;
62    }
63
64    public Signature getOptionalSignature()
65    {
66        return optionalSignature;
67    }
68
69    /**
70     * Produce an object suitable for an ASN1OutputStream.
71     * <pre>
72     * OCSPRequest     ::=     SEQUENCE {
73     *     tbsRequest                  TBSRequest,
74     *     optionalSignature   [0]     EXPLICIT Signature OPTIONAL }
75     * </pre>
76     */
77    public ASN1Primitive toASN1Primitive()
78    {
79        ASN1EncodableVector    v = new ASN1EncodableVector();
80
81        v.add(tbsRequest);
82
83        if (optionalSignature != null)
84        {
85            v.add(new DERTaggedObject(true, 0, optionalSignature));
86        }
87
88        return new DERSequence(v);
89    }
90}
91