script_sigcache.cpp raw

   1  // Copyright (c) 2020-present 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  {
  23      static const auto testing_setup = MakeNoLogFileContext<>();
  24  }
  25  
  26  FUZZ_TARGET(script_sigcache, .init = initialize_script_sigcache)
  27  {
  28      SeedRandomStateForTest(SeedRand::ZEROS);
  29      FuzzedDataProvider fuzzed_data_provider(buffer.data(), buffer.size());
  30  
  31      const auto max_sigcache_bytes{fuzzed_data_provider.ConsumeIntegralInRange<size_t>(0, DEFAULT_SIGNATURE_CACHE_BYTES)};
  32      SignatureCache signature_cache{max_sigcache_bytes};
  33  
  34      const std::optional<CMutableTransaction> mutable_transaction = ConsumeDeserializable<CMutableTransaction>(fuzzed_data_provider, TX_WITH_WITNESS);
  35      const CTransaction tx{mutable_transaction ? *mutable_transaction : CMutableTransaction{}};
  36      const unsigned int n_in = fuzzed_data_provider.ConsumeIntegral<unsigned int>();
  37      const CAmount amount = ConsumeMoney(fuzzed_data_provider);
  38      const bool store = fuzzed_data_provider.ConsumeBool();
  39      PrecomputedTransactionData tx_data;
  40      CachingTransactionSignatureChecker caching_transaction_signature_checker{mutable_transaction ? &tx : nullptr, n_in, amount, store, signature_cache, tx_data};
  41      if (fuzzed_data_provider.ConsumeBool()) {
  42          const auto random_bytes = fuzzed_data_provider.ConsumeBytes<unsigned char>(64);
  43          const XOnlyPubKey pub_key(ConsumeUInt256(fuzzed_data_provider));
  44          if (random_bytes.size() == 64) {
  45              (void)caching_transaction_signature_checker.VerifySchnorrSignature(random_bytes, pub_key, ConsumeUInt256(fuzzed_data_provider));
  46          }
  47      } else {
  48          const auto random_bytes = ConsumeRandomLengthByteVector(fuzzed_data_provider);
  49          const auto pub_key = ConsumeDeserializable<CPubKey>(fuzzed_data_provider);
  50          if (pub_key) {
  51              if (!random_bytes.empty()) {
  52                  (void)caching_transaction_signature_checker.VerifyECDSASignature(random_bytes, *pub_key, ConsumeUInt256(fuzzed_data_provider));
  53              }
  54          }
  55      }
  56  }
  57