/ src / test / fuzz / netaddress.cpp
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  }