001package org.apache.commons.ssl.org.bouncycastle.asn1.esf;
002
003import java.util.Enumeration;
004
005import org.apache.commons.ssl.org.bouncycastle.asn1.ASN1EncodableVector;
006import org.apache.commons.ssl.org.bouncycastle.asn1.ASN1Object;
007import org.apache.commons.ssl.org.bouncycastle.asn1.ASN1Primitive;
008import org.apache.commons.ssl.org.bouncycastle.asn1.ASN1Sequence;
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.ocsp.BasicOCSPResponse;
012import org.apache.commons.ssl.org.bouncycastle.asn1.x509.CertificateList;
013
014/**
015 * <pre>
016 * RevocationValues ::= SEQUENCE {
017 *    crlVals [0] SEQUENCE OF CertificateList OPTIONAL,
018 *    ocspVals [1] SEQUENCE OF BasicOCSPResponse OPTIONAL,
019 *    otherRevVals [2] OtherRevVals OPTIONAL}
020 * </pre>
021 */
022public class RevocationValues
023    extends ASN1Object
024{
025
026    private ASN1Sequence crlVals;
027    private ASN1Sequence ocspVals;
028    private OtherRevVals otherRevVals;
029
030    public static RevocationValues getInstance(Object obj)
031    {
032        if (obj instanceof RevocationValues)
033        {
034            return (RevocationValues)obj;
035        }
036        else if (obj != null)
037        {
038            return new RevocationValues(ASN1Sequence.getInstance(obj));
039        }
040
041        return null;
042    }
043
044    private RevocationValues(ASN1Sequence seq)
045    {
046        if (seq.size() > 3)
047        {
048            throw new IllegalArgumentException("Bad sequence size: "
049                + seq.size());
050        }
051        Enumeration e = seq.getObjects();
052        while (e.hasMoreElements())
053        {
054            DERTaggedObject o = (DERTaggedObject)e.nextElement();
055            switch (o.getTagNo())
056            {
057                case 0:
058                    ASN1Sequence crlValsSeq = (ASN1Sequence)o.getObject();
059                    Enumeration crlValsEnum = crlValsSeq.getObjects();
060                    while (crlValsEnum.hasMoreElements())
061                    {
062                        CertificateList.getInstance(crlValsEnum.nextElement());
063                    }
064                    this.crlVals = crlValsSeq;
065                    break;
066                case 1:
067                    ASN1Sequence ocspValsSeq = (ASN1Sequence)o.getObject();
068                    Enumeration ocspValsEnum = ocspValsSeq.getObjects();
069                    while (ocspValsEnum.hasMoreElements())
070                    {
071                        BasicOCSPResponse.getInstance(ocspValsEnum.nextElement());
072                    }
073                    this.ocspVals = ocspValsSeq;
074                    break;
075                case 2:
076                    this.otherRevVals = OtherRevVals.getInstance(o.getObject());
077                    break;
078                default:
079                    throw new IllegalArgumentException("invalid tag: "
080                        + o.getTagNo());
081            }
082        }
083    }
084
085    public RevocationValues(CertificateList[] crlVals,
086                            BasicOCSPResponse[] ocspVals, OtherRevVals otherRevVals)
087    {
088        if (null != crlVals)
089        {
090            this.crlVals = new DERSequence(crlVals);
091        }
092        if (null != ocspVals)
093        {
094            this.ocspVals = new DERSequence(ocspVals);
095        }
096        this.otherRevVals = otherRevVals;
097    }
098
099    public CertificateList[] getCrlVals()
100    {
101        if (null == this.crlVals)
102        {
103            return new CertificateList[0];
104        }
105        CertificateList[] result = new CertificateList[this.crlVals.size()];
106        for (int idx = 0; idx < result.length; idx++)
107        {
108            result[idx] = CertificateList.getInstance(this.crlVals
109                .getObjectAt(idx));
110        }
111        return result;
112    }
113
114    public BasicOCSPResponse[] getOcspVals()
115    {
116        if (null == this.ocspVals)
117        {
118            return new BasicOCSPResponse[0];
119        }
120        BasicOCSPResponse[] result = new BasicOCSPResponse[this.ocspVals.size()];
121        for (int idx = 0; idx < result.length; idx++)
122        {
123            result[idx] = BasicOCSPResponse.getInstance(this.ocspVals
124                .getObjectAt(idx));
125        }
126        return result;
127    }
128
129    public OtherRevVals getOtherRevVals()
130    {
131        return this.otherRevVals;
132    }
133
134    public ASN1Primitive toASN1Primitive()
135    {
136        ASN1EncodableVector v = new ASN1EncodableVector();
137        if (null != this.crlVals)
138        {
139            v.add(new DERTaggedObject(true, 0, this.crlVals));
140        }
141        if (null != this.ocspVals)
142        {
143            v.add(new DERTaggedObject(true, 1, this.ocspVals));
144        }
145        if (null != this.otherRevVals)
146        {
147            v.add(new DERTaggedObject(true, 2, this.otherRevVals.toASN1Primitive()));
148        }
149        return new DERSequence(v);
150    }
151}