18212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrompackage org.bouncycastle.asn1.sec;
28212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom
38212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstromimport java.math.BigInteger;
48212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstromimport java.util.Enumeration;
58212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom
68212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstromimport org.bouncycastle.asn1.ASN1Encodable;
78212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstromimport org.bouncycastle.asn1.ASN1EncodableVector;
88212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstromimport org.bouncycastle.asn1.ASN1Object;
98212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstromimport org.bouncycastle.asn1.ASN1OctetString;
108212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstromimport org.bouncycastle.asn1.ASN1Sequence;
118212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstromimport org.bouncycastle.asn1.ASN1TaggedObject;
128212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstromimport org.bouncycastle.asn1.DERBitString;
138212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstromimport org.bouncycastle.asn1.DEREncodable;
148212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstromimport org.bouncycastle.asn1.DERInteger;
158212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstromimport org.bouncycastle.asn1.DERObject;
168212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstromimport org.bouncycastle.asn1.DEROctetString;
178212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstromimport org.bouncycastle.asn1.DERSequence;
188212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstromimport org.bouncycastle.asn1.DERTaggedObject;
198212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstromimport org.bouncycastle.util.BigIntegers;
208212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom
218212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom/**
228212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom * the elliptic curve private key object from SEC 1
238212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom */
248212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrompublic class ECPrivateKeyStructure
258212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom    extends ASN1Encodable
268212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom{
278212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom    private ASN1Sequence  seq;
288212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom
298212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom    public ECPrivateKeyStructure(
308212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom        ASN1Sequence  seq)
318212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom    {
328212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom        this.seq = seq;
338212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom    }
348212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom
358212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom    public ECPrivateKeyStructure(
368212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom        BigInteger  key)
378212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom    {
388212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom        byte[] bytes = BigIntegers.asUnsignedByteArray(key);
398212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom
408212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom        ASN1EncodableVector v = new ASN1EncodableVector();
418212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom
428212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom        v.add(new DERInteger(1));
438212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom        v.add(new DEROctetString(bytes));
448212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom
458212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom        seq = new DERSequence(v);
468212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom    }
478212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom
488212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom    public ECPrivateKeyStructure(
498212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom        BigInteger    key,
508212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom        ASN1Encodable parameters)
518212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom    {
528212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom        this(key, null, parameters);
538212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom    }
548212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom
558212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom    public ECPrivateKeyStructure(
568212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom        BigInteger    key,
578212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom        DERBitString  publicKey,
588212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom        ASN1Encodable parameters)
598212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom    {
608212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom        byte[] bytes = BigIntegers.asUnsignedByteArray(key);
618212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom
628212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom        ASN1EncodableVector v = new ASN1EncodableVector();
638212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom
648212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom        v.add(new DERInteger(1));
658212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom        v.add(new DEROctetString(bytes));
668212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom
678212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom        if (parameters != null)
688212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom        {
698212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom            v.add(new DERTaggedObject(true, 0, parameters));
708212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom        }
718212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom
728212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom        if (publicKey != null)
738212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom        {
748212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom            v.add(new DERTaggedObject(true, 1, publicKey));
758212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom        }
768212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom
778212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom        seq = new DERSequence(v);
788212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom    }
798212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom
808212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom    public BigInteger getKey()
818212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom    {
828212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom        ASN1OctetString  octs = (ASN1OctetString)seq.getObjectAt(1);
838212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom
848212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom        return new BigInteger(1, octs.getOctets());
858212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom    }
868212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom
878212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom    public DERBitString getPublicKey()
888212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom    {
898212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom        return (DERBitString)getObjectInTag(1);
908212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom    }
918212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom
928212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom    public ASN1Object getParameters()
938212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom    {
948212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom        return getObjectInTag(0);
958212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom    }
968212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom
978212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom    private ASN1Object getObjectInTag(int tagNo)
988212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom    {
998212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom        Enumeration e = seq.getObjects();
1008212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom
1018212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom        while (e.hasMoreElements())
1028212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom        {
1038212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom            DEREncodable obj = (DEREncodable)e.nextElement();
1048212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom
1058212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom            if (obj instanceof ASN1TaggedObject)
1068212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom            {
1078212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom                ASN1TaggedObject tag = (ASN1TaggedObject)obj;
1088212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom                if (tag.getTagNo() == tagNo)
1098212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom                {
1108212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom                    return (ASN1Object)((DEREncodable)tag.getObject()).getDERObject();
1118212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom                }
1128212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom            }
1138212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom        }
1148212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom        return null;
1158212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom    }
1168212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom
1178212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom    /**
1188212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom     * ECPrivateKey ::= SEQUENCE {
1198212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom     *     version INTEGER { ecPrivkeyVer1(1) } (ecPrivkeyVer1),
1208212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom     *     privateKey OCTET STRING,
1218212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom     *     parameters [0] Parameters OPTIONAL,
1228212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom     *     publicKey [1] BIT STRING OPTIONAL }
1238212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom     */
1248212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom    public DERObject toASN1Object()
1258212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom    {
1268212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom        return seq;
1278212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom    }
1288212855a312dc8ebe081a3e08b1d2d8f8757af02Brian Carlstrom}
129