001package org.apache.commons.ssl.org.bouncycastle.asn1.dvcs;
002
003import org.apache.commons.ssl.org.bouncycastle.asn1.ASN1Choice;
004import org.apache.commons.ssl.org.bouncycastle.asn1.ASN1Encodable;
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.DERTaggedObject;
010import org.apache.commons.ssl.org.bouncycastle.asn1.cmp.PKIStatusInfo;
011import org.apache.commons.ssl.org.bouncycastle.asn1.cms.ContentInfo;
012import org.apache.commons.ssl.org.bouncycastle.asn1.ess.ESSCertID;
013import org.apache.commons.ssl.org.bouncycastle.asn1.ocsp.CertID;
014import org.apache.commons.ssl.org.bouncycastle.asn1.ocsp.CertStatus;
015import org.apache.commons.ssl.org.bouncycastle.asn1.ocsp.OCSPResponse;
016import org.apache.commons.ssl.org.bouncycastle.asn1.smime.SMIMECapabilities;
017import org.apache.commons.ssl.org.bouncycastle.asn1.x509.Certificate;
018import org.apache.commons.ssl.org.bouncycastle.asn1.x509.CertificateList;
019import org.apache.commons.ssl.org.bouncycastle.asn1.x509.Extension;
020
021/**
022 * <pre>
023 * CertEtcToken ::= CHOICE {
024 *         certificate                  [0] IMPLICIT Certificate ,
025 *         esscertid                    [1] ESSCertId ,
026 *         pkistatus                    [2] IMPLICIT PKIStatusInfo ,
027 *         assertion                    [3] ContentInfo ,
028 *         crl                          [4] IMPLICIT CertificateList,
029 *         ocspcertstatus               [5] CertStatus,
030 *         oscpcertid                   [6] IMPLICIT CertId ,
031 *         oscpresponse                 [7] IMPLICIT OCSPResponse,
032 *         capabilities                 [8] SMIMECapabilities,
033 *         extension                    Extension
034 * }
035 * </pre>
036 */
037public class CertEtcToken
038    extends ASN1Object
039    implements ASN1Choice
040{
041    public static final int TAG_CERTIFICATE = 0;
042    public static final int TAG_ESSCERTID = 1;
043    public static final int TAG_PKISTATUS = 2;
044    public static final int TAG_ASSERTION = 3;
045    public static final int TAG_CRL = 4;
046    public static final int TAG_OCSPCERTSTATUS = 5;
047    public static final int TAG_OCSPCERTID = 6;
048    public static final int TAG_OCSPRESPONSE = 7;
049    public static final int TAG_CAPABILITIES = 8;
050
051    private static final boolean[] explicit = new boolean[]
052        {
053            false, true, false, true, false, true, false, false, true
054        };
055
056    private int tagNo;
057    private ASN1Encodable value;
058    private Extension extension;
059
060    public CertEtcToken(int tagNo, ASN1Encodable value)
061    {
062        this.tagNo = tagNo;
063        this.value = value;
064    }
065
066    public CertEtcToken(Extension extension)
067    {
068        this.tagNo = -1;
069        this.extension = extension;
070    }
071
072    private CertEtcToken(ASN1TaggedObject choice)
073    {
074        this.tagNo = choice.getTagNo();
075
076        switch (tagNo)
077        {
078        case TAG_CERTIFICATE:
079            value = Certificate.getInstance(choice, false);
080            break;
081        case TAG_ESSCERTID:
082            value = ESSCertID.getInstance(choice.getObject());
083            break;
084        case TAG_PKISTATUS:
085            value = PKIStatusInfo.getInstance(choice, false);
086            break;
087        case TAG_ASSERTION:
088            value = ContentInfo.getInstance(choice.getObject());
089            break;
090        case TAG_CRL:
091            value = CertificateList.getInstance(choice, false);
092            break;
093        case TAG_OCSPCERTSTATUS:
094            value = CertStatus.getInstance(choice.getObject());
095            break;
096        case TAG_OCSPCERTID:
097            value = CertID.getInstance(choice, false);
098            break;
099        case TAG_OCSPRESPONSE:
100            value = OCSPResponse.getInstance(choice, false);
101            break;
102        case TAG_CAPABILITIES:
103            value = SMIMECapabilities.getInstance(choice.getObject());
104            break;
105        default:
106            throw new IllegalArgumentException("Unknown tag: " + tagNo);
107        }
108    }
109
110    public static CertEtcToken getInstance(Object obj)
111    {
112        if (obj instanceof CertEtcToken)
113        {
114            return (CertEtcToken)obj;
115        }
116        else if (obj instanceof ASN1TaggedObject)
117        {
118            return new CertEtcToken((ASN1TaggedObject)obj);
119        }
120        else if (obj != null)
121        {
122            return new CertEtcToken(Extension.getInstance(obj));
123        }
124
125        return null;
126    }
127
128    public ASN1Primitive toASN1Primitive()
129    {
130        if (extension == null)
131        {
132            return new DERTaggedObject(explicit[tagNo], tagNo, value);
133        }
134        else
135        {
136            return extension.toASN1Primitive();
137        }
138    }
139
140    public int getTagNo()
141    {
142        return tagNo;
143    }
144
145    public ASN1Encodable getValue()
146    {
147        return value;
148    }
149
150    public Extension getExtension()
151    {
152        return extension;
153    }
154
155    public String toString()
156    {
157        return "CertEtcToken {\n" + value + "}\n";
158    }
159
160    public static CertEtcToken[] arrayFromSequence(ASN1Sequence seq)
161    {
162        CertEtcToken[] tmp = new CertEtcToken[seq.size()];
163
164        for (int i = 0; i != tmp.length; i++)
165        {
166            tmp[i] = CertEtcToken.getInstance(seq.getObjectAt(i));
167        }
168
169        return tmp;
170    }
171}