diff --git a/lib/bcoin/keyring.js b/lib/bcoin/keyring.js index 46417964..aadd596d 100644 --- a/lib/bcoin/keyring.js +++ b/lib/bcoin/keyring.js @@ -612,11 +612,12 @@ KeyRing.fromRaw = function fromRaw(data) { var change = p.readU32(); var index = p.readU32(); var key = p.readVarBytes(); - var keys = new Array(p.readU8()); + var count = p.readU8(); + var keys = []; var i; - for (i = 0; i < keys.length; i++) - keys[i] = p.readVarBytes(); + for (i = 0; i < count; i++) + keys.push(p.readVarBytes()); return new KeyRing({ nework: network, diff --git a/lib/bcoin/merkleblock.js b/lib/bcoin/merkleblock.js index 59a1fcf5..1503d002 100644 --- a/lib/bcoin/merkleblock.js +++ b/lib/bcoin/merkleblock.js @@ -170,8 +170,8 @@ MerkleBlock.prototype.extractTree = function extractTree() { var indexes = []; var map = {}; var failed = false; - var hashes = new Array(this.hashes.length); - var bits = new Array(this.flags.length * 8); + var hashes = []; + var flags = this.flags; var totalTX = this.totalTX; var height = 0; var root, p; @@ -183,12 +183,13 @@ MerkleBlock.prototype.extractTree = function extractTree() { function traverse(height, pos) { var parent, hash, left, right, txid; - if (bitsUsed >= bits.length) { + if (bitsUsed >= flags.length * 8) { failed = true; return constants.ZERO_HASH; } - parent = bits[bitsUsed++]; + parent = (flags[bitsUsed / 8 | 0] >>> (bitsUsed % 8)) & 1; + bitsUsed++; if (height === 0 || !parent) { if (hashUsed >= hashes.length) { @@ -217,11 +218,8 @@ MerkleBlock.prototype.extractTree = function extractTree() { return utils.dsha256(Buffer.concat([left, right])); } - for (p = 0; p < hashes.length; p++) - hashes[p] = new Buffer(this.hashes[p], 'hex'); - - for (p = 0; p < bits.length; p++) - bits[p] = +((this.flags[p / 8 | 0] & (1 << (p % 8))) !== 0); + for (p = 0; p < this.hashes.length; p++) + hashes.push(new Buffer(this.hashes[p], 'hex')); if (totalTX === 0) return; @@ -232,7 +230,7 @@ MerkleBlock.prototype.extractTree = function extractTree() { if (hashes.length > totalTX) return; - if (bits.length < hashes.length) + if (flags.length * 8 < hashes.length) return; height = 0; @@ -244,7 +242,7 @@ MerkleBlock.prototype.extractTree = function extractTree() { if (failed) return; - if (((bitsUsed + 7) / 8 | 0) !== ((bits.length + 7) / 8 | 0)) + if (((bitsUsed + 7) / 8 | 0) !== flags.length) return; if (hashUsed !== hashes.length) diff --git a/lib/bcoin/protocol/parser.js b/lib/bcoin/protocol/parser.js index e903d55a..c3bbb7ad 100644 --- a/lib/bcoin/protocol/parser.js +++ b/lib/bcoin/protocol/parser.js @@ -655,10 +655,10 @@ Parser.parseMerkleBlock = function parseMerkleBlock(p) { hashCount = p.readVarint(); - hashes = new Array(hashCount); + hashes = []; for (i = 0; i < hashCount; i++) - hashes[i] = p.readHash('hex'); + hashes.push(p.readHash('hex')); flags = p.readVarBytes(); @@ -969,7 +969,7 @@ Parser.parseCoin = function parseCoin(p, extended) { */ Parser.parseTX = function parseTX(p) { - var inCount, inputs; + var inCount, inputs, input; var outCount, outputs; var version, locktime, i; var raw, size, witnessSize; @@ -984,15 +984,16 @@ Parser.parseTX = function parseTX(p) { version = p.readU32(); // Technically signed inCount = p.readVarint(); - inputs = new Array(inCount); + inputs = []; for (i = 0; i < inCount; i++) { - inputs[i] = Parser.parseInput(p); - inputs[i].witness = { items: [] }; + input = Parser.parseInput(p); + input.witness = { items: [] }; + inputs.push(input); } outCount = p.readVarint(); - outputs = new Array(outCount); + outputs = []; for (i = 0; i < outCount; i++) outputs[i] = Parser.parseOutput(p); @@ -1063,16 +1064,16 @@ Parser.parseWitnessTX = function parseWitnessTX(p) { throw new Error('Invalid witness tx (flag == 0)'); inCount = p.readVarint(); - inputs = new Array(inCount); + inputs = []; for (i = 0; i < inCount; i++) - inputs[i] = Parser.parseInput(p); + inputs.push(Parser.parseInput(p)); outCount = p.readVarint(); - outputs = new Array(outCount); + outputs = []; for (i = 0; i < outCount; i++) - outputs[i] = Parser.parseOutput(p); + outputs.push(Parser.parseOutput(p)); p.start(); diff --git a/lib/bcoin/scrypt.js b/lib/bcoin/scrypt.js index a3e47732..1a29bed7 100644 --- a/lib/bcoin/scrypt.js +++ b/lib/bcoin/scrypt.js @@ -49,6 +49,12 @@ var utils = require('./utils'); function scrypt(passwd, salt, N, r, p, len) { var i, B, V, XY; + if (typeof passwd === 'string') + passwd = new Buffer(passwd, 'utf8'); + + if (typeof salt === 'string') + salt = new Buffer(salt, 'utf8'); + if (r * p >= (1 << 30)) throw new Error('EFBIG'); diff --git a/lib/bcoin/wallet.js b/lib/bcoin/wallet.js index 55766a54..50c8755e 100644 --- a/lib/bcoin/wallet.js +++ b/lib/bcoin/wallet.js @@ -2317,11 +2317,12 @@ Account.parseRaw = function parseRaw(data) { var receiveDepth = p.readU32(); var changeDepth = p.readU32(); var accountKey = bcoin.hd.PublicKey.fromRaw(p.readBytes(82)); - var keys = new Array(p.readU8()); + var count = p.readU8(); + var keys = []; var i; - for (i = 0; i < keys.length; i++) - keys[i] = bcoin.hd.PublicKey.fromRaw(p.readBytes(82)); + for (i = 0; i < count; i++) + keys.push(bcoin.hd.PublicKey.fromRaw(p.readBytes(82))); return { network: network.type, diff --git a/test/scrypt-test.js b/test/scrypt-test.js new file mode 100644 index 00000000..9d75daa4 --- /dev/null +++ b/test/scrypt-test.js @@ -0,0 +1,37 @@ +var assert = require('assert'); +var scrypt = require('../lib/bcoin/scrypt'); + +describe('Scrypt', function() { + it('should perform scrypt with N=16', function() { + var result = scrypt('', '', 16, 1, 1, 64); + assert.equal(result.toString('hex'), '' + + '77d6576238657b203b19ca42c18a0497f16b4844e3074ae8dfdffa3f' + + 'ede21442fcd0069ded0948f8326a753a0fc81f17e8d3e0fb2e0d3628' + + 'cf35e20c38d18906'); + }); + + it('should perform scrypt with N=1024', function() { + var result = scrypt('password', 'NaCl', 1024, 8, 16, 64) + assert.equal(result.toString('hex'), '' + + 'fdbabe1c9d3472007856e7190d01e9fe7c6ad7cbc8237830e773' + + '76634b3731622eaf30d92e22a3886ff109279d9830dac727afb9' + + '4a83ee6d8360cbdfa2cc0640'); + }); + + it('should perform scrypt with N=16384', function() { + var result = scrypt('pleaseletmein', 'SodiumChloride', 16384, 8, 1, 64); + assert.equal(result.toString('hex'), '' + + '7023bdcb3afd7348461c06cd81fd38ebfda8fbba904f8e3ea9b54' + + '3f6545da1f2d5432955613f0fcf62d49705242a9af9e61e85dc0d' + + '651e40dfcf017b45575887'); + }); + + // Only enable if you want to wait a while. + // it('should perform scrypt with N=1048576', function() { + // var result = scrypt('pleaseletmein', 'SodiumChloride', 1048576, 8, 1, 64); + // assert.equal(result.toString('hex'), '' + // + '2101cb9b6a511aaeaddbbe09cf70f881ec568d574a2ffd4dabe5' + // + 'ee9820adaa478e56fd8f4ba5d09ffa1c6d927c40f4c337304049' + // + 'e8a952fbcbf45c6fa77a41a4'); + // }); +}); diff --git a/test/tx-test.js b/test/tx-test.js index 174b4518..b889aec0 100644 --- a/test/tx-test.js +++ b/test/tx-test.js @@ -155,6 +155,27 @@ describe('TX', function() { assert(coolest.verify(null, true, constants.flags.VERIFY_NONE)); }); + it('should parse witness tx properly', function() { + clearCache(wtx, nocache); + assert.equal(wtx.inputs.length, 5); + assert.equal(wtx.outputs.length, 1980); + assert(wtx.hasWitness()); + assert.notEqual(wtx.hash('hex'), wtx.witnessHash('hex')); + assert.equal(wtx.witnessHash('hex'), + '088c919cd8408005f255c411f786928385688a9e8fdb2db4c9bc3578ce8c94cf'); + assert.equal(wtx.getSize(), 62138); + assert.equal(wtx.getVirtualSize(), 61813); + assert.equal(wtx.getCost(), 247250); + var raw1 = wtx.render(); + clearCache(wtx, true); + var raw2 = wtx.render(); + assert.deepEqual(raw1, raw2); + var wtx2 = bcoin.tx.fromRaw(raw2); + clearCache(wtx2, nocache); + assert.equal(wtx.hash('hex'), wtx2.hash('hex')); + assert.equal(wtx.witnessHash('hex'), wtx2.witnessHash('hex')); + }); + function parseTest(data) { var coins = data[0]; var tx = bcoin.tx.fromRaw(data[1], 'hex'); @@ -626,23 +647,4 @@ describe('TX', function() { assert.equal(block.getReward(), -1); }); }); - - it('should parse witness tx properly', function() { - assert.equal(wtx.inputs.length, 5); - assert.equal(wtx.outputs.length, 1980); - assert(wtx.hasWitness()); - assert.notEqual(wtx.hash('hex'), wtx.witnessHash('hex')); - assert.equal(wtx.witnessHash('hex'), - '088c919cd8408005f255c411f786928385688a9e8fdb2db4c9bc3578ce8c94cf'); - assert.equal(wtx.getSize(), 62138); - assert.equal(wtx.getVirtualSize(), 61813); - assert.equal(wtx.getCost(), 247250); - var raw1 = wtx.render(); - clearCache(wtx, true); - var raw2 = wtx.render(); - assert.deepEqual(raw1, raw2); - var wtx2 = bcoin.tx.fromRaw(raw2); - assert.equal(wtx.hash('hex'), wtx2.hash('hex')); - assert.equal(wtx.witnessHash('hex'), wtx2.witnessHash('hex')); - }); });