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/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,468 @@ "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 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" +], +[ + "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 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" +], +[ + "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 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", + "NULLFAIL,SCHNORR", + "NULLFAIL", + "Schnorr P2PK, bad sig NULLFAIL" +], +[ + "0x41 0x1efa1c64b73879941e65d9e62d3872c837c401cb26c82e8e590521851facd95398430c785d139df8faf152cbf51b5f3889c020afa7bebef150393cbb8e8fb8bb01", + "0x41 0x048282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f5150811f8a8098557dfe45e8256e830b60ace62d613ac2f7b17bed31b6eaff6e26caf CHECKSIG NOT", + "SCHNORR", + "OK", + "Schnorr P2PK, wrong pubkey" +], +[ + "0x41 0x35b32856cbd89eb40130a50c6931ce002e3e9db033179ab6265a276a04795ec8f87e9b4d8343f399915371d7f4a7d4d0c97753f2473b253197695a58eede92de01", + "0x41 0x0479be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8 CHECKSIG NOT", + "SCHNORR", + "OK", + "Schnorr P2PK, wrong privkey" +], +[ + "0x41 0x3cf1b3f60b74d0821039f7dc7c21abe3119b9d94ae13f5e5258a8269bee9dfc51c84dbb3ba3eff82de61046f6cfef22ea5cf4a46e3776a5fb35d743aea310f6701", + "0x41 0x048282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f5150811f8a8098557dfe45e8256e830b60ace62d613ac2f7b17bed31b6eaff6e26caf CHECKSIG", + "SCHNORR", + "OK", + "Schnorr P2PK, change both pubkey and privkey" +], +[ + "0x40 0x9db0671f61f1fafa84aaab76ad2e070b27cf9ae85338bafc0b947ac9ad8c56ff7b24aa76c95ad86bb13cbff314742dbe1f545869d1a28efa54b411ccd37717e5", + "1 0x41 0x0479be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8 CHECKDATASIG NOT", + "CHECKDATASIG,SCHNORR", + "OK", + "CHECKDATASIG Schnorr w/ SCHNORR, wrong message" +], +[ + "0x41 0x4463c103b21e76713571365c4c09224c2a1b343b3cf02e3b56f4f0890a6e7ff96d0bfa2ffa22f8067db3414cc1789abfc48638cb4bc7463907042975f4c84ece01 0x21 0x038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508", + "DUP HASH160 0x14 0x1018853670f9f3b0582c5b9ee8ce93764ac32b93 EQUALVERIFY CHECKSIG", + "SCHNORR", + "OK", + "Schnorr P2PKH" +], +[ + "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" +], +[ + "0x41 0xd211631fdebf4c8376b3d169ef65a1987460eda43c3312e561b0226fa3069f68a68bac0dbf780f77dd60ff602c66186f1da2bb0a31f10187796242f48295ddbe01", + "0x41 0x0679be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8 CHECKSIG", + "SCHNORR", + "OK", + "Schnorr P2PK with hybrid pubkey but no STRICTENC" +], +[ + "0x41 0xd211631fdebf4c8376b3d169ef65a1987460eda43c3312e561b0226fa3069f68a68bac0dbf780f77dd60ff602c66186f1da2bb0a31f10187796242f48295ddbe01", + "0x41 0x0679be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8 CHECKSIG", + "SCHNORR,STRICTENC", + "PUBKEYTYPE", + "Schnorr P2PK with hybrid pubkey" +], +[ + "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" +], ["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 @@ -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,455 @@ .Num(0) .ScriptError(SCRIPT_ERR_PUBKEYTYPE)); + // Test all six SIG opcodes with both of Schnorr/ECDSA signatures, + // and varying flags SCHNORR / STRICTENC. + + // 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)); + + // 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)); + + // 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, {})); + + // 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, {})); + + // 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)); + + // 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 mixed-up / 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 NULLFAIL", + SCRIPT_ENABLE_SCHNORR | SCRIPT_VERIFY_NULLFAIL) + .PushSigSchnorr(keys.key0) + .DamagePush(10) + .ScriptError(SCRIPT_ERR_SIG_NULLFAIL)); + tests.push_back(TestBuilder(CScript() << ToByteVector(keys.pubkey1) + << OP_CHECKSIG << OP_NOT, + "Schnorr P2PK, wrong pubkey", + SCRIPT_ENABLE_SCHNORR) + .PushSigSchnorr(keys.key0)); + tests.push_back(TestBuilder(CScript() << ToByteVector(keys.pubkey0) + << OP_CHECKSIG << OP_NOT, + "Schnorr P2PK, wrong privkey", + SCRIPT_ENABLE_SCHNORR) + .PushSigSchnorr(keys.key1)); + tests.push_back( + TestBuilder(CScript() << ToByteVector(keys.pubkey1) << OP_CHECKSIG, + "Schnorr P2PK, change both pubkey and privkey", + SCRIPT_ENABLE_SCHNORR) + .PushSigSchnorr(keys.key1)); + tests.push_back( + TestBuilder(CScript() << OP_1 << ToByteVector(keys.pubkey0) + << OP_CHECKDATASIG << OP_NOT, + "CHECKDATASIG Schnorr w/ SCHNORR, wrong message", + SCRIPT_ENABLE_CHECKDATASIG | SCRIPT_ENABLE_SCHNORR) + .PushDataSigSchnorr(keys.key0, {})); + + // 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 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)); + + // Test of hybrid pubkey + + 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, + "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 << 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)); + std::set tests_set; {