1package org.bouncycastle.asn1.x509;
2
3import org.bouncycastle.asn1.ASN1Encodable;
4import org.bouncycastle.asn1.ASN1EncodableVector;
5import org.bouncycastle.asn1.ASN1ObjectIdentifier;
6import org.bouncycastle.asn1.ASN1Sequence;
7import org.bouncycastle.asn1.ASN1TaggedObject;
8import org.bouncycastle.asn1.DEREncodable;
9import org.bouncycastle.asn1.DERNull;
10import org.bouncycastle.asn1.DERObject;
11import org.bouncycastle.asn1.DERObjectIdentifier;
12import org.bouncycastle.asn1.DERSequence;
13
14public class AlgorithmIdentifier
15    extends ASN1Encodable
16{
17    private DERObjectIdentifier objectId;
18    private DEREncodable        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        if (obj instanceof DERObjectIdentifier)
37        {
38            return new AlgorithmIdentifier((DERObjectIdentifier)obj);
39        }
40
41        if (obj instanceof String)
42        {
43            return new AlgorithmIdentifier((String)obj);
44        }
45
46        if (obj instanceof ASN1Sequence)
47        {
48            return new AlgorithmIdentifier((ASN1Sequence)obj);
49        }
50
51        throw new IllegalArgumentException("unknown object in factory: " + obj.getClass().getName());
52    }
53
54    public AlgorithmIdentifier(
55        DERObjectIdentifier     objectId)
56    {
57        this.objectId = objectId;
58    }
59
60    public AlgorithmIdentifier(
61        String     objectId)
62    {
63        this.objectId = new DERObjectIdentifier(objectId);
64    }
65
66    public AlgorithmIdentifier(
67        DERObjectIdentifier     objectId,
68        DEREncodable            parameters)
69    {
70        parametersDefined = true;
71        this.objectId = objectId;
72        this.parameters = parameters;
73    }
74
75    public AlgorithmIdentifier(
76        ASN1Sequence   seq)
77    {
78        if (seq.size() < 1 || seq.size() > 2)
79        {
80            throw new IllegalArgumentException("Bad sequence size: "
81                    + seq.size());
82        }
83
84        objectId = DERObjectIdentifier.getInstance(seq.getObjectAt(0));
85
86        if (seq.size() == 2)
87        {
88            parametersDefined = true;
89            parameters = seq.getObjectAt(1);
90        }
91        else
92        {
93            parameters = null;
94        }
95    }
96
97    public ASN1ObjectIdentifier getAlgorithm()
98    {
99        return new ASN1ObjectIdentifier(objectId.getId());
100    }
101
102    /**
103     * @deprecated use getAlgorithm
104     * @return
105     */
106    public DERObjectIdentifier getObjectId()
107    {
108        return objectId;
109    }
110
111    public DEREncodable getParameters()
112    {
113        return parameters;
114    }
115
116    /**
117     * Produce an object suitable for an ASN1OutputStream.
118     * <pre>
119     *      AlgorithmIdentifier ::= SEQUENCE {
120     *                            algorithm OBJECT IDENTIFIER,
121     *                            parameters ANY DEFINED BY algorithm OPTIONAL }
122     * </pre>
123     */
124    public DERObject toASN1Object()
125    {
126        ASN1EncodableVector  v = new ASN1EncodableVector();
127
128        v.add(objectId);
129
130        if (parametersDefined)
131        {
132            if (parameters != null)
133            {
134                v.add(parameters);
135            }
136            else
137            {
138                v.add(DERNull.INSTANCE);
139            }
140        }
141
142        return new DERSequence(v);
143    }
144}
145