diff --git a/src/script.js b/src/script.js index 2860d66..290ba00 100644 --- a/src/script.js +++ b/src/script.js @@ -1,5 +1,6 @@ var Buffer = require('safe-buffer').Buffer var bip66 = require('bip66') +let ecc = require('tiny-secp256k1') var pushdata = require('pushdata-bitcoin') var typeforce = require('typeforce') var types = require('./types') @@ -170,18 +171,7 @@ function toStack (chunks) { } function isCanonicalPubKey (buffer) { - if (!Buffer.isBuffer(buffer)) return false - if (buffer.length < 33) return false - - switch (buffer[0]) { - case 0x02: - case 0x03: - return buffer.length === 33 - case 0x04: - return buffer.length === 65 - } - - return false + return ecc.isPoint(buffer) } function isDefinedHashType (hashType) { @@ -191,7 +181,7 @@ function isDefinedHashType (hashType) { return hashTypeMod > 0x00 && hashTypeMod < 0x04 } -function isCanonicalSignature (buffer) { +function isCanonicalScriptSignature (buffer) { if (!Buffer.isBuffer(buffer)) return false if (!isDefinedHashType(buffer[buffer.length - 1])) return false @@ -209,7 +199,7 @@ module.exports = { signature: require('./script_signature'), isCanonicalPubKey: isCanonicalPubKey, - isCanonicalSignature: isCanonicalSignature, + isCanonicalScriptSignature: isCanonicalScriptSignature, isPushOnly: isPushOnly, isDefinedHashType: isDefinedHashType } diff --git a/src/templates/multisig/input.js b/src/templates/multisig/input.js index a0b2eee..0ba0a06 100644 --- a/src/templates/multisig/input.js +++ b/src/templates/multisig/input.js @@ -7,7 +7,7 @@ var typeforce = require('typeforce') var OPS = require('bitcoin-ops') function partialSignature (value) { - return value === OPS.OP_0 || bscript.isCanonicalSignature(value) + return value === OPS.OP_0 || bscript.isCanonicalScriptSignature(value) } function check (script, allowIncomplete) { @@ -19,7 +19,7 @@ function check (script, allowIncomplete) { return chunks.slice(1).every(partialSignature) } - return chunks.slice(1).every(bscript.isCanonicalSignature) + return chunks.slice(1).every(bscript.isCanonicalScriptSignature) } check.toJSON = function () { return 'multisig input' } diff --git a/src/templates/pubkey/input.js b/src/templates/pubkey/input.js index 4c61664..9149289 100644 --- a/src/templates/pubkey/input.js +++ b/src/templates/pubkey/input.js @@ -7,12 +7,12 @@ function check (script) { var chunks = bscript.decompile(script) return chunks.length === 1 && - bscript.isCanonicalSignature(chunks[0]) + bscript.isCanonicalScriptSignature(chunks[0]) } check.toJSON = function () { return 'pubKey input' } function encodeStack (signature) { - typeforce(bscript.isCanonicalSignature, signature) + typeforce(bscript.isCanonicalScriptSignature, signature) return [signature] } diff --git a/src/templates/pubkeyhash/input.js b/src/templates/pubkeyhash/input.js index ae1d758..81e1f80 100644 --- a/src/templates/pubkeyhash/input.js +++ b/src/templates/pubkeyhash/input.js @@ -7,14 +7,14 @@ function check (script) { var chunks = bscript.decompile(script) return chunks.length === 2 && - bscript.isCanonicalSignature(chunks[0]) && + bscript.isCanonicalScriptSignature(chunks[0]) && bscript.isCanonicalPubKey(chunks[1]) } check.toJSON = function () { return 'pubKeyHash input' } function encodeStack (signature, pubKey) { typeforce({ - signature: bscript.isCanonicalSignature, + signature: bscript.isCanonicalScriptSignature, pubKey: bscript.isCanonicalPubKey }, { signature: signature, diff --git a/src/templates/witnesspubkeyhash/input.js b/src/templates/witnesspubkeyhash/input.js index d61c426..089c8d8 100644 --- a/src/templates/witnesspubkeyhash/input.js +++ b/src/templates/witnesspubkeyhash/input.js @@ -11,14 +11,14 @@ function check (script) { var chunks = bscript.decompile(script) return chunks.length === 2 && - bscript.isCanonicalSignature(chunks[0]) && + bscript.isCanonicalScriptSignature(chunks[0]) && isCompressedCanonicalPubKey(chunks[1]) } check.toJSON = function () { return 'witnessPubKeyHash input' } function encodeStack (signature, pubKey) { typeforce({ - signature: bscript.isCanonicalSignature, + signature: bscript.isCanonicalScriptSignature, pubKey: isCompressedCanonicalPubKey }, { signature: signature, diff --git a/test/script.js b/test/script.js index 5a51dbd..537e75a 100644 --- a/test/script.js +++ b/test/script.js @@ -19,7 +19,8 @@ describe('script', function () { } }) }) - describe.skip('isCanonicalSignature', function () {}) + describe.skip('isCanonicalScriptSignature', function () { + }) describe('fromASM/toASM', function () { fixtures.valid.forEach(function (f) { diff --git a/test/transaction_builder.js b/test/transaction_builder.js index c5c7c1e..499db0c 100644 --- a/test/transaction_builder.js +++ b/test/transaction_builder.js @@ -303,7 +303,7 @@ describe('TransactionBuilder', function () { describe('sign', function () { it('supports the alternative abstract interface { publicKey, sign }', function () { var keyPair = { - publicKey: Buffer.alloc(33, 0x03), + publicKey: ECPair.makeRandom({ rng: function () { return Buffer.alloc(32, 1) } }).publicKey, sign: function (hash) { return Buffer.alloc(64, 0x5f) } } @@ -312,7 +312,7 @@ describe('TransactionBuilder', function () { txb.addInput('ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff', 1) txb.addOutput('1111111111111111111114oLvT2', 100000) txb.sign(0, keyPair) - assert.equal(txb.build().toHex(), '0100000001ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff010000006a47304402205f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f02205f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f0121030303030303030303030303030303030303030303030303030303030303030303ffffffff01a0860100000000001976a914000000000000000000000000000000000000000088ac00000000') + assert.equal(txb.build().toHex(), '0100000001ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff010000006a47304402205f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f02205f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f5f0121031b84c5567b126440995d3ed5aaba0565d71e1834604819ff9c17f5e9d5dd078fffffffff01a0860100000000001976a914000000000000000000000000000000000000000088ac00000000') }) fixtures.invalid.sign.forEach(function (f) {