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
- const CPrivKey k1 (32 , 0 );
18
- const CPrivKey k2 (32 , 0 );
18
+ const CPrivKey k1 (CHACHA20_POLY1305_AEAD_KEY_LEN , 0 );
19
+ const 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 is 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
- packet_length = htole32 (packet_length);
31
- memcpy (payload_bytes.data (), &packet_length, 3 );
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
+ packet_length = htole32 (packet_length);
36
+ memcpy (payload_bytes.data (), &packet_length, 3 );
37
+ }
38
+
39
+ if (mac_assist) {
40
+ unsigned char pseudorandom_bytes[CHACHA20_POLY1305_AEAD_AAD_LEN + POLY1305_KEYLEN];
41
+ memset (pseudorandom_bytes, 0 , sizeof (pseudorandom_bytes));
42
+ ChaCha20Forward4064 chacha{k1.data (), CHACHA20_POLY1305_AEAD_KEY_LEN};
43
+ chacha.Crypt (pseudorandom_bytes, pseudorandom_bytes, CHACHA20_POLY1305_AEAD_AAD_LEN + POLY1305_KEYLEN);
44
+
45
+ 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);
46
+ }
32
47
}
33
48
34
49
Span<const uint8_t > msg_bytes{payload_bytes};
@@ -42,6 +57,15 @@ FUZZ_TARGET(p2p_v2_transport_serialization)
42
57
bool reject_message{true };
43
58
bool disconnect{true };
44
59
CNetMessage result{deserializer.GetMessage (m_time, reject_message, disconnect)};
60
+
61
+ if (mac_assist) {
62
+ assert (!disconnect);
63
+ }
64
+
65
+ if (length_assist && mac_assist) {
66
+ assert (!reject_message);
67
+ }
68
+
45
69
if (!reject_message) {
46
70
assert (result.m_command .size () <= CMessageHeader::COMMAND_SIZE);
47
71
assert (result.m_raw_message_size <= buffer.size ());
0 commit comments