package org.bouncycastle.asn1.sec;

import org.bouncycastle.asn1.ASN1Encodable;
import org.bouncycastle.asn1.ASN1EncodableVector;
import org.bouncycastle.asn1.ASN1Object;
import org.bouncycastle.asn1.ASN1OctetString;
import org.bouncycastle.asn1.ASN1Sequence;
import org.bouncycastle.asn1.ASN1TaggedObject;
import org.bouncycastle.asn1.DERBitString;
import org.bouncycastle.asn1.DEREncodable;
import org.bouncycastle.asn1.DERInteger;
import org.bouncycastle.asn1.DERObject;
import org.bouncycastle.asn1.DEROctetString;
import org.bouncycastle.asn1.DERSequence;
import org.bouncycastle.asn1.DERTaggedObject;
import org.bouncycastle.asn1.util.ASN1Dump;

import java.math.BigInteger;
import java.util.Enumeration;

/**
 * the elliptic curve private key object from SEC 1
 */
public class ECPrivateKeyStructure
    extends ASN1Encodable
{
    private ASN1Sequence  seq;

    public ECPrivateKeyStructure(
        ASN1Sequence  seq)
    {
        this.seq = seq;
    }

    public ECPrivateKeyStructure(
        BigInteger  key)
    {
        byte[]  bytes = key.toByteArray();

        if (bytes[0] == 0)
        {
            byte[]  tmp = new byte[bytes.length - 1];

            System.arraycopy(bytes, 1, tmp, 0, tmp.length);
            bytes = tmp;
        }

        ASN1EncodableVector v = new ASN1EncodableVector();

        v.add(new DERInteger(1));
        v.add(new DEROctetString(bytes));

        seq = new DERSequence(v);
    }

    public ECPrivateKeyStructure(
        BigInteger    key,
        ASN1Encodable parameters)
    {
        this(key, null, parameters);
    }

    public ECPrivateKeyStructure(
        BigInteger    key,
        DERBitString  publicKey,
        ASN1Encodable parameters)
    {
        byte[]  bytes = key.toByteArray();

        if (bytes[0] == 0)
        {
            byte[]  tmp = new byte[bytes.length - 1];

            System.arraycopy(bytes, 1, tmp, 0, tmp.length);
            bytes = tmp;
        }

        ASN1EncodableVector v = new ASN1EncodableVector();

        v.add(new DERInteger(1));
        v.add(new DEROctetString(bytes));

        if (parameters != null)
        {
            v.add(new DERTaggedObject(true, 0, parameters));
        }

        if (publicKey != null)
        {
            v.add(new DERTaggedObject(true, 1, publicKey));
        }

        seq = new DERSequence(v);
    }

    public BigInteger getKey()
    {
        ASN1OctetString  octs = (ASN1OctetString)seq.getObjectAt(1);

        return new BigInteger(1, octs.getOctets());
    }

    public DERBitString getPublicKey()
    {
        return (DERBitString)getObjectInTag(1);
    }

    public ASN1Object getParameters()
    {
        return getObjectInTag(0);
    }

    private ASN1Object getObjectInTag(int tagNo)
    {
        Enumeration e = seq.getObjects();

        while (e.hasMoreElements())
        {
            DEREncodable obj = (DEREncodable)e.nextElement();

            if (obj instanceof ASN1TaggedObject)
            {
                ASN1TaggedObject tag = (ASN1TaggedObject)obj;
                if (tag.getTagNo() == tagNo)
                {
                    return (ASN1Object)((DEREncodable)tag.getObject()).getDERObject();
                }
            }
        }
        return null;
    }

    /**
     * ECPrivateKey ::= SEQUENCE {
     *     version INTEGER { ecPrivkeyVer1(1) } (ecPrivkeyVer1),
     *     privateKey OCTET STRING,
     *     parameters [0] Parameters OPTIONAL,
     *     publicKey [1] BIT STRING OPTIONAL }
     */
    public DERObject toASN1Object()
    {
        return seq;
    }
}

@@ -29,16 +29,76 @@
 1.sec;%0A%0A
+import java.math.BigInteger;%0Aimport java.util.Enumeration;%0A%0A
 import o
@@ -125,32 +125,32 @@
 .ASN1Encodable;%0A
-
 import org.bounc
@@ -688,86 +688,24 @@
 tle.
-asn1.util.ASN1Dump;%0A%0Aimport java.math.BigInteger;%0Aimport java.util.Enumeration
+util.BigIntegers
 ;%0A%0A/
@@ -1027,33 +1027,32 @@
 %7B%0A        byte%5B%5D
- 
  bytes = key.toB
@@ -1048,214 +1048,45 @@
 s = 
-key.toByteArray();%0A%0A        if (bytes%5B0%5D == 0)%0A        %7B%0A            byte%5B%5D  tmp = new byte%5Bbytes.length - 1%5D;%0A%0A            System.arraycopy(bytes, 1, tmp, 0, tmp.length);%0A            bytes = tmp;%0A        %7D
+BigIntegers.asUnsignedByteArray(key);
 %0A%0A  
@@ -1554,17 +1554,16 @@
   byte%5B%5D
- 
  bytes =
@@ -1567,214 +1567,45 @@
 s = 
-key.toByteArray();%0A%0A        if (bytes%5B0%5D == 0)%0A        %7B%0A            byte%5B%5D  tmp = new byte%5Bbytes.length - 1%5D;%0A%0A            System.arraycopy(bytes, 1, tmp, 0, tmp.length);%0A            bytes = tmp;%0A        %7D
+BigIntegers.asUnsignedByteArray(key);
 %0A%0A  

Use BigIntegers.asUnsignedByteArray Cleanup unused imports