Changeset View
Changeset View
Standalone View
Standalone View
src/test/script_tests.cpp
Show First 20 Lines • Show All 55 Lines • ▼ Show 20 Lines | static ScriptErrorDesc script_errors[] = { | ||||
{SCRIPT_ERR_INVALID_OPERAND_SIZE, "OPERAND_SIZE"}, | {SCRIPT_ERR_INVALID_OPERAND_SIZE, "OPERAND_SIZE"}, | ||||
{SCRIPT_ERR_INVALID_NUMBER_RANGE, "INVALID_NUMBER_RANGE"}, | {SCRIPT_ERR_INVALID_NUMBER_RANGE, "INVALID_NUMBER_RANGE"}, | ||||
{SCRIPT_ERR_IMPOSSIBLE_ENCODING, "IMPOSSIBLE_ENCODING"}, | {SCRIPT_ERR_IMPOSSIBLE_ENCODING, "IMPOSSIBLE_ENCODING"}, | ||||
{SCRIPT_ERR_INVALID_SPLIT_RANGE, "SPLIT_RANGE"}, | {SCRIPT_ERR_INVALID_SPLIT_RANGE, "SPLIT_RANGE"}, | ||||
{SCRIPT_ERR_VERIFY, "VERIFY"}, | {SCRIPT_ERR_VERIFY, "VERIFY"}, | ||||
{SCRIPT_ERR_EQUALVERIFY, "EQUALVERIFY"}, | {SCRIPT_ERR_EQUALVERIFY, "EQUALVERIFY"}, | ||||
{SCRIPT_ERR_CHECKMULTISIGVERIFY, "CHECKMULTISIGVERIFY"}, | {SCRIPT_ERR_CHECKMULTISIGVERIFY, "CHECKMULTISIGVERIFY"}, | ||||
{SCRIPT_ERR_CHECKSIGVERIFY, "CHECKSIGVERIFY"}, | {SCRIPT_ERR_CHECKSIGVERIFY, "CHECKSIGVERIFY"}, | ||||
{SCRIPT_ERR_CHECKDATASIGVERIFY, "CHECKDATASIGVERIFY"}, | |||||
{SCRIPT_ERR_NUMEQUALVERIFY, "NUMEQUALVERIFY"}, | {SCRIPT_ERR_NUMEQUALVERIFY, "NUMEQUALVERIFY"}, | ||||
{SCRIPT_ERR_BAD_OPCODE, "BAD_OPCODE"}, | {SCRIPT_ERR_BAD_OPCODE, "BAD_OPCODE"}, | ||||
{SCRIPT_ERR_DISABLED_OPCODE, "DISABLED_OPCODE"}, | {SCRIPT_ERR_DISABLED_OPCODE, "DISABLED_OPCODE"}, | ||||
{SCRIPT_ERR_INVALID_STACK_OPERATION, "INVALID_STACK_OPERATION"}, | {SCRIPT_ERR_INVALID_STACK_OPERATION, "INVALID_STACK_OPERATION"}, | ||||
{SCRIPT_ERR_INVALID_ALTSTACK_OPERATION, "INVALID_ALTSTACK_OPERATION"}, | {SCRIPT_ERR_INVALID_ALTSTACK_OPERATION, "INVALID_ALTSTACK_OPERATION"}, | ||||
{SCRIPT_ERR_UNBALANCED_CONDITIONAL, "UNBALANCED_CONDITIONAL"}, | {SCRIPT_ERR_UNBALANCED_CONDITIONAL, "UNBALANCED_CONDITIONAL"}, | ||||
{SCRIPT_ERR_NEGATIVE_LOCKTIME, "NEGATIVE_LOCKTIME"}, | {SCRIPT_ERR_NEGATIVE_LOCKTIME, "NEGATIVE_LOCKTIME"}, | ||||
{SCRIPT_ERR_UNSATISFIED_LOCKTIME, "UNSATISFIED_LOCKTIME"}, | {SCRIPT_ERR_UNSATISFIED_LOCKTIME, "UNSATISFIED_LOCKTIME"}, | ||||
▲ Show 20 Lines • Show All 241 Lines • ▼ Show 20 Lines | TestBuilder &Num(int num) { | ||||
return *this; | return *this; | ||||
} | } | ||||
TestBuilder &Push(const std::string &hex) { | TestBuilder &Push(const std::string &hex) { | ||||
DoPush(ParseHex(hex)); | DoPush(ParseHex(hex)); | ||||
return *this; | return *this; | ||||
} | } | ||||
TestBuilder &Push(const uint256 &hash) { | |||||
DoPush(ToByteVector(hash)); | |||||
return *this; | |||||
} | |||||
TestBuilder &Push(const CScript &_script) { | TestBuilder &Push(const CScript &_script) { | ||||
DoPush(std::vector<uint8_t>(_script.begin(), _script.end())); | DoPush(std::vector<uint8_t>(_script.begin(), _script.end())); | ||||
return *this; | return *this; | ||||
} | } | ||||
TestBuilder &PushSig(const CKey &key, | TestBuilder &PushSig(const CKey &key, | ||||
SigHashType sigHashType = SigHashType(), | SigHashType sigHashType = SigHashType(), | ||||
unsigned int lenR = 32, unsigned int lenS = 32, | unsigned int lenR = 32, unsigned int lenS = 32, | ||||
Amount amount = Amount(0), | Amount amount = Amount(0), | ||||
uint32_t flags = SCRIPT_ENABLE_SIGHASH_FORKID) { | uint32_t flags = SCRIPT_ENABLE_SIGHASH_FORKID) { | ||||
uint256 hash = SignatureHash(script, CTransaction(spendTx), 0, | uint256 hash = SignatureHash(script, CTransaction(spendTx), 0, | ||||
sigHashType, amount, nullptr, flags); | sigHashType, amount, nullptr, flags); | ||||
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 &PushDataSig(const CKey &key, const uint256 &hash, | |||||
unsigned int lenR = 32, unsigned int lenS = 32) { | |||||
DoPush(DoSign(key, hash, lenR, lenS)); | |||||
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 762 Lines • ▼ Show 20 Lines | tests.push_back( | ||||
"P2PK REPLAY PROTECTED", | "P2PK REPLAY PROTECTED", | ||||
SCRIPT_ENABLE_SIGHASH_FORKID | | SCRIPT_ENABLE_SIGHASH_FORKID | | ||||
SCRIPT_ENABLE_REPLAY_PROTECTION, | SCRIPT_ENABLE_REPLAY_PROTECTION, | ||||
false, TEST_AMOUNT) | false, TEST_AMOUNT) | ||||
.PushSig(keys.key0, SigHashType().withForkId(), 32, 32, TEST_AMOUNT, | .PushSig(keys.key0, SigHashType().withForkId(), 32, 32, TEST_AMOUNT, | ||||
SCRIPT_ENABLE_SIGHASH_FORKID) | SCRIPT_ENABLE_SIGHASH_FORKID) | ||||
.ScriptError(SCRIPT_ERR_EVAL_FALSE)); | .ScriptError(SCRIPT_ERR_EVAL_FALSE)); | ||||
// Test OP_CHECKDATASIG | |||||
static const uint256 one(uint256S( | |||||
"0000000000000000000000000000000000000000000000000000000000000001")); | |||||
static const uint256 two(uint256S( | |||||
"0000000000000000000000000000000000000000000000000000000000000002")); | |||||
const uint32_t checkdatasigflags = SCRIPT_VERIFY_STRICTENC | | |||||
SCRIPT_VERIFY_NULLFAIL | | |||||
SCRIPT_ENABLE_CHECKDATASIG; | |||||
tests.push_back( | |||||
TestBuilder(CScript() << ToByteVector(keys.pubkey1C) << OP_CHECKDATASIG, | |||||
"Standard CHECKDATASIG", checkdatasigflags) | |||||
.PushDataSig(keys.key1, one) | |||||
.Push(one)); | |||||
tests.push_back(TestBuilder(CScript() << ToByteVector(keys.pubkey1C) | |||||
<< OP_CHECKDATASIG << OP_NOT, | |||||
"CHECKDATASIG with NULLFAIL flags", | |||||
checkdatasigflags) | |||||
.PushDataSig(keys.key1, one) | |||||
.Push(two) | |||||
.ScriptError(SCRIPT_ERR_SIG_NULLFAIL)); | |||||
tests.push_back(TestBuilder(CScript() << ToByteVector(keys.pubkey1C) | |||||
<< OP_CHECKDATASIG << OP_NOT, | |||||
"CHECKDATASIG without NULLFAIL flags", | |||||
checkdatasigflags & ~SCRIPT_VERIFY_NULLFAIL) | |||||
.PushDataSig(keys.key1, one) | |||||
.Push(two)); | |||||
tests.push_back(TestBuilder(CScript() << ToByteVector(keys.pubkey1C) | |||||
<< OP_CHECKDATASIG << OP_NOT, | |||||
"CHECKDATASIG empty signature", | |||||
checkdatasigflags) | |||||
.Num(0) | |||||
.Push(one)); | |||||
tests.push_back( | |||||
TestBuilder(CScript() << ToByteVector(keys.pubkey1C) << OP_CHECKDATASIG, | |||||
"CHECKDATASIG with High S but no Low S", checkdatasigflags) | |||||
.PushDataSig(keys.key1, one, 32, 33) | |||||
.Push(one)); | |||||
tests.push_back( | |||||
TestBuilder(CScript() << ToByteVector(keys.pubkey1C) << OP_CHECKDATASIG, | |||||
"CHECKDATASIG with High S", | |||||
checkdatasigflags | SCRIPT_VERIFY_LOW_S) | |||||
.PushDataSig(keys.key1, one, 32, 33) | |||||
.Push(one) | |||||
.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", | |||||
checkdatasigflags & ~SCRIPT_VERIFY_STRICTENC) | |||||
.PushDataSig(keys.key1, one, 33, 32) | |||||
.EditPush(1, "45022100", "440220") | |||||
.Push(one)); | |||||
tests.push_back( | |||||
TestBuilder(CScript() << ToByteVector(keys.pubkey1C) << OP_CHECKDATASIG, | |||||
"CHECKDATASIG with too little R padding", checkdatasigflags) | |||||
.PushDataSig(keys.key1, one, 33, 32) | |||||
.EditPush(1, "45022100", "440220") | |||||
.Push(one) | |||||
.ScriptError(SCRIPT_ERR_SIG_DER)); | |||||
tests.push_back( | |||||
TestBuilder(CScript() << ToByteVector(keys.pubkey0H) << OP_CHECKDATASIG, | |||||
"CHECKDATASIG with hybrid pubkey but no STRICTENC", | |||||
checkdatasigflags & ~SCRIPT_VERIFY_STRICTENC) | |||||
.PushDataSig(keys.key0, one) | |||||
.Push(one)); | |||||
tests.push_back( | |||||
TestBuilder(CScript() << ToByteVector(keys.pubkey0H) << OP_CHECKDATASIG, | |||||
"CHECKDATASIG with hybrid pubkey", checkdatasigflags) | |||||
.PushDataSig(keys.key0, one) | |||||
.Push(one) | |||||
.ScriptError(SCRIPT_ERR_PUBKEYTYPE)); | |||||
tests.push_back( | |||||
TestBuilder(CScript() << ToByteVector(keys.pubkey0H) << OP_CHECKDATASIG | |||||
<< OP_NOT, | |||||
"CHECKDATASIG with invalid hybrid pubkey but no STRICTENC", | |||||
SCRIPT_ENABLE_CHECKDATASIG) | |||||
.PushDataSig(keys.key0, one) | |||||
.DamagePush(10) | |||||
.Push(one)); | |||||
tests.push_back( | |||||
TestBuilder(CScript() << ToByteVector(keys.pubkey0H) << OP_CHECKDATASIG, | |||||
"CHECKDATASIG with invalid hybrid pubkey", | |||||
checkdatasigflags) | |||||
.PushDataSig(keys.key0, one) | |||||
.DamagePush(10) | |||||
.Push(one) | |||||
.ScriptError(SCRIPT_ERR_PUBKEYTYPE)); | |||||
// Test OP_CHECKDATASIGVERIFY | |||||
tests.push_back(TestBuilder(CScript() << ToByteVector(keys.pubkey1C) | |||||
<< OP_CHECKDATASIGVERIFY << OP_TRUE, | |||||
"Standard CHECKDATASIGVERIFY", | |||||
checkdatasigflags) | |||||
.PushDataSig(keys.key1, one) | |||||
.Push(one)); | |||||
tests.push_back(TestBuilder(CScript() << ToByteVector(keys.pubkey1C) | |||||
<< OP_CHECKDATASIGVERIFY << OP_TRUE, | |||||
"CHECKDATASIGVERIFY with NULLFAIL flags", | |||||
checkdatasigflags) | |||||
.PushDataSig(keys.key1, one) | |||||
.Push(two) | |||||
.ScriptError(SCRIPT_ERR_SIG_NULLFAIL)); | |||||
tests.push_back(TestBuilder(CScript() << ToByteVector(keys.pubkey1C) | |||||
<< OP_CHECKDATASIGVERIFY << OP_TRUE, | |||||
"CHECKDATASIGVERIFY without NULLFAIL flags", | |||||
checkdatasigflags & ~SCRIPT_VERIFY_NULLFAIL) | |||||
.PushDataSig(keys.key1, one) | |||||
.Push(two) | |||||
.ScriptError(SCRIPT_ERR_CHECKDATASIGVERIFY)); | |||||
tests.push_back(TestBuilder(CScript() << ToByteVector(keys.pubkey1C) | |||||
<< OP_CHECKDATASIGVERIFY << OP_TRUE, | |||||
"CHECKDATASIGVERIFY empty signature", | |||||
checkdatasigflags) | |||||
.Num(0) | |||||
.Push(one) | |||||
.ScriptError(SCRIPT_ERR_CHECKDATASIGVERIFY)); | |||||
tests.push_back(TestBuilder(CScript() << ToByteVector(keys.pubkey1C) | |||||
<< OP_CHECKDATASIGVERIFY << OP_TRUE, | |||||
"CHECKDATASIG with High S but no Low S", | |||||
checkdatasigflags) | |||||
.PushDataSig(keys.key1, one, 32, 33) | |||||
.Push(one)); | |||||
tests.push_back(TestBuilder(CScript() << ToByteVector(keys.pubkey1C) | |||||
<< OP_CHECKDATASIGVERIFY << OP_TRUE, | |||||
"CHECKDATASIG with High S", | |||||
checkdatasigflags | SCRIPT_VERIFY_LOW_S) | |||||
.PushDataSig(keys.key1, one, 32, 33) | |||||
.Push(one) | |||||
.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", | |||||
checkdatasigflags & ~SCRIPT_VERIFY_STRICTENC) | |||||
.PushDataSig(keys.key1, one, 33, 32) | |||||
.EditPush(1, "45022100", "440220") | |||||
.Push(one)); | |||||
tests.push_back(TestBuilder(CScript() << ToByteVector(keys.pubkey1C) | |||||
<< OP_CHECKDATASIGVERIFY << OP_TRUE, | |||||
"CHECKDATASIGVERIFY with too little R padding", | |||||
checkdatasigflags) | |||||
.PushDataSig(keys.key1, one, 33, 32) | |||||
.EditPush(1, "45022100", "440220") | |||||
.Push(one) | |||||
.ScriptError(SCRIPT_ERR_SIG_DER)); | |||||
tests.push_back( | |||||
TestBuilder(CScript() << ToByteVector(keys.pubkey0H) | |||||
<< OP_CHECKDATASIGVERIFY << OP_TRUE, | |||||
"CHECKDATASIGVERIFY with hybrid pubkey but no STRICTENC", | |||||
checkdatasigflags & ~SCRIPT_VERIFY_STRICTENC) | |||||
.PushDataSig(keys.key0, one) | |||||
.Push(one)); | |||||
tests.push_back(TestBuilder(CScript() << ToByteVector(keys.pubkey0H) | |||||
<< OP_CHECKDATASIGVERIFY << OP_TRUE, | |||||
"CHECKDATASIGVERIFY with hybrid pubkey", | |||||
checkdatasigflags) | |||||
.PushDataSig(keys.key0, one) | |||||
.Push(one) | |||||
.ScriptError(SCRIPT_ERR_PUBKEYTYPE)); | |||||
tests.push_back( | |||||
TestBuilder( | |||||
CScript() << ToByteVector(keys.pubkey0H) << OP_CHECKDATASIGVERIFY | |||||
<< OP_TRUE, | |||||
"CHECKDATASIGVERIFY with invalid hybrid pubkey but no STRICTENC", | |||||
SCRIPT_ENABLE_CHECKDATASIG) | |||||
.PushDataSig(keys.key0, one) | |||||
.DamagePush(10) | |||||
.Push(one) | |||||
.ScriptError(SCRIPT_ERR_CHECKDATASIGVERIFY)); | |||||
tests.push_back(TestBuilder(CScript() << ToByteVector(keys.pubkey0H) | |||||
<< OP_CHECKDATASIGVERIFY << OP_TRUE, | |||||
"CHECKDATASIGVERIFY with invalid hybrid pubkey", | |||||
checkdatasigflags) | |||||
.PushDataSig(keys.key0, one) | |||||
.DamagePush(10) | |||||
.Push(one) | |||||
.ScriptError(SCRIPT_ERR_PUBKEYTYPE)); | |||||
std::set<std::string> tests_set; | std::set<std::string> tests_set; | ||||
{ | { | ||||
UniValue json_tests = read_json(std::string( | UniValue json_tests = read_json(std::string( | ||||
json_tests::script_tests, | json_tests::script_tests, | ||||
json_tests::script_tests + sizeof(json_tests::script_tests))); | json_tests::script_tests + sizeof(json_tests::script_tests))); | ||||
for (unsigned int idx = 0; idx < json_tests.size(); idx++) { | for (unsigned int idx = 0; idx < json_tests.size(); idx++) { | ||||
▲ Show 20 Lines • Show All 754 Lines • Show Last 20 Lines |