1package org.bouncycastle.asn1.ocsp;
2
3import org.bouncycastle.asn1.ASN1EncodableVector;
4import org.bouncycastle.asn1.ASN1GeneralizedTime;
5import org.bouncycastle.asn1.ASN1Object;
6import org.bouncycastle.asn1.ASN1Primitive;
7import org.bouncycastle.asn1.ASN1Sequence;
8import org.bouncycastle.asn1.ASN1TaggedObject;
9import org.bouncycastle.asn1.DERSequence;
10import org.bouncycastle.asn1.DERTaggedObject;
11import org.bouncycastle.asn1.x509.Extensions;
12import org.bouncycastle.asn1.x509.X509Extensions;
13
14public class SingleResponse
15    extends ASN1Object
16{
17    private CertID              certID;
18    private CertStatus          certStatus;
19    private ASN1GeneralizedTime  thisUpdate;
20    private ASN1GeneralizedTime  nextUpdate;
21    private Extensions      singleExtensions;
22
23    /**
24     * @deprecated use method taking ASN1GeneralizedTime and Extensions
25     * @param certID
26     * @param certStatus
27     * @param thisUpdate
28     * @param nextUpdate
29     * @param singleExtensions
30     */
31    public SingleResponse(
32        CertID              certID,
33        CertStatus          certStatus,
34        ASN1GeneralizedTime thisUpdate,
35        ASN1GeneralizedTime nextUpdate,
36        X509Extensions singleExtensions)
37    {
38        this(certID, certStatus, thisUpdate, nextUpdate, Extensions.getInstance(singleExtensions));
39    }
40
41    public SingleResponse(
42        CertID              certID,
43        CertStatus          certStatus,
44        ASN1GeneralizedTime thisUpdate,
45        ASN1GeneralizedTime nextUpdate,
46        Extensions          singleExtensions)
47    {
48        this.certID = certID;
49        this.certStatus = certStatus;
50        this.thisUpdate = thisUpdate;
51        this.nextUpdate = nextUpdate;
52        this.singleExtensions = singleExtensions;
53    }
54
55    private SingleResponse(
56        ASN1Sequence    seq)
57    {
58        this.certID = CertID.getInstance(seq.getObjectAt(0));
59        this.certStatus = CertStatus.getInstance(seq.getObjectAt(1));
60        this.thisUpdate = ASN1GeneralizedTime.getInstance(seq.getObjectAt(2));
61
62        if (seq.size() > 4)
63        {
64            this.nextUpdate = ASN1GeneralizedTime.getInstance(
65                                (ASN1TaggedObject)seq.getObjectAt(3), true);
66            this.singleExtensions = Extensions.getInstance(
67                                (ASN1TaggedObject)seq.getObjectAt(4), true);
68        }
69        else if (seq.size() > 3)
70        {
71            ASN1TaggedObject    o = (ASN1TaggedObject)seq.getObjectAt(3);
72
73            if (o.getTagNo() == 0)
74            {
75                this.nextUpdate = ASN1GeneralizedTime.getInstance(o, true);
76            }
77            else
78            {
79                this.singleExtensions = Extensions.getInstance(o, true);
80            }
81        }
82    }
83
84    public static SingleResponse getInstance(
85        ASN1TaggedObject obj,
86        boolean          explicit)
87    {
88        return getInstance(ASN1Sequence.getInstance(obj, explicit));
89    }
90
91    public static SingleResponse getInstance(
92        Object  obj)
93    {
94        if (obj instanceof SingleResponse)
95        {
96            return (SingleResponse)obj;
97        }
98        else if (obj != null)
99        {
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}
163