From a535d7d4149ef4bd584ad8d312e79ef646ce4a1f Mon Sep 17 00:00:00 2001 From: Christopher Jeffrey Date: Wed, 22 Feb 2017 12:40:05 -0800 Subject: [PATCH] tx: fix witness item check. --- lib/primitives/tx.js | 107 ++++++++++++++++++++++--------------------- 1 file changed, 56 insertions(+), 51 deletions(-) diff --git a/lib/primitives/tx.js b/lib/primitives/tx.js index a8063097..082cccd9 100644 --- a/lib/primitives/tx.js +++ b/lib/primitives/tx.js @@ -1559,7 +1559,7 @@ TX.prototype.hasStandardInputs = function hasStandardInputs(view) { */ TX.prototype.hasStandardWitness = function hasStandardWitness(view) { - var i, j, input, witness, coin, prev, redeem, m, n; + var i, j, input, witness, coin, prev, redeem, m; if (this.isCoinbase()) return true; @@ -1599,65 +1599,70 @@ TX.prototype.hasStandardWitness = function hasStandardWitness(view) { continue; } - if (!prev.isWitnessScripthash()) { - // Unknown program type, - // let it through for now. + if (prev.isWitnessScripthash()) { + if (witness.items.length - 1 > policy.MAX_P2WSH_STACK) + return false; + + for (j = 0; j < witness.items.length - 1; j++) { + if (witness.items[j].length > policy.MAX_P2WSH_PUSH) + return false; + } + + redeem = witness.items[witness.items.length - 1]; + + if (redeem.length > policy.MAX_P2WSH_SIZE) + return false; + + prev = new Script(redeem); + + if (prev.isPubkey()) { + if (witness.items.length - 1 !== 1) + return false; + + if (witness.items[0].length > 73) + return false; + + continue; + } + + if (prev.isPubkeyhash()) { + if (input.witness.length - 1 !== 2) + return false; + + if (witness.items[0].length > 73) + return false; + + if (witness.items[1].length > 65) + return false; + + continue; + } + + if (prev.isMultisig()) { + m = prev.getSmall(0); + + if (witness.items.length - 1 !== m + 1) + return false; + + if (witness.items[0].length !== 0) + return false; + + for (j = 1; j < witness.items.length - 1; j++) { + if (witness.items[j].length > 73) + return false; + } + } + continue; } - redeem = witness.items[witness.items.length - 1]; - - if (redeem.length > policy.MAX_P2WSH_SIZE) - return false; - - if (witness.items.length - 1 > policy.MAX_P2WSH_STACK) + if (witness.items.length > policy.MAX_P2WSH_STACK) return false; for (j = 0; j < witness.items.length; j++) { if (witness.items[j].length > policy.MAX_P2WSH_PUSH) return false; } - - prev = new Script(redeem); - - if (prev.isPubkey()) { - if (witness.items.length - 1 !== 1) - return false; - - if (witness.items[0].length > 73) - return false; - - continue; - } - - if (prev.isPubkeyhash()) { - if (input.witness.length - 1 !== 2) - return false; - - if (witness.items[0].length > 73) - return false; - - if (witness.items[1].length > 65) - return false; - - continue; - } - - if (prev.isMultisig()) { - m = prev.getSmall(0); - n = prev.getSmall(prev.length - 2); - - if (witness.items.length - 1 !== m + 1) - return false; - - if (witness.items[0].length !== 0) - return false; - - for (j = 1; j < witness.items.length - 1; j++) { - if (witness.items[j].length > 73) - return false; - } - } } return true;