From b5c42303fffa88b4a9d4af41553c682f9e246ef2 Mon Sep 17 00:00:00 2001 From: Daniel Cousens Date: Tue, 17 Mar 2015 12:31:53 +1100 Subject: [PATCH 1/4] crypto: use packages directly --- package.json | 5 ++++- src/crypto.js | 8 ++++---- src/ecdsa.js | 18 +++++++++--------- src/eckey.js | 6 +++--- src/hdnode.js | 6 +++--- 5 files changed, 23 insertions(+), 20 deletions(-) diff --git a/package.json b/package.json index 6e6a229..454bf6d 100644 --- a/package.json +++ b/package.json @@ -46,8 +46,11 @@ }, "dependencies": { "bigi": "^1.4.0", - "bs58check": "^1.0.4", + "bs58check": "^1.0.5", + "create-hash": "^1.1.0", + "create-hmac": "^1.1.3", "ecurve": "^1.0.0", + "randombytes": "^2.0.1", "typeforce": "^1.0.0" }, "devDependencies": { diff --git a/src/crypto.js b/src/crypto.js index dec8a79..3c1cb73 100644 --- a/src/crypto.js +++ b/src/crypto.js @@ -1,4 +1,4 @@ -var crypto = require('crypto') +var createHash = require('create-hash') function hash160 (buffer) { return ripemd160(sha256(buffer)) @@ -9,15 +9,15 @@ function hash256 (buffer) { } function ripemd160 (buffer) { - return crypto.createHash('rmd160').update(buffer).digest() + return createHash('rmd160').update(buffer).digest() } function sha1 (buffer) { - return crypto.createHash('sha1').update(buffer).digest() + return createHash('sha1').update(buffer).digest() } function sha256 (buffer) { - return crypto.createHash('sha256').update(buffer).digest() + return createHash('sha256').update(buffer).digest() } module.exports = { diff --git a/src/ecdsa.js b/src/ecdsa.js index 0455d19..c88add3 100644 --- a/src/ecdsa.js +++ b/src/ecdsa.js @@ -1,5 +1,5 @@ var assert = require('assert') -var crypto = require('crypto') +var createHmac = require('create-hmac') var typeForce = require('typeforce') var BigInteger = require('bigi') @@ -29,7 +29,7 @@ function deterministicGenerateK (curve, hash, d, checkSig) { k.fill(0) // Step D - k = crypto.createHmac('sha256', k) + k = createHmac('sha256', k) .update(v) .update(ZERO) .update(x) @@ -37,10 +37,10 @@ function deterministicGenerateK (curve, hash, d, checkSig) { .digest() // Step E - v = crypto.createHmac('sha256', k).update(v).digest() + v = createHmac('sha256', k).update(v).digest() // Step F - k = crypto.createHmac('sha256', k) + k = createHmac('sha256', k) .update(v) .update(ONE) .update(x) @@ -48,26 +48,26 @@ function deterministicGenerateK (curve, hash, d, checkSig) { .digest() // Step G - v = crypto.createHmac('sha256', k).update(v).digest() + v = createHmac('sha256', k).update(v).digest() // Step H1/H2a, ignored as tlen === qlen (256 bit) // Step H2b - v = crypto.createHmac('sha256', k).update(v).digest() + v = createHmac('sha256', k).update(v).digest() var T = BigInteger.fromBuffer(v) // Step H3, repeat until T is within the interval [1, n - 1] and is suitable for ECDSA while ((T.signum() <= 0) || (T.compareTo(curve.n) >= 0) || !checkSig(T)) { - k = crypto.createHmac('sha256', k) + k = createHmac('sha256', k) .update(v) .update(ZERO) .digest() - v = crypto.createHmac('sha256', k).update(v).digest() + v = createHmac('sha256', k).update(v).digest() // Step H1/H2a, again, ignored as tlen === qlen (256 bit) // Step H2b again - v = crypto.createHmac('sha256', k).update(v).digest() + v = createHmac('sha256', k).update(v).digest() T = BigInteger.fromBuffer(v) } diff --git a/src/eckey.js b/src/eckey.js index af7fda2..06bed6a 100644 --- a/src/eckey.js +++ b/src/eckey.js @@ -1,9 +1,9 @@ var assert = require('assert') var base58check = require('bs58check') -var crypto = require('crypto') var ecdsa = require('./ecdsa') -var typeForce = require('typeforce') var networks = require('./networks') +var randomBytes = require('randombytes') +var typeForce = require('typeforce') var BigInteger = require('bigi') var ECPubKey = require('./ecpubkey') @@ -47,7 +47,7 @@ ECKey.fromWIF = function (string) { } ECKey.makeRandom = function (compressed, rng) { - rng = rng || crypto.randomBytes + rng = rng || randomBytes var buffer = rng(32) typeForce('Buffer', buffer) diff --git a/src/hdnode.js b/src/hdnode.js index f0aa613..9152e1d 100644 --- a/src/hdnode.js +++ b/src/hdnode.js @@ -1,7 +1,7 @@ var assert = require('assert') var base58check = require('bs58check') var bcrypto = require('./crypto') -var crypto = require('crypto') +var createHmac = require('create-hmac') var typeForce = require('typeforce') var networks = require('./networks') @@ -62,7 +62,7 @@ HDNode.fromSeedBuffer = function (seed, network) { assert(seed.length >= 16, 'Seed should be at least 128 bits') assert(seed.length <= 64, 'Seed should be at most 512 bits') - var I = crypto.createHmac('sha512', HDNode.MASTER_SECRET).update(seed).digest() + var I = createHmac('sha512', HDNode.MASTER_SECRET).update(seed).digest() var IL = I.slice(0, 32) var IR = I.slice(32) @@ -225,7 +225,7 @@ HDNode.prototype.derive = function (index) { ]) } - var I = crypto.createHmac('sha512', this.chainCode).update(data).digest() + var I = createHmac('sha512', this.chainCode).update(data).digest() var IL = I.slice(0, 32) var IR = I.slice(32) From 64e206ca7af9b6e9bd29c4d6bdef6def7be4cc5c Mon Sep 17 00:00:00 2001 From: Wei Lu Date: Wed, 18 Mar 2015 23:30:04 +0800 Subject: [PATCH 2/4] crypto: fix test randomBytes stub --- package.json | 1 + test/eckey.js | 33 +++++++++++++-------------------- 2 files changed, 14 insertions(+), 20 deletions(-) diff --git a/package.json b/package.json index 454bf6d..fd14bf9 100644 --- a/package.json +++ b/package.json @@ -61,6 +61,7 @@ "coveralls": "^2.11.2", "istanbul": "^0.3.5", "mocha": "^2.2.0", + "proxyquire": "^1.4.0", "sinon": "^1.12.2", "standard": "^2.11.0" } diff --git a/test/eckey.js b/test/eckey.js index 16ce3d0..e3dbe44 100644 --- a/test/eckey.js +++ b/test/eckey.js @@ -2,10 +2,10 @@ /* eslint-disable no-new */ var assert = require('assert') -var crypto = require('crypto') var ecurve = require('ecurve') var networks = require('../src/networks') -var sinon = require('sinon') +var proxyquire = require('proxyquire') +var randomBytes = require('randombytes') var BigInteger = require('bigi') var ECKey = require('../src/eckey') @@ -101,25 +101,13 @@ describe('ECKey', function () { var exPrivKey = ECKey.fromWIF(exWIF) var exBuffer = exPrivKey.d.toBuffer(32) - describe('uses default crypto RNG', function () { - beforeEach(function () { - sinon.stub(crypto, 'randomBytes').returns(exBuffer) - }) - - afterEach(function () { - crypto.randomBytes.restore() - }) + it("uses the RNG provided by the 'randombytes' module by default", function () { + var stub = { randombytes: function() { return exBuffer } } + var ProxiedECKey = proxyquire('../src/eckey', stub) - it('generates a ECKey', function () { - var privKey = ECKey.makeRandom() - - assert.equal(privKey.toWIF(), exWIF) - }) + var privKey = ProxiedECKey.makeRandom() - it('supports compression', function () { - assert.equal(ECKey.makeRandom(true).pub.compressed, true) - assert.equal(ECKey.makeRandom(false).pub.compressed, false) - }) + assert.equal(privKey.toWIF(), exWIF) }) it('allows a custom RNG to be used', function () { @@ -130,10 +118,15 @@ describe('ECKey', function () { var privKey = ECKey.makeRandom(undefined, rng) assert.equal(privKey.toWIF(), exWIF) }) + + it('supports compression', function () { + assert.equal(ECKey.makeRandom(true).pub.compressed, true) + assert.equal(ECKey.makeRandom(false).pub.compressed, false) + }) }) describe('signing', function () { - var hash = crypto.randomBytes(32) + var hash = randomBytes(32) var priv = ECKey.makeRandom() var signature = priv.sign(hash) From 689f444bdf423af9a5241eabfd96c9c98573f363 Mon Sep 17 00:00:00 2001 From: Daniel Cousens Date: Thu, 19 Mar 2015 11:08:56 +1100 Subject: [PATCH 3/4] tests: fix standard format adherence --- test/eckey.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/test/eckey.js b/test/eckey.js index e3dbe44..0e56fb5 100644 --- a/test/eckey.js +++ b/test/eckey.js @@ -1,10 +1,10 @@ -/* global describe, it, beforeEach, afterEach */ +/* global describe, it */ /* eslint-disable no-new */ var assert = require('assert') var ecurve = require('ecurve') var networks = require('../src/networks') -var proxyquire = require('proxyquire') +var proxyquire = require('proxyquire') var randomBytes = require('randombytes') var BigInteger = require('bigi') @@ -102,7 +102,7 @@ describe('ECKey', function () { var exBuffer = exPrivKey.d.toBuffer(32) it("uses the RNG provided by the 'randombytes' module by default", function () { - var stub = { randombytes: function() { return exBuffer } } + var stub = { randombytes: function () { return exBuffer } } var ProxiedECKey = proxyquire('../src/eckey', stub) var privKey = ProxiedECKey.makeRandom() From b55874718a5ead88778d844339bb60ccbc9253a8 Mon Sep 17 00:00:00 2001 From: Daniel Cousens Date: Thu, 19 Mar 2015 11:15:51 +1100 Subject: [PATCH 4/4] integration: use an rng for the example over mocking --- test/integration/basic.js | 13 +++++-------- 1 file changed, 5 insertions(+), 8 deletions(-) diff --git a/test/integration/basic.js b/test/integration/basic.js index 069a535..7a76889 100644 --- a/test/integration/basic.js +++ b/test/integration/basic.js @@ -3,21 +3,18 @@ var assert = require('assert') var bigi = require('bigi') var bitcoin = require('../../') -var crypto = require('crypto') -var sinon = require('sinon') describe('bitcoinjs-lib (basic)', function () { - it('can generate a random bitcoin address', sinon.test(function () { + it('can generate a random bitcoin address', function () { // for testing only - this.mock(crypto).expects('randomBytes') - .onCall(0).returns(new Buffer('zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz')) + function rng () { return new Buffer('zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz') } - // generate random key - var key = bitcoin.ECKey.makeRandom() + // generate random key (custom rng for testing only) + var key = bitcoin.ECKey.makeRandom(undefined, rng) var address = key.pub.getAddress().toString() assert.equal(address, '1F5VhMHukdnUES9kfXqzPzMeF1GPHKiF64') - })) + }) it('can generate an address from a SHA256 hash', function () { var hash = bitcoin.crypto.sha256('correct horse battery staple')