Changeset View
Changeset View
Standalone View
Standalone View
src/test/checkdatasig_tests.cpp
Show First 20 Lines • Show All 61 Lines • ▼ Show 20 Lines | |||||
/** | /** | ||||
* General utility functions to check for script passing/failing. | * General utility functions to check for script passing/failing. | ||||
*/ | */ | ||||
static void CheckTestResultForAllFlags(const stacktype &original_stack, | static void CheckTestResultForAllFlags(const stacktype &original_stack, | ||||
const CScript &script, | const CScript &script, | ||||
const stacktype &expected) { | const stacktype &expected) { | ||||
for (uint32_t flags : flagset) { | for (uint32_t flags : flagset) { | ||||
// The script executes as expected regardless of whether or not | // The script executes as expected regardless of whether or not | ||||
// SCRIPT_ENABLE_CHECKDATASIG flag is passed. | // SCRIPT_VERIFY_CHECKDATASIG_SIGOPS flag is passed. | ||||
CheckPass(flags & ~SCRIPT_ENABLE_CHECKDATASIG, original_stack, script, | CheckPass(flags & ~SCRIPT_VERIFY_CHECKDATASIG_SIGOPS, original_stack, | ||||
expected); | script, expected); | ||||
CheckPass(flags | SCRIPT_ENABLE_CHECKDATASIG, original_stack, script, | CheckPass(flags | SCRIPT_VERIFY_CHECKDATASIG_SIGOPS, original_stack, | ||||
expected); | script, expected); | ||||
} | } | ||||
} | } | ||||
static void CheckErrorForAllFlags(const stacktype &original_stack, | static void CheckErrorForAllFlags(const stacktype &original_stack, | ||||
const CScript &script, ScriptError expected) { | const CScript &script, ScriptError expected) { | ||||
for (uint32_t flags : flagset) { | for (uint32_t flags : flagset) { | ||||
// The script generates the proper error regardless of whether or not | // The script generates the proper error regardless of whether or not | ||||
// SCRIPT_ENABLE_CHECKDATASIG flag is passed. | // SCRIPT_VERIFY_CHECKDATASIG_SIGOPS flag is passed. | ||||
CheckError(flags & ~SCRIPT_ENABLE_CHECKDATASIG, original_stack, script, | CheckError(flags & ~SCRIPT_VERIFY_CHECKDATASIG_SIGOPS, original_stack, | ||||
expected); | script, expected); | ||||
CheckError(flags | SCRIPT_ENABLE_CHECKDATASIG, original_stack, script, | CheckError(flags | SCRIPT_VERIFY_CHECKDATASIG_SIGOPS, original_stack, | ||||
expected); | script, expected); | ||||
} | } | ||||
} | } | ||||
BOOST_AUTO_TEST_CASE(checkdatasig_test) { | BOOST_AUTO_TEST_CASE(checkdatasig_test) { | ||||
// Empty stack. | // Empty stack. | ||||
CheckErrorForAllFlags({}, CScript() << OP_CHECKDATASIG, | CheckErrorForAllFlags({}, CScript() << OP_CHECKDATASIG, | ||||
SCRIPT_ERR_INVALID_STACK_OPERATION); | SCRIPT_ERR_INVALID_STACK_OPERATION); | ||||
CheckErrorForAllFlags({{0x00}}, CScript() << OP_CHECKDATASIG, | CheckErrorForAllFlags({{0x00}}, CScript() << OP_CHECKDATASIG, | ||||
▲ Show 20 Lines • Show All 50 Lines • ▼ Show 20 Lines | const valtype highSSig{ | ||||
0x8e, 0xff, 0xec, 0x6b, 0x95, 0xc4, 0x12, 0x21, 0xc0, 0xcf, 0x3a, 0x8e, | 0x8e, 0xff, 0xec, 0x6b, 0x95, 0xc4, 0x12, 0x21, 0xc0, 0xcf, 0x3a, 0x8e, | ||||
0x6c, 0xcb, 0x8c, 0xbf, 0x17, 0x25, 0xb5, 0x62, 0xe9, 0xaf, 0xde, 0x2c, | 0x6c, 0xcb, 0x8c, 0xbf, 0x17, 0x25, 0xb5, 0x62, 0xe9, 0xaf, 0xde, 0x2c, | ||||
0x02, 0x21, 0x00, 0xab, 0x1e, 0x3d, 0xa7, 0x3d, 0x67, 0xe3, 0x20, 0x45, | 0x02, 0x21, 0x00, 0xab, 0x1e, 0x3d, 0xa7, 0x3d, 0x67, 0xe3, 0x20, 0x45, | ||||
0xa2, 0x0e, 0x0b, 0x99, 0x9e, 0x04, 0x99, 0x78, 0xea, 0x8d, 0x6e, 0xe5, | 0xa2, 0x0e, 0x0b, 0x99, 0x9e, 0x04, 0x99, 0x78, 0xea, 0x8d, 0x6e, 0xe5, | ||||
0x48, 0x0d, 0x48, 0x5f, 0xcf, 0x2c, 0xe0, 0xd0, 0x3b, 0x2e, 0xf0}; | 0x48, 0x0d, 0x48, 0x5f, 0xcf, 0x2c, 0xe0, 0xd0, 0x3b, 0x2e, 0xf0}; | ||||
MMIXLinearCongruentialGenerator lcg; | MMIXLinearCongruentialGenerator lcg; | ||||
for (int i = 0; i < 4096; i++) { | for (int i = 0; i < 4096; i++) { | ||||
uint32_t flags = lcg.next() | SCRIPT_ENABLE_CHECKDATASIG; | uint32_t flags = lcg.next() | SCRIPT_VERIFY_CHECKDATASIG_SIGOPS; | ||||
if (flags & SCRIPT_VERIFY_STRICTENC) { | if (flags & SCRIPT_VERIFY_STRICTENC) { | ||||
// When strict encoding is enforced, hybrid keys are invalid. | // When strict encoding is enforced, hybrid keys are invalid. | ||||
CheckError(flags, {{}, message, pubkeyH}, script, | CheckError(flags, {{}, message, pubkeyH}, script, | ||||
SCRIPT_ERR_PUBKEYTYPE); | SCRIPT_ERR_PUBKEYTYPE); | ||||
CheckError(flags, {{}, message, pubkeyH}, scriptverify, | CheckError(flags, {{}, message, pubkeyH}, scriptverify, | ||||
SCRIPT_ERR_PUBKEYTYPE); | SCRIPT_ERR_PUBKEYTYPE); | ||||
} else if (flags & SCRIPT_VERIFY_COMPRESSED_PUBKEYTYPE) { | } else if (flags & SCRIPT_VERIFY_COMPRESSED_PUBKEYTYPE) { | ||||
▲ Show 20 Lines • Show All 84 Lines • ▼ Show 20 Lines | for (int i = 0; i < 4096; i++) { | ||||
CheckPass(flags, {nondersig, message, pubkeyC}, script, {}); | CheckPass(flags, {nondersig, message, pubkeyC}, script, {}); | ||||
CheckError(flags, {nondersig, message, pubkeyC}, scriptverify, | CheckError(flags, {nondersig, message, pubkeyC}, scriptverify, | ||||
SCRIPT_ERR_CHECKDATASIGVERIFY); | SCRIPT_ERR_CHECKDATASIGVERIFY); | ||||
} | } | ||||
} | } | ||||
} | } | ||||
BOOST_AUTO_TEST_CASE(checkdatasig_inclusion_in_standard_and_mandatory_flags) { | BOOST_AUTO_TEST_CASE(checkdatasig_inclusion_in_standard_and_mandatory_flags) { | ||||
BOOST_CHECK(STANDARD_SCRIPT_VERIFY_FLAGS & SCRIPT_ENABLE_CHECKDATASIG); | BOOST_CHECK(STANDARD_SCRIPT_VERIFY_FLAGS & | ||||
BOOST_CHECK(!(MANDATORY_SCRIPT_VERIFY_FLAGS & SCRIPT_ENABLE_CHECKDATASIG)); | SCRIPT_VERIFY_CHECKDATASIG_SIGOPS); | ||||
BOOST_CHECK( | |||||
!(MANDATORY_SCRIPT_VERIFY_FLAGS & SCRIPT_VERIFY_CHECKDATASIG_SIGOPS)); | |||||
} | } | ||||
BOOST_AUTO_TEST_SUITE_END() | BOOST_AUTO_TEST_SUITE_END() |