From 29ad6b692e5bac9a1282f3dcf05222c79f086fc2 Mon Sep 17 00:00:00 2001 From: Andreas Brekken Date: Tue, 11 Mar 2014 18:25:36 +0100 Subject: [PATCH 1/3] Message signing does not work with compressed keys. ref #61 --- test/message.js | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/test/message.js b/test/message.js index 553cd13..fd00fa9 100644 --- a/test/message.js +++ b/test/message.js @@ -30,5 +30,21 @@ describe('Message', function() { var sig = Message.signMessage(key, msg); assert.ok(!Message.verifyMessage(addr, sig, msg)); }) + + it('handles compressed keys', function() { + var key = new ECKey(hexToBytes(priv)); + key.compressed = true + + var addr = key.getBitcoinAddress().toString() + + var sig = Message.signMessage(key, msg); + assert.ok(Message.verifyMessage(addr, sig, msg)); + + // wrong message + assert.ok(!Message.verifyMessage(addr, sig, 'not foobar')); + + // wrong address + assert.ok(!Message.verifyMessage('1MsHWS1BnwMc3tLE8G35UXsS58fKipzB7a', sig, msg)); + }) }) }) From f09890fed1331931d083ebcdc9f4052fd7498137 Mon Sep 17 00:00:00 2001 From: Andreas Brekken Date: Tue, 11 Mar 2014 18:26:40 +0100 Subject: [PATCH 2/3] Determine whether key is compressed from the key itself. ref #61 --- src/message.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/message.js b/src/message.js index b370f92..beacfa6 100644 --- a/src/message.js +++ b/src/message.js @@ -27,7 +27,7 @@ Message.getHash = function (message) { return Crypto.SHA256(Crypto.SHA256(buffer, {asBytes: true}), {asBytes: true}); }; -Message.signMessage = function (key, message, compressed) { +Message.signMessage = function (key, message) { var hash = Message.getHash(message); var sig = key.sign(hash); @@ -37,7 +37,7 @@ Message.signMessage = function (key, message, compressed) { var i = ecdsa.calcPubkeyRecoveryParam(key, obj.r, obj.s, hash); i += 27; - if (compressed) i += 4; + if (key.compressed) i += 4; var rBa = obj.r.toByteArrayUnsigned(); var sBa = obj.s.toByteArrayUnsigned(); From 08e75a82c91368af8002865e66adee6c01eb9167 Mon Sep 17 00:00:00 2001 From: Andreas Brekken Date: Tue, 11 Mar 2014 18:28:04 +0100 Subject: [PATCH 3/3] Add whether pubkey recovered from sig is compressed. close #61 --- src/message.js | 1 + 1 file changed, 1 insertion(+) diff --git a/src/message.js b/src/message.js index beacfa6..e2367c7 100644 --- a/src/message.js +++ b/src/message.js @@ -59,6 +59,7 @@ Message.verifyMessage = function (address, sig, message) { var isCompressed = !!(sig.i & 4); var pubKey = ecdsa.recoverPubKey(sig.r, sig.s, hash, sig.i); + pubKey.compressed = isCompressed; var expectedAddress = pubKey.getBitcoinAddress().toString();