From: Remi Gacogne Date: Mon, 7 Nov 2022 16:54:52 +0000 (+0100) Subject: dnsdist: Add a helper to hash arbitrary data from Lua FFI X-Git-Tag: dnsdist-1.9.0-alpha4~8^2~1 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=859690487ba7055450db74728bd996b9d764dbf6;p=thirdparty%2Fpdns.git dnsdist: Add a helper to hash arbitrary data from Lua FFI --- diff --git a/pdns/dnsdistdist/dnsdist-lua-ffi-interface.h b/pdns/dnsdistdist/dnsdist-lua-ffi-interface.h index 41647bf38b..20d3f6ccb4 100644 --- a/pdns/dnsdistdist/dnsdist-lua-ffi-interface.h +++ b/pdns/dnsdistdist/dnsdist-lua-ffi-interface.h @@ -282,3 +282,5 @@ size_t dnsdist_ffi_dynamic_blocks_get_entries(dnsdist_ffi_dynamic_blocks_list_t* size_t dnsdist_ffi_dynamic_blocks_smt_get_entries(dnsdist_ffi_dynamic_blocks_list_t** out) __attribute__ ((visibility ("default"))); const dnsdist_ffi_dynamic_block_entry_t* dnsdist_ffi_dynamic_blocks_list_get(const dnsdist_ffi_dynamic_blocks_list_t* list, size_t idx) __attribute__ ((visibility ("default"))); void dnsdist_ffi_dynamic_blocks_list_free(dnsdist_ffi_dynamic_blocks_list_t*) __attribute__ ((visibility ("default"))); + +uint32_t dnsdist_ffi_hash(uint32_t seed, const unsigned char* data, size_t dataSize, bool caseInsensitive) __attribute__ ((visibility ("default"))); diff --git a/pdns/dnsdistdist/dnsdist-lua-ffi.cc b/pdns/dnsdistdist/dnsdist-lua-ffi.cc index 65db270ac7..7cf99bb93d 100644 --- a/pdns/dnsdistdist/dnsdist-lua-ffi.cc +++ b/pdns/dnsdistdist/dnsdist-lua-ffi.cc @@ -2003,3 +2003,16 @@ void dnsdist_ffi_dynamic_blocks_list_free(dnsdist_ffi_dynamic_blocks_list_t* lis } #endif /* DISABLE_DYNBLOCKS */ + +uint32_t dnsdist_ffi_hash(uint32_t seed, const unsigned char* data, size_t dataSize, bool caseInsensitive) +{ + if (data == nullptr || dataSize == 0) { + return seed; + } + + if (caseInsensitive) { + return burtleCI(data, dataSize, seed); + } + + return burtle(data, dataSize, seed); +} diff --git a/pdns/dnsdistdist/test-dnsdist-lua-ffi.cc b/pdns/dnsdistdist/test-dnsdist-lua-ffi.cc index cce308eb87..79c9ef9677 100644 --- a/pdns/dnsdistdist/test-dnsdist-lua-ffi.cc +++ b/pdns/dnsdistdist/test-dnsdist-lua-ffi.cc @@ -816,4 +816,31 @@ BOOST_AUTO_TEST_CASE(test_NetworkEndpoint) } } +BOOST_AUTO_TEST_CASE(test_hash) +{ + const uint32_t seed = 0x42; + const std::array data{{'0', 'x', 'd', 'e', 'a', 'd', 'b', 'E', 'e', 'F'}}; + const std::array capitalizedData{{'0', 'X', 'D', 'E', 'A', 'D', 'B', 'E', 'E', 'F'}}; + + { + /* invalid */ + BOOST_CHECK_EQUAL(dnsdist_ffi_hash(0, nullptr, 0, false), 0U); + BOOST_CHECK_EQUAL(dnsdist_ffi_hash(seed, nullptr, 0, false), seed); + } + { + /* case sensitive */ + auto hash = dnsdist_ffi_hash(seed, data.data(), data.size(), false); + BOOST_CHECK_EQUAL(hash, burtle(data.data(), data.size(), seed)); + BOOST_CHECK_NE(hash, burtle(capitalizedData.data(), capitalizedData.size(), seed)); + BOOST_CHECK_NE(hash, burtleCI(capitalizedData.data(), capitalizedData.size(), seed)); + } + { + /* case insensitive */ + auto hash = dnsdist_ffi_hash(seed, data.data(), data.size(), true); + BOOST_CHECK_EQUAL(hash, burtleCI(data.data(), data.size(), seed)); + BOOST_CHECK_NE(hash, burtle(capitalizedData.data(), capitalizedData.size(), seed)); + BOOST_CHECK_EQUAL(hash, burtleCI(capitalizedData.data(), capitalizedData.size(), seed)); + } +} + BOOST_AUTO_TEST_SUITE_END();