aboutsummaryrefslogtreecommitdiff
path: root/src/test/fuzz/asmap.cpp
diff options
context:
space:
mode:
authorPieter Wuille <pieter.wuille@gmail.com>2020-04-03 13:32:34 -0700
committerPieter Wuille <pieter.wuille@gmail.com>2020-04-08 16:26:06 -0700
commit7cf97fda154ba837933eb05be5aeecfb69a06641 (patch)
tree90f13a695239d6d3c8561880304cda37e32625fa /src/test/fuzz/asmap.cpp
parentc81aefc5377888c7ac4f29f570249fd6c2fdb352 (diff)
downloadbitcoin-7cf97fda154ba837933eb05be5aeecfb69a06641.tar.xz
Make asmap Interpreter errors fatal and fuzz test it
Diffstat (limited to 'src/test/fuzz/asmap.cpp')
-rw-r--r--src/test/fuzz/asmap.cpp45
1 files changed, 33 insertions, 12 deletions
diff --git a/src/test/fuzz/asmap.cpp b/src/test/fuzz/asmap.cpp
index 7f3eef79a1..ea56277eac 100644
--- a/src/test/fuzz/asmap.cpp
+++ b/src/test/fuzz/asmap.cpp
@@ -3,26 +3,47 @@
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
#include <netaddress.h>
-#include <test/fuzz/FuzzedDataProvider.h>
#include <test/fuzz/fuzz.h>
#include <cstdint>
#include <vector>
+//! asmap code that consumes nothing
+static const std::vector<bool> IPV6_PREFIX_ASMAP = {};
+
+//! asmap code that consumes the 96 prefix bits of ::ffff:0/96 (IPv4-in-IPv6 map)
+static const std::vector<bool> IPV4_PREFIX_ASMAP = {
+ true, true, false, true, true, true, true, true, true, true, false, false, false, false, false, false, false, false, // Match 0x00
+ true, true, false, true, true, true, true, true, true, true, false, false, false, false, false, false, false, false, // Match 0x00
+ true, true, false, true, true, true, true, true, true, true, false, false, false, false, false, false, false, false, // Match 0x00
+ true, true, false, true, true, true, true, true, true, true, false, false, false, false, false, false, false, false, // Match 0x00
+ true, true, false, true, true, true, true, true, true, true, false, false, false, false, false, false, false, false, // Match 0x00
+ true, true, false, true, true, true, true, true, true, true, false, false, false, false, false, false, false, false, // Match 0x00
+ true, true, false, true, true, true, true, true, true, true, false, false, false, false, false, false, false, false, // Match 0x00
+ true, true, false, true, true, true, true, true, true, true, false, false, false, false, false, false, false, false, // Match 0x00
+ true, true, false, true, true, true, true, true, true, true, false, false, false, false, false, false, false, false, // Match 0x00
+ true, true, false, true, true, true, true, true, true, true, false, false, false, false, false, false, false, false, // Match 0x00
+ true, true, false, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, // Match 0xFF
+ true, true, false, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true // Match 0xFF
+};
+
void test_one_input(const std::vector<uint8_t>& buffer)
{
- FuzzedDataProvider fuzzed_data_provider(buffer.data(), buffer.size());
- const Network network = fuzzed_data_provider.PickValueInArray({NET_IPV4, NET_IPV6});
- if (fuzzed_data_provider.remaining_bytes() < 16) {
- return;
- }
- CNetAddr net_addr;
- net_addr.SetRaw(network, fuzzed_data_provider.ConsumeBytes<uint8_t>(16).data());
- std::vector<bool> asmap;
- for (const char cur_byte : fuzzed_data_provider.ConsumeRemainingBytes<char>()) {
- for (int bit = 0; bit < 8; ++bit) {
- asmap.push_back((cur_byte >> bit) & 1);
+ // Encoding: [7 bits: asmap size] [1 bit: ipv6?] [3-130 bytes: asmap] [4 or 16 bytes: addr]
+ if (buffer.size() < 1 + 3 + 4) return;
+ int asmap_size = 3 + (buffer[0] & 127);
+ bool ipv6 = buffer[0] & 128;
+ int addr_size = ipv6 ? 16 : 4;
+ if (buffer.size() < size_t(1 + asmap_size + addr_size)) return;
+ std::vector<bool> asmap = ipv6 ? IPV6_PREFIX_ASMAP : IPV4_PREFIX_ASMAP;
+ asmap.reserve(asmap.size() + 8 * asmap_size);
+ for (int i = 0; i < asmap_size; ++i) {
+ for (int j = 0; j < 8; ++j) {
+ asmap.push_back((buffer[1 + i] >> j) & 1);
}
}
+ if (!SanityCheckASMap(asmap)) return;
+ CNetAddr net_addr;
+ net_addr.SetRaw(ipv6 ? NET_IPV6 : NET_IPV4, buffer.data() + 1 + asmap_size);
(void)net_addr.GetMappedAS(asmap);
}