From 6a73f61a915f28f0575a84369f64387249297d73 Mon Sep 17 00:00:00 2001 From: Christopher Jeffrey Date: Wed, 19 Jul 2017 19:47:31 -0700 Subject: [PATCH] crypto: do not call out for merkle building. --- lib/crypto/merkle.js | 43 ++++++++++++++----------------------------- 1 file changed, 14 insertions(+), 29 deletions(-) diff --git a/lib/crypto/merkle.js b/lib/crypto/merkle.js index 89e0fe2b..8e05dd73 100644 --- a/lib/crypto/merkle.js +++ b/lib/crypto/merkle.js @@ -12,7 +12,6 @@ */ const digest = require('./digest'); -const native = require('../native').binding; /** * Build a merkle tree from leaves. @@ -27,20 +26,18 @@ exports.createTree = function createTree(leaves) { let malleated = false; if (size === 0) { - let hash = Buffer.allocUnsafe(32); - hash.fill(0); - nodes.push(hash); + nodes.push(Buffer.alloc(32)); return [nodes, malleated]; } - for (let j = 0; size > 1; size = (size + 1) >>> 1) { - for (let i = 0; i < size; i += 2) { - let k = Math.min(i + 1, size - 1); - let left = nodes[j + i]; - let right = nodes[j + k]; + for (let i = 0; size > 1; size = (size + 1) >>> 1) { + for (let j = 0; j < size; j += 2) { + let k = Math.min(j + 1, size - 1); + let left = nodes[i + j]; + let right = nodes[i + k]; let hash; - if (k === i + 1 && k + 1 === size + if (k === j + 1 && k + 1 === size && left.equals(right)) { malleated = true; } @@ -49,15 +46,12 @@ exports.createTree = function createTree(leaves) { nodes.push(hash); } - j += size; + i += size; } return [nodes, malleated]; }; -if (native) - exports.createTree = native.createMerkleTree; - /** * Calculate merkle root from leaves. * @param {Buffer[]} leaves @@ -79,15 +73,14 @@ exports.createRoot = function createRoot(leaves) { exports.createBranch = function createBranch(index, leaves) { let size = leaves.length; - let tree = exports.createTree(leaves); + let [nodes] = exports.createTree(leaves); let branch = []; - let j = 0; - for (; size > 1; size = (size + 1) >>> 1) { - let i = Math.min(index ^ 1, size - 1); - branch.push(tree.nodes[j + i]); + for (let i = 0; size > 1; size = (size + 1) >>> 1) { + let j = Math.min(index ^ 1, size - 1); + branch.push(nodes[i + j]); index >>>= 1; - j += size; + i += size; } return branch; @@ -102,12 +95,7 @@ exports.createBranch = function createBranch(index, leaves) { */ exports.verifyBranch = function verifyBranch(hash, branch, index) { - if (branch.length === 0) - return hash; - - for (let i = 0; i < branch.length; i++) { - let otherside = branch[i]; - + for (let otherside of branch) { if (index & 1) hash = digest.root256(otherside, hash); else @@ -118,6 +106,3 @@ exports.verifyBranch = function verifyBranch(hash, branch, index) { return hash; }; - -if (native) - exports.verifyBranch = native.verifyMerkleBranch;