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