/root/bitcoin/src/test/fuzz/netaddress.cpp
Line | Count | Source |
1 | | // Copyright (c) 2020-2022 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 | 0 | { |
17 | 0 | SeedRandomStateForTest(SeedRand::ZEROS); |
18 | 0 | FuzzedDataProvider fuzzed_data_provider(buffer.data(), buffer.size()); |
19 | |
|
20 | 0 | const CNetAddr net_addr = ConsumeNetAddr(fuzzed_data_provider); |
21 | 0 | (void)net_addr.GetNetClass(); |
22 | 0 | if (net_addr.GetNetwork() == Network::NET_IPV4) { |
23 | 0 | assert(net_addr.IsIPv4()); |
24 | 0 | } |
25 | 0 | if (net_addr.GetNetwork() == Network::NET_IPV6) { |
26 | 0 | assert(net_addr.IsIPv6()); |
27 | 0 | } |
28 | 0 | if (net_addr.GetNetwork() == Network::NET_ONION) { |
29 | 0 | assert(net_addr.IsTor()); |
30 | 0 | } |
31 | 0 | if (net_addr.GetNetwork() == Network::NET_I2P) { |
32 | 0 | assert(net_addr.IsI2P()); |
33 | 0 | } |
34 | 0 | if (net_addr.GetNetwork() == Network::NET_CJDNS) { |
35 | 0 | assert(net_addr.IsCJDNS()); |
36 | 0 | } |
37 | 0 | if (net_addr.GetNetwork() == Network::NET_INTERNAL) { |
38 | 0 | assert(net_addr.IsInternal()); |
39 | 0 | } |
40 | 0 | if (net_addr.GetNetwork() == Network::NET_UNROUTABLE) { |
41 | 0 | assert(!net_addr.IsRoutable()); |
42 | 0 | } |
43 | 0 | (void)net_addr.IsBindAny(); |
44 | 0 | if (net_addr.IsInternal()) { |
45 | 0 | assert(net_addr.GetNetwork() == Network::NET_INTERNAL); |
46 | 0 | } |
47 | 0 | if (net_addr.IsIPv4()) { |
48 | 0 | assert(net_addr.GetNetwork() == Network::NET_IPV4 || net_addr.GetNetwork() == Network::NET_UNROUTABLE); |
49 | 0 | } |
50 | 0 | if (net_addr.IsIPv6()) { |
51 | 0 | assert(net_addr.GetNetwork() == Network::NET_IPV6 || net_addr.GetNetwork() == Network::NET_UNROUTABLE); |
52 | 0 | } |
53 | 0 | (void)net_addr.IsLocal(); |
54 | 0 | if (net_addr.IsRFC1918() || net_addr.IsRFC2544() || net_addr.IsRFC6598() || net_addr.IsRFC5737() || net_addr.IsRFC3927()) { |
55 | 0 | assert(net_addr.IsIPv4()); |
56 | 0 | } |
57 | 0 | (void)net_addr.IsRFC2544(); |
58 | 0 | 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 | 0 | assert(net_addr.IsIPv6()); |
60 | 0 | } |
61 | 0 | (void)net_addr.IsRFC3927(); |
62 | 0 | (void)net_addr.IsRFC3964(); |
63 | 0 | if (net_addr.IsRFC4193()) { |
64 | 0 | assert(net_addr.GetNetwork() == Network::NET_INTERNAL || net_addr.GetNetwork() == Network::NET_UNROUTABLE); |
65 | 0 | } |
66 | 0 | (void)net_addr.IsRFC4380(); |
67 | 0 | (void)net_addr.IsRFC4843(); |
68 | 0 | (void)net_addr.IsRFC4862(); |
69 | 0 | (void)net_addr.IsRFC5737(); |
70 | 0 | (void)net_addr.IsRFC6052(); |
71 | 0 | (void)net_addr.IsRFC6145(); |
72 | 0 | (void)net_addr.IsRFC6598(); |
73 | 0 | (void)net_addr.IsRFC7343(); |
74 | 0 | if (!net_addr.IsRoutable()) { |
75 | 0 | assert(net_addr.GetNetwork() == Network::NET_UNROUTABLE || net_addr.GetNetwork() == Network::NET_INTERNAL); |
76 | 0 | } |
77 | 0 | if (net_addr.IsTor()) { |
78 | 0 | assert(net_addr.GetNetwork() == Network::NET_ONION); |
79 | 0 | } |
80 | 0 | if (net_addr.IsI2P()) { |
81 | 0 | assert(net_addr.GetNetwork() == Network::NET_I2P); |
82 | 0 | } |
83 | 0 | if (net_addr.IsCJDNS()) { |
84 | 0 | assert(net_addr.GetNetwork() == Network::NET_CJDNS); |
85 | 0 | } |
86 | 0 | (void)net_addr.IsValid(); |
87 | 0 | (void)net_addr.ToStringAddr(); |
88 | |
|
89 | 0 | const CSubNet sub_net{net_addr, fuzzed_data_provider.ConsumeIntegral<uint8_t>()}; |
90 | 0 | (void)sub_net.IsValid(); |
91 | 0 | (void)sub_net.ToString(); |
92 | |
|
93 | 0 | const CService service{net_addr, fuzzed_data_provider.ConsumeIntegral<uint16_t>()}; |
94 | 0 | (void)service.GetKey(); |
95 | 0 | (void)service.GetPort(); |
96 | 0 | (void)service.ToStringAddrPort(); |
97 | 0 | (void)CServiceHash()(service); |
98 | 0 | (void)CServiceHash(0, 0)(service); |
99 | |
|
100 | 0 | const CNetAddr other_net_addr = ConsumeNetAddr(fuzzed_data_provider); |
101 | 0 | (void)net_addr.GetReachabilityFrom(other_net_addr); |
102 | 0 | (void)sub_net.Match(other_net_addr); |
103 | |
|
104 | 0 | const CService other_service{fuzzed_data_provider.ConsumeBool() ? net_addr : other_net_addr, fuzzed_data_provider.ConsumeIntegral<uint16_t>()}; |
105 | 0 | assert((service == other_service) != (service != other_service)); |
106 | 0 | (void)(service < other_service); |
107 | |
|
108 | 0 | if (service.ToStringAddrPort() == other_service.ToStringAddrPort()) { |
109 | 0 | assert(static_cast<CNetAddr>(service) == static_cast<CNetAddr>(other_service)); |
110 | 0 | } |
111 | | |
112 | 0 | const CSubNet sub_net_copy_1{net_addr, other_net_addr}; |
113 | 0 | const CSubNet sub_net_copy_2{net_addr}; |
114 | |
|
115 | 0 | CNetAddr mutable_net_addr; |
116 | 0 | mutable_net_addr.SetIP(net_addr); |
117 | | assert(net_addr == mutable_net_addr); |
118 | 0 | } |