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