001package org.apache.commons.ssl.org.bouncycastle.asn1.ocsp;
002
003import org.apache.commons.ssl.org.bouncycastle.asn1.ASN1EncodableVector;
004import org.apache.commons.ssl.org.bouncycastle.asn1.ASN1Integer;
005import org.apache.commons.ssl.org.bouncycastle.asn1.ASN1Object;
006import org.apache.commons.ssl.org.bouncycastle.asn1.ASN1Primitive;
007import org.apache.commons.ssl.org.bouncycastle.asn1.ASN1Sequence;
008import org.apache.commons.ssl.org.bouncycastle.asn1.ASN1TaggedObject;
009import org.apache.commons.ssl.org.bouncycastle.asn1.DERSequence;
010import org.apache.commons.ssl.org.bouncycastle.asn1.DERTaggedObject;
011import org.apache.commons.ssl.org.bouncycastle.asn1.x509.Extensions;
012import org.apache.commons.ssl.org.bouncycastle.asn1.x509.GeneralName;
013import org.apache.commons.ssl.org.bouncycastle.asn1.x509.X509Extensions;
014
015public class TBSRequest
016    extends ASN1Object
017{
018    private static final ASN1Integer V1 = new ASN1Integer(0);
019    
020    ASN1Integer      version;
021    GeneralName     requestorName;
022    ASN1Sequence    requestList;
023    Extensions  requestExtensions;
024
025    boolean         versionSet;
026
027    /**
028     * @deprecated use method taking Extensions
029     * @param requestorName
030     * @param requestList
031     * @param requestExtensions
032     */
033    public TBSRequest(
034        GeneralName     requestorName,
035        ASN1Sequence    requestList,
036        X509Extensions requestExtensions)
037    {
038        this.version = V1;
039        this.requestorName = requestorName;
040        this.requestList = requestList;
041        this.requestExtensions = Extensions.getInstance(requestExtensions);
042    }
043
044    public TBSRequest(
045        GeneralName     requestorName,
046        ASN1Sequence    requestList,
047        Extensions  requestExtensions)
048    {
049        this.version = V1;
050        this.requestorName = requestorName;
051        this.requestList = requestList;
052        this.requestExtensions = requestExtensions;
053    }
054
055    private TBSRequest(
056        ASN1Sequence    seq)
057    {
058        int    index = 0;
059
060        if (seq.getObjectAt(0) instanceof ASN1TaggedObject)
061        {
062            ASN1TaggedObject    o = (ASN1TaggedObject)seq.getObjectAt(0);
063
064            if (o.getTagNo() == 0)
065            {
066                versionSet = true;
067                version = ASN1Integer.getInstance((ASN1TaggedObject)seq.getObjectAt(0), true);
068                index++;
069            }
070            else
071            {
072                version = V1;
073            }
074        }
075        else
076        {
077            version = V1;
078        }
079
080        if (seq.getObjectAt(index) instanceof ASN1TaggedObject)
081        {
082            requestorName = GeneralName.getInstance((ASN1TaggedObject)seq.getObjectAt(index++), true);
083        }
084        
085        requestList = (ASN1Sequence)seq.getObjectAt(index++);
086
087        if (seq.size() == (index + 1))
088        {
089            requestExtensions = Extensions.getInstance((ASN1TaggedObject)seq.getObjectAt(index), true);
090        }
091    }
092
093    public static TBSRequest getInstance(
094        ASN1TaggedObject obj,
095        boolean          explicit)
096    {
097        return getInstance(ASN1Sequence.getInstance(obj, explicit));
098    }
099
100    public static TBSRequest getInstance(
101        Object  obj)
102    {
103        if (obj instanceof TBSRequest)
104        {
105            return (TBSRequest)obj;
106        }
107        else if (obj != null)
108        {
109            return new TBSRequest(ASN1Sequence.getInstance(obj));
110        }
111
112        return null;
113    }
114
115    public ASN1Integer getVersion()
116    {
117        return version;
118    }
119
120    public GeneralName getRequestorName()
121    {
122        return requestorName;
123    }
124
125    public ASN1Sequence getRequestList()
126    {
127        return requestList;
128    }
129
130    public Extensions getRequestExtensions()
131    {
132        return requestExtensions;
133    }
134
135    /**
136     * Produce an object suitable for an ASN1OutputStream.
137     * <pre>
138     * TBSRequest      ::=     SEQUENCE {
139     *     version             [0]     EXPLICIT Version DEFAULT v1,
140     *     requestorName       [1]     EXPLICIT GeneralName OPTIONAL,
141     *     requestList                 SEQUENCE OF Request,
142     *     requestExtensions   [2]     EXPLICIT Extensions OPTIONAL }
143     * </pre>
144     */
145    public ASN1Primitive toASN1Primitive()
146    {
147        ASN1EncodableVector    v = new ASN1EncodableVector();
148
149        //
150        // if default don't include - unless explicitly provided. Not strictly correct
151        // but required for some requests
152        //
153        if (!version.equals(V1) || versionSet)
154        {
155            v.add(new DERTaggedObject(true, 0, version));
156        }
157        
158        if (requestorName != null)
159        {
160            v.add(new DERTaggedObject(true, 1, requestorName));
161        }
162
163        v.add(requestList);
164
165        if (requestExtensions != null)
166        {
167            v.add(new DERTaggedObject(true, 2, requestExtensions));
168        }
169
170        return new DERSequence(v);
171    }
172}