Skip to content

Commit 669444c

Browse files
committed
Merge pull request bitcoinjs#135 from greenaddress/low-s-signatures
Uses low 's' values for signatures
2 parents 505e33c + 9d87619 commit 669444c

File tree

2 files changed

+21
-0
lines changed

2 files changed

+21
-0
lines changed

src/ecdsa.js

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,11 @@ var ecdsa = {
6969

7070
var s = k.modInverse(n).multiply(e.add(d.multiply(r))).mod(n)
7171

72+
if (s.compareTo(n.divide(BigInteger.valueOf(2))) > 0) {
73+
// Make 's' value 'low', as per https://github.com/bitcoin/bips/blob/master/bip-0062.mediawiki#low-s-values-in-signatures
74+
s = n.subtract(s);
75+
}
76+
7277
return ecdsa.serializeSig(r, s)
7378
},
7479

test/ecdsa.js

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,9 @@
11
var assert = require('assert')
22
var crypto = require('../').crypto
33
var ecdsa = require('..').ecdsa
4+
var sec = require('../src/jsbn/sec.js')
5+
var BigInteger = require('../src/jsbn/jsbn.js')
6+
var ecparams = sec("secp256k1")
47
var rng = require('secure-random')
58

69
var BigInteger = require('..').BigInteger
@@ -55,5 +58,18 @@ describe('ecdsa', function() {
5558

5659
assert.ok(ecdsa.verify(hash2, sig_c, s2), 'Verify constant signature')
5760
})
61+
62+
it('should sign with low S value', function() {
63+
var priv = new ECKey('ca48ec9783cf3ad0dfeff1fc254395a2e403cbbc666477b61b45e31d3b8ab458')
64+
var message = 'Vires in numeris'
65+
var signature = priv.sign(message)
66+
var parsed = ecdsa.parseSig(signature)
67+
68+
// Check that the 's' value is 'low', to prevent possible transaction malleability as per
69+
// https://github.com/bitcoin/bips/blob/master/bip-0062.mediawiki#low-s-values-in-signatures
70+
assert.ok(parsed.s.compareTo(ecparams.getN().divide(BigInteger.valueOf(2))) <= 0)
71+
72+
assert.ok(priv.verify(message, signature))
73+
})
5874
})
5975
})

0 commit comments

Comments
 (0)