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.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.X509Extensions;
013
014public class SingleResponse
015    extends ASN1Object
016{
017    private CertID              certID;
018    private CertStatus          certStatus;
019    private ASN1GeneralizedTime  thisUpdate;
020    private ASN1GeneralizedTime  nextUpdate;
021    private Extensions      singleExtensions;
022
023    /**
024     * @deprecated use method taking ASN1GeneralizedTime and Extensions
025     * @param certID
026     * @param certStatus
027     * @param thisUpdate
028     * @param nextUpdate
029     * @param singleExtensions
030     */
031    public SingleResponse(
032        CertID              certID,
033        CertStatus          certStatus,
034        ASN1GeneralizedTime thisUpdate,
035        ASN1GeneralizedTime nextUpdate,
036        X509Extensions singleExtensions)
037    {
038        this(certID, certStatus, thisUpdate, nextUpdate, Extensions.getInstance(singleExtensions));
039    }
040
041    public SingleResponse(
042        CertID              certID,
043        CertStatus          certStatus,
044        ASN1GeneralizedTime thisUpdate,
045        ASN1GeneralizedTime nextUpdate,
046        Extensions          singleExtensions)
047    {
048        this.certID = certID;
049        this.certStatus = certStatus;
050        this.thisUpdate = thisUpdate;
051        this.nextUpdate = nextUpdate;
052        this.singleExtensions = singleExtensions;
053    }
054
055    private SingleResponse(
056        ASN1Sequence    seq)
057    {
058        this.certID = CertID.getInstance(seq.getObjectAt(0));
059        this.certStatus = CertStatus.getInstance(seq.getObjectAt(1));
060        this.thisUpdate = ASN1GeneralizedTime.getInstance(seq.getObjectAt(2));
061
062        if (seq.size() > 4)
063        {
064            this.nextUpdate = ASN1GeneralizedTime.getInstance(
065                                (ASN1TaggedObject)seq.getObjectAt(3), true);
066            this.singleExtensions = Extensions.getInstance(
067                                (ASN1TaggedObject)seq.getObjectAt(4), true);
068        }
069        else if (seq.size() > 3)
070        {
071            ASN1TaggedObject    o = (ASN1TaggedObject)seq.getObjectAt(3);
072
073            if (o.getTagNo() == 0)
074            {
075                this.nextUpdate = ASN1GeneralizedTime.getInstance(o, true);
076            }
077            else
078            {
079                this.singleExtensions = Extensions.getInstance(o, true);
080            }
081        }
082    }
083
084    public static SingleResponse getInstance(
085        ASN1TaggedObject obj,
086        boolean          explicit)
087    {
088        return getInstance(ASN1Sequence.getInstance(obj, explicit));
089    }
090
091    public static SingleResponse getInstance(
092        Object  obj)
093    {
094        if (obj instanceof SingleResponse)
095        {
096            return (SingleResponse)obj;
097        }
098        else if (obj != null)
099        {
100            return new SingleResponse(ASN1Sequence.getInstance(obj));
101        }
102
103        return null;
104    }
105
106    public CertID getCertID()
107    {
108        return certID;
109    }
110
111    public CertStatus getCertStatus()
112    {
113        return certStatus;
114    }
115
116    public ASN1GeneralizedTime getThisUpdate()
117    {
118        return thisUpdate;
119    }
120
121    public ASN1GeneralizedTime getNextUpdate()
122    {
123        return nextUpdate;
124    }
125
126    public Extensions getSingleExtensions()
127    {
128        return singleExtensions;
129    }
130
131    /**
132     * Produce an object suitable for an ASN1OutputStream.
133     * <pre>
134     *  SingleResponse ::= SEQUENCE {
135     *          certID                       CertID,
136     *          certStatus                   CertStatus,
137     *          thisUpdate                   GeneralizedTime,
138     *          nextUpdate         [0]       EXPLICIT GeneralizedTime OPTIONAL,
139     *          singleExtensions   [1]       EXPLICIT Extensions OPTIONAL }
140     * </pre>
141     */
142    public ASN1Primitive toASN1Primitive()
143    {
144        ASN1EncodableVector v = new ASN1EncodableVector();
145
146        v.add(certID);
147        v.add(certStatus);
148        v.add(thisUpdate);
149
150        if (nextUpdate != null)
151        {
152            v.add(new DERTaggedObject(true, 0, nextUpdate));
153        }
154
155        if (singleExtensions != null)
156        {
157            v.add(new DERTaggedObject(true, 1, singleExtensions));
158        }
159
160        return new DERSequence(v);
161    }
162}