crypto: do not call out for merkle building.
This commit is contained in:
parent
26ade82a0b
commit
6a73f61a91
@ -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;
|
||||
|
||||
Loading…
Reference in New Issue
Block a user