Changeset View
Changeset View
Standalone View
Standalone View
src/test/net_tests.cpp
Show First 20 Lines • Show All 340 Lines • ▼ Show 20 Lines | BOOST_AUTO_TEST_CASE(cnetaddr_basic) { | ||||
BOOST_REQUIRE(addr.IsValid()); | BOOST_REQUIRE(addr.IsValid()); | ||||
BOOST_REQUIRE(addr.IsIPv6()); | BOOST_REQUIRE(addr.IsIPv6()); | ||||
BOOST_CHECK(!addr.IsBindAny()); | BOOST_CHECK(!addr.IsBindAny()); | ||||
BOOST_CHECK_EQUAL(addr.ToString(), | BOOST_CHECK_EQUAL(addr.ToString(), | ||||
"1122:3344:5566:7788:9900:aabb:ccdd:eeff"); | "1122:3344:5566:7788:9900:aabb:ccdd:eeff"); | ||||
// TORv2 | // TORv2 | ||||
addr.SetSpecial("6hzph5hv6337r6p2.onion"); | BOOST_REQUIRE(addr.SetSpecial("6hzph5hv6337r6p2.onion")); | ||||
BOOST_REQUIRE(addr.IsValid()); | BOOST_REQUIRE(addr.IsValid()); | ||||
BOOST_REQUIRE(addr.IsTor()); | BOOST_REQUIRE(addr.IsTor()); | ||||
BOOST_CHECK(!addr.IsBindAny()); | BOOST_CHECK(!addr.IsBindAny()); | ||||
BOOST_CHECK_EQUAL(addr.ToString(), "6hzph5hv6337r6p2.onion"); | BOOST_CHECK_EQUAL(addr.ToString(), "6hzph5hv6337r6p2.onion"); | ||||
// TORv3 | |||||
const char *torv3_addr = | |||||
"pg6mmjiyjmcrsslvykfwnntlaru7p5svn6y2ymmju6nubxndf4pscryd.onion"; | |||||
BOOST_REQUIRE(addr.SetSpecial(torv3_addr)); | |||||
BOOST_REQUIRE(addr.IsValid()); | |||||
BOOST_REQUIRE(addr.IsTor()); | |||||
BOOST_CHECK(!addr.IsBindAny()); | |||||
BOOST_CHECK_EQUAL(addr.ToString(), torv3_addr); | |||||
// TORv3, broken, with wrong checksum | |||||
BOOST_CHECK(!addr.SetSpecial( | |||||
"pg6mmjiyjmcrsslvykfwnntlaru7p5svn6y2ymmju6nubxndf4pscsad.onion")); | |||||
// TORv3, broken, with wrong version | |||||
BOOST_CHECK(!addr.SetSpecial( | |||||
"pg6mmjiyjmcrsslvykfwnntlaru7p5svn6y2ymmju6nubxndf4pscrye.onion")); | |||||
// TORv3, malicious | |||||
BOOST_CHECK(!addr.SetSpecial(std::string{ | |||||
"pg6mmjiyjmcrsslvykfwnntlaru7p5svn6y2ymmju6nubxndf4pscryd\0wtf.onion", | |||||
66})); | |||||
// TOR, bogus length | |||||
BOOST_CHECK(!addr.SetSpecial(std::string{"mfrggzak.onion"})); | |||||
// TOR, invalid base32 | |||||
BOOST_CHECK(!addr.SetSpecial(std::string{"mf*g zak.onion"})); | |||||
// Internal | // Internal | ||||
addr.SetInternal("esffpp"); | addr.SetInternal("esffpp"); | ||||
// "internal" is considered invalid | // "internal" is considered invalid | ||||
BOOST_REQUIRE(!addr.IsValid()); | BOOST_REQUIRE(!addr.IsValid()); | ||||
BOOST_REQUIRE(addr.IsInternal()); | BOOST_REQUIRE(addr.IsInternal()); | ||||
BOOST_CHECK(!addr.IsBindAny()); | BOOST_CHECK(!addr.IsBindAny()); | ||||
BOOST_CHECK_EQUAL(addr.ToString(), "esffpvrt3wpeaygy.internal"); | BOOST_CHECK_EQUAL(addr.ToString(), "esffpvrt3wpeaygy.internal"); | ||||
// Totally bogus | |||||
BOOST_CHECK(!addr.SetSpecial("totally bogus")); | |||||
} | } | ||||
BOOST_AUTO_TEST_CASE(cnetaddr_serialize_v1) { | BOOST_AUTO_TEST_CASE(cnetaddr_serialize_v1) { | ||||
CNetAddr addr; | CNetAddr addr; | ||||
CDataStream s(SER_NETWORK, PROTOCOL_VERSION); | CDataStream s(SER_NETWORK, PROTOCOL_VERSION); | ||||
s << addr; | s << addr; | ||||
BOOST_CHECK_EQUAL(HexStr(s), "00000000000000000000000000000000"); | BOOST_CHECK_EQUAL(HexStr(s), "00000000000000000000000000000000"); | ||||
Show All 10 Lines | BOOST_AUTO_TEST_CASE(cnetaddr_serialize_v1) { | ||||
BOOST_CHECK_EQUAL(HexStr(s), "1a1b2a2b3a3b4a4b5a5b6a6b7a7b8a8b"); | BOOST_CHECK_EQUAL(HexStr(s), "1a1b2a2b3a3b4a4b5a5b6a6b7a7b8a8b"); | ||||
s.clear(); | s.clear(); | ||||
BOOST_REQUIRE(addr.SetSpecial("6hzph5hv6337r6p2.onion")); | BOOST_REQUIRE(addr.SetSpecial("6hzph5hv6337r6p2.onion")); | ||||
s << addr; | s << addr; | ||||
BOOST_CHECK_EQUAL(HexStr(s), "fd87d87eeb43f1f2f3f4f5f6f7f8f9fa"); | BOOST_CHECK_EQUAL(HexStr(s), "fd87d87eeb43f1f2f3f4f5f6f7f8f9fa"); | ||||
s.clear(); | s.clear(); | ||||
BOOST_REQUIRE(addr.SetSpecial( | |||||
"pg6mmjiyjmcrsslvykfwnntlaru7p5svn6y2ymmju6nubxndf4pscryd.onion")); | |||||
s << addr; | |||||
BOOST_CHECK_EQUAL(HexStr(s), "00000000000000000000000000000000"); | |||||
s.clear(); | |||||
addr.SetInternal("a"); | addr.SetInternal("a"); | ||||
s << addr; | s << addr; | ||||
BOOST_CHECK_EQUAL(HexStr(s), "fd6b88c08724ca978112ca1bbdcafac2"); | BOOST_CHECK_EQUAL(HexStr(s), "fd6b88c08724ca978112ca1bbdcafac2"); | ||||
s.clear(); | s.clear(); | ||||
} | } | ||||
BOOST_AUTO_TEST_CASE(cnetaddr_serialize_v2) { | BOOST_AUTO_TEST_CASE(cnetaddr_serialize_v2) { | ||||
CNetAddr addr; | CNetAddr addr; | ||||
Show All 17 Lines | BOOST_AUTO_TEST_CASE(cnetaddr_serialize_v2) { | ||||
BOOST_CHECK_EQUAL(HexStr(s), "02101a1b2a2b3a3b4a4b5a5b6a6b7a7b8a8b"); | BOOST_CHECK_EQUAL(HexStr(s), "02101a1b2a2b3a3b4a4b5a5b6a6b7a7b8a8b"); | ||||
s.clear(); | s.clear(); | ||||
BOOST_REQUIRE(addr.SetSpecial("6hzph5hv6337r6p2.onion")); | BOOST_REQUIRE(addr.SetSpecial("6hzph5hv6337r6p2.onion")); | ||||
s << addr; | s << addr; | ||||
BOOST_CHECK_EQUAL(HexStr(s), "030af1f2f3f4f5f6f7f8f9fa"); | BOOST_CHECK_EQUAL(HexStr(s), "030af1f2f3f4f5f6f7f8f9fa"); | ||||
s.clear(); | s.clear(); | ||||
BOOST_REQUIRE(addr.SetSpecial( | |||||
"kpgvmscirrdqpekbqjsvw5teanhatztpp2gl6eee4zkowvwfxwenqaid.onion")); | |||||
s << addr; | |||||
BOOST_CHECK_EQUAL( | |||||
HexStr(s), | |||||
"042053cd5648488c4707914182655b7664034e09e66f7e8cbf1084e654eb56c5bd88"); | |||||
s.clear(); | |||||
BOOST_REQUIRE(addr.SetInternal("a")); | BOOST_REQUIRE(addr.SetInternal("a")); | ||||
s << addr; | s << addr; | ||||
BOOST_CHECK_EQUAL(HexStr(s), "0210fd6b88c08724ca978112ca1bbdcafac2"); | BOOST_CHECK_EQUAL(HexStr(s), "0210fd6b88c08724ca978112ca1bbdcafac2"); | ||||
s.clear(); | s.clear(); | ||||
} | } | ||||
BOOST_AUTO_TEST_CASE(cnetaddr_unserialize_v2) { | BOOST_AUTO_TEST_CASE(cnetaddr_unserialize_v2) { | ||||
CNetAddr addr; | CNetAddr addr; | ||||
▲ Show 20 Lines • Show All 103 Lines • ▼ Show 20 Lines | s << MakeSpan(ParseHex("03" // network type (TORv2) | ||||
"07" // address length | "07" // address length | ||||
"00")); // address | "00")); // address | ||||
BOOST_CHECK_EXCEPTION( | BOOST_CHECK_EXCEPTION( | ||||
s >> addr, std::ios_base::failure, | s >> addr, std::ios_base::failure, | ||||
HasReason("BIP155 TORv2 address with length 7 (should be 10)")); | HasReason("BIP155 TORv2 address with length 7 (should be 10)")); | ||||
BOOST_REQUIRE(!s.empty()); // The stream is not consumed on invalid input. | BOOST_REQUIRE(!s.empty()); // The stream is not consumed on invalid input. | ||||
s.clear(); | s.clear(); | ||||
// Valid TORv3. | |||||
s << MakeSpan(ParseHex("04" // network type (TORv3) | |||||
"20" // address length | |||||
"79bcc625184b05194975c28b66b66b04" // address | |||||
"69f7f6556fb1ac3189a79b40dda32f1f")); | |||||
s >> addr; | |||||
BOOST_CHECK(addr.IsValid()); | |||||
BOOST_CHECK(addr.IsTor()); | |||||
BOOST_CHECK_EQUAL( | |||||
addr.ToString(), | |||||
"pg6mmjiyjmcrsslvykfwnntlaru7p5svn6y2ymmju6nubxndf4pscryd.onion"); | |||||
BOOST_REQUIRE(s.empty()); | |||||
// Invalid TORv3, with bogus length. | |||||
s << MakeSpan(ParseHex("04" // network type (TORv3) | |||||
"00" // address length | |||||
"00" // address | |||||
)); | |||||
BOOST_CHECK_EXCEPTION( | |||||
s >> addr, std::ios_base::failure, | |||||
HasReason("BIP155 TORv3 address with length 0 (should be 32)")); | |||||
BOOST_REQUIRE(!s.empty()); // The stream is not consumed on invalid input. | |||||
s.clear(); | |||||
// Valid I2P. | |||||
s << MakeSpan(ParseHex("05" // network type (I2P) | |||||
"20" // address length | |||||
"a2894dabaec08c0051a481a6dac88b64" // address | |||||
"f98232ae42d4b6fd2fa81952dfe36a87")); | |||||
s >> addr; | |||||
BOOST_CHECK(addr.IsValid()); | |||||
BOOST_CHECK_EQUAL( | |||||
addr.ToString(), | |||||
"ukeu3k5oycgaauneqgtnvselmt4yemvoilkln7jpvamvfx7dnkdq.b32.i2p"); | |||||
BOOST_REQUIRE(s.empty()); | |||||
// Invalid I2P, with bogus length. | |||||
s << MakeSpan(ParseHex("05" // network type (I2P) | |||||
"03" // address length | |||||
"00" // address | |||||
)); | |||||
BOOST_CHECK_EXCEPTION( | |||||
s >> addr, std::ios_base::failure, | |||||
HasReason("BIP155 I2P address with length 3 (should be 32)")); | |||||
BOOST_REQUIRE(!s.empty()); // The stream is not consumed on invalid input. | |||||
s.clear(); | |||||
// Valid CJDNS. | |||||
s << MakeSpan(ParseHex("06" // network type (CJDNS) | |||||
"10" // address length | |||||
"fc000001000200030004000500060007" // address | |||||
)); | |||||
s >> addr; | |||||
BOOST_CHECK(addr.IsValid()); | |||||
BOOST_CHECK_EQUAL(addr.ToString(), "fc00:1:2:3:4:5:6:7"); | |||||
BOOST_REQUIRE(s.empty()); | |||||
// Invalid CJDNS, with bogus length. | |||||
s << MakeSpan(ParseHex("06" // network type (CJDNS) | |||||
"01" // address length | |||||
"00" // address | |||||
)); | |||||
BOOST_CHECK_EXCEPTION( | |||||
s >> addr, std::ios_base::failure, | |||||
HasReason("BIP155 CJDNS address with length 1 (should be 16)")); | |||||
BOOST_REQUIRE(!s.empty()); // The stream is not consumed on invalid input. | |||||
s.clear(); | |||||
// Unknown, with extreme length. | // Unknown, with extreme length. | ||||
s << MakeSpan( | s << MakeSpan( | ||||
ParseHex("aa" // network type (unknown) | ParseHex("aa" // network type (unknown) | ||||
"fe00000002" // address length (CompactSize's MAX_SIZE) | "fe00000002" // address length (CompactSize's MAX_SIZE) | ||||
"01020304050607" // address | "01020304050607" // address | ||||
)); | )); | ||||
BOOST_CHECK_EXCEPTION(s >> addr, std::ios_base::failure, | BOOST_CHECK_EXCEPTION(s >> addr, std::ios_base::failure, | ||||
HasReason("Address too long: 33554432 > 512")); | HasReason("Address too long: 33554432 > 512")); | ||||
▲ Show 20 Lines • Show All 80 Lines • Show Last 20 Lines |