update node ID generation algorithm from RC_0_16

This commit is contained in:
Arvid Norberg 2014-01-06 05:46:46 +00:00
parent 16594d27ef
commit ae7bb20170
2 changed files with 16 additions and 15 deletions

View File

@ -104,8 +104,8 @@ node_id generate_id_impl(address const& ip_, boost::uint32_t r)
{ {
boost::uint8_t* ip = 0; boost::uint8_t* ip = 0;
const static boost::uint8_t v4mask[] = { 0x01, 0x07, 0x1f, 0x7f }; const static boost::uint8_t v4mask[] = { 0x03, 0x0f, 0x3f, 0xff };
const static boost::uint8_t v6mask[] = { 0x00, 0x01, 0x03, 0x07, 0x0f, 0x1f, 0x3f, 0x7f }; const static boost::uint8_t v6mask[] = { 0x01, 0x03, 0x07, 0x0f, 0x1f, 0x3f, 0x7f, 0xff };
boost::uint8_t const* mask = 0; boost::uint8_t const* mask = 0;
int num_octets = 0; int num_octets = 0;
@ -141,10 +141,9 @@ node_id generate_id_impl(address const& ip_, boost::uint32_t r)
id[0] = (c >> 24) & 0xff; id[0] = (c >> 24) & 0xff;
id[1] = (c >> 16) & 0xff; id[1] = (c >> 16) & 0xff;
id[2] = (c >> 8) & 0xff; id[2] = ((c >> 8) & 0xf8) | (random() & 0x7);
id[3] = c & 0xff;
for (int i = 4; i < 19; ++i) id[i] = random(); for (int i = 3; i < 19; ++i) id[i] = random();
id[19] = r; id[19] = r;
return id; return id;
@ -166,7 +165,7 @@ bool verify_id(node_id const& nid, address const& source_ip)
if (is_local(source_ip)) return true; if (is_local(source_ip)) return true;
node_id h = generate_id_impl(source_ip, nid[19]); node_id h = generate_id_impl(source_ip, nid[19]);
return memcmp(&nid[0], &h[0], 4) == 0; return nid[0] == h[0] && nid[1] == h[1] && (nid[2] & 0xf8) == (h[2] & 0xf8);
} }
node_id generate_id(address const& ip) node_id generate_id(address const& ip)

View File

@ -629,7 +629,7 @@ int test_main()
// this is one of the test vectors from: // this is one of the test vectors from:
// http://libtorrent.org/dht_sec.html // http://libtorrent.org/dht_sec.html
source = udp::endpoint(address::from_string("124.31.75.21"), 20); source = udp::endpoint(address::from_string("124.31.75.21"), 20);
node_id nid = to_hash("1712f6c70c5d6a4ec8a88e4c6ab4c28b95eee401"); node_id nid = to_hash("d2a6dfc70c5d6a4ec8a88e4c6ab4c28b95eee401");
send_dht_request(node, "find_node", source, &response, "10", 0, 0, std::string() send_dht_request(node, "find_node", source, &response, "10", 0, 0, std::string()
, 0, "0101010101010101010101010101010101010101", 0, false, false, std::string(), std::string(), -1, 0, &nid); , 0, "0101010101010101010101010101010101010101", 0, false, false, std::string(), std::string(), -1, 0, &nid);
@ -1344,21 +1344,23 @@ int test_main()
int rs[] = { 1,86,22,65,90 }; int rs[] = { 1,86,22,65,90 };
boost::uint8_t prefixes[][4] = boost::uint8_t prefixes[][3] =
{ {
{ 0x17, 0x12, 0xf6, 0xc7 }, { 0xd2, 0xa6, 0xdf },
{ 0x94, 0x64, 0x06, 0xc1 }, { 0x51, 0xd0, 0x29 },
{ 0xfe, 0xfd, 0x92, 0x20 }, { 0xfd, 0x33, 0x4a },
{ 0xaf, 0x15, 0x46, 0xdd }, { 0x6a, 0xa1, 0x69 },
{ 0xa9, 0xe9, 0x20, 0xbf } { 0xeb, 0x64, 0x34 }
}; };
for (int i = 0; i < 5; ++i) for (int i = 0; i < 5; ++i)
{ {
address a = address_v4::from_string(ips[i]); address a = address_v4::from_string(ips[i]);
node_id id = generate_id_impl(a, rs[i]); node_id id = generate_id_impl(a, rs[i]);
for (int j = 0; j < 4; ++j) TEST_CHECK(id[0] == prefixes[i][0]);
TEST_CHECK(id[j] == prefixes[i][j]); TEST_CHECK(id[1] == prefixes[i][1]);
TEST_CHECK((id[2] & 0xf8) == (prefixes[i][2] & 0xf8));
TEST_CHECK(id[19] == rs[i]); TEST_CHECK(id[19] == rs[i]);
fprintf(stderr, "IP address: %s r: %d node ID: %s\n", ips[i] fprintf(stderr, "IP address: %s r: %d node ID: %s\n", ips[i]
, rs[i], to_hex(id.to_string()).c_str()); , rs[i], to_hex(id.to_string()).c_str());