]> git.ipfire.org Git - thirdparty/tor.git/commitdiff
Have tor_addr hashes return a randomized hash for AF_UNSPEC.
authorNick Mathewson <nickm@torproject.org>
Mon, 12 Feb 2018 16:08:33 +0000 (11:08 -0500)
committerDavid Goulet <dgoulet@torproject.org>
Mon, 12 Feb 2018 16:14:36 +0000 (11:14 -0500)
We don't expect this to come up very much, but we may as well make
sure that the value isn't predictable (as we do for the other
addresses) in case the issue ever comes up.

Spotted by teor.

src/common/address.c

index 1bd52d24b6678557a85a283b17f587e79866e569..68ad63941161d5687c8314e1eeeeedb4d731f5ff 100644 (file)
@@ -1181,6 +1181,9 @@ tor_addr_compare_masked(const tor_addr_t *addr1, const tor_addr_t *addr2,
   }
 }
 
+/** Input for siphash, to produce some output for an unspec value. */
+static const uint32_t unspec_hash_input[] = { 0x4e4df09f, 0x92985342 };
+
 /** Return a hash code based on the address addr. DOCDOC extra */
 uint64_t
 tor_addr_hash(const tor_addr_t *addr)
@@ -1189,7 +1192,7 @@ tor_addr_hash(const tor_addr_t *addr)
   case AF_INET:
     return siphash24g(&addr->addr.in_addr.s_addr, 4);
   case AF_UNSPEC:
-    return 0x4e4d5342;
+    return siphash24g(unspec_hash_input, sizeof(unspec_hash_input));
   case AF_INET6:
     return siphash24g(&addr->addr.in6_addr.s6_addr, 16);
   default:
@@ -1211,7 +1214,7 @@ tor_addr_keyed_hash(const struct sipkey *key, const tor_addr_t *addr)
   case AF_INET:
     return siphash24(&addr->addr.in_addr.s_addr, 4, key);
   case AF_UNSPEC:
-    return 0x4e4d5342;
+    return siphash24(unspec_hash_input, sizeof(unspec_hash_input), key);
   case AF_INET6:
     return siphash24(&addr->addr.in6_addr.s6_addr, 16, key);
   default: