diff --git a/src/misc/digest.cpp b/src/misc/digest.cpp index 879b962..5be670c 100644 --- a/src/misc/digest.cpp +++ b/src/misc/digest.cpp @@ -2,17 +2,13 @@ #ifdef NO_OPEN_SSL #include - #define DECLARE_DIGEST(name, _unused_, digestLength) \ - std::string digest::tomcrypt::name(const std::string& input) { \ - hash_state hash{}; \ - \ - uint8_t buffer[digestLength]; \ - \ - name ##_init(&hash); \ - name ##_process(&hash, (uint8_t*) input.data(), input.length()); \ - name ##_done(&hash, buffer); \ - \ - return std::string((const char*) buffer, digestLength); \ + #define DECLARE_DIGEST(name, _unused_, digestLength) \ + void digest::tomcrypt::name(const char* input, size_t length, uint8_t(& result)[digestLength]) { \ + hash_state hash{}; \ + \ + name ##_init(&hash); \ + name ##_process(&hash, (uint8_t*) input, length); \ + name ##_done(&hash, result); \ } DECLARE_DIGEST(sha1, SHA1, SHA_DIGEST_LENGTH) diff --git a/src/misc/digest.h b/src/misc/digest.h index 0e04704..4cc41d1 100644 --- a/src/misc/digest.h +++ b/src/misc/digest.h @@ -9,18 +9,25 @@ #define SHA256_DIGEST_LENGTH 32 #define SHA512_DIGEST_LENGTH 64 - #define DECLARE_DIGEST(name, _unused_, digestLength) \ - namespace tomcrypt { \ - extern std::string name(const std::string&); \ - } \ - inline std::string name(const std::string& input) { \ - return tomcrypt::name(input); \ - } \ - \ - inline std::string name(const char* input, int64_t length = -1) { \ - if(length == -1) length = strlen(input); \ - return name(std::string{input, (size_t) length}); \ - } \ + #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(result, result); \ + } \ + \ + inline std::string name(const char* input, int64_t length = -1) { \ + uint8_t result[digestLength]; \ + tomcrypt::name(input, length, result); \ + return std::string(result, result); \ + } \ + \ + inline void name(const char* input, size_t length, uint8_t(& result)[digestLength]) { \ + tomcrypt::name(input, length, result); \ + } #else #include