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