2019-06-26 22:11:22 +02:00
|
|
|
#pragma once
|
|
|
|
|
|
|
|
#include <string>
|
|
|
|
#include <string_view>
|
|
|
|
#include <cstring>
|
|
|
|
|
|
|
|
#ifdef NO_OPEN_SSL
|
|
|
|
#define SHA_DIGEST_LENGTH 20
|
|
|
|
#define SHA256_DIGEST_LENGTH 32
|
|
|
|
#define SHA512_DIGEST_LENGTH 64
|
|
|
|
|
2019-07-05 20:45:32 +02:00
|
|
|
#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); \
|
2019-07-06 15:23:19 +02:00
|
|
|
return std::string((const char*) result, digestLength); \
|
2019-07-05 20:45:32 +02:00
|
|
|
} \
|
|
|
|
\
|
|
|
|
inline std::string name(const char* input, int64_t length = -1) { \
|
2019-07-07 14:04:06 +02:00
|
|
|
if(length == -1) length = strlen(input); \
|
2019-07-05 20:45:32 +02:00
|
|
|
uint8_t result[digestLength]; \
|
|
|
|
tomcrypt::name(input, length, result); \
|
2019-07-06 15:23:19 +02:00
|
|
|
return std::string((const char*) result, digestLength); \
|
2019-07-05 20:45:32 +02:00
|
|
|
} \
|
|
|
|
\
|
|
|
|
inline void name(const char* input, size_t length, uint8_t(& result)[digestLength]) { \
|
|
|
|
tomcrypt::name(input, length, result); \
|
|
|
|
}
|
2019-06-26 22:11:22 +02:00
|
|
|
|
|
|
|
#else
|
|
|
|
#include <openssl/sha.h>
|
|
|
|
|
2019-07-06 15:00:05 +02:00
|
|
|
#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); \
|
2019-07-06 15:28:19 +02:00
|
|
|
return name(std::string(input, length)); \
|
2019-07-06 15:00:05 +02:00
|
|
|
} \
|
|
|
|
\
|
2019-06-26 22:11:22 +02:00
|
|
|
inline void name(const char* input, size_t length, uint8_t(& result)[digestLength]) { \
|
2019-07-06 15:28:19 +02:00
|
|
|
method((u_char*) input, length, result); \
|
2019-06-26 22:11:22 +02:00
|
|
|
}
|
|
|
|
#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
|