#pragma once #include #include #include #ifdef NO_OPEN_SSL #define SHA_DIGEST_LENGTH 20 #define SHA256_DIGEST_LENGTH 32 #define SHA512_DIGEST_LENGTH 64 #define DECLARE_DIGEST(name, _unused_, digestLength) \ namespace tomcrypt { \ extern void name(const char* input, size_t length, uint8_t(& result)[digestLength]); \ } \ inline std::string name(const std::string& input) { \ uint8_t result[digestLength]; \ tomcrypt::name(input.data(), input.length(), result); \ return std::string((const char*) result, digestLength); \ } \ \ inline std::string name(const char* input, int64_t length = -1) { \ if(length == -1) length = strlen(input); \ uint8_t result[digestLength]; \ tomcrypt::name(input, length, result); \ return std::string((const char*) result, digestLength); \ } \ \ inline void name(const char* input, size_t length, uint8_t(& result)[digestLength]) { \ tomcrypt::name(input, length, result); \ } #else #include #define DECLARE_DIGEST(name, method, digestLength) \ inline std::string name(const std::string& input) { \ u_char buffer[digestLength]; \ method((u_char*) input.data(), input.length(), buffer); \ return std::string((const char*) buffer, digestLength); \ } \ \ inline std::string name(const char* input, ssize_t length = -1) { \ if(length == -1) length = strlen(input); \ return name(std::string(input, length)); \ } \ \ inline void name(const char* input, size_t length, uint8_t(& result)[digestLength]) { \ method((u_char*) input, length, result); \ } #endif namespace digest { DECLARE_DIGEST(sha1, SHA1, SHA_DIGEST_LENGTH) DECLARE_DIGEST(sha256, SHA256, SHA256_DIGEST_LENGTH) DECLARE_DIGEST(sha512, SHA512, SHA512_DIGEST_LENGTH) } #undef DECLARE_DIGEST