3
3
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
4
4
5
5
#include < chainparams.h>
6
+ #include < hash.h>
6
7
#include < net.h>
7
8
#include < netmessagemaker.h>
8
9
#include < protocol.h>
10
+ #include < test/fuzz/FuzzedDataProvider.h>
9
11
#include < test/fuzz/fuzz.h>
10
12
11
13
#include < cassert>
@@ -24,7 +26,25 @@ FUZZ_TARGET_INIT(p2p_transport_serialization, initialize_p2p_transport_serializa
24
26
// Construct deserializer, with a dummy NodeId
25
27
V1TransportDeserializer deserializer{Params (), (NodeId)0 , SER_NETWORK, INIT_PROTO_VERSION};
26
28
V1TransportSerializer serializer{};
27
- Span<const uint8_t > msg_bytes{buffer};
29
+ FuzzedDataProvider fuzzed_data_provider{buffer.data (), buffer.size ()};
30
+
31
+ auto checksum_assist = fuzzed_data_provider.ConsumeBool ();
32
+ int header_random_bytes_count = checksum_assist ? CMessageHeader::CHECKSUM_OFFSET : CMessageHeader :: HEADER_SIZE;
33
+ auto mutable_msg_bytes = fuzzed_data_provider.ConsumeBytes <uint8_t >(header_random_bytes_count);
34
+ auto payload_bytes = fuzzed_data_provider.ConsumeRemainingBytes <uint8_t >();
35
+
36
+ if (checksum_assist && mutable_msg_bytes.size () == CMessageHeader::CHECKSUM_OFFSET) {
37
+ CHash256 hasher;
38
+ unsigned char hsh[32 ];
39
+ hasher.Write (payload_bytes);
40
+ hasher.Finalize (hsh);
41
+ for (size_t i = 0 ; i < CMessageHeader::CHECKSUM_SIZE; ++i) {
42
+ mutable_msg_bytes.push_back (hsh[i]);
43
+ }
44
+ }
45
+
46
+ mutable_msg_bytes.insert (mutable_msg_bytes.end (), payload_bytes.begin (), payload_bytes.end ());
47
+ Span<const uint8_t > msg_bytes{mutable_msg_bytes};
28
48
while (msg_bytes.size () > 0 ) {
29
49
const int handled = deserializer.Read (msg_bytes);
30
50
if (handled < 0 ) {
@@ -36,7 +56,7 @@ FUZZ_TARGET_INIT(p2p_transport_serialization, initialize_p2p_transport_serializa
36
56
std::optional<CNetMessage> result{deserializer.GetMessage (m_time, out_err_raw_size)};
37
57
if (result) {
38
58
assert (result->m_command .size () <= CMessageHeader::COMMAND_SIZE);
39
- assert (result->m_raw_message_size <= buffer .size ());
59
+ assert (result->m_raw_message_size <= mutable_msg_bytes .size ());
40
60
assert (result->m_raw_message_size == CMessageHeader::HEADER_SIZE + result->m_message_size );
41
61
assert (result->m_time == m_time);
42
62
0 commit comments