|
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};
|
|
0 commit comments