signature_checker.cpp
1 // Copyright (c) 2009-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 <pubkey.h> 6 #include <script/interpreter.h> 7 #include <test/fuzz/FuzzedDataProvider.h> 8 #include <test/fuzz/fuzz.h> 9 #include <test/fuzz/util.h> 10 #include <test/util/script.h> 11 12 #include <cstdint> 13 #include <limits> 14 #include <string> 15 #include <vector> 16 17 namespace { 18 class FuzzedSignatureChecker : public BaseSignatureChecker 19 { 20 FuzzedDataProvider& m_fuzzed_data_provider; 21 22 public: 23 explicit FuzzedSignatureChecker(FuzzedDataProvider& fuzzed_data_provider) : m_fuzzed_data_provider(fuzzed_data_provider) 24 { 25 } 26 27 bool CheckECDSASignature(const std::vector<unsigned char>& scriptSig, const std::vector<unsigned char>& vchPubKey, const CScript& scriptCode, SigVersion sigversion) const override 28 { 29 return m_fuzzed_data_provider.ConsumeBool(); 30 } 31 32 bool CheckSchnorrSignature(std::span<const unsigned char> sig, std::span<const unsigned char> pubkey, SigVersion sigversion, ScriptExecutionData& execdata, ScriptError* serror = nullptr) const override 33 { 34 return m_fuzzed_data_provider.ConsumeBool(); 35 } 36 37 bool CheckLockTime(const CScriptNum& nLockTime) const override 38 { 39 return m_fuzzed_data_provider.ConsumeBool(); 40 } 41 42 bool CheckSequence(const CScriptNum& nSequence) const override 43 { 44 return m_fuzzed_data_provider.ConsumeBool(); 45 } 46 47 virtual ~FuzzedSignatureChecker() = default; 48 }; 49 } // namespace 50 51 FUZZ_TARGET(signature_checker) 52 { 53 FuzzedDataProvider fuzzed_data_provider(buffer.data(), buffer.size()); 54 const auto flags = script_verify_flags::from_int(fuzzed_data_provider.ConsumeIntegral<script_verify_flags::value_type>()); 55 const SigVersion sig_version = fuzzed_data_provider.PickValueInArray({SigVersion::BASE, SigVersion::WITNESS_V0}); 56 const auto script_1{ConsumeScript(fuzzed_data_provider)}; 57 const auto script_2{ConsumeScript(fuzzed_data_provider)}; 58 std::vector<std::vector<unsigned char>> stack; 59 (void)EvalScript(stack, script_1, flags, FuzzedSignatureChecker(fuzzed_data_provider), sig_version, nullptr); 60 if (!IsValidFlagCombination(flags)) { 61 return; 62 } 63 (void)VerifyScript(script_1, script_2, nullptr, flags, FuzzedSignatureChecker(fuzzed_data_provider), nullptr); 64 }