From 32e1b104f8fbc0f80bf2b6a93492aa01fa323e35 Mon Sep 17 00:00:00 2001 From: Gustav Simonsson Date: Mon, 1 Jun 2015 20:27:20 +0200 Subject: Add EC signature validations before call to libsecp256k1 --- crypto/crypto.go | 14 ++++++++++++++ 1 file changed, 14 insertions(+) (limited to 'crypto/crypto.go') diff --git a/crypto/crypto.go b/crypto/crypto.go index 4bbd62f7f..d5291fe1d 100644 --- a/crypto/crypto.go +++ b/crypto/crypto.go @@ -10,6 +10,7 @@ import ( "fmt" "io" "io/ioutil" + "math/big" "os" "encoding/hex" @@ -151,6 +152,19 @@ func GenerateKey() (*ecdsa.PrivateKey, error) { return ecdsa.GenerateKey(S256(), rand.Reader) } +func ValidateSignatureValues(v byte, r, s *big.Int) bool { + secp256k1n := common.String2Big("0xfffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364141") + vint := uint32(v) + if r.Cmp(common.Big0) == 0 || s.Cmp(common.Big0) == 0 { + return false + } + if r.Cmp(secp256k1n) < 0 && s.Cmp(secp256k1n) < 0 && (vint == 27 || vint == 28) { + return true + } else { + return false + } +} + func SigToPub(hash, sig []byte) (*ecdsa.PublicKey, error) { s, err := Ecrecover(hash, sig) if err != nil { -- cgit v1.2.3 From edbd902a1b5e2d8d1fdff8e876594eb1859839e8 Mon Sep 17 00:00:00 2001 From: Gustav Simonsson Date: Wed, 3 Jun 2015 14:44:29 +0200 Subject: Initialise curve N value in package init --- crypto/crypto.go | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) (limited to 'crypto/crypto.go') diff --git a/crypto/crypto.go b/crypto/crypto.go index d5291fe1d..9aef44863 100644 --- a/crypto/crypto.go +++ b/crypto/crypto.go @@ -27,9 +27,12 @@ import ( "golang.org/x/crypto/ripemd160" ) +var secp256k1n *big.Int + func init() { // specify the params for the s256 curve ecies.AddParamsForCurve(S256(), ecies.ECIES_AES128_SHA256) + secp256k1n = common.String2Big("0xfffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364141") } func Sha3(data ...[]byte) []byte { @@ -153,7 +156,6 @@ func GenerateKey() (*ecdsa.PrivateKey, error) { } func ValidateSignatureValues(v byte, r, s *big.Int) bool { - secp256k1n := common.String2Big("0xfffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364141") vint := uint32(v) if r.Cmp(common.Big0) == 0 || s.Cmp(common.Big0) == 0 { return false -- cgit v1.2.3 From 0f51ee6c88f0697cec368d6e2c88b35cc173e37a Mon Sep 17 00:00:00 2001 From: obscuren Date: Thu, 4 Jun 2015 16:52:23 +0200 Subject: crypto: return common.Address rather than raw bytes --- crypto/crypto.go | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) (limited to 'crypto/crypto.go') diff --git a/crypto/crypto.go b/crypto/crypto.go index 9aef44863..8f5597b09 100644 --- a/crypto/crypto.go +++ b/crypto/crypto.go @@ -201,7 +201,7 @@ func ImportBlockTestKey(privKeyBytes []byte) error { ecKey := ToECDSA(privKeyBytes) key := &Key{ Id: uuid.NewRandom(), - Address: common.BytesToAddress(PubkeyToAddress(ecKey.PublicKey)), + Address: PubkeyToAddress(ecKey.PublicKey), PrivateKey: ecKey, } err := ks.StoreKey(key, "") @@ -247,7 +247,7 @@ func decryptPreSaleKey(fileContent []byte, password string) (key *Key, err error ecKey := ToECDSA(ethPriv) key = &Key{ Id: nil, - Address: common.BytesToAddress(PubkeyToAddress(ecKey.PublicKey)), + Address: PubkeyToAddress(ecKey.PublicKey), PrivateKey: ecKey, } derivedAddr := hex.EncodeToString(key.Address.Bytes()) // needed because .Hex() gives leading "0x" @@ -305,7 +305,7 @@ func PKCS7Unpad(in []byte) []byte { return in[:len(in)-int(padding)] } -func PubkeyToAddress(p ecdsa.PublicKey) []byte { +func PubkeyToAddress(p ecdsa.PublicKey) common.Address { pubBytes := FromECDSAPub(&p) - return Sha3(pubBytes[1:])[12:] + return common.BytesToAddress(Sha3(pubBytes[1:])[12:]) } -- cgit v1.2.3