Skip to content

Commit d3d8adb

Browse files
tests: Add fuzzing harness for functions in script/interpreter.h
1 parent fa80117 commit d3d8adb

File tree

2 files changed

+48
-0
lines changed

2 files changed

+48
-0
lines changed

src/Makefile.test.include

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -114,6 +114,7 @@ FUZZ_TARGETS = \
114114
test/fuzz/script_descriptor_cache \
115115
test/fuzz/script_deserialize \
116116
test/fuzz/script_flags \
117+
test/fuzz/script_interpreter \
117118
test/fuzz/script_ops \
118119
test/fuzz/scriptnum_ops \
119120
test/fuzz/service_deserialize \
@@ -967,6 +968,12 @@ test_fuzz_script_flags_LDADD = $(FUZZ_SUITE_LD_COMMON)
967968
test_fuzz_script_flags_LDFLAGS = $(RELDFLAGS) $(AM_LDFLAGS) $(LIBTOOL_APP_LDFLAGS)
968969
test_fuzz_script_flags_SOURCES = test/fuzz/script_flags.cpp
969970

971+
test_fuzz_script_interpreter_CPPFLAGS = $(AM_CPPFLAGS) $(BITCOIN_INCLUDES)
972+
test_fuzz_script_interpreter_CXXFLAGS = $(AM_CXXFLAGS) $(PIE_FLAGS)
973+
test_fuzz_script_interpreter_LDADD = $(FUZZ_SUITE_LD_COMMON)
974+
test_fuzz_script_interpreter_LDFLAGS = $(RELDFLAGS) $(AM_LDFLAGS) $(LIBTOOL_APP_LDFLAGS)
975+
test_fuzz_script_interpreter_SOURCES = test/fuzz/script_interpreter.cpp
976+
970977
test_fuzz_script_ops_CPPFLAGS = $(AM_CPPFLAGS) $(BITCOIN_INCLUDES)
971978
test_fuzz_script_ops_CXXFLAGS = $(AM_CXXFLAGS) $(PIE_FLAGS)
972979
test_fuzz_script_ops_LDADD = $(FUZZ_SUITE_LD_COMMON)

src/test/fuzz/script_interpreter.cpp

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
// Copyright (c) 2020 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 <primitives/transaction.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+
11+
#include <cstdint>
12+
#include <optional>
13+
#include <string>
14+
#include <vector>
15+
16+
bool CastToBool(const std::vector<unsigned char>& vch);
17+
18+
void test_one_input(const std::vector<uint8_t>& buffer)
19+
{
20+
FuzzedDataProvider fuzzed_data_provider(buffer.data(), buffer.size());
21+
{
22+
const CScript script_code = ConsumeScript(fuzzed_data_provider);
23+
const std::optional<CMutableTransaction> mtx = ConsumeDeserializable<CMutableTransaction>(fuzzed_data_provider);
24+
if (mtx) {
25+
const CTransaction tx_to{*mtx};
26+
const unsigned int in = fuzzed_data_provider.ConsumeIntegral<unsigned int>();
27+
if (in < tx_to.vin.size()) {
28+
(void)SignatureHash(script_code, tx_to, in, fuzzed_data_provider.ConsumeIntegral<int>(), ConsumeMoney(fuzzed_data_provider), fuzzed_data_provider.PickValueInArray({SigVersion::BASE, SigVersion::WITNESS_V0}), nullptr);
29+
const std::optional<CMutableTransaction> mtx_precomputed = ConsumeDeserializable<CMutableTransaction>(fuzzed_data_provider);
30+
if (mtx_precomputed) {
31+
const CTransaction tx_precomputed{*mtx_precomputed};
32+
const PrecomputedTransactionData precomputed_transaction_data{tx_precomputed};
33+
(void)SignatureHash(script_code, tx_to, in, fuzzed_data_provider.ConsumeIntegral<int>(), ConsumeMoney(fuzzed_data_provider), fuzzed_data_provider.PickValueInArray({SigVersion::BASE, SigVersion::WITNESS_V0}), &precomputed_transaction_data);
34+
}
35+
}
36+
}
37+
}
38+
{
39+
(void)CastToBool(ConsumeRandomLengthByteVector(fuzzed_data_provider));
40+
}
41+
}

0 commit comments

Comments
 (0)