ECPrivateKeyStructure.java revision e6bf3e8dfa2804891a82075cb469b736321b4827
1package org.bouncycastle.asn1.sec;
2
3import java.math.BigInteger;
4import java.util.Enumeration;
5
6import org.bouncycastle.asn1.ASN1Encodable;
7import org.bouncycastle.asn1.ASN1EncodableVector;
8import org.bouncycastle.asn1.ASN1Integer;
9import org.bouncycastle.asn1.ASN1Object;
10import org.bouncycastle.asn1.ASN1OctetString;
11import org.bouncycastle.asn1.ASN1Primitive;
12import org.bouncycastle.asn1.ASN1Sequence;
13import org.bouncycastle.asn1.ASN1TaggedObject;
14import org.bouncycastle.asn1.DERBitString;
15import org.bouncycastle.asn1.DEROctetString;
16import org.bouncycastle.asn1.DERSequence;
17import org.bouncycastle.asn1.DERTaggedObject;
18import org.bouncycastle.util.BigIntegers;
19
20/**
21 * the elliptic curve private key object from SEC 1
22 * @deprecated use ECPrivateKey
23 */
24public class ECPrivateKeyStructure
25    extends ASN1Object
26{
27    private ASN1Sequence  seq;
28
29    public ECPrivateKeyStructure(
30        ASN1Sequence  seq)
31    {
32        this.seq = seq;
33    }
34
35    public ECPrivateKeyStructure(
36        BigInteger  key)
37    {
38        byte[] bytes = BigIntegers.asUnsignedByteArray(key);
39
40        ASN1EncodableVector v = new ASN1EncodableVector();
41
42        v.add(new ASN1Integer(1));
43        v.add(new DEROctetString(bytes));
44
45        seq = new DERSequence(v);
46    }
47
48    public ECPrivateKeyStructure(
49        BigInteger    key,
50        ASN1Encodable parameters)
51    {
52        this(key, null, parameters);
53    }
54
55    public ECPrivateKeyStructure(
56        BigInteger    key,
57        DERBitString  publicKey,
58        ASN1Encodable parameters)
59    {
60        byte[] bytes = BigIntegers.asUnsignedByteArray(key);
61
62        ASN1EncodableVector v = new ASN1EncodableVector();
63
64        v.add(new ASN1Integer(1));
65        v.add(new DEROctetString(bytes));
66
67        if (parameters != null)
68        {
69            v.add(new DERTaggedObject(true, 0, parameters));
70        }
71
72        if (publicKey != null)
73        {
74            v.add(new DERTaggedObject(true, 1, publicKey));
75        }
76
77        seq = new DERSequence(v);
78    }
79
80    public BigInteger getKey()
81    {
82        ASN1OctetString  octs = (ASN1OctetString)seq.getObjectAt(1);
83
84        return new BigInteger(1, octs.getOctets());
85    }
86
87    public DERBitString getPublicKey()
88    {
89        return (DERBitString)getObjectInTag(1);
90    }
91
92    public ASN1Primitive getParameters()
93    {
94        return getObjectInTag(0);
95    }
96
97    private ASN1Primitive getObjectInTag(int tagNo)
98    {
99        Enumeration e = seq.getObjects();
100
101        while (e.hasMoreElements())
102        {
103            ASN1Encodable obj = (ASN1Encodable)e.nextElement();
104
105            if (obj instanceof ASN1TaggedObject)
106            {
107                ASN1TaggedObject tag = (ASN1TaggedObject)obj;
108                if (tag.getTagNo() == tagNo)
109                {
110                    return (ASN1Primitive)((ASN1Encodable)tag.getObject()).toASN1Primitive();
111                }
112            }
113        }
114        return null;
115    }
116
117    /**
118     * ECPrivateKey ::= SEQUENCE {
119     *     version INTEGER { ecPrivkeyVer1(1) } (ecPrivkeyVer1),
120     *     privateKey OCTET STRING,
121     *     parameters [0] Parameters OPTIONAL,
122     *     publicKey [1] BIT STRING OPTIONAL }
123     */
124    public ASN1Primitive toASN1Primitive()
125    {
126        return seq;
127    }
128}
129