001package org.apache.commons.ssl.org.bouncycastle.asn1.sec;
002
003import java.math.BigInteger;
004import java.util.Enumeration;
005
006import org.apache.commons.ssl.org.bouncycastle.asn1.ASN1Encodable;
007import org.apache.commons.ssl.org.bouncycastle.asn1.ASN1EncodableVector;
008import org.apache.commons.ssl.org.bouncycastle.asn1.ASN1Integer;
009import org.apache.commons.ssl.org.bouncycastle.asn1.ASN1Object;
010import org.apache.commons.ssl.org.bouncycastle.asn1.ASN1OctetString;
011import org.apache.commons.ssl.org.bouncycastle.asn1.ASN1Primitive;
012import org.apache.commons.ssl.org.bouncycastle.asn1.ASN1Sequence;
013import org.apache.commons.ssl.org.bouncycastle.asn1.ASN1TaggedObject;
014import org.apache.commons.ssl.org.bouncycastle.asn1.DERBitString;
015import org.apache.commons.ssl.org.bouncycastle.asn1.DEROctetString;
016import org.apache.commons.ssl.org.bouncycastle.asn1.DERSequence;
017import org.apache.commons.ssl.org.bouncycastle.asn1.DERTaggedObject;
018import org.bouncycastle.util.BigIntegers;
019
020/**
021 * the elliptic curve private key object from SEC 1
022 * @deprecated use ECPrivateKey
023 */
024public class ECPrivateKeyStructure
025    extends ASN1Object
026{
027    private ASN1Sequence  seq;
028
029    public ECPrivateKeyStructure(
030        ASN1Sequence  seq)
031    {
032        this.seq = seq;
033    }
034
035    public ECPrivateKeyStructure(
036        BigInteger  key)
037    {
038        byte[] bytes = BigIntegers.asUnsignedByteArray(key);
039
040        ASN1EncodableVector v = new ASN1EncodableVector();
041
042        v.add(new ASN1Integer(1));
043        v.add(new DEROctetString(bytes));
044
045        seq = new DERSequence(v);
046    }
047
048    public ECPrivateKeyStructure(
049        BigInteger    key,
050        ASN1Encodable parameters)
051    {
052        this(key, null, parameters);
053    }
054
055    public ECPrivateKeyStructure(
056        BigInteger    key,
057        DERBitString  publicKey,
058        ASN1Encodable parameters)
059    {
060        byte[] bytes = BigIntegers.asUnsignedByteArray(key);
061
062        ASN1EncodableVector v = new ASN1EncodableVector();
063
064        v.add(new ASN1Integer(1));
065        v.add(new DEROctetString(bytes));
066
067        if (parameters != null)
068        {
069            v.add(new DERTaggedObject(true, 0, parameters));
070        }
071
072        if (publicKey != null)
073        {
074            v.add(new DERTaggedObject(true, 1, publicKey));
075        }
076
077        seq = new DERSequence(v);
078    }
079
080    public BigInteger getKey()
081    {
082        ASN1OctetString  octs = (ASN1OctetString)seq.getObjectAt(1);
083
084        return new BigInteger(1, octs.getOctets());
085    }
086
087    public DERBitString getPublicKey()
088    {
089        return (DERBitString)getObjectInTag(1);
090    }
091
092    public ASN1Primitive getParameters()
093    {
094        return getObjectInTag(0);
095    }
096
097    private ASN1Primitive getObjectInTag(int tagNo)
098    {
099        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}