1package org.bouncycastle.asn1.x9;
2
3import java.io.IOException;
4
5import org.bouncycastle.asn1.ASN1Choice;
6import org.bouncycastle.asn1.ASN1Null;
7import org.bouncycastle.asn1.ASN1Object;
8import org.bouncycastle.asn1.ASN1ObjectIdentifier;
9import org.bouncycastle.asn1.ASN1Primitive;
10import org.bouncycastle.asn1.ASN1TaggedObject;
11
12/**
13 * The Parameters ASN.1 CHOICE from X9.62.
14 */
15public class X962Parameters
16    extends ASN1Object
17    implements ASN1Choice
18{
19    private ASN1Primitive           params = null;
20
21    public static X962Parameters getInstance(
22        Object obj)
23    {
24        if (obj == null || obj instanceof X962Parameters)
25        {
26            return (X962Parameters)obj;
27        }
28
29        if (obj instanceof ASN1Primitive)
30        {
31            return new X962Parameters((ASN1Primitive)obj);
32        }
33
34        if (obj instanceof byte[])
35        {
36            try
37            {
38                return new X962Parameters(ASN1Primitive.fromByteArray((byte[])obj));
39            }
40            catch (IOException e)
41            {
42                throw new IllegalArgumentException("unable to parse encoded data: " + e.getMessage());
43            }
44        }
45
46        throw new IllegalArgumentException("unknown object in getInstance()");
47    }
48
49    public static X962Parameters getInstance(
50        ASN1TaggedObject obj,
51        boolean          explicit)
52    {
53        return getInstance(obj.getObject()); // must be explicitly tagged
54    }
55
56    public X962Parameters(
57        X9ECParameters      ecParameters)
58    {
59        this.params = ecParameters.toASN1Primitive();
60    }
61
62    public X962Parameters(
63        ASN1ObjectIdentifier  namedCurve)
64    {
65        this.params = namedCurve;
66    }
67
68    public X962Parameters(
69        ASN1Null           obj)
70    {
71        this.params = obj;
72    }
73
74    /**
75     * @deprecated use getInstance()
76     */
77    public X962Parameters(
78        ASN1Primitive           obj)
79    {
80        this.params = obj;
81    }
82
83    public boolean isNamedCurve()
84    {
85        return (params instanceof ASN1ObjectIdentifier);
86    }
87
88    public boolean isImplicitlyCA()
89    {
90        return (params instanceof ASN1Null);
91    }
92
93    public ASN1Primitive getParameters()
94    {
95        return params;
96    }
97
98    /**
99     * Produce an object suitable for an ASN1OutputStream.
100     * <pre>
101     * Parameters ::= CHOICE {
102     *    ecParameters ECParameters,
103     *    namedCurve   CURVES.&amp;id({CurveNames}),
104     *    implicitlyCA NULL
105     * }
106     * </pre>
107     */
108    public ASN1Primitive toASN1Primitive()
109    {
110        return (ASN1Primitive)params;
111    }
112}
113