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- 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 );
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 is 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- 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+ }
3247 }
3348
3449 Span<const uint8_t > msg_bytes{payload_bytes};
@@ -42,6 +57,15 @@ FUZZ_TARGET(p2p_v2_transport_serialization)
4257 bool reject_message{true };
4358 bool disconnect{true };
4459 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+
4569 if (!reject_message) {
4670 assert (result.m_command .size () <= CMessageHeader::COMMAND_SIZE);
4771 assert (result.m_raw_message_size <= buffer.size ());
0 commit comments