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 @@ -98,6 +98,10 @@ // Is OP_CHECKDATASIG and variant are enabled. // SCRIPT_ENABLE_CHECKDATASIG = (1U << 18), + + // Are Schnorr signatures enabled for OP_CHECK(DATA)SIG(VERIFY)? + // + SCRIPT_ENABLE_SCHNORR = (1U << 19), }; #endif // BITCOIN_SCRIPT_SCRIPTFLAGS_H 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 @@ -1118,6 +1118,88 @@ "SIG_DER", "Non cannonical DER encoding" ], +["Schnorr flag on: CHECKDATASIG unchanged"], +["", "CHECKDATASIG", "P2SH,STRICTENC,NULLFAIL,CHECKDATASIG,SCHNORR", "INVALID_STACK_OPERATION"], +["0", "CHECKDATASIG", "P2SH,STRICTENC,NULLFAIL,CHECKDATASIG,SCHNORR", "INVALID_STACK_OPERATION"], +["0 0", "CHECKDATASIG", "P2SH,STRICTENC,NULLFAIL,CHECKDATASIG,SCHNORR", "INVALID_STACK_OPERATION"], +[ + "0 0", + "0 CHECKDATASIG", + "P2SH,STRICTENC,NULLFAIL,CHECKDATASIG,SCHNORR", + "PUBKEYTYPE" +], +[ + "0 0", + "0x21 0x038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508 CHECKDATASIG", + "P2SH,STRICTENC,NULLFAIL,CHECKDATASIG,SCHNORR", + "EVAL_FALSE" +], +[ + "0x08 0x3006020101020101 0", + "0x21 0x038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508 CHECKDATASIG", + "P2SH,STRICTENC,CHECKDATASIG,SCHNORR", + "EVAL_FALSE", "Check that NULLFAIL trigger only when specified" +], +[ + "0x08 0x3006020101020101 0", + "0x21 0x038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508 CHECKDATASIG", + "P2SH,STRICTENC,NULLFAIL,CHECKDATASIG,SCHNORR", + "NULLFAIL" +], +[ + "0x09 0x300602010102010101 0", + "0x21 0x038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508 CHECKDATASIG", + "P2SH,STRICTENC,NULLFAIL,CHECKDATASIG,SCHNORR", + "SIG_DER", "Ensure that sighashtype is ignored" +], +[ + "0x09 0x300702010102020001 0", + "0x21 0x038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508 CHECKDATASIG", + "P2SH,STRICTENC,NULLFAIL,CHECKDATASIG,SCHNORR", + "SIG_DER", "Non cannonical DER encoding" +], + +["Schnorr flag on: CHECKDATASIGVERIFY unchanged"], +["", "CHECKDATASIGVERIFY 1", "P2SH,STRICTENC,CHECKDATASIG,SCHNORR", "INVALID_STACK_OPERATION"], +["0", "CHECKDATASIGVERIFY 1", "P2SH,STRICTENC,NULLFAIL,CHECKDATASIG,SCHNORR", "INVALID_STACK_OPERATION"], +["0 0", "CHECKDATASIGVERIFY 1", "P2SH,STRICTENC,NULLFAIL,CHECKDATASIG,SCHNORR", "INVALID_STACK_OPERATION"], +[ + "0 0", + "0 CHECKDATASIGVERIFY 1", + "P2SH,STRICTENC,NULLFAIL,CHECKDATASIG,SCHNORR", + "PUBKEYTYPE" +], +[ + "0 0", + "0x21 0x038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508 CHECKDATASIGVERIFY 1", + "P2SH,STRICTENC,NULLFAIL,CHECKDATASIG,SCHNORR", + "CHECKDATASIGVERIFY" +], +[ + "0x08 0x3006020101020101 0", + "0x21 0x038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508 CHECKDATASIGVERIFY 1", + "P2SH,STRICTENC,CHECKDATASIG,SCHNORR", + "CHECKDATASIGVERIFY", "Check that NULLFAIL trigger only when specified" +], +[ + "0x08 0x3006020101020101 0", + "0x21 0x038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508 CHECKDATASIGVERIFY 1", + "P2SH,STRICTENC,NULLFAIL,CHECKDATASIG,SCHNORR", + "NULLFAIL" +], +[ + "0x09 0x300602010102010101 0", + "0x21 0x038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508 CHECKDATASIGVERIFY 1", + "P2SH,STRICTENC,NULLFAIL,CHECKDATASIG,SCHNORR", + "SIG_DER", "Ensure that sighashtype is ignored" +], +[ + "0x09 0x300702010102020001 0", + "0x21 0x038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508 CHECKDATASIGVERIFY 1", + "P2SH,STRICTENC,NULLFAIL,CHECKDATASIG,SCHNORR", + "SIG_DER", "Non cannonical DER encoding" +], + ["ADD"], ["2147483648 0 ADD", "NOP", "P2SH,STRICTENC", "UNKNOWN_ERROR", "arithmetic operands must be in range [-2^31...2^31] "], ["-2147483648 0 ADD", "NOP", "P2SH,STRICTENC", "UNKNOWN_ERROR", "arithmetic operands must be in range [-2^31...2^31] "], @@ -2368,6 +2450,216 @@ "PUBKEYTYPE", "CHECKDATASIGVERIFY with invalid hybrid pubkey" ], +[ + "0x47 0x3044022022127048516d473153d1f74e46e828496776752e3255f672f760a41e83f54e6f0220502956b739ed82aad916dc4a73e1fd55d02aad514b5211f1ba7d0dadf53c637901", + "0x41 0x0479be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8 CHECKSIG", + "SCHNORR", + "OK", + "P2PK ECDSA with Schnorr flag on" +], +[ + "0x47 0x3044022022127048516d463153d1f74e46e828496776752e3255f672f760a41e83f54e6f0220502956b739ed82aad916dc4a73e1fd55d02aad514b5211f1ba7d0dadf53c637901", + "0x41 0x0479be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8 CHECKSIG", + "SCHNORR", + "EVAL_FALSE", + "P2PK, bad sig ECDSA with Schnorr flag on" +], +[ + "0x47 0x304402201e0ec3c6c263f34049c93e0bc646d7287ca2cc6571d658e4e7269daebc96ef35022009841f101e6dcaba8993d0259e5732a871e253be807556bf5618bf0bc3e84af001 0x21 0x038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508", + "DUP HASH160 0x14 0x1018853670f9f3b0582c5b9ee8ce93764ac32b93 EQUALVERIFY CHECKSIG", + "SCHNORR", + "OK", + "P2PKH ECDSA with Schnorr flag on" +], +[ + "0 0x47 0x304402205b6256a4755890fe278ea083eddf5c0519d0d7fad14fe265e077c5627171b27e02200d841cb15cdc9a9c8f3ec20c5e4bb1b0e5715d26353f500378f4215195e3558c01 0x47 0x304402200b0620f910e92621934e88ae0177b0bb381ba812d4c23c77afbf1a3ab637a0bb0220275387c859089939e22d803dfae77a4ecd122d951d0feb9e6a65a6918c2b1e0201 0x4c69 0x52210279be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f8179821038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f515082103363d90d447b00c9c99ceac05b6262ee053441c7e55552ffe526bad8f83ff464053ae", + "HASH160 0x14 0xc9e4a896d149702d0d1695434feddd52e24ad78d EQUAL", + "P2SH,SCHNORR", + "OK", + "P2SH(2-of-3) ECDSA with Schnorr flag on" +], +[ + "0x48 0x3045022032d4a3dec9cad54c94b5585fb058f7e41ac5173843b0c2e7197a40421ee4ab54022100be2b2bd69273d7de44c609cb60febf428e18eb821869006e368b06259318896901", + "0x21 0x03363d90d447b00c9c99ceac05b6262ee053441c7e55552ffe526bad8f83ff4640 CHECKSIG", + "LOW_S,SCHNORR", + "SIG_HIGH_S", + "LOW_S violating ECDSA with Schnorr flag on" +], +[ + "0x47 0x304402201162483d0440fc508d79d314a91cfc4df4ea31b302f02c16893fa15d9c9f7f06022032afebdd5b2964c40c887b967f9599e0e5b5ff5b2f899ab62ada12a5af2a481701", + "0x41 0x0679be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8 CHECKSIG", + "SCHNORR,STRICTENC", + "PUBKEYTYPE", + "STRICTENC-violating hybrid pubkey with Schnorr flag on" +], +[ + "0x46 0x3044022021309a532a60d471cc4ef025a96572c7bf26c4640b53c7d45e411a5aa99980f6022037964f01a61db1b24ea44137b3d67d7095ec25f68bd7b508e01441e5539d96a9 0", + "0x21 0x038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508 CHECKDATASIG", + "CHECKDATASIG,NULLFAIL,SCHNORR,STRICTENC", + "OK", + "Standard CHECKDATASIG" +], +[ + "0x46 0x3044022021309a532a60d471cc4ef025a96572c7bf26c4640b53c7d45e411a5aa99980f6022037964f01a61db1b24ea44137b3d67d7095ec25f68bd7b508e01441e5539d96a9 1", + "0x21 0x038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508 CHECKDATASIG NOT", + "CHECKDATASIG,NULLFAIL,SCHNORR,STRICTENC", + "NULLFAIL", + "CHECKDATASIG with NULLFAIL flags" +], +[ + "0x46 0x3044022021309a532a60d471cc4ef025a96572c7bf26c4640b53c7d45e411a5aa99980f6022037964f01a61db1b24ea44137b3d67d7095ec25f68bd7b508e01441e5539d96a9 1", + "0x21 0x038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508 CHECKDATASIG NOT", + "CHECKDATASIG,SCHNORR,STRICTENC", + "OK", + "CHECKDATASIG without NULLFAIL flags" +], +[ + "0 0", + "0x21 0x038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508 CHECKDATASIG NOT", + "CHECKDATASIG,NULLFAIL,SCHNORR,STRICTENC", + "OK", + "CHECKDATASIG empty signature" +], +[ + "0x47 0x3045022021309a532a60d471cc4ef025a96572c7bf26c4640b53c7d45e411a5aa99980f6022100c869b0fe59e24e4db15bbec84c29828e24c2b6f02370eb32dfbe1ca77c98aa98 0", + "0x21 0x038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508 CHECKDATASIG", + "CHECKDATASIG,NULLFAIL,SCHNORR,STRICTENC", + "OK", + "CHECKDATASIG with High S but no Low S" +], +[ + "0x47 0x3045022021309a532a60d471cc4ef025a96572c7bf26c4640b53c7d45e411a5aa99980f6022100c869b0fe59e24e4db15bbec84c29828e24c2b6f02370eb32dfbe1ca77c98aa98 0", + "0x21 0x038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508 CHECKDATASIG", + "CHECKDATASIG,LOW_S,NULLFAIL,SCHNORR,STRICTENC", + "SIG_HIGH_S", + "CHECKDATASIG with High S" +], +[ + "0x46 0x3044022093cbfaab2bbef6fc019d1286018fd11e2612d817756d40913b3f82a428f1e90a022045d010bd0f3c31aa470d096bb3f693275214f48d4e727f45a9e0adb2645d7489 0", + "0x21 0x038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508 CHECKDATASIG", + "CHECKDATASIG,NULLFAIL,SCHNORR", + "OK", + "CHECKDATASIG with too little R padding but no DERSIG" +], +[ + "0x46 0x3044022093cbfaab2bbef6fc019d1286018fd11e2612d817756d40913b3f82a428f1e90a022045d010bd0f3c31aa470d096bb3f693275214f48d4e727f45a9e0adb2645d7489 0", + "0x21 0x038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508 CHECKDATASIG", + "CHECKDATASIG,NULLFAIL,SCHNORR,STRICTENC", + "SIG_DER", + "CHECKDATASIG with too little R padding" +], +[ + "0x46 0x304402205ffea7d9fa4e0ce8058c96edfb721aaf2840912080ac4ae86a92d9462e69fde302203567149cb9c8c343523a87d7a64be304983899d2e2c6f267a7136c48ff21908d 0", + "0x41 0x0679be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8 CHECKDATASIG", + "CHECKDATASIG,NULLFAIL,SCHNORR", + "OK", + "CHECKDATASIG with hybrid pubkey but no STRICTENC" +], +[ + "0x46 0x304402205ffea7d9fa4e0ce8058c96edfb721aaf2840912080ac4ae86a92d9462e69fde302203567149cb9c8c343523a87d7a64be304983899d2e2c6f267a7136c48ff21908d 0", + "0x41 0x0679be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8 CHECKDATASIG", + "CHECKDATASIG,NULLFAIL,SCHNORR,STRICTENC", + "PUBKEYTYPE", + "CHECKDATASIG with hybrid pubkey" +], +[ + "0x46 0x304402205ffea7d9fa4e0de8058c96edfb721aaf2840912080ac4ae86a92d9462e69fde302203567149cb9c8c343523a87d7a64be304983899d2e2c6f267a7136c48ff21908d 0", + "0x41 0x0679be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8 CHECKDATASIG NOT", + "CHECKDATASIG", + "OK", + "CHECKDATASIG with invalid hybrid pubkey but no STRICTENC" +], +[ + "0x46 0x304402205ffea7d9fa4e0de8058c96edfb721aaf2840912080ac4ae86a92d9462e69fde302203567149cb9c8c343523a87d7a64be304983899d2e2c6f267a7136c48ff21908d 0", + "0x41 0x0679be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8 CHECKDATASIG", + "CHECKDATASIG,NULLFAIL,SCHNORR,STRICTENC", + "PUBKEYTYPE", + "CHECKDATASIG with invalid hybrid pubkey" +], +[ + "0x46 0x3044022021309a532a60d471cc4ef025a96572c7bf26c4640b53c7d45e411a5aa99980f6022037964f01a61db1b24ea44137b3d67d7095ec25f68bd7b508e01441e5539d96a9 0", + "0x21 0x038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508 CHECKDATASIGVERIFY 1", + "CHECKDATASIG,NULLFAIL,SCHNORR,STRICTENC", + "OK", + "Standard CHECKDATASIGVERIFY" +], +[ + "0x46 0x3044022021309a532a60d471cc4ef025a96572c7bf26c4640b53c7d45e411a5aa99980f6022037964f01a61db1b24ea44137b3d67d7095ec25f68bd7b508e01441e5539d96a9 1", + "0x21 0x038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508 CHECKDATASIGVERIFY 1", + "CHECKDATASIG,NULLFAIL,SCHNORR,STRICTENC", + "NULLFAIL", + "CHECKDATASIGVERIFY with NULLFAIL flags" +], +[ + "0x46 0x3044022021309a532a60d471cc4ef025a96572c7bf26c4640b53c7d45e411a5aa99980f6022037964f01a61db1b24ea44137b3d67d7095ec25f68bd7b508e01441e5539d96a9 1", + "0x21 0x038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508 CHECKDATASIGVERIFY 1", + "CHECKDATASIG,SCHNORR,STRICTENC", + "CHECKDATASIGVERIFY", + "CHECKDATASIGVERIFY without NULLFAIL flags" +], +[ + "0 0", + "0x21 0x038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508 CHECKDATASIGVERIFY 1", + "CHECKDATASIG,NULLFAIL,SCHNORR,STRICTENC", + "CHECKDATASIGVERIFY", + "CHECKDATASIGVERIFY empty signature" +], +[ + "0x47 0x3045022021309a532a60d471cc4ef025a96572c7bf26c4640b53c7d45e411a5aa99980f6022100c869b0fe59e24e4db15bbec84c29828e24c2b6f02370eb32dfbe1ca77c98aa98 0", + "0x21 0x038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508 CHECKDATASIGVERIFY 1", + "CHECKDATASIG,NULLFAIL,SCHNORR,STRICTENC", + "OK", + "CHECKDATASIG with High S but no Low S" +], +[ + "0x47 0x3045022021309a532a60d471cc4ef025a96572c7bf26c4640b53c7d45e411a5aa99980f6022100c869b0fe59e24e4db15bbec84c29828e24c2b6f02370eb32dfbe1ca77c98aa98 0", + "0x21 0x038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508 CHECKDATASIGVERIFY 1", + "CHECKDATASIG,LOW_S,NULLFAIL,SCHNORR,STRICTENC", + "SIG_HIGH_S", + "CHECKDATASIG with High S" +], +[ + "0x46 0x3044022093cbfaab2bbef6fc019d1286018fd11e2612d817756d40913b3f82a428f1e90a022045d010bd0f3c31aa470d096bb3f693275214f48d4e727f45a9e0adb2645d7489 0", + "0x21 0x038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508 CHECKDATASIGVERIFY 1", + "CHECKDATASIG,NULLFAIL,SCHNORR", + "OK", + "CHECKDATASIGVERIFY with too little R padding but no DERSIG" +], +[ + "0x46 0x3044022093cbfaab2bbef6fc019d1286018fd11e2612d817756d40913b3f82a428f1e90a022045d010bd0f3c31aa470d096bb3f693275214f48d4e727f45a9e0adb2645d7489 0", + "0x21 0x038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508 CHECKDATASIGVERIFY 1", + "CHECKDATASIG,NULLFAIL,SCHNORR,STRICTENC", + "SIG_DER", + "CHECKDATASIGVERIFY with too little R padding" +], +[ + "0x46 0x304402205ffea7d9fa4e0ce8058c96edfb721aaf2840912080ac4ae86a92d9462e69fde302203567149cb9c8c343523a87d7a64be304983899d2e2c6f267a7136c48ff21908d 0", + "0x41 0x0679be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8 CHECKDATASIGVERIFY 1", + "CHECKDATASIG,NULLFAIL,SCHNORR", + "OK", + "CHECKDATASIGVERIFY with hybrid pubkey but no STRICTENC" +], +[ + "0x46 0x304402205ffea7d9fa4e0ce8058c96edfb721aaf2840912080ac4ae86a92d9462e69fde302203567149cb9c8c343523a87d7a64be304983899d2e2c6f267a7136c48ff21908d 0", + "0x41 0x0679be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8 CHECKDATASIGVERIFY 1", + "CHECKDATASIG,NULLFAIL,SCHNORR,STRICTENC", + "PUBKEYTYPE", + "CHECKDATASIGVERIFY with hybrid pubkey" +], +[ + "0x46 0x304402205ffea7d9fa4e0de8058c96edfb721aaf2840912080ac4ae86a92d9462e69fde302203567149cb9c8c343523a87d7a64be304983899d2e2c6f267a7136c48ff21908d 0", + "0x41 0x0679be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8 CHECKDATASIGVERIFY 1", + "CHECKDATASIG", + "CHECKDATASIGVERIFY", + "CHECKDATASIGVERIFY with invalid hybrid pubkey but no STRICTENC" +], +[ + "0x46 0x304402205ffea7d9fa4e0de8058c96edfb721aaf2840912080ac4ae86a92d9462e69fde302203567149cb9c8c343523a87d7a64be304983899d2e2c6f267a7136c48ff21908d 0", + "0x41 0x0679be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8 CHECKDATASIGVERIFY 1", + "CHECKDATASIG,NULLFAIL,SCHNORR,STRICTENC", + "PUBKEYTYPE", + "CHECKDATASIGVERIFY with invalid hybrid pubkey" +], ["CHECKSEQUENCEVERIFY tests"], ["", "CHECKSEQUENCEVERIFY", "CHECKSEQUENCEVERIFY", "INVALID_STACK_OPERATION", "CSV automatically fails on a empty stack"], 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 @@ -1305,6 +1305,232 @@ .Num(0) .ScriptError(SCRIPT_ERR_PUBKEYTYPE)); + // Misc ECDSA tests duplicated with Schnorr flag on + tests.push_back( + TestBuilder(CScript() << ToByteVector(keys.pubkey0) << OP_CHECKSIG, + "P2PK ECDSA with Schnorr flag on", SCRIPT_ENABLE_SCHNORR) + .PushSig(keys.key0)); + tests.push_back( + TestBuilder(CScript() << ToByteVector(keys.pubkey0) << OP_CHECKSIG, + "P2PK, bad sig ECDSA with Schnorr flag on", + SCRIPT_ENABLE_SCHNORR) + .PushSig(keys.key0) + .DamagePush(10) + .ScriptError(SCRIPT_ERR_EVAL_FALSE)); + + tests.push_back(TestBuilder(CScript() << OP_DUP << OP_HASH160 + << ToByteVector(keys.pubkey1C.GetID()) + << OP_EQUALVERIFY << OP_CHECKSIG, + "P2PKH ECDSA with Schnorr flag on", + SCRIPT_ENABLE_SCHNORR) + .PushSig(keys.key1) + .Push(keys.pubkey1C)); + + tests.push_back(TestBuilder(CScript() << OP_2 << ToByteVector(keys.pubkey0C) + << ToByteVector(keys.pubkey1C) + << ToByteVector(keys.pubkey2C) << OP_3 + << OP_CHECKMULTISIG, + "P2SH(2-of-3) ECDSA with Schnorr flag on", + SCRIPT_VERIFY_P2SH | SCRIPT_ENABLE_SCHNORR, + true) + .Num(0) + .PushSig(keys.key1) + .PushSig(keys.key2) + .PushRedeem()); + + tests.push_back( + TestBuilder(CScript() << ToByteVector(keys.pubkey2C) << OP_CHECKSIG, + "LOW_S violating ECDSA with Schnorr flag on", + SCRIPT_VERIFY_LOW_S | SCRIPT_ENABLE_SCHNORR) + .PushSig(keys.key2, SigHashType(), 32, 33) + .ScriptError(SCRIPT_ERR_SIG_HIGH_S)); + + tests.push_back( + TestBuilder(CScript() << ToByteVector(keys.pubkey0H) << OP_CHECKSIG, + "STRICTENC-violating hybrid pubkey with Schnorr flag on", + SCRIPT_VERIFY_STRICTENC | SCRIPT_ENABLE_SCHNORR) + .PushSig(keys.key0, SigHashType()) + .ScriptError(SCRIPT_ERR_PUBKEYTYPE)); + + // Duplicated test OP_CHECKDATASIG with Schnorr flag on + const uint32_t checkdatasigschnorrflags = + SCRIPT_VERIFY_STRICTENC | SCRIPT_VERIFY_NULLFAIL | + SCRIPT_ENABLE_CHECKDATASIG | SCRIPT_ENABLE_SCHNORR; + + tests.push_back( + TestBuilder(CScript() << ToByteVector(keys.pubkey1C) << OP_CHECKDATASIG, + "Standard CHECKDATASIG", checkdatasigschnorrflags) + .PushDataSig(keys.key1, {}) + .Num(0)); + tests.push_back(TestBuilder(CScript() << ToByteVector(keys.pubkey1C) + << OP_CHECKDATASIG << OP_NOT, + "CHECKDATASIG with NULLFAIL flags", + checkdatasigschnorrflags) + .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", + checkdatasigschnorrflags & ~SCRIPT_VERIFY_NULLFAIL) + .PushDataSig(keys.key1, {}) + .Num(1)); + tests.push_back(TestBuilder(CScript() << ToByteVector(keys.pubkey1C) + << OP_CHECKDATASIG << OP_NOT, + "CHECKDATASIG empty signature", + checkdatasigschnorrflags) + .Num(0) + .Num(0)); + tests.push_back( + TestBuilder(CScript() << ToByteVector(keys.pubkey1C) << OP_CHECKDATASIG, + "CHECKDATASIG with High S but no Low S", + checkdatasigschnorrflags) + .PushDataSig(keys.key1, {}, 32, 33) + .Num(0)); + tests.push_back( + TestBuilder(CScript() << ToByteVector(keys.pubkey1C) << OP_CHECKDATASIG, + "CHECKDATASIG with High S", + checkdatasigschnorrflags | SCRIPT_VERIFY_LOW_S) + .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", + checkdatasigschnorrflags & ~SCRIPT_VERIFY_STRICTENC) + .PushDataSig(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", + checkdatasigschnorrflags) + .PushDataSig(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", + checkdatasigschnorrflags & ~SCRIPT_VERIFY_STRICTENC) + .PushDataSig(keys.key0, {}) + .Num(0)); + tests.push_back( + TestBuilder(CScript() << ToByteVector(keys.pubkey0H) << OP_CHECKDATASIG, + "CHECKDATASIG with hybrid pubkey", checkdatasigschnorrflags) + .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, {}) + .DamagePush(10) + .Num(0)); + tests.push_back( + TestBuilder(CScript() << ToByteVector(keys.pubkey0H) << OP_CHECKDATASIG, + "CHECKDATASIG with invalid hybrid pubkey", + checkdatasigschnorrflags) + .PushDataSig(keys.key0, {}) + .DamagePush(10) + .Num(0) + .ScriptError(SCRIPT_ERR_PUBKEYTYPE)); + + // Duplicated test OP_CHECKDATASIGVERIFY with Schnorr flag on + tests.push_back(TestBuilder(CScript() << ToByteVector(keys.pubkey1C) + << OP_CHECKDATASIGVERIFY << OP_TRUE, + "Standard CHECKDATASIGVERIFY", + checkdatasigschnorrflags) + .PushDataSig(keys.key1, {}) + .Num(0)); + tests.push_back(TestBuilder(CScript() << ToByteVector(keys.pubkey1C) + << OP_CHECKDATASIGVERIFY << OP_TRUE, + "CHECKDATASIGVERIFY with NULLFAIL flags", + checkdatasigschnorrflags) + .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", + checkdatasigschnorrflags & ~SCRIPT_VERIFY_NULLFAIL) + .PushDataSig(keys.key1, {}) + .Num(1) + .ScriptError(SCRIPT_ERR_CHECKDATASIGVERIFY)); + tests.push_back(TestBuilder(CScript() << ToByteVector(keys.pubkey1C) + << OP_CHECKDATASIGVERIFY << OP_TRUE, + "CHECKDATASIGVERIFY empty signature", + checkdatasigschnorrflags) + .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", + checkdatasigschnorrflags) + .PushDataSig(keys.key1, {}, 32, 33) + .Num(0)); + tests.push_back(TestBuilder(CScript() << ToByteVector(keys.pubkey1C) + << OP_CHECKDATASIGVERIFY << OP_TRUE, + "CHECKDATASIG with High S", + checkdatasigschnorrflags | SCRIPT_VERIFY_LOW_S) + .PushDataSig(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", + checkdatasigschnorrflags & ~SCRIPT_VERIFY_STRICTENC) + .PushDataSig(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", + checkdatasigschnorrflags) + .PushDataSig(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", + checkdatasigschnorrflags & ~SCRIPT_VERIFY_STRICTENC) + .PushDataSig(keys.key0, {}) + .Num(0)); + tests.push_back(TestBuilder(CScript() << ToByteVector(keys.pubkey0H) + << OP_CHECKDATASIGVERIFY << OP_TRUE, + "CHECKDATASIGVERIFY with hybrid pubkey", + checkdatasigschnorrflags) + .PushDataSig(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", + SCRIPT_ENABLE_CHECKDATASIG) + .PushDataSig(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", + checkdatasigschnorrflags) + .PushDataSig(keys.key0, {}) + .DamagePush(10) + .Num(0) + .ScriptError(SCRIPT_ERR_PUBKEYTYPE)); + std::set tests_set; { diff --git a/src/test/scriptflags.cpp b/src/test/scriptflags.cpp --- a/src/test/scriptflags.cpp +++ b/src/test/scriptflags.cpp @@ -32,6 +32,7 @@ {"SIGHASH_FORKID", SCRIPT_ENABLE_SIGHASH_FORKID}, {"REPLAY_PROTECTION", SCRIPT_ENABLE_REPLAY_PROTECTION}, {"CHECKDATASIG", SCRIPT_ENABLE_CHECKDATASIG}, + {"SCHNORR", SCRIPT_ENABLE_SCHNORR}, }; uint32_t ParseScriptFlags(std::string strFlags) { diff --git a/src/test/sigcache_tests.cpp b/src/test/sigcache_tests.cpp --- a/src/test/sigcache_tests.cpp +++ b/src/test/sigcache_tests.cpp @@ -40,10 +40,8 @@ * behaviour is that flags which are not explicitly listed as invariant in * script/sigcache.cpp will affect the cache entry. Here we will thus enforce * that certain flags are omitted from that sigcache.cpp list. - * - * Currently, no flags affect VerifySignature. */ -static const uint32_t TEST_VARIANT_FLAGS = 0; +static const uint32_t TEST_VARIANT_FLAGS = SCRIPT_ENABLE_SCHNORR; /** * Sigcache is only accessible via CachingTransactionSignatureChecker