AlgorithmIdentifier.java revision e6bf3e8dfa2804891a82075cb469b736321b4827
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.ASN1SequenceParser;
10import org.bouncycastle.asn1.ASN1TaggedObject;
11import org.bouncycastle.asn1.DERNull;
12import org.bouncycastle.asn1.DERObjectIdentifier;
13import org.bouncycastle.asn1.DERSequence;
14
15public class AlgorithmIdentifier
16    extends ASN1Object
17{
18    private ASN1ObjectIdentifier objectId;
19    private ASN1Encodable       parameters;
20    private boolean             parametersDefined = false;
21
22    public static AlgorithmIdentifier getInstance(
23        ASN1TaggedObject obj,
24        boolean          explicit)
25    {
26        return getInstance(ASN1Sequence.getInstance(obj, explicit));
27    }
28
29    public static AlgorithmIdentifier getInstance(
30        Object  obj)
31    {
32        if (obj== null || obj instanceof AlgorithmIdentifier)
33        {
34            return (AlgorithmIdentifier)obj;
35        }
36
37        if (obj instanceof ASN1ObjectIdentifier)
38        {
39            return new AlgorithmIdentifier((ASN1ObjectIdentifier)obj);
40        }
41
42        if (obj instanceof String)
43        {
44            return new AlgorithmIdentifier((String)obj);
45        }
46
47        if (obj instanceof ASN1Sequence || obj instanceof ASN1SequenceParser)
48        {
49            return new AlgorithmIdentifier(ASN1Sequence.getInstance(obj));
50        }
51
52        throw new IllegalArgumentException("unknown object in factory: " + obj.getClass().getName());
53    }
54
55    public AlgorithmIdentifier(
56        ASN1ObjectIdentifier     objectId)
57    {
58        this.objectId = objectId;
59    }
60
61    /**
62     * @deprecated use ASN1ObjectIdentifier
63     * @param objectId
64     */
65    public AlgorithmIdentifier(
66        String     objectId)
67    {
68        this.objectId = new ASN1ObjectIdentifier(objectId);
69    }
70
71    /**
72     * @deprecated use ASN1ObjectIdentifier
73     * @param objectId
74     */
75    public AlgorithmIdentifier(
76        DERObjectIdentifier    objectId)
77    {
78        this.objectId = new ASN1ObjectIdentifier(objectId.getId());
79    }
80
81    /**
82     * @deprecated use ASN1ObjectIdentifier
83     * @param objectId
84     * @param parameters
85     */
86    public AlgorithmIdentifier(
87        DERObjectIdentifier objectId,
88        ASN1Encodable           parameters)
89    {
90        parametersDefined = true;
91        this.objectId = new ASN1ObjectIdentifier(objectId.getId());
92        this.parameters = parameters;
93    }
94
95    public AlgorithmIdentifier(
96        ASN1ObjectIdentifier     objectId,
97        ASN1Encodable           parameters)
98    {
99        parametersDefined = true;
100        this.objectId = objectId;
101        this.parameters = parameters;
102    }
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