aboutsummaryrefslogtreecommitdiffstats
path: root/crypto/crypto.go
diff options
context:
space:
mode:
authorJeffrey Wilcke <jeffrey@ethereum.org>2016-02-29 22:05:37 +0800
committerJeffrey Wilcke <jeffrey@ethereum.org>2016-02-29 22:05:37 +0800
commit4044a8cea44cd4cee3a8ddaf51a76b71c9d22042 (patch)
tree1aa3776381e8e117b66e4a8ed1bf83e29d966ff1 /crypto/crypto.go
parentc541b38fb36587d23c60f5e2f2b9b3c8700ec489 (diff)
parent61be63bb9b8527bb3e2357ad35a0f4ef29304da1 (diff)
downloadgo-tangerine-1.3.4.tar
go-tangerine-1.3.4.tar.gz
go-tangerine-1.3.4.tar.bz2
go-tangerine-1.3.4.tar.lz
go-tangerine-1.3.4.tar.xz
go-tangerine-1.3.4.tar.zst
go-tangerine-1.3.4.zip
Merge pull request #2258 from obscuren/release/1.3.4v1.3.4
Homestead Release Candidate
Diffstat (limited to 'crypto/crypto.go')
-rw-r--r--crypto/crypto.go13
1 files changed, 11 insertions, 2 deletions
diff --git a/crypto/crypto.go b/crypto/crypto.go
index 8685d62d3..c944fd553 100644
--- a/crypto/crypto.go
+++ b/crypto/crypto.go
@@ -171,12 +171,21 @@ func GenerateKey() (*ecdsa.PrivateKey, error) {
return ecdsa.GenerateKey(S256(), rand.Reader)
}
-func ValidateSignatureValues(v byte, r, s *big.Int) bool {
+func ValidateSignatureValues(v byte, r, s *big.Int, homestead bool) bool {
if r.Cmp(common.Big1) < 0 || s.Cmp(common.Big1) < 0 {
return false
}
vint := uint32(v)
- if r.Cmp(secp256k1n) < 0 && s.Cmp(secp256k1n) < 0 && (vint == 27 || vint == 28) {
+ // reject upper range of s values (ECDSA malleability)
+ // see discussion in secp256k1/libsecp256k1/include/secp256k1.h
+ if homestead && s.Cmp(secp256k1.HalfN) > 0 {
+ return false
+ }
+ // Frontier: allow s to be in full N range
+ if s.Cmp(secp256k1.N) >= 0 {
+ return false
+ }
+ if r.Cmp(secp256k1.N) < 0 && (vint == 27 || vint == 28) {
return true
} else {
return false