From 0f5c6c5e2daa9fbf3a0bb753debd8989a872823c Mon Sep 17 00:00:00 2001 From: obscuren Date: Wed, 10 Dec 2014 14:17:10 +0100 Subject: Changed new methods to use ecdsa package for pub prv keys --- crypto/crypto.go | 55 ++++++++++++++++++++++++------------------ crypto/encrypt_decrypt_test.go | 6 ++--- 2 files changed, 35 insertions(+), 26 deletions(-) diff --git a/crypto/crypto.go b/crypto/crypto.go index 87dd72dc7..d70a5a4db 100644 --- a/crypto/crypto.go +++ b/crypto/crypto.go @@ -18,19 +18,6 @@ func init() { ecies.AddParamsForCurve(S256(), ecies.ECIES_AES128_SHA256) } -func ToECDSA(prv []byte) *ecdsa.PrivateKey { - priv := new(ecdsa.PrivateKey) - priv.PublicKey.Curve = S256() - priv.D = ethutil.BigD(prv) - priv.PublicKey.X, priv.PublicKey.Y = S256().ScalarBaseMult(prv) - return priv -} - -func FromECDSA(prv *ecdsa.PrivateKey) []byte { - return prv.D.Bytes() -} - -// TODO refactor, remove (bin) func Sha3(data []byte) []byte { d := sha3.NewKeccak256() d.Write(data) @@ -67,23 +54,45 @@ func Ecrecover(data []byte) []byte { return r } -func SigToPub(hash, sig []byte) []byte { - return Ecrecover(append(hash, sig...)) +// New methods using proper ecdsa keys from the stdlib +func ToECDSA(prv []byte) *ecdsa.PrivateKey { + priv := new(ecdsa.PrivateKey) + priv.PublicKey.Curve = S256() + priv.D = ethutil.BigD(prv) + priv.PublicKey.X, priv.PublicKey.Y = S256().ScalarBaseMult(prv) + return priv } -func Sign(hash, prv []byte) (sig []byte, err error) { - sig, err = secp256k1.Sign(hash, prv) - return +func FromECDSA(prv *ecdsa.PrivateKey) []byte { + return prv.D.Bytes() } -func Encrypt(pub, message []byte) ([]byte, error) { +func PubToECDSA(pub []byte) *ecdsa.PublicKey { x, y := elliptic.Unmarshal(S256(), pub) - epub := &ecdsa.PublicKey{S256(), x, y} + return &ecdsa.PublicKey{S256(), x, y} +} + +func GenerateKey() (*ecdsa.PrivateKey, error) { + return ecdsa.GenerateKey(S256(), rand.Reader) +} + +func SigToPub(hash, sig []byte) *ecdsa.PublicKey { + s := Ecrecover(append(hash, sig...)) + x, y := elliptic.Unmarshal(S256(), s) + + return &ecdsa.PublicKey{S256(), x, y} +} + +func Sign(hash []byte, prv *ecdsa.PrivateKey) (sig []byte, err error) { + sig, err = secp256k1.Sign(hash, prv.D.Bytes()) + return +} - return ecies.Encrypt(rand.Reader, ecies.ImportECDSAPublic(epub), message, nil, nil) +func Encrypt(pub *ecdsa.PublicKey, message []byte) ([]byte, error) { + return ecies.Encrypt(rand.Reader, ecies.ImportECDSAPublic(pub), message, nil, nil) } -func Decrypt(prv, ct []byte) ([]byte, error) { - key := ecies.ImportECDSA(ToECDSA(prv)) +func Decrypt(prv *ecdsa.PrivateKey, ct []byte) ([]byte, error) { + key := ecies.ImportECDSA(prv) return key.Decrypt(rand.Reader, ct, nil, nil) } diff --git a/crypto/encrypt_decrypt_test.go b/crypto/encrypt_decrypt_test.go index 44bb26f47..850fa94e4 100644 --- a/crypto/encrypt_decrypt_test.go +++ b/crypto/encrypt_decrypt_test.go @@ -9,9 +9,9 @@ import ( ) func TestBox(t *testing.T) { - prv1 := ethutil.Hex2Bytes("4b50fa71f5c3eeb8fdc452224b2395af2fcc3d125e06c32c82e048c0559db03f") - prv2 := ethutil.Hex2Bytes("d0b043b4c5d657670778242d82d68a29d25d7d711127d17b8e299f156dad361a") - pub2 := ethutil.Hex2Bytes("04bd27a63c91fe3233c5777e6d3d7b39204d398c8f92655947eb5a373d46e1688f022a1632d264725cbc7dc43ee1cfebde42fa0a86d08b55d2acfbb5e9b3b48dc5") + prv1 := ToECDSA(ethutil.Hex2Bytes("4b50fa71f5c3eeb8fdc452224b2395af2fcc3d125e06c32c82e048c0559db03f")) + prv2 := ToECDSA(ethutil.Hex2Bytes("d0b043b4c5d657670778242d82d68a29d25d7d711127d17b8e299f156dad361a")) + pub2 := PubToECDSA(ethutil.Hex2Bytes("04bd27a63c91fe3233c5777e6d3d7b39204d398c8f92655947eb5a373d46e1688f022a1632d264725cbc7dc43ee1cfebde42fa0a86d08b55d2acfbb5e9b3b48dc5")) message := []byte("Hello, world.") ct, err := Encrypt(pub2, message) -- cgit v1.2.3