Auto merge of #2360 - daira:2359.remove-lax-der-validation, r=arcalinea
Remove unneeded lax ECDSA signature verification Fixes #2359. Removes code for lax ECDSA verification, and the SCRIPT_VERIFY_DERSIG flag that controlled it. The behaviour is as-if the flag is always set.
This commit is contained in:
commit
02e5fffadc
|
@ -40,10 +40,10 @@ testScripts=(
|
||||||
'zcjoinsplit.py'
|
'zcjoinsplit.py'
|
||||||
'zcjoinsplitdoublespend.py'
|
'zcjoinsplitdoublespend.py'
|
||||||
'getblocktemplate.py'
|
'getblocktemplate.py'
|
||||||
|
'bip65-cltv-p2p.py'
|
||||||
|
'bipdersig-p2p.py'
|
||||||
);
|
);
|
||||||
testScriptsExt=(
|
testScriptsExt=(
|
||||||
'bipdersig-p2p.py'
|
|
||||||
'bipdersig.py'
|
|
||||||
'getblocktemplate_longpoll.py'
|
'getblocktemplate_longpoll.py'
|
||||||
'getblocktemplate_proposals.py'
|
'getblocktemplate_proposals.py'
|
||||||
'pruning.py'
|
'pruning.py'
|
||||||
|
|
|
@ -5,35 +5,24 @@
|
||||||
#
|
#
|
||||||
|
|
||||||
from test_framework.test_framework import ComparisonTestFramework
|
from test_framework.test_framework import ComparisonTestFramework
|
||||||
from test_framework.util import *
|
from test_framework.util import start_nodes
|
||||||
from test_framework.mininode import CTransaction, NetworkThread
|
from test_framework.mininode import CTransaction, NetworkThread
|
||||||
from test_framework.blocktools import create_coinbase, create_block
|
from test_framework.blocktools import create_coinbase, create_block
|
||||||
from test_framework.comptool import TestInstance, TestManager
|
from test_framework.comptool import TestInstance, TestManager
|
||||||
from test_framework.script import CScript, OP_1NEGATE, OP_NOP2, OP_DROP
|
from test_framework.script import CScript, OP_1NEGATE, OP_NOP2, OP_DROP
|
||||||
from binascii import hexlify, unhexlify
|
from binascii import unhexlify
|
||||||
import cStringIO
|
import cStringIO
|
||||||
import time
|
import time
|
||||||
|
|
||||||
def cltv_invalidate(tx):
|
|
||||||
'''Modify the signature in vin 0 of the tx to fail CLTV
|
|
||||||
|
|
||||||
Prepends -1 CLTV DROP in the scriptSig itself.
|
|
||||||
'''
|
|
||||||
tx.vin[0].scriptSig = CScript([OP_1NEGATE, OP_NOP2, OP_DROP] +
|
|
||||||
list(CScript(tx.vin[0].scriptSig)))
|
|
||||||
|
|
||||||
'''
|
'''
|
||||||
This test is meant to exercise BIP65 (CHECKLOCKTIMEVERIFY)
|
This test is meant to exercise BIP65 (CHECKLOCKTIMEVERIFY).
|
||||||
Connect to a single node.
|
Connect to a single node.
|
||||||
Mine 2 (version 3) blocks (save the coinbases for later).
|
Mine a coinbase block, and then ...
|
||||||
Generate 98 more version 3 blocks, verify the node accepts.
|
Mine 1 version 4 block.
|
||||||
Mine 749 version 4 blocks, verify the node accepts.
|
Check that the CLTV rules are enforced.
|
||||||
Check that the new CLTV rules are not enforced on the 750th version 4 block.
|
|
||||||
Check that the new CLTV rules are enforced on the 751st version 4 block.
|
TODO: factor out common code from {bipdersig-p2p,bip65-cltv-p2p}.py.
|
||||||
Mine 199 new version blocks.
|
|
||||||
Mine 1 old-version block.
|
|
||||||
Mine 1 new version block.
|
|
||||||
Mine 1 old version block, see that the node rejects.
|
|
||||||
'''
|
'''
|
||||||
|
|
||||||
class BIP65Test(ComparisonTestFramework):
|
class BIP65Test(ComparisonTestFramework):
|
||||||
|
@ -42,14 +31,14 @@ class BIP65Test(ComparisonTestFramework):
|
||||||
self.num_nodes = 1
|
self.num_nodes = 1
|
||||||
|
|
||||||
def setup_network(self):
|
def setup_network(self):
|
||||||
# Must set the blockversion for this test
|
|
||||||
self.nodes = start_nodes(1, self.options.tmpdir,
|
self.nodes = start_nodes(1, self.options.tmpdir,
|
||||||
extra_args=[['-debug', '-whitelist=127.0.0.1', '-blockversion=3']],
|
extra_args=[['-debug', '-whitelist=127.0.0.1']],
|
||||||
binary=[self.options.testbinary])
|
binary=[self.options.testbinary])
|
||||||
|
self.is_network_split = False
|
||||||
|
|
||||||
def run_test(self):
|
def run_test(self):
|
||||||
test = TestManager(self, self.options.tmpdir)
|
test = TestManager(self, self.options.tmpdir)
|
||||||
test.add_all_connections(self.nodes)
|
# Don't call test.add_all_connections because there is only one node.
|
||||||
NetworkThread().start() # Start up network handling in another thread
|
NetworkThread().start() # Start up network handling in another thread
|
||||||
test.run()
|
test.run()
|
||||||
|
|
||||||
|
@ -64,112 +53,40 @@ class BIP65Test(ComparisonTestFramework):
|
||||||
tx.deserialize(f)
|
tx.deserialize(f)
|
||||||
return tx
|
return tx
|
||||||
|
|
||||||
def get_tests(self):
|
def invalidate_transaction(self, tx):
|
||||||
|
'''
|
||||||
|
Modify the signature in vin 0 of the tx to fail CLTV
|
||||||
|
|
||||||
self.coinbase_blocks = self.nodes[0].generate(2)
|
Prepends -1 CLTV DROP in the scriptSig itself.
|
||||||
|
'''
|
||||||
|
tx.vin[0].scriptSig = CScript([OP_1NEGATE, OP_NOP2, OP_DROP] +
|
||||||
|
list(CScript(tx.vin[0].scriptSig)))
|
||||||
|
|
||||||
|
def get_tests(self):
|
||||||
|
self.coinbase_blocks = self.nodes[0].generate(1)
|
||||||
self.tip = int ("0x" + self.nodes[0].getbestblockhash() + "L", 0)
|
self.tip = int ("0x" + self.nodes[0].getbestblockhash() + "L", 0)
|
||||||
self.nodeaddress = self.nodes[0].getnewaddress()
|
self.nodeaddress = self.nodes[0].getnewaddress()
|
||||||
self.last_block_time = time.time()
|
self.block_time = time.time() + 1
|
||||||
|
|
||||||
''' 98 more version 3 blocks '''
|
'''Check that the rules are enforced.'''
|
||||||
test_blocks = []
|
for valid in (True, False):
|
||||||
for i in xrange(98):
|
|
||||||
block = create_block(self.tip, create_coinbase(2), self.last_block_time + 1)
|
|
||||||
block.nVersion = 3
|
|
||||||
block.rehash()
|
|
||||||
block.solve()
|
|
||||||
test_blocks.append([block, True])
|
|
||||||
self.last_block_time += 1
|
|
||||||
self.tip = block.sha256
|
|
||||||
yield TestInstance(test_blocks, sync_every_block=False)
|
|
||||||
|
|
||||||
''' Mine 749 version 4 blocks '''
|
|
||||||
test_blocks = []
|
|
||||||
for i in xrange(749):
|
|
||||||
block = create_block(self.tip, create_coinbase(2), self.last_block_time + 1)
|
|
||||||
block.nVersion = 4
|
|
||||||
block.rehash()
|
|
||||||
block.solve()
|
|
||||||
test_blocks.append([block, True])
|
|
||||||
self.last_block_time += 1
|
|
||||||
self.tip = block.sha256
|
|
||||||
yield TestInstance(test_blocks, sync_every_block=False)
|
|
||||||
|
|
||||||
'''
|
|
||||||
Check that the new CLTV rules are not enforced in the 750th
|
|
||||||
version 3 block.
|
|
||||||
'''
|
|
||||||
spendtx = self.create_transaction(self.nodes[0],
|
spendtx = self.create_transaction(self.nodes[0],
|
||||||
self.coinbase_blocks[0], self.nodeaddress, 1.0)
|
self.coinbase_blocks[0],
|
||||||
cltv_invalidate(spendtx)
|
self.nodeaddress, 1.0)
|
||||||
|
if not valid:
|
||||||
|
self.invalidate_transaction(spendtx)
|
||||||
spendtx.rehash()
|
spendtx.rehash()
|
||||||
|
|
||||||
block = create_block(self.tip, create_coinbase(2), self.last_block_time + 1)
|
block = create_block(self.tip, create_coinbase(1), self.block_time)
|
||||||
block.nVersion = 4
|
block.nVersion = 4
|
||||||
block.vtx.append(spendtx)
|
block.vtx.append(spendtx)
|
||||||
block.hashMerkleRoot = block.calc_merkle_root()
|
block.hashMerkleRoot = block.calc_merkle_root()
|
||||||
block.rehash()
|
block.rehash()
|
||||||
block.solve()
|
block.solve()
|
||||||
|
self.block_time += 1
|
||||||
self.last_block_time += 1
|
|
||||||
self.tip = block.sha256
|
self.tip = block.sha256
|
||||||
yield TestInstance([[block, True]])
|
yield TestInstance([[block, valid]])
|
||||||
|
|
||||||
'''
|
|
||||||
Check that the new CLTV rules are enforced in the 751st version 4
|
|
||||||
block.
|
|
||||||
'''
|
|
||||||
spendtx = self.create_transaction(self.nodes[0],
|
|
||||||
self.coinbase_blocks[1], self.nodeaddress, 1.0)
|
|
||||||
cltv_invalidate(spendtx)
|
|
||||||
spendtx.rehash()
|
|
||||||
|
|
||||||
block = create_block(self.tip, create_coinbase(1), self.last_block_time + 1)
|
|
||||||
block.nVersion = 4
|
|
||||||
block.vtx.append(spendtx)
|
|
||||||
block.hashMerkleRoot = block.calc_merkle_root()
|
|
||||||
block.rehash()
|
|
||||||
block.solve()
|
|
||||||
self.last_block_time += 1
|
|
||||||
yield TestInstance([[block, False]])
|
|
||||||
|
|
||||||
''' Mine 199 new version blocks on last valid tip '''
|
|
||||||
test_blocks = []
|
|
||||||
for i in xrange(199):
|
|
||||||
block = create_block(self.tip, create_coinbase(1), self.last_block_time + 1)
|
|
||||||
block.nVersion = 4
|
|
||||||
block.rehash()
|
|
||||||
block.solve()
|
|
||||||
test_blocks.append([block, True])
|
|
||||||
self.last_block_time += 1
|
|
||||||
self.tip = block.sha256
|
|
||||||
yield TestInstance(test_blocks, sync_every_block=False)
|
|
||||||
|
|
||||||
''' Mine 1 old version block '''
|
|
||||||
block = create_block(self.tip, create_coinbase(1), self.last_block_time + 1)
|
|
||||||
block.nVersion = 3
|
|
||||||
block.rehash()
|
|
||||||
block.solve()
|
|
||||||
self.last_block_time += 1
|
|
||||||
self.tip = block.sha256
|
|
||||||
yield TestInstance([[block, True]])
|
|
||||||
|
|
||||||
''' Mine 1 new version block '''
|
|
||||||
block = create_block(self.tip, create_coinbase(1), self.last_block_time + 1)
|
|
||||||
block.nVersion = 4
|
|
||||||
block.rehash()
|
|
||||||
block.solve()
|
|
||||||
self.last_block_time += 1
|
|
||||||
self.tip = block.sha256
|
|
||||||
yield TestInstance([[block, True]])
|
|
||||||
|
|
||||||
''' Mine 1 old version block, should be invalid '''
|
|
||||||
block = create_block(self.tip, create_coinbase(1), self.last_block_time + 1)
|
|
||||||
block.nVersion = 3
|
|
||||||
block.rehash()
|
|
||||||
block.solve()
|
|
||||||
self.last_block_time += 1
|
|
||||||
yield TestInstance([[block, False]])
|
|
||||||
|
|
||||||
if __name__ == '__main__':
|
if __name__ == '__main__':
|
||||||
BIP65Test().main()
|
BIP65Test().main()
|
||||||
|
|
|
@ -1,89 +0,0 @@
|
||||||
#!/usr/bin/env python2
|
|
||||||
# Copyright (c) 2015 The Bitcoin Core developers
|
|
||||||
# Distributed under the MIT software license, see the accompanying
|
|
||||||
# file COPYING or http://www.opensource.org/licenses/mit-license.php.
|
|
||||||
|
|
||||||
#
|
|
||||||
# Test the CHECKLOCKTIMEVERIFY (BIP65) soft-fork logic
|
|
||||||
#
|
|
||||||
|
|
||||||
from test_framework.test_framework import BitcoinTestFramework
|
|
||||||
from test_framework.util import *
|
|
||||||
import os
|
|
||||||
import shutil
|
|
||||||
|
|
||||||
class BIP65Test(BitcoinTestFramework):
|
|
||||||
|
|
||||||
def setup_network(self):
|
|
||||||
self.nodes = []
|
|
||||||
self.nodes.append(start_node(0, self.options.tmpdir, []))
|
|
||||||
self.nodes.append(start_node(1, self.options.tmpdir, ["-blockversion=3"]))
|
|
||||||
self.nodes.append(start_node(2, self.options.tmpdir, ["-blockversion=4"]))
|
|
||||||
connect_nodes(self.nodes[1], 0)
|
|
||||||
connect_nodes(self.nodes[2], 0)
|
|
||||||
self.is_network_split = False
|
|
||||||
self.sync_all()
|
|
||||||
|
|
||||||
def run_test(self):
|
|
||||||
cnt = self.nodes[0].getblockcount()
|
|
||||||
|
|
||||||
# Mine some old-version blocks
|
|
||||||
self.nodes[1].generate(100)
|
|
||||||
self.sync_all()
|
|
||||||
if (self.nodes[0].getblockcount() != cnt + 100):
|
|
||||||
raise AssertionError("Failed to mine 100 version=3 blocks")
|
|
||||||
|
|
||||||
# Mine 750 new-version blocks
|
|
||||||
for i in xrange(15):
|
|
||||||
self.nodes[2].generate(50)
|
|
||||||
self.sync_all()
|
|
||||||
if (self.nodes[0].getblockcount() != cnt + 850):
|
|
||||||
raise AssertionError("Failed to mine 750 version=4 blocks")
|
|
||||||
|
|
||||||
# TODO: check that new CHECKLOCKTIMEVERIFY rules are not enforced
|
|
||||||
|
|
||||||
# Mine 1 new-version block
|
|
||||||
self.nodes[2].generate(1)
|
|
||||||
self.sync_all()
|
|
||||||
if (self.nodes[0].getblockcount() != cnt + 851):
|
|
||||||
raise AssertionFailure("Failed to mine a version=4 blocks")
|
|
||||||
|
|
||||||
# TODO: check that new CHECKLOCKTIMEVERIFY rules are enforced
|
|
||||||
|
|
||||||
# Mine 198 new-version blocks
|
|
||||||
for i in xrange(2):
|
|
||||||
self.nodes[2].generate(99)
|
|
||||||
self.sync_all()
|
|
||||||
if (self.nodes[0].getblockcount() != cnt + 1049):
|
|
||||||
raise AssertionError("Failed to mine 198 version=4 blocks")
|
|
||||||
|
|
||||||
# Mine 1 old-version block
|
|
||||||
self.nodes[1].generate(1)
|
|
||||||
self.sync_all()
|
|
||||||
if (self.nodes[0].getblockcount() != cnt + 1050):
|
|
||||||
raise AssertionError("Failed to mine a version=3 block after 949 version=4 blocks")
|
|
||||||
|
|
||||||
# Mine 1 new-version blocks
|
|
||||||
self.nodes[2].generate(1)
|
|
||||||
self.sync_all()
|
|
||||||
if (self.nodes[0].getblockcount() != cnt + 1051):
|
|
||||||
raise AssertionError("Failed to mine a version=3 block")
|
|
||||||
|
|
||||||
# Mine 1 old-version blocks
|
|
||||||
try:
|
|
||||||
self.nodes[1].generate(1)
|
|
||||||
raise AssertionError("Succeeded to mine a version=3 block after 950 version=4 blocks")
|
|
||||||
except JSONRPCException:
|
|
||||||
pass
|
|
||||||
self.sync_all()
|
|
||||||
if (self.nodes[0].getblockcount() != cnt + 1051):
|
|
||||||
raise AssertionError("Accepted a version=3 block after 950 version=4 blocks")
|
|
||||||
|
|
||||||
# Mine 1 new-version blocks
|
|
||||||
self.nodes[2].generate(1)
|
|
||||||
self.sync_all()
|
|
||||||
if (self.nodes[0].getblockcount() != cnt + 1052):
|
|
||||||
raise AssertionError("Failed to mine a version=4 block")
|
|
||||||
|
|
||||||
if __name__ == '__main__':
|
|
||||||
BIP65Test().main()
|
|
|
@ -5,59 +5,39 @@
|
||||||
#
|
#
|
||||||
|
|
||||||
from test_framework.test_framework import ComparisonTestFramework
|
from test_framework.test_framework import ComparisonTestFramework
|
||||||
from test_framework.util import *
|
from test_framework.util import start_nodes
|
||||||
from test_framework.mininode import CTransaction, NetworkThread
|
from test_framework.mininode import CTransaction, NetworkThread
|
||||||
from test_framework.blocktools import create_coinbase, create_block
|
from test_framework.blocktools import create_coinbase, create_block
|
||||||
from test_framework.comptool import TestInstance, TestManager
|
from test_framework.comptool import TestInstance, TestManager
|
||||||
from test_framework.script import CScript
|
from test_framework.script import CScript
|
||||||
from binascii import hexlify, unhexlify
|
from binascii import unhexlify
|
||||||
import cStringIO
|
import cStringIO
|
||||||
import time
|
import time
|
||||||
|
|
||||||
# A canonical signature consists of:
|
|
||||||
# <30> <total len> <02> <len R> <R> <02> <len S> <S> <hashtype>
|
|
||||||
def unDERify(tx):
|
|
||||||
'''
|
|
||||||
Make the signature in vin 0 of a tx non-DER-compliant,
|
|
||||||
by adding padding after the S-value.
|
|
||||||
'''
|
|
||||||
scriptSig = CScript(tx.vin[0].scriptSig)
|
|
||||||
newscript = []
|
|
||||||
for i in scriptSig:
|
|
||||||
if (len(newscript) == 0):
|
|
||||||
newscript.append(i[0:-1] + '\0' + i[-1])
|
|
||||||
else:
|
|
||||||
newscript.append(i)
|
|
||||||
tx.vin[0].scriptSig = CScript(newscript)
|
|
||||||
|
|
||||||
'''
|
'''
|
||||||
This test is meant to exercise BIP66 (DER SIG).
|
This test is meant to exercise BIP66 (DER SIG).
|
||||||
Connect to a single node.
|
Connect to a single node.
|
||||||
Mine 2 (version 2) blocks (save the coinbases for later).
|
Mine a coinbase block, and then ...
|
||||||
Generate 98 more version 2 blocks, verify the node accepts.
|
Mine 1 version 4 block.
|
||||||
Mine 749 version 3 blocks, verify the node accepts.
|
Check that the DERSIG rules are enforced.
|
||||||
Check that the new DERSIG rules are not enforced on the 750th version 3 block.
|
|
||||||
Check that the new DERSIG rules are enforced on the 751st version 3 block.
|
|
||||||
Mine 199 new version blocks.
|
|
||||||
Mine 1 old-version block.
|
|
||||||
Mine 1 new version block.
|
|
||||||
Mine 1 old version block, see that the node rejects.
|
|
||||||
'''
|
|
||||||
|
|
||||||
|
TODO: factor out common code from {bipdersig-p2p,bip65-cltv-p2p}.py.
|
||||||
|
'''
|
||||||
class BIP66Test(ComparisonTestFramework):
|
class BIP66Test(ComparisonTestFramework):
|
||||||
|
|
||||||
def __init__(self):
|
def __init__(self):
|
||||||
self.num_nodes = 1
|
self.num_nodes = 1
|
||||||
|
|
||||||
def setup_network(self):
|
def setup_network(self):
|
||||||
# Must set the blockversion for this test
|
|
||||||
self.nodes = start_nodes(1, self.options.tmpdir,
|
self.nodes = start_nodes(1, self.options.tmpdir,
|
||||||
extra_args=[['-debug', '-whitelist=127.0.0.1', '-blockversion=2']],
|
extra_args=[['-debug', '-whitelist=127.0.0.1']],
|
||||||
binary=[self.options.testbinary])
|
binary=[self.options.testbinary])
|
||||||
|
self.is_network_split = False
|
||||||
|
|
||||||
def run_test(self):
|
def run_test(self):
|
||||||
test = TestManager(self, self.options.tmpdir)
|
test = TestManager(self, self.options.tmpdir)
|
||||||
test.add_all_connections(self.nodes)
|
# Don't call test.add_all_connections because there is only one node.
|
||||||
NetworkThread().start() # Start up network handling in another thread
|
NetworkThread().start() # Start up network handling in another thread
|
||||||
test.run()
|
test.run()
|
||||||
|
|
||||||
|
@ -72,112 +52,48 @@ class BIP66Test(ComparisonTestFramework):
|
||||||
tx.deserialize(f)
|
tx.deserialize(f)
|
||||||
return tx
|
return tx
|
||||||
|
|
||||||
def get_tests(self):
|
def invalidate_transaction(self, tx):
|
||||||
|
'''
|
||||||
|
Make the signature in vin 0 of a tx non-DER-compliant,
|
||||||
|
by adding padding after the S-value.
|
||||||
|
|
||||||
self.coinbase_blocks = self.nodes[0].generate(2)
|
A canonical signature consists of:
|
||||||
|
<30> <total len> <02> <len R> <R> <02> <len S> <S> <hashtype>
|
||||||
|
'''
|
||||||
|
scriptSig = CScript(tx.vin[0].scriptSig)
|
||||||
|
newscript = []
|
||||||
|
for i in scriptSig:
|
||||||
|
if (len(newscript) == 0):
|
||||||
|
newscript.append(i[0:-1] + '\0' + i[-1])
|
||||||
|
else:
|
||||||
|
newscript.append(i)
|
||||||
|
tx.vin[0].scriptSig = CScript(newscript)
|
||||||
|
|
||||||
|
def get_tests(self):
|
||||||
|
self.coinbase_blocks = self.nodes[0].generate(1)
|
||||||
self.tip = int ("0x" + self.nodes[0].getbestblockhash() + "L", 0)
|
self.tip = int ("0x" + self.nodes[0].getbestblockhash() + "L", 0)
|
||||||
self.nodeaddress = self.nodes[0].getnewaddress()
|
self.nodeaddress = self.nodes[0].getnewaddress()
|
||||||
self.last_block_time = time.time()
|
self.block_time = time.time() + 1
|
||||||
|
|
||||||
''' 98 more version 2 blocks '''
|
'''Check that the rules are enforced.'''
|
||||||
test_blocks = []
|
for valid in (True, False):
|
||||||
for i in xrange(98):
|
|
||||||
block = create_block(self.tip, create_coinbase(2), self.last_block_time + 1)
|
|
||||||
block.nVersion = 2
|
|
||||||
block.rehash()
|
|
||||||
block.solve()
|
|
||||||
test_blocks.append([block, True])
|
|
||||||
self.last_block_time += 1
|
|
||||||
self.tip = block.sha256
|
|
||||||
yield TestInstance(test_blocks, sync_every_block=False)
|
|
||||||
|
|
||||||
''' Mine 749 version 3 blocks '''
|
|
||||||
test_blocks = []
|
|
||||||
for i in xrange(749):
|
|
||||||
block = create_block(self.tip, create_coinbase(2), self.last_block_time + 1)
|
|
||||||
block.nVersion = 3
|
|
||||||
block.rehash()
|
|
||||||
block.solve()
|
|
||||||
test_blocks.append([block, True])
|
|
||||||
self.last_block_time += 1
|
|
||||||
self.tip = block.sha256
|
|
||||||
yield TestInstance(test_blocks, sync_every_block=False)
|
|
||||||
|
|
||||||
'''
|
|
||||||
Check that the new DERSIG rules are not enforced in the 750th
|
|
||||||
version 3 block.
|
|
||||||
'''
|
|
||||||
spendtx = self.create_transaction(self.nodes[0],
|
spendtx = self.create_transaction(self.nodes[0],
|
||||||
self.coinbase_blocks[0], self.nodeaddress, 1.0)
|
self.coinbase_blocks[0],
|
||||||
unDERify(spendtx)
|
self.nodeaddress, 1.0)
|
||||||
|
if not valid:
|
||||||
|
self.invalidate_transaction(spendtx)
|
||||||
spendtx.rehash()
|
spendtx.rehash()
|
||||||
|
|
||||||
block = create_block(self.tip, create_coinbase(2), self.last_block_time + 1)
|
block = create_block(self.tip, create_coinbase(1), self.block_time)
|
||||||
block.nVersion = 3
|
block.nVersion = 4
|
||||||
block.vtx.append(spendtx)
|
block.vtx.append(spendtx)
|
||||||
block.hashMerkleRoot = block.calc_merkle_root()
|
block.hashMerkleRoot = block.calc_merkle_root()
|
||||||
block.rehash()
|
block.rehash()
|
||||||
block.solve()
|
block.solve()
|
||||||
|
self.block_time += 1
|
||||||
self.last_block_time += 1
|
|
||||||
self.tip = block.sha256
|
self.tip = block.sha256
|
||||||
yield TestInstance([[block, True]])
|
yield TestInstance([[block, valid]])
|
||||||
|
|
||||||
'''
|
|
||||||
Check that the new DERSIG rules are enforced in the 751st version 3
|
|
||||||
block.
|
|
||||||
'''
|
|
||||||
spendtx = self.create_transaction(self.nodes[0],
|
|
||||||
self.coinbase_blocks[1], self.nodeaddress, 1.0)
|
|
||||||
unDERify(spendtx)
|
|
||||||
spendtx.rehash()
|
|
||||||
|
|
||||||
block = create_block(self.tip, create_coinbase(1), self.last_block_time + 1)
|
|
||||||
block.nVersion = 3
|
|
||||||
block.vtx.append(spendtx)
|
|
||||||
block.hashMerkleRoot = block.calc_merkle_root()
|
|
||||||
block.rehash()
|
|
||||||
block.solve()
|
|
||||||
self.last_block_time += 1
|
|
||||||
yield TestInstance([[block, False]])
|
|
||||||
|
|
||||||
''' Mine 199 new version blocks on last valid tip '''
|
|
||||||
test_blocks = []
|
|
||||||
for i in xrange(199):
|
|
||||||
block = create_block(self.tip, create_coinbase(1), self.last_block_time + 1)
|
|
||||||
block.nVersion = 3
|
|
||||||
block.rehash()
|
|
||||||
block.solve()
|
|
||||||
test_blocks.append([block, True])
|
|
||||||
self.last_block_time += 1
|
|
||||||
self.tip = block.sha256
|
|
||||||
yield TestInstance(test_blocks, sync_every_block=False)
|
|
||||||
|
|
||||||
''' Mine 1 old version block '''
|
|
||||||
block = create_block(self.tip, create_coinbase(1), self.last_block_time + 1)
|
|
||||||
block.nVersion = 2
|
|
||||||
block.rehash()
|
|
||||||
block.solve()
|
|
||||||
self.last_block_time += 1
|
|
||||||
self.tip = block.sha256
|
|
||||||
yield TestInstance([[block, True]])
|
|
||||||
|
|
||||||
''' Mine 1 new version block '''
|
|
||||||
block = create_block(self.tip, create_coinbase(1), self.last_block_time + 1)
|
|
||||||
block.nVersion = 3
|
|
||||||
block.rehash()
|
|
||||||
block.solve()
|
|
||||||
self.last_block_time += 1
|
|
||||||
self.tip = block.sha256
|
|
||||||
yield TestInstance([[block, True]])
|
|
||||||
|
|
||||||
''' Mine 1 old version block, should be invalid '''
|
|
||||||
block = create_block(self.tip, create_coinbase(1), self.last_block_time + 1)
|
|
||||||
block.nVersion = 2
|
|
||||||
block.rehash()
|
|
||||||
block.solve()
|
|
||||||
self.last_block_time += 1
|
|
||||||
yield TestInstance([[block, False]])
|
|
||||||
|
|
||||||
if __name__ == '__main__':
|
if __name__ == '__main__':
|
||||||
BIP66Test().main()
|
BIP66Test().main()
|
||||||
|
|
|
@ -1,89 +0,0 @@
|
||||||
#!/usr/bin/env python2
|
|
||||||
# Copyright (c) 2014 The Bitcoin Core developers
|
|
||||||
# Distributed under the MIT software license, see the accompanying
|
|
||||||
# file COPYING or http://www.opensource.org/licenses/mit-license.php.
|
|
||||||
|
|
||||||
#
|
|
||||||
# Test the BIP66 changeover logic
|
|
||||||
#
|
|
||||||
|
|
||||||
from test_framework.test_framework import BitcoinTestFramework
|
|
||||||
from test_framework.util import *
|
|
||||||
import os
|
|
||||||
import shutil
|
|
||||||
|
|
||||||
class BIP66Test(BitcoinTestFramework):
|
|
||||||
|
|
||||||
def setup_network(self):
|
|
||||||
self.nodes = []
|
|
||||||
self.nodes.append(start_node(0, self.options.tmpdir, []))
|
|
||||||
self.nodes.append(start_node(1, self.options.tmpdir, ["-blockversion=2"]))
|
|
||||||
self.nodes.append(start_node(2, self.options.tmpdir, ["-blockversion=3"]))
|
|
||||||
connect_nodes(self.nodes[1], 0)
|
|
||||||
connect_nodes(self.nodes[2], 0)
|
|
||||||
self.is_network_split = False
|
|
||||||
self.sync_all()
|
|
||||||
|
|
||||||
def run_test(self):
|
|
||||||
cnt = self.nodes[0].getblockcount()
|
|
||||||
|
|
||||||
# Mine some old-version blocks
|
|
||||||
self.nodes[1].generate(100)
|
|
||||||
self.sync_all()
|
|
||||||
if (self.nodes[0].getblockcount() != cnt + 100):
|
|
||||||
raise AssertionError("Failed to mine 100 version=2 blocks")
|
|
||||||
|
|
||||||
# Mine 750 new-version blocks
|
|
||||||
for i in xrange(15):
|
|
||||||
self.nodes[2].generate(50)
|
|
||||||
self.sync_all()
|
|
||||||
if (self.nodes[0].getblockcount() != cnt + 850):
|
|
||||||
raise AssertionError("Failed to mine 750 version=3 blocks")
|
|
||||||
|
|
||||||
# TODO: check that new DERSIG rules are not enforced
|
|
||||||
|
|
||||||
# Mine 1 new-version block
|
|
||||||
self.nodes[2].generate(1)
|
|
||||||
self.sync_all()
|
|
||||||
if (self.nodes[0].getblockcount() != cnt + 851):
|
|
||||||
raise AssertionFailure("Failed to mine a version=3 blocks")
|
|
||||||
|
|
||||||
# TODO: check that new DERSIG rules are enforced
|
|
||||||
|
|
||||||
# Mine 198 new-version blocks
|
|
||||||
for i in xrange(2):
|
|
||||||
self.nodes[2].generate(99)
|
|
||||||
self.sync_all()
|
|
||||||
if (self.nodes[0].getblockcount() != cnt + 1049):
|
|
||||||
raise AssertionError("Failed to mine 198 version=3 blocks")
|
|
||||||
|
|
||||||
# Mine 1 old-version block
|
|
||||||
self.nodes[1].generate(1)
|
|
||||||
self.sync_all()
|
|
||||||
if (self.nodes[0].getblockcount() != cnt + 1050):
|
|
||||||
raise AssertionError("Failed to mine a version=2 block after 949 version=3 blocks")
|
|
||||||
|
|
||||||
# Mine 1 new-version blocks
|
|
||||||
self.nodes[2].generate(1)
|
|
||||||
self.sync_all()
|
|
||||||
if (self.nodes[0].getblockcount() != cnt + 1051):
|
|
||||||
raise AssertionError("Failed to mine a version=3 block")
|
|
||||||
|
|
||||||
# Mine 1 old-version blocks
|
|
||||||
try:
|
|
||||||
self.nodes[1].generate(1)
|
|
||||||
raise AssertionError("Succeeded to mine a version=2 block after 950 version=3 blocks")
|
|
||||||
except JSONRPCException:
|
|
||||||
pass
|
|
||||||
self.sync_all()
|
|
||||||
if (self.nodes[0].getblockcount() != cnt + 1051):
|
|
||||||
raise AssertionError("Accepted a version=2 block after 950 version=3 blocks")
|
|
||||||
|
|
||||||
# Mine 1 new-version blocks
|
|
||||||
self.nodes[2].generate(1)
|
|
||||||
self.sync_all()
|
|
||||||
if (self.nodes[0].getblockcount() != cnt + 1052):
|
|
||||||
raise AssertionError("Failed to mine a version=3 block")
|
|
||||||
|
|
||||||
if __name__ == '__main__':
|
|
||||||
BIP66Test().main()
|
|
|
@ -56,7 +56,6 @@ class ScriptTestFile(object):
|
||||||
SCRIPT_VERIFY_NONE = 0
|
SCRIPT_VERIFY_NONE = 0
|
||||||
SCRIPT_VERIFY_P2SH = 1
|
SCRIPT_VERIFY_P2SH = 1
|
||||||
SCRIPT_VERIFY_STRICTENC = 1 << 1
|
SCRIPT_VERIFY_STRICTENC = 1 << 1
|
||||||
SCRIPT_VERIFY_DERSIG = 1 << 2
|
|
||||||
SCRIPT_VERIFY_LOW_S = 1 << 3
|
SCRIPT_VERIFY_LOW_S = 1 << 3
|
||||||
SCRIPT_VERIFY_NULLDUMMY = 1 << 4
|
SCRIPT_VERIFY_NULLDUMMY = 1 << 4
|
||||||
SCRIPT_VERIFY_SIGPUSHONLY = 1 << 5
|
SCRIPT_VERIFY_SIGPUSHONLY = 1 << 5
|
||||||
|
@ -69,7 +68,6 @@ flag_map = {
|
||||||
"NONE": SCRIPT_VERIFY_NONE,
|
"NONE": SCRIPT_VERIFY_NONE,
|
||||||
"P2SH": SCRIPT_VERIFY_P2SH,
|
"P2SH": SCRIPT_VERIFY_P2SH,
|
||||||
"STRICTENC": SCRIPT_VERIFY_STRICTENC,
|
"STRICTENC": SCRIPT_VERIFY_STRICTENC,
|
||||||
"DERSIG": SCRIPT_VERIFY_DERSIG,
|
|
||||||
"LOW_S": SCRIPT_VERIFY_LOW_S,
|
"LOW_S": SCRIPT_VERIFY_LOW_S,
|
||||||
"NULLDUMMY": SCRIPT_VERIFY_NULLDUMMY,
|
"NULLDUMMY": SCRIPT_VERIFY_NULLDUMMY,
|
||||||
"SIGPUSHONLY": SCRIPT_VERIFY_SIGPUSHONLY,
|
"SIGPUSHONLY": SCRIPT_VERIFY_SIGPUSHONLY,
|
||||||
|
|
23
src/main.cpp
23
src/main.cpp
|
@ -2078,19 +2078,9 @@ bool ConnectBlock(const CBlock& block, CValidationState& state, CBlockIndex* pin
|
||||||
REJECT_INVALID, "bad-txns-BIP30");
|
REJECT_INVALID, "bad-txns-BIP30");
|
||||||
}
|
}
|
||||||
|
|
||||||
unsigned int flags = SCRIPT_VERIFY_P2SH;
|
unsigned int flags = SCRIPT_VERIFY_P2SH | SCRIPT_VERIFY_CHECKLOCKTIMEVERIFY;
|
||||||
|
|
||||||
// Start enforcing the DERSIG (BIP66) rules, for block.nVersion=3 blocks,
|
// DERSIG (BIP66) is also always enforced, but does not have a flag.
|
||||||
// when 75% of the network has upgraded:
|
|
||||||
if (block.nVersion >= 3) {
|
|
||||||
flags |= SCRIPT_VERIFY_DERSIG;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Start enforcing CHECKLOCKTIMEVERIFY, (BIP65) for block.nVersion=4
|
|
||||||
// blocks, when 75% of the network has upgraded:
|
|
||||||
if (block.nVersion >= 4) {
|
|
||||||
flags |= SCRIPT_VERIFY_CHECKLOCKTIMEVERIFY;
|
|
||||||
}
|
|
||||||
|
|
||||||
CBlockUndo blockundo;
|
CBlockUndo blockundo;
|
||||||
|
|
||||||
|
@ -3103,11 +3093,10 @@ bool ContextualCheckBlock(const CBlock& block, CValidationState& state, CBlockIn
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Enforce block.nVersion=2 rule that the coinbase starts with serialized block height
|
// Enforce BIP 34 rule that the coinbase starts with serialized block height.
|
||||||
// if 750 of the last 1,000 blocks are version 2 or greater (51/100 if testnet):
|
// In Zcash this has been enforced since launch, except that the genesis
|
||||||
// Since MIN_BLOCK_VERSION = 4 all blocks with nHeight > 0 should satisfy this.
|
// block didn't include the height in the coinbase (see Zcash protocol spec
|
||||||
// This rule is not applied to the genesis block, which didn't include the height
|
// section '6.8 Bitcoin Improvement Proposals').
|
||||||
// in the coinbase.
|
|
||||||
if (nHeight > 0)
|
if (nHeight > 0)
|
||||||
{
|
{
|
||||||
CScript expect = CScript() << nHeight;
|
CScript expect = CScript() << nHeight;
|
||||||
|
|
161
src/pubkey.cpp
161
src/pubkey.cpp
|
@ -14,158 +14,6 @@ namespace
|
||||||
secp256k1_context* secp256k1_context_verify = NULL;
|
secp256k1_context* secp256k1_context_verify = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
/** This function is taken from the libsecp256k1 distribution and implements
|
|
||||||
* DER parsing for ECDSA signatures, while supporting an arbitrary subset of
|
|
||||||
* format violations.
|
|
||||||
*
|
|
||||||
* Supported violations include negative integers, excessive padding, garbage
|
|
||||||
* at the end, and overly long length descriptors. This is safe to use in
|
|
||||||
* Bitcoin because since the activation of BIP66, signatures are verified to be
|
|
||||||
* strict DER before being passed to this module, and we know it supports all
|
|
||||||
* violations present in the blockchain before that point.
|
|
||||||
*/
|
|
||||||
static int ecdsa_signature_parse_der_lax(const secp256k1_context* ctx, secp256k1_ecdsa_signature* sig, const unsigned char *input, size_t inputlen) {
|
|
||||||
size_t rpos, rlen, spos, slen;
|
|
||||||
size_t pos = 0;
|
|
||||||
size_t lenbyte;
|
|
||||||
unsigned char tmpsig[64] = {0};
|
|
||||||
int overflow = 0;
|
|
||||||
|
|
||||||
/* Hack to initialize sig with a correctly-parsed but invalid signature. */
|
|
||||||
secp256k1_ecdsa_signature_parse_compact(ctx, sig, tmpsig);
|
|
||||||
|
|
||||||
/* Sequence tag byte */
|
|
||||||
if (pos == inputlen || input[pos] != 0x30) {
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
pos++;
|
|
||||||
|
|
||||||
/* Sequence length bytes */
|
|
||||||
if (pos == inputlen) {
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
lenbyte = input[pos++];
|
|
||||||
if (lenbyte & 0x80) {
|
|
||||||
lenbyte -= 0x80;
|
|
||||||
if (lenbyte > inputlen - pos) {
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
pos += lenbyte;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Integer tag byte for R */
|
|
||||||
if (pos == inputlen || input[pos] != 0x02) {
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
pos++;
|
|
||||||
|
|
||||||
/* Integer length for R */
|
|
||||||
if (pos == inputlen) {
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
lenbyte = input[pos++];
|
|
||||||
if (lenbyte & 0x80) {
|
|
||||||
lenbyte -= 0x80;
|
|
||||||
if (lenbyte > inputlen - pos) {
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
while (lenbyte > 0 && input[pos] == 0) {
|
|
||||||
pos++;
|
|
||||||
lenbyte--;
|
|
||||||
}
|
|
||||||
static_assert(sizeof(size_t) >= 4, "size_t too small");
|
|
||||||
if (lenbyte >= 4) {
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
rlen = 0;
|
|
||||||
while (lenbyte > 0) {
|
|
||||||
rlen = (rlen << 8) + input[pos];
|
|
||||||
pos++;
|
|
||||||
lenbyte--;
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
rlen = lenbyte;
|
|
||||||
}
|
|
||||||
if (rlen > inputlen - pos) {
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
rpos = pos;
|
|
||||||
pos += rlen;
|
|
||||||
|
|
||||||
/* Integer tag byte for S */
|
|
||||||
if (pos == inputlen || input[pos] != 0x02) {
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
pos++;
|
|
||||||
|
|
||||||
/* Integer length for S */
|
|
||||||
if (pos == inputlen) {
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
lenbyte = input[pos++];
|
|
||||||
if (lenbyte & 0x80) {
|
|
||||||
lenbyte -= 0x80;
|
|
||||||
if (lenbyte > inputlen - pos) {
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
while (lenbyte > 0 && input[pos] == 0) {
|
|
||||||
pos++;
|
|
||||||
lenbyte--;
|
|
||||||
}
|
|
||||||
static_assert(sizeof(size_t) >= 4, "size_t too small");
|
|
||||||
if (lenbyte >= 4) {
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
slen = 0;
|
|
||||||
while (lenbyte > 0) {
|
|
||||||
slen = (slen << 8) + input[pos];
|
|
||||||
pos++;
|
|
||||||
lenbyte--;
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
slen = lenbyte;
|
|
||||||
}
|
|
||||||
if (slen > inputlen - pos) {
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
spos = pos;
|
|
||||||
pos += slen;
|
|
||||||
|
|
||||||
/* Ignore leading zeroes in R */
|
|
||||||
while (rlen > 0 && input[rpos] == 0) {
|
|
||||||
rlen--;
|
|
||||||
rpos++;
|
|
||||||
}
|
|
||||||
/* Copy R value */
|
|
||||||
if (rlen > 32) {
|
|
||||||
overflow = 1;
|
|
||||||
} else {
|
|
||||||
memcpy(tmpsig + 32 - rlen, input + rpos, rlen);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Ignore leading zeroes in S */
|
|
||||||
while (slen > 0 && input[spos] == 0) {
|
|
||||||
slen--;
|
|
||||||
spos++;
|
|
||||||
}
|
|
||||||
/* Copy S value */
|
|
||||||
if (slen > 32) {
|
|
||||||
overflow = 1;
|
|
||||||
} else {
|
|
||||||
memcpy(tmpsig + 64 - slen, input + spos, slen);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!overflow) {
|
|
||||||
overflow = !secp256k1_ecdsa_signature_parse_compact(ctx, sig, tmpsig);
|
|
||||||
}
|
|
||||||
if (overflow) {
|
|
||||||
/* Overwrite the result again with a correctly-parsed but invalid
|
|
||||||
signature if parsing failed. */
|
|
||||||
memset(tmpsig, 0, 64);
|
|
||||||
secp256k1_ecdsa_signature_parse_compact(ctx, sig, tmpsig);
|
|
||||||
}
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool CPubKey::Verify(const uint256 &hash, const std::vector<unsigned char>& vchSig) const {
|
bool CPubKey::Verify(const uint256 &hash, const std::vector<unsigned char>& vchSig) const {
|
||||||
if (!IsValid())
|
if (!IsValid())
|
||||||
|
@ -178,11 +26,12 @@ bool CPubKey::Verify(const uint256 &hash, const std::vector<unsigned char>& vchS
|
||||||
if (vchSig.size() == 0) {
|
if (vchSig.size() == 0) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
if (!ecdsa_signature_parse_der_lax(secp256k1_context_verify, &sig, &vchSig[0], vchSig.size())) {
|
/* Zcash, unlike Bitcoin, has always enforced strict DER signatures. */
|
||||||
|
if (!secp256k1_ecdsa_signature_parse_der(secp256k1_context_verify, &sig, &vchSig[0], vchSig.size())) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
/* libsecp256k1's ECDSA verification requires lower-S signatures, which have
|
/* libsecp256k1's ECDSA verification requires lower-S signatures, which have
|
||||||
* not historically been enforced in Bitcoin, so normalize them first. */
|
* not historically been enforced in Bitcoin or Zcash, so normalize them first. */
|
||||||
secp256k1_ecdsa_signature_normalize(secp256k1_context_verify, &sig, &sig);
|
secp256k1_ecdsa_signature_normalize(secp256k1_context_verify, &sig, &sig);
|
||||||
return secp256k1_ecdsa_verify(secp256k1_context_verify, &sig, hash.begin(), &pubkey);
|
return secp256k1_ecdsa_verify(secp256k1_context_verify, &sig, hash.begin(), &pubkey);
|
||||||
}
|
}
|
||||||
|
@ -277,7 +126,9 @@ bool CExtPubKey::Derive(CExtPubKey &out, unsigned int nChild) const {
|
||||||
|
|
||||||
/* static */ bool CPubKey::CheckLowS(const std::vector<unsigned char>& vchSig) {
|
/* static */ bool CPubKey::CheckLowS(const std::vector<unsigned char>& vchSig) {
|
||||||
secp256k1_ecdsa_signature sig;
|
secp256k1_ecdsa_signature sig;
|
||||||
if (!ecdsa_signature_parse_der_lax(secp256k1_context_verify, &sig, &vchSig[0], vchSig.size())) {
|
|
||||||
|
/* Zcash, unlike Bitcoin, has always enforced strict DER signatures. */
|
||||||
|
if (!secp256k1_ecdsa_signature_parse_der(secp256k1_context_verify, &sig, &vchSig[0], vchSig.size())) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
return (!secp256k1_ecdsa_signature_normalize(secp256k1_context_verify, NULL, &sig));
|
return (!secp256k1_ecdsa_signature_normalize(secp256k1_context_verify, NULL, &sig));
|
||||||
|
|
|
@ -191,7 +191,7 @@ bool static CheckSignatureEncoding(const valtype &vchSig, unsigned int flags, Sc
|
||||||
if (vchSig.size() == 0) {
|
if (vchSig.size() == 0) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
if ((flags & (SCRIPT_VERIFY_DERSIG | SCRIPT_VERIFY_LOW_S | SCRIPT_VERIFY_STRICTENC)) != 0 && !IsValidSignatureEncoding(vchSig)) {
|
if (!IsValidSignatureEncoding(vchSig)) {
|
||||||
return set_error(serror, SCRIPT_ERR_SIG_DER);
|
return set_error(serror, SCRIPT_ERR_SIG_DER);
|
||||||
} else if ((flags & SCRIPT_VERIFY_LOW_S) != 0 && !IsLowDERSignature(vchSig, serror)) {
|
} else if ((flags & SCRIPT_VERIFY_LOW_S) != 0 && !IsLowDERSignature(vchSig, serror)) {
|
||||||
// serror is set
|
// serror is set
|
||||||
|
|
|
@ -45,7 +45,8 @@ enum
|
||||||
SCRIPT_VERIFY_STRICTENC = (1U << 1),
|
SCRIPT_VERIFY_STRICTENC = (1U << 1),
|
||||||
|
|
||||||
// Passing a non-strict-DER signature to a checksig operation causes script failure (softfork safe, BIP62 rule 1)
|
// Passing a non-strict-DER signature to a checksig operation causes script failure (softfork safe, BIP62 rule 1)
|
||||||
SCRIPT_VERIFY_DERSIG = (1U << 2),
|
// In Zcash this is required, and validation of non-strict-DER signatures is not implemented.
|
||||||
|
//SCRIPT_VERIFY_DERSIG = (1U << 2),
|
||||||
|
|
||||||
// Passing a non-strict-DER signature or one with S > order/2 to a checksig operation causes script failure
|
// Passing a non-strict-DER signature or one with S > order/2 to a checksig operation causes script failure
|
||||||
// (softfork safe, BIP62 rule 5).
|
// (softfork safe, BIP62 rule 5).
|
||||||
|
|
|
@ -31,8 +31,7 @@ extern unsigned nMaxDatacarrierBytes;
|
||||||
/**
|
/**
|
||||||
* Mandatory script verification flags that all new blocks must comply with for
|
* Mandatory script verification flags that all new blocks must comply with for
|
||||||
* them to be valid. (but old blocks may not comply with) Currently just P2SH,
|
* them to be valid. (but old blocks may not comply with) Currently just P2SH,
|
||||||
* but in the future other flags may be added, such as a soft-fork to enforce
|
* but in the future other flags may be added.
|
||||||
* strict DER encoding.
|
|
||||||
*
|
*
|
||||||
* Failing one of these tests may trigger a DoS ban - see CheckInputs() for
|
* Failing one of these tests may trigger a DoS ban - see CheckInputs() for
|
||||||
* details.
|
* details.
|
||||||
|
@ -45,7 +44,7 @@ static const unsigned int MANDATORY_SCRIPT_VERIFY_FLAGS = SCRIPT_VERIFY_P2SH;
|
||||||
* blocks and we must accept those blocks.
|
* blocks and we must accept those blocks.
|
||||||
*/
|
*/
|
||||||
static const unsigned int STANDARD_SCRIPT_VERIFY_FLAGS = MANDATORY_SCRIPT_VERIFY_FLAGS |
|
static const unsigned int STANDARD_SCRIPT_VERIFY_FLAGS = MANDATORY_SCRIPT_VERIFY_FLAGS |
|
||||||
SCRIPT_VERIFY_DERSIG |
|
// SCRIPT_VERIFY_DERSIG is always enforced
|
||||||
SCRIPT_VERIFY_STRICTENC |
|
SCRIPT_VERIFY_STRICTENC |
|
||||||
SCRIPT_VERIFY_MINIMALDATA |
|
SCRIPT_VERIFY_MINIMALDATA |
|
||||||
SCRIPT_VERIFY_NULLDUMMY |
|
SCRIPT_VERIFY_NULLDUMMY |
|
||||||
|
|
|
@ -46,7 +46,6 @@ enum
|
||||||
{
|
{
|
||||||
zcashconsensus_SCRIPT_FLAGS_VERIFY_NONE = 0,
|
zcashconsensus_SCRIPT_FLAGS_VERIFY_NONE = 0,
|
||||||
zcashconsensus_SCRIPT_FLAGS_VERIFY_P2SH = (1U << 0), // evaluate P2SH (BIP16) subscripts
|
zcashconsensus_SCRIPT_FLAGS_VERIFY_P2SH = (1U << 0), // evaluate P2SH (BIP16) subscripts
|
||||||
zcashconsensus_SCRIPT_FLAGS_VERIFY_DERSIG = (1U << 2), // enforce strict DER (BIP66) compliance
|
|
||||||
zcashconsensus_SCRIPT_FLAGS_VERIFY_CHECKLOCKTIMEVERIFY = (1U << 9), // enable CHECKLOCKTIMEVERIFY (BIP65)
|
zcashconsensus_SCRIPT_FLAGS_VERIFY_CHECKLOCKTIMEVERIFY = (1U << 9), // enable CHECKLOCKTIMEVERIFY (BIP65)
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -523,14 +523,14 @@
|
||||||
],
|
],
|
||||||
|
|
||||||
["Increase DERSIG test coverage"],
|
["Increase DERSIG test coverage"],
|
||||||
["0x4a 0x0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "0 CHECKSIG NOT", "DERSIG", "Overly long signature is incorrectly encoded for DERSIG"],
|
["0x4a 0x0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "0 CHECKSIG NOT", "", "Overly long signature is incorrectly encoded"],
|
||||||
["0x25 0x30220220000000000000000000000000000000000000000000000000000000000000000000", "0 CHECKSIG NOT", "DERSIG", "Missing S is incorrectly encoded for DERSIG"],
|
["0x25 0x30220220000000000000000000000000000000000000000000000000000000000000000000", "0 CHECKSIG NOT", "", "Missing S is incorrectly encoded"],
|
||||||
["0x27 0x3024021077777777777777777777777777777777020a7777777777777777777777777777777701", "0 CHECKSIG NOT", "DERSIG", "S with invalid S length is incorrectly encoded for DERSIG"],
|
["0x27 0x3024021077777777777777777777777777777777020a7777777777777777777777777777777701", "0 CHECKSIG NOT", "", "S with invalid S length is incorrectly encoded"],
|
||||||
["0x27 0x302403107777777777777777777777777777777702107777777777777777777777777777777701", "0 CHECKSIG NOT", "DERSIG", "Non-integer R is incorrectly encoded for DERSIG"],
|
["0x27 0x302403107777777777777777777777777777777702107777777777777777777777777777777701", "0 CHECKSIG NOT", "", "Non-integer R is incorrectly encoded"],
|
||||||
["0x27 0x302402107777777777777777777777777777777703107777777777777777777777777777777701", "0 CHECKSIG NOT", "DERSIG", "Non-integer S is incorrectly encoded for DERSIG"],
|
["0x27 0x302402107777777777777777777777777777777703107777777777777777777777777777777701", "0 CHECKSIG NOT", "", "Non-integer S is incorrectly encoded"],
|
||||||
["0x17 0x3014020002107777777777777777777777777777777701", "0 CHECKSIG NOT", "DERSIG", "Zero-length R is incorrectly encoded for DERSIG"],
|
["0x17 0x3014020002107777777777777777777777777777777701", "0 CHECKSIG NOT", "", "Zero-length R is incorrectly encoded"],
|
||||||
["0x17 0x3014021077777777777777777777777777777777020001", "0 CHECKSIG NOT", "DERSIG", "Zero-length S is incorrectly encoded for DERSIG"],
|
["0x17 0x3014021077777777777777777777777777777777020001", "0 CHECKSIG NOT", "", "Zero-length S is incorrectly encoded"],
|
||||||
["0x27 0x302402107777777777777777777777777777777702108777777777777777777777777777777701", "0 CHECKSIG NOT", "DERSIG", "Negative S is incorrectly encoded for DERSIG"],
|
["0x27 0x302402107777777777777777777777777777777702108777777777777777777777777777777701", "0 CHECKSIG NOT", "", "Negative S is incorrectly encoded"],
|
||||||
|
|
||||||
["Automatically generated test cases"],
|
["Automatically generated test cases"],
|
||||||
[
|
[
|
||||||
|
@ -578,140 +578,98 @@
|
||||||
[
|
[
|
||||||
"0x47 0x304402200060558477337b9022e70534f1fea71a318caf836812465a2509931c5e7c4987022078ec32bd50ac9e03a349ba953dfd9fe1c8d2dd8bdb1d38ddca844d3d5c78c11801",
|
"0x47 0x304402200060558477337b9022e70534f1fea71a318caf836812465a2509931c5e7c4987022078ec32bd50ac9e03a349ba953dfd9fe1c8d2dd8bdb1d38ddca844d3d5c78c11801",
|
||||||
"0x21 0x038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508 CHECKSIG",
|
"0x21 0x038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508 CHECKSIG",
|
||||||
"DERSIG",
|
"",
|
||||||
"P2PK with too much R padding"
|
"P2PK with too much R padding"
|
||||||
],
|
],
|
||||||
[
|
[
|
||||||
"0x48 0x304502202de8c03fc525285c9c535631019a5f2af7c6454fa9eb392a3756a4917c420edd02210046130bf2baf7cfc065067c8b9e33a066d9c15edcea9feb0ca2d233e3597925b401",
|
"0x48 0x304502202de8c03fc525285c9c535631019a5f2af7c6454fa9eb392a3756a4917c420edd02210046130bf2baf7cfc065067c8b9e33a066d9c15edcea9feb0ca2d233e3597925b401",
|
||||||
"0x21 0x038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508 CHECKSIG",
|
"0x21 0x038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508 CHECKSIG",
|
||||||
"DERSIG",
|
"",
|
||||||
"P2PK with too much S padding"
|
"P2PK with too much S padding"
|
||||||
],
|
],
|
||||||
[
|
[
|
||||||
"0x47 0x30440220d7a0417c3f6d1a15094d1cf2a3378ca0503eb8a57630953a9e2987e21ddd0a6502207a6266d686c99090920249991d3d42065b6d43eb70187b219c0db82e4f94d1a201",
|
"0x47 0x30440220d7a0417c3f6d1a15094d1cf2a3378ca0503eb8a57630953a9e2987e21ddd0a6502207a6266d686c99090920249991d3d42065b6d43eb70187b219c0db82e4f94d1a201",
|
||||||
"0x21 0x038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508 CHECKSIG",
|
"0x21 0x038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508 CHECKSIG",
|
||||||
"DERSIG",
|
"",
|
||||||
"P2PK with too little R padding"
|
"P2PK with too little R padding"
|
||||||
],
|
],
|
||||||
[
|
[
|
||||||
"0x47 0x30440220005ece1335e7f757a1a1f476a7fb5bd90964e8a022489f890614a04acfb734c002206c12b8294a6513c7710e8c82d3c23d75cdbfe83200eb7efb495701958501a5d601",
|
"0x47 0x30440220005ece1335e7f757a1a1f476a7fb5bd90964e8a022489f890614a04acfb734c002206c12b8294a6513c7710e8c82d3c23d75cdbfe83200eb7efb495701958501a5d601",
|
||||||
"0x21 0x03363d90d447b00c9c99ceac05b6262ee053441c7e55552ffe526bad8f83ff4640 CHECKSIG NOT",
|
"0x21 0x03363d90d447b00c9c99ceac05b6262ee053441c7e55552ffe526bad8f83ff4640 CHECKSIG NOT",
|
||||||
"DERSIG",
|
"",
|
||||||
"P2PK NOT with bad sig with too much R padding"
|
"P2PK NOT with bad sig with too much R padding"
|
||||||
],
|
],
|
||||||
[
|
[
|
||||||
"0x47 0x30440220005ece1335e7f657a1a1f476a7fb5bd90964e8a022489f890614a04acfb734c002206c12b8294a6513c7710e8c82d3c23d75cdbfe83200eb7efb495701958501a5d601",
|
"0x47 0x30440220005ece1335e7f657a1a1f476a7fb5bd90964e8a022489f890614a04acfb734c002206c12b8294a6513c7710e8c82d3c23d75cdbfe83200eb7efb495701958501a5d601",
|
||||||
"0x21 0x03363d90d447b00c9c99ceac05b6262ee053441c7e55552ffe526bad8f83ff4640 CHECKSIG NOT",
|
"0x21 0x03363d90d447b00c9c99ceac05b6262ee053441c7e55552ffe526bad8f83ff4640 CHECKSIG NOT",
|
||||||
"",
|
"",
|
||||||
"P2PK NOT with too much R padding but no DERSIG"
|
|
||||||
],
|
|
||||||
[
|
|
||||||
"0x47 0x30440220005ece1335e7f657a1a1f476a7fb5bd90964e8a022489f890614a04acfb734c002206c12b8294a6513c7710e8c82d3c23d75cdbfe83200eb7efb495701958501a5d601",
|
|
||||||
"0x21 0x03363d90d447b00c9c99ceac05b6262ee053441c7e55552ffe526bad8f83ff4640 CHECKSIG NOT",
|
|
||||||
"DERSIG",
|
|
||||||
"P2PK NOT with too much R padding"
|
"P2PK NOT with too much R padding"
|
||||||
],
|
],
|
||||||
[
|
[
|
||||||
"0x47 0x30440220d7a0417c3f6d1a15094d1cf2a3378ca0503eb8a57630953a9e2987e21ddd0a6502207a6266d686c99090920249991d3d42065b6d43eb70187b219c0db82e4f94d1a201",
|
"0x47 0x30440220d7a0417c3f6d1a15094d1cf2a3378ca0503eb8a57630953a9e2987e21ddd0a6502207a6266d686c99090920249991d3d42065b6d43eb70187b219c0db82e4f94d1a201",
|
||||||
"0x21 0x038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508 CHECKSIG",
|
"0x21 0x038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508 CHECKSIG",
|
||||||
"DERSIG",
|
"",
|
||||||
"BIP66 example 1, with DERSIG"
|
"BIP66 example 1"
|
||||||
],
|
],
|
||||||
[
|
[
|
||||||
"0x47 0x304402208e43c0b91f7c1e5bc58e41c8185f8a6086e111b0090187968a86f2822462d3c902200a58f4076b1133b18ff1dc83ee51676e44c60cc608d9534e0df5ace0424fc0be01",
|
"0x47 0x304402208e43c0b91f7c1e5bc58e41c8185f8a6086e111b0090187968a86f2822462d3c902200a58f4076b1133b18ff1dc83ee51676e44c60cc608d9534e0df5ace0424fc0be01",
|
||||||
"0x21 0x038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508 CHECKSIG NOT",
|
"0x21 0x038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508 CHECKSIG NOT",
|
||||||
"",
|
"",
|
||||||
"BIP66 example 2, without DERSIG"
|
"BIP66 example 2"
|
||||||
],
|
|
||||||
[
|
|
||||||
"0x47 0x304402208e43c0b91f7c1e5bc58e41c8185f8a6086e111b0090187968a86f2822462d3c902200a58f4076b1133b18ff1dc83ee51676e44c60cc608d9534e0df5ace0424fc0be01",
|
|
||||||
"0x21 0x038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508 CHECKSIG NOT",
|
|
||||||
"DERSIG",
|
|
||||||
"BIP66 example 2, with DERSIG"
|
|
||||||
],
|
],
|
||||||
[
|
[
|
||||||
"0",
|
"0",
|
||||||
"0x21 0x038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508 CHECKSIG",
|
"0x21 0x038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508 CHECKSIG",
|
||||||
"",
|
"",
|
||||||
"BIP66 example 3, without DERSIG"
|
"BIP66 example 3"
|
||||||
],
|
|
||||||
[
|
|
||||||
"0",
|
|
||||||
"0x21 0x038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508 CHECKSIG",
|
|
||||||
"DERSIG",
|
|
||||||
"BIP66 example 3, with DERSIG"
|
|
||||||
],
|
],
|
||||||
[
|
[
|
||||||
"1",
|
"1",
|
||||||
"0x21 0x038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508 CHECKSIG",
|
"0x21 0x038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508 CHECKSIG",
|
||||||
"",
|
"",
|
||||||
"BIP66 example 5, without DERSIG"
|
"BIP66 example 5"
|
||||||
],
|
|
||||||
[
|
|
||||||
"1",
|
|
||||||
"0x21 0x038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508 CHECKSIG",
|
|
||||||
"DERSIG",
|
|
||||||
"BIP66 example 5, with DERSIG"
|
|
||||||
],
|
],
|
||||||
[
|
[
|
||||||
"1",
|
"1",
|
||||||
"0x21 0x038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508 CHECKSIG NOT",
|
"0x21 0x038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508 CHECKSIG NOT",
|
||||||
"DERSIG",
|
"",
|
||||||
"BIP66 example 6, with DERSIG"
|
"BIP66 example 6"
|
||||||
],
|
],
|
||||||
[
|
[
|
||||||
"0 0x47 0x30440220cae00b1444babfbf6071b0ba8707f6bd373da3df494d6e74119b0430c5db810502205d5231b8c5939c8ff0c82242656d6e06edb073d42af336c99fe8837c36ea39d501 0x47 0x3044022027c2714269ca5aeecc4d70edc88ba5ee0e3da4986e9216028f489ab4f1b8efce022022bd545b4951215267e4c5ceabd4c5350331b2e4a0b6494c56f361fa5a57a1a201",
|
"0 0x47 0x30440220cae00b1444babfbf6071b0ba8707f6bd373da3df494d6e74119b0430c5db810502205d5231b8c5939c8ff0c82242656d6e06edb073d42af336c99fe8837c36ea39d501 0x47 0x3044022027c2714269ca5aeecc4d70edc88ba5ee0e3da4986e9216028f489ab4f1b8efce022022bd545b4951215267e4c5ceabd4c5350331b2e4a0b6494c56f361fa5a57a1a201",
|
||||||
"2 0x21 0x038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508 0x21 0x03363d90d447b00c9c99ceac05b6262ee053441c7e55552ffe526bad8f83ff4640 2 CHECKMULTISIG",
|
"2 0x21 0x038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508 0x21 0x03363d90d447b00c9c99ceac05b6262ee053441c7e55552ffe526bad8f83ff4640 2 CHECKMULTISIG",
|
||||||
"DERSIG",
|
"",
|
||||||
"BIP66 example 7, with DERSIG"
|
"BIP66 example 7"
|
||||||
],
|
],
|
||||||
[
|
[
|
||||||
"0 0x47 0x30440220b119d67d389315308d1745f734a51ff3ec72e06081e84e236fdf9dc2f5d2a64802204b04e3bc38674c4422ea317231d642b56dc09d214a1ecbbf16ecca01ed996e2201 0x47 0x3044022079ea80afd538d9ada421b5101febeb6bc874e01dde5bca108c1d0479aec339a4022004576db8f66130d1df686ccf00935703689d69cf539438da1edab208b0d63c4801",
|
"0 0x47 0x30440220b119d67d389315308d1745f734a51ff3ec72e06081e84e236fdf9dc2f5d2a64802204b04e3bc38674c4422ea317231d642b56dc09d214a1ecbbf16ecca01ed996e2201 0x47 0x3044022079ea80afd538d9ada421b5101febeb6bc874e01dde5bca108c1d0479aec339a4022004576db8f66130d1df686ccf00935703689d69cf539438da1edab208b0d63c4801",
|
||||||
"2 0x21 0x038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508 0x21 0x03363d90d447b00c9c99ceac05b6262ee053441c7e55552ffe526bad8f83ff4640 2 CHECKMULTISIG NOT",
|
"2 0x21 0x038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508 0x21 0x03363d90d447b00c9c99ceac05b6262ee053441c7e55552ffe526bad8f83ff4640 2 CHECKMULTISIG NOT",
|
||||||
"",
|
"",
|
||||||
"BIP66 example 8, without DERSIG"
|
"BIP66 example 8"
|
||||||
],
|
|
||||||
[
|
|
||||||
"0 0x47 0x30440220b119d67d389315308d1745f734a51ff3ec72e06081e84e236fdf9dc2f5d2a64802204b04e3bc38674c4422ea317231d642b56dc09d214a1ecbbf16ecca01ed996e2201 0x47 0x3044022079ea80afd538d9ada421b5101febeb6bc874e01dde5bca108c1d0479aec339a4022004576db8f66130d1df686ccf00935703689d69cf539438da1edab208b0d63c4801",
|
|
||||||
"2 0x21 0x038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508 0x21 0x03363d90d447b00c9c99ceac05b6262ee053441c7e55552ffe526bad8f83ff4640 2 CHECKMULTISIG NOT",
|
|
||||||
"DERSIG",
|
|
||||||
"BIP66 example 8, with DERSIG"
|
|
||||||
],
|
],
|
||||||
[
|
[
|
||||||
"0 0 0x47 0x3044022081aa9d436f2154e8b6d600516db03d78de71df685b585a9807ead4210bd883490220534bb6bdf318a419ac0749660b60e78d17d515558ef369bf872eff405b676b2e01",
|
"0 0 0x47 0x3044022081aa9d436f2154e8b6d600516db03d78de71df685b585a9807ead4210bd883490220534bb6bdf318a419ac0749660b60e78d17d515558ef369bf872eff405b676b2e01",
|
||||||
"2 0x21 0x038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508 0x21 0x03363d90d447b00c9c99ceac05b6262ee053441c7e55552ffe526bad8f83ff4640 2 CHECKMULTISIG",
|
"2 0x21 0x038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508 0x21 0x03363d90d447b00c9c99ceac05b6262ee053441c7e55552ffe526bad8f83ff4640 2 CHECKMULTISIG",
|
||||||
"",
|
"",
|
||||||
"BIP66 example 9, without DERSIG"
|
"BIP66 example 9"
|
||||||
],
|
|
||||||
[
|
|
||||||
"0 0 0x47 0x3044022081aa9d436f2154e8b6d600516db03d78de71df685b585a9807ead4210bd883490220534bb6bdf318a419ac0749660b60e78d17d515558ef369bf872eff405b676b2e01",
|
|
||||||
"2 0x21 0x038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508 0x21 0x03363d90d447b00c9c99ceac05b6262ee053441c7e55552ffe526bad8f83ff4640 2 CHECKMULTISIG",
|
|
||||||
"DERSIG",
|
|
||||||
"BIP66 example 9, with DERSIG"
|
|
||||||
],
|
],
|
||||||
[
|
[
|
||||||
"0 0 0x47 0x30440220da6f441dc3b4b2c84cfa8db0cd5b34ed92c9e01686de5a800d40498b70c0dcac02207c2cf91b0c32b860c4cd4994be36cfb84caf8bb7c3a8e4d96a31b2022c5299c501",
|
"0 0 0x47 0x30440220da6f441dc3b4b2c84cfa8db0cd5b34ed92c9e01686de5a800d40498b70c0dcac02207c2cf91b0c32b860c4cd4994be36cfb84caf8bb7c3a8e4d96a31b2022c5299c501",
|
||||||
"2 0x21 0x038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508 0x21 0x03363d90d447b00c9c99ceac05b6262ee053441c7e55552ffe526bad8f83ff4640 2 CHECKMULTISIG NOT",
|
"2 0x21 0x038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508 0x21 0x03363d90d447b00c9c99ceac05b6262ee053441c7e55552ffe526bad8f83ff4640 2 CHECKMULTISIG NOT",
|
||||||
"DERSIG",
|
"",
|
||||||
"BIP66 example 10, with DERSIG"
|
"BIP66 example 10"
|
||||||
],
|
],
|
||||||
[
|
[
|
||||||
"0 0x47 0x30440220cae00b1444babfbf6071b0ba8707f6bd373da3df494d6e74119b0430c5db810502205d5231b8c5939c8ff0c82242656d6e06edb073d42af336c99fe8837c36ea39d501 0",
|
"0 0x47 0x30440220cae00b1444babfbf6071b0ba8707f6bd373da3df494d6e74119b0430c5db810502205d5231b8c5939c8ff0c82242656d6e06edb073d42af336c99fe8837c36ea39d501 0",
|
||||||
"2 0x21 0x038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508 0x21 0x03363d90d447b00c9c99ceac05b6262ee053441c7e55552ffe526bad8f83ff4640 2 CHECKMULTISIG",
|
"2 0x21 0x038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508 0x21 0x03363d90d447b00c9c99ceac05b6262ee053441c7e55552ffe526bad8f83ff4640 2 CHECKMULTISIG",
|
||||||
"",
|
"",
|
||||||
"BIP66 example 11, without DERSIG"
|
"BIP66 example 11"
|
||||||
],
|
|
||||||
[
|
|
||||||
"0 0x47 0x30440220cae00b1444babfbf6071b0ba8707f6bd373da3df494d6e74119b0430c5db810502205d5231b8c5939c8ff0c82242656d6e06edb073d42af336c99fe8837c36ea39d501 0",
|
|
||||||
"2 0x21 0x038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508 0x21 0x03363d90d447b00c9c99ceac05b6262ee053441c7e55552ffe526bad8f83ff4640 2 CHECKMULTISIG",
|
|
||||||
"DERSIG",
|
|
||||||
"BIP66 example 11, with DERSIG"
|
|
||||||
],
|
],
|
||||||
[
|
[
|
||||||
"0x48 0x304402203e4516da7253cf068effec6b95c41221c0cf3a8e6ccb8cbf1725b562e9afde2c022054e1c258c2981cdfba5df1f46661fb6541c44f77ca0092f3600331abfffb12510101",
|
"0x48 0x304402203e4516da7253cf068effec6b95c41221c0cf3a8e6ccb8cbf1725b562e9afde2c022054e1c258c2981cdfba5df1f46661fb6541c44f77ca0092f3600331abfffb12510101",
|
||||||
"0x21 0x03363d90d447b00c9c99ceac05b6262ee053441c7e55552ffe526bad8f83ff4640 CHECKSIG",
|
"0x21 0x03363d90d447b00c9c99ceac05b6262ee053441c7e55552ffe526bad8f83ff4640 CHECKSIG",
|
||||||
"DERSIG",
|
"",
|
||||||
"P2PK with multi-byte hashtype, with DERSIG"
|
"P2PK with multi-byte hashtype"
|
||||||
],
|
],
|
||||||
[
|
[
|
||||||
"0x48 0x304502203e4516da7253cf068effec6b95c41221c0cf3a8e6ccb8cbf1725b562e9afde2c022100ab1e3da73d67e32045a20e0b999e049978ea8d6ee5480d485fcf2ce0d03b2ef001",
|
"0x48 0x304502203e4516da7253cf068effec6b95c41221c0cf3a8e6ccb8cbf1725b562e9afde2c022100ab1e3da73d67e32045a20e0b999e049978ea8d6ee5480d485fcf2ce0d03b2ef001",
|
||||||
|
|
|
@ -690,16 +690,6 @@
|
||||||
"2-of-2 CHECKMULTISIG NOT with both pubkeys valid, but second signature invalid. Valid pubkey fails, and CHECKMULTISIG exits early, prior to evaluation of second invalid signature."
|
"2-of-2 CHECKMULTISIG NOT with both pubkeys valid, but second signature invalid. Valid pubkey fails, and CHECKMULTISIG exits early, prior to evaluation of second invalid signature."
|
||||||
],
|
],
|
||||||
|
|
||||||
["Increase test coverage for DERSIG"],
|
|
||||||
["0x4a 0x0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "0 CHECKSIG NOT", "", "Overly long signature is correctly encoded"],
|
|
||||||
["0x25 0x30220220000000000000000000000000000000000000000000000000000000000000000000", "0 CHECKSIG NOT", "", "Missing S is correctly encoded"],
|
|
||||||
["0x27 0x3024021077777777777777777777777777777777020a7777777777777777777777777777777701", "0 CHECKSIG NOT", "", "S with invalid S length is correctly encoded"],
|
|
||||||
["0x27 0x302403107777777777777777777777777777777702107777777777777777777777777777777701", "0 CHECKSIG NOT", "", "Non-integer R is correctly encoded"],
|
|
||||||
["0x27 0x302402107777777777777777777777777777777703107777777777777777777777777777777701", "0 CHECKSIG NOT", "", "Non-integer S is correctly encoded"],
|
|
||||||
["0x17 0x3014020002107777777777777777777777777777777701", "0 CHECKSIG NOT", "", "Zero-length R is correctly encoded"],
|
|
||||||
["0x17 0x3014021077777777777777777777777777777777020001", "0 CHECKSIG NOT", "", "Zero-length S is correctly encoded for DERSIG"],
|
|
||||||
["0x27 0x302402107777777777777777777777777777777702108777777777777777777777777777777701", "0 CHECKSIG NOT", "", "Negative S is correctly encoded"],
|
|
||||||
|
|
||||||
["Automatically generated test cases"],
|
["Automatically generated test cases"],
|
||||||
[
|
[
|
||||||
"0x47 0x304402200a5c6163f07b8d3b013c4d1d6dba25e780b39658d79ba37af7057a3b7f15ffa102201fd9b4eaa9943f734928b99a83592c2e7bf342ea2680f6a2bb705167966b742001",
|
"0x47 0x304402200a5c6163f07b8d3b013c4d1d6dba25e780b39658d79ba37af7057a3b7f15ffa102201fd9b4eaa9943f734928b99a83592c2e7bf342ea2680f6a2bb705167966b742001",
|
||||||
|
@ -743,83 +733,17 @@
|
||||||
"P2SH",
|
"P2SH",
|
||||||
"P2SH(2-of-3)"
|
"P2SH(2-of-3)"
|
||||||
],
|
],
|
||||||
[
|
|
||||||
"0x47 0x304402200060558477337b9022e70534f1fea71a318caf836812465a2509931c5e7c4987022078ec32bd50ac9e03a349ba953dfd9fe1c8d2dd8bdb1d38ddca844d3d5c78c11801",
|
|
||||||
"0x21 0x038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508 CHECKSIG",
|
|
||||||
"",
|
|
||||||
"P2PK with too much R padding but no DERSIG"
|
|
||||||
],
|
|
||||||
[
|
|
||||||
"0x48 0x304502202de8c03fc525285c9c535631019a5f2af7c6454fa9eb392a3756a4917c420edd02210046130bf2baf7cfc065067c8b9e33a066d9c15edcea9feb0ca2d233e3597925b401",
|
|
||||||
"0x21 0x038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508 CHECKSIG",
|
|
||||||
"",
|
|
||||||
"P2PK with too much S padding but no DERSIG"
|
|
||||||
],
|
|
||||||
[
|
|
||||||
"0x47 0x30440220d7a0417c3f6d1a15094d1cf2a3378ca0503eb8a57630953a9e2987e21ddd0a6502207a6266d686c99090920249991d3d42065b6d43eb70187b219c0db82e4f94d1a201",
|
|
||||||
"0x21 0x038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508 CHECKSIG",
|
|
||||||
"",
|
|
||||||
"P2PK with too little R padding but no DERSIG"
|
|
||||||
],
|
|
||||||
[
|
|
||||||
"0x47 0x30440220005ece1335e7f757a1a1f476a7fb5bd90964e8a022489f890614a04acfb734c002206c12b8294a6513c7710e8c82d3c23d75cdbfe83200eb7efb495701958501a5d601",
|
|
||||||
"0x21 0x03363d90d447b00c9c99ceac05b6262ee053441c7e55552ffe526bad8f83ff4640 CHECKSIG NOT",
|
|
||||||
"",
|
|
||||||
"P2PK NOT with bad sig with too much R padding but no DERSIG"
|
|
||||||
],
|
|
||||||
[
|
|
||||||
"0x47 0x30440220d7a0417c3f6d1a15094d1cf2a3378ca0503eb8a57630953a9e2987e21ddd0a6502207a6266d686c99090920249991d3d42065b6d43eb70187b219c0db82e4f94d1a201",
|
|
||||||
"0x21 0x038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508 CHECKSIG",
|
|
||||||
"",
|
|
||||||
"BIP66 example 1, without DERSIG"
|
|
||||||
],
|
|
||||||
[
|
[
|
||||||
"0",
|
"0",
|
||||||
"0x21 0x038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508 CHECKSIG NOT",
|
"0x21 0x038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508 CHECKSIG NOT",
|
||||||
"",
|
"",
|
||||||
"BIP66 example 4, without DERSIG"
|
"BIP66 example 4"
|
||||||
],
|
|
||||||
[
|
|
||||||
"0",
|
|
||||||
"0x21 0x038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508 CHECKSIG NOT",
|
|
||||||
"DERSIG",
|
|
||||||
"BIP66 example 4, with DERSIG"
|
|
||||||
],
|
|
||||||
[
|
|
||||||
"1",
|
|
||||||
"0x21 0x038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508 CHECKSIG NOT",
|
|
||||||
"",
|
|
||||||
"BIP66 example 6, without DERSIG"
|
|
||||||
],
|
|
||||||
[
|
|
||||||
"0 0x47 0x30440220cae00b1444babfbf6071b0ba8707f6bd373da3df494d6e74119b0430c5db810502205d5231b8c5939c8ff0c82242656d6e06edb073d42af336c99fe8837c36ea39d501 0x47 0x3044022027c2714269ca5aeecc4d70edc88ba5ee0e3da4986e9216028f489ab4f1b8efce022022bd545b4951215267e4c5ceabd4c5350331b2e4a0b6494c56f361fa5a57a1a201",
|
|
||||||
"2 0x21 0x038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508 0x21 0x03363d90d447b00c9c99ceac05b6262ee053441c7e55552ffe526bad8f83ff4640 2 CHECKMULTISIG",
|
|
||||||
"",
|
|
||||||
"BIP66 example 7, without DERSIG"
|
|
||||||
],
|
|
||||||
[
|
|
||||||
"0 0 0x47 0x30440220da6f441dc3b4b2c84cfa8db0cd5b34ed92c9e01686de5a800d40498b70c0dcac02207c2cf91b0c32b860c4cd4994be36cfb84caf8bb7c3a8e4d96a31b2022c5299c501",
|
|
||||||
"2 0x21 0x038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508 0x21 0x03363d90d447b00c9c99ceac05b6262ee053441c7e55552ffe526bad8f83ff4640 2 CHECKMULTISIG NOT",
|
|
||||||
"",
|
|
||||||
"BIP66 example 10, without DERSIG"
|
|
||||||
],
|
],
|
||||||
[
|
[
|
||||||
"0 0x47 0x30440220b119d67d389315308d1745f734a51ff3ec72e06081e84e236fdf9dc2f5d2a64802204b04e3bc38674c4422ea317231d642b56dc09d214a1ecbbf16ecca01ed996e2201 0",
|
"0 0x47 0x30440220b119d67d389315308d1745f734a51ff3ec72e06081e84e236fdf9dc2f5d2a64802204b04e3bc38674c4422ea317231d642b56dc09d214a1ecbbf16ecca01ed996e2201 0",
|
||||||
"2 0x21 0x038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508 0x21 0x03363d90d447b00c9c99ceac05b6262ee053441c7e55552ffe526bad8f83ff4640 2 CHECKMULTISIG NOT",
|
"2 0x21 0x038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508 0x21 0x03363d90d447b00c9c99ceac05b6262ee053441c7e55552ffe526bad8f83ff4640 2 CHECKMULTISIG NOT",
|
||||||
"",
|
"",
|
||||||
"BIP66 example 12, without DERSIG"
|
"BIP66 example 12"
|
||||||
],
|
|
||||||
[
|
|
||||||
"0 0x47 0x30440220b119d67d389315308d1745f734a51ff3ec72e06081e84e236fdf9dc2f5d2a64802204b04e3bc38674c4422ea317231d642b56dc09d214a1ecbbf16ecca01ed996e2201 0",
|
|
||||||
"2 0x21 0x038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508 0x21 0x03363d90d447b00c9c99ceac05b6262ee053441c7e55552ffe526bad8f83ff4640 2 CHECKMULTISIG NOT",
|
|
||||||
"DERSIG",
|
|
||||||
"BIP66 example 12, with DERSIG"
|
|
||||||
],
|
|
||||||
[
|
|
||||||
"0x48 0x304402203e4516da7253cf068effec6b95c41221c0cf3a8e6ccb8cbf1725b562e9afde2c022054e1c258c2981cdfba5df1f46661fb6541c44f77ca0092f3600331abfffb12510101",
|
|
||||||
"0x21 0x03363d90d447b00c9c99ceac05b6262ee053441c7e55552ffe526bad8f83ff4640 CHECKSIG",
|
|
||||||
"",
|
|
||||||
"P2PK with multi-byte hashtype, without DERSIG"
|
|
||||||
],
|
],
|
||||||
[
|
[
|
||||||
"0x48 0x304502203e4516da7253cf068effec6b95c41221c0cf3a8e6ccb8cbf1725b562e9afde2c022100ab1e3da73d67e32045a20e0b999e049978ea8d6ee5480d485fcf2ce0d03b2ef001",
|
"0x48 0x304502203e4516da7253cf068effec6b95c41221c0cf3a8e6ccb8cbf1725b562e9afde2c022100ab1e3da73d67e32045a20e0b999e049978ea8d6ee5480d485fcf2ce0d03b2ef001",
|
||||||
|
|
|
@ -86,12 +86,43 @@
|
||||||
[[["b3da01dd4aae683c7aee4d5d8b52a540a508e1115f77cd7fa9a291243f501223", 0, "HASH160 0x14 0xb1ce99298d5f07364b57b1e5c9cc00be0b04a954 EQUAL"]],
|
[[["b3da01dd4aae683c7aee4d5d8b52a540a508e1115f77cd7fa9a291243f501223", 0, "HASH160 0x14 0xb1ce99298d5f07364b57b1e5c9cc00be0b04a954 EQUAL"]],
|
||||||
"01000000012312503f2491a2a97fcd775f11e108a540a5528b5d4dee7a3c68ae4add01dab300000000fdfe000048304502207aacee820e08b0b174e248abd8d7a34ed63b5da3abedb99934df9fddd65c05c4022100dfe87896ab5ee3df476c2655f9fbe5bd089dccbef3e4ea05b5d121169fe7f5f401483045022100f6649b0eddfdfd4ad55426663385090d51ee86c3481bdc6b0c18ea6c0ece2c0b0220561c315b07cffa6f7dd9df96dbae9200c2dee09bf93cc35ca05e6cdf613340aa014c695221031d11db38972b712a9fe1fc023577c7ae3ddb4a3004187d41c45121eecfdbb5b7210207ec36911b6ad2382860d32989c7b8728e9489d7bbc94a6b5509ef0029be128821024ea9fac06f666a4adc3fc1357b7bec1fd0bdece2b9d08579226a8ebde53058e453aeffffffff0180380100000000001976a914c9b99cddf847d10685a4fabaa0baf505f7c3dfab88ac00000000", "P2SH"],
|
"01000000012312503f2491a2a97fcd775f11e108a540a5528b5d4dee7a3c68ae4add01dab300000000fdfe000048304502207aacee820e08b0b174e248abd8d7a34ed63b5da3abedb99934df9fddd65c05c4022100dfe87896ab5ee3df476c2655f9fbe5bd089dccbef3e4ea05b5d121169fe7f5f401483045022100f6649b0eddfdfd4ad55426663385090d51ee86c3481bdc6b0c18ea6c0ece2c0b0220561c315b07cffa6f7dd9df96dbae9200c2dee09bf93cc35ca05e6cdf613340aa014c695221031d11db38972b712a9fe1fc023577c7ae3ddb4a3004187d41c45121eecfdbb5b7210207ec36911b6ad2382860d32989c7b8728e9489d7bbc94a6b5509ef0029be128821024ea9fac06f666a4adc3fc1357b7bec1fd0bdece2b9d08579226a8ebde53058e453aeffffffff0180380100000000001976a914c9b99cddf847d10685a4fabaa0baf505f7c3dfab88ac00000000", "P2SH"],
|
||||||
|
|
||||||
|
["The following is 23b397edccd3740a74adb603c9756370fafcde9bcc4483eb271ecad09a94dd63"],
|
||||||
|
["It is of particular interest because it contains an invalidly-encoded signature which OpenSSL accepts"],
|
||||||
|
["See http://r6.ca/blog/20111119T211504Z.html"],
|
||||||
|
["It is also the first OP_CHECKMULTISIG transaction on the Bitcoin block chain in standard form"],
|
||||||
|
[[["60a20bd93aa49ab4b28d514ec10b06e1829ce6818ec06cd3aabd013ebcdc4bb1", 0, "1 0x41 0x04cc71eb30d653c0c3163990c47b976f3fb3f37cccdcbedb169a1dfef58bbfbfaff7d8a473e7e2e6d317b87bafe8bde97e3cf8f065dec022b51d11fcdd0d348ac4 0x41 0x0461cbdcc5409fb4b4d42b51d33381354d80e550078cb532a34bfa2fcfdeb7d76519aecc62770f5b0e4ef8551946d8a540911abe3e7854a26f39f58b25c15342af 2 OP_CHECKMULTISIG"]],
|
||||||
|
"0100000001b14bdcbc3e01bdaad36cc08e81e69c82e1060bc14e518db2b49aa43ad90ba26000000000490047304402203f16c6f40162ab686621ef3000b04e75418a0c0cb2d8aebeac894ae360ac1e780220ddc15ecdfc3507ac48e1681a33eb60996631bf6bf5bc0a0682c4db743ce7ca2b01ffffffff0140420f00000000001976a914660d4ef3a743e3e696ad990364e555c271ad504b88ac00000000", "P2SH"],
|
||||||
|
|
||||||
|
["The following is a tweaked form of 23b397edccd3740a74adb603c9756370fafcde9bcc4483eb271ecad09a94dd63"],
|
||||||
|
["It is an OP_CHECKMULTISIG with an arbitrary extra byte stuffed into the signature at pos length - 2"],
|
||||||
|
["The dummy byte is fine however, so the NULLDUMMY flag should be happy"],
|
||||||
|
[[["60a20bd93aa49ab4b28d514ec10b06e1829ce6818ec06cd3aabd013ebcdc4bb1", 0, "1 0x41 0x04cc71eb30d653c0c3163990c47b976f3fb3f37cccdcbedb169a1dfef58bbfbfaff7d8a473e7e2e6d317b87bafe8bde97e3cf8f065dec022b51d11fcdd0d348ac4 0x41 0x0461cbdcc5409fb4b4d42b51d33381354d80e550078cb532a34bfa2fcfdeb7d76519aecc62770f5b0e4ef8551946d8a540911abe3e7854a26f39f58b25c15342af 2 OP_CHECKMULTISIG"]],
|
||||||
|
"0100000001b14bdcbc3e01bdaad36cc08e81e69c82e1060bc14e518db2b49aa43ad90ba260000000004a0048304402203f16c6f40162ab686621ef3000b04e75418a0c0cb2d8aebeac894ae360ac1e780220ddc15ecdfc3507ac48e1681a33eb60996631bf6bf5bc0a0682c4db743ce7ca2bab01ffffffff0140420f00000000001976a914660d4ef3a743e3e696ad990364e555c271ad504b88ac00000000", "P2SH,NULLDUMMY"],
|
||||||
|
|
||||||
|
["The following is a tweaked form of 23b397edccd3740a74adb603c9756370fafcde9bcc4483eb271ecad09a94dd63"],
|
||||||
|
["It is an OP_CHECKMULTISIG with the dummy value set to something other than an empty string"],
|
||||||
|
[[["60a20bd93aa49ab4b28d514ec10b06e1829ce6818ec06cd3aabd013ebcdc4bb1", 0, "1 0x41 0x04cc71eb30d653c0c3163990c47b976f3fb3f37cccdcbedb169a1dfef58bbfbfaff7d8a473e7e2e6d317b87bafe8bde97e3cf8f065dec022b51d11fcdd0d348ac4 0x41 0x0461cbdcc5409fb4b4d42b51d33381354d80e550078cb532a34bfa2fcfdeb7d76519aecc62770f5b0e4ef8551946d8a540911abe3e7854a26f39f58b25c15342af 2 OP_CHECKMULTISIG"]],
|
||||||
|
"0100000001b14bdcbc3e01bdaad36cc08e81e69c82e1060bc14e518db2b49aa43ad90ba260000000004a01ff47304402203f16c6f40162ab686621ef3000b04e75418a0c0cb2d8aebeac894ae360ac1e780220ddc15ecdfc3507ac48e1681a33eb60996631bf6bf5bc0a0682c4db743ce7ca2b01ffffffff0140420f00000000001976a914660d4ef3a743e3e696ad990364e555c271ad504b88ac00000000", "P2SH"],
|
||||||
|
|
||||||
|
["As above, but using a OP_1"],
|
||||||
|
[[["60a20bd93aa49ab4b28d514ec10b06e1829ce6818ec06cd3aabd013ebcdc4bb1", 0, "1 0x41 0x04cc71eb30d653c0c3163990c47b976f3fb3f37cccdcbedb169a1dfef58bbfbfaff7d8a473e7e2e6d317b87bafe8bde97e3cf8f065dec022b51d11fcdd0d348ac4 0x41 0x0461cbdcc5409fb4b4d42b51d33381354d80e550078cb532a34bfa2fcfdeb7d76519aecc62770f5b0e4ef8551946d8a540911abe3e7854a26f39f58b25c15342af 2 OP_CHECKMULTISIG"]],
|
||||||
|
"0100000001b14bdcbc3e01bdaad36cc08e81e69c82e1060bc14e518db2b49aa43ad90ba26000000000495147304402203f16c6f40162ab686621ef3000b04e75418a0c0cb2d8aebeac894ae360ac1e780220ddc15ecdfc3507ac48e1681a33eb60996631bf6bf5bc0a0682c4db743ce7ca2b01ffffffff0140420f00000000001976a914660d4ef3a743e3e696ad990364e555c271ad504b88ac00000000", "P2SH"],
|
||||||
|
|
||||||
|
["As above, but using a OP_1NEGATE"],
|
||||||
|
[[["60a20bd93aa49ab4b28d514ec10b06e1829ce6818ec06cd3aabd013ebcdc4bb1", 0, "1 0x41 0x04cc71eb30d653c0c3163990c47b976f3fb3f37cccdcbedb169a1dfef58bbfbfaff7d8a473e7e2e6d317b87bafe8bde97e3cf8f065dec022b51d11fcdd0d348ac4 0x41 0x0461cbdcc5409fb4b4d42b51d33381354d80e550078cb532a34bfa2fcfdeb7d76519aecc62770f5b0e4ef8551946d8a540911abe3e7854a26f39f58b25c15342af 2 OP_CHECKMULTISIG"]],
|
||||||
|
"0100000001b14bdcbc3e01bdaad36cc08e81e69c82e1060bc14e518db2b49aa43ad90ba26000000000494f47304402203f16c6f40162ab686621ef3000b04e75418a0c0cb2d8aebeac894ae360ac1e780220ddc15ecdfc3507ac48e1681a33eb60996631bf6bf5bc0a0682c4db743ce7ca2b01ffffffff0140420f00000000001976a914660d4ef3a743e3e696ad990364e555c271ad504b88ac00000000", "P2SH"],
|
||||||
|
|
||||||
["The following is a tweaked form of 23b397edccd3740a74adb603c9756370fafcde9bcc4483eb271ecad09a94dd63"],
|
["The following is a tweaked form of 23b397edccd3740a74adb603c9756370fafcde9bcc4483eb271ecad09a94dd63"],
|
||||||
["It is an OP_CHECKMULTISIG with the dummy value missing"],
|
["It is an OP_CHECKMULTISIG with the dummy value missing"],
|
||||||
[[["60a20bd93aa49ab4b28d514ec10b06e1829ce6818ec06cd3aabd013ebcdc4bb1", 0, "1 0x41 0x04cc71eb30d653c0c3163990c47b976f3fb3f37cccdcbedb169a1dfef58bbfbfaff7d8a473e7e2e6d317b87bafe8bde97e3cf8f065dec022b51d11fcdd0d348ac4 0x41 0x0461cbdcc5409fb4b4d42b51d33381354d80e550078cb532a34bfa2fcfdeb7d76519aecc62770f5b0e4ef8551946d8a540911abe3e7854a26f39f58b25c15342af 2 OP_CHECKMULTISIG"]],
|
[[["60a20bd93aa49ab4b28d514ec10b06e1829ce6818ec06cd3aabd013ebcdc4bb1", 0, "1 0x41 0x04cc71eb30d653c0c3163990c47b976f3fb3f37cccdcbedb169a1dfef58bbfbfaff7d8a473e7e2e6d317b87bafe8bde97e3cf8f065dec022b51d11fcdd0d348ac4 0x41 0x0461cbdcc5409fb4b4d42b51d33381354d80e550078cb532a34bfa2fcfdeb7d76519aecc62770f5b0e4ef8551946d8a540911abe3e7854a26f39f58b25c15342af 2 OP_CHECKMULTISIG"]],
|
||||||
"0100000001b14bdcbc3e01bdaad36cc08e81e69c82e1060bc14e518db2b49aa43ad90ba260000000004847304402203f16c6f40162ab686621ef3000b04e75418a0c0cb2d8aebeac894ae360ac1e780220ddc15ecdfc3507ac48e1681a33eb60996631bf6bf5bc0a0682c4db743ce7ca2b01ffffffff0140420f00000000001976a914660d4ef3a743e3e696ad990364e555c271ad504b88ac00000000", "P2SH"],
|
"0100000001b14bdcbc3e01bdaad36cc08e81e69c82e1060bc14e518db2b49aa43ad90ba260000000004847304402203f16c6f40162ab686621ef3000b04e75418a0c0cb2d8aebeac894ae360ac1e780220ddc15ecdfc3507ac48e1681a33eb60996631bf6bf5bc0a0682c4db743ce7ca2b01ffffffff0140420f00000000001976a914660d4ef3a743e3e696ad990364e555c271ad504b88ac00000000", "P2SH"],
|
||||||
|
|
||||||
|
["The following is f7fdd091fa6d8f5e7a8c2458f5c38faffff2d3f1406b6e4fe2c99dcc0d2d1cbb"],
|
||||||
|
["It caught a bug in the workaround for 23b397edccd3740a74adb603c9756370fafcde9bcc4483eb271ecad09a94dd63 in an overly simple implementation"],
|
||||||
|
[[["b464e85df2a238416f8bdae11d120add610380ea07f4ef19c5f9dfd472f96c3d", 0, "DUP HASH160 0x14 0xbef80ecf3a44500fda1bc92176e442891662aed2 EQUALVERIFY CHECKSIG"],
|
||||||
|
["b7978cc96e59a8b13e0865d3f95657561a7f725be952438637475920bac9eb21", 1, "DUP HASH160 0x14 0xbef80ecf3a44500fda1bc92176e442891662aed2 EQUALVERIFY CHECKSIG"]],
|
||||||
|
"01000000023d6cf972d4dff9c519eff407ea800361dd0a121de1da8b6f4138a2f25de864b4000000008a4730440220ffda47bfc776bcd269da4832626ac332adfca6dd835e8ecd83cd1ebe7d709b0e022049cffa1cdc102a0b56e0e04913606c70af702a1149dc3b305ab9439288fee090014104266abb36d66eb4218a6dd31f09bb92cf3cfa803c7ea72c1fc80a50f919273e613f895b855fb7465ccbc8919ad1bd4a306c783f22cd3227327694c4fa4c1c439affffffff21ebc9ba20594737864352e95b727f1a565756f9d365083eb1a8596ec98c97b7010000008a4730440220503ff10e9f1e0de731407a4a245531c9ff17676eda461f8ceeb8c06049fa2c810220c008ac34694510298fa60b3f000df01caa244f165b727d4896eb84f81e46bcc4014104266abb36d66eb4218a6dd31f09bb92cf3cfa803c7ea72c1fc80a50f919273e613f895b855fb7465ccbc8919ad1bd4a306c783f22cd3227327694c4fa4c1c439affffffff01f0da5200000000001976a914857ccd42dded6df32949d4646dfa10a92458cfaa88ac00000000", "P2SH"],
|
||||||
|
|
||||||
|
|
||||||
["CHECKMULTISIG SCRIPT_VERIFY_NULLDUMMY tests:"],
|
["CHECKMULTISIG SCRIPT_VERIFY_NULLDUMMY tests:"],
|
||||||
|
|
||||||
|
|
|
@ -5,32 +5,6 @@
|
||||||
["serializedTransaction, verifyFlags]"],
|
["serializedTransaction, verifyFlags]"],
|
||||||
["Objects that are only a single string (like this one) are ignored"],
|
["Objects that are only a single string (like this one) are ignored"],
|
||||||
|
|
||||||
["The following is 23b397edccd3740a74adb603c9756370fafcde9bcc4483eb271ecad09a94dd63"],
|
|
||||||
["It is of particular interest because it contains an invalidly-encoded signature which OpenSSL accepts"],
|
|
||||||
["See http://r6.ca/blog/20111119T211504Z.html"],
|
|
||||||
["It is also the first OP_CHECKMULTISIG transaction in standard form"],
|
|
||||||
[[["60a20bd93aa49ab4b28d514ec10b06e1829ce6818ec06cd3aabd013ebcdc4bb1", 0, "1 0x41 0x04cc71eb30d653c0c3163990c47b976f3fb3f37cccdcbedb169a1dfef58bbfbfaff7d8a473e7e2e6d317b87bafe8bde97e3cf8f065dec022b51d11fcdd0d348ac4 0x41 0x0461cbdcc5409fb4b4d42b51d33381354d80e550078cb532a34bfa2fcfdeb7d76519aecc62770f5b0e4ef8551946d8a540911abe3e7854a26f39f58b25c15342af 2 OP_CHECKMULTISIG"]],
|
|
||||||
"0100000001b14bdcbc3e01bdaad36cc08e81e69c82e1060bc14e518db2b49aa43ad90ba26000000000490047304402203f16c6f40162ab686621ef3000b04e75418a0c0cb2d8aebeac894ae360ac1e780220ddc15ecdfc3507ac48e1681a33eb60996631bf6bf5bc0a0682c4db743ce7ca2b01ffffffff0140420f00000000001976a914660d4ef3a743e3e696ad990364e555c271ad504b88ac00000000", "P2SH"],
|
|
||||||
|
|
||||||
["The following is a tweaked form of 23b397edccd3740a74adb603c9756370fafcde9bcc4483eb271ecad09a94dd63"],
|
|
||||||
["It is an OP_CHECKMULTISIG with an arbitrary extra byte stuffed into the signature at pos length - 2"],
|
|
||||||
["The dummy byte is fine however, so the NULLDUMMY flag should be happy"],
|
|
||||||
[[["60a20bd93aa49ab4b28d514ec10b06e1829ce6818ec06cd3aabd013ebcdc4bb1", 0, "1 0x41 0x04cc71eb30d653c0c3163990c47b976f3fb3f37cccdcbedb169a1dfef58bbfbfaff7d8a473e7e2e6d317b87bafe8bde97e3cf8f065dec022b51d11fcdd0d348ac4 0x41 0x0461cbdcc5409fb4b4d42b51d33381354d80e550078cb532a34bfa2fcfdeb7d76519aecc62770f5b0e4ef8551946d8a540911abe3e7854a26f39f58b25c15342af 2 OP_CHECKMULTISIG"]],
|
|
||||||
"0100000001b14bdcbc3e01bdaad36cc08e81e69c82e1060bc14e518db2b49aa43ad90ba260000000004a0048304402203f16c6f40162ab686621ef3000b04e75418a0c0cb2d8aebeac894ae360ac1e780220ddc15ecdfc3507ac48e1681a33eb60996631bf6bf5bc0a0682c4db743ce7ca2bab01ffffffff0140420f00000000001976a914660d4ef3a743e3e696ad990364e555c271ad504b88ac00000000", "P2SH,NULLDUMMY"],
|
|
||||||
|
|
||||||
["The following is a tweaked form of 23b397edccd3740a74adb603c9756370fafcde9bcc4483eb271ecad09a94dd63"],
|
|
||||||
["It is an OP_CHECKMULTISIG with the dummy value set to something other than an empty string"],
|
|
||||||
[[["60a20bd93aa49ab4b28d514ec10b06e1829ce6818ec06cd3aabd013ebcdc4bb1", 0, "1 0x41 0x04cc71eb30d653c0c3163990c47b976f3fb3f37cccdcbedb169a1dfef58bbfbfaff7d8a473e7e2e6d317b87bafe8bde97e3cf8f065dec022b51d11fcdd0d348ac4 0x41 0x0461cbdcc5409fb4b4d42b51d33381354d80e550078cb532a34bfa2fcfdeb7d76519aecc62770f5b0e4ef8551946d8a540911abe3e7854a26f39f58b25c15342af 2 OP_CHECKMULTISIG"]],
|
|
||||||
"0100000001b14bdcbc3e01bdaad36cc08e81e69c82e1060bc14e518db2b49aa43ad90ba260000000004a01ff47304402203f16c6f40162ab686621ef3000b04e75418a0c0cb2d8aebeac894ae360ac1e780220ddc15ecdfc3507ac48e1681a33eb60996631bf6bf5bc0a0682c4db743ce7ca2b01ffffffff0140420f00000000001976a914660d4ef3a743e3e696ad990364e555c271ad504b88ac00000000", "P2SH"],
|
|
||||||
|
|
||||||
["As above, but using a OP_1"],
|
|
||||||
[[["60a20bd93aa49ab4b28d514ec10b06e1829ce6818ec06cd3aabd013ebcdc4bb1", 0, "1 0x41 0x04cc71eb30d653c0c3163990c47b976f3fb3f37cccdcbedb169a1dfef58bbfbfaff7d8a473e7e2e6d317b87bafe8bde97e3cf8f065dec022b51d11fcdd0d348ac4 0x41 0x0461cbdcc5409fb4b4d42b51d33381354d80e550078cb532a34bfa2fcfdeb7d76519aecc62770f5b0e4ef8551946d8a540911abe3e7854a26f39f58b25c15342af 2 OP_CHECKMULTISIG"]],
|
|
||||||
"0100000001b14bdcbc3e01bdaad36cc08e81e69c82e1060bc14e518db2b49aa43ad90ba26000000000495147304402203f16c6f40162ab686621ef3000b04e75418a0c0cb2d8aebeac894ae360ac1e780220ddc15ecdfc3507ac48e1681a33eb60996631bf6bf5bc0a0682c4db743ce7ca2b01ffffffff0140420f00000000001976a914660d4ef3a743e3e696ad990364e555c271ad504b88ac00000000", "P2SH"],
|
|
||||||
|
|
||||||
["As above, but using a OP_1NEGATE"],
|
|
||||||
[[["60a20bd93aa49ab4b28d514ec10b06e1829ce6818ec06cd3aabd013ebcdc4bb1", 0, "1 0x41 0x04cc71eb30d653c0c3163990c47b976f3fb3f37cccdcbedb169a1dfef58bbfbfaff7d8a473e7e2e6d317b87bafe8bde97e3cf8f065dec022b51d11fcdd0d348ac4 0x41 0x0461cbdcc5409fb4b4d42b51d33381354d80e550078cb532a34bfa2fcfdeb7d76519aecc62770f5b0e4ef8551946d8a540911abe3e7854a26f39f58b25c15342af 2 OP_CHECKMULTISIG"]],
|
|
||||||
"0100000001b14bdcbc3e01bdaad36cc08e81e69c82e1060bc14e518db2b49aa43ad90ba26000000000494f47304402203f16c6f40162ab686621ef3000b04e75418a0c0cb2d8aebeac894ae360ac1e780220ddc15ecdfc3507ac48e1681a33eb60996631bf6bf5bc0a0682c4db743ce7ca2b01ffffffff0140420f00000000001976a914660d4ef3a743e3e696ad990364e555c271ad504b88ac00000000", "P2SH"],
|
|
||||||
|
|
||||||
["The following is c99c49da4c38af669dea436d3e73780dfdb6c1ecf9958baa52960e8baee30e73"],
|
["The following is c99c49da4c38af669dea436d3e73780dfdb6c1ecf9958baa52960e8baee30e73"],
|
||||||
["It is of interest because it contains a 0-sequence as well as a signature of SIGHASH type 0 (which is not a real type)"],
|
["It is of interest because it contains a 0-sequence as well as a signature of SIGHASH type 0 (which is not a real type)"],
|
||||||
[[["406b2b06bcd34d3c8733e6b79f7a394c8a431fbf4ff5ac705c93f4076bb77602", 0, "DUP HASH160 0x14 0xdc44b1164188067c3a32d4780f5996fa14a4f2d9 EQUALVERIFY CHECKSIG"]],
|
[[["406b2b06bcd34d3c8733e6b79f7a394c8a431fbf4ff5ac705c93f4076bb77602", 0, "DUP HASH160 0x14 0xdc44b1164188067c3a32d4780f5996fa14a4f2d9 EQUALVERIFY CHECKSIG"]],
|
||||||
|
@ -40,12 +14,6 @@
|
||||||
[[["0000000000000000000000000000000000000000000000000000000000000100", 0, "DUP HASH160 0x14 0x5b6462475454710f3c22f5fdf0b40704c92f25c3 EQUALVERIFY CHECKSIGVERIFY 1"]],
|
[[["0000000000000000000000000000000000000000000000000000000000000100", 0, "DUP HASH160 0x14 0x5b6462475454710f3c22f5fdf0b40704c92f25c3 EQUALVERIFY CHECKSIGVERIFY 1"]],
|
||||||
"01000000010001000000000000000000000000000000000000000000000000000000000000000000006a473044022067288ea50aa799543a536ff9306f8e1cba05b9c6b10951175b924f96732555ed022026d7b5265f38d21541519e4a1e55044d5b9e17e15cdbaf29ae3792e99e883e7a012103ba8c8b86dea131c22ab967e6dd99bdae8eff7a1f75a2c35f1f944109e3fe5e22ffffffff010000000000000000015100000000", "P2SH"],
|
"01000000010001000000000000000000000000000000000000000000000000000000000000000000006a473044022067288ea50aa799543a536ff9306f8e1cba05b9c6b10951175b924f96732555ed022026d7b5265f38d21541519e4a1e55044d5b9e17e15cdbaf29ae3792e99e883e7a012103ba8c8b86dea131c22ab967e6dd99bdae8eff7a1f75a2c35f1f944109e3fe5e22ffffffff010000000000000000015100000000", "P2SH"],
|
||||||
|
|
||||||
["The following is f7fdd091fa6d8f5e7a8c2458f5c38faffff2d3f1406b6e4fe2c99dcc0d2d1cbb"],
|
|
||||||
["It caught a bug in the workaround for 23b397edccd3740a74adb603c9756370fafcde9bcc4483eb271ecad09a94dd63 in an overly simple implementation"],
|
|
||||||
[[["b464e85df2a238416f8bdae11d120add610380ea07f4ef19c5f9dfd472f96c3d", 0, "DUP HASH160 0x14 0xbef80ecf3a44500fda1bc92176e442891662aed2 EQUALVERIFY CHECKSIG"],
|
|
||||||
["b7978cc96e59a8b13e0865d3f95657561a7f725be952438637475920bac9eb21", 1, "DUP HASH160 0x14 0xbef80ecf3a44500fda1bc92176e442891662aed2 EQUALVERIFY CHECKSIG"]],
|
|
||||||
"01000000023d6cf972d4dff9c519eff407ea800361dd0a121de1da8b6f4138a2f25de864b4000000008a4730440220ffda47bfc776bcd269da4832626ac332adfca6dd835e8ecd83cd1ebe7d709b0e022049cffa1cdc102a0b56e0e04913606c70af702a1149dc3b305ab9439288fee090014104266abb36d66eb4218a6dd31f09bb92cf3cfa803c7ea72c1fc80a50f919273e613f895b855fb7465ccbc8919ad1bd4a306c783f22cd3227327694c4fa4c1c439affffffff21ebc9ba20594737864352e95b727f1a565756f9d365083eb1a8596ec98c97b7010000008a4730440220503ff10e9f1e0de731407a4a245531c9ff17676eda461f8ceeb8c06049fa2c810220c008ac34694510298fa60b3f000df01caa244f165b727d4896eb84f81e46bcc4014104266abb36d66eb4218a6dd31f09bb92cf3cfa803c7ea72c1fc80a50f919273e613f895b855fb7465ccbc8919ad1bd4a306c783f22cd3227327694c4fa4c1c439affffffff01f0da5200000000001976a914857ccd42dded6df32949d4646dfa10a92458cfaa88ac00000000", "P2SH"],
|
|
||||||
|
|
||||||
["An invalid P2SH Transaction"],
|
["An invalid P2SH Transaction"],
|
||||||
[[["0000000000000000000000000000000000000000000000000000000000000100", 0, "HASH160 0x14 0x7a052c840ba73af26755de42cf01cc9e0a49fef0 EQUAL"]],
|
[[["0000000000000000000000000000000000000000000000000000000000000100", 0, "HASH160 0x14 0x7a052c840ba73af26755de42cf01cc9e0a49fef0 EQUAL"]],
|
||||||
"010000000100010000000000000000000000000000000000000000000000000000000000000000000009085768617420697320ffffffff010000000000000000015100000000", "NONE"],
|
"010000000100010000000000000000000000000000000000000000000000000000000000000000000009085768617420697320ffffffff010000000000000000015100000000", "NONE"],
|
||||||
|
|
|
@ -372,114 +372,61 @@ BOOST_AUTO_TEST_CASE(script_build)
|
||||||
"P2SH(2-of-3), 1 sig", SCRIPT_VERIFY_P2SH, true
|
"P2SH(2-of-3), 1 sig", SCRIPT_VERIFY_P2SH, true
|
||||||
).Num(0).PushSig(keys.key1).Num(0).PushRedeem());
|
).Num(0).PushSig(keys.key1).Num(0).PushRedeem());
|
||||||
|
|
||||||
good.push_back(TestBuilder(CScript() << ToByteVector(keys.pubkey1C) << OP_CHECKSIG,
|
bad.push_back(TestBuilder(CScript() << ToByteVector(keys.pubkey1C) << OP_CHECKSIG,
|
||||||
"P2PK with too much R padding but no DERSIG", 0
|
"P2PK with too much R padding", 0
|
||||||
).PushSig(keys.key1, SIGHASH_ALL, 31, 32).EditPush(1, "43021F", "44022000"));
|
).PushSig(keys.key1, SIGHASH_ALL, 31, 32).EditPush(1, "43021F", "44022000"));
|
||||||
bad.push_back(TestBuilder(CScript() << ToByteVector(keys.pubkey1C) << OP_CHECKSIG,
|
bad.push_back(TestBuilder(CScript() << ToByteVector(keys.pubkey1C) << OP_CHECKSIG,
|
||||||
"P2PK with too much R padding", SCRIPT_VERIFY_DERSIG
|
"P2PK with too much S padding", 0
|
||||||
).PushSig(keys.key1, SIGHASH_ALL, 31, 32).EditPush(1, "43021F", "44022000"));
|
|
||||||
good.push_back(TestBuilder(CScript() << ToByteVector(keys.pubkey1C) << OP_CHECKSIG,
|
|
||||||
"P2PK with too much S padding but no DERSIG", 0
|
|
||||||
).PushSig(keys.key1, SIGHASH_ALL).EditPush(1, "44", "45").EditPush(37, "20", "2100"));
|
).PushSig(keys.key1, SIGHASH_ALL).EditPush(1, "44", "45").EditPush(37, "20", "2100"));
|
||||||
bad.push_back(TestBuilder(CScript() << ToByteVector(keys.pubkey1C) << OP_CHECKSIG,
|
bad.push_back(TestBuilder(CScript() << ToByteVector(keys.pubkey1C) << OP_CHECKSIG,
|
||||||
"P2PK with too much S padding", SCRIPT_VERIFY_DERSIG
|
"P2PK with too little R padding", 0
|
||||||
).PushSig(keys.key1, SIGHASH_ALL).EditPush(1, "44", "45").EditPush(37, "20", "2100"));
|
|
||||||
good.push_back(TestBuilder(CScript() << ToByteVector(keys.pubkey1C) << OP_CHECKSIG,
|
|
||||||
"P2PK with too little R padding but no DERSIG", 0
|
|
||||||
).PushSig(keys.key1, SIGHASH_ALL, 33, 32).EditPush(1, "45022100", "440220"));
|
).PushSig(keys.key1, SIGHASH_ALL, 33, 32).EditPush(1, "45022100", "440220"));
|
||||||
bad.push_back(TestBuilder(CScript() << ToByteVector(keys.pubkey1C) << OP_CHECKSIG,
|
bad.push_back(TestBuilder(CScript() << ToByteVector(keys.pubkey2C) << OP_CHECKSIG << OP_NOT,
|
||||||
"P2PK with too little R padding", SCRIPT_VERIFY_DERSIG
|
"P2PK NOT with bad sig with too much R padding", 0
|
||||||
).PushSig(keys.key1, SIGHASH_ALL, 33, 32).EditPush(1, "45022100", "440220"));
|
|
||||||
good.push_back(TestBuilder(CScript() << ToByteVector(keys.pubkey2C) << OP_CHECKSIG << OP_NOT,
|
|
||||||
"P2PK NOT with bad sig with too much R padding but no DERSIG", 0
|
|
||||||
).PushSig(keys.key2, SIGHASH_ALL, 31, 32).EditPush(1, "43021F", "44022000").DamagePush(10));
|
).PushSig(keys.key2, SIGHASH_ALL, 31, 32).EditPush(1, "43021F", "44022000").DamagePush(10));
|
||||||
bad.push_back(TestBuilder(CScript() << ToByteVector(keys.pubkey2C) << OP_CHECKSIG << OP_NOT,
|
bad.push_back(TestBuilder(CScript() << ToByteVector(keys.pubkey2C) << OP_CHECKSIG << OP_NOT,
|
||||||
"P2PK NOT with bad sig with too much R padding", SCRIPT_VERIFY_DERSIG
|
"P2PK NOT with too much R padding", 0
|
||||||
).PushSig(keys.key2, SIGHASH_ALL, 31, 32).EditPush(1, "43021F", "44022000").DamagePush(10));
|
|
||||||
bad.push_back(TestBuilder(CScript() << ToByteVector(keys.pubkey2C) << OP_CHECKSIG << OP_NOT,
|
|
||||||
"P2PK NOT with too much R padding but no DERSIG", 0
|
|
||||||
).PushSig(keys.key2, SIGHASH_ALL, 31, 32).EditPush(1, "43021F", "44022000"));
|
|
||||||
bad.push_back(TestBuilder(CScript() << ToByteVector(keys.pubkey2C) << OP_CHECKSIG << OP_NOT,
|
|
||||||
"P2PK NOT with too much R padding", SCRIPT_VERIFY_DERSIG
|
|
||||||
).PushSig(keys.key2, SIGHASH_ALL, 31, 32).EditPush(1, "43021F", "44022000"));
|
).PushSig(keys.key2, SIGHASH_ALL, 31, 32).EditPush(1, "43021F", "44022000"));
|
||||||
|
|
||||||
good.push_back(TestBuilder(CScript() << ToByteVector(keys.pubkey1C) << OP_CHECKSIG,
|
|
||||||
"BIP66 example 1, without DERSIG", 0
|
|
||||||
).PushSig(keys.key1, SIGHASH_ALL, 33, 32).EditPush(1, "45022100", "440220"));
|
|
||||||
bad.push_back(TestBuilder(CScript() << ToByteVector(keys.pubkey1C) << OP_CHECKSIG,
|
bad.push_back(TestBuilder(CScript() << ToByteVector(keys.pubkey1C) << OP_CHECKSIG,
|
||||||
"BIP66 example 1, with DERSIG", SCRIPT_VERIFY_DERSIG
|
"BIP66 example 1", 0
|
||||||
).PushSig(keys.key1, SIGHASH_ALL, 33, 32).EditPush(1, "45022100", "440220"));
|
).PushSig(keys.key1, SIGHASH_ALL, 33, 32).EditPush(1, "45022100", "440220"));
|
||||||
bad.push_back(TestBuilder(CScript() << ToByteVector(keys.pubkey1C) << OP_CHECKSIG << OP_NOT,
|
bad.push_back(TestBuilder(CScript() << ToByteVector(keys.pubkey1C) << OP_CHECKSIG << OP_NOT,
|
||||||
"BIP66 example 2, without DERSIG", 0
|
"BIP66 example 2", 0
|
||||||
).PushSig(keys.key1, SIGHASH_ALL, 33, 32).EditPush(1, "45022100", "440220"));
|
|
||||||
bad.push_back(TestBuilder(CScript() << ToByteVector(keys.pubkey1C) << OP_CHECKSIG << OP_NOT,
|
|
||||||
"BIP66 example 2, with DERSIG", SCRIPT_VERIFY_DERSIG
|
|
||||||
).PushSig(keys.key1, SIGHASH_ALL, 33, 32).EditPush(1, "45022100", "440220"));
|
).PushSig(keys.key1, SIGHASH_ALL, 33, 32).EditPush(1, "45022100", "440220"));
|
||||||
bad.push_back(TestBuilder(CScript() << ToByteVector(keys.pubkey1C) << OP_CHECKSIG,
|
bad.push_back(TestBuilder(CScript() << ToByteVector(keys.pubkey1C) << OP_CHECKSIG,
|
||||||
"BIP66 example 3, without DERSIG", 0
|
"BIP66 example 3", 0
|
||||||
).Num(0));
|
|
||||||
bad.push_back(TestBuilder(CScript() << ToByteVector(keys.pubkey1C) << OP_CHECKSIG,
|
|
||||||
"BIP66 example 3, with DERSIG", SCRIPT_VERIFY_DERSIG
|
|
||||||
).Num(0));
|
).Num(0));
|
||||||
good.push_back(TestBuilder(CScript() << ToByteVector(keys.pubkey1C) << OP_CHECKSIG << OP_NOT,
|
good.push_back(TestBuilder(CScript() << ToByteVector(keys.pubkey1C) << OP_CHECKSIG << OP_NOT,
|
||||||
"BIP66 example 4, without DERSIG", 0
|
"BIP66 example 4", 0
|
||||||
).Num(0));
|
|
||||||
good.push_back(TestBuilder(CScript() << ToByteVector(keys.pubkey1C) << OP_CHECKSIG << OP_NOT,
|
|
||||||
"BIP66 example 4, with DERSIG", SCRIPT_VERIFY_DERSIG
|
|
||||||
).Num(0));
|
).Num(0));
|
||||||
bad.push_back(TestBuilder(CScript() << ToByteVector(keys.pubkey1C) << OP_CHECKSIG,
|
bad.push_back(TestBuilder(CScript() << ToByteVector(keys.pubkey1C) << OP_CHECKSIG,
|
||||||
"BIP66 example 5, without DERSIG", 0
|
"BIP66 example 5", 0
|
||||||
).Num(1));
|
|
||||||
bad.push_back(TestBuilder(CScript() << ToByteVector(keys.pubkey1C) << OP_CHECKSIG,
|
|
||||||
"BIP66 example 5, with DERSIG", SCRIPT_VERIFY_DERSIG
|
|
||||||
).Num(1));
|
|
||||||
good.push_back(TestBuilder(CScript() << ToByteVector(keys.pubkey1C) << OP_CHECKSIG << OP_NOT,
|
|
||||||
"BIP66 example 6, without DERSIG", 0
|
|
||||||
).Num(1));
|
).Num(1));
|
||||||
bad.push_back(TestBuilder(CScript() << ToByteVector(keys.pubkey1C) << OP_CHECKSIG << OP_NOT,
|
bad.push_back(TestBuilder(CScript() << ToByteVector(keys.pubkey1C) << OP_CHECKSIG << OP_NOT,
|
||||||
"BIP66 example 6, with DERSIG", SCRIPT_VERIFY_DERSIG
|
"BIP66 example 6", 0
|
||||||
).Num(1));
|
).Num(1));
|
||||||
good.push_back(TestBuilder(CScript() << OP_2 << ToByteVector(keys.pubkey1C) << ToByteVector(keys.pubkey2C) << OP_2 << OP_CHECKMULTISIG,
|
|
||||||
"BIP66 example 7, without DERSIG", 0
|
|
||||||
).Num(0).PushSig(keys.key1, SIGHASH_ALL, 33, 32).EditPush(1, "45022100", "440220").PushSig(keys.key2));
|
|
||||||
bad.push_back(TestBuilder(CScript() << OP_2 << ToByteVector(keys.pubkey1C) << ToByteVector(keys.pubkey2C) << OP_2 << OP_CHECKMULTISIG,
|
bad.push_back(TestBuilder(CScript() << OP_2 << ToByteVector(keys.pubkey1C) << ToByteVector(keys.pubkey2C) << OP_2 << OP_CHECKMULTISIG,
|
||||||
"BIP66 example 7, with DERSIG", SCRIPT_VERIFY_DERSIG
|
"BIP66 example 7", 0
|
||||||
).Num(0).PushSig(keys.key1, SIGHASH_ALL, 33, 32).EditPush(1, "45022100", "440220").PushSig(keys.key2));
|
).Num(0).PushSig(keys.key1, SIGHASH_ALL, 33, 32).EditPush(1, "45022100", "440220").PushSig(keys.key2));
|
||||||
bad.push_back(TestBuilder(CScript() << OP_2 << ToByteVector(keys.pubkey1C) << ToByteVector(keys.pubkey2C) << OP_2 << OP_CHECKMULTISIG << OP_NOT,
|
bad.push_back(TestBuilder(CScript() << OP_2 << ToByteVector(keys.pubkey1C) << ToByteVector(keys.pubkey2C) << OP_2 << OP_CHECKMULTISIG << OP_NOT,
|
||||||
"BIP66 example 8, without DERSIG", 0
|
"BIP66 example 8", 0
|
||||||
).Num(0).PushSig(keys.key1, SIGHASH_ALL, 33, 32).EditPush(1, "45022100", "440220").PushSig(keys.key2));
|
|
||||||
bad.push_back(TestBuilder(CScript() << OP_2 << ToByteVector(keys.pubkey1C) << ToByteVector(keys.pubkey2C) << OP_2 << OP_CHECKMULTISIG << OP_NOT,
|
|
||||||
"BIP66 example 8, with DERSIG", SCRIPT_VERIFY_DERSIG
|
|
||||||
).Num(0).PushSig(keys.key1, SIGHASH_ALL, 33, 32).EditPush(1, "45022100", "440220").PushSig(keys.key2));
|
).Num(0).PushSig(keys.key1, SIGHASH_ALL, 33, 32).EditPush(1, "45022100", "440220").PushSig(keys.key2));
|
||||||
bad.push_back(TestBuilder(CScript() << OP_2 << ToByteVector(keys.pubkey1C) << ToByteVector(keys.pubkey2C) << OP_2 << OP_CHECKMULTISIG,
|
bad.push_back(TestBuilder(CScript() << OP_2 << ToByteVector(keys.pubkey1C) << ToByteVector(keys.pubkey2C) << OP_2 << OP_CHECKMULTISIG,
|
||||||
"BIP66 example 9, without DERSIG", 0
|
"BIP66 example 9", 0
|
||||||
).Num(0).Num(0).PushSig(keys.key2, SIGHASH_ALL, 33, 32).EditPush(1, "45022100", "440220"));
|
|
||||||
bad.push_back(TestBuilder(CScript() << OP_2 << ToByteVector(keys.pubkey1C) << ToByteVector(keys.pubkey2C) << OP_2 << OP_CHECKMULTISIG,
|
|
||||||
"BIP66 example 9, with DERSIG", SCRIPT_VERIFY_DERSIG
|
|
||||||
).Num(0).Num(0).PushSig(keys.key2, SIGHASH_ALL, 33, 32).EditPush(1, "45022100", "440220"));
|
|
||||||
good.push_back(TestBuilder(CScript() << OP_2 << ToByteVector(keys.pubkey1C) << ToByteVector(keys.pubkey2C) << OP_2 << OP_CHECKMULTISIG << OP_NOT,
|
|
||||||
"BIP66 example 10, without DERSIG", 0
|
|
||||||
).Num(0).Num(0).PushSig(keys.key2, SIGHASH_ALL, 33, 32).EditPush(1, "45022100", "440220"));
|
).Num(0).Num(0).PushSig(keys.key2, SIGHASH_ALL, 33, 32).EditPush(1, "45022100", "440220"));
|
||||||
bad.push_back(TestBuilder(CScript() << OP_2 << ToByteVector(keys.pubkey1C) << ToByteVector(keys.pubkey2C) << OP_2 << OP_CHECKMULTISIG << OP_NOT,
|
bad.push_back(TestBuilder(CScript() << OP_2 << ToByteVector(keys.pubkey1C) << ToByteVector(keys.pubkey2C) << OP_2 << OP_CHECKMULTISIG << OP_NOT,
|
||||||
"BIP66 example 10, with DERSIG", SCRIPT_VERIFY_DERSIG
|
"BIP66 example 10", 0
|
||||||
).Num(0).Num(0).PushSig(keys.key2, SIGHASH_ALL, 33, 32).EditPush(1, "45022100", "440220"));
|
).Num(0).Num(0).PushSig(keys.key2, SIGHASH_ALL, 33, 32).EditPush(1, "45022100", "440220"));
|
||||||
bad.push_back(TestBuilder(CScript() << OP_2 << ToByteVector(keys.pubkey1C) << ToByteVector(keys.pubkey2C) << OP_2 << OP_CHECKMULTISIG,
|
bad.push_back(TestBuilder(CScript() << OP_2 << ToByteVector(keys.pubkey1C) << ToByteVector(keys.pubkey2C) << OP_2 << OP_CHECKMULTISIG,
|
||||||
"BIP66 example 11, without DERSIG", 0
|
"BIP66 example 11", 0
|
||||||
).Num(0).PushSig(keys.key1, SIGHASH_ALL, 33, 32).EditPush(1, "45022100", "440220").Num(0));
|
|
||||||
bad.push_back(TestBuilder(CScript() << OP_2 << ToByteVector(keys.pubkey1C) << ToByteVector(keys.pubkey2C) << OP_2 << OP_CHECKMULTISIG,
|
|
||||||
"BIP66 example 11, with DERSIG", SCRIPT_VERIFY_DERSIG
|
|
||||||
).Num(0).PushSig(keys.key1, SIGHASH_ALL, 33, 32).EditPush(1, "45022100", "440220").Num(0));
|
).Num(0).PushSig(keys.key1, SIGHASH_ALL, 33, 32).EditPush(1, "45022100", "440220").Num(0));
|
||||||
good.push_back(TestBuilder(CScript() << OP_2 << ToByteVector(keys.pubkey1C) << ToByteVector(keys.pubkey2C) << OP_2 << OP_CHECKMULTISIG << OP_NOT,
|
good.push_back(TestBuilder(CScript() << OP_2 << ToByteVector(keys.pubkey1C) << ToByteVector(keys.pubkey2C) << OP_2 << OP_CHECKMULTISIG << OP_NOT,
|
||||||
"BIP66 example 12, without DERSIG", 0
|
"BIP66 example 12", 0
|
||||||
).Num(0).PushSig(keys.key1, SIGHASH_ALL, 33, 32).EditPush(1, "45022100", "440220").Num(0));
|
).Num(0).PushSig(keys.key1, SIGHASH_ALL, 33, 32).EditPush(1, "45022100", "440220").Num(0));
|
||||||
good.push_back(TestBuilder(CScript() << OP_2 << ToByteVector(keys.pubkey1C) << ToByteVector(keys.pubkey2C) << OP_2 << OP_CHECKMULTISIG << OP_NOT,
|
|
||||||
"BIP66 example 12, with DERSIG", SCRIPT_VERIFY_DERSIG
|
|
||||||
).Num(0).PushSig(keys.key1, SIGHASH_ALL, 33, 32).EditPush(1, "45022100", "440220").Num(0));
|
|
||||||
good.push_back(TestBuilder(CScript() << ToByteVector(keys.pubkey2C) << OP_CHECKSIG,
|
|
||||||
"P2PK with multi-byte hashtype, without DERSIG", 0
|
|
||||||
).PushSig(keys.key2, SIGHASH_ALL).EditPush(70, "01", "0101"));
|
|
||||||
bad.push_back(TestBuilder(CScript() << ToByteVector(keys.pubkey2C) << OP_CHECKSIG,
|
bad.push_back(TestBuilder(CScript() << ToByteVector(keys.pubkey2C) << OP_CHECKSIG,
|
||||||
"P2PK with multi-byte hashtype, with DERSIG", SCRIPT_VERIFY_DERSIG
|
"P2PK with multi-byte hashtype", 0
|
||||||
).PushSig(keys.key2, SIGHASH_ALL).EditPush(70, "01", "0101"));
|
).PushSig(keys.key2, SIGHASH_ALL).EditPush(70, "01", "0101"));
|
||||||
|
|
||||||
good.push_back(TestBuilder(CScript() << ToByteVector(keys.pubkey2C) << OP_CHECKSIG,
|
good.push_back(TestBuilder(CScript() << ToByteVector(keys.pubkey2C) << OP_CHECKSIG,
|
||||||
|
|
|
@ -42,7 +42,6 @@ static std::map<string, unsigned int> mapFlagNames = boost::assign::map_list_of
|
||||||
(string("NONE"), (unsigned int)SCRIPT_VERIFY_NONE)
|
(string("NONE"), (unsigned int)SCRIPT_VERIFY_NONE)
|
||||||
(string("P2SH"), (unsigned int)SCRIPT_VERIFY_P2SH)
|
(string("P2SH"), (unsigned int)SCRIPT_VERIFY_P2SH)
|
||||||
(string("STRICTENC"), (unsigned int)SCRIPT_VERIFY_STRICTENC)
|
(string("STRICTENC"), (unsigned int)SCRIPT_VERIFY_STRICTENC)
|
||||||
(string("DERSIG"), (unsigned int)SCRIPT_VERIFY_DERSIG)
|
|
||||||
(string("LOW_S"), (unsigned int)SCRIPT_VERIFY_LOW_S)
|
(string("LOW_S"), (unsigned int)SCRIPT_VERIFY_LOW_S)
|
||||||
(string("SIGPUSHONLY"), (unsigned int)SCRIPT_VERIFY_SIGPUSHONLY)
|
(string("SIGPUSHONLY"), (unsigned int)SCRIPT_VERIFY_SIGPUSHONLY)
|
||||||
(string("MINIMALDATA"), (unsigned int)SCRIPT_VERIFY_MINIMALDATA)
|
(string("MINIMALDATA"), (unsigned int)SCRIPT_VERIFY_MINIMALDATA)
|
||||||
|
@ -98,6 +97,7 @@ BOOST_AUTO_TEST_CASE(tx_valid)
|
||||||
//
|
//
|
||||||
// verifyFlags is a comma separated list of script verification flags to apply, or "NONE"
|
// verifyFlags is a comma separated list of script verification flags to apply, or "NONE"
|
||||||
UniValue tests = read_json(std::string(json_tests::tx_valid, json_tests::tx_valid + sizeof(json_tests::tx_valid)));
|
UniValue tests = read_json(std::string(json_tests::tx_valid, json_tests::tx_valid + sizeof(json_tests::tx_valid)));
|
||||||
|
std::string comment("");
|
||||||
|
|
||||||
auto verifier = libzcash::ProofVerifier::Strict();
|
auto verifier = libzcash::ProofVerifier::Strict();
|
||||||
ScriptError err;
|
ScriptError err;
|
||||||
|
@ -108,7 +108,7 @@ BOOST_AUTO_TEST_CASE(tx_valid)
|
||||||
{
|
{
|
||||||
if (test.size() != 3 || !test[1].isStr() || !test[2].isStr())
|
if (test.size() != 3 || !test[1].isStr() || !test[2].isStr())
|
||||||
{
|
{
|
||||||
BOOST_ERROR("Bad test: " << strTest);
|
BOOST_ERROR("Bad test: " << strTest << comment);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -133,7 +133,7 @@ BOOST_AUTO_TEST_CASE(tx_valid)
|
||||||
}
|
}
|
||||||
if (!fValid)
|
if (!fValid)
|
||||||
{
|
{
|
||||||
BOOST_ERROR("Bad test: " << strTest);
|
BOOST_ERROR("Bad test: " << strTest << comment);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -143,23 +143,30 @@ BOOST_AUTO_TEST_CASE(tx_valid)
|
||||||
stream >> tx;
|
stream >> tx;
|
||||||
|
|
||||||
CValidationState state;
|
CValidationState state;
|
||||||
BOOST_CHECK_MESSAGE(CheckTransaction(tx, state, verifier), strTest);
|
BOOST_CHECK_MESSAGE(CheckTransaction(tx, state, verifier), strTest + comment);
|
||||||
BOOST_CHECK(state.IsValid());
|
BOOST_CHECK_MESSAGE(state.IsValid(), comment);
|
||||||
|
|
||||||
for (unsigned int i = 0; i < tx.vin.size(); i++)
|
for (unsigned int i = 0; i < tx.vin.size(); i++)
|
||||||
{
|
{
|
||||||
if (!mapprevOutScriptPubKeys.count(tx.vin[i].prevout))
|
if (!mapprevOutScriptPubKeys.count(tx.vin[i].prevout))
|
||||||
{
|
{
|
||||||
BOOST_ERROR("Bad test: " << strTest);
|
BOOST_ERROR("Bad test: " << strTest << comment);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
unsigned int verify_flags = ParseScriptFlags(test[2].get_str());
|
unsigned int verify_flags = ParseScriptFlags(test[2].get_str());
|
||||||
BOOST_CHECK_MESSAGE(VerifyScript(tx.vin[i].scriptSig, mapprevOutScriptPubKeys[tx.vin[i].prevout],
|
BOOST_CHECK_MESSAGE(VerifyScript(tx.vin[i].scriptSig, mapprevOutScriptPubKeys[tx.vin[i].prevout],
|
||||||
verify_flags, TransactionSignatureChecker(&tx, i), &err),
|
verify_flags, TransactionSignatureChecker(&tx, i), &err),
|
||||||
strTest);
|
strTest + comment);
|
||||||
BOOST_CHECK_MESSAGE(err == SCRIPT_ERR_OK, ScriptErrorString(err));
|
BOOST_CHECK_MESSAGE(err == SCRIPT_ERR_OK, ScriptErrorString(err) + comment);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
comment = "";
|
||||||
|
}
|
||||||
|
else if (test.size() == 1)
|
||||||
|
{
|
||||||
|
comment += "\n# ";
|
||||||
|
comment += test[0].write();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -174,6 +181,7 @@ BOOST_AUTO_TEST_CASE(tx_invalid)
|
||||||
//
|
//
|
||||||
// verifyFlags is a comma separated list of script verification flags to apply, or "NONE"
|
// verifyFlags is a comma separated list of script verification flags to apply, or "NONE"
|
||||||
UniValue tests = read_json(std::string(json_tests::tx_invalid, json_tests::tx_invalid + sizeof(json_tests::tx_invalid)));
|
UniValue tests = read_json(std::string(json_tests::tx_invalid, json_tests::tx_invalid + sizeof(json_tests::tx_invalid)));
|
||||||
|
std::string comment("");
|
||||||
|
|
||||||
auto verifier = libzcash::ProofVerifier::Strict();
|
auto verifier = libzcash::ProofVerifier::Strict();
|
||||||
ScriptError err;
|
ScriptError err;
|
||||||
|
@ -184,7 +192,7 @@ BOOST_AUTO_TEST_CASE(tx_invalid)
|
||||||
{
|
{
|
||||||
if (test.size() != 3 || !test[1].isStr() || !test[2].isStr())
|
if (test.size() != 3 || !test[1].isStr() || !test[2].isStr())
|
||||||
{
|
{
|
||||||
BOOST_ERROR("Bad test: " << strTest);
|
BOOST_ERROR("Bad test: " << strTest << comment);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -209,7 +217,7 @@ BOOST_AUTO_TEST_CASE(tx_invalid)
|
||||||
}
|
}
|
||||||
if (!fValid)
|
if (!fValid)
|
||||||
{
|
{
|
||||||
BOOST_ERROR("Bad test: " << strTest);
|
BOOST_ERROR("Bad test: " << strTest << comment);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -225,7 +233,7 @@ BOOST_AUTO_TEST_CASE(tx_invalid)
|
||||||
{
|
{
|
||||||
if (!mapprevOutScriptPubKeys.count(tx.vin[i].prevout))
|
if (!mapprevOutScriptPubKeys.count(tx.vin[i].prevout))
|
||||||
{
|
{
|
||||||
BOOST_ERROR("Bad test: " << strTest);
|
BOOST_ERROR("Bad test: " << strTest << comment);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -233,8 +241,15 @@ BOOST_AUTO_TEST_CASE(tx_invalid)
|
||||||
fValid = VerifyScript(tx.vin[i].scriptSig, mapprevOutScriptPubKeys[tx.vin[i].prevout],
|
fValid = VerifyScript(tx.vin[i].scriptSig, mapprevOutScriptPubKeys[tx.vin[i].prevout],
|
||||||
verify_flags, TransactionSignatureChecker(&tx, i), &err);
|
verify_flags, TransactionSignatureChecker(&tx, i), &err);
|
||||||
}
|
}
|
||||||
BOOST_CHECK_MESSAGE(!fValid, strTest);
|
BOOST_CHECK_MESSAGE(!fValid, strTest + comment);
|
||||||
BOOST_CHECK_MESSAGE(err != SCRIPT_ERR_OK, ScriptErrorString(err));
|
BOOST_CHECK_MESSAGE(err != SCRIPT_ERR_OK, ScriptErrorString(err) + comment);
|
||||||
|
|
||||||
|
comment = "";
|
||||||
|
}
|
||||||
|
else if (test.size() == 1)
|
||||||
|
{
|
||||||
|
comment += "\n# ";
|
||||||
|
comment += test[0].write();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue