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