1package org.bouncycastle.asn1.ocsp;
2
3import org.bouncycastle.asn1.ASN1EncodableVector;
4import org.bouncycastle.asn1.ASN1Enumerated;
5import org.bouncycastle.asn1.ASN1GeneralizedTime;
6import org.bouncycastle.asn1.ASN1Object;
7import org.bouncycastle.asn1.ASN1Primitive;
8import org.bouncycastle.asn1.ASN1Sequence;
9import org.bouncycastle.asn1.ASN1TaggedObject;
10import org.bouncycastle.asn1.DERSequence;
11import org.bouncycastle.asn1.DERTaggedObject;
12import org.bouncycastle.asn1.x509.CRLReason;
13
14public class RevokedInfo
15    extends ASN1Object
16{
17    private ASN1GeneralizedTime  revocationTime;
18    private CRLReason           revocationReason;
19
20    public RevokedInfo(
21        ASN1GeneralizedTime  revocationTime,
22        CRLReason           revocationReason)
23    {
24        this.revocationTime = revocationTime;
25        this.revocationReason = revocationReason;
26    }
27
28    private RevokedInfo(
29        ASN1Sequence    seq)
30    {
31        this.revocationTime = ASN1GeneralizedTime.getInstance(seq.getObjectAt(0));
32
33        if (seq.size() > 1)
34        {
35            this.revocationReason = CRLReason.getInstance(ASN1Enumerated.getInstance(
36                (ASN1TaggedObject)seq.getObjectAt(1), true));
37        }
38    }
39
40    public static RevokedInfo getInstance(
41        ASN1TaggedObject obj,
42        boolean          explicit)
43    {
44        return getInstance(ASN1Sequence.getInstance(obj, explicit));
45    }
46
47    public static RevokedInfo getInstance(
48        Object  obj)
49    {
50        if (obj instanceof RevokedInfo)
51        {
52            return (RevokedInfo)obj;
53        }
54        else if (obj != null)
55        {
56            return new RevokedInfo(ASN1Sequence.getInstance(obj));
57        }
58
59        return null;
60    }
61
62    public ASN1GeneralizedTime getRevocationTime()
63    {
64        return revocationTime;
65    }
66
67    public CRLReason getRevocationReason()
68    {
69        return revocationReason;
70    }
71
72    /**
73     * Produce an object suitable for an ASN1OutputStream.
74     * <pre>
75     * RevokedInfo ::= SEQUENCE {
76     *      revocationTime              GeneralizedTime,
77     *      revocationReason    [0]     EXPLICIT CRLReason OPTIONAL }
78     * </pre>
79     */
80    public ASN1Primitive toASN1Primitive()
81    {
82        ASN1EncodableVector v = new ASN1EncodableVector();
83
84        v.add(revocationTime);
85        if (revocationReason != null)
86        {
87            v.add(new DERTaggedObject(true, 0, revocationReason));
88        }
89
90        return new DERSequence(v);
91    }
92}
93