12
12
#include < consensus/consensus.h>
13
13
#include < primitives/transaction.h>
14
14
#include < script/script.h>
15
+ #include < script/standard.h>
15
16
#include < serialize.h>
16
17
#include < streams.h>
17
18
#include < test/fuzz/FuzzedDataProvider.h>
20
21
#include < uint256.h>
21
22
#include < version.h>
22
23
24
+ #include < algorithm>
23
25
#include < cstdint>
24
26
#include < optional>
25
27
#include < string>
@@ -31,6 +33,11 @@ NODISCARD inline std::vector<uint8_t> ConsumeRandomLengthByteVector(FuzzedDataPr
31
33
return {s.begin (), s.end ()};
32
34
}
33
35
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
+
34
41
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
35
42
{
36
43
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
87
94
return CScriptNum{fuzzed_data_provider.ConsumeIntegral <int64_t >()};
88
95
}
89
96
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
+
90
106
NODISCARD inline uint256 ConsumeUInt256 (FuzzedDataProvider& fuzzed_data_provider) noexcept
91
107
{
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 ) {
94
110
return {};
95
111
}
96
112
return uint256{v256};
@@ -116,6 +132,43 @@ NODISCARD inline CTxMemPoolEntry ConsumeTxMemPoolEntry(FuzzedDataProvider& fuzze
116
132
return CTxMemPoolEntry{MakeTransactionRef (tx), fee, time, entry_height, spends_coinbase, sig_op_cost, {}};
117
133
}
118
134
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
+
119
172
template <typename T>
120
173
NODISCARD bool MultiplicationOverflow (const T i, const T j) noexcept
121
174
{
0 commit comments