diff --git a/src/script/interpreter.cpp b/src/script/interpreter.cpp --- a/src/script/interpreter.cpp +++ b/src/script/interpreter.cpp @@ -913,11 +913,6 @@ case OP_CHECKDATASIG: case OP_CHECKDATASIGVERIFY: { - // Make sure this remains an error before activation. - if ((flags & SCRIPT_ENABLE_CHECKDATASIG) == 0) { - return set_error(serror, SCRIPT_ERR_BAD_OPCODE); - } - // (sig message pubkey -- bool) if (stack.size() < 3) { return set_error( diff --git a/src/script/script_flags.h b/src/script/script_flags.h --- a/src/script/script_flags.h +++ b/src/script/script_flags.h @@ -95,8 +95,9 @@ // SCRIPT_ENABLE_REPLAY_PROTECTION = (1U << 17), - // Is OP_CHECKDATASIG and variant are enabled, and must be counted towards - // Sigops limits. + // Count sigops for OP_CHECKDATASIG and variant. The interpreter treats + // OP_CHECKDATASIG(VERIFY) as always valid, this flag only affects sigops + // counting. // SCRIPT_ENABLE_CHECKDATASIG = (1U << 18), 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 @@ -66,12 +66,11 @@ const CScript &script, const stacktype &expected) { for (uint32_t flags : flagset) { - // Make sure that we get a bad opcode when the activation flag is not - // passed. - CheckError(flags & ~SCRIPT_ENABLE_CHECKDATASIG, original_stack, script, - SCRIPT_ERR_BAD_OPCODE); + // The script executes as expected if the opcodes are not activated. + CheckPass(flags & ~SCRIPT_ENABLE_CHECKDATASIG, original_stack, script, + expected); - // The script execute as expected if the opcodes are activated. + // The script executes as expected if the opcodes are activated. CheckPass(flags | SCRIPT_ENABLE_CHECKDATASIG, original_stack, script, expected); } @@ -80,10 +79,10 @@ static void CheckErrorForAllFlags(const stacktype &original_stack, const CScript &script, ScriptError expected) { for (uint32_t flags : flagset) { - // Make sure that we get a bad opcode when the activation flag is not - // passed. + // The script generates the proper error if the opcodes are not + // activated. CheckError(flags & ~SCRIPT_ENABLE_CHECKDATASIG, original_stack, script, - SCRIPT_ERR_BAD_OPCODE); + expected); // The script generates the proper error if the opcodes are activated. CheckError(flags | SCRIPT_ENABLE_CHECKDATASIG, original_stack, script, 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 @@ -1233,8 +1233,6 @@ "P2SH,DISCOURAGE_UPGRADABLE_NOPS", "DISCOURAGE_UPGRADABLE_NOPS", "Discouraged NOP10 in redeemScript"], ["0x50","1", "P2SH,STRICTENC", "BAD_OPCODE", "opcode 0x50 is reserved"], -["1", "IF CHECKDATASIG ELSE 1 ENDIF", "P2SH,STRICTENC", "BAD_OPCODE"], -["1", "IF CHECKDATASIGVERIFY ELSE 1 ENDIF", "P2SH,STRICTENC", "BAD_OPCODE"], ["1", "IF 0xbc ELSE 1 ENDIF", "P2SH,STRICTENC", "BAD_OPCODE", "opcodes >= FIRST_UNDEFINED_OP_VALUE invalid if executed"], ["1", "IF 0xbd ELSE 1 ENDIF", "P2SH,STRICTENC", "BAD_OPCODE"], ["1", "IF 0xbe ELSE 1 ENDIF", "P2SH,STRICTENC", "BAD_OPCODE"], @@ -2475,6 +2473,174 @@ "CHECKDATASIGVERIFY with invalid hybrid pubkey" ], [ + "0x46 0x3044022021309a532a60d471cc4ef025a96572c7bf26c4640b53c7d45e411a5aa99980f6022037964f01a61db1b24ea44137b3d67d7095ec25f68bd7b508e01441e5539d96a9 0", + "0x21 0x038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508 CHECKDATASIG", + "NULLFAIL,STRICTENC", + "OK", + "Standard CHECKDATASIG without CHECKDATASIG flag" +], +[ + "0x46 0x3044022021309a532a60d471cc4ef025a96572c7bf26c4640b53c7d45e411a5aa99980f6022037964f01a61db1b24ea44137b3d67d7095ec25f68bd7b508e01441e5539d96a9 1", + "0x21 0x038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508 CHECKDATASIG NOT", + "NULLFAIL,STRICTENC", + "NULLFAIL", + "CHECKDATASIG with NULLFAIL flags and without CHECKDATASIG flag" +], +[ + "0x46 0x3044022021309a532a60d471cc4ef025a96572c7bf26c4640b53c7d45e411a5aa99980f6022037964f01a61db1b24ea44137b3d67d7095ec25f68bd7b508e01441e5539d96a9 1", + "0x21 0x038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508 CHECKDATASIG NOT", + "STRICTENC", + "OK", + "CHECKDATASIG without NULLFAIL flags and without CHECKDATASIG flag" +], +[ + "0 0", + "0x21 0x038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508 CHECKDATASIG NOT", + "NULLFAIL,STRICTENC", + "OK", + "CHECKDATASIG empty signature without CHECKDATASIG flag" +], +[ + "0x47 0x3045022021309a532a60d471cc4ef025a96572c7bf26c4640b53c7d45e411a5aa99980f6022100c869b0fe59e24e4db15bbec84c29828e24c2b6f02370eb32dfbe1ca77c98aa98 0", + "0x21 0x038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508 CHECKDATASIG", + "NULLFAIL,STRICTENC", + "OK", + "CHECKDATASIG with High S but no Low S and without CHECKDATASIG flag" +], +[ + "0x47 0x3045022021309a532a60d471cc4ef025a96572c7bf26c4640b53c7d45e411a5aa99980f6022100c869b0fe59e24e4db15bbec84c29828e24c2b6f02370eb32dfbe1ca77c98aa98 0", + "0x21 0x038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508 CHECKDATASIG", + "LOW_S,NULLFAIL,STRICTENC", + "SIG_HIGH_S", + "CHECKDATASIG with High S and without CHECKDATASIG flag" +], +[ + "0x46 0x3044022093cbfaab2bbef6fc019d1286018fd11e2612d817756d40913b3f82a428f1e90a022045d010bd0f3c31aa470d096bb3f693275214f48d4e727f45a9e0adb2645d7489 0", + "0x21 0x038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508 CHECKDATASIG", + "NULLFAIL", + "OK", + "CHECKDATASIG with too little R padding but no DERSIG and without CHECKDATASIG flag" +], +[ + "0x46 0x3044022093cbfaab2bbef6fc019d1286018fd11e2612d817756d40913b3f82a428f1e90a022045d010bd0f3c31aa470d096bb3f693275214f48d4e727f45a9e0adb2645d7489 0", + "0x21 0x038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508 CHECKDATASIG", + "NULLFAIL,STRICTENC", + "SIG_DER", + "CHECKDATASIG with too little R padding and without CHECKDATASIG flag" +], +[ + "0x46 0x304402205ffea7d9fa4e0ce8058c96edfb721aaf2840912080ac4ae86a92d9462e69fde302203567149cb9c8c343523a87d7a64be304983899d2e2c6f267a7136c48ff21908d 0", + "0x41 0x0679be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8 CHECKDATASIG", + "NULLFAIL", + "OK", + "CHECKDATASIG with hybrid pubkey but no STRICTENC and without CHECKDATASIG flag" +], +[ + "0x46 0x304402205ffea7d9fa4e0ce8058c96edfb721aaf2840912080ac4ae86a92d9462e69fde302203567149cb9c8c343523a87d7a64be304983899d2e2c6f267a7136c48ff21908d 0", + "0x41 0x0679be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8 CHECKDATASIG", + "NULLFAIL,STRICTENC", + "PUBKEYTYPE", + "CHECKDATASIG with hybrid pubkey and without CHECKDATASIG flag" +], +[ + "0x46 0x304402205ffea7d9fa4e0de8058c96edfb721aaf2840912080ac4ae86a92d9462e69fde302203567149cb9c8c343523a87d7a64be304983899d2e2c6f267a7136c48ff21908d 0", + "0x41 0x0679be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8 CHECKDATASIG NOT", + "CHECKDATASIG", + "OK", + "CHECKDATASIG with invalid hybrid pubkey but no STRICTENC and without CHECKDATASIG flag" +], +[ + "0x46 0x304402205ffea7d9fa4e0de8058c96edfb721aaf2840912080ac4ae86a92d9462e69fde302203567149cb9c8c343523a87d7a64be304983899d2e2c6f267a7136c48ff21908d 0", + "0x41 0x0679be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8 CHECKDATASIG", + "NULLFAIL,STRICTENC", + "PUBKEYTYPE", + "CHECKDATASIG with invalid hybrid pubkey and without CHECKDATASIG flag" +], +[ + "0x46 0x3044022021309a532a60d471cc4ef025a96572c7bf26c4640b53c7d45e411a5aa99980f6022037964f01a61db1b24ea44137b3d67d7095ec25f68bd7b508e01441e5539d96a9 0", + "0x21 0x038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508 CHECKDATASIGVERIFY 1", + "NULLFAIL,STRICTENC", + "OK", + "Standard CHECKDATASIGVERIFY without CHECKDATASIG flag" +], +[ + "0x46 0x3044022021309a532a60d471cc4ef025a96572c7bf26c4640b53c7d45e411a5aa99980f6022037964f01a61db1b24ea44137b3d67d7095ec25f68bd7b508e01441e5539d96a9 1", + "0x21 0x038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508 CHECKDATASIGVERIFY 1", + "NULLFAIL,STRICTENC", + "NULLFAIL", + "CHECKDATASIGVERIFY with NULLFAIL flags and without CHECKDATASIG flag" +], +[ + "0x46 0x3044022021309a532a60d471cc4ef025a96572c7bf26c4640b53c7d45e411a5aa99980f6022037964f01a61db1b24ea44137b3d67d7095ec25f68bd7b508e01441e5539d96a9 1", + "0x21 0x038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508 CHECKDATASIGVERIFY 1", + "STRICTENC", + "CHECKDATASIGVERIFY", + "CHECKDATASIGVERIFY without NULLFAIL flags and without CHECKDATASIG flag" +], +[ + "0 0", + "0x21 0x038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508 CHECKDATASIGVERIFY 1", + "NULLFAIL,STRICTENC", + "CHECKDATASIGVERIFY", + "CHECKDATASIGVERIFY empty signature without CHECKDATASIG flag" +], +[ + "0x47 0x3045022021309a532a60d471cc4ef025a96572c7bf26c4640b53c7d45e411a5aa99980f6022100c869b0fe59e24e4db15bbec84c29828e24c2b6f02370eb32dfbe1ca77c98aa98 0", + "0x21 0x038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508 CHECKDATASIGVERIFY 1", + "NULLFAIL,STRICTENC", + "OK", + "CHECKDATASIG with High S but no Low S and without CHECKDATASIG flag" +], +[ + "0x47 0x3045022021309a532a60d471cc4ef025a96572c7bf26c4640b53c7d45e411a5aa99980f6022100c869b0fe59e24e4db15bbec84c29828e24c2b6f02370eb32dfbe1ca77c98aa98 0", + "0x21 0x038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508 CHECKDATASIGVERIFY 1", + "LOW_S,NULLFAIL,STRICTENC", + "SIG_HIGH_S", + "CHECKDATASIG with High S and without CHECKDATASIG flag" +], +[ + "0x46 0x3044022093cbfaab2bbef6fc019d1286018fd11e2612d817756d40913b3f82a428f1e90a022045d010bd0f3c31aa470d096bb3f693275214f48d4e727f45a9e0adb2645d7489 0", + "0x21 0x038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508 CHECKDATASIGVERIFY 1", + "NULLFAIL", + "OK", + "CHECKDATASIGVERIFY with too little R padding but no DERSIG and without CHECKDATASIG flag" +], +[ + "0x46 0x3044022093cbfaab2bbef6fc019d1286018fd11e2612d817756d40913b3f82a428f1e90a022045d010bd0f3c31aa470d096bb3f693275214f48d4e727f45a9e0adb2645d7489 0", + "0x21 0x038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508 CHECKDATASIGVERIFY 1", + "NULLFAIL,STRICTENC", + "SIG_DER", + "CHECKDATASIGVERIFY with too little R padding and without CHECKDATASIG flag" +], +[ + "0x46 0x304402205ffea7d9fa4e0ce8058c96edfb721aaf2840912080ac4ae86a92d9462e69fde302203567149cb9c8c343523a87d7a64be304983899d2e2c6f267a7136c48ff21908d 0", + "0x41 0x0679be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8 CHECKDATASIGVERIFY 1", + "NULLFAIL", + "OK", + "CHECKDATASIGVERIFY with hybrid pubkey but no STRICTENC and without CHECKDATASIG flag" +], +[ + "0x46 0x304402205ffea7d9fa4e0ce8058c96edfb721aaf2840912080ac4ae86a92d9462e69fde302203567149cb9c8c343523a87d7a64be304983899d2e2c6f267a7136c48ff21908d 0", + "0x41 0x0679be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8 CHECKDATASIGVERIFY 1", + "NULLFAIL,STRICTENC", + "PUBKEYTYPE", + "CHECKDATASIGVERIFY with hybrid pubkey and without CHECKDATASIG flag" +], +[ + "0x46 0x304402205ffea7d9fa4e0de8058c96edfb721aaf2840912080ac4ae86a92d9462e69fde302203567149cb9c8c343523a87d7a64be304983899d2e2c6f267a7136c48ff21908d 0", + "0x41 0x0679be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8 CHECKDATASIGVERIFY 1", + "CHECKDATASIG", + "CHECKDATASIGVERIFY", + "CHECKDATASIGVERIFY with invalid hybrid pubkey but no STRICTENC and without CHECKDATASIG flag" +], +[ + "0x46 0x304402205ffea7d9fa4e0de8058c96edfb721aaf2840912080ac4ae86a92d9462e69fde302203567149cb9c8c343523a87d7a64be304983899d2e2c6f267a7136c48ff21908d 0", + "0x41 0x0679be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8 CHECKDATASIGVERIFY 1", + "NULLFAIL,STRICTENC", + "PUBKEYTYPE", + "CHECKDATASIGVERIFY with invalid hybrid pubkey and without CHECKDATASIG flag" +], +[ "0x47 0x3044022022127048516d473153d1f74e46e828496776752e3255f672f760a41e83f54e6f0220502956b739ed82aad916dc4a73e1fd55d02aad514b5211f1ba7d0dadf53c637901", "0x41 0x0479be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8 CHECKSIG", "SCHNORR", 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 @@ -1343,6 +1343,204 @@ .Num(0) .ScriptError(SCRIPT_ERR_PUBKEYTYPE)); + // Duplicated test OP_CHECKDATASIG with CHECKDATASIG flag off + const uint32_t nocheckdatasigflag = + SCRIPT_VERIFY_STRICTENC | SCRIPT_VERIFY_NULLFAIL; + + tests.push_back( + TestBuilder(CScript() << ToByteVector(keys.pubkey1C) << OP_CHECKDATASIG, + "Standard CHECKDATASIG without CHECKDATASIG flag", + nocheckdatasigflag) + .PushDataSigECDSA(keys.key1, {}) + .Num(0)); + tests.push_back( + TestBuilder( + CScript() << ToByteVector(keys.pubkey1C) << OP_CHECKDATASIG + << OP_NOT, + "CHECKDATASIG with NULLFAIL flags and without CHECKDATASIG flag", + nocheckdatasigflag) + .PushDataSigECDSA(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 and without CHECKDATASIG flag", + nocheckdatasigflag & ~SCRIPT_VERIFY_NULLFAIL) + .PushDataSigECDSA(keys.key1, {}) + .Num(1)); + tests.push_back( + TestBuilder(CScript() << ToByteVector(keys.pubkey1C) << OP_CHECKDATASIG + << OP_NOT, + "CHECKDATASIG empty signature without CHECKDATASIG flag", + nocheckdatasigflag) + .Num(0) + .Num(0)); + tests.push_back( + TestBuilder(CScript() << ToByteVector(keys.pubkey1C) << OP_CHECKDATASIG, + "CHECKDATASIG with High S but no Low S and without " + "CHECKDATASIG flag", + nocheckdatasigflag) + .PushDataSigECDSA(keys.key1, {}, 32, 33) + .Num(0)); + tests.push_back( + TestBuilder(CScript() << ToByteVector(keys.pubkey1C) << OP_CHECKDATASIG, + "CHECKDATASIG with High S and without CHECKDATASIG flag", + nocheckdatasigflag | SCRIPT_VERIFY_LOW_S) + .PushDataSigECDSA(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 and " + "without CHECKDATASIG flag", + nocheckdatasigflag & ~SCRIPT_VERIFY_STRICTENC) + .PushDataSigECDSA(keys.key1, {}, 33, 32) + .EditPush(1, "45022100", "440220") + .Num(0)); + tests.push_back( + TestBuilder(CScript() << ToByteVector(keys.pubkey1C) << OP_CHECKDATASIG, + "CHECKDATASIG with too little R padding and without " + "CHECKDATASIG flag", + nocheckdatasigflag) + .PushDataSigECDSA(keys.key1, {}, 33, 32) + .EditPush(1, "45022100", "440220") + .Num(0) + .ScriptError(SCRIPT_ERR_SIG_DER)); + tests.push_back( + TestBuilder(CScript() << ToByteVector(keys.pubkey0H) << OP_CHECKDATASIG, + "CHECKDATASIG with hybrid pubkey but no STRICTENC and " + "without CHECKDATASIG flag", + nocheckdatasigflag & ~SCRIPT_VERIFY_STRICTENC) + .PushDataSigECDSA(keys.key0, {}) + .Num(0)); + tests.push_back( + TestBuilder( + CScript() << ToByteVector(keys.pubkey0H) << OP_CHECKDATASIG, + "CHECKDATASIG with hybrid pubkey and without CHECKDATASIG flag", + nocheckdatasigflag) + .PushDataSigECDSA(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 and without CHECKDATASIG flag", + SCRIPT_ENABLE_CHECKDATASIG) + .PushDataSigECDSA(keys.key0, {}) + .DamagePush(10) + .Num(0)); + tests.push_back( + TestBuilder(CScript() << ToByteVector(keys.pubkey0H) << OP_CHECKDATASIG, + "CHECKDATASIG with invalid hybrid pubkey and without " + "CHECKDATASIG flag", + nocheckdatasigflag) + .PushDataSigECDSA(keys.key0, {}) + .DamagePush(10) + .Num(0) + .ScriptError(SCRIPT_ERR_PUBKEYTYPE)); + + // Duplicated test OP_CHECKDATASIGVERIFY with CHECKDATASIG flag off + tests.push_back( + TestBuilder(CScript() << ToByteVector(keys.pubkey1C) + << OP_CHECKDATASIGVERIFY << OP_TRUE, + "Standard CHECKDATASIGVERIFY without CHECKDATASIG flag", + nocheckdatasigflag) + .PushDataSigECDSA(keys.key1, {}) + .Num(0)); + tests.push_back(TestBuilder(CScript() << ToByteVector(keys.pubkey1C) + << OP_CHECKDATASIGVERIFY << OP_TRUE, + "CHECKDATASIGVERIFY with NULLFAIL flags and " + "without CHECKDATASIG flag", + nocheckdatasigflag) + .PushDataSigECDSA(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 and " + "without CHECKDATASIG flag", + nocheckdatasigflag & ~SCRIPT_VERIFY_NULLFAIL) + .PushDataSigECDSA(keys.key1, {}) + .Num(1) + .ScriptError(SCRIPT_ERR_CHECKDATASIGVERIFY)); + tests.push_back( + TestBuilder( + CScript() << ToByteVector(keys.pubkey1C) << OP_CHECKDATASIGVERIFY + << OP_TRUE, + "CHECKDATASIGVERIFY empty signature without CHECKDATASIG flag", + nocheckdatasigflag) + .Num(0) + .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 and " + "without CHECKDATASIG flag", + nocheckdatasigflag) + .PushDataSigECDSA(keys.key1, {}, 32, 33) + .Num(0)); + tests.push_back( + TestBuilder(CScript() << ToByteVector(keys.pubkey1C) + << OP_CHECKDATASIGVERIFY << OP_TRUE, + "CHECKDATASIG with High S and without CHECKDATASIG flag", + nocheckdatasigflag | SCRIPT_VERIFY_LOW_S) + .PushDataSigECDSA(keys.key1, {}, 32, 33) + .Num(0) + .ScriptError(SCRIPT_ERR_SIG_HIGH_S)); + tests.push_back(TestBuilder(CScript() << ToByteVector(keys.pubkey1C) + << OP_CHECKDATASIGVERIFY << OP_TRUE, + "CHECKDATASIGVERIFY with too little R padding " + "but no DERSIG and without CHECKDATASIG flag", + nocheckdatasigflag & ~SCRIPT_VERIFY_STRICTENC) + .PushDataSigECDSA(keys.key1, {}, 33, 32) + .EditPush(1, "45022100", "440220") + .Num(0)); + tests.push_back(TestBuilder(CScript() << ToByteVector(keys.pubkey1C) + << OP_CHECKDATASIGVERIFY << OP_TRUE, + "CHECKDATASIGVERIFY with too little R padding " + "and without CHECKDATASIG flag", + nocheckdatasigflag) + .PushDataSigECDSA(keys.key1, {}, 33, 32) + .EditPush(1, "45022100", "440220") + .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 and without CHECKDATASIG flag", + nocheckdatasigflag & ~SCRIPT_VERIFY_STRICTENC) + .PushDataSigECDSA(keys.key0, {}) + .Num(0)); + tests.push_back(TestBuilder(CScript() << ToByteVector(keys.pubkey0H) + << OP_CHECKDATASIGVERIFY << OP_TRUE, + "CHECKDATASIGVERIFY with hybrid pubkey and " + "without CHECKDATASIG flag", + nocheckdatasigflag) + .PushDataSigECDSA(keys.key0, {}) + .Num(0) + .ScriptError(SCRIPT_ERR_PUBKEYTYPE)); + tests.push_back( + TestBuilder(CScript() << ToByteVector(keys.pubkey0H) + << OP_CHECKDATASIGVERIFY << OP_TRUE, + "CHECKDATASIGVERIFY with invalid hybrid pubkey but no " + "STRICTENC and without CHECKDATASIG flag", + SCRIPT_ENABLE_CHECKDATASIG) + .PushDataSigECDSA(keys.key0, {}) + .DamagePush(10) + .Num(0) + .ScriptError(SCRIPT_ERR_CHECKDATASIGVERIFY)); + tests.push_back(TestBuilder(CScript() << ToByteVector(keys.pubkey0H) + << OP_CHECKDATASIGVERIFY << OP_TRUE, + "CHECKDATASIGVERIFY with invalid hybrid pubkey " + "and without CHECKDATASIG flag", + nocheckdatasigflag) + .PushDataSigECDSA(keys.key0, {}) + .DamagePush(10) + .Num(0) + .ScriptError(SCRIPT_ERR_PUBKEYTYPE)); + // Misc ECDSA tests duplicated with Schnorr flag on tests.push_back( TestBuilder(CScript() << ToByteVector(keys.pubkey0) << OP_CHECKSIG,