Changeset View
Changeset View
Standalone View
Standalone View
src/test/script_tests.cpp
Show First 20 Lines • Show All 277 Lines • ▼ Show 20 Lines | std::vector<uint8_t> DoSign(const CKey &key, const uint256 &hash, | ||||
s = std::vector<uint8_t>(vchSig.begin() + 6 + vchSig[3], | s = std::vector<uint8_t>(vchSig.begin() + 6 + vchSig[3], | ||||
vchSig.begin() + 6 + vchSig[3] + | vchSig.begin() + 6 + vchSig[3] + | ||||
vchSig[5 + vchSig[3]]); | vchSig[5 + vchSig[3]]); | ||||
} while (lenR != r.size() || lenS != s.size()); | } while (lenR != r.size() || lenS != s.size()); | ||||
return vchSig; | return vchSig; | ||||
} | } | ||||
std::vector<uint8_t> DoSignSchnorr(const CKey &key, | |||||
const uint256 &hash) const { | |||||
std::vector<uint8_t> vchSig; | |||||
// no need to iterate for size; schnorrs are always same size. | |||||
key.SignSchnorr(hash, vchSig); | |||||
return vchSig; | |||||
} | |||||
public: | public: | ||||
TestBuilder(const CScript &script_, const std::string &comment_, | TestBuilder(const CScript &script_, const std::string &comment_, | ||||
uint32_t flags_, bool P2SH = false, | uint32_t flags_, bool P2SH = false, | ||||
Amount nValue_ = Amount::zero()) | Amount nValue_ = Amount::zero()) | ||||
: script(script_), havePush(false), comment(comment_), flags(flags_), | : script(script_), havePush(false), comment(comment_), flags(flags_), | ||||
scriptError(SCRIPT_ERR_OK), nValue(nValue_) { | scriptError(SCRIPT_ERR_OK), nValue(nValue_) { | ||||
CScript scriptPubKey = script; | CScript scriptPubKey = script; | ||||
if (P2SH) { | if (P2SH) { | ||||
▲ Show 20 Lines • Show All 47 Lines • ▼ Show 20 Lines | TestBuilder &PushSig(const CKey &key, | ||||
uint256 hash = SignatureHash(script, CTransaction(spendTx), 0, | uint256 hash = SignatureHash(script, CTransaction(spendTx), 0, | ||||
sigHashType, amount, nullptr, sigFlags); | sigHashType, amount, nullptr, sigFlags); | ||||
std::vector<uint8_t> vchSig = DoSign(key, hash, lenR, lenS); | std::vector<uint8_t> vchSig = DoSign(key, hash, lenR, lenS); | ||||
vchSig.push_back(static_cast<uint8_t>(sigHashType.getRawSigHashType())); | vchSig.push_back(static_cast<uint8_t>(sigHashType.getRawSigHashType())); | ||||
DoPush(vchSig); | DoPush(vchSig); | ||||
return *this; | 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<uint8_t> vchSig = DoSignSchnorr(key, hash); | |||||
vchSig.push_back(static_cast<uint8_t>(sigHashType.getRawSigHashType())); | |||||
DoPush(vchSig); | |||||
return *this; | |||||
} | |||||
TestBuilder &PushDataSig(const CKey &key, const std::vector<uint8_t> &data, | TestBuilder &PushDataSig(const CKey &key, const std::vector<uint8_t> &data, | ||||
unsigned int lenR = 32, unsigned int lenS = 32) { | unsigned int lenR = 32, unsigned int lenS = 32) { | ||||
std::vector<uint8_t> vchHash(32); | std::vector<uint8_t> vchHash(32); | ||||
CSHA256().Write(data.data(), data.size()).Finalize(vchHash.data()); | CSHA256().Write(data.data(), data.size()).Finalize(vchHash.data()); | ||||
DoPush(DoSign(key, uint256(vchHash), lenR, lenS)); | DoPush(DoSign(key, uint256(vchHash), lenR, lenS)); | ||||
return *this; | return *this; | ||||
} | } | ||||
TestBuilder &PushDataSigSchnorr(const CKey &key, | |||||
const std::vector<uint8_t> &data) { | |||||
std::vector<uint8_t> vchHash(32); | |||||
CSHA256().Write(data.data(), data.size()).Finalize(vchHash.data()); | |||||
DoPush(DoSignSchnorr(key, uint256(vchHash))); | |||||
return *this; | |||||
} | |||||
TestBuilder &Push(const CPubKey &pubkey) { | TestBuilder &Push(const CPubKey &pubkey) { | ||||
DoPush(std::vector<uint8_t>(pubkey.begin(), pubkey.end())); | DoPush(std::vector<uint8_t>(pubkey.begin(), pubkey.end())); | ||||
return *this; | return *this; | ||||
} | } | ||||
TestBuilder &PushRedeem() { | TestBuilder &PushRedeem() { | ||||
DoPush(std::vector<uint8_t>(redeemscript.begin(), redeemscript.end())); | DoPush(std::vector<uint8_t>(redeemscript.begin(), redeemscript.end())); | ||||
return *this; | return *this; | ||||
▲ Show 20 Lines • Show All 1,161 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", | ||||
checkdatasigschnorrflags) | checkdatasigschnorrflags) | ||||
.PushDataSig(keys.key0, {}) | .PushDataSig(keys.key0, {}) | ||||
.DamagePush(10) | .DamagePush(10) | ||||
.Num(0) | .Num(0) | ||||
.ScriptError(SCRIPT_ERR_PUBKEYTYPE)); | .ScriptError(SCRIPT_ERR_PUBKEYTYPE)); | ||||
// Test all six CHECK*SIG* opcodes with Schnorr signatures. | |||||
// - Schnorr/ECDSA signatures with varying flags SCHNORR / STRICTENC. | |||||
// - test with different key / mismatching key | |||||
// CHECKSIG | |||||
tests.push_back( | |||||
TestBuilder(CScript() << ToByteVector(keys.pubkey0) << OP_CHECKSIG, | |||||
"CHECKSIG Schnorr w/ neither STRICTENC,SCHNORR", 0) | |||||
.PushSigSchnorr(keys.key0) | |||||
.ScriptError(SCRIPT_ERR_EVAL_FALSE)); | |||||
tests.push_back( | |||||
TestBuilder(CScript() << ToByteVector(keys.pubkey0) << OP_CHECKSIG, | |||||
"CHECKSIG ECDSA w/ neither STRICTENC,SCHNORR", 0) | |||||
.PushSig(keys.key0)); | |||||
tests.push_back( | |||||
TestBuilder(CScript() << ToByteVector(keys.pubkey0) << OP_CHECKSIG, | |||||
"CHECKSIG Schnorr w/ SCHNORR", SCRIPT_ENABLE_SCHNORR) | |||||
.PushSigSchnorr(keys.key0)); | |||||
tests.push_back( | |||||
TestBuilder(CScript() << ToByteVector(keys.pubkey0) << OP_CHECKSIG, | |||||
"CHECKSIG ECDSA w/ SCHNORR", SCRIPT_ENABLE_SCHNORR) | |||||
.PushSig(keys.key0)); | |||||
tests.push_back( | |||||
TestBuilder(CScript() << ToByteVector(keys.pubkey0) << OP_CHECKSIG, | |||||
"CHECKSIG Schnorr w/ STRICTENC", SCRIPT_VERIFY_STRICTENC) | |||||
.PushSigSchnorr(keys.key0) | |||||
.ScriptError(SCRIPT_ERR_SIG_DER)); | |||||
tests.push_back( | |||||
TestBuilder(CScript() << ToByteVector(keys.pubkey0) << OP_CHECKSIG, | |||||
"CHECKSIG ECDSA w/ STRICTENC", SCRIPT_VERIFY_STRICTENC) | |||||
.PushSig(keys.key0)); | |||||
tests.push_back( | |||||
TestBuilder(CScript() << ToByteVector(keys.pubkey0) << OP_CHECKSIG, | |||||
"CHECKSIG Schnorr w/ STRICTENC,SCHNORR", | |||||
SCRIPT_ENABLE_SCHNORR | SCRIPT_VERIFY_STRICTENC) | |||||
.PushSigSchnorr(keys.key0)); | |||||
tests.push_back( | |||||
TestBuilder(CScript() << ToByteVector(keys.pubkey0) << OP_CHECKSIG, | |||||
"CHECKSIG ECDSA w/ STRICTENC,SCHNORR", | |||||
SCRIPT_ENABLE_SCHNORR | SCRIPT_VERIFY_STRICTENC) | |||||
.PushSig(keys.key0)); | |||||
tests.push_back( | |||||
TestBuilder(CScript() << ToByteVector(keys.pubkey1) << OP_CHECKSIG, | |||||
"CHECKSIG Schnorr other key", | |||||
SCRIPT_ENABLE_SCHNORR | SCRIPT_VERIFY_STRICTENC) | |||||
.PushSigSchnorr(keys.key1)); | |||||
tests.push_back(TestBuilder(CScript() << ToByteVector(keys.pubkey0) | |||||
<< OP_CHECKSIG << OP_NOT, | |||||
"CHECKSIG Schnorr mismatched key", | |||||
SCRIPT_ENABLE_SCHNORR | SCRIPT_VERIFY_STRICTENC) | |||||
.PushSigSchnorr(keys.key1)); | |||||
// CHECKSIGVERIFY | |||||
tests.push_back( | |||||
TestBuilder(CScript() << ToByteVector(keys.pubkey0) << OP_CHECKSIGVERIFY | |||||
<< OP_1, | |||||
"CHECKSIGVERIFY Schnorr w/ neither STRICTENC,SCHNORR", 0) | |||||
.PushSigSchnorr(keys.key0) | |||||
.ScriptError(SCRIPT_ERR_CHECKSIGVERIFY)); | |||||
tests.push_back( | |||||
TestBuilder(CScript() << ToByteVector(keys.pubkey0) << OP_CHECKSIGVERIFY | |||||
<< OP_1, | |||||
"CHECKSIGVERIFY ECDSA w/ neither STRICTENC,SCHNORR", 0) | |||||
.PushSig(keys.key0)); | |||||
tests.push_back(TestBuilder(CScript() << ToByteVector(keys.pubkey0) | |||||
<< OP_CHECKSIGVERIFY << OP_1, | |||||
"CHECKSIGVERIFY Schnorr w/ SCHNORR", | |||||
SCRIPT_ENABLE_SCHNORR) | |||||
.PushSigSchnorr(keys.key0)); | |||||
tests.push_back(TestBuilder(CScript() << ToByteVector(keys.pubkey0) | |||||
<< OP_CHECKSIGVERIFY << OP_1, | |||||
"CHECKSIGVERIFY ECDSA w/ SCHNORR", | |||||
SCRIPT_ENABLE_SCHNORR) | |||||
.PushSig(keys.key0)); | |||||
tests.push_back(TestBuilder(CScript() << ToByteVector(keys.pubkey0) | |||||
<< OP_CHECKSIGVERIFY << OP_1, | |||||
"CHECKSIGVERIFY Schnorr w/ STRICTENC", | |||||
SCRIPT_VERIFY_STRICTENC) | |||||
.PushSigSchnorr(keys.key0) | |||||
.ScriptError(SCRIPT_ERR_SIG_DER)); | |||||
tests.push_back(TestBuilder(CScript() << ToByteVector(keys.pubkey0) | |||||
<< OP_CHECKSIGVERIFY << OP_1, | |||||
"CHECKSIGVERIFY ECDSA w/ STRICTENC", | |||||
SCRIPT_VERIFY_STRICTENC) | |||||
.PushSig(keys.key0)); | |||||
tests.push_back(TestBuilder(CScript() << ToByteVector(keys.pubkey0) | |||||
<< OP_CHECKSIGVERIFY << OP_1, | |||||
"CHECKSIGVERIFY Schnorr w/ STRICTENC,SCHNORR", | |||||
SCRIPT_ENABLE_SCHNORR | SCRIPT_VERIFY_STRICTENC) | |||||
.PushSigSchnorr(keys.key0)); | |||||
tests.push_back(TestBuilder(CScript() << ToByteVector(keys.pubkey0) | |||||
<< OP_CHECKSIGVERIFY << OP_1, | |||||
"CHECKSIGVERIFY ECDSA w/ STRICTENC,SCHNORR", | |||||
SCRIPT_ENABLE_SCHNORR | SCRIPT_VERIFY_STRICTENC) | |||||
.PushSig(keys.key0)); | |||||
tests.push_back(TestBuilder(CScript() << ToByteVector(keys.pubkey1) | |||||
<< OP_CHECKSIGVERIFY << OP_1, | |||||
"CHECKSIGVERIFY Schnorr other key", | |||||
SCRIPT_ENABLE_SCHNORR | SCRIPT_VERIFY_STRICTENC) | |||||
.PushSigSchnorr(keys.key1)); | |||||
tests.push_back(TestBuilder(CScript() << ToByteVector(keys.pubkey0) | |||||
<< OP_CHECKSIGVERIFY << OP_1, | |||||
"CHECKSIGVERIFY Schnorr mismatched key", | |||||
SCRIPT_ENABLE_SCHNORR | SCRIPT_VERIFY_STRICTENC) | |||||
.PushSigSchnorr(keys.key1) | |||||
.ScriptError(SCRIPT_ERR_CHECKSIGVERIFY)); | |||||
// CHECKDATASIG | |||||
tests.push_back( | |||||
TestBuilder(CScript() << OP_0 << ToByteVector(keys.pubkey0) | |||||
<< OP_CHECKDATASIG, | |||||
"CHECKDATASIG Schnorr w/ neither STRICTENC,SCHNORR", | |||||
SCRIPT_ENABLE_CHECKDATASIG) | |||||
.PushDataSigSchnorr(keys.key0, {}) | |||||
.ScriptError(SCRIPT_ERR_EVAL_FALSE)); | |||||
tests.push_back( | |||||
TestBuilder(CScript() << OP_0 << ToByteVector(keys.pubkey0) | |||||
<< OP_CHECKDATASIG, | |||||
"CHECKDATASIG ECDSA w/ neither STRICTENC,SCHNORR", | |||||
SCRIPT_ENABLE_CHECKDATASIG) | |||||
.PushDataSig(keys.key0, {})); | |||||
tests.push_back( | |||||
TestBuilder(CScript() << OP_0 << ToByteVector(keys.pubkey0) | |||||
<< OP_CHECKDATASIG, | |||||
"CHECKDATASIG Schnorr w/ SCHNORR", | |||||
SCRIPT_ENABLE_CHECKDATASIG | SCRIPT_ENABLE_SCHNORR) | |||||
.PushDataSigSchnorr(keys.key0, {})); | |||||
tests.push_back( | |||||
TestBuilder(CScript() << OP_0 << ToByteVector(keys.pubkey0) | |||||
<< OP_CHECKDATASIG, | |||||
"CHECKDATASIG ECDSA w/ SCHNORR", | |||||
SCRIPT_ENABLE_CHECKDATASIG | SCRIPT_ENABLE_SCHNORR) | |||||
.PushDataSig(keys.key0, {})); | |||||
tests.push_back( | |||||
TestBuilder(CScript() << OP_0 << ToByteVector(keys.pubkey0) | |||||
<< OP_CHECKDATASIG, | |||||
"CHECKDATASIG Schnorr w/ STRICTENC", | |||||
SCRIPT_ENABLE_CHECKDATASIG | SCRIPT_VERIFY_STRICTENC) | |||||
.PushDataSigSchnorr(keys.key0, {}) | |||||
.ScriptError(SCRIPT_ERR_SIG_DER)); | |||||
tests.push_back( | |||||
TestBuilder(CScript() << OP_0 << ToByteVector(keys.pubkey0) | |||||
<< OP_CHECKDATASIG, | |||||
"CHECKDATASIG ECDSA w/ STRICTENC", | |||||
SCRIPT_ENABLE_CHECKDATASIG | SCRIPT_VERIFY_STRICTENC) | |||||
.PushDataSig(keys.key0, {})); | |||||
tests.push_back(TestBuilder(CScript() << OP_0 << ToByteVector(keys.pubkey0) | |||||
<< OP_CHECKDATASIG, | |||||
"CHECKDATASIG Schnorr w/ STRICTENC,SCHNORR", | |||||
SCRIPT_ENABLE_CHECKDATASIG | | |||||
SCRIPT_ENABLE_SCHNORR | | |||||
SCRIPT_VERIFY_STRICTENC) | |||||
.PushDataSigSchnorr(keys.key0, {})); | |||||
tests.push_back(TestBuilder(CScript() << OP_0 << ToByteVector(keys.pubkey0) | |||||
<< OP_CHECKDATASIG, | |||||
"CHECKDATASIG ECDSA w/ STRICTENC,SCHNORR", | |||||
SCRIPT_ENABLE_CHECKDATASIG | | |||||
SCRIPT_ENABLE_SCHNORR | | |||||
SCRIPT_VERIFY_STRICTENC) | |||||
.PushDataSig(keys.key0, {})); | |||||
tests.push_back(TestBuilder(CScript() << OP_0 << ToByteVector(keys.pubkey1) | |||||
<< OP_CHECKDATASIG, | |||||
"CHECKDATASIG Schnorr other key", | |||||
SCRIPT_ENABLE_CHECKDATASIG | | |||||
SCRIPT_ENABLE_SCHNORR | | |||||
SCRIPT_VERIFY_STRICTENC) | |||||
.PushDataSigSchnorr(keys.key1, {})); | |||||
tests.push_back(TestBuilder(CScript() << OP_0 << ToByteVector(keys.pubkey0) | |||||
<< OP_CHECKDATASIG << OP_NOT, | |||||
"CHECKDATASIG Schnorr mismatched key", | |||||
SCRIPT_ENABLE_CHECKDATASIG | | |||||
SCRIPT_ENABLE_SCHNORR | | |||||
SCRIPT_VERIFY_STRICTENC) | |||||
.PushDataSigSchnorr(keys.key1, {})); | |||||
tests.push_back(TestBuilder(CScript() << OP_1 << ToByteVector(keys.pubkey1) | |||||
<< OP_CHECKDATASIG, | |||||
"CHECKDATASIG Schnorr other message", | |||||
SCRIPT_ENABLE_CHECKDATASIG | | |||||
SCRIPT_ENABLE_SCHNORR | | |||||
SCRIPT_VERIFY_STRICTENC) | |||||
.PushDataSigSchnorr(keys.key1, {1})); | |||||
tests.push_back(TestBuilder(CScript() << OP_0 << ToByteVector(keys.pubkey1) | |||||
<< OP_CHECKDATASIG << OP_NOT, | |||||
"CHECKDATASIG Schnorr wrong message", | |||||
SCRIPT_ENABLE_CHECKDATASIG | | |||||
SCRIPT_ENABLE_SCHNORR | | |||||
SCRIPT_VERIFY_STRICTENC) | |||||
.PushDataSigSchnorr(keys.key1, {1})); | |||||
// CHECKDATASIGVERIFY | |||||
tests.push_back( | |||||
TestBuilder(CScript() << OP_0 << ToByteVector(keys.pubkey0) | |||||
<< OP_CHECKDATASIGVERIFY << OP_1, | |||||
"CHECKDATASIGVERIFY Schnorr w/ neither STRICTENC,SCHNORR", | |||||
SCRIPT_ENABLE_CHECKDATASIG) | |||||
.PushDataSigSchnorr(keys.key0, {}) | |||||
.ScriptError(SCRIPT_ERR_CHECKDATASIGVERIFY)); | |||||
tests.push_back( | |||||
TestBuilder(CScript() << OP_0 << ToByteVector(keys.pubkey0) | |||||
<< OP_CHECKDATASIGVERIFY << OP_1, | |||||
"CHECKDATASIGVERIFY ECDSA w/ neither STRICTENC,SCHNORR", | |||||
SCRIPT_ENABLE_CHECKDATASIG) | |||||
.PushDataSig(keys.key0, {})); | |||||
tests.push_back( | |||||
TestBuilder(CScript() << OP_0 << ToByteVector(keys.pubkey0) | |||||
<< OP_CHECKDATASIGVERIFY << OP_1, | |||||
"CHECKDATASIGVERIFY Schnorr w/ SCHNORR", | |||||
SCRIPT_ENABLE_CHECKDATASIG | SCRIPT_ENABLE_SCHNORR) | |||||
.PushDataSigSchnorr(keys.key0, {})); | |||||
tests.push_back( | |||||
TestBuilder(CScript() << OP_0 << ToByteVector(keys.pubkey0) | |||||
<< OP_CHECKDATASIGVERIFY << OP_1, | |||||
"CHECKDATASIGVERIFY ECDSA w/ SCHNORR", | |||||
SCRIPT_ENABLE_CHECKDATASIG | SCRIPT_ENABLE_SCHNORR) | |||||
.PushDataSig(keys.key0, {})); | |||||
tests.push_back( | |||||
TestBuilder(CScript() << OP_0 << ToByteVector(keys.pubkey0) | |||||
<< OP_CHECKDATASIGVERIFY << OP_1, | |||||
"CHECKDATASIGVERIFY Schnorr w/ STRICTENC", | |||||
SCRIPT_ENABLE_CHECKDATASIG | SCRIPT_VERIFY_STRICTENC) | |||||
.PushDataSigSchnorr(keys.key0, {}) | |||||
.ScriptError(SCRIPT_ERR_SIG_DER)); | |||||
tests.push_back( | |||||
TestBuilder(CScript() << OP_0 << ToByteVector(keys.pubkey0) | |||||
<< OP_CHECKDATASIGVERIFY << OP_1, | |||||
"CHECKDATASIGVERIFY ECDSA w/ STRICTENC", | |||||
SCRIPT_ENABLE_CHECKDATASIG | SCRIPT_VERIFY_STRICTENC) | |||||
.PushDataSig(keys.key0, {})); | |||||
tests.push_back( | |||||
TestBuilder(CScript() << OP_0 << ToByteVector(keys.pubkey0) | |||||
<< OP_CHECKDATASIGVERIFY << OP_1, | |||||
"CHECKDATASIGVERIFY Schnorr w/ STRICTENC,SCHNORR", | |||||
SCRIPT_ENABLE_CHECKDATASIG | SCRIPT_ENABLE_SCHNORR | | |||||
SCRIPT_VERIFY_STRICTENC) | |||||
.PushDataSigSchnorr(keys.key0, {})); | |||||
tests.push_back(TestBuilder(CScript() << OP_0 << ToByteVector(keys.pubkey0) | |||||
<< OP_CHECKDATASIGVERIFY << OP_1, | |||||
"CHECKDATASIGVERIFY ECDSA w/ STRICTENC,SCHNORR", | |||||
SCRIPT_ENABLE_CHECKDATASIG | | |||||
SCRIPT_ENABLE_SCHNORR | | |||||
SCRIPT_VERIFY_STRICTENC) | |||||
.PushDataSig(keys.key0, {})); | |||||
tests.push_back(TestBuilder(CScript() << OP_0 << ToByteVector(keys.pubkey1) | |||||
<< OP_CHECKDATASIGVERIFY << OP_1, | |||||
"CHECKDATASIGVERIFY Schnorr other key", | |||||
SCRIPT_ENABLE_CHECKDATASIG | | |||||
SCRIPT_ENABLE_SCHNORR | | |||||
SCRIPT_VERIFY_STRICTENC) | |||||
.PushDataSigSchnorr(keys.key1, {})); | |||||
tests.push_back(TestBuilder(CScript() << OP_0 << ToByteVector(keys.pubkey0) | |||||
<< OP_CHECKDATASIGVERIFY << OP_1, | |||||
"CHECKDATASIGVERIFY Schnorr mismatched key", | |||||
SCRIPT_ENABLE_CHECKDATASIG | | |||||
SCRIPT_ENABLE_SCHNORR | | |||||
SCRIPT_VERIFY_STRICTENC) | |||||
.PushDataSigSchnorr(keys.key1, {}) | |||||
.ScriptError(SCRIPT_ERR_CHECKDATASIGVERIFY)); | |||||
tests.push_back(TestBuilder(CScript() << OP_1 << ToByteVector(keys.pubkey1) | |||||
<< OP_CHECKDATASIGVERIFY << OP_1, | |||||
"CHECKDATASIGVERIFY Schnorr other message", | |||||
SCRIPT_ENABLE_CHECKDATASIG | | |||||
SCRIPT_ENABLE_SCHNORR | | |||||
SCRIPT_VERIFY_STRICTENC) | |||||
.PushDataSigSchnorr(keys.key1, {1})); | |||||
tests.push_back(TestBuilder(CScript() << OP_0 << ToByteVector(keys.pubkey1) | |||||
<< OP_CHECKDATASIGVERIFY << OP_1, | |||||
"CHECKDATASIGVERIFY Schnorr wrong message", | |||||
SCRIPT_ENABLE_CHECKDATASIG | | |||||
SCRIPT_ENABLE_SCHNORR | | |||||
SCRIPT_VERIFY_STRICTENC) | |||||
.PushDataSigSchnorr(keys.key1, {1}) | |||||
.ScriptError(SCRIPT_ERR_CHECKDATASIGVERIFY)); | |||||
// CHECKMULTISIG 1-of-1 | |||||
tests.push_back( | |||||
TestBuilder(CScript() << OP_1 << ToByteVector(keys.pubkey0) << OP_1 | |||||
<< OP_CHECKMULTISIG, | |||||
"CHECKMULTISIG Schnorr w/ neither STRICTENC,SCHNORR", 0) | |||||
.Num(0) | |||||
.PushSigSchnorr(keys.key0) | |||||
.ScriptError(SCRIPT_ERR_EVAL_FALSE)); | |||||
tests.push_back( | |||||
TestBuilder(CScript() << OP_1 << ToByteVector(keys.pubkey0) << OP_1 | |||||
<< OP_CHECKMULTISIG, | |||||
"CHECKMULTISIG ECDSA w/ neither STRICTENC,SCHNORR", 0) | |||||
.Num(0) | |||||
.PushSig(keys.key0)); | |||||
tests.push_back(TestBuilder(CScript() << OP_1 << ToByteVector(keys.pubkey0) | |||||
<< OP_1 << OP_CHECKMULTISIG, | |||||
"CHECKMULTISIG Schnorr w/ SCHNORR", | |||||
SCRIPT_ENABLE_SCHNORR) | |||||
.Num(0) | |||||
.PushSigSchnorr(keys.key0) | |||||
.ScriptError(SCRIPT_ERR_SIG_BADLENGTH)); | |||||
tests.push_back(TestBuilder(CScript() << OP_1 << ToByteVector(keys.pubkey0) | |||||
<< OP_1 << OP_CHECKMULTISIG, | |||||
"CHECKMULTISIG ECDSA w/ SCHNORR", | |||||
SCRIPT_ENABLE_SCHNORR) | |||||
.Num(0) | |||||
.PushSig(keys.key0)); | |||||
tests.push_back(TestBuilder(CScript() << OP_1 << ToByteVector(keys.pubkey0) | |||||
<< OP_1 << OP_CHECKMULTISIG, | |||||
"CHECKMULTISIG Schnorr w/ STRICTENC", | |||||
SCRIPT_VERIFY_STRICTENC) | |||||
.Num(0) | |||||
.PushSigSchnorr(keys.key0) | |||||
.ScriptError(SCRIPT_ERR_SIG_DER)); | |||||
tests.push_back(TestBuilder(CScript() << OP_1 << ToByteVector(keys.pubkey0) | |||||
<< OP_1 << OP_CHECKMULTISIG, | |||||
"CHECKMULTISIG ECDSA w/ STRICTENC", | |||||
SCRIPT_VERIFY_STRICTENC) | |||||
.Num(0) | |||||
.PushSig(keys.key0)); | |||||
tests.push_back(TestBuilder(CScript() << OP_1 << ToByteVector(keys.pubkey0) | |||||
<< OP_1 << OP_CHECKMULTISIG, | |||||
"CHECKMULTISIG Schnorr w/ STRICTENC,SCHNORR", | |||||
SCRIPT_ENABLE_SCHNORR | SCRIPT_VERIFY_STRICTENC) | |||||
.Num(0) | |||||
.PushSigSchnorr(keys.key0) | |||||
.ScriptError(SCRIPT_ERR_SIG_BADLENGTH)); | |||||
tests.push_back(TestBuilder(CScript() << OP_1 << ToByteVector(keys.pubkey0) | |||||
<< OP_1 << OP_CHECKMULTISIG, | |||||
"CHECKMULTISIG ECDSA w/ STRICTENC,SCHNORR", | |||||
SCRIPT_ENABLE_SCHNORR | SCRIPT_VERIFY_STRICTENC) | |||||
.Num(0) | |||||
.PushSig(keys.key0)); | |||||
// Test multisig with multiple Schnorr signatures | |||||
tests.push_back(TestBuilder(CScript() << OP_3 << ToByteVector(keys.pubkey0C) | |||||
<< ToByteVector(keys.pubkey1C) | |||||
<< ToByteVector(keys.pubkey2C) << OP_3 | |||||
<< OP_CHECKMULTISIG, | |||||
"Schnorr 3-of-3 without SCHNORR flag", 0) | |||||
.Num(0) | |||||
.PushSigSchnorr(keys.key0) | |||||
.PushSigSchnorr(keys.key1) | |||||
.PushSigSchnorr(keys.key2) | |||||
.ScriptError(SCRIPT_ERR_EVAL_FALSE)); | |||||
tests.push_back(TestBuilder(CScript() << OP_3 << ToByteVector(keys.pubkey0C) | |||||
<< ToByteVector(keys.pubkey1C) | |||||
<< ToByteVector(keys.pubkey2C) << OP_3 | |||||
<< OP_CHECKMULTISIG, | |||||
"Schnorr 3-of-3 with SCHNORR flag", | |||||
SCRIPT_ENABLE_SCHNORR) | |||||
.Num(0) | |||||
.PushSigSchnorr(keys.key0) | |||||
.PushSigSchnorr(keys.key1) | |||||
.PushSigSchnorr(keys.key2) | |||||
.ScriptError(SCRIPT_ERR_SIG_BADLENGTH)); | |||||
tests.push_back(TestBuilder(CScript() << OP_3 << ToByteVector(keys.pubkey0C) | |||||
<< ToByteVector(keys.pubkey1C) | |||||
<< ToByteVector(keys.pubkey2C) << OP_3 | |||||
<< OP_CHECKMULTISIG, | |||||
"Schnorr-ECDSA-mixed 3-of-3 with SCHNORR flag", | |||||
SCRIPT_ENABLE_SCHNORR) | |||||
.Num(0) | |||||
.PushSig(keys.key0) | |||||
.PushSig(keys.key1) | |||||
.PushSigSchnorr(keys.key2) | |||||
.ScriptError(SCRIPT_ERR_SIG_BADLENGTH)); | |||||
// CHECKMULTISIGVERIFY 1-of-1 | |||||
tests.push_back( | |||||
TestBuilder(CScript() << OP_1 << ToByteVector(keys.pubkey0) << OP_1 | |||||
<< OP_CHECKMULTISIGVERIFY << OP_1, | |||||
"CHECKMULTISIGVERIFY Schnorr w/ neither STRICTENC,SCHNORR", | |||||
0) | |||||
.Num(0) | |||||
.PushSigSchnorr(keys.key0) | |||||
.ScriptError(SCRIPT_ERR_CHECKMULTISIGVERIFY)); | |||||
tests.push_back( | |||||
TestBuilder(CScript() << OP_1 << ToByteVector(keys.pubkey0) << OP_1 | |||||
<< OP_CHECKMULTISIGVERIFY << OP_1, | |||||
"CHECKMULTISIGVERIFY ECDSA w/ neither STRICTENC,SCHNORR", 0) | |||||
.Num(0) | |||||
.PushSig(keys.key0)); | |||||
tests.push_back(TestBuilder(CScript() | |||||
<< OP_1 << ToByteVector(keys.pubkey0) | |||||
<< OP_1 << OP_CHECKMULTISIGVERIFY << OP_1, | |||||
"CHECKMULTISIGVERIFY Schnorr w/ SCHNORR", | |||||
SCRIPT_ENABLE_SCHNORR) | |||||
.Num(0) | |||||
.PushSigSchnorr(keys.key0) | |||||
.ScriptError(SCRIPT_ERR_SIG_BADLENGTH)); | |||||
tests.push_back(TestBuilder(CScript() | |||||
<< OP_1 << ToByteVector(keys.pubkey0) | |||||
<< OP_1 << OP_CHECKMULTISIGVERIFY << OP_1, | |||||
"CHECKMULTISIGVERIFY ECDSA w/ SCHNORR", | |||||
SCRIPT_ENABLE_SCHNORR) | |||||
.Num(0) | |||||
.PushSig(keys.key0)); | |||||
tests.push_back(TestBuilder(CScript() | |||||
<< OP_1 << ToByteVector(keys.pubkey0) | |||||
<< OP_1 << OP_CHECKMULTISIGVERIFY << OP_1, | |||||
"CHECKMULTISIGVERIFY Schnorr w/ STRICTENC", | |||||
SCRIPT_VERIFY_STRICTENC) | |||||
.Num(0) | |||||
.PushSigSchnorr(keys.key0) | |||||
.ScriptError(SCRIPT_ERR_SIG_DER)); | |||||
tests.push_back(TestBuilder(CScript() | |||||
<< OP_1 << ToByteVector(keys.pubkey0) | |||||
<< OP_1 << OP_CHECKMULTISIGVERIFY << OP_1, | |||||
"CHECKMULTISIGVERIFY ECDSA w/ STRICTENC", | |||||
SCRIPT_VERIFY_STRICTENC) | |||||
.Num(0) | |||||
.PushSig(keys.key0)); | |||||
tests.push_back( | |||||
TestBuilder(CScript() << OP_1 << ToByteVector(keys.pubkey0) << OP_1 | |||||
<< OP_CHECKMULTISIGVERIFY << OP_1, | |||||
"CHECKMULTISIGVERIFY Schnorr w/ STRICTENC,SCHNORR", | |||||
SCRIPT_ENABLE_SCHNORR | SCRIPT_VERIFY_STRICTENC) | |||||
.Num(0) | |||||
.PushSigSchnorr(keys.key0) | |||||
.ScriptError(SCRIPT_ERR_SIG_BADLENGTH)); | |||||
tests.push_back( | |||||
TestBuilder(CScript() << OP_1 << ToByteVector(keys.pubkey0) << OP_1 | |||||
<< OP_CHECKMULTISIGVERIFY << OP_1, | |||||
"CHECKMULTISIGVERIFY ECDSA w/ STRICTENC,SCHNORR", | |||||
SCRIPT_ENABLE_SCHNORR | SCRIPT_VERIFY_STRICTENC) | |||||
.Num(0) | |||||
.PushSig(keys.key0)); | |||||
// Test damaged Schnorr signatures | |||||
tests.push_back(TestBuilder(CScript() << ToByteVector(keys.pubkey0) | |||||
<< OP_CHECKSIG << OP_NOT, | |||||
"Schnorr P2PK, bad sig", SCRIPT_ENABLE_SCHNORR) | |||||
.PushSigSchnorr(keys.key0) | |||||
.DamagePush(10)); | |||||
tests.push_back(TestBuilder(CScript() << ToByteVector(keys.pubkey0) | |||||
<< OP_CHECKSIG << OP_NOT, | |||||
"Schnorr P2PK, bad sig STRICTENC", | |||||
SCRIPT_ENABLE_SCHNORR | SCRIPT_VERIFY_STRICTENC) | |||||
.PushSigSchnorr(keys.key0) | |||||
.DamagePush(10)); | |||||
tests.push_back(TestBuilder(CScript() << ToByteVector(keys.pubkey0) | |||||
<< OP_CHECKSIG << OP_NOT, | |||||
"Schnorr P2PK, bad sig NULLFAIL", | |||||
SCRIPT_ENABLE_SCHNORR | SCRIPT_VERIFY_NULLFAIL) | |||||
.PushSigSchnorr(keys.key0) | |||||
.DamagePush(10) | |||||
.ScriptError(SCRIPT_ERR_SIG_NULLFAIL)); | |||||
// Make sure P2PKH works with Schnorr | |||||
tests.push_back(TestBuilder(CScript() << OP_DUP << OP_HASH160 | |||||
<< ToByteVector(keys.pubkey1C.GetID()) | |||||
<< OP_EQUALVERIFY << OP_CHECKSIG, | |||||
"Schnorr P2PKH", SCRIPT_ENABLE_SCHNORR) | |||||
.PushSigSchnorr(keys.key1) | |||||
.Push(keys.pubkey1C)); | |||||
// Test of different pubkey encodings | |||||
tests.push_back( | |||||
TestBuilder(CScript() << ToByteVector(keys.pubkey0C) << OP_CHECKSIG, | |||||
"Schnorr P2PK with compressed pubkey", | |||||
SCRIPT_VERIFY_STRICTENC | SCRIPT_ENABLE_SCHNORR) | |||||
.PushSigSchnorr(keys.key0, SigHashType())); | |||||
tests.push_back( | |||||
TestBuilder(CScript() << ToByteVector(keys.pubkey0) << OP_CHECKSIG, | |||||
"Schnorr P2PK with uncompressed pubkey", | |||||
SCRIPT_VERIFY_STRICTENC | SCRIPT_ENABLE_SCHNORR) | |||||
.PushSigSchnorr(keys.key0, SigHashType())); | |||||
tests.push_back( | |||||
TestBuilder(CScript() << ToByteVector(keys.pubkey0) << OP_CHECKSIG, | |||||
"Schnorr P2PK with uncompressed pubkey but " | |||||
"COMPRESSED_PUBKEYTYPE set", | |||||
SCRIPT_VERIFY_STRICTENC | SCRIPT_ENABLE_SCHNORR | | |||||
SCRIPT_VERIFY_COMPRESSED_PUBKEYTYPE) | |||||
.PushSigSchnorr(keys.key0, SigHashType()) | |||||
.ScriptError(SCRIPT_ERR_NONCOMPRESSED_PUBKEY)); | |||||
tests.push_back( | |||||
TestBuilder(CScript() << ToByteVector(keys.pubkey0H) << OP_CHECKSIG, | |||||
"Schnorr P2PK with hybrid pubkey", | |||||
SCRIPT_VERIFY_STRICTENC | SCRIPT_ENABLE_SCHNORR) | |||||
.PushSigSchnorr(keys.key0, SigHashType()) | |||||
.ScriptError(SCRIPT_ERR_PUBKEYTYPE)); | |||||
tests.push_back( | |||||
TestBuilder(CScript() << ToByteVector(keys.pubkey0H) << OP_CHECKSIG, | |||||
"Schnorr P2PK with hybrid pubkey but no STRICTENC", | |||||
SCRIPT_ENABLE_SCHNORR) | |||||
.PushSigSchnorr(keys.key0)); | |||||
tests.push_back( | |||||
TestBuilder( | |||||
CScript() << ToByteVector(keys.pubkey0H) << OP_CHECKSIG << OP_NOT, | |||||
"Schnorr P2PK NOT with damaged hybrid pubkey but no STRICTENC", | |||||
SCRIPT_ENABLE_SCHNORR) | |||||
.PushSigSchnorr(keys.key0) | |||||
.DamagePush(10)); | |||||
// Ensure sighash types still get checked with schnorr | |||||
tests.push_back( | |||||
TestBuilder(CScript() << ToByteVector(keys.pubkey1) << OP_CHECKSIG, | |||||
"Schnorr P2PK with undefined basehashtype and STRICTENC", | |||||
SCRIPT_VERIFY_STRICTENC | SCRIPT_ENABLE_SCHNORR) | |||||
.PushSigSchnorr(keys.key1, SigHashType(5)) | |||||
.ScriptError(SCRIPT_ERR_SIG_HASHTYPE)); | |||||
tests.push_back( | |||||
TestBuilder(CScript() << OP_DUP << OP_HASH160 | |||||
<< ToByteVector(keys.pubkey0.GetID()) | |||||
<< OP_EQUALVERIFY << OP_CHECKSIG, | |||||
"Schnorr P2PKH with invalid sighashtype but no STRICTENC", | |||||
SCRIPT_ENABLE_SCHNORR) | |||||
.PushSigSchnorr(keys.key0, SigHashType(0x21), Amount::zero(), 0) | |||||
.Push(keys.pubkey0)); | |||||
tests.push_back( | |||||
TestBuilder(CScript() << OP_DUP << OP_HASH160 | |||||
<< ToByteVector(keys.pubkey0.GetID()) | |||||
<< OP_EQUALVERIFY << OP_CHECKSIG, | |||||
"Schnorr P2PKH with invalid sighashtype and STRICTENC", | |||||
SCRIPT_VERIFY_STRICTENC | SCRIPT_ENABLE_SCHNORR) | |||||
.PushSigSchnorr(keys.key0, SigHashType(0x21), Amount::zero(), | |||||
SCRIPT_VERIFY_STRICTENC | SCRIPT_ENABLE_SCHNORR) | |||||
.Push(keys.pubkey0) | |||||
.ScriptError(SCRIPT_ERR_SIG_HASHTYPE)); | |||||
tests.push_back( | |||||
TestBuilder(CScript() << ToByteVector(keys.pubkey1) << OP_CHECKSIG, | |||||
"Schnorr P2PK anyonecanpay", SCRIPT_ENABLE_SCHNORR) | |||||
.PushSigSchnorr(keys.key1, SigHashType().withAnyoneCanPay())); | |||||
tests.push_back( | |||||
TestBuilder(CScript() << ToByteVector(keys.pubkey1) << OP_CHECKSIG, | |||||
"Schnorr P2PK anyonecanpay marked with normal hashtype", | |||||
SCRIPT_ENABLE_SCHNORR) | |||||
.PushSigSchnorr(keys.key1, SigHashType().withAnyoneCanPay()) | |||||
.EditPush(64, "81", "01") | |||||
.ScriptError(SCRIPT_ERR_EVAL_FALSE)); | |||||
tests.push_back( | |||||
TestBuilder(CScript() << ToByteVector(keys.pubkey1) << OP_CHECKSIG, | |||||
"Schnorr P2PK with forkID", | |||||
SCRIPT_ENABLE_SCHNORR | SCRIPT_VERIFY_STRICTENC | | |||||
SCRIPT_ENABLE_SIGHASH_FORKID) | |||||
.PushSigSchnorr(keys.key1, SigHashType().withForkId())); | |||||
tests.push_back( | |||||
TestBuilder(CScript() << ToByteVector(keys.pubkey1) << OP_CHECKSIG, | |||||
"Schnorr P2PK with non-forkID sig", | |||||
SCRIPT_ENABLE_SCHNORR | SCRIPT_VERIFY_STRICTENC | | |||||
SCRIPT_ENABLE_SIGHASH_FORKID) | |||||
.PushSigSchnorr(keys.key1) | |||||
.ScriptError(SCRIPT_ERR_MUST_USE_FORKID)); | |||||
tests.push_back( | |||||
TestBuilder(CScript() << ToByteVector(keys.pubkey1) << OP_CHECKSIG, | |||||
"Schnorr P2PK with cheater forkID bit", | |||||
SCRIPT_ENABLE_SCHNORR | SCRIPT_VERIFY_STRICTENC | | |||||
SCRIPT_ENABLE_SIGHASH_FORKID) | |||||
.PushSigSchnorr(keys.key1) | |||||
.EditPush(64, "01", "41") | |||||
.ScriptError(SCRIPT_ERR_EVAL_FALSE)); | |||||
// Tests SCRIPT_ALLOW_SEGWIT_RECOVERY | // Tests SCRIPT_ALLOW_SEGWIT_RECOVERY | ||||
const uint32_t allowSegwitRecoveryFlags = SCRIPT_VERIFY_CLEANSTACK | | const uint32_t allowSegwitRecoveryFlags = SCRIPT_VERIFY_CLEANSTACK | | ||||
SCRIPT_VERIFY_P2SH | | SCRIPT_VERIFY_P2SH | | ||||
SCRIPT_ALLOW_SEGWIT_RECOVERY; | SCRIPT_ALLOW_SEGWIT_RECOVERY; | ||||
tests.push_back( | tests.push_back( | ||||
TestBuilder(CScript() << OP_0 << ToByteVector(keys.pubkey0.GetID()), | TestBuilder(CScript() << OP_0 << ToByteVector(keys.pubkey0.GetID()), | ||||
"v0 P2SH-P2WPKH but no SCRIPT_ALLOW_SEGWIT_RECOVERY", | "v0 P2SH-P2WPKH but no SCRIPT_ALLOW_SEGWIT_RECOVERY", | ||||
SCRIPT_VERIFY_CLEANSTACK | SCRIPT_VERIFY_P2SH, true) | SCRIPT_VERIFY_CLEANSTACK | SCRIPT_VERIFY_P2SH, true) | ||||
▲ Show 20 Lines • Show All 901 Lines • Show Last 20 Lines |