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.ASN1Object;
005import org.apache.commons.ssl.org.bouncycastle.asn1.ASN1Primitive;
006import org.apache.commons.ssl.org.bouncycastle.asn1.ASN1Sequence;
007import org.apache.commons.ssl.org.bouncycastle.asn1.ASN1TaggedObject;
008import org.apache.commons.ssl.org.bouncycastle.asn1.DERSequence;
009import org.apache.commons.ssl.org.bouncycastle.asn1.DERTaggedObject;
010
011public class OCSPRequest
012    extends ASN1Object
013{
014    TBSRequest      tbsRequest;
015    Signature       optionalSignature;
016
017    public OCSPRequest(
018        TBSRequest  tbsRequest,
019        Signature   optionalSignature)
020    {
021        this.tbsRequest = tbsRequest;
022        this.optionalSignature = optionalSignature;
023    }
024
025    private OCSPRequest(
026        ASN1Sequence    seq)
027    {
028        tbsRequest = TBSRequest.getInstance(seq.getObjectAt(0));
029
030        if (seq.size() == 2)
031        {
032            optionalSignature = Signature.getInstance(
033                                (ASN1TaggedObject)seq.getObjectAt(1), true);
034        }
035    }
036    
037    public static OCSPRequest getInstance(
038        ASN1TaggedObject obj,
039        boolean          explicit)
040    {
041        return getInstance(ASN1Sequence.getInstance(obj, explicit));
042    }
043
044    public static OCSPRequest getInstance(
045        Object  obj)
046    {
047        if (obj instanceof OCSPRequest)
048        {
049            return (OCSPRequest)obj;
050        }
051        else if (obj != null)
052        {
053            return new OCSPRequest(ASN1Sequence.getInstance(obj));
054        }
055
056        return null;
057    }
058    
059    public TBSRequest getTbsRequest()
060    {
061        return tbsRequest;
062    }
063
064    public Signature getOptionalSignature()
065    {
066        return optionalSignature;
067    }
068
069    /**
070     * Produce an object suitable for an ASN1OutputStream.
071     * <pre>
072     * OCSPRequest     ::=     SEQUENCE {
073     *     tbsRequest                  TBSRequest,
074     *     optionalSignature   [0]     EXPLICIT Signature OPTIONAL }
075     * </pre>
076     */
077    public ASN1Primitive toASN1Primitive()
078    {
079        ASN1EncodableVector    v = new ASN1EncodableVector();
080
081        v.add(tbsRequest);
082
083        if (optionalSignature != null)
084        {
085            v.add(new DERTaggedObject(true, 0, optionalSignature));
086        }
087
088        return new DERSequence(v);
089    }
090}