From 7e9b5d858497c4ec63bf1ff7f02509194520bd83 Mon Sep 17 00:00:00 2001 From: Daniel Cousens Date: Fri, 30 May 2014 16:28:13 +1000 Subject: [PATCH 1/9] bufferutils: return opcode for use --- src/bufferutils.js | 1 + test/bufferutils.js | 2 ++ 2 files changed, 3 insertions(+) diff --git a/src/bufferutils.js b/src/bufferutils.js index ac340e9..1f4afaa 100644 --- a/src/bufferutils.js +++ b/src/bufferutils.js @@ -37,6 +37,7 @@ function readPushDataInt(buffer, offset) { } return { + opcode: opcode, number: number, size: size } diff --git a/test/bufferutils.js b/test/bufferutils.js index 72cec2d..04bfd0c 100644 --- a/test/bufferutils.js +++ b/test/bufferutils.js @@ -23,7 +23,9 @@ describe('bufferutils', function() { it('decodes ' + f.hexPD + ' correctly', function() { var buffer = new Buffer(f.hexPD, 'hex') var d = bufferutils.readPushDataInt(buffer, 0) + var fopcode = parseInt(f.hexPD.substr(0, 2), 16) + assert.equal(d.opcode, fopcode) assert.equal(d.number, f.dec) assert.equal(d.size, buffer.length) }) From b10e96cbff0c88ca171366e1c6af49b803f8e828 Mon Sep 17 00:00:00 2001 From: Daniel Cousens Date: Fri, 30 May 2014 17:49:12 +1000 Subject: [PATCH 2/9] ecdsa: serializeSig should return a Buffer --- src/ecdsa.js | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/ecdsa.js b/src/ecdsa.js index ee0dcde..2eeffad 100644 --- a/src/ecdsa.js +++ b/src/ecdsa.js @@ -91,18 +91,18 @@ function serializeSig(signature) { var sBa = signature.s.toDERInteger() var sequence = [] - sequence.push(0x02); // INTEGER + sequence.push(0x02) // INTEGER sequence.push(rBa.length) sequence = sequence.concat(rBa) - sequence.push(0x02); // INTEGER + sequence.push(0x02) // INTEGER sequence.push(sBa.length) sequence = sequence.concat(sBa) sequence.unshift(sequence.length) - sequence.unshift(0x30); // SEQUENCE + sequence.unshift(0x30) // SEQUENCE - return sequence + return new Buffer(sequence) } /** From 978f0c5406fdd0b927578455e308e899a161e3e1 Mon Sep 17 00:00:00 2001 From: Daniel Cousens Date: Sat, 31 May 2014 11:23:47 +1000 Subject: [PATCH 3/9] ECKey: adds test to ensure throws on negative D --- test/fixtures/eckey.json | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/test/fixtures/eckey.json b/test/fixtures/eckey.json index 923ed42..fff0164 100644 --- a/test/fixtures/eckey.json +++ b/test/fixtures/eckey.json @@ -67,6 +67,10 @@ ], "invalid": { "constructor": [ + { + "exception": "Private key must be greater than 0", + "D": "-1" + }, { "exception": "Private key must be greater than 0", "D": "0" From 5f88cb89318d92884c7f2203b1088b70988f13d8 Mon Sep 17 00:00:00 2001 From: Daniel Cousens Date: Sat, 31 May 2014 11:24:00 +1000 Subject: [PATCH 4/9] ECKey: use signum over compareTo --- src/eckey.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/eckey.js b/src/eckey.js index 170b9dc..4d9f9e3 100644 --- a/src/eckey.js +++ b/src/eckey.js @@ -11,7 +11,7 @@ var sec = require('./sec') var ecparams = sec('secp256k1') function ECKey(D, compressed) { - assert(D.compareTo(BigInteger.ZERO) > 0, 'Private key must be greater than 0') + assert(D.signum() > 0, 'Private key must be greater than 0') assert(D.compareTo(ecparams.getN()) < 0, 'Private key must be less than the curve order') var Q = ecparams.getG().multiply(D) From baec325e6f6d73ad6c947e436ebdc0f3052a4ae1 Mon Sep 17 00:00:00 2001 From: Daniel Cousens Date: Sat, 31 May 2014 11:25:11 +1000 Subject: [PATCH 5/9] base58: use signum over compareTo --- src/base58.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/base58.js b/src/base58.js index 5b21538..dcfe808 100644 --- a/src/base58.js +++ b/src/base58.js @@ -21,7 +21,7 @@ function encode(buffer) { var result = new Buffer(buffer.length << 1) var i = result.length - 1 - while (bi.compareTo(BigInteger.ZERO) > 0) { + while (bi.signum() > 0) { var remainder = bi.mod(BASE) bi = bi.divide(BASE) From 77ed66b24ddcf4184ba579271728e6a2ba87b7dc Mon Sep 17 00:00:00 2001 From: Daniel Cousens Date: Sat, 31 May 2014 11:28:00 +1000 Subject: [PATCH 6/9] ECKey: ensure throw is from ECKey --- test/eckey.js | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/test/eckey.js b/test/eckey.js index 34ce21a..7d17416 100644 --- a/test/eckey.js +++ b/test/eckey.js @@ -31,8 +31,10 @@ describe('ECKey', function() { fixtures.invalid.constructor.forEach(function(f) { it('throws on ' + f.D, function() { + var D = new BigInteger(f.D) + assert.throws(function() { - new ECKey(new BigInteger(f.D)) + new ECKey(D) }, new RegExp(f.exception)) }) }) From 2b2081bed906be7c6fbf61ef17b9c5bc89b89e16 Mon Sep 17 00:00:00 2001 From: Daniel Cousens Date: Sat, 31 May 2014 11:31:19 +1000 Subject: [PATCH 7/9] base58check: buffers only, remove explicit 0 Undefined is treated as zero if it ever gets to this point anyway, so no value is added by having this default param here. A test fixture to verify this behaviour is added. --- src/base58check.js | 7 +------ test/base58check.js | 3 +-- test/fixtures/base58check.json | 7 +++++++ 3 files changed, 9 insertions(+), 8 deletions(-) diff --git a/src/base58check.js b/src/base58check.js index 10afce2..a905ec9 100644 --- a/src/base58check.js +++ b/src/base58check.js @@ -4,13 +4,8 @@ var base58 = require('./base58') var crypto = require('./crypto') // Encode a buffer as a base58-check-encoded string -function encode(buffer, version) { - version = version || 0 - - // FIXME: `new Buffer(buffer)` is unnecessary if input is a Buffer +function encode(payload, version) { var version = new Buffer([version]) - var payload = new Buffer(buffer) - var message = Buffer.concat([version, payload]) var checksum = crypto.hash256(message).slice(0, 4) diff --git a/test/base58check.js b/test/base58check.js index c4d1030..0a88952 100644 --- a/test/base58check.js +++ b/test/base58check.js @@ -11,7 +11,7 @@ describe('base58check', function() { it('can decode ' + f.string, function() { var actual = base58check.decode(f.string) var expected = { - version: f.decode.version, + version: f.decode.version || 0, payload: h2b(f.decode.payload), checksum: h2b(f.decode.checksum) } @@ -40,4 +40,3 @@ describe('base58check', function() { }) }) }) - diff --git a/test/fixtures/base58check.json b/test/fixtures/base58check.json index dc4928f..3314ec5 100644 --- a/test/fixtures/base58check.json +++ b/test/fixtures/base58check.json @@ -1,5 +1,12 @@ { "valid": [ + { + "string": "1AGNa15ZQXAZUgFiqJ2i7Z2DPU2J6hW62i", + "decode": { + "payload": "65a16059864a2fdbc7c99a4723a8395bc6f188eb", + "checksum": "c046b2ff" + } + }, { "string": "1AGNa15ZQXAZUgFiqJ2i7Z2DPU2J6hW62i", "decode": { From 61c57adbf86d8cee0122ae3ae15aae8d84a7938f Mon Sep 17 00:00:00 2001 From: Daniel Cousens Date: Sat, 31 May 2014 11:48:03 +1000 Subject: [PATCH 8/9] Address: Expected T, got PARAM for Buffer assertion --- src/address.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/address.js b/src/address.js index c469d0f..3e3fd1b 100644 --- a/src/address.js +++ b/src/address.js @@ -18,7 +18,7 @@ function findScriptTypeByVersion(queryVersion) { } function Address(hash, version) { - assert(Buffer.isBuffer(hash), 'First argument must be a Buffer') + assert(Buffer.isBuffer(hash), 'Expected Buffer, got ' + hash) assert.strictEqual(hash.length, 20, 'Invalid hash length') assert.strictEqual(version & 0xFF, version, 'Invalid version byte') From 77d4325d4b57d3b26494b56922b6ce9b89de1d7b Mon Sep 17 00:00:00 2001 From: Daniel Cousens Date: Sat, 31 May 2014 11:48:15 +1000 Subject: [PATCH 9/9] base58: cleanup variable names The encode/decode functions are also now similar syntactically. --- src/base58.js | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/src/base58.js b/src/base58.js index dcfe808..13791f4 100644 --- a/src/base58.js +++ b/src/base58.js @@ -12,7 +12,7 @@ var ALPHABET = '123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz' var ALPHABET_BUF = new Buffer(ALPHABET, 'ascii') var ALPHABET_MAP = {} for(var i = 0; i < ALPHABET.length; i++) { - ALPHABET_MAP[ALPHABET[i]] = BigInteger.valueOf(i) + ALPHABET_MAP[ALPHABET.charAt(i)] = BigInteger.valueOf(i) } var BASE = BigInteger.valueOf(58) @@ -43,7 +43,7 @@ function encode(buffer) { function decode(string) { if (string.length === 0) return new Buffer(0) - var num = BigInteger.ZERO.clone() + var num = BigInteger.ZERO for (var i = 0; i < string.length; i++) { num = num.multiply(BASE) @@ -55,16 +55,16 @@ function decode(string) { } // deal with leading zeros - var i = 0 - while ((i < string.length) && (string[i] === ALPHABET[0])) { - i++ + var j = 0 + while ((j < string.length) && (string[j] === ALPHABET[0])) { + j++ } var buffer = num.toBuffer() - var leadz = new Buffer(i) - leadz.fill(0) + var leadingZeros = new Buffer(j) + leadingZeros.fill(0) - return Buffer.concat([leadz, buffer]) + return Buffer.concat([leadingZeros, buffer]) } module.exports = {