Changeset View
Changeset View
Standalone View
Standalone View
src/test/sigencoding_tests.cpp
Show First 20 Lines • Show All 171 Lines • ▼ Show 20 Lines | for (int i = 0; i < 4096; i++) { | ||||
ScriptError err = SCRIPT_ERR_OK; | ScriptError err = SCRIPT_ERR_OK; | ||||
// Empty sig is always valid. | // Empty sig is always valid. | ||||
BOOST_CHECK(CheckDataSignatureEncoding({}, flags, &err)); | BOOST_CHECK(CheckDataSignatureEncoding({}, flags, &err)); | ||||
BOOST_CHECK(CheckTransactionSignatureEncoding({}, flags, &err)); | BOOST_CHECK(CheckTransactionSignatureEncoding({}, flags, &err)); | ||||
BOOST_CHECK(CheckTransactionECDSASignatureEncoding({}, flags, &err)); | BOOST_CHECK(CheckTransactionECDSASignatureEncoding({}, flags, &err)); | ||||
// Signature are valid as long as the forkid flag is correct. | // Signatures are valid as long as the forkid flag is correct. | ||||
CheckSignatureEncodingWithSigHashType(minimalSig, flags); | CheckSignatureEncodingWithSigHashType(minimalSig, flags); | ||||
if (flags & SCRIPT_VERIFY_LOW_S) { | if (flags & SCRIPT_VERIFY_LOW_S) { | ||||
// If we do enforce low S, then high S sigs are rejected. | // If we do enforce low S, then high S sigs are rejected. | ||||
BOOST_CHECK(!CheckDataSignatureEncoding(highSSig, flags, &err)); | BOOST_CHECK(!CheckDataSignatureEncoding(highSSig, flags, &err)); | ||||
BOOST_CHECK_EQUAL(err, SCRIPT_ERR_SIG_HIGH_S); | BOOST_CHECK_EQUAL(err, SCRIPT_ERR_SIG_HIGH_S); | ||||
} else { | } else { | ||||
// If we do not enforce low S, then high S sigs are accepted. | // If we do not enforce low S, then high S sigs are accepted. | ||||
▲ Show 20 Lines • Show All 176 Lines • ▼ Show 20 Lines | for (int i = 0; i < 4096; i++) { | ||||
BOOST_CHECK_EQUAL(err, hasStrictEnc | BOOST_CHECK_EQUAL(err, hasStrictEnc | ||||
? SCRIPT_ERR_PUBKEYTYPE | ? SCRIPT_ERR_PUBKEYTYPE | ||||
: SCRIPT_ERR_NONCOMPRESSED_PUBKEY); | : SCRIPT_ERR_NONCOMPRESSED_PUBKEY); | ||||
} | } | ||||
} | } | ||||
} | } | ||||
} | } | ||||
BOOST_AUTO_TEST_CASE(checkschnorr_test) { | |||||
// tests using 64 byte sigs (+hashtype byte where relevant) | |||||
valtype Zero64{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | |||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | |||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | |||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | |||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | |||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | |||||
0x00, 0x00, 0x00, 0x00}; | |||||
valtype DER64{0x30, 0x3e, 0x02, 0x1d, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, | |||||
0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, | |||||
0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, | |||||
0x44, 0x44, 0x44, 0x02, 0x1d, 0x44, 0x44, 0x44, 0x44, 0x44, | |||||
0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, | |||||
0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, 0x44, | |||||
0x44, 0x44, 0x44, 0x44}; | |||||
BOOST_REQUIRE_EQUAL(Zero64.size(), 64); | |||||
BOOST_REQUIRE_EQUAL(DER64.size(), 64); | |||||
MMIXLinearCongruentialGenerator lcg; | |||||
for (int i = 0; i < 4096; i++) { | |||||
uint32_t flags = lcg.next(); | |||||
const bool hasForkId = (flags & SCRIPT_ENABLE_SIGHASH_FORKID) != 0; | |||||
const bool hasSchnorr = (flags & SCRIPT_ENABLE_SCHNORR) != 0; | |||||
const bool hasStricts = | |||||
(flags & (SCRIPT_VERIFY_DERSIG | SCRIPT_VERIFY_LOW_S | | |||||
SCRIPT_VERIFY_STRICTENC)) != 0; | |||||
ScriptError err = SCRIPT_ERR_OK; | |||||
valtype DER65_hb = | |||||
SignatureWithHashType(DER64, SigHashType().withForkId(hasForkId)); | |||||
valtype Zero65_hb = | |||||
SignatureWithHashType(Zero64, SigHashType().withForkId(hasForkId)); | |||||
BOOST_CHECK(CheckDataSignatureEncoding(DER64, flags, &err)); | |||||
BOOST_CHECK(CheckTransactionSignatureEncoding(DER65_hb, flags, &err)); | |||||
BOOST_CHECK_EQUAL( | |||||
!CheckTransactionECDSASignatureEncoding(DER65_hb, flags, &err), | |||||
hasSchnorr); | |||||
if (hasSchnorr) { | |||||
BOOST_CHECK_EQUAL(err, SCRIPT_ERR_SIG_BADLENGTH); | |||||
} | |||||
if (hasSchnorr) { | |||||
BOOST_CHECK(CheckDataSignatureEncoding(Zero64, flags, &err)); | |||||
BOOST_CHECK( | |||||
CheckTransactionSignatureEncoding(Zero65_hb, flags, &err)); | |||||
BOOST_CHECK(!CheckTransactionECDSASignatureEncoding(Zero65_hb, | |||||
flags, &err)); | |||||
BOOST_CHECK_EQUAL(err, SCRIPT_ERR_SIG_BADLENGTH); | |||||
} else { | |||||
BOOST_CHECK_EQUAL(!CheckDataSignatureEncoding(Zero64, flags, &err), | |||||
hasStricts); | |||||
if (hasStricts) { | |||||
BOOST_CHECK_EQUAL(err, SCRIPT_ERR_SIG_DER); | |||||
} | |||||
BOOST_CHECK_EQUAL( | |||||
!CheckTransactionSignatureEncoding(Zero65_hb, flags, &err), | |||||
hasStricts); | |||||
if (hasStricts) { | |||||
BOOST_CHECK_EQUAL(err, SCRIPT_ERR_SIG_DER); | |||||
} | |||||
BOOST_CHECK_EQUAL( | |||||
!CheckTransactionECDSASignatureEncoding(Zero65_hb, flags, &err), | |||||
hasStricts); | |||||
if (hasStricts) { | |||||
BOOST_CHECK_EQUAL(err, SCRIPT_ERR_SIG_DER); | |||||
} | |||||
} | |||||
} | |||||
} | |||||
BOOST_AUTO_TEST_SUITE_END() | BOOST_AUTO_TEST_SUITE_END() |