001package org.apache.commons.ssl.org.bouncycastle.asn1.x509;
002
003import org.apache.commons.ssl.org.bouncycastle.asn1.ASN1EncodableVector;
004import org.apache.commons.ssl.org.bouncycastle.asn1.ASN1Object;
005import org.apache.commons.ssl.org.bouncycastle.asn1.ASN1Primitive;
006import org.apache.commons.ssl.org.bouncycastle.asn1.ASN1Sequence;
007import org.apache.commons.ssl.org.bouncycastle.asn1.ASN1TaggedObject;
008import org.apache.commons.ssl.org.bouncycastle.asn1.DERSequence;
009import org.apache.commons.ssl.org.bouncycastle.asn1.DERTaggedObject;
010
011public class V2Form
012    extends ASN1Object
013{
014    GeneralNames        issuerName;
015    IssuerSerial        baseCertificateID;
016    ObjectDigestInfo    objectDigestInfo;
017
018    public static V2Form getInstance(
019        ASN1TaggedObject obj,
020        boolean          explicit)
021    {
022        return getInstance(ASN1Sequence.getInstance(obj, explicit));
023    }
024
025    public static V2Form getInstance(
026        Object  obj)
027    {
028        if (obj instanceof V2Form)
029        {
030            return (V2Form)obj;
031        }
032        else if (obj != null)
033        {
034            return new V2Form(ASN1Sequence.getInstance(obj));
035        }
036
037        return null;
038    }
039    
040    public V2Form(
041        GeneralNames    issuerName)
042    {
043        this(issuerName, null, null);
044    }
045
046    public V2Form(
047        GeneralNames    issuerName,
048        IssuerSerial    baseCertificateID)
049    {
050        this(issuerName, baseCertificateID, null);
051    }
052
053    public V2Form(
054        GeneralNames    issuerName,
055        ObjectDigestInfo objectDigestInfo)
056    {
057        this(issuerName, null, objectDigestInfo);
058    }
059
060    public V2Form(
061        GeneralNames    issuerName,
062        IssuerSerial    baseCertificateID,
063        ObjectDigestInfo objectDigestInfo)
064    {
065        this.issuerName = issuerName;
066        this.baseCertificateID = baseCertificateID;
067        this.objectDigestInfo = objectDigestInfo;
068    }
069
070    /**
071     * @deprecated use getInstance().
072     */
073    public V2Form(
074        ASN1Sequence seq)
075    {
076        if (seq.size() > 3)
077        {
078            throw new IllegalArgumentException("Bad sequence size: " + seq.size());
079        }
080        
081        int    index = 0;
082
083        if (!(seq.getObjectAt(0) instanceof ASN1TaggedObject))
084        {
085            index++;
086            this.issuerName = GeneralNames.getInstance(seq.getObjectAt(0));
087        }
088
089        for (int i = index; i != seq.size(); i++)
090        {
091            ASN1TaggedObject o = ASN1TaggedObject.getInstance(seq.getObjectAt(i));
092            if (o.getTagNo() == 0)
093            {
094                baseCertificateID = IssuerSerial.getInstance(o, false);
095            }
096            else if (o.getTagNo() == 1)
097            {
098                objectDigestInfo = ObjectDigestInfo.getInstance(o, false);
099            }
100            else 
101            {
102                throw new IllegalArgumentException("Bad tag number: "
103                        + o.getTagNo());
104            }
105        }
106    }
107    
108    public GeneralNames getIssuerName()
109    {
110        return issuerName;
111    }
112
113    public IssuerSerial getBaseCertificateID()
114    {
115        return baseCertificateID;
116    }
117
118    public ObjectDigestInfo getObjectDigestInfo()
119    {
120        return objectDigestInfo;
121    }
122
123    /**
124     * Produce an object suitable for an ASN1OutputStream.
125     * <pre>
126     *  V2Form ::= SEQUENCE {
127     *       issuerName            GeneralNames  OPTIONAL,
128     *       baseCertificateID     [0] IssuerSerial  OPTIONAL,
129     *       objectDigestInfo      [1] ObjectDigestInfo  OPTIONAL
130     *         -- issuerName MUST be present in this profile
131     *         -- baseCertificateID and objectDigestInfo MUST NOT
132     *         -- be present in this profile
133     *  }
134     * </pre>
135     */
136    public ASN1Primitive toASN1Primitive()
137    {
138        ASN1EncodableVector  v = new ASN1EncodableVector();
139
140        if (issuerName != null)
141        {
142            v.add(issuerName);
143        }
144
145        if (baseCertificateID != null)
146        {
147            v.add(new DERTaggedObject(false, 0, baseCertificateID));
148        }
149
150        if (objectDigestInfo != null)
151        {
152            v.add(new DERTaggedObject(false, 1, objectDigestInfo));
153        }
154
155        return new DERSequence(v);
156    }
157}