1package org.bouncycastle.asn1.x509;
2
3import org.bouncycastle.asn1.ASN1Encodable;
4import org.bouncycastle.asn1.ASN1EncodableVector;
5import org.bouncycastle.asn1.ASN1Object;
6import org.bouncycastle.asn1.ASN1ObjectIdentifier;
7import org.bouncycastle.asn1.ASN1Primitive;
8import org.bouncycastle.asn1.ASN1Sequence;
9import org.bouncycastle.asn1.ASN1TaggedObject;
10import org.bouncycastle.asn1.DERNull;
11import org.bouncycastle.asn1.DERObjectIdentifier;
12import org.bouncycastle.asn1.DERSequence;
13
14public class AlgorithmIdentifier
15    extends ASN1Object
16{
17    private ASN1ObjectIdentifier objectId;
18    private ASN1Encodable       parameters;
19    private boolean             parametersDefined = false;
20
21    public static AlgorithmIdentifier getInstance(
22        ASN1TaggedObject obj,
23        boolean          explicit)
24    {
25        return getInstance(ASN1Sequence.getInstance(obj, explicit));
26    }
27
28    public static AlgorithmIdentifier getInstance(
29        Object  obj)
30    {
31        if (obj== null || obj instanceof AlgorithmIdentifier)
32        {
33            return (AlgorithmIdentifier)obj;
34        }
35
36        // TODO: delete
37        if (obj instanceof ASN1ObjectIdentifier)
38        {
39            return new AlgorithmIdentifier((ASN1ObjectIdentifier)obj);
40        }
41
42        // TODO: delete
43        if (obj instanceof String)
44        {
45            return new AlgorithmIdentifier((String)obj);
46        }
47
48        return new AlgorithmIdentifier(ASN1Sequence.getInstance(obj));
49    }
50
51    public AlgorithmIdentifier(
52        ASN1ObjectIdentifier     objectId)
53    {
54        this.objectId = objectId;
55    }
56
57    /**
58     * @deprecated use ASN1ObjectIdentifier
59     * @param objectId
60     */
61    public AlgorithmIdentifier(
62        String     objectId)
63    {
64        this.objectId = new ASN1ObjectIdentifier(objectId);
65    }
66
67    /**
68     * @deprecated use ASN1ObjectIdentifier
69     * @param objectId
70     */
71    public AlgorithmIdentifier(
72        DERObjectIdentifier    objectId)
73    {
74        this.objectId = new ASN1ObjectIdentifier(objectId.getId());
75    }
76
77    /**
78     * @deprecated use ASN1ObjectIdentifier
79     * @param objectId
80     * @param parameters
81     */
82    public AlgorithmIdentifier(
83        DERObjectIdentifier objectId,
84        ASN1Encodable           parameters)
85    {
86        parametersDefined = true;
87        this.objectId = new ASN1ObjectIdentifier(objectId.getId());
88        this.parameters = parameters;
89    }
90
91    public AlgorithmIdentifier(
92        ASN1ObjectIdentifier     objectId,
93        ASN1Encodable           parameters)
94    {
95        parametersDefined = true;
96        this.objectId = objectId;
97        this.parameters = parameters;
98    }
99
100    /**
101     * @deprecated use AlgorithmIdentifier.getInstance()
102     * @param seq
103     */
104    public AlgorithmIdentifier(
105        ASN1Sequence   seq)
106    {
107        if (seq.size() < 1 || seq.size() > 2)
108        {
109            throw new IllegalArgumentException("Bad sequence size: "
110                    + seq.size());
111        }
112
113        objectId = ASN1ObjectIdentifier.getInstance(seq.getObjectAt(0));
114
115        if (seq.size() == 2)
116        {
117            parametersDefined = true;
118            parameters = seq.getObjectAt(1);
119        }
120        else
121        {
122            parameters = null;
123        }
124    }
125
126    public ASN1ObjectIdentifier getAlgorithm()
127    {
128        return new ASN1ObjectIdentifier(objectId.getId());
129    }
130
131    /**
132     * @deprecated use getAlgorithm
133     * @return
134     */
135    public ASN1ObjectIdentifier getObjectId()
136    {
137        return objectId;
138    }
139
140    public ASN1Encodable getParameters()
141    {
142        return parameters;
143    }
144
145    /**
146     * Produce an object suitable for an ASN1OutputStream.
147     * <pre>
148     *      AlgorithmIdentifier ::= SEQUENCE {
149     *                            algorithm OBJECT IDENTIFIER,
150     *                            parameters ANY DEFINED BY algorithm OPTIONAL }
151     * </pre>
152     */
153    public ASN1Primitive toASN1Primitive()
154    {
155        ASN1EncodableVector  v = new ASN1EncodableVector();
156
157        v.add(objectId);
158
159        if (parametersDefined)
160        {
161            if (parameters != null)
162            {
163                v.add(parameters);
164            }
165            else
166            {
167                v.add(DERNull.INSTANCE);
168            }
169        }
170
171        return new DERSequence(v);
172    }
173}
174