Changeset View
Changeset View
Standalone View
Standalone View
src/test/script_tests.cpp
| Show First 20 Lines • Show All 1,411 Lines • ▼ Show 20 Lines | tests.push_back(TestBuilder(CScript() << ToByteVector(keys.pubkey0H) | ||||
| << OP_CHECKDATASIGVERIFY << OP_TRUE, | << OP_CHECKDATASIGVERIFY << OP_TRUE, | ||||
| "CHECKDATASIGVERIFY with invalid hybrid pubkey", | "CHECKDATASIGVERIFY with invalid hybrid pubkey", | ||||
| checkdatasigflags) | checkdatasigflags) | ||||
| .PushDataSigECDSA(keys.key0, {}) | .PushDataSigECDSA(keys.key0, {}) | ||||
| .DamagePush(10) | .DamagePush(10) | ||||
| .Num(0) | .Num(0) | ||||
| .ScriptError(SCRIPT_ERR_PUBKEYTYPE)); | .ScriptError(SCRIPT_ERR_PUBKEYTYPE)); | ||||
| // Misc ECDSA tests duplicated with Schnorr flag on | |||||
| tests.push_back( | |||||
| TestBuilder(CScript() << ToByteVector(keys.pubkey0) << OP_CHECKSIG, | |||||
| "P2PK ECDSA with Schnorr flag on", SCRIPT_ENABLE_SCHNORR) | |||||
| .PushSigECDSA(keys.key0)); | |||||
| tests.push_back( | |||||
| TestBuilder(CScript() << ToByteVector(keys.pubkey0) << OP_CHECKSIG, | |||||
| "P2PK, bad sig ECDSA with Schnorr flag on", | |||||
| SCRIPT_ENABLE_SCHNORR) | |||||
| .PushSigECDSA(keys.key0) | |||||
| .DamagePush(10) | |||||
| .ScriptError(SCRIPT_ERR_EVAL_FALSE)); | |||||
| tests.push_back(TestBuilder(CScript() << OP_DUP << OP_HASH160 | |||||
| << ToByteVector(keys.pubkey1C.GetID()) | |||||
| << OP_EQUALVERIFY << OP_CHECKSIG, | |||||
| "P2PKH ECDSA with Schnorr flag on", | |||||
| SCRIPT_ENABLE_SCHNORR) | |||||
| .PushSigECDSA(keys.key1) | |||||
| .Push(keys.pubkey1C)); | |||||
| tests.push_back(TestBuilder(CScript() << OP_2 << ToByteVector(keys.pubkey0C) | |||||
| << ToByteVector(keys.pubkey1C) | |||||
| << ToByteVector(keys.pubkey2C) << OP_3 | |||||
| << OP_CHECKMULTISIG, | |||||
| "P2SH(2-of-3) ECDSA with Schnorr flag on", | |||||
| SCRIPT_VERIFY_P2SH | SCRIPT_ENABLE_SCHNORR, | |||||
| true) | |||||
| .Num(0) | |||||
| .PushSigECDSA(keys.key1) | |||||
| .PushSigECDSA(keys.key2) | |||||
| .PushRedeem()); | |||||
| tests.push_back( | |||||
| TestBuilder(CScript() << ToByteVector(keys.pubkey2C) << OP_CHECKSIG, | |||||
| "LOW_S violating ECDSA with Schnorr flag on", | |||||
| SCRIPT_VERIFY_LOW_S | SCRIPT_ENABLE_SCHNORR) | |||||
| .PushSigECDSA(keys.key2, SigHashType(), 32, 33) | |||||
| .ScriptError(SCRIPT_ERR_SIG_HIGH_S)); | |||||
| tests.push_back( | |||||
| TestBuilder(CScript() << ToByteVector(keys.pubkey0H) << OP_CHECKSIG, | |||||
| "STRICTENC-violating hybrid pubkey with Schnorr flag on", | |||||
| SCRIPT_VERIFY_STRICTENC | SCRIPT_ENABLE_SCHNORR) | |||||
| .PushSigECDSA(keys.key0, SigHashType()) | |||||
| .ScriptError(SCRIPT_ERR_PUBKEYTYPE)); | |||||
| // Duplicated test OP_CHECKDATASIG with Schnorr flag on | |||||
| const uint32_t checkdatasigschnorrflags = SCRIPT_VERIFY_STRICTENC | | |||||
| SCRIPT_VERIFY_NULLFAIL | | |||||
| SCRIPT_ENABLE_SCHNORR; | |||||
| tests.push_back( | |||||
| TestBuilder(CScript() << ToByteVector(keys.pubkey1C) << OP_CHECKDATASIG, | |||||
| "Standard CHECKDATASIG", checkdatasigschnorrflags) | |||||
| .PushDataSigECDSA(keys.key1, {}) | |||||
| .Num(0)); | |||||
| tests.push_back(TestBuilder(CScript() << ToByteVector(keys.pubkey1C) | |||||
| << OP_CHECKDATASIG << OP_NOT, | |||||
| "CHECKDATASIG with NULLFAIL flags", | |||||
| checkdatasigschnorrflags) | |||||
| .PushDataSigECDSA(keys.key1, {}) | |||||
| .Num(1) | |||||
| .ScriptError(SCRIPT_ERR_SIG_NULLFAIL)); | |||||
| tests.push_back( | |||||
| TestBuilder(CScript() << ToByteVector(keys.pubkey1C) << OP_CHECKDATASIG | |||||
| << OP_NOT, | |||||
| "CHECKDATASIG without NULLFAIL flags", | |||||
| checkdatasigschnorrflags & ~SCRIPT_VERIFY_NULLFAIL) | |||||
| .PushDataSigECDSA(keys.key1, {}) | |||||
| .Num(1)); | |||||
| tests.push_back(TestBuilder(CScript() << ToByteVector(keys.pubkey1C) | |||||
| << OP_CHECKDATASIG << OP_NOT, | |||||
| "CHECKDATASIG empty signature", | |||||
| checkdatasigschnorrflags) | |||||
| .Num(0) | |||||
| .Num(0)); | |||||
| tests.push_back( | |||||
| TestBuilder(CScript() << ToByteVector(keys.pubkey1C) << OP_CHECKDATASIG, | |||||
| "CHECKDATASIG with High S but no Low S", | |||||
| checkdatasigschnorrflags) | |||||
| .PushDataSigECDSA(keys.key1, {}, 32, 33) | |||||
| .Num(0)); | |||||
| tests.push_back( | |||||
| TestBuilder(CScript() << ToByteVector(keys.pubkey1C) << OP_CHECKDATASIG, | |||||
| "CHECKDATASIG with High S", | |||||
| checkdatasigschnorrflags | SCRIPT_VERIFY_LOW_S) | |||||
| .PushDataSigECDSA(keys.key1, {}, 32, 33) | |||||
| .Num(0) | |||||
| .ScriptError(SCRIPT_ERR_SIG_HIGH_S)); | |||||
| tests.push_back( | |||||
| TestBuilder(CScript() << ToByteVector(keys.pubkey1C) << OP_CHECKDATASIG, | |||||
| "CHECKDATASIG with too little R padding but no DERSIG", | |||||
| checkdatasigschnorrflags & ~SCRIPT_VERIFY_STRICTENC) | |||||
| .PushDataSigECDSA(keys.key1, {}, 33, 32) | |||||
| .EditPush(1, "45022100", "440220") | |||||
| .Num(0)); | |||||
| tests.push_back( | |||||
| TestBuilder(CScript() << ToByteVector(keys.pubkey1C) << OP_CHECKDATASIG, | |||||
| "CHECKDATASIG with too little R padding", | |||||
| checkdatasigschnorrflags) | |||||
| .PushDataSigECDSA(keys.key1, {}, 33, 32) | |||||
| .EditPush(1, "45022100", "440220") | |||||
| .Num(0) | |||||
| .ScriptError(SCRIPT_ERR_SIG_DER)); | |||||
| tests.push_back( | |||||
| TestBuilder(CScript() << ToByteVector(keys.pubkey0H) << OP_CHECKDATASIG, | |||||
| "CHECKDATASIG with hybrid pubkey but no STRICTENC", | |||||
| checkdatasigschnorrflags & ~SCRIPT_VERIFY_STRICTENC) | |||||
| .PushDataSigECDSA(keys.key0, {}) | |||||
| .Num(0)); | |||||
| tests.push_back( | |||||
| TestBuilder(CScript() << ToByteVector(keys.pubkey0H) << OP_CHECKDATASIG, | |||||
| "CHECKDATASIG with hybrid pubkey", checkdatasigschnorrflags) | |||||
| .PushDataSigECDSA(keys.key0, {}) | |||||
| .Num(0) | |||||
| .ScriptError(SCRIPT_ERR_PUBKEYTYPE)); | |||||
| tests.push_back( | |||||
| TestBuilder(CScript() << ToByteVector(keys.pubkey0H) << OP_CHECKDATASIG | |||||
| << OP_NOT, | |||||
| "CHECKDATASIG with invalid hybrid pubkey but no STRICTENC", | |||||
| 0) | |||||
| .PushDataSigECDSA(keys.key0, {}) | |||||
| .DamagePush(10) | |||||
| .Num(0)); | |||||
| tests.push_back( | |||||
| TestBuilder(CScript() << ToByteVector(keys.pubkey0H) << OP_CHECKDATASIG, | |||||
| "CHECKDATASIG with invalid hybrid pubkey", | |||||
| checkdatasigschnorrflags) | |||||
| .PushDataSigECDSA(keys.key0, {}) | |||||
| .DamagePush(10) | |||||
| .Num(0) | |||||
| .ScriptError(SCRIPT_ERR_PUBKEYTYPE)); | |||||
| // Duplicated test OP_CHECKDATASIGVERIFY with Schnorr flag on | |||||
| tests.push_back(TestBuilder(CScript() << ToByteVector(keys.pubkey1C) | |||||
| << OP_CHECKDATASIGVERIFY << OP_TRUE, | |||||
| "Standard CHECKDATASIGVERIFY", | |||||
| checkdatasigschnorrflags) | |||||
| .PushDataSigECDSA(keys.key1, {}) | |||||
| .Num(0)); | |||||
| tests.push_back(TestBuilder(CScript() << ToByteVector(keys.pubkey1C) | |||||
| << OP_CHECKDATASIGVERIFY << OP_TRUE, | |||||
| "CHECKDATASIGVERIFY with NULLFAIL flags", | |||||
| checkdatasigschnorrflags) | |||||
| .PushDataSigECDSA(keys.key1, {}) | |||||
| .Num(1) | |||||
| .ScriptError(SCRIPT_ERR_SIG_NULLFAIL)); | |||||
| tests.push_back( | |||||
| TestBuilder(CScript() << ToByteVector(keys.pubkey1C) | |||||
| << OP_CHECKDATASIGVERIFY << OP_TRUE, | |||||
| "CHECKDATASIGVERIFY without NULLFAIL flags", | |||||
| checkdatasigschnorrflags & ~SCRIPT_VERIFY_NULLFAIL) | |||||
| .PushDataSigECDSA(keys.key1, {}) | |||||
| .Num(1) | |||||
| .ScriptError(SCRIPT_ERR_CHECKDATASIGVERIFY)); | |||||
| tests.push_back(TestBuilder(CScript() << ToByteVector(keys.pubkey1C) | |||||
| << OP_CHECKDATASIGVERIFY << OP_TRUE, | |||||
| "CHECKDATASIGVERIFY empty signature", | |||||
| checkdatasigschnorrflags) | |||||
| .Num(0) | |||||
| .Num(0) | |||||
| .ScriptError(SCRIPT_ERR_CHECKDATASIGVERIFY)); | |||||
| tests.push_back(TestBuilder(CScript() << ToByteVector(keys.pubkey1C) | |||||
| << OP_CHECKDATASIGVERIFY << OP_TRUE, | |||||
| "CHECKDATASIG with High S but no Low S", | |||||
| checkdatasigschnorrflags) | |||||
| .PushDataSigECDSA(keys.key1, {}, 32, 33) | |||||
| .Num(0)); | |||||
| tests.push_back(TestBuilder(CScript() << ToByteVector(keys.pubkey1C) | |||||
| << OP_CHECKDATASIGVERIFY << OP_TRUE, | |||||
| "CHECKDATASIG with High S", | |||||
| checkdatasigschnorrflags | SCRIPT_VERIFY_LOW_S) | |||||
| .PushDataSigECDSA(keys.key1, {}, 32, 33) | |||||
| .Num(0) | |||||
| .ScriptError(SCRIPT_ERR_SIG_HIGH_S)); | |||||
| tests.push_back( | |||||
| TestBuilder( | |||||
| CScript() << ToByteVector(keys.pubkey1C) << OP_CHECKDATASIGVERIFY | |||||
| << OP_TRUE, | |||||
| "CHECKDATASIGVERIFY with too little R padding but no DERSIG", | |||||
| checkdatasigschnorrflags & ~SCRIPT_VERIFY_STRICTENC) | |||||
| .PushDataSigECDSA(keys.key1, {}, 33, 32) | |||||
| .EditPush(1, "45022100", "440220") | |||||
| .Num(0)); | |||||
| tests.push_back(TestBuilder(CScript() << ToByteVector(keys.pubkey1C) | |||||
| << OP_CHECKDATASIGVERIFY << OP_TRUE, | |||||
| "CHECKDATASIGVERIFY with too little R padding", | |||||
| checkdatasigschnorrflags) | |||||
| .PushDataSigECDSA(keys.key1, {}, 33, 32) | |||||
| .EditPush(1, "45022100", "440220") | |||||
| .Num(0) | |||||
| .ScriptError(SCRIPT_ERR_SIG_DER)); | |||||
| tests.push_back( | |||||
| TestBuilder(CScript() << ToByteVector(keys.pubkey0H) | |||||
| << OP_CHECKDATASIGVERIFY << OP_TRUE, | |||||
| "CHECKDATASIGVERIFY with hybrid pubkey but no STRICTENC", | |||||
| checkdatasigschnorrflags & ~SCRIPT_VERIFY_STRICTENC) | |||||
| .PushDataSigECDSA(keys.key0, {}) | |||||
| .Num(0)); | |||||
| tests.push_back(TestBuilder(CScript() << ToByteVector(keys.pubkey0H) | |||||
| << OP_CHECKDATASIGVERIFY << OP_TRUE, | |||||
| "CHECKDATASIGVERIFY with hybrid pubkey", | |||||
| checkdatasigschnorrflags) | |||||
| .PushDataSigECDSA(keys.key0, {}) | |||||
| .Num(0) | |||||
| .ScriptError(SCRIPT_ERR_PUBKEYTYPE)); | |||||
| tests.push_back( | |||||
| TestBuilder( | |||||
| CScript() << ToByteVector(keys.pubkey0H) << OP_CHECKDATASIGVERIFY | |||||
| << OP_TRUE, | |||||
| "CHECKDATASIGVERIFY with invalid hybrid pubkey but no STRICTENC", 0) | |||||
| .PushDataSigECDSA(keys.key0, {}) | |||||
| .DamagePush(10) | |||||
| .Num(0) | |||||
| .ScriptError(SCRIPT_ERR_CHECKDATASIGVERIFY)); | |||||
| tests.push_back(TestBuilder(CScript() << ToByteVector(keys.pubkey0H) | |||||
| << OP_CHECKDATASIGVERIFY << OP_TRUE, | |||||
| "CHECKDATASIGVERIFY with invalid hybrid pubkey", | |||||
| checkdatasigschnorrflags) | |||||
| .PushDataSigECDSA(keys.key0, {}) | |||||
| .DamagePush(10) | |||||
| .Num(0) | |||||
| .ScriptError(SCRIPT_ERR_PUBKEYTYPE)); | |||||
| // Test all six CHECK*SIG* opcodes with Schnorr signatures. | // Test all six CHECK*SIG* opcodes with Schnorr signatures. | ||||
| // - Schnorr/ECDSA signatures with varying flags SCHNORR / STRICTENC. | // - STRICTENC flag on/off. | ||||
| // - test with different key / mismatching key | // - test with different key / mismatching key | ||||
| // CHECKSIG and Schnorr | // CHECKSIG and Schnorr | ||||
| tests.push_back( | tests.push_back( | ||||
| TestBuilder(CScript() << ToByteVector(keys.pubkey0) << OP_CHECKSIG, | TestBuilder(CScript() << ToByteVector(keys.pubkey0) << OP_CHECKSIG, | ||||
| "CHECKSIG ECDSA w/ neither STRICTENC,SCHNORR", 0) | "CHECKSIG Schnorr", 0) | ||||
| .PushSigECDSA(keys.key0)); | |||||
| tests.push_back( | |||||
| TestBuilder(CScript() << ToByteVector(keys.pubkey0) << OP_CHECKSIG, | |||||
| "CHECKSIG Schnorr w/ SCHNORR", SCRIPT_ENABLE_SCHNORR) | |||||
| .PushSigSchnorr(keys.key0)); | .PushSigSchnorr(keys.key0)); | ||||
| tests.push_back( | tests.push_back( | ||||
| TestBuilder(CScript() << ToByteVector(keys.pubkey0) << OP_CHECKSIG, | TestBuilder(CScript() << ToByteVector(keys.pubkey0) << OP_CHECKSIG, | ||||
| "CHECKSIG ECDSA w/ SCHNORR", SCRIPT_ENABLE_SCHNORR) | "CHECKSIG Schnorr w/ STRICTENC", SCRIPT_VERIFY_STRICTENC) | ||||
| .PushSigECDSA(keys.key0)); | |||||
| tests.push_back( | |||||
| TestBuilder(CScript() << ToByteVector(keys.pubkey0) << OP_CHECKSIG, | |||||
| "CHECKSIG ECDSA w/ STRICTENC", SCRIPT_VERIFY_STRICTENC) | |||||
| .PushSigECDSA(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)); | .PushSigSchnorr(keys.key0)); | ||||
| tests.push_back( | tests.push_back( | ||||
| TestBuilder(CScript() << ToByteVector(keys.pubkey0) << OP_CHECKSIG, | |||||
| "CHECKSIG ECDSA w/ STRICTENC,SCHNORR", | |||||
| SCRIPT_ENABLE_SCHNORR | SCRIPT_VERIFY_STRICTENC) | |||||
| .PushSigECDSA(keys.key0)); | |||||
| tests.push_back( | |||||
| TestBuilder(CScript() << ToByteVector(keys.pubkey1) << OP_CHECKSIG, | TestBuilder(CScript() << ToByteVector(keys.pubkey1) << OP_CHECKSIG, | ||||
| "CHECKSIG Schnorr other key", | "CHECKSIG Schnorr other key", SCRIPT_VERIFY_STRICTENC) | ||||
| SCRIPT_ENABLE_SCHNORR | SCRIPT_VERIFY_STRICTENC) | |||||
| .PushSigSchnorr(keys.key1)); | .PushSigSchnorr(keys.key1)); | ||||
| tests.push_back(TestBuilder(CScript() << ToByteVector(keys.pubkey0) | tests.push_back(TestBuilder(CScript() << ToByteVector(keys.pubkey0) | ||||
| << OP_CHECKSIG << OP_NOT, | << OP_CHECKSIG << OP_NOT, | ||||
| "CHECKSIG Schnorr mismatched key", | "CHECKSIG Schnorr mismatched key", | ||||
| SCRIPT_ENABLE_SCHNORR | SCRIPT_VERIFY_STRICTENC) | SCRIPT_VERIFY_STRICTENC) | ||||
| .PushSigSchnorr(keys.key1)); | .PushSigSchnorr(keys.key1)); | ||||
| // CHECKSIGVERIFY and Schnorr | // CHECKSIGVERIFY and Schnorr | ||||
| tests.push_back( | |||||
| TestBuilder(CScript() << ToByteVector(keys.pubkey0) << OP_CHECKSIGVERIFY | |||||
| << OP_1, | |||||
| "CHECKSIGVERIFY ECDSA w/ neither STRICTENC,SCHNORR", 0) | |||||
| .PushSigECDSA(keys.key0)); | |||||
| tests.push_back(TestBuilder(CScript() << ToByteVector(keys.pubkey0) | tests.push_back(TestBuilder(CScript() << ToByteVector(keys.pubkey0) | ||||
| << OP_CHECKSIGVERIFY << OP_1, | << OP_CHECKSIGVERIFY << OP_1, | ||||
| "CHECKSIGVERIFY Schnorr w/ SCHNORR", | "CHECKSIGVERIFY Schnorr", 0) | ||||
| SCRIPT_ENABLE_SCHNORR) | |||||
| .PushSigSchnorr(keys.key0)); | .PushSigSchnorr(keys.key0)); | ||||
| tests.push_back(TestBuilder(CScript() << ToByteVector(keys.pubkey0) | tests.push_back(TestBuilder(CScript() << ToByteVector(keys.pubkey0) | ||||
| << OP_CHECKSIGVERIFY << OP_1, | << OP_CHECKSIGVERIFY << OP_1, | ||||
| "CHECKSIGVERIFY ECDSA w/ SCHNORR", | "CHECKSIGVERIFY Schnorr w/ STRICTENC", | ||||
| SCRIPT_ENABLE_SCHNORR) | |||||
| .PushSigECDSA(keys.key0)); | |||||
| tests.push_back(TestBuilder(CScript() << ToByteVector(keys.pubkey0) | |||||
| << OP_CHECKSIGVERIFY << OP_1, | |||||
| "CHECKSIGVERIFY ECDSA w/ STRICTENC", | |||||
| SCRIPT_VERIFY_STRICTENC) | SCRIPT_VERIFY_STRICTENC) | ||||
| .PushSigECDSA(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)); | .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) | |||||
| .PushSigECDSA(keys.key0)); | |||||
| tests.push_back(TestBuilder(CScript() << ToByteVector(keys.pubkey1) | tests.push_back(TestBuilder(CScript() << ToByteVector(keys.pubkey1) | ||||
| << OP_CHECKSIGVERIFY << OP_1, | << OP_CHECKSIGVERIFY << OP_1, | ||||
| "CHECKSIGVERIFY Schnorr other key", | "CHECKSIGVERIFY Schnorr other key", | ||||
| SCRIPT_ENABLE_SCHNORR | SCRIPT_VERIFY_STRICTENC) | SCRIPT_VERIFY_STRICTENC) | ||||
| .PushSigSchnorr(keys.key1)); | .PushSigSchnorr(keys.key1)); | ||||
| tests.push_back(TestBuilder(CScript() << ToByteVector(keys.pubkey0) | tests.push_back(TestBuilder(CScript() << ToByteVector(keys.pubkey0) | ||||
| << OP_CHECKSIGVERIFY << OP_1, | << OP_CHECKSIGVERIFY << OP_1, | ||||
| "CHECKSIGVERIFY Schnorr mismatched key", | "CHECKSIGVERIFY Schnorr mismatched key", | ||||
| SCRIPT_ENABLE_SCHNORR | SCRIPT_VERIFY_STRICTENC) | SCRIPT_VERIFY_STRICTENC) | ||||
| .PushSigSchnorr(keys.key1) | .PushSigSchnorr(keys.key1) | ||||
| .ScriptError(SCRIPT_ERR_CHECKSIGVERIFY)); | .ScriptError(SCRIPT_ERR_CHECKSIGVERIFY)); | ||||
| // CHECKDATASIG and Schnorr | // CHECKDATASIG and Schnorr | ||||
| tests.push_back( | |||||
| TestBuilder(CScript() << OP_0 << ToByteVector(keys.pubkey0) | |||||
| << OP_CHECKDATASIG, | |||||
| "CHECKDATASIG ECDSA w/ neither STRICTENC,SCHNORR", 0) | |||||
| .PushDataSigECDSA(keys.key0, {})); | |||||
| tests.push_back(TestBuilder(CScript() << OP_0 << ToByteVector(keys.pubkey0) | tests.push_back(TestBuilder(CScript() << OP_0 << ToByteVector(keys.pubkey0) | ||||
| << OP_CHECKDATASIG, | << OP_CHECKDATASIG, | ||||
| "CHECKDATASIG Schnorr w/ SCHNORR", | "CHECKDATASIG Schnorr", 0) | ||||
| SCRIPT_ENABLE_SCHNORR) | |||||
| .PushDataSigSchnorr(keys.key0, {})); | .PushDataSigSchnorr(keys.key0, {})); | ||||
| tests.push_back(TestBuilder(CScript() << OP_0 << ToByteVector(keys.pubkey0) | tests.push_back(TestBuilder(CScript() << OP_0 << ToByteVector(keys.pubkey0) | ||||
| << OP_CHECKDATASIG, | << OP_CHECKDATASIG, | ||||
| "CHECKDATASIG ECDSA w/ SCHNORR", | "CHECKDATASIG Schnorr w/ STRICTENC", | ||||
| SCRIPT_ENABLE_SCHNORR) | |||||
| .PushDataSigECDSA(keys.key0, {})); | |||||
| tests.push_back(TestBuilder(CScript() << OP_0 << ToByteVector(keys.pubkey0) | |||||
| << OP_CHECKDATASIG, | |||||
| "CHECKDATASIG ECDSA w/ STRICTENC", | |||||
| SCRIPT_VERIFY_STRICTENC) | SCRIPT_VERIFY_STRICTENC) | ||||
| .PushDataSigECDSA(keys.key0, {})); | |||||
| tests.push_back(TestBuilder(CScript() << OP_0 << ToByteVector(keys.pubkey0) | |||||
| << OP_CHECKDATASIG, | |||||
| "CHECKDATASIG Schnorr w/ STRICTENC,SCHNORR", | |||||
| SCRIPT_ENABLE_SCHNORR | SCRIPT_VERIFY_STRICTENC) | |||||
| .PushDataSigSchnorr(keys.key0, {})); | .PushDataSigSchnorr(keys.key0, {})); | ||||
| tests.push_back(TestBuilder(CScript() << OP_0 << ToByteVector(keys.pubkey0) | |||||
| << OP_CHECKDATASIG, | |||||
| "CHECKDATASIG ECDSA w/ STRICTENC,SCHNORR", | |||||
| SCRIPT_ENABLE_SCHNORR | SCRIPT_VERIFY_STRICTENC) | |||||
| .PushDataSigECDSA(keys.key0, {})); | |||||
| tests.push_back(TestBuilder(CScript() << OP_0 << ToByteVector(keys.pubkey1) | tests.push_back(TestBuilder(CScript() << OP_0 << ToByteVector(keys.pubkey1) | ||||
| << OP_CHECKDATASIG, | << OP_CHECKDATASIG, | ||||
| "CHECKDATASIG Schnorr other key", | "CHECKDATASIG Schnorr other key", | ||||
| SCRIPT_ENABLE_SCHNORR | SCRIPT_VERIFY_STRICTENC) | SCRIPT_VERIFY_STRICTENC) | ||||
| .PushDataSigSchnorr(keys.key1, {})); | .PushDataSigSchnorr(keys.key1, {})); | ||||
| tests.push_back(TestBuilder(CScript() << OP_0 << ToByteVector(keys.pubkey0) | tests.push_back(TestBuilder(CScript() << OP_0 << ToByteVector(keys.pubkey0) | ||||
| << OP_CHECKDATASIG << OP_NOT, | << OP_CHECKDATASIG << OP_NOT, | ||||
| "CHECKDATASIG Schnorr mismatched key", | "CHECKDATASIG Schnorr mismatched key", | ||||
| SCRIPT_ENABLE_SCHNORR | SCRIPT_VERIFY_STRICTENC) | SCRIPT_VERIFY_STRICTENC) | ||||
| .PushDataSigSchnorr(keys.key1, {})); | .PushDataSigSchnorr(keys.key1, {})); | ||||
| tests.push_back(TestBuilder(CScript() << OP_1 << ToByteVector(keys.pubkey1) | tests.push_back(TestBuilder(CScript() << OP_1 << ToByteVector(keys.pubkey1) | ||||
| << OP_CHECKDATASIG, | << OP_CHECKDATASIG, | ||||
| "CHECKDATASIG Schnorr other message", | "CHECKDATASIG Schnorr other message", | ||||
| SCRIPT_ENABLE_SCHNORR | SCRIPT_VERIFY_STRICTENC) | SCRIPT_VERIFY_STRICTENC) | ||||
| .PushDataSigSchnorr(keys.key1, {1})); | .PushDataSigSchnorr(keys.key1, {1})); | ||||
| tests.push_back(TestBuilder(CScript() << OP_0 << ToByteVector(keys.pubkey1) | tests.push_back(TestBuilder(CScript() << OP_0 << ToByteVector(keys.pubkey1) | ||||
| << OP_CHECKDATASIG << OP_NOT, | << OP_CHECKDATASIG << OP_NOT, | ||||
| "CHECKDATASIG Schnorr wrong message", | "CHECKDATASIG Schnorr wrong message", | ||||
| SCRIPT_ENABLE_SCHNORR | SCRIPT_VERIFY_STRICTENC) | SCRIPT_VERIFY_STRICTENC) | ||||
| .PushDataSigSchnorr(keys.key1, {1})); | .PushDataSigSchnorr(keys.key1, {1})); | ||||
| // CHECKDATASIGVERIFY and Schnorr | // CHECKDATASIGVERIFY and Schnorr | ||||
| tests.push_back( | |||||
| TestBuilder(CScript() << OP_0 << ToByteVector(keys.pubkey0) | |||||
| << OP_CHECKDATASIGVERIFY << OP_1, | |||||
| "CHECKDATASIGVERIFY ECDSA w/ neither STRICTENC,SCHNORR", 0) | |||||
| .PushDataSigECDSA(keys.key0, {})); | |||||
| tests.push_back(TestBuilder(CScript() << OP_0 << ToByteVector(keys.pubkey0) | tests.push_back(TestBuilder(CScript() << OP_0 << ToByteVector(keys.pubkey0) | ||||
| << OP_CHECKDATASIGVERIFY << OP_1, | << OP_CHECKDATASIGVERIFY << OP_1, | ||||
| "CHECKDATASIGVERIFY Schnorr w/ SCHNORR", | "CHECKDATASIGVERIFY Schnorr", 0) | ||||
| SCRIPT_ENABLE_SCHNORR) | |||||
| .PushDataSigSchnorr(keys.key0, {})); | .PushDataSigSchnorr(keys.key0, {})); | ||||
| tests.push_back(TestBuilder(CScript() << OP_0 << ToByteVector(keys.pubkey0) | tests.push_back(TestBuilder(CScript() << OP_0 << ToByteVector(keys.pubkey0) | ||||
| << OP_CHECKDATASIGVERIFY << OP_1, | << OP_CHECKDATASIGVERIFY << OP_1, | ||||
| "CHECKDATASIGVERIFY ECDSA w/ SCHNORR", | "CHECKDATASIGVERIFY Schnorr w/ STRICTENC", | ||||
| SCRIPT_ENABLE_SCHNORR) | |||||
| .PushDataSigECDSA(keys.key0, {})); | |||||
| tests.push_back(TestBuilder(CScript() << OP_0 << ToByteVector(keys.pubkey0) | |||||
| << OP_CHECKDATASIGVERIFY << OP_1, | |||||
| "CHECKDATASIGVERIFY ECDSA w/ STRICTENC", | |||||
| SCRIPT_VERIFY_STRICTENC) | SCRIPT_VERIFY_STRICTENC) | ||||
| .PushDataSigECDSA(keys.key0, {})); | |||||
| tests.push_back( | |||||
| TestBuilder(CScript() << OP_0 << ToByteVector(keys.pubkey0) | |||||
| << OP_CHECKDATASIGVERIFY << OP_1, | |||||
| "CHECKDATASIGVERIFY Schnorr w/ STRICTENC,SCHNORR", | |||||
| SCRIPT_ENABLE_SCHNORR | SCRIPT_VERIFY_STRICTENC) | |||||
| .PushDataSigSchnorr(keys.key0, {})); | .PushDataSigSchnorr(keys.key0, {})); | ||||
| tests.push_back(TestBuilder(CScript() << OP_0 << ToByteVector(keys.pubkey0) | |||||
| << OP_CHECKDATASIGVERIFY << OP_1, | |||||
| "CHECKDATASIGVERIFY ECDSA w/ STRICTENC,SCHNORR", | |||||
| SCRIPT_ENABLE_SCHNORR | SCRIPT_VERIFY_STRICTENC) | |||||
| .PushDataSigECDSA(keys.key0, {})); | |||||
| tests.push_back(TestBuilder(CScript() << OP_0 << ToByteVector(keys.pubkey1) | tests.push_back(TestBuilder(CScript() << OP_0 << ToByteVector(keys.pubkey1) | ||||
| << OP_CHECKDATASIGVERIFY << OP_1, | << OP_CHECKDATASIGVERIFY << OP_1, | ||||
| "CHECKDATASIGVERIFY Schnorr other key", | "CHECKDATASIGVERIFY Schnorr other key", | ||||
| SCRIPT_ENABLE_SCHNORR | SCRIPT_VERIFY_STRICTENC) | SCRIPT_VERIFY_STRICTENC) | ||||
| .PushDataSigSchnorr(keys.key1, {})); | .PushDataSigSchnorr(keys.key1, {})); | ||||
| tests.push_back(TestBuilder(CScript() << OP_0 << ToByteVector(keys.pubkey0) | tests.push_back(TestBuilder(CScript() << OP_0 << ToByteVector(keys.pubkey0) | ||||
| << OP_CHECKDATASIGVERIFY << OP_1, | << OP_CHECKDATASIGVERIFY << OP_1, | ||||
| "CHECKDATASIGVERIFY Schnorr mismatched key", | "CHECKDATASIGVERIFY Schnorr mismatched key", | ||||
| SCRIPT_ENABLE_SCHNORR | SCRIPT_VERIFY_STRICTENC) | SCRIPT_VERIFY_STRICTENC) | ||||
| .PushDataSigSchnorr(keys.key1, {}) | .PushDataSigSchnorr(keys.key1, {}) | ||||
| .ScriptError(SCRIPT_ERR_CHECKDATASIGVERIFY)); | .ScriptError(SCRIPT_ERR_CHECKDATASIGVERIFY)); | ||||
| tests.push_back(TestBuilder(CScript() << OP_1 << ToByteVector(keys.pubkey1) | tests.push_back(TestBuilder(CScript() << OP_1 << ToByteVector(keys.pubkey1) | ||||
| << OP_CHECKDATASIGVERIFY << OP_1, | << OP_CHECKDATASIGVERIFY << OP_1, | ||||
| "CHECKDATASIGVERIFY Schnorr other message", | "CHECKDATASIGVERIFY Schnorr other message", | ||||
| SCRIPT_ENABLE_SCHNORR | SCRIPT_VERIFY_STRICTENC) | SCRIPT_VERIFY_STRICTENC) | ||||
| .PushDataSigSchnorr(keys.key1, {1})); | .PushDataSigSchnorr(keys.key1, {1})); | ||||
| tests.push_back(TestBuilder(CScript() << OP_0 << ToByteVector(keys.pubkey1) | tests.push_back(TestBuilder(CScript() << OP_0 << ToByteVector(keys.pubkey1) | ||||
| << OP_CHECKDATASIGVERIFY << OP_1, | << OP_CHECKDATASIGVERIFY << OP_1, | ||||
| "CHECKDATASIGVERIFY Schnorr wrong message", | "CHECKDATASIGVERIFY Schnorr wrong message", | ||||
| SCRIPT_ENABLE_SCHNORR | SCRIPT_VERIFY_STRICTENC) | SCRIPT_VERIFY_STRICTENC) | ||||
| .PushDataSigSchnorr(keys.key1, {1}) | .PushDataSigSchnorr(keys.key1, {1}) | ||||
| .ScriptError(SCRIPT_ERR_CHECKDATASIGVERIFY)); | .ScriptError(SCRIPT_ERR_CHECKDATASIGVERIFY)); | ||||
| // CHECKMULTISIG 1-of-1 and Schnorr | // CHECKMULTISIG 1-of-1 and Schnorr | ||||
| tests.push_back( | |||||
| TestBuilder(CScript() << OP_1 << ToByteVector(keys.pubkey0) << OP_1 | |||||
| << OP_CHECKMULTISIG, | |||||
| "CHECKMULTISIG ECDSA w/ neither STRICTENC,SCHNORR", 0) | |||||
| .Num(0) | |||||
| .PushSigECDSA(keys.key0)); | |||||
| tests.push_back(TestBuilder(CScript() << OP_1 << ToByteVector(keys.pubkey0) | tests.push_back(TestBuilder(CScript() << OP_1 << ToByteVector(keys.pubkey0) | ||||
| << OP_1 << OP_CHECKMULTISIG, | << OP_1 << OP_CHECKMULTISIG, | ||||
| "CHECKMULTISIG Schnorr w/ SCHNORR", | "CHECKMULTISIG Schnorr w/ no STRICTENC", 0) | ||||
| SCRIPT_ENABLE_SCHNORR) | |||||
| .Num(0) | .Num(0) | ||||
| .PushSigSchnorr(keys.key0) | .PushSigSchnorr(keys.key0) | ||||
| .ScriptError(SCRIPT_ERR_SIG_BADLENGTH)); | .ScriptError(SCRIPT_ERR_SIG_BADLENGTH)); | ||||
| tests.push_back(TestBuilder(CScript() << OP_1 << ToByteVector(keys.pubkey0) | tests.push_back(TestBuilder(CScript() << OP_1 << ToByteVector(keys.pubkey0) | ||||
| << OP_1 << OP_CHECKMULTISIG, | << OP_1 << OP_CHECKMULTISIG, | ||||
| "CHECKMULTISIG ECDSA w/ SCHNORR", | "CHECKMULTISIG Schnorr w/ STRICTENC", | ||||
| SCRIPT_ENABLE_SCHNORR) | |||||
| .Num(0) | |||||
| .PushSigECDSA(keys.key0)); | |||||
| tests.push_back(TestBuilder(CScript() << OP_1 << ToByteVector(keys.pubkey0) | |||||
| << OP_1 << OP_CHECKMULTISIG, | |||||
| "CHECKMULTISIG ECDSA w/ STRICTENC", | |||||
| SCRIPT_VERIFY_STRICTENC) | SCRIPT_VERIFY_STRICTENC) | ||||
| .Num(0) | .Num(0) | ||||
| .PushSigECDSA(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) | .PushSigSchnorr(keys.key0) | ||||
| .ScriptError(SCRIPT_ERR_SIG_BADLENGTH)); | .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) | |||||
| .PushSigECDSA(keys.key0)); | |||||
| // Test multisig with multiple Schnorr signatures | // Test multisig with multiple Schnorr signatures | ||||
| tests.push_back(TestBuilder(CScript() << OP_3 << ToByteVector(keys.pubkey0C) | tests.push_back(TestBuilder(CScript() << OP_3 << ToByteVector(keys.pubkey0C) | ||||
| << ToByteVector(keys.pubkey1C) | << ToByteVector(keys.pubkey1C) | ||||
| << ToByteVector(keys.pubkey2C) << OP_3 | << ToByteVector(keys.pubkey2C) << OP_3 | ||||
| << OP_CHECKMULTISIG, | << OP_CHECKMULTISIG, | ||||
| "Schnorr 3-of-3 with SCHNORR flag", | "Schnorr 3-of-3", 0) | ||||
| SCRIPT_ENABLE_SCHNORR) | |||||
| .Num(0) | .Num(0) | ||||
| .PushSigSchnorr(keys.key0) | .PushSigSchnorr(keys.key0) | ||||
| .PushSigSchnorr(keys.key1) | .PushSigSchnorr(keys.key1) | ||||
| .PushSigSchnorr(keys.key2) | .PushSigSchnorr(keys.key2) | ||||
| .ScriptError(SCRIPT_ERR_SIG_BADLENGTH)); | .ScriptError(SCRIPT_ERR_SIG_BADLENGTH)); | ||||
| tests.push_back(TestBuilder(CScript() << OP_3 << ToByteVector(keys.pubkey0C) | tests.push_back(TestBuilder(CScript() << OP_3 << ToByteVector(keys.pubkey0C) | ||||
| << ToByteVector(keys.pubkey1C) | << ToByteVector(keys.pubkey1C) | ||||
| << ToByteVector(keys.pubkey2C) << OP_3 | << ToByteVector(keys.pubkey2C) << OP_3 | ||||
| << OP_CHECKMULTISIG, | << OP_CHECKMULTISIG, | ||||
| "Schnorr-ECDSA-mixed 3-of-3 with SCHNORR flag", | "Schnorr-ECDSA-mixed 3-of-3", 0) | ||||
| SCRIPT_ENABLE_SCHNORR) | |||||
| .Num(0) | .Num(0) | ||||
| .PushSigECDSA(keys.key0) | .PushSigECDSA(keys.key0) | ||||
| .PushSigECDSA(keys.key1) | .PushSigECDSA(keys.key1) | ||||
| .PushSigSchnorr(keys.key2) | .PushSigSchnorr(keys.key2) | ||||
| .ScriptError(SCRIPT_ERR_SIG_BADLENGTH)); | .ScriptError(SCRIPT_ERR_SIG_BADLENGTH)); | ||||
| // CHECKMULTISIGVERIFY 1-of-1 and Schnorr | // CHECKMULTISIGVERIFY 1-of-1 and Schnorr | ||||
| tests.push_back( | tests.push_back( | ||||
| TestBuilder(CScript() << OP_1 << ToByteVector(keys.pubkey0) << OP_1 | TestBuilder(CScript() << OP_1 << ToByteVector(keys.pubkey0) << OP_1 | ||||
| << OP_CHECKMULTISIGVERIFY << OP_1, | << OP_CHECKMULTISIGVERIFY << OP_1, | ||||
| "CHECKMULTISIGVERIFY ECDSA w/ neither STRICTENC,SCHNORR", 0) | "CHECKMULTISIGVERIFY Schnorr w/ no STRICTENC", 0) | ||||
| .Num(0) | |||||
| .PushSigECDSA(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) | .Num(0) | ||||
| .PushSigSchnorr(keys.key0) | .PushSigSchnorr(keys.key0) | ||||
| .ScriptError(SCRIPT_ERR_SIG_BADLENGTH)); | .ScriptError(SCRIPT_ERR_SIG_BADLENGTH)); | ||||
| tests.push_back(TestBuilder(CScript() | tests.push_back(TestBuilder(CScript() | ||||
| << OP_1 << ToByteVector(keys.pubkey0) | << OP_1 << ToByteVector(keys.pubkey0) | ||||
| << OP_1 << OP_CHECKMULTISIGVERIFY << OP_1, | << OP_1 << OP_CHECKMULTISIGVERIFY << OP_1, | ||||
| "CHECKMULTISIGVERIFY ECDSA w/ SCHNORR", | "CHECKMULTISIGVERIFY Schnorr w/ STRICTENC", | ||||
| SCRIPT_ENABLE_SCHNORR) | |||||
| .Num(0) | |||||
| .PushSigECDSA(keys.key0)); | |||||
| tests.push_back(TestBuilder(CScript() | |||||
| << OP_1 << ToByteVector(keys.pubkey0) | |||||
| << OP_1 << OP_CHECKMULTISIGVERIFY << OP_1, | |||||
| "CHECKMULTISIGVERIFY ECDSA w/ STRICTENC", | |||||
| SCRIPT_VERIFY_STRICTENC) | SCRIPT_VERIFY_STRICTENC) | ||||
| .Num(0) | .Num(0) | ||||
| .PushSigECDSA(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) | .PushSigSchnorr(keys.key0) | ||||
| .ScriptError(SCRIPT_ERR_SIG_BADLENGTH)); | .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) | |||||
| .PushSigECDSA(keys.key0)); | |||||
| // Test damaged Schnorr signatures | // Test damaged Schnorr signatures | ||||
| tests.push_back(TestBuilder(CScript() << ToByteVector(keys.pubkey0) | tests.push_back(TestBuilder(CScript() << ToByteVector(keys.pubkey0) | ||||
| << OP_CHECKSIG << OP_NOT, | << OP_CHECKSIG << OP_NOT, | ||||
| "Schnorr P2PK, bad sig", SCRIPT_ENABLE_SCHNORR) | "Schnorr P2PK, bad sig", 0) | ||||
| .PushSigSchnorr(keys.key0) | .PushSigSchnorr(keys.key0) | ||||
| .DamagePush(10)); | .DamagePush(10)); | ||||
| tests.push_back(TestBuilder(CScript() << ToByteVector(keys.pubkey0) | tests.push_back(TestBuilder(CScript() << ToByteVector(keys.pubkey0) | ||||
| << OP_CHECKSIG << OP_NOT, | << OP_CHECKSIG << OP_NOT, | ||||
| "Schnorr P2PK, bad sig STRICTENC", | "Schnorr P2PK, bad sig STRICTENC", | ||||
| SCRIPT_ENABLE_SCHNORR | SCRIPT_VERIFY_STRICTENC) | SCRIPT_VERIFY_STRICTENC) | ||||
| .PushSigSchnorr(keys.key0) | .PushSigSchnorr(keys.key0) | ||||
| .DamagePush(10)); | .DamagePush(10)); | ||||
| tests.push_back(TestBuilder(CScript() << ToByteVector(keys.pubkey0) | tests.push_back(TestBuilder(CScript() << ToByteVector(keys.pubkey0) | ||||
| << OP_CHECKSIG << OP_NOT, | << OP_CHECKSIG << OP_NOT, | ||||
| "Schnorr P2PK, bad sig NULLFAIL", | "Schnorr P2PK, bad sig NULLFAIL", | ||||
| SCRIPT_ENABLE_SCHNORR | SCRIPT_VERIFY_NULLFAIL) | SCRIPT_VERIFY_NULLFAIL) | ||||
| .PushSigSchnorr(keys.key0) | .PushSigSchnorr(keys.key0) | ||||
| .DamagePush(10) | .DamagePush(10) | ||||
| .ScriptError(SCRIPT_ERR_SIG_NULLFAIL)); | .ScriptError(SCRIPT_ERR_SIG_NULLFAIL)); | ||||
| // Make sure P2PKH works with Schnorr | // Make sure P2PKH works with Schnorr | ||||
| tests.push_back(TestBuilder(CScript() << OP_DUP << OP_HASH160 | tests.push_back(TestBuilder(CScript() << OP_DUP << OP_HASH160 | ||||
| << ToByteVector(keys.pubkey1C.GetID()) | << ToByteVector(keys.pubkey1C.GetID()) | ||||
| << OP_EQUALVERIFY << OP_CHECKSIG, | << OP_EQUALVERIFY << OP_CHECKSIG, | ||||
| "Schnorr P2PKH", SCRIPT_ENABLE_SCHNORR) | "Schnorr P2PKH", 0) | ||||
| .PushSigSchnorr(keys.key1) | .PushSigSchnorr(keys.key1) | ||||
| .Push(keys.pubkey1C)); | .Push(keys.pubkey1C)); | ||||
| // Test of different pubkey encodings with Schnorr | // Test of different pubkey encodings with Schnorr | ||||
| tests.push_back( | tests.push_back( | ||||
| TestBuilder(CScript() << ToByteVector(keys.pubkey0C) << OP_CHECKSIG, | TestBuilder(CScript() << ToByteVector(keys.pubkey0C) << OP_CHECKSIG, | ||||
| "Schnorr P2PK with compressed pubkey", | "Schnorr P2PK with compressed pubkey", | ||||
| SCRIPT_VERIFY_STRICTENC | SCRIPT_ENABLE_SCHNORR) | SCRIPT_VERIFY_STRICTENC) | ||||
| .PushSigSchnorr(keys.key0, SigHashType())); | .PushSigSchnorr(keys.key0, SigHashType())); | ||||
| tests.push_back( | tests.push_back( | ||||
| TestBuilder(CScript() << ToByteVector(keys.pubkey0) << OP_CHECKSIG, | TestBuilder(CScript() << ToByteVector(keys.pubkey0) << OP_CHECKSIG, | ||||
| "Schnorr P2PK with uncompressed pubkey", | "Schnorr P2PK with uncompressed pubkey", | ||||
| SCRIPT_VERIFY_STRICTENC | SCRIPT_ENABLE_SCHNORR) | SCRIPT_VERIFY_STRICTENC) | ||||
| .PushSigSchnorr(keys.key0, SigHashType())); | .PushSigSchnorr(keys.key0, SigHashType())); | ||||
| tests.push_back( | tests.push_back( | ||||
| TestBuilder(CScript() << ToByteVector(keys.pubkey0) << OP_CHECKSIG, | TestBuilder(CScript() << ToByteVector(keys.pubkey0) << OP_CHECKSIG, | ||||
| "Schnorr P2PK with uncompressed pubkey but " | "Schnorr P2PK with uncompressed pubkey but " | ||||
| "COMPRESSED_PUBKEYTYPE set", | "COMPRESSED_PUBKEYTYPE set", | ||||
| SCRIPT_VERIFY_STRICTENC | SCRIPT_ENABLE_SCHNORR | | SCRIPT_VERIFY_STRICTENC | | ||||
| SCRIPT_VERIFY_COMPRESSED_PUBKEYTYPE) | SCRIPT_VERIFY_COMPRESSED_PUBKEYTYPE) | ||||
| .PushSigSchnorr(keys.key0, SigHashType()) | .PushSigSchnorr(keys.key0, SigHashType()) | ||||
| .ScriptError(SCRIPT_ERR_NONCOMPRESSED_PUBKEY)); | .ScriptError(SCRIPT_ERR_NONCOMPRESSED_PUBKEY)); | ||||
| tests.push_back( | tests.push_back( | ||||
| TestBuilder(CScript() << ToByteVector(keys.pubkey0H) << OP_CHECKSIG, | TestBuilder(CScript() << ToByteVector(keys.pubkey0H) << OP_CHECKSIG, | ||||
| "Schnorr P2PK with hybrid pubkey", | "Schnorr P2PK with hybrid pubkey", SCRIPT_VERIFY_STRICTENC) | ||||
| SCRIPT_VERIFY_STRICTENC | SCRIPT_ENABLE_SCHNORR) | |||||
| .PushSigSchnorr(keys.key0, SigHashType()) | .PushSigSchnorr(keys.key0, SigHashType()) | ||||
| .ScriptError(SCRIPT_ERR_PUBKEYTYPE)); | .ScriptError(SCRIPT_ERR_PUBKEYTYPE)); | ||||
| tests.push_back( | tests.push_back( | ||||
| TestBuilder(CScript() << ToByteVector(keys.pubkey0H) << OP_CHECKSIG, | TestBuilder(CScript() << ToByteVector(keys.pubkey0H) << OP_CHECKSIG, | ||||
| "Schnorr P2PK with hybrid pubkey but no STRICTENC", | "Schnorr P2PK with hybrid pubkey but no STRICTENC", 0) | ||||
| SCRIPT_ENABLE_SCHNORR) | |||||
| .PushSigSchnorr(keys.key0)); | .PushSigSchnorr(keys.key0)); | ||||
| tests.push_back( | tests.push_back( | ||||
| TestBuilder( | TestBuilder( | ||||
| CScript() << ToByteVector(keys.pubkey0H) << OP_CHECKSIG << OP_NOT, | CScript() << ToByteVector(keys.pubkey0H) << OP_CHECKSIG << OP_NOT, | ||||
| "Schnorr P2PK NOT with damaged hybrid pubkey but no STRICTENC", | "Schnorr P2PK NOT with damaged hybrid pubkey but no STRICTENC", 0) | ||||
| SCRIPT_ENABLE_SCHNORR) | |||||
| .PushSigSchnorr(keys.key0) | .PushSigSchnorr(keys.key0) | ||||
| .DamagePush(10)); | .DamagePush(10)); | ||||
| // Ensure sighash types still get checked with schnorr | // Ensure sighash types get checked with schnorr | ||||
| tests.push_back( | tests.push_back( | ||||
| TestBuilder(CScript() << ToByteVector(keys.pubkey1) << OP_CHECKSIG, | TestBuilder(CScript() << ToByteVector(keys.pubkey1) << OP_CHECKSIG, | ||||
| "Schnorr P2PK with undefined basehashtype and STRICTENC", | "Schnorr P2PK with undefined basehashtype and STRICTENC", | ||||
| SCRIPT_VERIFY_STRICTENC | SCRIPT_ENABLE_SCHNORR) | SCRIPT_VERIFY_STRICTENC) | ||||
| .PushSigSchnorr(keys.key1, SigHashType(5)) | .PushSigSchnorr(keys.key1, SigHashType(5)) | ||||
| .ScriptError(SCRIPT_ERR_SIG_HASHTYPE)); | .ScriptError(SCRIPT_ERR_SIG_HASHTYPE)); | ||||
| tests.push_back( | tests.push_back( | ||||
| TestBuilder(CScript() << OP_DUP << OP_HASH160 | TestBuilder(CScript() << OP_DUP << OP_HASH160 | ||||
| << ToByteVector(keys.pubkey0.GetID()) | << ToByteVector(keys.pubkey0.GetID()) | ||||
| << OP_EQUALVERIFY << OP_CHECKSIG, | << OP_EQUALVERIFY << OP_CHECKSIG, | ||||
| "Schnorr P2PKH with invalid sighashtype but no STRICTENC", | "Schnorr P2PKH with invalid sighashtype but no STRICTENC", | ||||
| SCRIPT_ENABLE_SCHNORR) | 0) | ||||
| .PushSigSchnorr(keys.key0, SigHashType(0x21), Amount::zero(), 0) | .PushSigSchnorr(keys.key0, SigHashType(0x21), Amount::zero(), 0) | ||||
| .Push(keys.pubkey0)); | .Push(keys.pubkey0)); | ||||
| tests.push_back( | tests.push_back( | ||||
| TestBuilder(CScript() << OP_DUP << OP_HASH160 | TestBuilder(CScript() << OP_DUP << OP_HASH160 | ||||
| << ToByteVector(keys.pubkey0.GetID()) | << ToByteVector(keys.pubkey0.GetID()) | ||||
| << OP_EQUALVERIFY << OP_CHECKSIG, | << OP_EQUALVERIFY << OP_CHECKSIG, | ||||
| "Schnorr P2PKH with invalid sighashtype and STRICTENC", | "Schnorr P2PKH with invalid sighashtype and STRICTENC", | ||||
| SCRIPT_VERIFY_STRICTENC | SCRIPT_ENABLE_SCHNORR) | SCRIPT_VERIFY_STRICTENC) | ||||
| .PushSigSchnorr(keys.key0, SigHashType(0x21), Amount::zero(), | .PushSigSchnorr(keys.key0, SigHashType(0x21), Amount::zero(), | ||||
| SCRIPT_VERIFY_STRICTENC | SCRIPT_ENABLE_SCHNORR) | SCRIPT_VERIFY_STRICTENC) | ||||
| .Push(keys.pubkey0) | .Push(keys.pubkey0) | ||||
| .ScriptError(SCRIPT_ERR_SIG_HASHTYPE)); | .ScriptError(SCRIPT_ERR_SIG_HASHTYPE)); | ||||
| tests.push_back( | tests.push_back( | ||||
| TestBuilder(CScript() << ToByteVector(keys.pubkey1) << OP_CHECKSIG, | TestBuilder(CScript() << ToByteVector(keys.pubkey1) << OP_CHECKSIG, | ||||
| "Schnorr P2PK anyonecanpay", SCRIPT_ENABLE_SCHNORR) | "Schnorr P2PK anyonecanpay", 0) | ||||
| .PushSigSchnorr(keys.key1, SigHashType().withAnyoneCanPay())); | .PushSigSchnorr(keys.key1, SigHashType().withAnyoneCanPay())); | ||||
| tests.push_back( | tests.push_back( | ||||
| TestBuilder(CScript() << ToByteVector(keys.pubkey1) << OP_CHECKSIG, | TestBuilder(CScript() << ToByteVector(keys.pubkey1) << OP_CHECKSIG, | ||||
| "Schnorr P2PK anyonecanpay marked with normal hashtype", | "Schnorr P2PK anyonecanpay marked with normal hashtype", 0) | ||||
| SCRIPT_ENABLE_SCHNORR) | |||||
| .PushSigSchnorr(keys.key1, SigHashType().withAnyoneCanPay()) | .PushSigSchnorr(keys.key1, SigHashType().withAnyoneCanPay()) | ||||
| .EditPush(64, "81", "01") | .EditPush(64, "81", "01") | ||||
| .ScriptError(SCRIPT_ERR_EVAL_FALSE)); | .ScriptError(SCRIPT_ERR_EVAL_FALSE)); | ||||
| tests.push_back( | tests.push_back( | ||||
| TestBuilder(CScript() << ToByteVector(keys.pubkey1) << OP_CHECKSIG, | TestBuilder(CScript() << ToByteVector(keys.pubkey1) << OP_CHECKSIG, | ||||
| "Schnorr P2PK with forkID", | "Schnorr P2PK with forkID", | ||||
| SCRIPT_ENABLE_SCHNORR | SCRIPT_VERIFY_STRICTENC | | SCRIPT_VERIFY_STRICTENC | SCRIPT_ENABLE_SIGHASH_FORKID) | ||||
| SCRIPT_ENABLE_SIGHASH_FORKID) | |||||
| .PushSigSchnorr(keys.key1, SigHashType().withForkId())); | .PushSigSchnorr(keys.key1, SigHashType().withForkId())); | ||||
| tests.push_back( | tests.push_back( | ||||
| TestBuilder(CScript() << ToByteVector(keys.pubkey1) << OP_CHECKSIG, | TestBuilder(CScript() << ToByteVector(keys.pubkey1) << OP_CHECKSIG, | ||||
| "Schnorr P2PK with non-forkID sig", | "Schnorr P2PK with non-forkID sig", | ||||
| SCRIPT_ENABLE_SCHNORR | SCRIPT_VERIFY_STRICTENC | | SCRIPT_VERIFY_STRICTENC | SCRIPT_ENABLE_SIGHASH_FORKID) | ||||
| SCRIPT_ENABLE_SIGHASH_FORKID) | |||||
| .PushSigSchnorr(keys.key1) | .PushSigSchnorr(keys.key1) | ||||
| .ScriptError(SCRIPT_ERR_MUST_USE_FORKID)); | .ScriptError(SCRIPT_ERR_MUST_USE_FORKID)); | ||||
| tests.push_back( | tests.push_back( | ||||
| TestBuilder(CScript() << ToByteVector(keys.pubkey1) << OP_CHECKSIG, | TestBuilder(CScript() << ToByteVector(keys.pubkey1) << OP_CHECKSIG, | ||||
| "Schnorr P2PK with cheater forkID bit", | "Schnorr P2PK with cheater forkID bit", | ||||
| SCRIPT_ENABLE_SCHNORR | SCRIPT_VERIFY_STRICTENC | | SCRIPT_VERIFY_STRICTENC | SCRIPT_ENABLE_SIGHASH_FORKID) | ||||
| SCRIPT_ENABLE_SIGHASH_FORKID) | |||||
| .PushSigSchnorr(keys.key1) | .PushSigSchnorr(keys.key1) | ||||
| .EditPush(64, "01", "41") | .EditPush(64, "01", "41") | ||||
| .ScriptError(SCRIPT_ERR_EVAL_FALSE)); | .ScriptError(SCRIPT_ERR_EVAL_FALSE)); | ||||
| { | { | ||||
| // There is a point with x = 7 + order but not x = 7. | // There is a point with x = 7 + order but not x = 7. | ||||
| // Since r = x mod order, this can have valid signatures, as | // Since r = x mod order, this can have valid signatures, as | ||||
| // demonstrated here. | // demonstrated here. | ||||
| Show All 12 Lines | tests.push_back( | ||||
| "776879206d757374207765207375666665722077697468206563647361"); | "776879206d757374207765207375666665722077697468206563647361"); | ||||
| std::vector<uint8_t> sdata(58 - rdata.size() - 1, 33); | std::vector<uint8_t> sdata(58 - rdata.size() - 1, 33); | ||||
| tests.push_back( | tests.push_back( | ||||
| TestBuilder(CScript() << OP_CHECKSIG, | TestBuilder(CScript() << OP_CHECKSIG, | ||||
| "recovered-pubkey CHECKSIG with 63-byte DER", | "recovered-pubkey CHECKSIG with 63-byte DER", | ||||
| SCRIPT_VERIFY_STRICTENC) | SCRIPT_VERIFY_STRICTENC) | ||||
| .PushECDSASigFromParts(rdata, sdata) | .PushECDSASigFromParts(rdata, sdata) | ||||
| .PushECDSARecoveredPubKey(rdata, sdata)); | .PushECDSARecoveredPubKey(rdata, sdata)); | ||||
| tests.push_back( | |||||
| TestBuilder( | |||||
| CScript() << OP_CHECKSIG, | |||||
| "recovered-pubkey CHECKSIG with 63-byte DER; schnorrflag", | |||||
| SCRIPT_VERIFY_STRICTENC | SCRIPT_ENABLE_SCHNORR) | |||||
| .PushECDSASigFromParts(rdata, sdata) | |||||
| .PushECDSARecoveredPubKey(rdata, sdata)); | |||||
| } | } | ||||
| { | { | ||||
| // 64-byte ECDSA sig does not work. | // 64-byte ECDSA sig does not work. | ||||
| std::vector<uint8_t> rdata = ParseHex( | std::vector<uint8_t> rdata = ParseHex( | ||||
| "776879206d757374207765207375666665722077697468206563647361"); | "776879206d757374207765207375666665722077697468206563647361"); | ||||
| std::vector<uint8_t> sdata(58 - rdata.size(), 33); | std::vector<uint8_t> sdata(58 - rdata.size(), 33); | ||||
| tests.push_back( | tests.push_back( | ||||
| TestBuilder( | TestBuilder(CScript() << OP_CHECKSIG, | ||||
| CScript() << OP_CHECKSIG, | "recovered-pubkey CHECKSIG with 64-byte DER", | ||||
| "recovered-pubkey CHECKSIG with 64-byte DER; schnorrflag", | SCRIPT_VERIFY_STRICTENC) | ||||
| SCRIPT_VERIFY_STRICTENC | SCRIPT_ENABLE_SCHNORR) | |||||
| .PushECDSASigFromParts(rdata, sdata) | .PushECDSASigFromParts(rdata, sdata) | ||||
| .PushECDSARecoveredPubKey(rdata, sdata) | .PushECDSARecoveredPubKey(rdata, sdata) | ||||
| .ScriptError(SCRIPT_ERR_EVAL_FALSE)); | .ScriptError(SCRIPT_ERR_EVAL_FALSE)); | ||||
| } | } | ||||
| { | { | ||||
| std::vector<uint8_t> rdata = ParseHex( | std::vector<uint8_t> rdata = ParseHex( | ||||
| "776879206d757374207765207375666665722077697468206563647361"); | "776879206d757374207765207375666665722077697468206563647361"); | ||||
| std::vector<uint8_t> sdata(58 - rdata.size() + 1, 33); | std::vector<uint8_t> sdata(58 - rdata.size() + 1, 33); | ||||
| tests.push_back( | tests.push_back( | ||||
| TestBuilder(CScript() << OP_CHECKSIG, | TestBuilder(CScript() << OP_CHECKSIG, | ||||
| "recovered-pubkey CHECKSIG with 65-byte DER", | "recovered-pubkey CHECKSIG with 65-byte DER", | ||||
| SCRIPT_VERIFY_STRICTENC) | SCRIPT_VERIFY_STRICTENC) | ||||
| .PushECDSASigFromParts(rdata, sdata) | .PushECDSASigFromParts(rdata, sdata) | ||||
| .PushECDSARecoveredPubKey(rdata, sdata)); | .PushECDSARecoveredPubKey(rdata, sdata)); | ||||
| tests.push_back( | |||||
| TestBuilder( | |||||
| CScript() << OP_CHECKSIG, | |||||
| "recovered-pubkey CHECKSIG with 65-byte DER; schnorrflag", | |||||
| SCRIPT_VERIFY_STRICTENC | SCRIPT_ENABLE_SCHNORR) | |||||
| .PushECDSASigFromParts(rdata, sdata) | |||||
| .PushECDSARecoveredPubKey(rdata, sdata)); | |||||
| } | } | ||||
| { | { | ||||
| // Try 64-byte ECDSA sig again, in multisig. | // Try 64-byte ECDSA sig again, in multisig. | ||||
| std::vector<uint8_t> rdata = ParseHex( | std::vector<uint8_t> rdata = ParseHex( | ||||
| "776879206d757374207765207375666665722077697468206563647361"); | "776879206d757374207765207375666665722077697468206563647361"); | ||||
| std::vector<uint8_t> sdata(58 - rdata.size(), 33); | std::vector<uint8_t> sdata(58 - rdata.size(), 33); | ||||
| tests.push_back( | tests.push_back( | ||||
| TestBuilder( | TestBuilder(CScript() | ||||
| CScript() << OP_1 << OP_SWAP << OP_1 << OP_CHECKMULTISIG, | << OP_1 << OP_SWAP << OP_1 << OP_CHECKMULTISIG, | ||||
| "recovered-pubkey CHECKMULTISIG with 64-byte DER; schnorrflag", | "recovered-pubkey CHECKMULTISIG with 64-byte DER", | ||||
| SCRIPT_VERIFY_STRICTENC | SCRIPT_ENABLE_SCHNORR) | SCRIPT_VERIFY_STRICTENC) | ||||
| .Num(0) | .Num(0) | ||||
| .PushECDSASigFromParts(rdata, sdata) | .PushECDSASigFromParts(rdata, sdata) | ||||
| .PushECDSARecoveredPubKey(rdata, sdata) | .PushECDSARecoveredPubKey(rdata, sdata) | ||||
| .ScriptError(SCRIPT_ERR_SIG_BADLENGTH)); | .ScriptError(SCRIPT_ERR_SIG_BADLENGTH)); | ||||
| } | } | ||||
| std::set<std::string> tests_set; | std::set<std::string> tests_set; | ||||
| ▲ Show 20 Lines • Show All 809 Lines • Show Last 20 Lines | |||||