diff options
author | Jeffrey Wilcke <jeffrey@ethereum.org> | 2015-06-03 23:11:24 +0800 |
---|---|---|
committer | Jeffrey Wilcke <jeffrey@ethereum.org> | 2015-06-03 23:11:24 +0800 |
commit | 02f785af70d9d91d38ce44163a79c16ab288d55f (patch) | |
tree | bdcad5df97e544d93698bf587eb98c6ca542d734 /crypto | |
parent | 827bccb64b97dd19918160af99951e8917c2d3f7 (diff) | |
parent | edbd902a1b5e2d8d1fdff8e876594eb1859839e8 (diff) | |
download | dexon-02f785af70d9d91d38ce44163a79c16ab288d55f.tar.gz dexon-02f785af70d9d91d38ce44163a79c16ab288d55f.tar.zst dexon-02f785af70d9d91d38ce44163a79c16ab288d55f.zip |
Merge pull request #1166 from Gustav-Simonsson/add_ec_sig_validations
Add EC signature validations before call to libsecp256k1
Diffstat (limited to 'crypto')
-rw-r--r-- | crypto/crypto.go | 16 |
1 files changed, 16 insertions, 0 deletions
diff --git a/crypto/crypto.go b/crypto/crypto.go index 4bbd62f7f..9aef44863 100644 --- a/crypto/crypto.go +++ b/crypto/crypto.go @@ -10,6 +10,7 @@ import ( "fmt" "io" "io/ioutil" + "math/big" "os" "encoding/hex" @@ -26,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 { @@ -151,6 +155,18 @@ func GenerateKey() (*ecdsa.PrivateKey, error) { return ecdsa.GenerateKey(S256(), rand.Reader) } +func ValidateSignatureValues(v byte, r, s *big.Int) bool { + 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 { |