44
55#include < compat/endian.h>
66#include < crypto/chacha_poly_aead.h>
7+ #include < crypto/poly1305.h>
78#include < key.h>
89#include < net.h>
910#include < netmessagemaker.h>
1415
1516FUZZ_TARGET (p2p_v2_transport_serialization)
1617{
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 );
1920
2021 // Construct deserializer, with a dummy NodeId
2122 V2TransportDeserializer deserializer{(NodeId)0 , k1, k2};
2223 V2TransportSerializer serializer{k1, k2};
2324 FuzzedDataProvider fuzzed_data_provider{buffer.data (), buffer.size ()};
2425
2526 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 ();
2630 auto payload_bytes = fuzzed_data_provider.ConsumeRemainingBytes <uint8_t >();
2731
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+ }
3348 }
3449
3550 Span<const uint8_t > msg_bytes{payload_bytes};
@@ -43,6 +58,15 @@ FUZZ_TARGET(p2p_v2_transport_serialization)
4358 bool reject_message{true };
4459 bool disconnect{true };
4560 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+
4670 if (!reject_message) {
4771 assert (result.m_type .size () <= CMessageHeader::COMMAND_SIZE);
4872 assert (result.m_raw_message_size <= buffer.size ());
0 commit comments