Skip to content

Commit c571ecb

Browse files
tests: Add fuzzing helper functions ConsumeDataStream, ConsumeTxDestination and ConsumeUInt160
1 parent c19fd96 commit c571ecb

File tree

1 file changed

+55
-2
lines changed

1 file changed

+55
-2
lines changed

src/test/fuzz/util.h

Lines changed: 55 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
#include <consensus/consensus.h>
1313
#include <primitives/transaction.h>
1414
#include <script/script.h>
15+
#include <script/standard.h>
1516
#include <serialize.h>
1617
#include <streams.h>
1718
#include <test/fuzz/FuzzedDataProvider.h>
@@ -20,6 +21,7 @@
2021
#include <uint256.h>
2122
#include <version.h>
2223

24+
#include <algorithm>
2325
#include <cstdint>
2426
#include <optional>
2527
#include <string>
@@ -31,6 +33,11 @@ NODISCARD inline std::vector<uint8_t> ConsumeRandomLengthByteVector(FuzzedDataPr
3133
return {s.begin(), s.end()};
3234
}
3335

36+
NODISCARD inline CDataStream ConsumeDataStream(FuzzedDataProvider& fuzzed_data_provider, const size_t max_length = 4096) noexcept
37+
{
38+
return {ConsumeRandomLengthByteVector(fuzzed_data_provider, max_length), SER_NETWORK, INIT_PROTO_VERSION};
39+
}
40+
3441
NODISCARD inline std::vector<std::string> ConsumeRandomLengthStringVector(FuzzedDataProvider& fuzzed_data_provider, const size_t max_vector_size = 16, const size_t max_string_length = 16) noexcept
3542
{
3643
const size_t n_elements = fuzzed_data_provider.ConsumeIntegralInRange<size_t>(0, max_vector_size);
@@ -87,10 +94,19 @@ NODISCARD inline CScriptNum ConsumeScriptNum(FuzzedDataProvider& fuzzed_data_pro
8794
return CScriptNum{fuzzed_data_provider.ConsumeIntegral<int64_t>()};
8895
}
8996

97+
NODISCARD inline uint160 ConsumeUInt160(FuzzedDataProvider& fuzzed_data_provider) noexcept
98+
{
99+
const std::vector<uint8_t> v160 = fuzzed_data_provider.ConsumeBytes<uint8_t>(160 / 8);
100+
if (v160.size() != 160 / 8) {
101+
return {};
102+
}
103+
return uint160{v160};
104+
}
105+
90106
NODISCARD inline uint256 ConsumeUInt256(FuzzedDataProvider& fuzzed_data_provider) noexcept
91107
{
92-
const std::vector<unsigned char> v256 = fuzzed_data_provider.ConsumeBytes<unsigned char>(sizeof(uint256));
93-
if (v256.size() != sizeof(uint256)) {
108+
const std::vector<uint8_t> v256 = fuzzed_data_provider.ConsumeBytes<uint8_t>(256 / 8);
109+
if (v256.size() != 256 / 8) {
94110
return {};
95111
}
96112
return uint256{v256};
@@ -116,6 +132,43 @@ NODISCARD inline CTxMemPoolEntry ConsumeTxMemPoolEntry(FuzzedDataProvider& fuzze
116132
return CTxMemPoolEntry{MakeTransactionRef(tx), fee, time, entry_height, spends_coinbase, sig_op_cost, {}};
117133
}
118134

135+
NODISCARD inline CTxDestination ConsumeTxDestination(FuzzedDataProvider& fuzzed_data_provider) noexcept
136+
{
137+
CTxDestination tx_destination;
138+
switch (fuzzed_data_provider.ConsumeIntegralInRange<int>(0, 5)) {
139+
case 0: {
140+
tx_destination = CNoDestination{};
141+
break;
142+
}
143+
case 1: {
144+
tx_destination = PKHash{ConsumeUInt160(fuzzed_data_provider)};
145+
break;
146+
}
147+
case 2: {
148+
tx_destination = ScriptHash{ConsumeUInt160(fuzzed_data_provider)};
149+
break;
150+
}
151+
case 3: {
152+
tx_destination = WitnessV0ScriptHash{ConsumeUInt256(fuzzed_data_provider)};
153+
break;
154+
}
155+
case 4: {
156+
tx_destination = WitnessV0KeyHash{ConsumeUInt160(fuzzed_data_provider)};
157+
break;
158+
}
159+
case 5: {
160+
WitnessUnknown witness_unknown{};
161+
witness_unknown.version = fuzzed_data_provider.ConsumeIntegral<int>();
162+
const std::vector<uint8_t> witness_unknown_program_1 = fuzzed_data_provider.ConsumeBytes<uint8_t>(40);
163+
witness_unknown.length = witness_unknown_program_1.size();
164+
std::copy(witness_unknown_program_1.begin(), witness_unknown_program_1.end(), witness_unknown.program);
165+
tx_destination = witness_unknown;
166+
break;
167+
}
168+
}
169+
return tx_destination;
170+
}
171+
119172
template <typename T>
120173
NODISCARD bool MultiplicationOverflow(const T i, const T j) noexcept
121174
{

0 commit comments

Comments
 (0)