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.DERBitString;
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.AlgorithmIdentifier;
012
013public class BasicOCSPResponse
014    extends ASN1Object
015{
016    private ResponseData        tbsResponseData;
017    private AlgorithmIdentifier signatureAlgorithm;
018    private DERBitString        signature;
019    private ASN1Sequence        certs;
020
021    public BasicOCSPResponse(
022        ResponseData        tbsResponseData,
023        AlgorithmIdentifier signatureAlgorithm,
024        DERBitString        signature,
025        ASN1Sequence        certs)
026    {
027        this.tbsResponseData = tbsResponseData;
028        this.signatureAlgorithm = signatureAlgorithm;
029        this.signature = signature;
030        this.certs = certs;
031    }
032
033    private BasicOCSPResponse(
034        ASN1Sequence    seq)
035    {
036        this.tbsResponseData = ResponseData.getInstance(seq.getObjectAt(0));
037        this.signatureAlgorithm = AlgorithmIdentifier.getInstance(seq.getObjectAt(1));
038        this.signature = (DERBitString)seq.getObjectAt(2);
039
040        if (seq.size() > 3)
041        {
042            this.certs = ASN1Sequence.getInstance((ASN1TaggedObject)seq.getObjectAt(3), true);
043        }
044    }
045
046    public static BasicOCSPResponse getInstance(
047        ASN1TaggedObject obj,
048        boolean          explicit)
049    {
050        return getInstance(ASN1Sequence.getInstance(obj, explicit));
051    }
052
053    public static BasicOCSPResponse getInstance(
054        Object  obj)
055    {
056        if (obj instanceof BasicOCSPResponse)
057        {
058            return (BasicOCSPResponse)obj;
059        }
060        else if (obj != null)
061        {
062            return new BasicOCSPResponse(ASN1Sequence.getInstance(obj));
063        }
064
065        return null;
066    }
067
068    public ResponseData getTbsResponseData()
069    {
070        return tbsResponseData;
071    }
072
073    public AlgorithmIdentifier getSignatureAlgorithm()
074    {
075        return signatureAlgorithm;
076    }
077
078    public DERBitString getSignature()
079    {
080        return signature;
081    }
082
083    public ASN1Sequence getCerts()
084    {
085        return certs;
086    }
087
088    /**
089     * Produce an object suitable for an ASN1OutputStream.
090     * <pre>
091     * BasicOCSPResponse       ::= SEQUENCE {
092     *      tbsResponseData      ResponseData,
093     *      signatureAlgorithm   AlgorithmIdentifier,
094     *      signature            BIT STRING,
095     *      certs                [0] EXPLICIT SEQUENCE OF Certificate OPTIONAL }
096     * </pre>
097     */
098    public ASN1Primitive toASN1Primitive()
099    {
100        ASN1EncodableVector v = new ASN1EncodableVector();
101
102        v.add(tbsResponseData);
103        v.add(signatureAlgorithm);
104        v.add(signature);
105        if (certs != null)
106        {
107            v.add(new DERTaggedObject(true, 0, certs));
108        }
109
110        return new DERSequence(v);
111    }
112}