/root/bitcoin/src/test/fuzz/script_sigcache.cpp
Line | Count | Source (jump to first uncovered line) |
1 | | // Copyright (c) 2020-2022 The Bitcoin Core developers |
2 | | // Distributed under the MIT software license, see the accompanying |
3 | | // file COPYING or http://www.opensource.org/licenses/mit-license.php. |
4 | | |
5 | | #include <consensus/amount.h> |
6 | | #include <primitives/transaction.h> |
7 | | #include <pubkey.h> |
8 | | #include <script/interpreter.h> |
9 | | #include <script/sigcache.h> |
10 | | #include <span.h> |
11 | | #include <test/fuzz/FuzzedDataProvider.h> |
12 | | #include <test/fuzz/fuzz.h> |
13 | | #include <test/fuzz/util.h> |
14 | | #include <test/util/setup_common.h> |
15 | | #include <uint256.h> |
16 | | |
17 | | #include <cstddef> |
18 | | #include <optional> |
19 | | #include <vector> |
20 | | |
21 | | void initialize_script_sigcache() |
22 | 0 | { |
23 | 0 | static const auto testing_setup = MakeNoLogFileContext<>(); |
24 | 0 | } |
25 | | |
26 | | FUZZ_TARGET(script_sigcache, .init = initialize_script_sigcache) |
27 | 0 | { |
28 | 0 | FuzzedDataProvider fuzzed_data_provider(buffer.data(), buffer.size()); |
29 | |
|
30 | 0 | const auto max_sigcache_bytes{fuzzed_data_provider.ConsumeIntegralInRange<size_t>(0, DEFAULT_SIGNATURE_CACHE_BYTES)}; |
31 | 0 | SignatureCache signature_cache{max_sigcache_bytes}; |
32 | |
|
33 | 0 | const std::optional<CMutableTransaction> mutable_transaction = ConsumeDeserializable<CMutableTransaction>(fuzzed_data_provider, TX_WITH_WITNESS); |
34 | 0 | const CTransaction tx{mutable_transaction ? *mutable_transaction : CMutableTransaction{}}; |
35 | 0 | const unsigned int n_in = fuzzed_data_provider.ConsumeIntegral<unsigned int>(); |
36 | 0 | const CAmount amount = ConsumeMoney(fuzzed_data_provider); |
37 | 0 | const bool store = fuzzed_data_provider.ConsumeBool(); |
38 | 0 | PrecomputedTransactionData tx_data; |
39 | 0 | CachingTransactionSignatureChecker caching_transaction_signature_checker{mutable_transaction ? &tx : nullptr, n_in, amount, store, signature_cache, tx_data}; |
40 | 0 | if (fuzzed_data_provider.ConsumeBool()) { |
41 | 0 | const auto random_bytes = fuzzed_data_provider.ConsumeBytes<unsigned char>(64); |
42 | 0 | const XOnlyPubKey pub_key(ConsumeUInt256(fuzzed_data_provider)); |
43 | 0 | if (random_bytes.size() == 64) { |
44 | 0 | (void)caching_transaction_signature_checker.VerifySchnorrSignature(random_bytes, pub_key, ConsumeUInt256(fuzzed_data_provider)); |
45 | 0 | } |
46 | 0 | } else { |
47 | 0 | const auto random_bytes = ConsumeRandomLengthByteVector(fuzzed_data_provider); |
48 | 0 | const auto pub_key = ConsumeDeserializable<CPubKey>(fuzzed_data_provider); |
49 | 0 | if (pub_key) { |
50 | 0 | if (!random_bytes.empty()) { |
51 | 0 | (void)caching_transaction_signature_checker.VerifyECDSASignature(random_bytes, *pub_key, ConsumeUInt256(fuzzed_data_provider)); |
52 | 0 | } |
53 | 0 | } |
54 | 0 | } |
55 | 0 | } |