diff --git a/src/script/interpreter.cpp b/src/script/interpreter.cpp --- a/src/script/interpreter.cpp +++ b/src/script/interpreter.cpp @@ -928,12 +928,6 @@ valtype &vchMessage = stacktop(-2); valtype &vchPubKey = stacktop(-1); - // The size of the message must be 32 bytes. - if (vchMessage.size() != 32) { - return set_error(serror, - SCRIPT_ERR_INVALID_OPERAND_SIZE); - } - if (!CheckDataSignatureEncoding(vchSig, flags, serror) || !CheckPubKeyEncoding(vchPubKey, flags, serror)) { @@ -943,7 +937,9 @@ bool fSuccess = false; if (vchSig.size()) { - uint256 message(vchMessage); + CHashWriter ss(SER_GETHASH, 0); + ss << vchMessage; + uint256 message = ss.GetHash(); CPubKey pubkey(vchPubKey); fSuccess = pubkey.Verify(message, vchSig); } diff --git a/src/test/checkdatasig_tests.cpp b/src/test/checkdatasig_tests.cpp --- a/src/test/checkdatasig_tests.cpp +++ b/src/test/checkdatasig_tests.cpp @@ -102,24 +102,12 @@ CheckErrorForAllFlags({{0x00}, {0x00}}, CScript() << OP_CHECKDATASIGVERIFY, SCRIPT_ERR_INVALID_STACK_OPERATION); - // Check invalid message sizes. - for (valtype message; message.size() < 42; message.push_back(0x00)) { - if (message.size() == 32) { - // 32 is the expected size, skip. - continue; - } - - CheckErrorForAllFlags({{0x00}, message, {0x00}}, - CScript() << OP_CHECKDATASIG, - SCRIPT_ERR_INVALID_OPERAND_SIZE); - - CheckErrorForAllFlags({{0x00}, message, {0x00}}, - CScript() << OP_CHECKDATASIGVERIFY, - SCRIPT_ERR_INVALID_OPERAND_SIZE); - } - // Check various pubkey encoding. - const valtype message(32, 0x00); + const valtype message{}; + + CHashWriter ss(SER_GETHASH, 0); + ss << message; + uint256 messageHash = ss.GetHash(); KeyData kd; valtype pubkey = ToByteVector(kd.pubkey); @@ -141,18 +129,13 @@ const CScript script = CScript() << OP_CHECKDATASIG << OP_NOT << OP_VERIFY; const CScript scriptverify = CScript() << OP_CHECKDATASIGVERIFY; - // Check valid signatures. - const uint256 one(uint256S( - "0000000000000000000000000000000000000000000000000000000000000001")); - const uint256 two(uint256S( - "0000000000000000000000000000000000000000000000000000000000000002")); - + // Check valid signatures (as in the signature format is valid). valtype validsig; - kd.privkey.Sign(one, validsig); + kd.privkey.Sign(messageHash, validsig); - CheckTestResultForAllFlags({validsig, ToByteVector(one), pubkey}, + CheckTestResultForAllFlags({validsig, message, pubkey}, CScript() << OP_CHECKDATASIG, {{0x01}}); - CheckTestResultForAllFlags({validsig, ToByteVector(one), pubkey}, + CheckTestResultForAllFlags({validsig, message, pubkey}, CScript() << OP_CHECKDATASIGVERIFY, {}); const valtype minimalsig{0x30, 0x06, 0x02, 0x01, 0x01, 0x02, 0x01, 0x01}; @@ -193,10 +176,10 @@ SCRIPT_ERR_SIG_NULLFAIL); // Invalid message cause checkdatasig to fail. - CheckError(flags, {validsig, ToByteVector(two), pubkey}, script, + CheckError(flags, {validsig, {0x01}, pubkey}, script, + SCRIPT_ERR_SIG_NULLFAIL); + CheckError(flags, {validsig, {0x01}, pubkey}, scriptverify, SCRIPT_ERR_SIG_NULLFAIL); - CheckError(flags, {validsig, ToByteVector(two), pubkey}, - scriptverify, SCRIPT_ERR_SIG_NULLFAIL); } else { // When nullfail is not enforced, invalid signature are just false. CheckPass(flags, {minimalsig, message, pubkey}, script, {}); @@ -204,9 +187,9 @@ SCRIPT_ERR_CHECKDATASIGVERIFY); // Invalid message cause checkdatasig to fail. - CheckPass(flags, {validsig, ToByteVector(two), pubkey}, script, {}); - CheckError(flags, {validsig, ToByteVector(two), pubkey}, - scriptverify, SCRIPT_ERR_CHECKDATASIGVERIFY); + CheckPass(flags, {validsig, {0x01}, pubkey}, script, {}); + CheckError(flags, {validsig, {0x01}, pubkey}, scriptverify, + SCRIPT_ERR_CHECKDATASIGVERIFY); } if (flags & SCRIPT_VERIFY_LOW_S) { diff --git a/src/test/data/script_tests.json b/src/test/data/script_tests.json --- a/src/test/data/script_tests.json +++ b/src/test/data/script_tests.json @@ -1040,51 +1040,38 @@ ["", "CHECKDATASIG", "P2SH,STRICTENC,NULLFAIL,CHECKDATASIG", "INVALID_STACK_OPERATION"], ["0", "CHECKDATASIG", "P2SH,STRICTENC,NULLFAIL,CHECKDATASIG", "INVALID_STACK_OPERATION"], ["0 0", "CHECKDATASIG", "P2SH,STRICTENC,NULLFAIL,CHECKDATASIG", "INVALID_STACK_OPERATION"], -["0 0 0", "CHECKDATASIG", "P2SH,STRICTENC,NULLFAIL,CHECKDATASIG", "OPERAND_SIZE"], [ - "0 0x21 0x000000000000000000000000000000000000000000000000000000000000000001", - "0 CHECKDATASIG", - "P2SH,STRICTENC,NULLFAIL,CHECKDATASIG", - "OPERAND_SIZE" -], -[ - "0 0x1f 0x00000000000000000000000000000000000000000000000000000000000001", - "0 CHECKDATASIG", - "P2SH,STRICTENC,NULLFAIL,CHECKDATASIG", - "OPERAND_SIZE" -], -[ - "0 0x20 0x0000000000000000000000000000000000000000000000000000000000000001", + "0 0", "0 CHECKDATASIG", "P2SH,STRICTENC,NULLFAIL,CHECKDATASIG", "PUBKEYTYPE" ], [ - "0 0x20 0x0000000000000000000000000000000000000000000000000000000000000001", + "0 0", "0x21 0x038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508 CHECKDATASIG", "P2SH,STRICTENC,NULLFAIL,CHECKDATASIG", "EVAL_FALSE" ], [ - "0x08 0x3006020101020101 0x20 0x0000000000000000000000000000000000000000000000000000000000000001", + "0x08 0x3006020101020101 0", "0x21 0x038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508 CHECKDATASIG", "P2SH,STRICTENC,CHECKDATASIG", "EVAL_FALSE", "Check that NULLFAIL trigger only when specified" ], [ - "0x08 0x3006020101020101 0x20 0x0000000000000000000000000000000000000000000000000000000000000001", + "0x08 0x3006020101020101 0", "0x21 0x038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508 CHECKDATASIG", "P2SH,STRICTENC,NULLFAIL,CHECKDATASIG", "NULLFAIL" ], [ - "0x09 0x300602010102010101 0x20 0x0000000000000000000000000000000000000000000000000000000000000001", + "0x09 0x300602010102010101 0", "0x21 0x038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508 CHECKDATASIG", "P2SH,STRICTENC,NULLFAIL,CHECKDATASIG", "SIG_DER", "Ensure that sighashtype is ignored" ], [ - "0x09 0x300702010102020001 0x20 0x0000000000000000000000000000000000000000000000000000000000000001", + "0x09 0x300702010102020001 0", "0x21 0x038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508 CHECKDATASIG", "P2SH,STRICTENC,NULLFAIL,CHECKDATASIG", "SIG_DER", "Non cannonical DER encoding" @@ -1094,51 +1081,38 @@ ["", "CHECKDATASIGVERIFY 1", "P2SH,STRICTENC,CHECKDATASIG", "INVALID_STACK_OPERATION"], ["0", "CHECKDATASIGVERIFY 1", "P2SH,STRICTENC,NULLFAIL,CHECKDATASIG", "INVALID_STACK_OPERATION"], ["0 0", "CHECKDATASIGVERIFY 1", "P2SH,STRICTENC,NULLFAIL,CHECKDATASIG", "INVALID_STACK_OPERATION"], -["0 0 0", "CHECKDATASIGVERIFY 1", "P2SH,STRICTENC,NULLFAIL,CHECKDATASIG", "OPERAND_SIZE"], -[ - "0 0x21 0x000000000000000000000000000000000000000000000000000000000000000001", - "0 CHECKDATASIGVERIFY 1", - "P2SH,STRICTENC,NULLFAIL,CHECKDATASIG", - "OPERAND_SIZE" -], -[ - "0 0x1f 0x00000000000000000000000000000000000000000000000000000000000001", - "0 CHECKDATASIGVERIFY 1", - "P2SH,STRICTENC,NULLFAIL,CHECKDATASIG", - "OPERAND_SIZE" -], [ - "0 0x20 0x0000000000000000000000000000000000000000000000000000000000000001", + "0 0", "0 CHECKDATASIGVERIFY 1", "P2SH,STRICTENC,NULLFAIL,CHECKDATASIG", "PUBKEYTYPE" ], [ - "0 0x20 0x0000000000000000000000000000000000000000000000000000000000000001", + "0 0", "0x21 0x038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508 CHECKDATASIGVERIFY 1", "P2SH,STRICTENC,NULLFAIL,CHECKDATASIG", "CHECKDATASIGVERIFY" ], [ - "0x08 0x3006020101020101 0x20 0x0000000000000000000000000000000000000000000000000000000000000001", + "0x08 0x3006020101020101 0", "0x21 0x038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508 CHECKDATASIGVERIFY 1", "P2SH,STRICTENC,CHECKDATASIG", "CHECKDATASIGVERIFY", "Check that NULLFAIL trigger only when specified" ], [ - "0x08 0x3006020101020101 0x20 0x0000000000000000000000000000000000000000000000000000000000000001", + "0x08 0x3006020101020101 0", "0x21 0x038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508 CHECKDATASIGVERIFY 1", "P2SH,STRICTENC,NULLFAIL,CHECKDATASIG", "NULLFAIL" ], [ - "0x09 0x300602010102010101 0x20 0x0000000000000000000000000000000000000000000000000000000000000001", + "0x09 0x300602010102010101 0", "0x21 0x038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508 CHECKDATASIGVERIFY 1", "P2SH,STRICTENC,NULLFAIL,CHECKDATASIG", "SIG_DER", "Ensure that sighashtype is ignored" ], [ - "0x09 0x300702010102020001 0x20 0x0000000000000000000000000000000000000000000000000000000000000001", + "0x09 0x300702010102020001 0", "0x21 0x038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508 CHECKDATASIGVERIFY 1", "P2SH,STRICTENC,NULLFAIL,CHECKDATASIG", "SIG_DER", "Non cannonical DER encoding" @@ -2227,168 +2201,168 @@ "P2PK REPLAY PROTECTED" ], [ - "0x46 0x30440220052a549456efe256a8c190650648e7ebdd46161f330830733fc7c674aeb7d3da0220519999b4f25b37de557a9c909cb5b155d1f0b11293b0890236696bfa0bd310e1 0x20 0x0100000000000000000000000000000000000000000000000000000000000000", + "0x46 0x304402203fcefd3a307407b8580565aa41fa57ef8fbfc9470cccab19ed111b3d009b01b8022057e5e2f73a3e6d5e1036bce94a2ea40ecdc7e81a0c1c8bfd6b3dc191f511e312 0", "0x21 0x038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508 CHECKDATASIG", "CHECKDATASIG,NULLFAIL,STRICTENC", "OK", "Standard CHECKDATASIG" ], [ - "0x46 0x30440220052a549456efe256a8c190650648e7ebdd46161f330830733fc7c674aeb7d3da0220519999b4f25b37de557a9c909cb5b155d1f0b11293b0890236696bfa0bd310e1 0x20 0x0200000000000000000000000000000000000000000000000000000000000000", + "0x46 0x304402203fcefd3a307407b8580565aa41fa57ef8fbfc9470cccab19ed111b3d009b01b8022057e5e2f73a3e6d5e1036bce94a2ea40ecdc7e81a0c1c8bfd6b3dc191f511e312 1", "0x21 0x038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508 CHECKDATASIG NOT", "CHECKDATASIG,NULLFAIL,STRICTENC", "NULLFAIL", "CHECKDATASIG with NULLFAIL flags" ], [ - "0x46 0x30440220052a549456efe256a8c190650648e7ebdd46161f330830733fc7c674aeb7d3da0220519999b4f25b37de557a9c909cb5b155d1f0b11293b0890236696bfa0bd310e1 0x20 0x0200000000000000000000000000000000000000000000000000000000000000", + "0x46 0x304402203fcefd3a307407b8580565aa41fa57ef8fbfc9470cccab19ed111b3d009b01b8022057e5e2f73a3e6d5e1036bce94a2ea40ecdc7e81a0c1c8bfd6b3dc191f511e312 1", "0x21 0x038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508 CHECKDATASIG NOT", "CHECKDATASIG,STRICTENC", "OK", "CHECKDATASIG without NULLFAIL flags" ], [ - "0 0x20 0x0100000000000000000000000000000000000000000000000000000000000000", + "0 0", "0x21 0x038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508 CHECKDATASIG NOT", "CHECKDATASIG,NULLFAIL,STRICTENC", "OK", "CHECKDATASIG empty signature" ], [ - "0x47 0x30450220052a549456efe256a8c190650648e7ebdd46161f330830733fc7c674aeb7d3da022100ae66664b0da4c821aa85636f634a4ea8e8be2bd41b9817398968f292c4633060 0x20 0x0100000000000000000000000000000000000000000000000000000000000000", + "0x47 0x304502203fcefd3a307407b8580565aa41fa57ef8fbfc9470cccab19ed111b3d009b01b8022100a81a1d08c5c192a1efc94316b5d15befece6f4cca32c143e54949cfadb245e2f 0", "0x21 0x038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508 CHECKDATASIG", "CHECKDATASIG,NULLFAIL,STRICTENC", "OK", "CHECKDATASIG with High S but no Low S" ], [ - "0x47 0x30450220052a549456efe256a8c190650648e7ebdd46161f330830733fc7c674aeb7d3da022100ae66664b0da4c821aa85636f634a4ea8e8be2bd41b9817398968f292c4633060 0x20 0x0100000000000000000000000000000000000000000000000000000000000000", + "0x47 0x304502203fcefd3a307407b8580565aa41fa57ef8fbfc9470cccab19ed111b3d009b01b8022100a81a1d08c5c192a1efc94316b5d15befece6f4cca32c143e54949cfadb245e2f 0", "0x21 0x038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508 CHECKDATASIG", "CHECKDATASIG,LOW_S,NULLFAIL,STRICTENC", "SIG_HIGH_S", "CHECKDATASIG with High S" ], [ - "0x46 0x30440220e54f8b4dc9b45e1e76207fd0062f3f8b09381e6131d9be3781d2a791fe889c96022038ff0a5f76c1b972149700568ea98b2932e163b5debc78814fc7f1b89f7bcf02 0x20 0x0100000000000000000000000000000000000000000000000000000000000000", + "0x46 0x30440220ad3ed8d119bcbc02c6c7b1ad02441d22f9a5afe0171b2384d7989ef2d58832ce02201074e2e35779b0d1f99b350ff0f445ee0045c5530f1dff1186547cf7cc16935b 0", "0x21 0x038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508 CHECKDATASIG", "CHECKDATASIG,NULLFAIL", "OK", "CHECKDATASIG with too little R padding but no DERSIG" ], [ - "0x46 0x30440220e54f8b4dc9b45e1e76207fd0062f3f8b09381e6131d9be3781d2a791fe889c96022038ff0a5f76c1b972149700568ea98b2932e163b5debc78814fc7f1b89f7bcf02 0x20 0x0100000000000000000000000000000000000000000000000000000000000000", + "0x46 0x30440220ad3ed8d119bcbc02c6c7b1ad02441d22f9a5afe0171b2384d7989ef2d58832ce02201074e2e35779b0d1f99b350ff0f445ee0045c5530f1dff1186547cf7cc16935b 0", "0x21 0x038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508 CHECKDATASIG", "CHECKDATASIG,NULLFAIL,STRICTENC", "SIG_DER", "CHECKDATASIG with too little R padding" ], [ - "0x46 0x304402201f9ab6bce51855179000754f239bcdc91682e556275514ec72a6b429b8972da2022076ba6228144dbaaeffb5e58ead6281a56bd4e3ae05f0890d1bbb5dad8f61b1ac 0x20 0x0100000000000000000000000000000000000000000000000000000000000000", + "0x46 0x3044022020eaad358efbbbe38655a0c9a1bbaa6bd85037d5c2ebb813b57dcfb55621f57202206b25bf677746f2347be832d0dba6fe80e081ba693a46222d5bdfbdb33ae2c297 0", "0x41 0x0679be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8 CHECKDATASIG", "CHECKDATASIG,NULLFAIL", "OK", "CHECKDATASIG with hybrid pubkey but no STRICTENC" ], [ - "0x46 0x304402201f9ab6bce51855179000754f239bcdc91682e556275514ec72a6b429b8972da2022076ba6228144dbaaeffb5e58ead6281a56bd4e3ae05f0890d1bbb5dad8f61b1ac 0x20 0x0100000000000000000000000000000000000000000000000000000000000000", + "0x46 0x3044022020eaad358efbbbe38655a0c9a1bbaa6bd85037d5c2ebb813b57dcfb55621f57202206b25bf677746f2347be832d0dba6fe80e081ba693a46222d5bdfbdb33ae2c297 0", "0x41 0x0679be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8 CHECKDATASIG", "CHECKDATASIG,NULLFAIL,STRICTENC", "PUBKEYTYPE", "CHECKDATASIG with hybrid pubkey" ], [ - "0x46 0x304402201f9ab6bce51854179000754f239bcdc91682e556275514ec72a6b429b8972da2022076ba6228144dbaaeffb5e58ead6281a56bd4e3ae05f0890d1bbb5dad8f61b1ac 0x20 0x0100000000000000000000000000000000000000000000000000000000000000", + "0x46 0x3044022020eaad358efbbae38655a0c9a1bbaa6bd85037d5c2ebb813b57dcfb55621f57202206b25bf677746f2347be832d0dba6fe80e081ba693a46222d5bdfbdb33ae2c297 0", "0x41 0x0679be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8 CHECKDATASIG NOT", "CHECKDATASIG", "OK", "CHECKDATASIG with invalid hybrid pubkey but no STRICTENC" ], [ - "0x46 0x304402201f9ab6bce51854179000754f239bcdc91682e556275514ec72a6b429b8972da2022076ba6228144dbaaeffb5e58ead6281a56bd4e3ae05f0890d1bbb5dad8f61b1ac 0x20 0x0100000000000000000000000000000000000000000000000000000000000000", + "0x46 0x3044022020eaad358efbbae38655a0c9a1bbaa6bd85037d5c2ebb813b57dcfb55621f57202206b25bf677746f2347be832d0dba6fe80e081ba693a46222d5bdfbdb33ae2c297 0", "0x41 0x0679be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8 CHECKDATASIG", "CHECKDATASIG,NULLFAIL,STRICTENC", "PUBKEYTYPE", "CHECKDATASIG with invalid hybrid pubkey" ], [ - "0x46 0x30440220052a549456efe256a8c190650648e7ebdd46161f330830733fc7c674aeb7d3da0220519999b4f25b37de557a9c909cb5b155d1f0b11293b0890236696bfa0bd310e1 0x20 0x0100000000000000000000000000000000000000000000000000000000000000", + "0x46 0x304402203fcefd3a307407b8580565aa41fa57ef8fbfc9470cccab19ed111b3d009b01b8022057e5e2f73a3e6d5e1036bce94a2ea40ecdc7e81a0c1c8bfd6b3dc191f511e312 0", "0x21 0x038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508 CHECKDATASIGVERIFY 1", "CHECKDATASIG,NULLFAIL,STRICTENC", "OK", "Standard CHECKDATASIGVERIFY" ], [ - "0x46 0x30440220052a549456efe256a8c190650648e7ebdd46161f330830733fc7c674aeb7d3da0220519999b4f25b37de557a9c909cb5b155d1f0b11293b0890236696bfa0bd310e1 0x20 0x0200000000000000000000000000000000000000000000000000000000000000", + "0x46 0x304402203fcefd3a307407b8580565aa41fa57ef8fbfc9470cccab19ed111b3d009b01b8022057e5e2f73a3e6d5e1036bce94a2ea40ecdc7e81a0c1c8bfd6b3dc191f511e312 1", "0x21 0x038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508 CHECKDATASIGVERIFY 1", "CHECKDATASIG,NULLFAIL,STRICTENC", "NULLFAIL", "CHECKDATASIGVERIFY with NULLFAIL flags" ], [ - "0x46 0x30440220052a549456efe256a8c190650648e7ebdd46161f330830733fc7c674aeb7d3da0220519999b4f25b37de557a9c909cb5b155d1f0b11293b0890236696bfa0bd310e1 0x20 0x0200000000000000000000000000000000000000000000000000000000000000", + "0x46 0x304402203fcefd3a307407b8580565aa41fa57ef8fbfc9470cccab19ed111b3d009b01b8022057e5e2f73a3e6d5e1036bce94a2ea40ecdc7e81a0c1c8bfd6b3dc191f511e312 1", "0x21 0x038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508 CHECKDATASIGVERIFY 1", "CHECKDATASIG,STRICTENC", "CHECKDATASIGVERIFY", "CHECKDATASIGVERIFY without NULLFAIL flags" ], [ - "0 0x20 0x0100000000000000000000000000000000000000000000000000000000000000", + "0 0", "0x21 0x038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508 CHECKDATASIGVERIFY 1", "CHECKDATASIG,NULLFAIL,STRICTENC", "CHECKDATASIGVERIFY", "CHECKDATASIGVERIFY empty signature" ], [ - "0x47 0x30450220052a549456efe256a8c190650648e7ebdd46161f330830733fc7c674aeb7d3da022100ae66664b0da4c821aa85636f634a4ea8e8be2bd41b9817398968f292c4633060 0x20 0x0100000000000000000000000000000000000000000000000000000000000000", + "0x47 0x304502203fcefd3a307407b8580565aa41fa57ef8fbfc9470cccab19ed111b3d009b01b8022100a81a1d08c5c192a1efc94316b5d15befece6f4cca32c143e54949cfadb245e2f 0", "0x21 0x038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508 CHECKDATASIGVERIFY 1", "CHECKDATASIG,NULLFAIL,STRICTENC", "OK", "CHECKDATASIG with High S but no Low S" ], [ - "0x47 0x30450220052a549456efe256a8c190650648e7ebdd46161f330830733fc7c674aeb7d3da022100ae66664b0da4c821aa85636f634a4ea8e8be2bd41b9817398968f292c4633060 0x20 0x0100000000000000000000000000000000000000000000000000000000000000", + "0x47 0x304502203fcefd3a307407b8580565aa41fa57ef8fbfc9470cccab19ed111b3d009b01b8022100a81a1d08c5c192a1efc94316b5d15befece6f4cca32c143e54949cfadb245e2f 0", "0x21 0x038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508 CHECKDATASIGVERIFY 1", "CHECKDATASIG,LOW_S,NULLFAIL,STRICTENC", "SIG_HIGH_S", "CHECKDATASIG with High S" ], [ - "0x46 0x30440220e54f8b4dc9b45e1e76207fd0062f3f8b09381e6131d9be3781d2a791fe889c96022038ff0a5f76c1b972149700568ea98b2932e163b5debc78814fc7f1b89f7bcf02 0x20 0x0100000000000000000000000000000000000000000000000000000000000000", + "0x46 0x30440220ad3ed8d119bcbc02c6c7b1ad02441d22f9a5afe0171b2384d7989ef2d58832ce02201074e2e35779b0d1f99b350ff0f445ee0045c5530f1dff1186547cf7cc16935b 0", "0x21 0x038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508 CHECKDATASIGVERIFY 1", "CHECKDATASIG,NULLFAIL", "OK", "CHECKDATASIGVERIFY with too little R padding but no DERSIG" ], [ - "0x46 0x30440220e54f8b4dc9b45e1e76207fd0062f3f8b09381e6131d9be3781d2a791fe889c96022038ff0a5f76c1b972149700568ea98b2932e163b5debc78814fc7f1b89f7bcf02 0x20 0x0100000000000000000000000000000000000000000000000000000000000000", + "0x46 0x30440220ad3ed8d119bcbc02c6c7b1ad02441d22f9a5afe0171b2384d7989ef2d58832ce02201074e2e35779b0d1f99b350ff0f445ee0045c5530f1dff1186547cf7cc16935b 0", "0x21 0x038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508 CHECKDATASIGVERIFY 1", "CHECKDATASIG,NULLFAIL,STRICTENC", "SIG_DER", "CHECKDATASIGVERIFY with too little R padding" ], [ - "0x46 0x304402201f9ab6bce51855179000754f239bcdc91682e556275514ec72a6b429b8972da2022076ba6228144dbaaeffb5e58ead6281a56bd4e3ae05f0890d1bbb5dad8f61b1ac 0x20 0x0100000000000000000000000000000000000000000000000000000000000000", + "0x46 0x3044022020eaad358efbbbe38655a0c9a1bbaa6bd85037d5c2ebb813b57dcfb55621f57202206b25bf677746f2347be832d0dba6fe80e081ba693a46222d5bdfbdb33ae2c297 0", "0x41 0x0679be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8 CHECKDATASIGVERIFY 1", "CHECKDATASIG,NULLFAIL", "OK", "CHECKDATASIGVERIFY with hybrid pubkey but no STRICTENC" ], [ - "0x46 0x304402201f9ab6bce51855179000754f239bcdc91682e556275514ec72a6b429b8972da2022076ba6228144dbaaeffb5e58ead6281a56bd4e3ae05f0890d1bbb5dad8f61b1ac 0x20 0x0100000000000000000000000000000000000000000000000000000000000000", + "0x46 0x3044022020eaad358efbbbe38655a0c9a1bbaa6bd85037d5c2ebb813b57dcfb55621f57202206b25bf677746f2347be832d0dba6fe80e081ba693a46222d5bdfbdb33ae2c297 0", "0x41 0x0679be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8 CHECKDATASIGVERIFY 1", "CHECKDATASIG,NULLFAIL,STRICTENC", "PUBKEYTYPE", "CHECKDATASIGVERIFY with hybrid pubkey" ], [ - "0x46 0x304402201f9ab6bce51854179000754f239bcdc91682e556275514ec72a6b429b8972da2022076ba6228144dbaaeffb5e58ead6281a56bd4e3ae05f0890d1bbb5dad8f61b1ac 0x20 0x0100000000000000000000000000000000000000000000000000000000000000", + "0x46 0x3044022020eaad358efbbae38655a0c9a1bbaa6bd85037d5c2ebb813b57dcfb55621f57202206b25bf677746f2347be832d0dba6fe80e081ba693a46222d5bdfbdb33ae2c297 0", "0x41 0x0679be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8 CHECKDATASIGVERIFY 1", "CHECKDATASIG", "CHECKDATASIGVERIFY", "CHECKDATASIGVERIFY with invalid hybrid pubkey but no STRICTENC" ], [ - "0x46 0x304402201f9ab6bce51854179000754f239bcdc91682e556275514ec72a6b429b8972da2022076ba6228144dbaaeffb5e58ead6281a56bd4e3ae05f0890d1bbb5dad8f61b1ac 0x20 0x0100000000000000000000000000000000000000000000000000000000000000", + "0x46 0x3044022020eaad358efbbae38655a0c9a1bbaa6bd85037d5c2ebb813b57dcfb55621f57202206b25bf677746f2347be832d0dba6fe80e081ba693a46222d5bdfbdb33ae2c297 0", "0x41 0x0679be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8 CHECKDATASIGVERIFY 1", "CHECKDATASIG,NULLFAIL,STRICTENC", "PUBKEYTYPE", diff --git a/src/test/script_tests.cpp b/src/test/script_tests.cpp --- a/src/test/script_tests.cpp +++ b/src/test/script_tests.cpp @@ -342,9 +342,12 @@ return *this; } - TestBuilder &PushDataSig(const CKey &key, const uint256 &hash, + TestBuilder &PushDataSig(const CKey &key, const std::vector &data, unsigned int lenR = 32, unsigned int lenS = 32) { - DoPush(DoSign(key, hash, lenR, lenS)); + CHashWriter ss(SER_GETHASH, 0); + ss << data; + + DoPush(DoSign(key, ss.GetHash(), lenR, lenS)); return *this; } @@ -1127,10 +1130,6 @@ .ScriptError(SCRIPT_ERR_EVAL_FALSE)); // Test OP_CHECKDATASIG - static const uint256 one(uint256S( - "0000000000000000000000000000000000000000000000000000000000000001")); - static const uint256 two(uint256S( - "0000000000000000000000000000000000000000000000000000000000000002")); const uint32_t checkdatasigflags = SCRIPT_VERIFY_STRICTENC | SCRIPT_VERIFY_NULLFAIL | SCRIPT_ENABLE_CHECKDATASIG; @@ -1138,80 +1137,80 @@ tests.push_back( TestBuilder(CScript() << ToByteVector(keys.pubkey1C) << OP_CHECKDATASIG, "Standard CHECKDATASIG", checkdatasigflags) - .PushDataSig(keys.key1, one) - .Push(one)); + .PushDataSig(keys.key1, {}) + .Num(0)); tests.push_back(TestBuilder(CScript() << ToByteVector(keys.pubkey1C) << OP_CHECKDATASIG << OP_NOT, "CHECKDATASIG with NULLFAIL flags", checkdatasigflags) - .PushDataSig(keys.key1, one) - .Push(two) + .PushDataSig(keys.key1, {}) + .Num(1) .ScriptError(SCRIPT_ERR_SIG_NULLFAIL)); tests.push_back(TestBuilder(CScript() << ToByteVector(keys.pubkey1C) << OP_CHECKDATASIG << OP_NOT, "CHECKDATASIG without NULLFAIL flags", checkdatasigflags & ~SCRIPT_VERIFY_NULLFAIL) - .PushDataSig(keys.key1, one) - .Push(two)); + .PushDataSig(keys.key1, {}) + .Num(1)); tests.push_back(TestBuilder(CScript() << ToByteVector(keys.pubkey1C) << OP_CHECKDATASIG << OP_NOT, "CHECKDATASIG empty signature", checkdatasigflags) .Num(0) - .Push(one)); + .Num(0)); tests.push_back( TestBuilder(CScript() << ToByteVector(keys.pubkey1C) << OP_CHECKDATASIG, "CHECKDATASIG with High S but no Low S", checkdatasigflags) - .PushDataSig(keys.key1, one, 32, 33) - .Push(one)); + .PushDataSig(keys.key1, {}, 32, 33) + .Num(0)); tests.push_back( TestBuilder(CScript() << ToByteVector(keys.pubkey1C) << OP_CHECKDATASIG, "CHECKDATASIG with High S", checkdatasigflags | SCRIPT_VERIFY_LOW_S) - .PushDataSig(keys.key1, one, 32, 33) - .Push(one) + .PushDataSig(keys.key1, {}, 32, 33) + .Num(0) .ScriptError(SCRIPT_ERR_SIG_HIGH_S)); tests.push_back( TestBuilder(CScript() << ToByteVector(keys.pubkey1C) << OP_CHECKDATASIG, "CHECKDATASIG with too little R padding but no DERSIG", checkdatasigflags & ~SCRIPT_VERIFY_STRICTENC) - .PushDataSig(keys.key1, one, 33, 32) + .PushDataSig(keys.key1, {}, 33, 32) .EditPush(1, "45022100", "440220") - .Push(one)); + .Num(0)); tests.push_back( TestBuilder(CScript() << ToByteVector(keys.pubkey1C) << OP_CHECKDATASIG, "CHECKDATASIG with too little R padding", checkdatasigflags) - .PushDataSig(keys.key1, one, 33, 32) + .PushDataSig(keys.key1, {}, 33, 32) .EditPush(1, "45022100", "440220") - .Push(one) + .Num(0) .ScriptError(SCRIPT_ERR_SIG_DER)); tests.push_back( TestBuilder(CScript() << ToByteVector(keys.pubkey0H) << OP_CHECKDATASIG, "CHECKDATASIG with hybrid pubkey but no STRICTENC", checkdatasigflags & ~SCRIPT_VERIFY_STRICTENC) - .PushDataSig(keys.key0, one) - .Push(one)); + .PushDataSig(keys.key0, {}) + .Num(0)); tests.push_back( TestBuilder(CScript() << ToByteVector(keys.pubkey0H) << OP_CHECKDATASIG, "CHECKDATASIG with hybrid pubkey", checkdatasigflags) - .PushDataSig(keys.key0, one) - .Push(one) + .PushDataSig(keys.key0, {}) + .Num(0) .ScriptError(SCRIPT_ERR_PUBKEYTYPE)); tests.push_back( TestBuilder(CScript() << ToByteVector(keys.pubkey0H) << OP_CHECKDATASIG << OP_NOT, "CHECKDATASIG with invalid hybrid pubkey but no STRICTENC", SCRIPT_ENABLE_CHECKDATASIG) - .PushDataSig(keys.key0, one) + .PushDataSig(keys.key0, {}) .DamagePush(10) - .Push(one)); + .Num(0)); tests.push_back( TestBuilder(CScript() << ToByteVector(keys.pubkey0H) << OP_CHECKDATASIG, "CHECKDATASIG with invalid hybrid pubkey", checkdatasigflags) - .PushDataSig(keys.key0, one) + .PushDataSig(keys.key0, {}) .DamagePush(10) - .Push(one) + .Num(0) .ScriptError(SCRIPT_ERR_PUBKEYTYPE)); // Test OP_CHECKDATASIGVERIFY @@ -1219,41 +1218,41 @@ << OP_CHECKDATASIGVERIFY << OP_TRUE, "Standard CHECKDATASIGVERIFY", checkdatasigflags) - .PushDataSig(keys.key1, one) - .Push(one)); + .PushDataSig(keys.key1, {}) + .Num(0)); tests.push_back(TestBuilder(CScript() << ToByteVector(keys.pubkey1C) << OP_CHECKDATASIGVERIFY << OP_TRUE, "CHECKDATASIGVERIFY with NULLFAIL flags", checkdatasigflags) - .PushDataSig(keys.key1, one) - .Push(two) + .PushDataSig(keys.key1, {}) + .Num(1) .ScriptError(SCRIPT_ERR_SIG_NULLFAIL)); tests.push_back(TestBuilder(CScript() << ToByteVector(keys.pubkey1C) << OP_CHECKDATASIGVERIFY << OP_TRUE, "CHECKDATASIGVERIFY without NULLFAIL flags", checkdatasigflags & ~SCRIPT_VERIFY_NULLFAIL) - .PushDataSig(keys.key1, one) - .Push(two) + .PushDataSig(keys.key1, {}) + .Num(1) .ScriptError(SCRIPT_ERR_CHECKDATASIGVERIFY)); tests.push_back(TestBuilder(CScript() << ToByteVector(keys.pubkey1C) << OP_CHECKDATASIGVERIFY << OP_TRUE, "CHECKDATASIGVERIFY empty signature", checkdatasigflags) .Num(0) - .Push(one) + .Num(0) .ScriptError(SCRIPT_ERR_CHECKDATASIGVERIFY)); tests.push_back(TestBuilder(CScript() << ToByteVector(keys.pubkey1C) << OP_CHECKDATASIGVERIFY << OP_TRUE, "CHECKDATASIG with High S but no Low S", checkdatasigflags) - .PushDataSig(keys.key1, one, 32, 33) - .Push(one)); + .PushDataSig(keys.key1, {}, 32, 33) + .Num(0)); tests.push_back(TestBuilder(CScript() << ToByteVector(keys.pubkey1C) << OP_CHECKDATASIGVERIFY << OP_TRUE, "CHECKDATASIG with High S", checkdatasigflags | SCRIPT_VERIFY_LOW_S) - .PushDataSig(keys.key1, one, 32, 33) - .Push(one) + .PushDataSig(keys.key1, {}, 32, 33) + .Num(0) .ScriptError(SCRIPT_ERR_SIG_HIGH_S)); tests.push_back( TestBuilder( @@ -1261,30 +1260,30 @@ << OP_TRUE, "CHECKDATASIGVERIFY with too little R padding but no DERSIG", checkdatasigflags & ~SCRIPT_VERIFY_STRICTENC) - .PushDataSig(keys.key1, one, 33, 32) + .PushDataSig(keys.key1, {}, 33, 32) .EditPush(1, "45022100", "440220") - .Push(one)); + .Num(0)); tests.push_back(TestBuilder(CScript() << ToByteVector(keys.pubkey1C) << OP_CHECKDATASIGVERIFY << OP_TRUE, "CHECKDATASIGVERIFY with too little R padding", checkdatasigflags) - .PushDataSig(keys.key1, one, 33, 32) + .PushDataSig(keys.key1, {}, 33, 32) .EditPush(1, "45022100", "440220") - .Push(one) + .Num(0) .ScriptError(SCRIPT_ERR_SIG_DER)); tests.push_back( TestBuilder(CScript() << ToByteVector(keys.pubkey0H) << OP_CHECKDATASIGVERIFY << OP_TRUE, "CHECKDATASIGVERIFY with hybrid pubkey but no STRICTENC", checkdatasigflags & ~SCRIPT_VERIFY_STRICTENC) - .PushDataSig(keys.key0, one) - .Push(one)); + .PushDataSig(keys.key0, {}) + .Num(0)); tests.push_back(TestBuilder(CScript() << ToByteVector(keys.pubkey0H) << OP_CHECKDATASIGVERIFY << OP_TRUE, "CHECKDATASIGVERIFY with hybrid pubkey", checkdatasigflags) - .PushDataSig(keys.key0, one) - .Push(one) + .PushDataSig(keys.key0, {}) + .Num(0) .ScriptError(SCRIPT_ERR_PUBKEYTYPE)); tests.push_back( TestBuilder( @@ -1292,17 +1291,17 @@ << OP_TRUE, "CHECKDATASIGVERIFY with invalid hybrid pubkey but no STRICTENC", SCRIPT_ENABLE_CHECKDATASIG) - .PushDataSig(keys.key0, one) + .PushDataSig(keys.key0, {}) .DamagePush(10) - .Push(one) + .Num(0) .ScriptError(SCRIPT_ERR_CHECKDATASIGVERIFY)); tests.push_back(TestBuilder(CScript() << ToByteVector(keys.pubkey0H) << OP_CHECKDATASIGVERIFY << OP_TRUE, "CHECKDATASIGVERIFY with invalid hybrid pubkey", checkdatasigflags) - .PushDataSig(keys.key0, one) + .PushDataSig(keys.key0, {}) .DamagePush(10) - .Push(one) + .Num(0) .ScriptError(SCRIPT_ERR_PUBKEYTYPE)); std::set tests_set; diff --git a/test/functional/abc-checkdatasig-activation.py b/test/functional/abc-checkdatasig-activation.py --- a/test/functional/abc-checkdatasig-activation.py +++ b/test/functional/abc-checkdatasig-activation.py @@ -47,9 +47,8 @@ tx.vin = [CTxIn(COutPoint(int(utxo["txid"], 16), utxo["vout"]))] tx.vout = [] signature = bytearray.fromhex( - '30440220052a549456efe256a8c190650648e7ebdd46161f330830733fc7c674aeb7d3da0220519999b4f25b37de557a9c909cb5b155d1f0b11293b0890236696bfa0bd310e1') - message = bytearray.fromhex( - '0100000000000000000000000000000000000000000000000000000000000000') + '304402203fcefd3a307407b8580565aa41fa57ef8fbfc9470cccab19ed111b3d009b01b8022057e5e2f73a3e6d5e1036bce94a2ea40ecdc7e81a0c1c8bfd6b3dc191f511e312') + message = bytearray.fromhex('') pubkey = bytearray.fromhex( '038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508') for _ in range(count):