netaddress.cpp
1 // Copyright (c) 2020-present The Bitcoin Core developers 2 // Distributed under the MIT software license, see the accompanying 3 // file COPYING or http://www.opensource.org/licenses/mit-license.php. 4 5 #include <netaddress.h> 6 #include <test/fuzz/FuzzedDataProvider.h> 7 #include <test/fuzz/fuzz.h> 8 #include <test/fuzz/util/net.h> 9 #include <test/util/random.h> 10 11 #include <cassert> 12 #include <cstdint> 13 #include <vector> 14 15 FUZZ_TARGET(netaddress) 16 { 17 SeedRandomStateForTest(SeedRand::ZEROS); 18 FuzzedDataProvider fuzzed_data_provider(buffer.data(), buffer.size()); 19 20 const CNetAddr net_addr = ConsumeNetAddr(fuzzed_data_provider); 21 (void)net_addr.GetNetClass(); 22 if (net_addr.GetNetwork() == Network::NET_IPV4) { 23 assert(net_addr.IsIPv4()); 24 } 25 if (net_addr.GetNetwork() == Network::NET_IPV6) { 26 assert(net_addr.IsIPv6()); 27 } 28 if (net_addr.GetNetwork() == Network::NET_ONION) { 29 assert(net_addr.IsTor()); 30 } 31 if (net_addr.GetNetwork() == Network::NET_I2P) { 32 assert(net_addr.IsI2P()); 33 } 34 if (net_addr.GetNetwork() == Network::NET_CJDNS) { 35 assert(net_addr.IsCJDNS()); 36 } 37 if (net_addr.GetNetwork() == Network::NET_INTERNAL) { 38 assert(net_addr.IsInternal()); 39 } 40 if (net_addr.GetNetwork() == Network::NET_UNROUTABLE) { 41 assert(!net_addr.IsRoutable()); 42 } 43 (void)net_addr.IsBindAny(); 44 if (net_addr.IsInternal()) { 45 assert(net_addr.GetNetwork() == Network::NET_INTERNAL); 46 } 47 if (net_addr.IsIPv4()) { 48 assert(net_addr.GetNetwork() == Network::NET_IPV4 || net_addr.GetNetwork() == Network::NET_UNROUTABLE); 49 } 50 if (net_addr.IsIPv6()) { 51 assert(net_addr.GetNetwork() == Network::NET_IPV6 || net_addr.GetNetwork() == Network::NET_UNROUTABLE); 52 } 53 (void)net_addr.IsLocal(); 54 if (net_addr.IsRFC1918() || net_addr.IsRFC2544() || net_addr.IsRFC6598() || net_addr.IsRFC5737() || net_addr.IsRFC3927()) { 55 assert(net_addr.IsIPv4()); 56 } 57 (void)net_addr.IsRFC2544(); 58 if (net_addr.IsRFC3849() || net_addr.IsRFC3964() || net_addr.IsRFC4380() || net_addr.IsRFC4843() || net_addr.IsRFC7343() || net_addr.IsRFC4862() || net_addr.IsRFC6052() || net_addr.IsRFC6145()) { 59 assert(net_addr.IsIPv6()); 60 } 61 (void)net_addr.IsRFC3927(); 62 (void)net_addr.IsRFC3964(); 63 if (net_addr.IsRFC4193()) { 64 assert(net_addr.GetNetwork() == Network::NET_INTERNAL || net_addr.GetNetwork() == Network::NET_UNROUTABLE); 65 } 66 (void)net_addr.IsRFC4380(); 67 (void)net_addr.IsRFC4843(); 68 (void)net_addr.IsRFC4862(); 69 (void)net_addr.IsRFC5737(); 70 (void)net_addr.IsRFC6052(); 71 (void)net_addr.IsRFC6145(); 72 (void)net_addr.IsRFC6598(); 73 (void)net_addr.IsRFC7343(); 74 if (!net_addr.IsRoutable()) { 75 assert(net_addr.GetNetwork() == Network::NET_UNROUTABLE || net_addr.GetNetwork() == Network::NET_INTERNAL); 76 } 77 if (net_addr.IsTor()) { 78 assert(net_addr.GetNetwork() == Network::NET_ONION); 79 } 80 if (net_addr.IsI2P()) { 81 assert(net_addr.GetNetwork() == Network::NET_I2P); 82 } 83 if (net_addr.IsCJDNS()) { 84 assert(net_addr.GetNetwork() == Network::NET_CJDNS); 85 } 86 (void)net_addr.IsValid(); 87 (void)net_addr.ToStringAddr(); 88 89 const CSubNet sub_net{net_addr, fuzzed_data_provider.ConsumeIntegral<uint8_t>()}; 90 (void)sub_net.IsValid(); 91 (void)sub_net.ToString(); 92 93 const CService service{net_addr, fuzzed_data_provider.ConsumeIntegral<uint16_t>()}; 94 (void)service.GetKey(); 95 (void)service.GetPort(); 96 (void)service.ToStringAddrPort(); 97 (void)CServiceHash()(service); 98 (void)CServiceHash(0, 0)(service); 99 100 const CNetAddr other_net_addr = ConsumeNetAddr(fuzzed_data_provider); 101 (void)net_addr.GetReachabilityFrom(other_net_addr); 102 (void)sub_net.Match(other_net_addr); 103 104 const CService other_service{fuzzed_data_provider.ConsumeBool() ? net_addr : other_net_addr, fuzzed_data_provider.ConsumeIntegral<uint16_t>()}; 105 assert((service == other_service) != (service != other_service)); 106 (void)(service < other_service); 107 108 if (service.ToStringAddrPort() == other_service.ToStringAddrPort()) { 109 assert(static_cast<CNetAddr>(service) == static_cast<CNetAddr>(other_service)); 110 } 111 112 const CSubNet sub_net_copy_1{net_addr, other_net_addr}; 113 const CSubNet sub_net_copy_2{net_addr}; 114 115 CNetAddr mutable_net_addr; 116 mutable_net_addr.SetIP(net_addr); 117 assert(net_addr == mutable_net_addr); 118 }