Line data Source code
1 : // Copyright (c) 2012-2021 The Bitcoin Core developers
2 : // Copyright (c) 2014-2025 The Dash Core developers
3 : // Distributed under the MIT software license, see the accompanying
4 : // file COPYING or http://www.opensource.org/licenses/mit-license.php.
5 :
6 : #include <net_permissions.h>
7 : #include <netaddress.h>
8 : #include <netbase.h>
9 : #include <netgroup.h>
10 : #include <protocol.h>
11 : #include <serialize.h>
12 : #include <streams.h>
13 : #include <test/util/setup_common.h>
14 : #include <util/strencodings.h>
15 : #include <util/translation.h>
16 : #include <version.h>
17 :
18 : #include <string>
19 :
20 : #include <boost/test/unit_test.hpp>
21 :
22 : using namespace std::literals;
23 :
24 146 : BOOST_FIXTURE_TEST_SUITE(netbase_tests, BasicTestingSetup)
25 :
26 94 : static CNetAddr ResolveIP(const std::string& ip)
27 : {
28 94 : return LookupHost(ip, false).value_or(CNetAddr{});
29 0 : }
30 :
31 4 : static CNetAddr CreateInternal(const std::string& host)
32 : {
33 4 : CNetAddr addr;
34 4 : addr.SetInternal(host);
35 4 : return addr;
36 4 : }
37 :
38 149 : BOOST_AUTO_TEST_CASE(netbase_networks)
39 : {
40 1 : BOOST_CHECK(ResolveIP("127.0.0.1").GetNetwork() == NET_UNROUTABLE);
41 1 : BOOST_CHECK(ResolveIP("::1").GetNetwork() == NET_UNROUTABLE);
42 1 : BOOST_CHECK(ResolveIP("8.8.8.8").GetNetwork() == NET_IPV4);
43 1 : BOOST_CHECK(ResolveIP("2001::8888").GetNetwork() == NET_IPV6);
44 1 : BOOST_CHECK(ResolveIP("pg6mmjiyjmcrsslvykfwnntlaru7p5svn6y2ymmju6nubxndf4pscryd.onion").GetNetwork() == NET_ONION);
45 1 : BOOST_CHECK(CreateInternal("foo.com").GetNetwork() == NET_INTERNAL);
46 1 : }
47 :
48 149 : BOOST_AUTO_TEST_CASE(netbase_properties)
49 : {
50 :
51 1 : BOOST_CHECK(ResolveIP("127.0.0.1").IsIPv4());
52 1 : BOOST_CHECK(ResolveIP("::FFFF:192.168.1.1").IsIPv4());
53 1 : BOOST_CHECK(ResolveIP("::1").IsIPv6());
54 1 : BOOST_CHECK(ResolveIP("10.0.0.1").IsRFC1918());
55 1 : BOOST_CHECK(ResolveIP("192.168.1.1").IsRFC1918());
56 1 : BOOST_CHECK(ResolveIP("172.31.255.255").IsRFC1918());
57 1 : BOOST_CHECK(ResolveIP("198.18.0.0").IsRFC2544());
58 1 : BOOST_CHECK(ResolveIP("198.19.255.255").IsRFC2544());
59 1 : BOOST_CHECK(ResolveIP("2001:0DB8::").IsRFC3849());
60 1 : BOOST_CHECK(ResolveIP("169.254.1.1").IsRFC3927());
61 1 : BOOST_CHECK(ResolveIP("2002::1").IsRFC3964());
62 1 : BOOST_CHECK(ResolveIP("FC00::").IsRFC4193());
63 1 : BOOST_CHECK(ResolveIP("2001::2").IsRFC4380());
64 1 : BOOST_CHECK(ResolveIP("2001:10::").IsRFC4843());
65 1 : BOOST_CHECK(ResolveIP("2001:20::").IsRFC7343());
66 1 : BOOST_CHECK(ResolveIP("FE80::").IsRFC4862());
67 1 : BOOST_CHECK(ResolveIP("64:FF9B::").IsRFC6052());
68 1 : BOOST_CHECK(ResolveIP("pg6mmjiyjmcrsslvykfwnntlaru7p5svn6y2ymmju6nubxndf4pscryd.onion").IsTor());
69 1 : BOOST_CHECK(ResolveIP("127.0.0.1").IsLocal());
70 1 : BOOST_CHECK(ResolveIP("::1").IsLocal());
71 1 : BOOST_CHECK(ResolveIP("8.8.8.8").IsRoutable());
72 1 : BOOST_CHECK(ResolveIP("2001::1").IsRoutable());
73 1 : BOOST_CHECK(ResolveIP("127.0.0.1").IsValid());
74 1 : BOOST_CHECK(CreateInternal("FD6B:88C0:8724:edb1:8e4:3588:e546:35ca").IsInternal());
75 1 : BOOST_CHECK(CreateInternal("bar.com").IsInternal());
76 :
77 1 : }
78 :
79 32 : bool static TestSplitHost(const std::string& test, const std::string& host, uint16_t port, bool validPort=true)
80 : {
81 32 : std::string hostOut;
82 32 : uint16_t portOut{0};
83 32 : bool validPortOut = SplitHostPort(test, portOut, hostOut);
84 32 : return hostOut == host && portOut == port && validPortOut == validPort;
85 32 : }
86 :
87 149 : BOOST_AUTO_TEST_CASE(netbase_splithost)
88 : {
89 1 : BOOST_CHECK(TestSplitHost("www.bitcoin.org", "www.bitcoin.org", 0));
90 1 : BOOST_CHECK(TestSplitHost("[www.bitcoin.org]", "www.bitcoin.org", 0));
91 1 : BOOST_CHECK(TestSplitHost("www.bitcoin.org:80", "www.bitcoin.org", 80));
92 1 : BOOST_CHECK(TestSplitHost("[www.bitcoin.org]:80", "www.bitcoin.org", 80));
93 1 : BOOST_CHECK(TestSplitHost("127.0.0.1", "127.0.0.1", 0));
94 1 : BOOST_CHECK(TestSplitHost("127.0.0.1:9999", "127.0.0.1", 9999));
95 1 : BOOST_CHECK(TestSplitHost("[127.0.0.1]", "127.0.0.1", 0));
96 1 : BOOST_CHECK(TestSplitHost("[127.0.0.1]:9999", "127.0.0.1", 9999));
97 1 : BOOST_CHECK(TestSplitHost("::ffff:127.0.0.1", "::ffff:127.0.0.1", 0));
98 1 : BOOST_CHECK(TestSplitHost("[::ffff:127.0.0.1]:9999", "::ffff:127.0.0.1", 9999));
99 1 : BOOST_CHECK(TestSplitHost("[::]:9999", "::", 9999));
100 1 : BOOST_CHECK(TestSplitHost("::9999", "::9999", 0));
101 1 : BOOST_CHECK(TestSplitHost(":9999", "", 9999));
102 1 : BOOST_CHECK(TestSplitHost("[]:9999", "", 9999));
103 1 : BOOST_CHECK(TestSplitHost("", "", 0));
104 1 : BOOST_CHECK(TestSplitHost(":65535", "", 65535));
105 1 : BOOST_CHECK(TestSplitHost(":65536", ":65536", 0, false));
106 1 : BOOST_CHECK(TestSplitHost(":-1", ":-1", 0, false));
107 1 : BOOST_CHECK(TestSplitHost("[]:70001", "[]:70001", 0, false));
108 1 : BOOST_CHECK(TestSplitHost("[]:-1", "[]:-1", 0, false));
109 1 : BOOST_CHECK(TestSplitHost("[]:-0", "[]:-0", 0, false));
110 1 : BOOST_CHECK(TestSplitHost("[]:0", "", 0, false));
111 1 : BOOST_CHECK(TestSplitHost("[]:1/2", "[]:1/2", 0, false));
112 1 : BOOST_CHECK(TestSplitHost("[]:1E2", "[]:1E2", 0, false));
113 1 : BOOST_CHECK(TestSplitHost("127.0.0.1:65536", "127.0.0.1:65536", 0, false));
114 1 : BOOST_CHECK(TestSplitHost("127.0.0.1:0", "127.0.0.1", 0, false));
115 1 : BOOST_CHECK(TestSplitHost("127.0.0.1:", "127.0.0.1:", 0, false));
116 1 : BOOST_CHECK(TestSplitHost("127.0.0.1:1/2", "127.0.0.1:1/2", 0, false));
117 1 : BOOST_CHECK(TestSplitHost("127.0.0.1:1E2", "127.0.0.1:1E2", 0, false));
118 1 : BOOST_CHECK(TestSplitHost("www.bitcoincore.org:65536", "www.bitcoincore.org:65536", 0, false));
119 1 : BOOST_CHECK(TestSplitHost("www.bitcoincore.org:0", "www.bitcoincore.org", 0, false));
120 1 : BOOST_CHECK(TestSplitHost("www.bitcoincore.org:", "www.bitcoincore.org:", 0, false));
121 1 : }
122 :
123 9 : bool static TestParse(std::string src, std::string canon)
124 : {
125 9 : CService addr(LookupNumeric(src, 65535));
126 9 : return canon == addr.ToStringAddrPort();
127 9 : }
128 :
129 149 : BOOST_AUTO_TEST_CASE(netbase_lookupnumeric)
130 : {
131 1 : BOOST_CHECK(TestParse("127.0.0.1", "127.0.0.1:65535"));
132 1 : BOOST_CHECK(TestParse("127.0.0.1:9999", "127.0.0.1:9999"));
133 1 : BOOST_CHECK(TestParse("::ffff:127.0.0.1", "127.0.0.1:65535"));
134 1 : BOOST_CHECK(TestParse("::", "[::]:65535"));
135 1 : BOOST_CHECK(TestParse("[::]:9999", "[::]:9999"));
136 1 : BOOST_CHECK(TestParse("[127.0.0.1]", "127.0.0.1:65535"));
137 1 : BOOST_CHECK(TestParse(":::", "[::]:0"));
138 :
139 : // verify that an internal address fails to resolve
140 1 : BOOST_CHECK(TestParse("[fd6b:88c0:8724:1:2:3:4:5]", "[::]:0"));
141 : // and that a one-off resolves correctly
142 1 : BOOST_CHECK(TestParse("[fd6c:88c0:8724:1:2:3:4:5]", "[fd6c:88c0:8724:1:2:3:4:5]:65535"));
143 1 : }
144 :
145 149 : BOOST_AUTO_TEST_CASE(embedded_test)
146 : {
147 1 : CNetAddr addr1(ResolveIP("1.2.3.4"));
148 1 : CNetAddr addr2(ResolveIP("::FFFF:0102:0304"));
149 1 : BOOST_CHECK(addr2.IsIPv4());
150 1 : BOOST_CHECK_EQUAL(addr1.ToStringAddr(), addr2.ToStringAddr());
151 1 : }
152 :
153 149 : BOOST_AUTO_TEST_CASE(subnet_test)
154 : {
155 :
156 1 : BOOST_CHECK(LookupSubNet("1.2.3.0/24") == LookupSubNet("1.2.3.0/255.255.255.0"));
157 1 : BOOST_CHECK(LookupSubNet("1.2.3.0/24") != LookupSubNet("1.2.4.0/255.255.255.0"));
158 1 : BOOST_CHECK(LookupSubNet("1.2.3.0/24").Match(ResolveIP("1.2.3.4")));
159 1 : BOOST_CHECK(!LookupSubNet("1.2.2.0/24").Match(ResolveIP("1.2.3.4")));
160 1 : BOOST_CHECK(LookupSubNet("1.2.3.4").Match(ResolveIP("1.2.3.4")));
161 1 : BOOST_CHECK(LookupSubNet("1.2.3.4/32").Match(ResolveIP("1.2.3.4")));
162 1 : BOOST_CHECK(!LookupSubNet("1.2.3.4").Match(ResolveIP("5.6.7.8")));
163 1 : BOOST_CHECK(!LookupSubNet("1.2.3.4/32").Match(ResolveIP("5.6.7.8")));
164 1 : BOOST_CHECK(LookupSubNet("::ffff:127.0.0.1").Match(ResolveIP("127.0.0.1")));
165 1 : BOOST_CHECK(LookupSubNet("1:2:3:4:5:6:7:8").Match(ResolveIP("1:2:3:4:5:6:7:8")));
166 1 : BOOST_CHECK(!LookupSubNet("1:2:3:4:5:6:7:8").Match(ResolveIP("1:2:3:4:5:6:7:9")));
167 1 : BOOST_CHECK(LookupSubNet("1:2:3:4:5:6:7:0/112").Match(ResolveIP("1:2:3:4:5:6:7:1234")));
168 1 : BOOST_CHECK(LookupSubNet("192.168.0.1/24").Match(ResolveIP("192.168.0.2")));
169 1 : BOOST_CHECK(LookupSubNet("192.168.0.20/29").Match(ResolveIP("192.168.0.18")));
170 1 : BOOST_CHECK(LookupSubNet("1.2.2.1/24").Match(ResolveIP("1.2.2.4")));
171 1 : BOOST_CHECK(LookupSubNet("1.2.2.110/31").Match(ResolveIP("1.2.2.111")));
172 1 : BOOST_CHECK(LookupSubNet("1.2.2.20/26").Match(ResolveIP("1.2.2.63")));
173 : // All-Matching IPv6 Matches arbitrary IPv6
174 1 : BOOST_CHECK(LookupSubNet("::/0").Match(ResolveIP("1:2:3:4:5:6:7:1234")));
175 : // But not `::` or `0.0.0.0` because they are considered invalid addresses
176 1 : BOOST_CHECK(!LookupSubNet("::/0").Match(ResolveIP("::")));
177 1 : BOOST_CHECK(!LookupSubNet("::/0").Match(ResolveIP("0.0.0.0")));
178 : // Addresses from one network (IPv4) don't belong to subnets of another network (IPv6)
179 1 : BOOST_CHECK(!LookupSubNet("::/0").Match(ResolveIP("1.2.3.4")));
180 : // All-Matching IPv4 does not Match IPv6
181 1 : BOOST_CHECK(!LookupSubNet("0.0.0.0/0").Match(ResolveIP("1:2:3:4:5:6:7:1234")));
182 : // Invalid subnets Match nothing (not even invalid addresses)
183 1 : BOOST_CHECK(!CSubNet().Match(ResolveIP("1.2.3.4")));
184 1 : BOOST_CHECK(!LookupSubNet("").Match(ResolveIP("4.5.6.7")));
185 1 : BOOST_CHECK(!LookupSubNet("bloop").Match(ResolveIP("0.0.0.0")));
186 1 : BOOST_CHECK(!LookupSubNet("bloop").Match(ResolveIP("hab")));
187 : // Check valid/invalid
188 1 : BOOST_CHECK(LookupSubNet("1.2.3.0/0").IsValid());
189 1 : BOOST_CHECK(!LookupSubNet("1.2.3.0/-1").IsValid());
190 1 : BOOST_CHECK(LookupSubNet("1.2.3.0/32").IsValid());
191 1 : BOOST_CHECK(!LookupSubNet("1.2.3.0/33").IsValid());
192 1 : BOOST_CHECK(!LookupSubNet("1.2.3.0/300").IsValid());
193 1 : BOOST_CHECK(LookupSubNet("1:2:3:4:5:6:7:8/0").IsValid());
194 1 : BOOST_CHECK(LookupSubNet("1:2:3:4:5:6:7:8/33").IsValid());
195 1 : BOOST_CHECK(!LookupSubNet("1:2:3:4:5:6:7:8/-1").IsValid());
196 1 : BOOST_CHECK(LookupSubNet("1:2:3:4:5:6:7:8/128").IsValid());
197 1 : BOOST_CHECK(!LookupSubNet("1:2:3:4:5:6:7:8/129").IsValid());
198 1 : BOOST_CHECK(!LookupSubNet("fuzzy").IsValid());
199 :
200 : //CNetAddr constructor test
201 1 : BOOST_CHECK(CSubNet(ResolveIP("127.0.0.1")).IsValid());
202 1 : BOOST_CHECK(CSubNet(ResolveIP("127.0.0.1")).Match(ResolveIP("127.0.0.1")));
203 1 : BOOST_CHECK(!CSubNet(ResolveIP("127.0.0.1")).Match(ResolveIP("127.0.0.2")));
204 1 : BOOST_CHECK(CSubNet(ResolveIP("127.0.0.1")).ToString() == "127.0.0.1/32");
205 :
206 1 : CSubNet subnet = CSubNet(ResolveIP("1.2.3.4"), 32);
207 1 : BOOST_CHECK_EQUAL(subnet.ToString(), "1.2.3.4/32");
208 1 : subnet = CSubNet(ResolveIP("1.2.3.4"), 8);
209 1 : BOOST_CHECK_EQUAL(subnet.ToString(), "1.0.0.0/8");
210 1 : subnet = CSubNet(ResolveIP("1.2.3.4"), 0);
211 1 : BOOST_CHECK_EQUAL(subnet.ToString(), "0.0.0.0/0");
212 :
213 1 : subnet = CSubNet(ResolveIP("1.2.3.4"), ResolveIP("255.255.255.255"));
214 1 : BOOST_CHECK_EQUAL(subnet.ToString(), "1.2.3.4/32");
215 1 : subnet = CSubNet(ResolveIP("1.2.3.4"), ResolveIP("255.0.0.0"));
216 1 : BOOST_CHECK_EQUAL(subnet.ToString(), "1.0.0.0/8");
217 1 : subnet = CSubNet(ResolveIP("1.2.3.4"), ResolveIP("0.0.0.0"));
218 1 : BOOST_CHECK_EQUAL(subnet.ToString(), "0.0.0.0/0");
219 :
220 1 : BOOST_CHECK(CSubNet(ResolveIP("1:2:3:4:5:6:7:8")).IsValid());
221 1 : BOOST_CHECK(CSubNet(ResolveIP("1:2:3:4:5:6:7:8")).Match(ResolveIP("1:2:3:4:5:6:7:8")));
222 1 : BOOST_CHECK(!CSubNet(ResolveIP("1:2:3:4:5:6:7:8")).Match(ResolveIP("1:2:3:4:5:6:7:9")));
223 1 : BOOST_CHECK(CSubNet(ResolveIP("1:2:3:4:5:6:7:8")).ToString() == "1:2:3:4:5:6:7:8/128");
224 : // IPv4 address with IPv6 netmask or the other way around.
225 1 : BOOST_CHECK(!CSubNet(ResolveIP("1.1.1.1"), ResolveIP("ffff::")).IsValid());
226 1 : BOOST_CHECK(!CSubNet(ResolveIP("::1"), ResolveIP("255.0.0.0")).IsValid());
227 :
228 : // Create Non-IP subnets.
229 :
230 1 : const CNetAddr tor_addr{
231 1 : ResolveIP("pg6mmjiyjmcrsslvykfwnntlaru7p5svn6y2ymmju6nubxndf4pscryd.onion")};
232 :
233 1 : subnet = CSubNet(tor_addr);
234 1 : BOOST_CHECK(subnet.IsValid());
235 1 : BOOST_CHECK_EQUAL(subnet.ToString(), tor_addr.ToStringAddr());
236 1 : BOOST_CHECK(subnet.Match(tor_addr));
237 1 : BOOST_CHECK(
238 : !subnet.Match(ResolveIP("kpgvmscirrdqpekbqjsvw5teanhatztpp2gl6eee4zkowvwfxwenqaid.onion")));
239 1 : BOOST_CHECK(!subnet.Match(ResolveIP("1.2.3.4")));
240 :
241 1 : BOOST_CHECK(!CSubNet(tor_addr, 200).IsValid());
242 1 : BOOST_CHECK(!CSubNet(tor_addr, ResolveIP("255.0.0.0")).IsValid());
243 :
244 1 : subnet = LookupSubNet("1.2.3.4/255.255.255.255");
245 1 : BOOST_CHECK_EQUAL(subnet.ToString(), "1.2.3.4/32");
246 1 : subnet = LookupSubNet("1.2.3.4/255.255.255.254");
247 1 : BOOST_CHECK_EQUAL(subnet.ToString(), "1.2.3.4/31");
248 1 : subnet = LookupSubNet("1.2.3.4/255.255.255.252");
249 1 : BOOST_CHECK_EQUAL(subnet.ToString(), "1.2.3.4/30");
250 1 : subnet = LookupSubNet("1.2.3.4/255.255.255.248");
251 1 : BOOST_CHECK_EQUAL(subnet.ToString(), "1.2.3.0/29");
252 1 : subnet = LookupSubNet("1.2.3.4/255.255.255.240");
253 1 : BOOST_CHECK_EQUAL(subnet.ToString(), "1.2.3.0/28");
254 1 : subnet = LookupSubNet("1.2.3.4/255.255.255.224");
255 1 : BOOST_CHECK_EQUAL(subnet.ToString(), "1.2.3.0/27");
256 1 : subnet = LookupSubNet("1.2.3.4/255.255.255.192");
257 1 : BOOST_CHECK_EQUAL(subnet.ToString(), "1.2.3.0/26");
258 1 : subnet = LookupSubNet("1.2.3.4/255.255.255.128");
259 1 : BOOST_CHECK_EQUAL(subnet.ToString(), "1.2.3.0/25");
260 1 : subnet = LookupSubNet("1.2.3.4/255.255.255.0");
261 1 : BOOST_CHECK_EQUAL(subnet.ToString(), "1.2.3.0/24");
262 1 : subnet = LookupSubNet("1.2.3.4/255.255.254.0");
263 1 : BOOST_CHECK_EQUAL(subnet.ToString(), "1.2.2.0/23");
264 1 : subnet = LookupSubNet("1.2.3.4/255.255.252.0");
265 1 : BOOST_CHECK_EQUAL(subnet.ToString(), "1.2.0.0/22");
266 1 : subnet = LookupSubNet("1.2.3.4/255.255.248.0");
267 1 : BOOST_CHECK_EQUAL(subnet.ToString(), "1.2.0.0/21");
268 1 : subnet = LookupSubNet("1.2.3.4/255.255.240.0");
269 1 : BOOST_CHECK_EQUAL(subnet.ToString(), "1.2.0.0/20");
270 1 : subnet = LookupSubNet("1.2.3.4/255.255.224.0");
271 1 : BOOST_CHECK_EQUAL(subnet.ToString(), "1.2.0.0/19");
272 1 : subnet = LookupSubNet("1.2.3.4/255.255.192.0");
273 1 : BOOST_CHECK_EQUAL(subnet.ToString(), "1.2.0.0/18");
274 1 : subnet = LookupSubNet("1.2.3.4/255.255.128.0");
275 1 : BOOST_CHECK_EQUAL(subnet.ToString(), "1.2.0.0/17");
276 1 : subnet = LookupSubNet("1.2.3.4/255.255.0.0");
277 1 : BOOST_CHECK_EQUAL(subnet.ToString(), "1.2.0.0/16");
278 1 : subnet = LookupSubNet("1.2.3.4/255.254.0.0");
279 1 : BOOST_CHECK_EQUAL(subnet.ToString(), "1.2.0.0/15");
280 1 : subnet = LookupSubNet("1.2.3.4/255.252.0.0");
281 1 : BOOST_CHECK_EQUAL(subnet.ToString(), "1.0.0.0/14");
282 1 : subnet = LookupSubNet("1.2.3.4/255.248.0.0");
283 1 : BOOST_CHECK_EQUAL(subnet.ToString(), "1.0.0.0/13");
284 1 : subnet = LookupSubNet("1.2.3.4/255.240.0.0");
285 1 : BOOST_CHECK_EQUAL(subnet.ToString(), "1.0.0.0/12");
286 1 : subnet = LookupSubNet("1.2.3.4/255.224.0.0");
287 1 : BOOST_CHECK_EQUAL(subnet.ToString(), "1.0.0.0/11");
288 1 : subnet = LookupSubNet("1.2.3.4/255.192.0.0");
289 1 : BOOST_CHECK_EQUAL(subnet.ToString(), "1.0.0.0/10");
290 1 : subnet = LookupSubNet("1.2.3.4/255.128.0.0");
291 1 : BOOST_CHECK_EQUAL(subnet.ToString(), "1.0.0.0/9");
292 1 : subnet = LookupSubNet("1.2.3.4/255.0.0.0");
293 1 : BOOST_CHECK_EQUAL(subnet.ToString(), "1.0.0.0/8");
294 1 : subnet = LookupSubNet("1.2.3.4/254.0.0.0");
295 1 : BOOST_CHECK_EQUAL(subnet.ToString(), "0.0.0.0/7");
296 1 : subnet = LookupSubNet("1.2.3.4/252.0.0.0");
297 1 : BOOST_CHECK_EQUAL(subnet.ToString(), "0.0.0.0/6");
298 1 : subnet = LookupSubNet("1.2.3.4/248.0.0.0");
299 1 : BOOST_CHECK_EQUAL(subnet.ToString(), "0.0.0.0/5");
300 1 : subnet = LookupSubNet("1.2.3.4/240.0.0.0");
301 1 : BOOST_CHECK_EQUAL(subnet.ToString(), "0.0.0.0/4");
302 1 : subnet = LookupSubNet("1.2.3.4/224.0.0.0");
303 1 : BOOST_CHECK_EQUAL(subnet.ToString(), "0.0.0.0/3");
304 1 : subnet = LookupSubNet("1.2.3.4/192.0.0.0");
305 1 : BOOST_CHECK_EQUAL(subnet.ToString(), "0.0.0.0/2");
306 1 : subnet = LookupSubNet("1.2.3.4/128.0.0.0");
307 1 : BOOST_CHECK_EQUAL(subnet.ToString(), "0.0.0.0/1");
308 1 : subnet = LookupSubNet("1.2.3.4/0.0.0.0");
309 1 : BOOST_CHECK_EQUAL(subnet.ToString(), "0.0.0.0/0");
310 :
311 1 : subnet = LookupSubNet("1:2:3:4:5:6:7:8/ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff");
312 1 : BOOST_CHECK_EQUAL(subnet.ToString(), "1:2:3:4:5:6:7:8/128");
313 1 : subnet = LookupSubNet("1:2:3:4:5:6:7:8/ffff:0000:0000:0000:0000:0000:0000:0000");
314 1 : BOOST_CHECK_EQUAL(subnet.ToString(), "1::/16");
315 1 : subnet = LookupSubNet("1:2:3:4:5:6:7:8/0000:0000:0000:0000:0000:0000:0000:0000");
316 1 : BOOST_CHECK_EQUAL(subnet.ToString(), "::/0");
317 : // Invalid netmasks (with 1-bits after 0-bits)
318 1 : subnet = LookupSubNet("1.2.3.4/255.255.232.0");
319 1 : BOOST_CHECK(!subnet.IsValid());
320 1 : subnet = LookupSubNet("1.2.3.4/255.0.255.255");
321 1 : BOOST_CHECK(!subnet.IsValid());
322 1 : subnet = LookupSubNet("1:2:3:4:5:6:7:8/ffff:ffff:ffff:fffe:ffff:ffff:ffff:ff0f");
323 1 : BOOST_CHECK(!subnet.IsValid());
324 1 : }
325 :
326 149 : BOOST_AUTO_TEST_CASE(netbase_getgroup)
327 : {
328 1 : NetGroupManager netgroupman{std::vector<bool>()}; // use /16
329 1 : BOOST_CHECK(netgroupman.GetGroup(ResolveIP("127.0.0.1")) == std::vector<unsigned char>({0})); // Local -> !Routable()
330 1 : BOOST_CHECK(netgroupman.GetGroup(ResolveIP("257.0.0.1")) == std::vector<unsigned char>({0})); // !Valid -> !Routable()
331 1 : BOOST_CHECK(netgroupman.GetGroup(ResolveIP("10.0.0.1")) == std::vector<unsigned char>({0})); // RFC1918 -> !Routable()
332 1 : BOOST_CHECK(netgroupman.GetGroup(ResolveIP("169.254.1.1")) == std::vector<unsigned char>({0})); // RFC3927 -> !Routable()
333 1 : BOOST_CHECK(netgroupman.GetGroup(ResolveIP("1.2.3.4")) == std::vector<unsigned char>({(unsigned char)NET_IPV4, 1, 2})); // IPv4
334 1 : BOOST_CHECK(netgroupman.GetGroup(ResolveIP("::FFFF:0:102:304")) == std::vector<unsigned char>({(unsigned char)NET_IPV4, 1, 2})); // RFC6145
335 1 : BOOST_CHECK(netgroupman.GetGroup(ResolveIP("64:FF9B::102:304")) == std::vector<unsigned char>({(unsigned char)NET_IPV4, 1, 2})); // RFC6052
336 1 : BOOST_CHECK(netgroupman.GetGroup(ResolveIP("2002:102:304:9999:9999:9999:9999:9999")) == std::vector<unsigned char>({(unsigned char)NET_IPV4, 1, 2})); // RFC3964
337 1 : BOOST_CHECK(netgroupman.GetGroup(ResolveIP("2001:0:9999:9999:9999:9999:FEFD:FCFB")) == std::vector<unsigned char>({(unsigned char)NET_IPV4, 1, 2})); // RFC4380
338 1 : BOOST_CHECK(netgroupman.GetGroup(ResolveIP("2001:470:abcd:9999:9999:9999:9999:9999")) == std::vector<unsigned char>({(unsigned char)NET_IPV6, 32, 1, 4, 112, 175})); //he.net
339 1 : BOOST_CHECK(netgroupman.GetGroup(ResolveIP("2001:2001:9999:9999:9999:9999:9999:9999")) == std::vector<unsigned char>({(unsigned char)NET_IPV6, 32, 1, 32, 1})); //IPv6
340 :
341 : // baz.net sha256 hash: 12929400eb4607c4ac075f087167e75286b179c693eb059a01774b864e8fe505
342 1 : std::vector<unsigned char> internal_group = {NET_INTERNAL, 0x12, 0x92, 0x94, 0x00, 0xeb, 0x46, 0x07, 0xc4, 0xac, 0x07};
343 1 : BOOST_CHECK(netgroupman.GetGroup(CreateInternal("baz.net")) == internal_group);
344 1 : }
345 :
346 : // Since CNetAddr (un)ser is tested separately in net_tests.cpp here we only
347 : // try a few edge cases for port, service flags and time.
348 :
349 584 : static const std::vector<CAddress> fixture_addresses({
350 146 : CAddress{
351 146 : CService(CNetAddr(in6_addr(IN6ADDR_LOOPBACK_INIT)), 0 /* port */),
352 : NODE_NONE,
353 146 : NodeSeconds{0x4966bc61s}, /* Fri Jan 9 02:54:25 UTC 2009 */
354 : },
355 146 : CAddress{
356 146 : CService(CNetAddr(in6_addr(IN6ADDR_LOOPBACK_INIT)), 0x00f1 /* port */),
357 : NODE_NETWORK,
358 146 : NodeSeconds{0x83766279s}, /* Tue Nov 22 11:22:33 UTC 2039 */
359 : },
360 146 : CAddress{
361 146 : CService(CNetAddr(in6_addr(IN6ADDR_LOOPBACK_INIT)), 0xf1f2 /* port */),
362 : static_cast<ServiceFlags>(NODE_NETWORK_LIMITED),
363 146 : NodeSeconds{0xffffffffs}, /* Sun Feb 7 06:28:15 UTC 2106 */
364 : },
365 : });
366 :
367 : // fixture_addresses should equal to this when serialized in V1 format.
368 : // When this is unserialized from V1 format it should equal to fixture_addresses.
369 : static constexpr const char* stream_addrv1_hex =
370 : "03" // number of entries
371 :
372 : "61bc6649" // time, Fri Jan 9 02:54:25 UTC 2009
373 : "0000000000000000" // service flags, NODE_NONE
374 : "00000000000000000000000000000001" // address, fixed 16 bytes (IPv4 embedded in IPv6)
375 : "0000" // port
376 :
377 : "79627683" // time, Tue Nov 22 11:22:33 UTC 2039
378 : "0100000000000000" // service flags, NODE_NETWORK
379 : "00000000000000000000000000000001" // address, fixed 16 bytes (IPv6)
380 : "00f1" // port
381 :
382 : "ffffffff" // time, Sun Feb 7 06:28:15 UTC 2106
383 : "0004000000000000" // service flags, NODE_NETWORK_LIMITED
384 : "00000000000000000000000000000001" // address, fixed 16 bytes (IPv6)
385 : "f1f2"; // port
386 :
387 : // fixture_addresses should equal to this when serialized in V2 format.
388 : // When this is unserialized from V2 format it should equal to fixture_addresses.
389 : static constexpr const char* stream_addrv2_hex =
390 : "03" // number of entries
391 :
392 : "61bc6649" // time, Fri Jan 9 02:54:25 UTC 2009
393 : "00" // service flags, COMPACTSIZE(NODE_NONE)
394 : "02" // network id, IPv6
395 : "10" // address length, COMPACTSIZE(16)
396 : "00000000000000000000000000000001" // address
397 : "0000" // port
398 :
399 : "79627683" // time, Tue Nov 22 11:22:33 UTC 2039
400 : "01" // service flags, COMPACTSIZE(NODE_NETWORK)
401 : "02" // network id, IPv6
402 : "10" // address length, COMPACTSIZE(16)
403 : "00000000000000000000000000000001" // address
404 : "00f1" // port
405 :
406 : "ffffffff" // time, Sun Feb 7 06:28:15 UTC 2106
407 : "fd0004" // service flags, COMPACTSIZE(NODE_NETWORK_LIMITED)
408 : "02" // network id, IPv6
409 : "10" // address length, COMPACTSIZE(16)
410 : "00000000000000000000000000000001" // address
411 : "f1f2"; // port
412 :
413 149 : BOOST_AUTO_TEST_CASE(caddress_serialize_v1)
414 : {
415 1 : CDataStream s(SER_NETWORK, PROTOCOL_VERSION);
416 :
417 1 : s << fixture_addresses;
418 1 : BOOST_CHECK_EQUAL(HexStr(s), stream_addrv1_hex);
419 1 : }
420 :
421 149 : BOOST_AUTO_TEST_CASE(caddress_unserialize_v1)
422 : {
423 1 : CDataStream s(ParseHex(stream_addrv1_hex), SER_NETWORK, PROTOCOL_VERSION);
424 1 : std::vector<CAddress> addresses_unserialized;
425 :
426 1 : s >> addresses_unserialized;
427 1 : BOOST_CHECK(fixture_addresses == addresses_unserialized);
428 1 : }
429 :
430 149 : BOOST_AUTO_TEST_CASE(caddress_serialize_v2)
431 : {
432 1 : CDataStream s(SER_NETWORK, PROTOCOL_VERSION | ADDRV2_FORMAT);
433 :
434 1 : s << fixture_addresses;
435 1 : BOOST_CHECK_EQUAL(HexStr(s), stream_addrv2_hex);
436 1 : }
437 :
438 149 : BOOST_AUTO_TEST_CASE(caddress_unserialize_v2)
439 : {
440 1 : CDataStream s(ParseHex(stream_addrv2_hex), SER_NETWORK, PROTOCOL_VERSION | ADDRV2_FORMAT);
441 1 : std::vector<CAddress> addresses_unserialized;
442 :
443 1 : s >> addresses_unserialized;
444 1 : BOOST_CHECK(fixture_addresses == addresses_unserialized);
445 1 : }
446 :
447 149 : BOOST_AUTO_TEST_CASE(isbadport)
448 : {
449 1 : BOOST_CHECK(IsBadPort(1));
450 1 : BOOST_CHECK(IsBadPort(22));
451 1 : BOOST_CHECK(IsBadPort(6000));
452 :
453 : // We don't expect Dash Core to operate over HTTP(S)
454 1 : BOOST_CHECK(IsBadPort(80));
455 1 : BOOST_CHECK(IsBadPort(443));
456 :
457 : // We shouldn't use ports used by Bitcoin Core
458 1 : BOOST_CHECK(IsBadPort(8332));
459 1 : BOOST_CHECK(IsBadPort(8333));
460 1 : BOOST_CHECK(IsBadPort(18332));
461 1 : BOOST_CHECK(IsBadPort(18333));
462 :
463 1 : BOOST_CHECK(!IsBadPort(0));
464 1 : BOOST_CHECK(!IsBadPort(9998));
465 1 : BOOST_CHECK(!IsBadPort(9999));
466 1 : BOOST_CHECK(!IsBadPort(26656));
467 :
468 : // Check all ports, there must be 21 bad ports in addition to the restriction on privileged ports.
469 1 : size_t total_bad_ports{0};
470 65536 : for (uint16_t port = std::numeric_limits<uint16_t>::max(); port > 0; --port) {
471 65535 : if (IsBadPort(port)) {
472 1044 : ++total_bad_ports;
473 1044 : }
474 65535 : }
475 1 : BOOST_CHECK_EQUAL(total_bad_ports - PRIVILEGED_PORTS_THRESHOLD, 21);
476 1 : }
477 :
478 149 : BOOST_AUTO_TEST_CASE(netbase_parsenetwork)
479 : {
480 1 : BOOST_CHECK_EQUAL(ParseNetwork("ipv4"), NET_IPV4);
481 1 : BOOST_CHECK_EQUAL(ParseNetwork("ipv6"), NET_IPV6);
482 1 : BOOST_CHECK_EQUAL(ParseNetwork("onion"), NET_ONION);
483 1 : BOOST_CHECK_EQUAL(ParseNetwork("tor"), NET_ONION);
484 1 : BOOST_CHECK_EQUAL(ParseNetwork("cjdns"), NET_CJDNS);
485 :
486 1 : BOOST_CHECK_EQUAL(ParseNetwork("IPv4"), NET_IPV4);
487 1 : BOOST_CHECK_EQUAL(ParseNetwork("IPv6"), NET_IPV6);
488 1 : BOOST_CHECK_EQUAL(ParseNetwork("ONION"), NET_ONION);
489 1 : BOOST_CHECK_EQUAL(ParseNetwork("TOR"), NET_ONION);
490 1 : BOOST_CHECK_EQUAL(ParseNetwork("CJDNS"), NET_CJDNS);
491 :
492 1 : BOOST_CHECK_EQUAL(ParseNetwork(":)"), NET_UNROUTABLE);
493 1 : BOOST_CHECK_EQUAL(ParseNetwork("tÖr"), NET_UNROUTABLE);
494 1 : BOOST_CHECK_EQUAL(ParseNetwork("\xfe\xff"), NET_UNROUTABLE);
495 1 : BOOST_CHECK_EQUAL(ParseNetwork(""), NET_UNROUTABLE);
496 1 : }
497 :
498 149 : BOOST_AUTO_TEST_CASE(netpermissions_test)
499 : {
500 1 : bilingual_str error;
501 1 : NetWhitebindPermissions whitebindPermissions;
502 1 : NetWhitelistPermissions whitelistPermissions;
503 :
504 : // Detect invalid white bind
505 1 : BOOST_CHECK(!NetWhitebindPermissions::TryParse("", whitebindPermissions, error));
506 1 : BOOST_CHECK(error.original.find("Cannot resolve -whitebind address") != std::string::npos);
507 1 : BOOST_CHECK(!NetWhitebindPermissions::TryParse("127.0.0.1", whitebindPermissions, error));
508 1 : BOOST_CHECK(error.original.find("Need to specify a port with -whitebind") != std::string::npos);
509 1 : BOOST_CHECK(!NetWhitebindPermissions::TryParse("", whitebindPermissions, error));
510 :
511 : // If no permission flags, assume backward compatibility
512 1 : BOOST_CHECK(NetWhitebindPermissions::TryParse("1.2.3.4:32", whitebindPermissions, error));
513 1 : BOOST_CHECK(error.empty());
514 1 : BOOST_CHECK_EQUAL(whitebindPermissions.m_flags, NetPermissionFlags::Implicit);
515 1 : BOOST_CHECK(NetPermissions::HasFlag(whitebindPermissions.m_flags, NetPermissionFlags::Implicit));
516 1 : NetPermissions::ClearFlag(whitebindPermissions.m_flags, NetPermissionFlags::Implicit);
517 1 : BOOST_CHECK(!NetPermissions::HasFlag(whitebindPermissions.m_flags, NetPermissionFlags::Implicit));
518 1 : BOOST_CHECK_EQUAL(whitebindPermissions.m_flags, NetPermissionFlags::None);
519 1 : NetPermissions::AddFlag(whitebindPermissions.m_flags, NetPermissionFlags::Implicit);
520 1 : BOOST_CHECK(NetPermissions::HasFlag(whitebindPermissions.m_flags, NetPermissionFlags::Implicit));
521 :
522 : // Can set one permission
523 1 : BOOST_CHECK(NetWhitebindPermissions::TryParse("bloom@1.2.3.4:32", whitebindPermissions, error));
524 1 : BOOST_CHECK_EQUAL(whitebindPermissions.m_flags, NetPermissionFlags::BloomFilter);
525 1 : BOOST_CHECK(NetWhitebindPermissions::TryParse("@1.2.3.4:32", whitebindPermissions, error));
526 1 : BOOST_CHECK_EQUAL(whitebindPermissions.m_flags, NetPermissionFlags::None);
527 :
528 1 : NetWhitebindPermissions noban, noban_download, download_noban, download;
529 :
530 : // "noban" implies "download"
531 1 : BOOST_REQUIRE(NetWhitebindPermissions::TryParse("noban@1.2.3.4:32", noban, error));
532 1 : BOOST_CHECK_EQUAL(noban.m_flags, NetPermissionFlags::NoBan);
533 1 : BOOST_CHECK(NetPermissions::HasFlag(noban.m_flags, NetPermissionFlags::Download));
534 1 : BOOST_CHECK(NetPermissions::HasFlag(noban.m_flags, NetPermissionFlags::NoBan));
535 :
536 : // "noban,download" is equivalent to "noban"
537 1 : BOOST_REQUIRE(NetWhitebindPermissions::TryParse("noban,download@1.2.3.4:32", noban_download, error));
538 1 : BOOST_CHECK_EQUAL(noban_download.m_flags, noban.m_flags);
539 :
540 : // "download,noban" is equivalent to "noban"
541 1 : BOOST_REQUIRE(NetWhitebindPermissions::TryParse("download,noban@1.2.3.4:32", download_noban, error));
542 1 : BOOST_CHECK_EQUAL(download_noban.m_flags, noban.m_flags);
543 :
544 : // "download" excludes (does not imply) "noban"
545 1 : BOOST_REQUIRE(NetWhitebindPermissions::TryParse("download@1.2.3.4:32", download, error));
546 1 : BOOST_CHECK_EQUAL(download.m_flags, NetPermissionFlags::Download);
547 1 : BOOST_CHECK(NetPermissions::HasFlag(download.m_flags, NetPermissionFlags::Download));
548 1 : BOOST_CHECK(!NetPermissions::HasFlag(download.m_flags, NetPermissionFlags::NoBan));
549 :
550 : // Happy path, can parse flags
551 1 : BOOST_CHECK(NetWhitebindPermissions::TryParse("bloom,forcerelay@1.2.3.4:32", whitebindPermissions, error));
552 : // forcerelay should also activate the relay permission
553 1 : BOOST_CHECK_EQUAL(whitebindPermissions.m_flags, NetPermissionFlags::BloomFilter | NetPermissionFlags::ForceRelay | NetPermissionFlags::Relay);
554 1 : BOOST_CHECK(NetWhitebindPermissions::TryParse("bloom,relay,noban@1.2.3.4:32", whitebindPermissions, error));
555 1 : BOOST_CHECK_EQUAL(whitebindPermissions.m_flags, NetPermissionFlags::BloomFilter | NetPermissionFlags::Relay | NetPermissionFlags::NoBan);
556 1 : BOOST_CHECK(NetWhitebindPermissions::TryParse("bloom,forcerelay,noban@1.2.3.4:32", whitebindPermissions, error));
557 1 : BOOST_CHECK(NetWhitebindPermissions::TryParse("all@1.2.3.4:32", whitebindPermissions, error));
558 1 : BOOST_CHECK_EQUAL(whitebindPermissions.m_flags, NetPermissionFlags::All);
559 :
560 : // Allow dups
561 1 : BOOST_CHECK(NetWhitebindPermissions::TryParse("bloom,relay,noban,noban@1.2.3.4:32", whitebindPermissions, error));
562 1 : BOOST_CHECK_EQUAL(whitebindPermissions.m_flags, NetPermissionFlags::BloomFilter | NetPermissionFlags::Relay | NetPermissionFlags::NoBan | NetPermissionFlags::Download); // "noban" implies "download"
563 :
564 : // Allow empty
565 1 : BOOST_CHECK(NetWhitebindPermissions::TryParse("bloom,relay,,noban@1.2.3.4:32", whitebindPermissions, error));
566 1 : BOOST_CHECK_EQUAL(whitebindPermissions.m_flags, NetPermissionFlags::BloomFilter | NetPermissionFlags::Relay | NetPermissionFlags::NoBan);
567 1 : BOOST_CHECK(NetWhitebindPermissions::TryParse(",@1.2.3.4:32", whitebindPermissions, error));
568 1 : BOOST_CHECK_EQUAL(whitebindPermissions.m_flags, NetPermissionFlags::None);
569 1 : BOOST_CHECK(NetWhitebindPermissions::TryParse(",,@1.2.3.4:32", whitebindPermissions, error));
570 1 : BOOST_CHECK_EQUAL(whitebindPermissions.m_flags, NetPermissionFlags::None);
571 :
572 : // Detect invalid flag
573 1 : BOOST_CHECK(!NetWhitebindPermissions::TryParse("bloom,forcerelay,oopsie@1.2.3.4:32", whitebindPermissions, error));
574 1 : BOOST_CHECK(error.original.find("Invalid P2P permission") != std::string::npos);
575 :
576 : // Check netmask error
577 1 : BOOST_CHECK(!NetWhitelistPermissions::TryParse("bloom,forcerelay,noban@1.2.3.4:32", whitelistPermissions, error));
578 1 : BOOST_CHECK(error.original.find("Invalid netmask specified in -whitelist") != std::string::npos);
579 :
580 : // Happy path for whitelist parsing
581 1 : BOOST_CHECK(NetWhitelistPermissions::TryParse("noban@1.2.3.4", whitelistPermissions, error));
582 1 : BOOST_CHECK_EQUAL(whitelistPermissions.m_flags, NetPermissionFlags::NoBan);
583 1 : BOOST_CHECK(NetPermissions::HasFlag(whitelistPermissions.m_flags, NetPermissionFlags::NoBan));
584 :
585 1 : BOOST_CHECK(NetWhitelistPermissions::TryParse("bloom,forcerelay,noban,relay@1.2.3.4/32", whitelistPermissions, error));
586 1 : BOOST_CHECK_EQUAL(whitelistPermissions.m_flags, NetPermissionFlags::BloomFilter | NetPermissionFlags::ForceRelay | NetPermissionFlags::NoBan | NetPermissionFlags::Relay);
587 1 : BOOST_CHECK(error.empty());
588 1 : BOOST_CHECK_EQUAL(whitelistPermissions.m_subnet.ToString(), "1.2.3.4/32");
589 1 : BOOST_CHECK(NetWhitelistPermissions::TryParse("bloom,forcerelay,noban,relay,mempool@1.2.3.4/32", whitelistPermissions, error));
590 :
591 1 : const auto strings = NetPermissions::ToStrings(NetPermissionFlags::All);
592 1 : BOOST_CHECK_EQUAL(strings.size(), 7U);
593 1 : BOOST_CHECK(std::find(strings.begin(), strings.end(), "bloomfilter") != strings.end());
594 1 : BOOST_CHECK(std::find(strings.begin(), strings.end(), "forcerelay") != strings.end());
595 1 : BOOST_CHECK(std::find(strings.begin(), strings.end(), "relay") != strings.end());
596 1 : BOOST_CHECK(std::find(strings.begin(), strings.end(), "noban") != strings.end());
597 1 : BOOST_CHECK(std::find(strings.begin(), strings.end(), "mempool") != strings.end());
598 1 : BOOST_CHECK(std::find(strings.begin(), strings.end(), "download") != strings.end());
599 1 : BOOST_CHECK(std::find(strings.begin(), strings.end(), "addr") != strings.end());
600 1 : }
601 :
602 149 : BOOST_AUTO_TEST_CASE(netbase_dont_resolve_strings_with_embedded_nul_characters)
603 : {
604 1 : BOOST_CHECK(LookupHost("127.0.0.1"s, false).has_value());
605 1 : BOOST_CHECK(!LookupHost("127.0.0.1\0"s, false).has_value());
606 1 : BOOST_CHECK(!LookupHost("127.0.0.1\0example.com"s, false).has_value());
607 1 : BOOST_CHECK(!LookupHost("127.0.0.1\0example.com\0"s, false).has_value());
608 :
609 1 : BOOST_CHECK(LookupSubNet("1.2.3.0/24"s).IsValid());
610 1 : BOOST_CHECK(!LookupSubNet("1.2.3.0/24\0"s).IsValid());
611 1 : BOOST_CHECK(!LookupSubNet("1.2.3.0/24\0example.com"s).IsValid());
612 1 : BOOST_CHECK(!LookupSubNet("1.2.3.0/24\0example.com\0"s).IsValid());
613 1 : BOOST_CHECK(LookupSubNet("pg6mmjiyjmcrsslvykfwnntlaru7p5svn6y2ymmju6nubxndf4pscryd.onion"s).IsValid());
614 1 : BOOST_CHECK(!LookupSubNet("pg6mmjiyjmcrsslvykfwnntlaru7p5svn6y2ymmju6nubxndf4pscryd.onion\0"s).IsValid());
615 1 : BOOST_CHECK(!LookupSubNet("pg6mmjiyjmcrsslvykfwnntlaru7p5svn6y2ymmju6nubxndf4pscryd.onion\0example.com"s).IsValid());
616 1 : BOOST_CHECK(!LookupSubNet("pg6mmjiyjmcrsslvykfwnntlaru7p5svn6y2ymmju6nubxndf4pscryd.onion\0example.com\0"s).IsValid());
617 1 : }
618 :
619 146 : BOOST_AUTO_TEST_SUITE_END()
|