mirror of
https://github.com/bitcoin/bitcoin.git
synced 2025-01-19 05:45:05 +01:00
Make test DoS_mapOrphans deterministic
The RandomOrphan function and the function ecdsa_signature_parse_der_lax in pubkey.cpp were causing non-deterministic test coverage. Force seed in the beginning of the test to make it deterministic. The seed is selected carefully so that all branches of the function ecdsa_signature_parse_der_lax are executed. Prior to this fix, the test was exhibiting non-deterministic coverage since none of the ECDSA signatures that were generated during the test had leading zeroes in either R, S, or both, resulting in some branches of said function not being executed. The seed ensures that both conditions are hit. Removed denialofservice_tests test entry from the list of non-deterministic tests in the coverage script.
This commit is contained in:
parent
090d877160
commit
4455949d6f
@ -16,7 +16,6 @@ GCOV_EXECUTABLE="gcov"
|
||||
NON_DETERMINISTIC_TESTS=(
|
||||
"blockfilter_index_tests/blockfilter_index_initial_sync" # src/checkqueue.h: In CCheckQueue::Loop(): while (queue.empty()) { ... }
|
||||
"coinselector_tests/knapsack_solver_test" # coinselector_tests.cpp: if (equal_sets(setCoinsRet, setCoinsRet2))
|
||||
"denialofservice_tests/DoS_mapOrphans" # denialofservice_tests.cpp: it = mapOrphanTransactions.lower_bound(InsecureRand256());
|
||||
"fs_tests/fsbridge_fstream" # deterministic test failure?
|
||||
"miner_tests/CreateNewBlock_validity" # validation.cpp: if (GetMainSignals().CallbacksPending() > 10)
|
||||
"scheduler_tests/manythreads" # scheduler.cpp: CScheduler::serviceQueue()
|
||||
|
@ -4,10 +4,12 @@
|
||||
|
||||
// Unit tests for denial-of-service detection/prevention code
|
||||
|
||||
#include <arith_uint256.h>
|
||||
#include <banman.h>
|
||||
#include <chainparams.h>
|
||||
#include <net.h>
|
||||
#include <net_processing.h>
|
||||
#include <pubkey.h>
|
||||
#include <script/sign.h>
|
||||
#include <script/signingprovider.h>
|
||||
#include <script/standard.h>
|
||||
@ -314,10 +316,26 @@ static CTransactionRef RandomOrphan()
|
||||
return it->second.tx;
|
||||
}
|
||||
|
||||
static void MakeNewKeyWithFastRandomContext(CKey& key)
|
||||
{
|
||||
std::vector<unsigned char> keydata;
|
||||
keydata = g_insecure_rand_ctx.randbytes(32);
|
||||
key.Set(keydata.data(), keydata.data() + keydata.size(), /*fCompressedIn*/ true);
|
||||
assert(key.IsValid());
|
||||
}
|
||||
|
||||
BOOST_AUTO_TEST_CASE(DoS_mapOrphans)
|
||||
{
|
||||
// This test had non-deterministic coverage due to
|
||||
// randomly selected seeds.
|
||||
// This seed is chosen so that all branches of the function
|
||||
// ecdsa_signature_parse_der_lax are executed during this test.
|
||||
// Specifically branches that run only when an ECDSA
|
||||
// signature's R and S values have leading zeros.
|
||||
g_insecure_rand_ctx = FastRandomContext(ArithToUint256(arith_uint256(33)));
|
||||
|
||||
CKey key;
|
||||
key.MakeNewKey(true);
|
||||
MakeNewKeyWithFastRandomContext(key);
|
||||
FillableSigningProvider keystore;
|
||||
BOOST_CHECK(keystore.AddKey(key));
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user