#include #include #ifdef BOTAN_FOUND # include # include # include # include #endif #ifdef GCRYPT_FOUND # include # include # include # include #endif std::string sha1(const std::string& input) { #ifdef BOTAN_FOUND auto sha1 = Botan::HashFunction::create_or_throw("SHA-1"); sha1->update(input); return Botan::hex_encode(sha1->final(), false); #endif #ifdef GCRYPT_FOUND const auto hash_length = gcry_md_get_algo_dlen(GCRY_MD_SHA1); std::vector output(hash_length, {}); gcry_md_hash_buffer(GCRY_MD_SHA1, output.data(), input.data(), input.size()); std::ostringstream digest; for (std::size_t i = 0; i < hash_length; i++) digest << std::hex << std::setfill('0') << std::setw(2) << static_cast(output[i]); return digest.str(); #endif }