Skip to content

Commit 6e87202

Browse files
committed
fuzz: Provide correct MAC tag to assist v2 transport fuzzing
before commit: 131072 pulse cov: 1734 ft: 1993 corp: 19/107b lim: 1260 exec/s: 757 rss: 465Mb after commit: 131072 pulse cov: 1888 ft: 2708 corp: 50/4004b lim: 1100 exec/s: 762 rss: 467Mb
1 parent 4e02084 commit 6e87202

File tree

1 file changed

+31
-7
lines changed

1 file changed

+31
-7
lines changed

src/test/fuzz/p2p_v2_transport_serialization.cpp

+31-7
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
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>
@@ -14,22 +15,36 @@
1415

1516
FUZZ_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

Comments
 (0)