Check for input empty on parse

This commit is contained in:
junderw 2019-07-04 14:45:50 +09:00
parent 5b5daf84dd
commit 3e7f490093
No known key found for this signature in database
GPG key ID: B256185D3A971908
2 changed files with 29 additions and 0 deletions

View file

@ -13,6 +13,7 @@ const varuint = require('varuint-bitcoin');
class Psbt extends bip174_1.Psbt { class Psbt extends bip174_1.Psbt {
static fromTransaction(txBuf) { static fromTransaction(txBuf) {
const tx = transaction_1.Transaction.fromBuffer(txBuf); const tx = transaction_1.Transaction.fromBuffer(txBuf);
checkTxEmpty(tx);
const psbt = new this(); const psbt = new this();
psbt.__TX = tx; psbt.__TX = tx;
let inputCount = tx.ins.length; let inputCount = tx.ins.length;
@ -35,6 +36,7 @@ class Psbt extends bip174_1.Psbt {
let tx; let tx;
const txCountGetter = txBuf => { const txCountGetter = txBuf => {
tx = transaction_1.Transaction.fromBuffer(txBuf); tx = transaction_1.Transaction.fromBuffer(txBuf);
checkTxEmpty(tx);
return { return {
inputCount: tx.ins.length, inputCount: tx.ins.length,
outputCount: tx.outs.length, outputCount: tx.outs.length,
@ -564,3 +566,15 @@ function scriptWitnessToWitnessStack(buffer) {
return readVector(); return readVector();
} }
const range = n => [...Array(n).keys()]; const range = n => [...Array(n).keys()];
function checkTxEmpty(tx) {
const isEmpty = tx.ins.every(
input =>
input.script &&
input.script.length === 0 &&
input.witness &&
input.witness.length === 0,
);
if (!isEmpty) {
throw new Error('Format Error: Transaction ScriptSigs are not empty');
}
}

View file

@ -22,6 +22,7 @@ export class Psbt extends PsbtBase {
txBuf: Buffer, txBuf: Buffer,
): InstanceType<T> { ): InstanceType<T> {
const tx = Transaction.fromBuffer(txBuf); const tx = Transaction.fromBuffer(txBuf);
checkTxEmpty(tx);
const psbt = new this() as Psbt; const psbt = new this() as Psbt;
psbt.__TX = tx; psbt.__TX = tx;
let inputCount = tx.ins.length; let inputCount = tx.ins.length;
@ -52,6 +53,7 @@ export class Psbt extends PsbtBase {
outputCount: number; outputCount: number;
} => { } => {
tx = Transaction.fromBuffer(txBuf); tx = Transaction.fromBuffer(txBuf);
checkTxEmpty(tx);
return { return {
inputCount: tx.ins.length, inputCount: tx.ins.length,
outputCount: tx.outs.length, outputCount: tx.outs.length,
@ -719,3 +721,16 @@ function scriptWitnessToWitnessStack(buffer: Buffer): Buffer[] {
} }
const range = (n: number): number[] => [...Array(n).keys()]; const range = (n: number): number[] => [...Array(n).keys()];
function checkTxEmpty(tx: Transaction): void {
const isEmpty = tx.ins.every(
input =>
input.script &&
input.script.length === 0 &&
input.witness &&
input.witness.length === 0,
);
if (!isEmpty) {
throw new Error('Format Error: Transaction ScriptSigs are not empty');
}
}