diff --git a/src/utils/sha1.cpp b/src/utils/sha1.cpp index 47378c9..30d1243 100644 --- a/src/utils/sha1.cpp +++ b/src/utils/sha1.cpp @@ -33,3 +33,22 @@ std::string sha1(const std::string& input) return digest.str(); #endif } + +std::string sha1_raw(const std::string& input) +{ +#ifdef BOTAN_FOUND + auto sha1 = Botan::HashFunction::create_or_throw("SHA-1"); + sha1->update(input); + const auto digest = sha1->final(); + return std::string( + reinterpret_cast(digest.data()), + digest.size() + ); +#endif +#ifdef GCRYPT_FOUND + const auto hash_length = gcry_md_get_algo_dlen(GCRY_MD_SHA1); + std::string output(hash_length, '\0'); + gcry_md_hash_buffer(GCRY_MD_SHA1, output.data(), input.data(), input.size()); + return output; +#endif +} diff --git a/src/utils/sha1.hpp b/src/utils/sha1.hpp index 6c551ac..114baa7 100644 --- a/src/utils/sha1.hpp +++ b/src/utils/sha1.hpp @@ -3,3 +3,4 @@ #include std::string sha1(const std::string& input); +std::string sha1_raw(const std::string& input); diff --git a/src/xmpp/hash_disco.cpp b/src/xmpp/hash_disco.cpp index bb63766..1cf9d98 100644 --- a/src/xmpp/hash_disco.cpp +++ b/src/xmpp/hash_disco.cpp @@ -42,7 +42,7 @@ const std::string hash_disco_sha1(const Stanza &stanza) { s += var + "<"; } - const std::string hashed = sha1(s); + const std::string hashed = sha1_raw(s); const std::string encoded = base64::encode(hashed); return encoded; diff --git a/tests/hash_disco.cpp b/tests/hash_disco.cpp index 6d570a2..a69e76e 100644 --- a/tests/hash_disco.cpp +++ b/tests/hash_disco.cpp @@ -32,7 +32,7 @@ TEST_CASE("Hash disco 1") { auto check_stanza = [](const Stanza &stanza) { const std::string hash = Xmpp::hash_disco_sha1(stanza); - CHECK(hash == "YjVkN2NhODU2ZWQyZjhhNjJjOTE1MWMxYjQ0YmUwM2Q0ODhhZDI2MA=="); + CHECK(hash == "tdfKhW7S+KYskVHBtEvgPUiK0mA="); }; xml.add_stanza_callback([check_stanza](const Stanza &stanza) { check_stanza(stanza); @@ -62,7 +62,7 @@ TEST_CASE("Hash disco 2") { auto check_stanza = [](const Stanza &stanza) { const std::string hash = Xmpp::hash_disco_sha1(stanza); - CHECK(hash == "ZmY1ZTJjZjUyZjkwMjA2OTliZGFhYzYxMmVmMTI5YjdmYzNhZTIwYw=="); + CHECK(hash == "/14s9S+QIGmb2qxhLvEpt/w64gw="); }; xml.add_stanza_callback([check_stanza](const Stanza &stanza) { check_stanza(stanza); @@ -91,7 +91,7 @@ TEST_CASE("Hash disco 2 different order") { auto check_stanza = [](const Stanza &stanza) { const std::string hash = Xmpp::hash_disco_sha1(stanza); - CHECK(hash == "ZmY1ZTJjZjUyZjkwMjA2OTliZGFhYzYxMmVmMTI5YjdmYzNhZTIwYw=="); + CHECK(hash == "/14s9S+QIGmb2qxhLvEpt/w64gw="); }; xml.add_stanza_callback([check_stanza](const Stanza &stanza) { check_stanza(stanza);