4
4
5
5
#include < compat/endian.h>
6
6
#include < crypto/chacha_poly_aead.h>
7
+ #include < crypto/poly1305.h>
7
8
#include < key.h>
8
9
#include < net.h>
9
10
#include < netmessagemaker.h>
14
15
15
16
FUZZ_TARGET (p2p_v2_transport_serialization)
16
17
{
17
- CPrivKey k1 (32 , 0 );
18
- CPrivKey k2 (32 , 0 );
18
+ CPrivKey k1 (CHACHA20_POLY1305_AEAD_KEY_LEN , 0 );
19
+ CPrivKey k2 (CHACHA20_POLY1305_AEAD_KEY_LEN , 0 );
19
20
20
21
// Construct deserializer, with a dummy NodeId
21
22
V2TransportDeserializer deserializer{(NodeId)0 , k1, k2};
22
23
V2TransportSerializer serializer{k1, k2};
23
24
FuzzedDataProvider fuzzed_data_provider{buffer.data (), buffer.size ()};
24
25
25
26
bool length_assist = fuzzed_data_provider.ConsumeBool ();
27
+
28
+ // There is no sense in providing a mac assist if the length is incorrect.
29
+ bool mac_assist = length_assist && fuzzed_data_provider.ConsumeBool ();
26
30
auto payload_bytes = fuzzed_data_provider.ConsumeRemainingBytes <uint8_t >();
27
31
28
- if (length_assist && payload_bytes.size () >= CHACHA20_POLY1305_AEAD_AAD_LEN + CHACHA20_POLY1305_AEAD_TAG_LEN) {
29
- uint32_t packet_length = payload_bytes.size () - CHACHA20_POLY1305_AEAD_AAD_LEN - CHACHA20_POLY1305_AEAD_TAG_LEN;
30
- payload_bytes[0 ] = packet_length & 0xff ;
31
- payload_bytes[1 ] = (packet_length >> 8 ) & 0xff ;
32
- payload_bytes[2 ] = (packet_length >> 16 ) & 0xff ;
32
+ if (payload_bytes.size () >= CHACHA20_POLY1305_AEAD_AAD_LEN + CHACHA20_POLY1305_AEAD_TAG_LEN) {
33
+ if (length_assist) {
34
+ uint32_t packet_length = payload_bytes.size () - CHACHA20_POLY1305_AEAD_AAD_LEN - CHACHA20_POLY1305_AEAD_TAG_LEN;
35
+ payload_bytes[0 ] = packet_length & 0xff ;
36
+ payload_bytes[1 ] = (packet_length >> 8 ) & 0xff ;
37
+ payload_bytes[2 ] = (packet_length >> 16 ) & 0xff ;
38
+ }
39
+
40
+ if (mac_assist) {
41
+ unsigned char pseudorandom_bytes[CHACHA20_POLY1305_AEAD_AAD_LEN + POLY1305_KEYLEN];
42
+ memset (pseudorandom_bytes, 0 , sizeof (pseudorandom_bytes));
43
+ ChaCha20Forward4064 chacha{k1};
44
+ chacha.Crypt (pseudorandom_bytes, pseudorandom_bytes, CHACHA20_POLY1305_AEAD_AAD_LEN + POLY1305_KEYLEN);
45
+
46
+ poly1305_auth (payload_bytes.data () + (payload_bytes.size () - POLY1305_TAGLEN), payload_bytes.data (), (payload_bytes.size () - POLY1305_TAGLEN), pseudorandom_bytes + CHACHA20_POLY1305_AEAD_AAD_LEN);
47
+ }
33
48
}
34
49
35
50
Span<const uint8_t > msg_bytes{payload_bytes};
@@ -43,6 +58,15 @@ FUZZ_TARGET(p2p_v2_transport_serialization)
43
58
bool reject_message{true };
44
59
bool disconnect{true };
45
60
CNetMessage result{deserializer.GetMessage (m_time, reject_message, disconnect)};
61
+
62
+ if (mac_assist) {
63
+ assert (!disconnect);
64
+ }
65
+
66
+ if (length_assist && mac_assist) {
67
+ assert (!reject_message);
68
+ }
69
+
46
70
if (!reject_message) {
47
71
assert (result.m_type .size () <= CMessageHeader::COMMAND_SIZE);
48
72
assert (result.m_raw_message_size <= buffer.size ());
0 commit comments