diff --git a/src/Makefile.test.include b/src/Makefile.test.include --- a/src/Makefile.test.include +++ b/src/Makefile.test.include @@ -89,6 +89,7 @@ test/rwcollection_tests.cpp \ test/sanity_tests.cpp \ test/scheduler_tests.cpp \ + test/schnorr_tests.cpp \ test/script_commitment_tests.cpp \ test/script_P2SH_tests.cpp \ test/script_tests.cpp \ diff --git a/src/script/interpreter.cpp b/src/script/interpreter.cpp --- a/src/script/interpreter.cpp +++ b/src/script/interpreter.cpp @@ -1467,7 +1467,11 @@ const CPubKey &pubkey, const uint256 &sighash, uint32_t flags) const { - return pubkey.VerifyECDSA(sighash, vchSig); + if ((flags & SCRIPT_ENABLE_SCHNORR) && (vchSig.size() == 64)) { + return pubkey.VerifySchnorr(sighash, vchSig); + } else { + return pubkey.VerifyECDSA(sighash, vchSig); + } } bool TransactionSignatureChecker::CheckSig( diff --git a/src/test/CMakeLists.txt b/src/test/CMakeLists.txt --- a/src/test/CMakeLists.txt +++ b/src/test/CMakeLists.txt @@ -105,6 +105,7 @@ rwcollection_tests.cpp sanity_tests.cpp scheduler_tests.cpp + schnorr_tests.cpp script_commitment_tests.cpp script_P2SH_tests.cpp script_tests.cpp 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 @@ -2684,6 +2684,573 @@ "PUBKEYTYPE", "CHECKDATASIGVERIFY with invalid hybrid pubkey" ], +[ + "0x41 0x0df4be7f5fe74b2855b92082720e889038e15d8d747334fa3f300ef4ab1db1eea56aa83d1d60809ff6703791736be87cfb6cbc5c4036aeed3b4ea4e6dab3509001", + "0x41 0x0479be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8 CHECKSIG", + "", + "EVAL_FALSE", + "CHECKSIG Schnorr w/ neither STRICTENC,SCHNORR" +], +[ + "0x47 0x3044022022127048516d473153d1f74e46e828496776752e3255f672f760a41e83f54e6f0220502956b739ed82aad916dc4a73e1fd55d02aad514b5211f1ba7d0dadf53c637901", + "0x41 0x0479be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8 CHECKSIG", + "", + "OK", + "CHECKSIG ECDSA w/ neither STRICTENC,SCHNORR" +], +[ + "0x41 0x0df4be7f5fe74b2855b92082720e889038e15d8d747334fa3f300ef4ab1db1eea56aa83d1d60809ff6703791736be87cfb6cbc5c4036aeed3b4ea4e6dab3509001", + "0x41 0x0479be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8 CHECKSIG", + "SCHNORR", + "OK", + "CHECKSIG Schnorr w/ SCHNORR" +], +[ + "0x47 0x3044022022127048516d473153d1f74e46e828496776752e3255f672f760a41e83f54e6f0220502956b739ed82aad916dc4a73e1fd55d02aad514b5211f1ba7d0dadf53c637901", + "0x41 0x0479be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8 CHECKSIG", + "SCHNORR", + "OK", + "CHECKSIG ECDSA w/ SCHNORR" +], +[ + "0x41 0x0df4be7f5fe74b2855b92082720e889038e15d8d747334fa3f300ef4ab1db1eea56aa83d1d60809ff6703791736be87cfb6cbc5c4036aeed3b4ea4e6dab3509001", + "0x41 0x0479be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8 CHECKSIG", + "STRICTENC", + "SIG_DER", + "CHECKSIG Schnorr w/ STRICTENC" +], +[ + "0x47 0x3044022022127048516d473153d1f74e46e828496776752e3255f672f760a41e83f54e6f0220502956b739ed82aad916dc4a73e1fd55d02aad514b5211f1ba7d0dadf53c637901", + "0x41 0x0479be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8 CHECKSIG", + "STRICTENC", + "OK", + "CHECKSIG ECDSA w/ STRICTENC" +], +[ + "0x41 0x0df4be7f5fe74b2855b92082720e889038e15d8d747334fa3f300ef4ab1db1eea56aa83d1d60809ff6703791736be87cfb6cbc5c4036aeed3b4ea4e6dab3509001", + "0x41 0x0479be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8 CHECKSIG", + "SCHNORR,STRICTENC", + "OK", + "CHECKSIG Schnorr w/ STRICTENC,SCHNORR" +], +[ + "0x47 0x3044022022127048516d473153d1f74e46e828496776752e3255f672f760a41e83f54e6f0220502956b739ed82aad916dc4a73e1fd55d02aad514b5211f1ba7d0dadf53c637901", + "0x41 0x0479be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8 CHECKSIG", + "SCHNORR,STRICTENC", + "OK", + "CHECKSIG ECDSA w/ STRICTENC,SCHNORR" +], +[ + "0x41 0x3cf1b3f60b74d0821039f7dc7c21abe3119b9d94ae13f5e5258a8269bee9dfc51c84dbb3ba3eff82de61046f6cfef22ea5cf4a46e3776a5fb35d743aea310f6701", + "0x41 0x048282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f5150811f8a8098557dfe45e8256e830b60ace62d613ac2f7b17bed31b6eaff6e26caf CHECKSIG", + "SCHNORR,STRICTENC", + "OK", + "CHECKSIG Schnorr other key" +], +[ + "0x41 0x35b32856cbd89eb40130a50c6931ce002e3e9db033179ab6265a276a04795ec8f87e9b4d8343f399915371d7f4a7d4d0c97753f2473b253197695a58eede92de01", + "0x41 0x0479be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8 CHECKSIG NOT", + "SCHNORR,STRICTENC", + "OK", + "CHECKSIG Schnorr mismatched key" +], +[ + "0x41 0x8d37e95e36718d7fbc8ffd63b0b4ebb89dd5fb683510a95345869399f810a8724a00e5cbbb2190205ffabac601d80bf110a67013521b7a7c02b2a51e07d723eb01", + "0x41 0x0479be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8 CHECKSIGVERIFY 1", + "", + "CHECKSIGVERIFY", + "CHECKSIGVERIFY Schnorr w/ neither STRICTENC,SCHNORR" +], +[ + "0x47 0x304402205d5a925acf881167da7850d838cd4f73d077d08aacf9d2885d10b7850c5a828602201f42383e317ec427dbd71f3a6031a0ff27e431b7089fbc80ebea31b5f8949be601", + "0x41 0x0479be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8 CHECKSIGVERIFY 1", + "", + "OK", + "CHECKSIGVERIFY ECDSA w/ neither STRICTENC,SCHNORR" +], +[ + "0x41 0x8d37e95e36718d7fbc8ffd63b0b4ebb89dd5fb683510a95345869399f810a8724a00e5cbbb2190205ffabac601d80bf110a67013521b7a7c02b2a51e07d723eb01", + "0x41 0x0479be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8 CHECKSIGVERIFY 1", + "SCHNORR", + "OK", + "CHECKSIGVERIFY Schnorr w/ SCHNORR" +], +[ + "0x47 0x304402205d5a925acf881167da7850d838cd4f73d077d08aacf9d2885d10b7850c5a828602201f42383e317ec427dbd71f3a6031a0ff27e431b7089fbc80ebea31b5f8949be601", + "0x41 0x0479be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8 CHECKSIGVERIFY 1", + "SCHNORR", + "OK", + "CHECKSIGVERIFY ECDSA w/ SCHNORR" +], +[ + "0x41 0x8d37e95e36718d7fbc8ffd63b0b4ebb89dd5fb683510a95345869399f810a8724a00e5cbbb2190205ffabac601d80bf110a67013521b7a7c02b2a51e07d723eb01", + "0x41 0x0479be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8 CHECKSIGVERIFY 1", + "STRICTENC", + "SIG_DER", + "CHECKSIGVERIFY Schnorr w/ STRICTENC" +], +[ + "0x47 0x304402205d5a925acf881167da7850d838cd4f73d077d08aacf9d2885d10b7850c5a828602201f42383e317ec427dbd71f3a6031a0ff27e431b7089fbc80ebea31b5f8949be601", + "0x41 0x0479be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8 CHECKSIGVERIFY 1", + "STRICTENC", + "OK", + "CHECKSIGVERIFY ECDSA w/ STRICTENC" +], +[ + "0x41 0x8d37e95e36718d7fbc8ffd63b0b4ebb89dd5fb683510a95345869399f810a8724a00e5cbbb2190205ffabac601d80bf110a67013521b7a7c02b2a51e07d723eb01", + "0x41 0x0479be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8 CHECKSIGVERIFY 1", + "SCHNORR,STRICTENC", + "OK", + "CHECKSIGVERIFY Schnorr w/ STRICTENC,SCHNORR" +], +[ + "0x47 0x304402205d5a925acf881167da7850d838cd4f73d077d08aacf9d2885d10b7850c5a828602201f42383e317ec427dbd71f3a6031a0ff27e431b7089fbc80ebea31b5f8949be601", + "0x41 0x0479be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8 CHECKSIGVERIFY 1", + "SCHNORR,STRICTENC", + "OK", + "CHECKSIGVERIFY ECDSA w/ STRICTENC,SCHNORR" +], +[ + "0x41 0x53c4de3cb6a0190073c98fa415f63b720ea491748c9a760d5d249bb05f13990aa464be04b625cc36cd9e302dc276ad232d5d65d6327bdb18b7c529300d67013f01", + "0x41 0x048282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f5150811f8a8098557dfe45e8256e830b60ace62d613ac2f7b17bed31b6eaff6e26caf CHECKSIGVERIFY 1", + "SCHNORR,STRICTENC", + "OK", + "CHECKSIGVERIFY Schnorr other key" +], +[ + "0x41 0x74c51dae216d8ebee5418204cf90839ea9a288b93eccb1de54b5b5d06bcd69c7028e1b3c6643c001403e7862bee6be39c107e5c8d0a9a8e9143862e5d73c555a01", + "0x41 0x0479be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8 CHECKSIGVERIFY 1", + "SCHNORR,STRICTENC", + "CHECKSIGVERIFY", + "CHECKSIGVERIFY Schnorr mismatched key" +], +[ + "0x40 0x9db0671f61f1fafa84aaab76ad2e070b27cf9ae85338bafc0b947ac9ad8c56ff7b24aa76c95ad86bb13cbff314742dbe1f545869d1a28efa54b411ccd37717e5", + "0 0x41 0x0479be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8 CHECKDATASIG", + "CHECKDATASIG", + "EVAL_FALSE", + "CHECKDATASIG Schnorr w/ neither STRICTENC,SCHNORR" +], +[ + "0x46 0x304402205ffea7d9fa4e0ce8058c96edfb721aaf2840912080ac4ae86a92d9462e69fde302203567149cb9c8c343523a87d7a64be304983899d2e2c6f267a7136c48ff21908d", + "0 0x41 0x0479be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8 CHECKDATASIG", + "CHECKDATASIG", + "OK", + "CHECKDATASIG ECDSA w/ neither STRICTENC,SCHNORR" +], +[ + "0x40 0x9db0671f61f1fafa84aaab76ad2e070b27cf9ae85338bafc0b947ac9ad8c56ff7b24aa76c95ad86bb13cbff314742dbe1f545869d1a28efa54b411ccd37717e5", + "0 0x41 0x0479be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8 CHECKDATASIG", + "CHECKDATASIG,SCHNORR", + "OK", + "CHECKDATASIG Schnorr w/ SCHNORR" +], +[ + "0x46 0x304402205ffea7d9fa4e0ce8058c96edfb721aaf2840912080ac4ae86a92d9462e69fde302203567149cb9c8c343523a87d7a64be304983899d2e2c6f267a7136c48ff21908d", + "0 0x41 0x0479be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8 CHECKDATASIG", + "CHECKDATASIG,SCHNORR", + "OK", + "CHECKDATASIG ECDSA w/ SCHNORR" +], +[ + "0x40 0x9db0671f61f1fafa84aaab76ad2e070b27cf9ae85338bafc0b947ac9ad8c56ff7b24aa76c95ad86bb13cbff314742dbe1f545869d1a28efa54b411ccd37717e5", + "0 0x41 0x0479be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8 CHECKDATASIG", + "CHECKDATASIG,STRICTENC", + "SIG_DER", + "CHECKDATASIG Schnorr w/ STRICTENC" +], +[ + "0x46 0x304402205ffea7d9fa4e0ce8058c96edfb721aaf2840912080ac4ae86a92d9462e69fde302203567149cb9c8c343523a87d7a64be304983899d2e2c6f267a7136c48ff21908d", + "0 0x41 0x0479be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8 CHECKDATASIG", + "CHECKDATASIG,STRICTENC", + "OK", + "CHECKDATASIG ECDSA w/ STRICTENC" +], +[ + "0x40 0x9db0671f61f1fafa84aaab76ad2e070b27cf9ae85338bafc0b947ac9ad8c56ff7b24aa76c95ad86bb13cbff314742dbe1f545869d1a28efa54b411ccd37717e5", + "0 0x41 0x0479be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8 CHECKDATASIG", + "CHECKDATASIG,SCHNORR,STRICTENC", + "OK", + "CHECKDATASIG Schnorr w/ STRICTENC,SCHNORR" +], +[ + "0x46 0x304402205ffea7d9fa4e0ce8058c96edfb721aaf2840912080ac4ae86a92d9462e69fde302203567149cb9c8c343523a87d7a64be304983899d2e2c6f267a7136c48ff21908d", + "0 0x41 0x0479be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8 CHECKDATASIG", + "CHECKDATASIG,SCHNORR,STRICTENC", + "OK", + "CHECKDATASIG ECDSA w/ STRICTENC,SCHNORR" +], +[ + "0x40 0x65c4bceda6ebb49e692180387e72c84be500f3431daac85d08d5d6c527e296f5b8a5b868a681f76aee309ad05e152b4f190732b3e7c46ef788b68c6035f6eab0", + "0 0x41 0x048282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f5150811f8a8098557dfe45e8256e830b60ace62d613ac2f7b17bed31b6eaff6e26caf CHECKDATASIG", + "CHECKDATASIG,SCHNORR,STRICTENC", + "OK", + "CHECKDATASIG Schnorr other key" +], +[ + "0x40 0x65c4bceda6ebb49e692180387e72c84be500f3431daac85d08d5d6c527e296f5b8a5b868a681f76aee309ad05e152b4f190732b3e7c46ef788b68c6035f6eab0", + "0 0x41 0x0479be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8 CHECKDATASIG NOT", + "CHECKDATASIG,SCHNORR,STRICTENC", + "OK", + "CHECKDATASIG Schnorr mismatched key" +], +[ + "0x40 0xe20d68eea1c55d8c23310ef33b4c68e3d876b1c5a36595f4dcc9d728894c957879e53bb4aebf8b3aa36861d89266ff864d2c3f513ab6f79c9d226ad45fbf5407", + "1 0x41 0x048282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f5150811f8a8098557dfe45e8256e830b60ace62d613ac2f7b17bed31b6eaff6e26caf CHECKDATASIG", + "CHECKDATASIG,SCHNORR,STRICTENC", + "OK", + "CHECKDATASIG Schnorr other message" +], +[ + "0x40 0xe20d68eea1c55d8c23310ef33b4c68e3d876b1c5a36595f4dcc9d728894c957879e53bb4aebf8b3aa36861d89266ff864d2c3f513ab6f79c9d226ad45fbf5407", + "0 0x41 0x048282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f5150811f8a8098557dfe45e8256e830b60ace62d613ac2f7b17bed31b6eaff6e26caf CHECKDATASIG NOT", + "CHECKDATASIG,SCHNORR,STRICTENC", + "OK", + "CHECKDATASIG Schnorr wrong message" +], +[ + "0x40 0x9db0671f61f1fafa84aaab76ad2e070b27cf9ae85338bafc0b947ac9ad8c56ff7b24aa76c95ad86bb13cbff314742dbe1f545869d1a28efa54b411ccd37717e5", + "0 0x41 0x0479be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8 CHECKDATASIGVERIFY 1", + "CHECKDATASIG", + "CHECKDATASIGVERIFY", + "CHECKDATASIGVERIFY Schnorr w/ neither STRICTENC,SCHNORR" +], +[ + "0x46 0x304402205ffea7d9fa4e0ce8058c96edfb721aaf2840912080ac4ae86a92d9462e69fde302203567149cb9c8c343523a87d7a64be304983899d2e2c6f267a7136c48ff21908d", + "0 0x41 0x0479be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8 CHECKDATASIGVERIFY 1", + "CHECKDATASIG", + "OK", + "CHECKDATASIGVERIFY ECDSA w/ neither STRICTENC,SCHNORR" +], +[ + "0x40 0x9db0671f61f1fafa84aaab76ad2e070b27cf9ae85338bafc0b947ac9ad8c56ff7b24aa76c95ad86bb13cbff314742dbe1f545869d1a28efa54b411ccd37717e5", + "0 0x41 0x0479be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8 CHECKDATASIGVERIFY 1", + "CHECKDATASIG,SCHNORR", + "OK", + "CHECKDATASIGVERIFY Schnorr w/ SCHNORR" +], +[ + "0x46 0x304402205ffea7d9fa4e0ce8058c96edfb721aaf2840912080ac4ae86a92d9462e69fde302203567149cb9c8c343523a87d7a64be304983899d2e2c6f267a7136c48ff21908d", + "0 0x41 0x0479be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8 CHECKDATASIGVERIFY 1", + "CHECKDATASIG,SCHNORR", + "OK", + "CHECKDATASIGVERIFY ECDSA w/ SCHNORR" +], +[ + "0x40 0x9db0671f61f1fafa84aaab76ad2e070b27cf9ae85338bafc0b947ac9ad8c56ff7b24aa76c95ad86bb13cbff314742dbe1f545869d1a28efa54b411ccd37717e5", + "0 0x41 0x0479be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8 CHECKDATASIGVERIFY 1", + "CHECKDATASIG,STRICTENC", + "SIG_DER", + "CHECKDATASIGVERIFY Schnorr w/ STRICTENC" +], +[ + "0x46 0x304402205ffea7d9fa4e0ce8058c96edfb721aaf2840912080ac4ae86a92d9462e69fde302203567149cb9c8c343523a87d7a64be304983899d2e2c6f267a7136c48ff21908d", + "0 0x41 0x0479be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8 CHECKDATASIGVERIFY 1", + "CHECKDATASIG,STRICTENC", + "OK", + "CHECKDATASIGVERIFY ECDSA w/ STRICTENC" +], +[ + "0x40 0x9db0671f61f1fafa84aaab76ad2e070b27cf9ae85338bafc0b947ac9ad8c56ff7b24aa76c95ad86bb13cbff314742dbe1f545869d1a28efa54b411ccd37717e5", + "0 0x41 0x0479be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8 CHECKDATASIGVERIFY 1", + "CHECKDATASIG,SCHNORR,STRICTENC", + "OK", + "CHECKDATASIGVERIFY Schnorr w/ STRICTENC,SCHNORR" +], +[ + "0x46 0x304402205ffea7d9fa4e0ce8058c96edfb721aaf2840912080ac4ae86a92d9462e69fde302203567149cb9c8c343523a87d7a64be304983899d2e2c6f267a7136c48ff21908d", + "0 0x41 0x0479be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8 CHECKDATASIGVERIFY 1", + "CHECKDATASIG,SCHNORR,STRICTENC", + "OK", + "CHECKDATASIGVERIFY ECDSA w/ STRICTENC,SCHNORR" +], +[ + "0x40 0x65c4bceda6ebb49e692180387e72c84be500f3431daac85d08d5d6c527e296f5b8a5b868a681f76aee309ad05e152b4f190732b3e7c46ef788b68c6035f6eab0", + "0 0x41 0x048282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f5150811f8a8098557dfe45e8256e830b60ace62d613ac2f7b17bed31b6eaff6e26caf CHECKDATASIGVERIFY 1", + "CHECKDATASIG,SCHNORR,STRICTENC", + "OK", + "CHECKDATASIGVERIFY Schnorr other key" +], +[ + "0x40 0x65c4bceda6ebb49e692180387e72c84be500f3431daac85d08d5d6c527e296f5b8a5b868a681f76aee309ad05e152b4f190732b3e7c46ef788b68c6035f6eab0", + "0 0x41 0x0479be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8 CHECKDATASIGVERIFY 1", + "CHECKDATASIG,SCHNORR,STRICTENC", + "CHECKDATASIGVERIFY", + "CHECKDATASIGVERIFY Schnorr mismatched key" +], +[ + "0x40 0xe20d68eea1c55d8c23310ef33b4c68e3d876b1c5a36595f4dcc9d728894c957879e53bb4aebf8b3aa36861d89266ff864d2c3f513ab6f79c9d226ad45fbf5407", + "1 0x41 0x048282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f5150811f8a8098557dfe45e8256e830b60ace62d613ac2f7b17bed31b6eaff6e26caf CHECKDATASIGVERIFY 1", + "CHECKDATASIG,SCHNORR,STRICTENC", + "OK", + "CHECKDATASIGVERIFY Schnorr other message" +], +[ + "0x40 0xe20d68eea1c55d8c23310ef33b4c68e3d876b1c5a36595f4dcc9d728894c957879e53bb4aebf8b3aa36861d89266ff864d2c3f513ab6f79c9d226ad45fbf5407", + "0 0x41 0x048282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f5150811f8a8098557dfe45e8256e830b60ace62d613ac2f7b17bed31b6eaff6e26caf CHECKDATASIGVERIFY 1", + "CHECKDATASIG,SCHNORR,STRICTENC", + "CHECKDATASIGVERIFY", + "CHECKDATASIGVERIFY Schnorr wrong message" +], +[ + "0 0x41 0x105e4fed395e64ca013ac1ce020ef69b9990a577fe4b74648faafb69e499f76dd53d5c64aa866924361dd3aadde9b7184bbcb4f79520396c9ed17c4d8489a59701", + "1 0x41 0x0479be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8 1 CHECKMULTISIG", + "", + "EVAL_FALSE", + "CHECKMULTISIG Schnorr w/ neither STRICTENC,SCHNORR" +], +[ + "0 0x47 0x304402204d0106d6babcaca95277692eaa566bdc89d9f44b1106c18423345c7e9ac40d79022033a3750421038d15f15101ffdca1147a0eb980bb1b809280cb5368c50c10c42c01", + "1 0x41 0x0479be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8 1 CHECKMULTISIG", + "", + "OK", + "CHECKMULTISIG ECDSA w/ neither STRICTENC,SCHNORR" +], +[ + "0 0x41 0x105e4fed395e64ca013ac1ce020ef69b9990a577fe4b74648faafb69e499f76dd53d5c64aa866924361dd3aadde9b7184bbcb4f79520396c9ed17c4d8489a59701", + "1 0x41 0x0479be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8 1 CHECKMULTISIG", + "SCHNORR", + "SIG_BADLENGTH", + "CHECKMULTISIG Schnorr w/ SCHNORR" +], +[ + "0 0x47 0x304402204d0106d6babcaca95277692eaa566bdc89d9f44b1106c18423345c7e9ac40d79022033a3750421038d15f15101ffdca1147a0eb980bb1b809280cb5368c50c10c42c01", + "1 0x41 0x0479be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8 1 CHECKMULTISIG", + "SCHNORR", + "OK", + "CHECKMULTISIG ECDSA w/ SCHNORR" +], +[ + "0 0x41 0x105e4fed395e64ca013ac1ce020ef69b9990a577fe4b74648faafb69e499f76dd53d5c64aa866924361dd3aadde9b7184bbcb4f79520396c9ed17c4d8489a59701", + "1 0x41 0x0479be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8 1 CHECKMULTISIG", + "STRICTENC", + "SIG_DER", + "CHECKMULTISIG Schnorr w/ STRICTENC" +], +[ + "0 0x47 0x304402204d0106d6babcaca95277692eaa566bdc89d9f44b1106c18423345c7e9ac40d79022033a3750421038d15f15101ffdca1147a0eb980bb1b809280cb5368c50c10c42c01", + "1 0x41 0x0479be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8 1 CHECKMULTISIG", + "STRICTENC", + "OK", + "CHECKMULTISIG ECDSA w/ STRICTENC" +], +[ + "0 0x41 0x105e4fed395e64ca013ac1ce020ef69b9990a577fe4b74648faafb69e499f76dd53d5c64aa866924361dd3aadde9b7184bbcb4f79520396c9ed17c4d8489a59701", + "1 0x41 0x0479be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8 1 CHECKMULTISIG", + "SCHNORR,STRICTENC", + "SIG_BADLENGTH", + "CHECKMULTISIG Schnorr w/ STRICTENC,SCHNORR" +], +[ + "0 0x47 0x304402204d0106d6babcaca95277692eaa566bdc89d9f44b1106c18423345c7e9ac40d79022033a3750421038d15f15101ffdca1147a0eb980bb1b809280cb5368c50c10c42c01", + "1 0x41 0x0479be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8 1 CHECKMULTISIG", + "SCHNORR,STRICTENC", + "OK", + "CHECKMULTISIG ECDSA w/ STRICTENC,SCHNORR" +], +[ + "0 0x41 0x833682d4f60cc916a22a2c263e658fa662c49badb1e2a8c6208987bf99b1abd740498371480069e7a7a6e7471bf78c27bd9a1fd04fb212a92017346250ac187b01 0x41 0xea4a8d20562a950f4695dc24804565482e9fa111704886179d0c348f2b8a15fe691a305cd599c59c131677146661d5b98cb935330989a85f33afc70d0a21add101 0x41 0xce9011d76a4df05d6280b2382b4d91490dbec7c3e72dc826be1fc9b4718f627955190745cac96521ea46d6d324c7376461e225310e6cd605b9f266d170769b7901", + "3 0x21 0x0279be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798 0x21 0x038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508 0x21 0x03363d90d447b00c9c99ceac05b6262ee053441c7e55552ffe526bad8f83ff4640 3 CHECKMULTISIG", + "", + "EVAL_FALSE", + "Schnorr 3-of-3 without SCHNORR flag" +], +[ + "0 0x41 0x833682d4f60cc916a22a2c263e658fa662c49badb1e2a8c6208987bf99b1abd740498371480069e7a7a6e7471bf78c27bd9a1fd04fb212a92017346250ac187b01 0x41 0xea4a8d20562a950f4695dc24804565482e9fa111704886179d0c348f2b8a15fe691a305cd599c59c131677146661d5b98cb935330989a85f33afc70d0a21add101 0x41 0xce9011d76a4df05d6280b2382b4d91490dbec7c3e72dc826be1fc9b4718f627955190745cac96521ea46d6d324c7376461e225310e6cd605b9f266d170769b7901", + "3 0x21 0x0279be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798 0x21 0x038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508 0x21 0x03363d90d447b00c9c99ceac05b6262ee053441c7e55552ffe526bad8f83ff4640 3 CHECKMULTISIG", + "SCHNORR", + "SIG_BADLENGTH", + "Schnorr 3-of-3 with SCHNORR flag" +], +[ + "0 0x47 0x304402204d69d5caa4dbab259f79fce89d3b459bbd91697c1c052a1554ff3b08b2241cbd0220330a8e17a90d51996e363cb8902fce6278c6350fa59ae12832db2f6a44d64dce01 0x47 0x3044022031a1e5289b0d9c33ec182a7f67210b9997187c710f7d3f0f28bdfb618c4e025c02205d95fe63ee83a20ec44159a06f7c0b43b61d5f0c346ca4a2cc7b91878ad1a85001 0x41 0xce9011d76a4df05d6280b2382b4d91490dbec7c3e72dc826be1fc9b4718f627955190745cac96521ea46d6d324c7376461e225310e6cd605b9f266d170769b7901", + "3 0x21 0x0279be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798 0x21 0x038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508 0x21 0x03363d90d447b00c9c99ceac05b6262ee053441c7e55552ffe526bad8f83ff4640 3 CHECKMULTISIG", + "SCHNORR", + "SIG_BADLENGTH", + "Schnorr-ECDSA-mixed 3-of-3 with SCHNORR flag" +], +[ + "0 0x41 0x17fa4dd3e62694cc7816d32b73d5646ea768072aea4926a09e159e5f57be8fd6523800b259fe2a12e27aa29a3719f19e9e4b99d7f8e465a6f19454f914ccb3ec01", + "1 0x41 0x0479be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8 1 CHECKMULTISIGVERIFY 1", + "", + "CHECKMULTISIGVERIFY", + "CHECKMULTISIGVERIFY Schnorr w/ neither STRICTENC,SCHNORR" +], +[ + "0 0x47 0x3044022050635b0b57b07eec8ebba4f5cad9ede25ada7ca1645367dcce8d4412290f00e4022037cf466f1498830d5476cd52e84ce4fd6dc4c7d70f985a6e9ff68a034faa5ea101", + "1 0x41 0x0479be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8 1 CHECKMULTISIGVERIFY 1", + "", + "OK", + "CHECKMULTISIGVERIFY ECDSA w/ neither STRICTENC,SCHNORR" +], +[ + "0 0x41 0x17fa4dd3e62694cc7816d32b73d5646ea768072aea4926a09e159e5f57be8fd6523800b259fe2a12e27aa29a3719f19e9e4b99d7f8e465a6f19454f914ccb3ec01", + "1 0x41 0x0479be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8 1 CHECKMULTISIGVERIFY 1", + "SCHNORR", + "SIG_BADLENGTH", + "CHECKMULTISIGVERIFY Schnorr w/ SCHNORR" +], +[ + "0 0x47 0x3044022050635b0b57b07eec8ebba4f5cad9ede25ada7ca1645367dcce8d4412290f00e4022037cf466f1498830d5476cd52e84ce4fd6dc4c7d70f985a6e9ff68a034faa5ea101", + "1 0x41 0x0479be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8 1 CHECKMULTISIGVERIFY 1", + "SCHNORR", + "OK", + "CHECKMULTISIGVERIFY ECDSA w/ SCHNORR" +], +[ + "0 0x41 0x17fa4dd3e62694cc7816d32b73d5646ea768072aea4926a09e159e5f57be8fd6523800b259fe2a12e27aa29a3719f19e9e4b99d7f8e465a6f19454f914ccb3ec01", + "1 0x41 0x0479be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8 1 CHECKMULTISIGVERIFY 1", + "STRICTENC", + "SIG_DER", + "CHECKMULTISIGVERIFY Schnorr w/ STRICTENC" +], +[ + "0 0x47 0x3044022050635b0b57b07eec8ebba4f5cad9ede25ada7ca1645367dcce8d4412290f00e4022037cf466f1498830d5476cd52e84ce4fd6dc4c7d70f985a6e9ff68a034faa5ea101", + "1 0x41 0x0479be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8 1 CHECKMULTISIGVERIFY 1", + "STRICTENC", + "OK", + "CHECKMULTISIGVERIFY ECDSA w/ STRICTENC" +], +[ + "0 0x41 0x17fa4dd3e62694cc7816d32b73d5646ea768072aea4926a09e159e5f57be8fd6523800b259fe2a12e27aa29a3719f19e9e4b99d7f8e465a6f19454f914ccb3ec01", + "1 0x41 0x0479be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8 1 CHECKMULTISIGVERIFY 1", + "SCHNORR,STRICTENC", + "SIG_BADLENGTH", + "CHECKMULTISIGVERIFY Schnorr w/ STRICTENC,SCHNORR" +], +[ + "0 0x47 0x3044022050635b0b57b07eec8ebba4f5cad9ede25ada7ca1645367dcce8d4412290f00e4022037cf466f1498830d5476cd52e84ce4fd6dc4c7d70f985a6e9ff68a034faa5ea101", + "1 0x41 0x0479be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8 1 CHECKMULTISIGVERIFY 1", + "SCHNORR,STRICTENC", + "OK", + "CHECKMULTISIGVERIFY ECDSA w/ STRICTENC,SCHNORR" +], +[ + "0x41 0x6f1b69791cd7284b5510daef44cd5acd5c1f3d61f6a79705e18f106b46122f1ed8c5965f3c92c90943f9b51f57207e9e5b7fc462571281e2c92377e4ef20ab2b01", + "0x41 0x0479be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8 CHECKSIG NOT", + "SCHNORR", + "OK", + "Schnorr P2PK, bad sig" +], +[ + "0x41 0x6f1b69791cd7284b5510daef44cd5acd5c1f3d61f6a79705e18f106b46122f1ed8c5965f3c92c90943f9b51f57207e9e5b7fc462571281e2c92377e4ef20ab2b01", + "0x41 0x0479be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8 CHECKSIG NOT", + "SCHNORR,STRICTENC", + "OK", + "Schnorr P2PK, bad sig STRICTENC" +], +[ + "0x41 0x6f1b69791cd7284b5510daef44cd5acd5c1f3d61f6a79705e18f106b46122f1ed8c5965f3c92c90943f9b51f57207e9e5b7fc462571281e2c92377e4ef20ab2b01", + "0x41 0x0479be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8 CHECKSIG NOT", + "NULLFAIL,SCHNORR", + "NULLFAIL", + "Schnorr P2PK, bad sig NULLFAIL" +], +[ + "0x41 0x4463c103b21e76713571365c4c09224c2a1b343b3cf02e3b56f4f0890a6e7ff96d0bfa2ffa22f8067db3414cc1789abfc48638cb4bc7463907042975f4c84ece01 0x21 0x038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508", + "DUP HASH160 0x14 0x1018853670f9f3b0582c5b9ee8ce93764ac32b93 EQUALVERIFY CHECKSIG", + "SCHNORR", + "OK", + "Schnorr P2PKH" +], +[ + "0x41 0xd78d543b601bc93b394b5c669933d16d860dc7480383efcaae9521d6ceb4065ba17c02a6d9289efef762fa7a0482eff9c5bce4dd95f8bea421ee70bdd8d5488d01", + "0x21 0x0279be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798 CHECKSIG", + "SCHNORR,STRICTENC", + "OK", + "Schnorr P2PK with compressed pubkey" +], +[ + "0x41 0x0df4be7f5fe74b2855b92082720e889038e15d8d747334fa3f300ef4ab1db1eea56aa83d1d60809ff6703791736be87cfb6cbc5c4036aeed3b4ea4e6dab3509001", + "0x41 0x0479be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8 CHECKSIG", + "SCHNORR,STRICTENC", + "OK", + "Schnorr P2PK with uncompressed pubkey" +], +[ + "0x41 0x0df4be7f5fe74b2855b92082720e889038e15d8d747334fa3f300ef4ab1db1eea56aa83d1d60809ff6703791736be87cfb6cbc5c4036aeed3b4ea4e6dab3509001", + "0x41 0x0479be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8 CHECKSIG", + "COMPRESSED_PUBKEYTYPE,SCHNORR,STRICTENC", + "NONCOMPRESSED_PUBKEY", + "Schnorr P2PK with uncompressed pubkey but COMPRESSED_PUBKEYTYPE set" +], +[ + "0x41 0xd211631fdebf4c8376b3d169ef65a1987460eda43c3312e561b0226fa3069f68a68bac0dbf780f77dd60ff602c66186f1da2bb0a31f10187796242f48295ddbe01", + "0x41 0x0679be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8 CHECKSIG", + "SCHNORR,STRICTENC", + "PUBKEYTYPE", + "Schnorr P2PK with hybrid pubkey" +], +[ + "0x41 0xd211631fdebf4c8376b3d169ef65a1987460eda43c3312e561b0226fa3069f68a68bac0dbf780f77dd60ff602c66186f1da2bb0a31f10187796242f48295ddbe01", + "0x41 0x0679be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8 CHECKSIG", + "SCHNORR", + "OK", + "Schnorr P2PK with hybrid pubkey but no STRICTENC" +], +[ + "0x41 0x078b6b4e7d0689f3a1ef9b5283039c39b7ab3a26c04143017ee7136edbc1ccbcf47173c92c5823b778e4aaba3bf9ef2e988eb54c4cb709dbfa8e62110843c19901", + "0x41 0x0679be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8 CHECKSIG NOT", + "SCHNORR", + "OK", + "Schnorr P2PK NOT with damaged hybrid pubkey but no STRICTENC" +], +[ + "0x41 0xa522c6aab80595e0fdaf473c89a32e97978858809949fafd6f851254daae231f45338fe53187f79d8507f08c08f8bd2ee795e6ccaca0a04c4e40c613395a685b05", + "0x41 0x048282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f5150811f8a8098557dfe45e8256e830b60ace62d613ac2f7b17bed31b6eaff6e26caf CHECKSIG", + "SCHNORR,STRICTENC", + "SIG_HASHTYPE", + "Schnorr P2PK with undefined basehashtype and STRICTENC" +], +[ + "0x41 0x128f02ec5b36057a7f3793c5ffdef9e6cca0ea3200a2f07e5c7189a267daafc4feb2b65a8c7f22b203557fef4c078e98382dc99939666b7c6dbcc62bd25b0bf821 0x41 0x0479be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8", + "DUP HASH160 0x14 0x91b24bf9f5288532960ac687abb035127b1d28a5 EQUALVERIFY CHECKSIG", + "SCHNORR", + "OK", + "Schnorr P2PKH with invalid sighashtype but no STRICTENC" +], +[ + "0x41 0x128f02ec5b36057a7f3793c5ffdef9e6cca0ea3200a2f07e5c7189a267daafc4feb2b65a8c7f22b203557fef4c078e98382dc99939666b7c6dbcc62bd25b0bf821 0x41 0x0479be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8", + "DUP HASH160 0x14 0x91b24bf9f5288532960ac687abb035127b1d28a5 EQUALVERIFY CHECKSIG", + "SCHNORR,STRICTENC", + "SIG_HASHTYPE", + "Schnorr P2PKH with invalid sighashtype and STRICTENC" +], +[ + "0x41 0x3dae009b3fc84066b644b0508d1cc68fbbdefbb91b049aaa46e8de5c3b4598707d93df80a275022354f8e3e65ca6561c55d2f626c8395d237fb1f2b6b93e83f081", + "0x41 0x048282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f5150811f8a8098557dfe45e8256e830b60ace62d613ac2f7b17bed31b6eaff6e26caf CHECKSIG", + "SCHNORR", + "OK", + "Schnorr P2PK anyonecanpay" +], +[ + "0x41 0x3dae009b3fc84066b644b0508d1cc68fbbdefbb91b049aaa46e8de5c3b4598707d93df80a275022354f8e3e65ca6561c55d2f626c8395d237fb1f2b6b93e83f001", + "0x41 0x048282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f5150811f8a8098557dfe45e8256e830b60ace62d613ac2f7b17bed31b6eaff6e26caf CHECKSIG", + "SCHNORR", + "EVAL_FALSE", + "Schnorr P2PK anyonecanpay marked with normal hashtype" +], +[ + "0x41 0xd06f2e8e262a974d330c185acdd2eed99622f2c9cc0980eacf976f37965186dba2564a564e8c6697127d9729e6cedd44060ab7ece5c2f0ded2ad3f9a7308c7ce41", + "0x41 0x048282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f5150811f8a8098557dfe45e8256e830b60ace62d613ac2f7b17bed31b6eaff6e26caf CHECKSIG", + "SCHNORR,SIGHASH_FORKID,STRICTENC", + "OK", + "Schnorr P2PK with forkID" +], +[ + "0x41 0x3cf1b3f60b74d0821039f7dc7c21abe3119b9d94ae13f5e5258a8269bee9dfc51c84dbb3ba3eff82de61046f6cfef22ea5cf4a46e3776a5fb35d743aea310f6701", + "0x41 0x048282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f5150811f8a8098557dfe45e8256e830b60ace62d613ac2f7b17bed31b6eaff6e26caf CHECKSIG", + "SCHNORR,SIGHASH_FORKID,STRICTENC", + "MISSING_FORKID", + "Schnorr P2PK with non-forkID sig" +], +[ + "0x41 0x3cf1b3f60b74d0821039f7dc7c21abe3119b9d94ae13f5e5258a8269bee9dfc51c84dbb3ba3eff82de61046f6cfef22ea5cf4a46e3776a5fb35d743aea310f6741", + "0x41 0x048282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f5150811f8a8098557dfe45e8256e830b60ace62d613ac2f7b17bed31b6eaff6e26caf CHECKSIG", + "SCHNORR,SIGHASH_FORKID,STRICTENC", + "EVAL_FALSE", + "Schnorr P2PK with cheater forkID bit" +], [ "0x16 0x001491b24bf9f5288532960ac687abb035127b1d28a5", "HASH160 0x14 0x17743beb429c55c942d2ec703b98c4d57c2df5c6 EQUAL", diff --git a/src/test/schnorr_tests.cpp b/src/test/schnorr_tests.cpp new file mode 100644 --- /dev/null +++ b/src/test/schnorr_tests.cpp @@ -0,0 +1,221 @@ +// Copyright (c) 2019 The Bitcoin developers +// Distributed under the MIT software license, see the accompanying +// file COPYING or http://www.opensource.org/licenses/mit-license.php. + +#include "test/lcg.h" +#include "test/test_bitcoin.h" + +#include "script/interpreter.h" + +#include + +#include +#include + +typedef std::vector valtype; +typedef std::vector stacktype; + +BOOST_FIXTURE_TEST_SUITE(schnorr_tests, BasicTestingSetup) + +static valtype SignatureWithHashType(valtype vchSig, SigHashType sigHash) { + vchSig.push_back(static_cast(sigHash.getRawSigHashType())); + return vchSig; +} + +const uint8_t vchPrivkey[32] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1}; + +struct KeyData { + CKey privkeyC; + CPubKey pubkeyC; + + KeyData() { + privkeyC.Set(vchPrivkey, vchPrivkey + 32, true); + pubkeyC = privkeyC.GetPubKey(); + } +}; + +static void CheckError(uint32_t flags, const stacktype &original_stack, + const CScript &script, ScriptError expected) { + BaseSignatureChecker sigchecker; + ScriptError err = SCRIPT_ERR_OK; + stacktype stack{original_stack}; + bool r = EvalScript(stack, script, flags, sigchecker, &err); + BOOST_CHECK(!r); + BOOST_CHECK_EQUAL(err, expected); +} + +static void CheckPass(uint32_t flags, const stacktype &original_stack, + const CScript &script, const stacktype &expected) { + BaseSignatureChecker sigchecker; + ScriptError err = SCRIPT_ERR_OK; + stacktype stack{original_stack}; + bool r = EvalScript(stack, script, flags, sigchecker, &err); + BOOST_CHECK(r); + BOOST_CHECK_EQUAL(err, SCRIPT_ERR_OK); + BOOST_CHECK(stack == expected); +} + +BOOST_AUTO_TEST_CASE(opcodes_random_flags) { + // Test script execution of the six signature opcodes with Schnorr-sized + // signatures, and probe failure mode under a very wide variety of flags. + + // A counterpart to this can be found in sigencoding_tests.cpp, which only + // probes the sig encoding functions. + + // Grab the various pubkey types. + KeyData kd; + valtype pubkeyC = ToByteVector(kd.pubkeyC); + + // Script endings. The non-verify variants will complete OK and the verify + // variant will complete with SCRIPT_ERR_, that is, unless + // there is a flag-dependent error which we will be testing for. + const CScript scriptCHECKSIG = CScript() + << OP_CHECKSIG << OP_NOT << OP_VERIFY; + const CScript scriptCHECKSIGVERIFY = CScript() << OP_CHECKSIGVERIFY; + const CScript scriptCHECKDATASIG = CScript() << OP_CHECKDATASIG << OP_NOT + << OP_VERIFY; + const CScript scriptCHECKDATASIGVERIFY = CScript() << OP_CHECKDATASIGVERIFY; + const CScript scriptCHECKMULTISIG = CScript() << OP_CHECKMULTISIG << OP_NOT + << OP_VERIFY; + const CScript scriptCHECKMULTISIGVERIFY = CScript() + << OP_CHECKMULTISIGVERIFY; + + // all-zero signature: valid encoding for Schnorr but invalid for DER. + valtype Zero64{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00}; + // this is a validly-encoded 64 byte DER sig; also a valid Schnorr encoding. + valtype DER64{0x30, 0x3e, 0x02, 0x1d, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x02, 0x1d, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, + 0x44, 0x44, 0x44, 0x44}; + + // for variety we start off at a different seed than sigencoding_tests + // The first lcg.next() call is still 0x00000000 though. + MMIXLinearCongruentialGenerator lcg(1234); + for (int i = 0; i < 4096; i++) { + uint32_t flags = lcg.next() | SCRIPT_ENABLE_CHECKDATASIG; + + const bool hasForkId = (flags & SCRIPT_ENABLE_SIGHASH_FORKID) != 0; + const bool hasSchnorr = (flags & SCRIPT_ENABLE_SCHNORR) != 0; + const bool hasStricts = + (flags & (SCRIPT_VERIFY_DERSIG | SCRIPT_VERIFY_LOW_S | + SCRIPT_VERIFY_STRICTENC)) != 0; + const bool hasNullFail = (flags & SCRIPT_VERIFY_NULLFAIL) != 0; + + // Prepare 65-byte transaction sigs with right hashtype byte. + valtype DER64_with_hashtype = + SignatureWithHashType(DER64, SigHashType().withForkId(hasForkId)); + valtype Zero64_with_hashtype = + SignatureWithHashType(Zero64, SigHashType().withForkId(hasForkId)); + + // Test CHECKSIG & CHECKDATASIG with he non-DER sig, which can fail from + // encoding, otherwise upon verification. + if (hasStricts && !hasSchnorr) { + CheckError(flags, {Zero64_with_hashtype, pubkeyC}, scriptCHECKSIG, + SCRIPT_ERR_SIG_DER); + CheckError(flags, {Zero64_with_hashtype, pubkeyC}, + scriptCHECKSIGVERIFY, SCRIPT_ERR_SIG_DER); + CheckError(flags, {Zero64, {}, pubkeyC}, scriptCHECKDATASIG, + SCRIPT_ERR_SIG_DER); + CheckError(flags, {Zero64, {}, pubkeyC}, scriptCHECKDATASIGVERIFY, + SCRIPT_ERR_SIG_DER); + } else if (hasNullFail) { + CheckError(flags, {Zero64_with_hashtype, pubkeyC}, scriptCHECKSIG, + SCRIPT_ERR_SIG_NULLFAIL); + CheckError(flags, {Zero64_with_hashtype, pubkeyC}, + scriptCHECKSIGVERIFY, SCRIPT_ERR_SIG_NULLFAIL); + CheckError(flags, {Zero64, {}, pubkeyC}, scriptCHECKDATASIG, + SCRIPT_ERR_SIG_NULLFAIL); + CheckError(flags, {Zero64, {}, pubkeyC}, scriptCHECKDATASIGVERIFY, + SCRIPT_ERR_SIG_NULLFAIL); + } else { + CheckPass(flags, {Zero64_with_hashtype, pubkeyC}, scriptCHECKSIG, + {}); + CheckError(flags, {Zero64_with_hashtype, pubkeyC}, + scriptCHECKSIGVERIFY, SCRIPT_ERR_CHECKSIGVERIFY); + CheckPass(flags, {Zero64, {}, pubkeyC}, scriptCHECKDATASIG, {}); + CheckError(flags, {Zero64, {}, pubkeyC}, scriptCHECKDATASIGVERIFY, + SCRIPT_ERR_CHECKDATASIGVERIFY); + } + + // Test CHECKSIG & CHECKDATASIG with DER sig, which fails upon + // verification. + if (hasNullFail) { + CheckError(flags, {DER64_with_hashtype, pubkeyC}, scriptCHECKSIG, + SCRIPT_ERR_SIG_NULLFAIL); + CheckError(flags, {DER64_with_hashtype, pubkeyC}, + scriptCHECKSIGVERIFY, SCRIPT_ERR_SIG_NULLFAIL); + CheckError(flags, {DER64, {}, pubkeyC}, scriptCHECKDATASIG, + SCRIPT_ERR_SIG_NULLFAIL); + CheckError(flags, {DER64, {}, pubkeyC}, scriptCHECKDATASIGVERIFY, + SCRIPT_ERR_SIG_NULLFAIL); + } else { + CheckPass(flags, {DER64_with_hashtype, pubkeyC}, scriptCHECKSIG, + {}); + CheckError(flags, {DER64_with_hashtype, pubkeyC}, + scriptCHECKSIGVERIFY, SCRIPT_ERR_CHECKSIGVERIFY); + CheckPass(flags, {DER64, {}, pubkeyC}, scriptCHECKDATASIG, {}); + CheckError(flags, {DER64, {}, pubkeyC}, scriptCHECKDATASIGVERIFY, + SCRIPT_ERR_CHECKDATASIGVERIFY); + } + + // test OP_CHECKMULTISIG/VERIFY + if (hasSchnorr) { + // When Schnorr flag is on, we always fail with BADLENGTH no matter + // what. + CheckError(flags, {{}, Zero64_with_hashtype, {1}, pubkeyC, {1}}, + scriptCHECKMULTISIG, SCRIPT_ERR_SIG_BADLENGTH); + CheckError(flags, {{}, Zero64_with_hashtype, {1}, pubkeyC, {1}}, + scriptCHECKMULTISIGVERIFY, SCRIPT_ERR_SIG_BADLENGTH); + CheckError(flags, {{}, DER64_with_hashtype, {1}, pubkeyC, {1}}, + scriptCHECKMULTISIG, SCRIPT_ERR_SIG_BADLENGTH); + CheckError(flags, {{}, DER64_with_hashtype, {1}, pubkeyC, {1}}, + scriptCHECKMULTISIGVERIFY, SCRIPT_ERR_SIG_BADLENGTH); + } else { + // Otherwise, the failure depends on signature content. + // The non-DER sig can fail from encoding, otherwise upon + // verification. + if (hasStricts) { + CheckError(flags, {{}, Zero64_with_hashtype, {1}, pubkeyC, {1}}, + scriptCHECKMULTISIG, SCRIPT_ERR_SIG_DER); + CheckError(flags, {{}, Zero64_with_hashtype, {1}, pubkeyC, {1}}, + scriptCHECKMULTISIGVERIFY, SCRIPT_ERR_SIG_DER); + } else if (hasNullFail) { + CheckError(flags, {{}, Zero64_with_hashtype, {1}, pubkeyC, {1}}, + scriptCHECKMULTISIG, SCRIPT_ERR_SIG_NULLFAIL); + CheckError(flags, {{}, Zero64_with_hashtype, {1}, pubkeyC, {1}}, + scriptCHECKMULTISIGVERIFY, SCRIPT_ERR_SIG_NULLFAIL); + } else { + CheckPass(flags, {{}, Zero64_with_hashtype, {1}, pubkeyC, {1}}, + scriptCHECKMULTISIG, {}); + CheckError(flags, {{}, Zero64_with_hashtype, {1}, pubkeyC, {1}}, + scriptCHECKMULTISIGVERIFY, + SCRIPT_ERR_CHECKMULTISIGVERIFY); + } + // The DER sig fails upon verification. + if (hasNullFail) { + CheckError(flags, {{}, DER64_with_hashtype, {1}, pubkeyC, {1}}, + scriptCHECKMULTISIG, SCRIPT_ERR_SIG_NULLFAIL); + CheckError(flags, {{}, DER64_with_hashtype, {1}, pubkeyC, {1}}, + scriptCHECKMULTISIGVERIFY, SCRIPT_ERR_SIG_NULLFAIL); + } else { + CheckPass(flags, {{}, DER64_with_hashtype, {1}, pubkeyC, {1}}, + scriptCHECKMULTISIG, {}); + CheckError(flags, {{}, DER64_with_hashtype, {1}, pubkeyC, {1}}, + scriptCHECKMULTISIGVERIFY, + SCRIPT_ERR_CHECKMULTISIGVERIFY); + } + } + } +} + +BOOST_AUTO_TEST_SUITE_END() 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 @@ -283,6 +283,16 @@ return vchSig; } + std::vector DoSignSchnorr(const CKey &key, + const uint256 &hash) const { + std::vector vchSig; + + // no need to iterate for size; schnorrs are always same size. + key.SignSchnorr(hash, vchSig); + + return vchSig; + } + public: TestBuilder(const CScript &script_, const std::string &comment_, uint32_t flags_, bool P2SH = false, @@ -346,6 +356,18 @@ return *this; } + TestBuilder & + PushSigSchnorr(const CKey &key, SigHashType sigHashType = SigHashType(), + Amount amount = Amount::zero(), + uint32_t sigFlags = SCRIPT_ENABLE_SIGHASH_FORKID) { + uint256 hash = SignatureHash(script, CTransaction(spendTx), 0, + sigHashType, amount, nullptr, sigFlags); + std::vector vchSig = DoSignSchnorr(key, hash); + vchSig.push_back(static_cast(sigHashType.getRawSigHashType())); + DoPush(vchSig); + return *this; + } + TestBuilder &PushDataSig(const CKey &key, const std::vector &data, unsigned int lenR = 32, unsigned int lenS = 32) { std::vector vchHash(32); @@ -355,6 +377,15 @@ return *this; } + TestBuilder &PushDataSigSchnorr(const CKey &key, + const std::vector &data) { + std::vector vchHash(32); + CSHA256().Write(data.data(), data.size()).Finalize(vchHash.data()); + + DoPush(DoSignSchnorr(key, uint256(vchHash))); + return *this; + } + TestBuilder &Push(const CPubKey &pubkey) { DoPush(std::vector(pubkey.begin(), pubkey.end())); return *this; @@ -1532,6 +1563,554 @@ .Num(0) .ScriptError(SCRIPT_ERR_PUBKEYTYPE)); + // Test all six CHECK*SIG* opcodes with Schnorr signatures. + // - Schnorr/ECDSA signatures with varying flags SCHNORR / STRICTENC. + // - test with different key / mismatching key + + // CHECKSIG + tests.push_back( + TestBuilder(CScript() << ToByteVector(keys.pubkey0) << OP_CHECKSIG, + "CHECKSIG Schnorr w/ neither STRICTENC,SCHNORR", 0) + .PushSigSchnorr(keys.key0) + .ScriptError(SCRIPT_ERR_EVAL_FALSE)); + tests.push_back( + TestBuilder(CScript() << ToByteVector(keys.pubkey0) << OP_CHECKSIG, + "CHECKSIG ECDSA w/ neither STRICTENC,SCHNORR", 0) + .PushSig(keys.key0)); + tests.push_back( + TestBuilder(CScript() << ToByteVector(keys.pubkey0) << OP_CHECKSIG, + "CHECKSIG Schnorr w/ SCHNORR", SCRIPT_ENABLE_SCHNORR) + .PushSigSchnorr(keys.key0)); + tests.push_back( + TestBuilder(CScript() << ToByteVector(keys.pubkey0) << OP_CHECKSIG, + "CHECKSIG ECDSA w/ SCHNORR", SCRIPT_ENABLE_SCHNORR) + .PushSig(keys.key0)); + tests.push_back( + TestBuilder(CScript() << ToByteVector(keys.pubkey0) << OP_CHECKSIG, + "CHECKSIG Schnorr w/ STRICTENC", SCRIPT_VERIFY_STRICTENC) + .PushSigSchnorr(keys.key0) + .ScriptError(SCRIPT_ERR_SIG_DER)); + tests.push_back( + TestBuilder(CScript() << ToByteVector(keys.pubkey0) << OP_CHECKSIG, + "CHECKSIG ECDSA w/ STRICTENC", SCRIPT_VERIFY_STRICTENC) + .PushSig(keys.key0)); + tests.push_back( + TestBuilder(CScript() << ToByteVector(keys.pubkey0) << OP_CHECKSIG, + "CHECKSIG Schnorr w/ STRICTENC,SCHNORR", + SCRIPT_ENABLE_SCHNORR | SCRIPT_VERIFY_STRICTENC) + .PushSigSchnorr(keys.key0)); + tests.push_back( + TestBuilder(CScript() << ToByteVector(keys.pubkey0) << OP_CHECKSIG, + "CHECKSIG ECDSA w/ STRICTENC,SCHNORR", + SCRIPT_ENABLE_SCHNORR | SCRIPT_VERIFY_STRICTENC) + .PushSig(keys.key0)); + tests.push_back( + TestBuilder(CScript() << ToByteVector(keys.pubkey1) << OP_CHECKSIG, + "CHECKSIG Schnorr other key", + SCRIPT_ENABLE_SCHNORR | SCRIPT_VERIFY_STRICTENC) + .PushSigSchnorr(keys.key1)); + tests.push_back(TestBuilder(CScript() << ToByteVector(keys.pubkey0) + << OP_CHECKSIG << OP_NOT, + "CHECKSIG Schnorr mismatched key", + SCRIPT_ENABLE_SCHNORR | SCRIPT_VERIFY_STRICTENC) + .PushSigSchnorr(keys.key1)); + + // CHECKSIGVERIFY + tests.push_back( + TestBuilder(CScript() << ToByteVector(keys.pubkey0) << OP_CHECKSIGVERIFY + << OP_1, + "CHECKSIGVERIFY Schnorr w/ neither STRICTENC,SCHNORR", 0) + .PushSigSchnorr(keys.key0) + .ScriptError(SCRIPT_ERR_CHECKSIGVERIFY)); + tests.push_back( + TestBuilder(CScript() << ToByteVector(keys.pubkey0) << OP_CHECKSIGVERIFY + << OP_1, + "CHECKSIGVERIFY ECDSA w/ neither STRICTENC,SCHNORR", 0) + .PushSig(keys.key0)); + tests.push_back(TestBuilder(CScript() << ToByteVector(keys.pubkey0) + << OP_CHECKSIGVERIFY << OP_1, + "CHECKSIGVERIFY Schnorr w/ SCHNORR", + SCRIPT_ENABLE_SCHNORR) + .PushSigSchnorr(keys.key0)); + tests.push_back(TestBuilder(CScript() << ToByteVector(keys.pubkey0) + << OP_CHECKSIGVERIFY << OP_1, + "CHECKSIGVERIFY ECDSA w/ SCHNORR", + SCRIPT_ENABLE_SCHNORR) + .PushSig(keys.key0)); + tests.push_back(TestBuilder(CScript() << ToByteVector(keys.pubkey0) + << OP_CHECKSIGVERIFY << OP_1, + "CHECKSIGVERIFY Schnorr w/ STRICTENC", + SCRIPT_VERIFY_STRICTENC) + .PushSigSchnorr(keys.key0) + .ScriptError(SCRIPT_ERR_SIG_DER)); + tests.push_back(TestBuilder(CScript() << ToByteVector(keys.pubkey0) + << OP_CHECKSIGVERIFY << OP_1, + "CHECKSIGVERIFY ECDSA w/ STRICTENC", + SCRIPT_VERIFY_STRICTENC) + .PushSig(keys.key0)); + tests.push_back(TestBuilder(CScript() << ToByteVector(keys.pubkey0) + << OP_CHECKSIGVERIFY << OP_1, + "CHECKSIGVERIFY Schnorr w/ STRICTENC,SCHNORR", + SCRIPT_ENABLE_SCHNORR | SCRIPT_VERIFY_STRICTENC) + .PushSigSchnorr(keys.key0)); + tests.push_back(TestBuilder(CScript() << ToByteVector(keys.pubkey0) + << OP_CHECKSIGVERIFY << OP_1, + "CHECKSIGVERIFY ECDSA w/ STRICTENC,SCHNORR", + SCRIPT_ENABLE_SCHNORR | SCRIPT_VERIFY_STRICTENC) + .PushSig(keys.key0)); + tests.push_back(TestBuilder(CScript() << ToByteVector(keys.pubkey1) + << OP_CHECKSIGVERIFY << OP_1, + "CHECKSIGVERIFY Schnorr other key", + SCRIPT_ENABLE_SCHNORR | SCRIPT_VERIFY_STRICTENC) + .PushSigSchnorr(keys.key1)); + tests.push_back(TestBuilder(CScript() << ToByteVector(keys.pubkey0) + << OP_CHECKSIGVERIFY << OP_1, + "CHECKSIGVERIFY Schnorr mismatched key", + SCRIPT_ENABLE_SCHNORR | SCRIPT_VERIFY_STRICTENC) + .PushSigSchnorr(keys.key1) + .ScriptError(SCRIPT_ERR_CHECKSIGVERIFY)); + + // CHECKDATASIG + tests.push_back( + TestBuilder(CScript() << OP_0 << ToByteVector(keys.pubkey0) + << OP_CHECKDATASIG, + "CHECKDATASIG Schnorr w/ neither STRICTENC,SCHNORR", + SCRIPT_ENABLE_CHECKDATASIG) + .PushDataSigSchnorr(keys.key0, {}) + .ScriptError(SCRIPT_ERR_EVAL_FALSE)); + tests.push_back( + TestBuilder(CScript() << OP_0 << ToByteVector(keys.pubkey0) + << OP_CHECKDATASIG, + "CHECKDATASIG ECDSA w/ neither STRICTENC,SCHNORR", + SCRIPT_ENABLE_CHECKDATASIG) + .PushDataSig(keys.key0, {})); + tests.push_back( + TestBuilder(CScript() << OP_0 << ToByteVector(keys.pubkey0) + << OP_CHECKDATASIG, + "CHECKDATASIG Schnorr w/ SCHNORR", + SCRIPT_ENABLE_CHECKDATASIG | SCRIPT_ENABLE_SCHNORR) + .PushDataSigSchnorr(keys.key0, {})); + tests.push_back( + TestBuilder(CScript() << OP_0 << ToByteVector(keys.pubkey0) + << OP_CHECKDATASIG, + "CHECKDATASIG ECDSA w/ SCHNORR", + SCRIPT_ENABLE_CHECKDATASIG | SCRIPT_ENABLE_SCHNORR) + .PushDataSig(keys.key0, {})); + tests.push_back( + TestBuilder(CScript() << OP_0 << ToByteVector(keys.pubkey0) + << OP_CHECKDATASIG, + "CHECKDATASIG Schnorr w/ STRICTENC", + SCRIPT_ENABLE_CHECKDATASIG | SCRIPT_VERIFY_STRICTENC) + .PushDataSigSchnorr(keys.key0, {}) + .ScriptError(SCRIPT_ERR_SIG_DER)); + tests.push_back( + TestBuilder(CScript() << OP_0 << ToByteVector(keys.pubkey0) + << OP_CHECKDATASIG, + "CHECKDATASIG ECDSA w/ STRICTENC", + SCRIPT_ENABLE_CHECKDATASIG | SCRIPT_VERIFY_STRICTENC) + .PushDataSig(keys.key0, {})); + tests.push_back(TestBuilder(CScript() << OP_0 << ToByteVector(keys.pubkey0) + << OP_CHECKDATASIG, + "CHECKDATASIG Schnorr w/ STRICTENC,SCHNORR", + SCRIPT_ENABLE_CHECKDATASIG | + SCRIPT_ENABLE_SCHNORR | + SCRIPT_VERIFY_STRICTENC) + .PushDataSigSchnorr(keys.key0, {})); + tests.push_back(TestBuilder(CScript() << OP_0 << ToByteVector(keys.pubkey0) + << OP_CHECKDATASIG, + "CHECKDATASIG ECDSA w/ STRICTENC,SCHNORR", + SCRIPT_ENABLE_CHECKDATASIG | + SCRIPT_ENABLE_SCHNORR | + SCRIPT_VERIFY_STRICTENC) + .PushDataSig(keys.key0, {})); + tests.push_back(TestBuilder(CScript() << OP_0 << ToByteVector(keys.pubkey1) + << OP_CHECKDATASIG, + "CHECKDATASIG Schnorr other key", + SCRIPT_ENABLE_CHECKDATASIG | + SCRIPT_ENABLE_SCHNORR | + SCRIPT_VERIFY_STRICTENC) + .PushDataSigSchnorr(keys.key1, {})); + tests.push_back(TestBuilder(CScript() << OP_0 << ToByteVector(keys.pubkey0) + << OP_CHECKDATASIG << OP_NOT, + "CHECKDATASIG Schnorr mismatched key", + SCRIPT_ENABLE_CHECKDATASIG | + SCRIPT_ENABLE_SCHNORR | + SCRIPT_VERIFY_STRICTENC) + .PushDataSigSchnorr(keys.key1, {})); + tests.push_back(TestBuilder(CScript() << OP_1 << ToByteVector(keys.pubkey1) + << OP_CHECKDATASIG, + "CHECKDATASIG Schnorr other message", + SCRIPT_ENABLE_CHECKDATASIG | + SCRIPT_ENABLE_SCHNORR | + SCRIPT_VERIFY_STRICTENC) + .PushDataSigSchnorr(keys.key1, {1})); + tests.push_back(TestBuilder(CScript() << OP_0 << ToByteVector(keys.pubkey1) + << OP_CHECKDATASIG << OP_NOT, + "CHECKDATASIG Schnorr wrong message", + SCRIPT_ENABLE_CHECKDATASIG | + SCRIPT_ENABLE_SCHNORR | + SCRIPT_VERIFY_STRICTENC) + .PushDataSigSchnorr(keys.key1, {1})); + + // CHECKDATASIGVERIFY + tests.push_back( + TestBuilder(CScript() << OP_0 << ToByteVector(keys.pubkey0) + << OP_CHECKDATASIGVERIFY << OP_1, + "CHECKDATASIGVERIFY Schnorr w/ neither STRICTENC,SCHNORR", + SCRIPT_ENABLE_CHECKDATASIG) + .PushDataSigSchnorr(keys.key0, {}) + .ScriptError(SCRIPT_ERR_CHECKDATASIGVERIFY)); + tests.push_back( + TestBuilder(CScript() << OP_0 << ToByteVector(keys.pubkey0) + << OP_CHECKDATASIGVERIFY << OP_1, + "CHECKDATASIGVERIFY ECDSA w/ neither STRICTENC,SCHNORR", + SCRIPT_ENABLE_CHECKDATASIG) + .PushDataSig(keys.key0, {})); + tests.push_back( + TestBuilder(CScript() << OP_0 << ToByteVector(keys.pubkey0) + << OP_CHECKDATASIGVERIFY << OP_1, + "CHECKDATASIGVERIFY Schnorr w/ SCHNORR", + SCRIPT_ENABLE_CHECKDATASIG | SCRIPT_ENABLE_SCHNORR) + .PushDataSigSchnorr(keys.key0, {})); + tests.push_back( + TestBuilder(CScript() << OP_0 << ToByteVector(keys.pubkey0) + << OP_CHECKDATASIGVERIFY << OP_1, + "CHECKDATASIGVERIFY ECDSA w/ SCHNORR", + SCRIPT_ENABLE_CHECKDATASIG | SCRIPT_ENABLE_SCHNORR) + .PushDataSig(keys.key0, {})); + tests.push_back( + TestBuilder(CScript() << OP_0 << ToByteVector(keys.pubkey0) + << OP_CHECKDATASIGVERIFY << OP_1, + "CHECKDATASIGVERIFY Schnorr w/ STRICTENC", + SCRIPT_ENABLE_CHECKDATASIG | SCRIPT_VERIFY_STRICTENC) + .PushDataSigSchnorr(keys.key0, {}) + .ScriptError(SCRIPT_ERR_SIG_DER)); + tests.push_back( + TestBuilder(CScript() << OP_0 << ToByteVector(keys.pubkey0) + << OP_CHECKDATASIGVERIFY << OP_1, + "CHECKDATASIGVERIFY ECDSA w/ STRICTENC", + SCRIPT_ENABLE_CHECKDATASIG | SCRIPT_VERIFY_STRICTENC) + .PushDataSig(keys.key0, {})); + tests.push_back( + TestBuilder(CScript() << OP_0 << ToByteVector(keys.pubkey0) + << OP_CHECKDATASIGVERIFY << OP_1, + "CHECKDATASIGVERIFY Schnorr w/ STRICTENC,SCHNORR", + SCRIPT_ENABLE_CHECKDATASIG | SCRIPT_ENABLE_SCHNORR | + SCRIPT_VERIFY_STRICTENC) + .PushDataSigSchnorr(keys.key0, {})); + tests.push_back(TestBuilder(CScript() << OP_0 << ToByteVector(keys.pubkey0) + << OP_CHECKDATASIGVERIFY << OP_1, + "CHECKDATASIGVERIFY ECDSA w/ STRICTENC,SCHNORR", + SCRIPT_ENABLE_CHECKDATASIG | + SCRIPT_ENABLE_SCHNORR | + SCRIPT_VERIFY_STRICTENC) + .PushDataSig(keys.key0, {})); + tests.push_back(TestBuilder(CScript() << OP_0 << ToByteVector(keys.pubkey1) + << OP_CHECKDATASIGVERIFY << OP_1, + "CHECKDATASIGVERIFY Schnorr other key", + SCRIPT_ENABLE_CHECKDATASIG | + SCRIPT_ENABLE_SCHNORR | + SCRIPT_VERIFY_STRICTENC) + .PushDataSigSchnorr(keys.key1, {})); + tests.push_back(TestBuilder(CScript() << OP_0 << ToByteVector(keys.pubkey0) + << OP_CHECKDATASIGVERIFY << OP_1, + "CHECKDATASIGVERIFY Schnorr mismatched key", + SCRIPT_ENABLE_CHECKDATASIG | + SCRIPT_ENABLE_SCHNORR | + SCRIPT_VERIFY_STRICTENC) + .PushDataSigSchnorr(keys.key1, {}) + .ScriptError(SCRIPT_ERR_CHECKDATASIGVERIFY)); + tests.push_back(TestBuilder(CScript() << OP_1 << ToByteVector(keys.pubkey1) + << OP_CHECKDATASIGVERIFY << OP_1, + "CHECKDATASIGVERIFY Schnorr other message", + SCRIPT_ENABLE_CHECKDATASIG | + SCRIPT_ENABLE_SCHNORR | + SCRIPT_VERIFY_STRICTENC) + .PushDataSigSchnorr(keys.key1, {1})); + tests.push_back(TestBuilder(CScript() << OP_0 << ToByteVector(keys.pubkey1) + << OP_CHECKDATASIGVERIFY << OP_1, + "CHECKDATASIGVERIFY Schnorr wrong message", + SCRIPT_ENABLE_CHECKDATASIG | + SCRIPT_ENABLE_SCHNORR | + SCRIPT_VERIFY_STRICTENC) + .PushDataSigSchnorr(keys.key1, {1}) + .ScriptError(SCRIPT_ERR_CHECKDATASIGVERIFY)); + + // CHECKMULTISIG 1-of-1 + tests.push_back( + TestBuilder(CScript() << OP_1 << ToByteVector(keys.pubkey0) << OP_1 + << OP_CHECKMULTISIG, + "CHECKMULTISIG Schnorr w/ neither STRICTENC,SCHNORR", 0) + .Num(0) + .PushSigSchnorr(keys.key0) + .ScriptError(SCRIPT_ERR_EVAL_FALSE)); + tests.push_back( + TestBuilder(CScript() << OP_1 << ToByteVector(keys.pubkey0) << OP_1 + << OP_CHECKMULTISIG, + "CHECKMULTISIG ECDSA w/ neither STRICTENC,SCHNORR", 0) + .Num(0) + .PushSig(keys.key0)); + tests.push_back(TestBuilder(CScript() << OP_1 << ToByteVector(keys.pubkey0) + << OP_1 << OP_CHECKMULTISIG, + "CHECKMULTISIG Schnorr w/ SCHNORR", + SCRIPT_ENABLE_SCHNORR) + .Num(0) + .PushSigSchnorr(keys.key0) + .ScriptError(SCRIPT_ERR_SIG_BADLENGTH)); + tests.push_back(TestBuilder(CScript() << OP_1 << ToByteVector(keys.pubkey0) + << OP_1 << OP_CHECKMULTISIG, + "CHECKMULTISIG ECDSA w/ SCHNORR", + SCRIPT_ENABLE_SCHNORR) + .Num(0) + .PushSig(keys.key0)); + tests.push_back(TestBuilder(CScript() << OP_1 << ToByteVector(keys.pubkey0) + << OP_1 << OP_CHECKMULTISIG, + "CHECKMULTISIG Schnorr w/ STRICTENC", + SCRIPT_VERIFY_STRICTENC) + .Num(0) + .PushSigSchnorr(keys.key0) + .ScriptError(SCRIPT_ERR_SIG_DER)); + tests.push_back(TestBuilder(CScript() << OP_1 << ToByteVector(keys.pubkey0) + << OP_1 << OP_CHECKMULTISIG, + "CHECKMULTISIG ECDSA w/ STRICTENC", + SCRIPT_VERIFY_STRICTENC) + .Num(0) + .PushSig(keys.key0)); + tests.push_back(TestBuilder(CScript() << OP_1 << ToByteVector(keys.pubkey0) + << OP_1 << OP_CHECKMULTISIG, + "CHECKMULTISIG Schnorr w/ STRICTENC,SCHNORR", + SCRIPT_ENABLE_SCHNORR | SCRIPT_VERIFY_STRICTENC) + .Num(0) + .PushSigSchnorr(keys.key0) + .ScriptError(SCRIPT_ERR_SIG_BADLENGTH)); + tests.push_back(TestBuilder(CScript() << OP_1 << ToByteVector(keys.pubkey0) + << OP_1 << OP_CHECKMULTISIG, + "CHECKMULTISIG ECDSA w/ STRICTENC,SCHNORR", + SCRIPT_ENABLE_SCHNORR | SCRIPT_VERIFY_STRICTENC) + .Num(0) + .PushSig(keys.key0)); + + // Test multisig with multiple Schnorr signatures + tests.push_back(TestBuilder(CScript() << OP_3 << ToByteVector(keys.pubkey0C) + << ToByteVector(keys.pubkey1C) + << ToByteVector(keys.pubkey2C) << OP_3 + << OP_CHECKMULTISIG, + "Schnorr 3-of-3 without SCHNORR flag", 0) + .Num(0) + .PushSigSchnorr(keys.key0) + .PushSigSchnorr(keys.key1) + .PushSigSchnorr(keys.key2) + .ScriptError(SCRIPT_ERR_EVAL_FALSE)); + + tests.push_back(TestBuilder(CScript() << OP_3 << ToByteVector(keys.pubkey0C) + << ToByteVector(keys.pubkey1C) + << ToByteVector(keys.pubkey2C) << OP_3 + << OP_CHECKMULTISIG, + "Schnorr 3-of-3 with SCHNORR flag", + SCRIPT_ENABLE_SCHNORR) + .Num(0) + .PushSigSchnorr(keys.key0) + .PushSigSchnorr(keys.key1) + .PushSigSchnorr(keys.key2) + .ScriptError(SCRIPT_ERR_SIG_BADLENGTH)); + + tests.push_back(TestBuilder(CScript() << OP_3 << ToByteVector(keys.pubkey0C) + << ToByteVector(keys.pubkey1C) + << ToByteVector(keys.pubkey2C) << OP_3 + << OP_CHECKMULTISIG, + "Schnorr-ECDSA-mixed 3-of-3 with SCHNORR flag", + SCRIPT_ENABLE_SCHNORR) + .Num(0) + .PushSig(keys.key0) + .PushSig(keys.key1) + .PushSigSchnorr(keys.key2) + .ScriptError(SCRIPT_ERR_SIG_BADLENGTH)); + + // CHECKMULTISIGVERIFY 1-of-1 + tests.push_back( + TestBuilder(CScript() << OP_1 << ToByteVector(keys.pubkey0) << OP_1 + << OP_CHECKMULTISIGVERIFY << OP_1, + "CHECKMULTISIGVERIFY Schnorr w/ neither STRICTENC,SCHNORR", + 0) + .Num(0) + .PushSigSchnorr(keys.key0) + .ScriptError(SCRIPT_ERR_CHECKMULTISIGVERIFY)); + tests.push_back( + TestBuilder(CScript() << OP_1 << ToByteVector(keys.pubkey0) << OP_1 + << OP_CHECKMULTISIGVERIFY << OP_1, + "CHECKMULTISIGVERIFY ECDSA w/ neither STRICTENC,SCHNORR", 0) + .Num(0) + .PushSig(keys.key0)); + tests.push_back(TestBuilder(CScript() + << OP_1 << ToByteVector(keys.pubkey0) + << OP_1 << OP_CHECKMULTISIGVERIFY << OP_1, + "CHECKMULTISIGVERIFY Schnorr w/ SCHNORR", + SCRIPT_ENABLE_SCHNORR) + .Num(0) + .PushSigSchnorr(keys.key0) + .ScriptError(SCRIPT_ERR_SIG_BADLENGTH)); + tests.push_back(TestBuilder(CScript() + << OP_1 << ToByteVector(keys.pubkey0) + << OP_1 << OP_CHECKMULTISIGVERIFY << OP_1, + "CHECKMULTISIGVERIFY ECDSA w/ SCHNORR", + SCRIPT_ENABLE_SCHNORR) + .Num(0) + .PushSig(keys.key0)); + tests.push_back(TestBuilder(CScript() + << OP_1 << ToByteVector(keys.pubkey0) + << OP_1 << OP_CHECKMULTISIGVERIFY << OP_1, + "CHECKMULTISIGVERIFY Schnorr w/ STRICTENC", + SCRIPT_VERIFY_STRICTENC) + .Num(0) + .PushSigSchnorr(keys.key0) + .ScriptError(SCRIPT_ERR_SIG_DER)); + tests.push_back(TestBuilder(CScript() + << OP_1 << ToByteVector(keys.pubkey0) + << OP_1 << OP_CHECKMULTISIGVERIFY << OP_1, + "CHECKMULTISIGVERIFY ECDSA w/ STRICTENC", + SCRIPT_VERIFY_STRICTENC) + .Num(0) + .PushSig(keys.key0)); + tests.push_back( + TestBuilder(CScript() << OP_1 << ToByteVector(keys.pubkey0) << OP_1 + << OP_CHECKMULTISIGVERIFY << OP_1, + "CHECKMULTISIGVERIFY Schnorr w/ STRICTENC,SCHNORR", + SCRIPT_ENABLE_SCHNORR | SCRIPT_VERIFY_STRICTENC) + .Num(0) + .PushSigSchnorr(keys.key0) + .ScriptError(SCRIPT_ERR_SIG_BADLENGTH)); + tests.push_back( + TestBuilder(CScript() << OP_1 << ToByteVector(keys.pubkey0) << OP_1 + << OP_CHECKMULTISIGVERIFY << OP_1, + "CHECKMULTISIGVERIFY ECDSA w/ STRICTENC,SCHNORR", + SCRIPT_ENABLE_SCHNORR | SCRIPT_VERIFY_STRICTENC) + .Num(0) + .PushSig(keys.key0)); + + // Test damaged Schnorr signatures + tests.push_back(TestBuilder(CScript() << ToByteVector(keys.pubkey0) + << OP_CHECKSIG << OP_NOT, + "Schnorr P2PK, bad sig", SCRIPT_ENABLE_SCHNORR) + .PushSigSchnorr(keys.key0) + .DamagePush(10)); + tests.push_back(TestBuilder(CScript() << ToByteVector(keys.pubkey0) + << OP_CHECKSIG << OP_NOT, + "Schnorr P2PK, bad sig STRICTENC", + SCRIPT_ENABLE_SCHNORR | SCRIPT_VERIFY_STRICTENC) + .PushSigSchnorr(keys.key0) + .DamagePush(10)); + tests.push_back(TestBuilder(CScript() << ToByteVector(keys.pubkey0) + << OP_CHECKSIG << OP_NOT, + "Schnorr P2PK, bad sig NULLFAIL", + SCRIPT_ENABLE_SCHNORR | SCRIPT_VERIFY_NULLFAIL) + .PushSigSchnorr(keys.key0) + .DamagePush(10) + .ScriptError(SCRIPT_ERR_SIG_NULLFAIL)); + + // Make sure P2PKH works with Schnorr + tests.push_back(TestBuilder(CScript() << OP_DUP << OP_HASH160 + << ToByteVector(keys.pubkey1C.GetID()) + << OP_EQUALVERIFY << OP_CHECKSIG, + "Schnorr P2PKH", SCRIPT_ENABLE_SCHNORR) + .PushSigSchnorr(keys.key1) + .Push(keys.pubkey1C)); + + // Test of different pubkey encodings + tests.push_back( + TestBuilder(CScript() << ToByteVector(keys.pubkey0C) << OP_CHECKSIG, + "Schnorr P2PK with compressed pubkey", + SCRIPT_VERIFY_STRICTENC | SCRIPT_ENABLE_SCHNORR) + .PushSigSchnorr(keys.key0, SigHashType())); + tests.push_back( + TestBuilder(CScript() << ToByteVector(keys.pubkey0) << OP_CHECKSIG, + "Schnorr P2PK with uncompressed pubkey", + SCRIPT_VERIFY_STRICTENC | SCRIPT_ENABLE_SCHNORR) + .PushSigSchnorr(keys.key0, SigHashType())); + tests.push_back( + TestBuilder(CScript() << ToByteVector(keys.pubkey0) << OP_CHECKSIG, + "Schnorr P2PK with uncompressed pubkey but " + "COMPRESSED_PUBKEYTYPE set", + SCRIPT_VERIFY_STRICTENC | SCRIPT_ENABLE_SCHNORR | + SCRIPT_VERIFY_COMPRESSED_PUBKEYTYPE) + .PushSigSchnorr(keys.key0, SigHashType()) + .ScriptError(SCRIPT_ERR_NONCOMPRESSED_PUBKEY)); + tests.push_back( + TestBuilder(CScript() << ToByteVector(keys.pubkey0H) << OP_CHECKSIG, + "Schnorr P2PK with hybrid pubkey", + SCRIPT_VERIFY_STRICTENC | SCRIPT_ENABLE_SCHNORR) + .PushSigSchnorr(keys.key0, SigHashType()) + .ScriptError(SCRIPT_ERR_PUBKEYTYPE)); + tests.push_back( + TestBuilder(CScript() << ToByteVector(keys.pubkey0H) << OP_CHECKSIG, + "Schnorr P2PK with hybrid pubkey but no STRICTENC", + SCRIPT_ENABLE_SCHNORR) + .PushSigSchnorr(keys.key0)); + tests.push_back( + TestBuilder( + CScript() << ToByteVector(keys.pubkey0H) << OP_CHECKSIG << OP_NOT, + "Schnorr P2PK NOT with damaged hybrid pubkey but no STRICTENC", + SCRIPT_ENABLE_SCHNORR) + .PushSigSchnorr(keys.key0) + .DamagePush(10)); + + // Ensure sighash types still get checked with schnorr + tests.push_back( + TestBuilder(CScript() << ToByteVector(keys.pubkey1) << OP_CHECKSIG, + "Schnorr P2PK with undefined basehashtype and STRICTENC", + SCRIPT_VERIFY_STRICTENC | SCRIPT_ENABLE_SCHNORR) + .PushSigSchnorr(keys.key1, SigHashType(5)) + .ScriptError(SCRIPT_ERR_SIG_HASHTYPE)); + tests.push_back( + TestBuilder(CScript() << OP_DUP << OP_HASH160 + << ToByteVector(keys.pubkey0.GetID()) + << OP_EQUALVERIFY << OP_CHECKSIG, + "Schnorr P2PKH with invalid sighashtype but no STRICTENC", + SCRIPT_ENABLE_SCHNORR) + .PushSigSchnorr(keys.key0, SigHashType(0x21), Amount::zero(), 0) + .Push(keys.pubkey0)); + tests.push_back( + TestBuilder(CScript() << OP_DUP << OP_HASH160 + << ToByteVector(keys.pubkey0.GetID()) + << OP_EQUALVERIFY << OP_CHECKSIG, + "Schnorr P2PKH with invalid sighashtype and STRICTENC", + SCRIPT_VERIFY_STRICTENC | SCRIPT_ENABLE_SCHNORR) + .PushSigSchnorr(keys.key0, SigHashType(0x21), Amount::zero(), + SCRIPT_VERIFY_STRICTENC | SCRIPT_ENABLE_SCHNORR) + .Push(keys.pubkey0) + .ScriptError(SCRIPT_ERR_SIG_HASHTYPE)); + tests.push_back( + TestBuilder(CScript() << ToByteVector(keys.pubkey1) << OP_CHECKSIG, + "Schnorr P2PK anyonecanpay", SCRIPT_ENABLE_SCHNORR) + .PushSigSchnorr(keys.key1, SigHashType().withAnyoneCanPay())); + tests.push_back( + TestBuilder(CScript() << ToByteVector(keys.pubkey1) << OP_CHECKSIG, + "Schnorr P2PK anyonecanpay marked with normal hashtype", + SCRIPT_ENABLE_SCHNORR) + .PushSigSchnorr(keys.key1, SigHashType().withAnyoneCanPay()) + .EditPush(64, "81", "01") + .ScriptError(SCRIPT_ERR_EVAL_FALSE)); + tests.push_back( + TestBuilder(CScript() << ToByteVector(keys.pubkey1) << OP_CHECKSIG, + "Schnorr P2PK with forkID", + SCRIPT_ENABLE_SCHNORR | SCRIPT_VERIFY_STRICTENC | + SCRIPT_ENABLE_SIGHASH_FORKID) + .PushSigSchnorr(keys.key1, SigHashType().withForkId())); + tests.push_back( + TestBuilder(CScript() << ToByteVector(keys.pubkey1) << OP_CHECKSIG, + "Schnorr P2PK with non-forkID sig", + SCRIPT_ENABLE_SCHNORR | SCRIPT_VERIFY_STRICTENC | + SCRIPT_ENABLE_SIGHASH_FORKID) + .PushSigSchnorr(keys.key1) + .ScriptError(SCRIPT_ERR_MUST_USE_FORKID)); + tests.push_back( + TestBuilder(CScript() << ToByteVector(keys.pubkey1) << OP_CHECKSIG, + "Schnorr P2PK with cheater forkID bit", + SCRIPT_ENABLE_SCHNORR | SCRIPT_VERIFY_STRICTENC | + SCRIPT_ENABLE_SIGHASH_FORKID) + .PushSigSchnorr(keys.key1) + .EditPush(64, "01", "41") + .ScriptError(SCRIPT_ERR_EVAL_FALSE)); + // Tests SCRIPT_ALLOW_SEGWIT_RECOVERY const uint32_t allowSegwitRecoveryFlags = SCRIPT_VERIFY_CLEANSTACK | SCRIPT_VERIFY_P2SH |