1b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallampackage org.bouncycastle.asn1.x509;
2b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam
3b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallamimport org.bouncycastle.asn1.ASN1Encodable;
4b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallamimport org.bouncycastle.asn1.ASN1EncodableVector;
56e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstromimport org.bouncycastle.asn1.ASN1ObjectIdentifier;
6b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallamimport org.bouncycastle.asn1.ASN1Sequence;
7b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallamimport org.bouncycastle.asn1.ASN1TaggedObject;
8b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallamimport org.bouncycastle.asn1.DEREncodable;
96e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstromimport org.bouncycastle.asn1.DERNull;
10b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallamimport org.bouncycastle.asn1.DERObject;
11b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallamimport org.bouncycastle.asn1.DERObjectIdentifier;
12b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallamimport org.bouncycastle.asn1.DERSequence;
13b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam
14b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallampublic class AlgorithmIdentifier
15b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    extends ASN1Encodable
16b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam{
17b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    private DERObjectIdentifier objectId;
18b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    private DEREncodable        parameters;
19b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    private boolean             parametersDefined = false;
20b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam
21b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    public static AlgorithmIdentifier getInstance(
22b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        ASN1TaggedObject obj,
23b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        boolean          explicit)
24b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    {
25b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        return getInstance(ASN1Sequence.getInstance(obj, explicit));
26b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    }
27b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam
28b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    public static AlgorithmIdentifier getInstance(
29b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        Object  obj)
30b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    {
31b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        if (obj== null || obj instanceof AlgorithmIdentifier)
32b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        {
33b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam            return (AlgorithmIdentifier)obj;
34b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        }
35b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam
36b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        if (obj instanceof DERObjectIdentifier)
37b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        {
38b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam            return new AlgorithmIdentifier((DERObjectIdentifier)obj);
39b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        }
40b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam
41b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        if (obj instanceof String)
42b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        {
43b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam            return new AlgorithmIdentifier((String)obj);
44b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        }
45b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam
46b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        if (obj instanceof ASN1Sequence)
47b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        {
48b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam            return new AlgorithmIdentifier((ASN1Sequence)obj);
49b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        }
50b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam
51c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom        throw new IllegalArgumentException("unknown object in factory: " + obj.getClass().getName());
52b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    }
53b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam
54b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    public AlgorithmIdentifier(
55b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        DERObjectIdentifier     objectId)
56b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    {
57b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        this.objectId = objectId;
58b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    }
59b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam
60b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    public AlgorithmIdentifier(
61b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        String     objectId)
62b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    {
63b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        this.objectId = new DERObjectIdentifier(objectId);
64b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    }
65b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam
66b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    public AlgorithmIdentifier(
67b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        DERObjectIdentifier     objectId,
68b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        DEREncodable            parameters)
69b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    {
70b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        parametersDefined = true;
71b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        this.objectId = objectId;
72b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        this.parameters = parameters;
73b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    }
74b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam
75b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    public AlgorithmIdentifier(
76b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        ASN1Sequence   seq)
77b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    {
78b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        if (seq.size() < 1 || seq.size() > 2)
79b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        {
80b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam            throw new IllegalArgumentException("Bad sequence size: "
81b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam                    + seq.size());
82b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        }
83b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam
84b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        objectId = DERObjectIdentifier.getInstance(seq.getObjectAt(0));
85b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam
86b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        if (seq.size() == 2)
87b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        {
88b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam            parametersDefined = true;
89b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam            parameters = seq.getObjectAt(1);
90b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        }
91b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        else
92b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        {
93b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam            parameters = null;
94b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        }
95b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    }
96b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam
976e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom    public ASN1ObjectIdentifier getAlgorithm()
986e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom    {
996e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom        return new ASN1ObjectIdentifier(objectId.getId());
1006e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom    }
1016e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom
1026e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom    /**
1036e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom     * @deprecated use getAlgorithm
1046e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom     * @return
1056e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom     */
106b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    public DERObjectIdentifier getObjectId()
107b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    {
108b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        return objectId;
109b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    }
110b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam
111b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    public DEREncodable getParameters()
112b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    {
113b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        return parameters;
114b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    }
115b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam
116b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    /**
117b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam     * Produce an object suitable for an ASN1OutputStream.
118b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam     * <pre>
119b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam     *      AlgorithmIdentifier ::= SEQUENCE {
120b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam     *                            algorithm OBJECT IDENTIFIER,
121b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam     *                            parameters ANY DEFINED BY algorithm OPTIONAL }
122b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam     * </pre>
123b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam     */
124b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    public DERObject toASN1Object()
125b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    {
126b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        ASN1EncodableVector  v = new ASN1EncodableVector();
127b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam
128b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        v.add(objectId);
129b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam
130b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        if (parametersDefined)
131b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        {
1326e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom            if (parameters != null)
1336e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom            {
1346e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom                v.add(parameters);
1356e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom            }
1366e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom            else
1376e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom            {
1386e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom                v.add(DERNull.INSTANCE);
1396e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom            }
140b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        }
141b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam
142b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam        return new DERSequence(v);
143b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam    }
144b61a96e7ef1a78acf013bbf08fe537e5b5f129caPeter Hallam}
145