1package org.bouncycastle.asn1.ocsp;
2
3import org.bouncycastle.asn1.ASN1Choice;
4import org.bouncycastle.asn1.ASN1Encodable;
5import org.bouncycastle.asn1.ASN1Object;
6import org.bouncycastle.asn1.ASN1Primitive;
7import org.bouncycastle.asn1.ASN1TaggedObject;
8import org.bouncycastle.asn1.DERNull;
9import org.bouncycastle.asn1.DERTaggedObject;
10
11public class CertStatus
12    extends ASN1Object
13    implements ASN1Choice
14{
15    private int             tagNo;
16    private ASN1Encodable   value;
17
18    /**
19     * create a CertStatus object with a tag of zero.
20     */
21    public CertStatus()
22    {
23        tagNo = 0;
24        value = DERNull.INSTANCE;
25    }
26
27    public CertStatus(
28        RevokedInfo info)
29    {
30        tagNo = 1;
31        value = info;
32    }
33
34    public CertStatus(
35        int tagNo,
36        ASN1Encodable    value)
37    {
38        this.tagNo = tagNo;
39        this.value = value;
40    }
41
42    private CertStatus(
43        ASN1TaggedObject    choice)
44    {
45        this.tagNo = choice.getTagNo();
46
47        switch (choice.getTagNo())
48        {
49        case 0:
50            value = DERNull.INSTANCE;
51            break;
52        case 1:
53            value = RevokedInfo.getInstance(choice, false);
54            break;
55        case 2:
56            value = DERNull.INSTANCE;
57            break;
58        default:
59            throw new IllegalArgumentException("Unknown tag encountered: " + choice.getTagNo());
60        }
61    }
62
63    public static CertStatus getInstance(
64        Object  obj)
65    {
66        if (obj == null || obj instanceof CertStatus)
67        {
68            return (CertStatus)obj;
69        }
70        else if (obj instanceof ASN1TaggedObject)
71        {
72            return new CertStatus((ASN1TaggedObject)obj);
73        }
74
75        throw new IllegalArgumentException("unknown object in factory: " + obj.getClass().getName());
76    }
77
78    public static CertStatus getInstance(
79        ASN1TaggedObject obj,
80        boolean          explicit)
81    {
82        return getInstance(obj.getObject()); // must be explicitly tagged
83    }
84
85    public int getTagNo()
86    {
87        return tagNo;
88    }
89
90    public ASN1Encodable getStatus()
91    {
92        return value;
93    }
94
95    /**
96     * Produce an object suitable for an ASN1OutputStream.
97     * <pre>
98     *  CertStatus ::= CHOICE {
99     *                  good        [0]     IMPLICIT NULL,
100     *                  revoked     [1]     IMPLICIT RevokedInfo,
101     *                  unknown     [2]     IMPLICIT UnknownInfo }
102     * </pre>
103     */
104    public ASN1Primitive toASN1Primitive()
105    {
106        return new DERTaggedObject(false, tagNo, value);
107    }
108}
109