crypto: do not call out for merkle building.

This commit is contained in:
Christopher Jeffrey 2017-07-19 19:47:31 -07:00
parent 26ade82a0b
commit 6a73f61a91
No known key found for this signature in database
GPG Key ID: 8962AB9DE6666BBD

View File

@ -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;