diff options
author | Nick Mathewson <nickm@torproject.org> | 2018-02-16 09:48:11 -0500 |
---|---|---|
committer | Nick Mathewson <nickm@torproject.org> | 2018-02-16 09:48:11 -0500 |
commit | 2bcd264a28e2d6bec1e806e779bf82435c9c7505 (patch) | |
tree | a134a572dd26adf0bef4cf6f2fad56b21c0032b4 /src/common/address.c | |
parent | 3930ffdf63425c344e14c45cff6780108cfa038b (diff) | |
parent | cb92d47deca15c44dd52cad6fc326520648c632e (diff) | |
download | tor-2bcd264a28e2d6bec1e806e779bf82435c9c7505.tar.gz tor-2bcd264a28e2d6bec1e806e779bf82435c9c7505.zip |
Merge branch 'maint-0.2.9' into maint-0.3.1
Diffstat (limited to 'src/common/address.c')
-rw-r--r-- | src/common/address.c | 27 |
1 files changed, 26 insertions, 1 deletions
diff --git a/src/common/address.c b/src/common/address.c index 894e15114c..e6b437e9dd 100644 --- a/src/common/address.c +++ b/src/common/address.c @@ -1183,6 +1183,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) @@ -1191,7 +1194,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: @@ -1202,6 +1205,28 @@ tor_addr_hash(const tor_addr_t *addr) } } +/** As tor_addr_hash, but use a particular siphash key. */ +uint64_t +tor_addr_keyed_hash(const struct sipkey *key, const tor_addr_t *addr) +{ + /* This is duplicate code with tor_addr_hash, since this function needs to + * be backportable all the way to 0.2.9. */ + + switch (tor_addr_family(addr)) { + case AF_INET: + return siphash24(&addr->addr.in_addr.s_addr, 4, key); + case AF_UNSPEC: + return siphash24(unspec_hash_input, sizeof(unspec_hash_input), key); + case AF_INET6: + return siphash24(&addr->addr.in6_addr.s6_addr, 16, key); + default: + /* LCOV_EXCL_START */ + tor_fragile_assert(); + return 0; + /* LCOV_EXCL_END */ + } +} + /** Return a newly allocated string with a representation of <b>addr</b>. */ char * tor_addr_to_str_dup(const tor_addr_t *addr) |