8 #include <botan/hash.h> 9 #include <botan/internal/openssl.h> 10 #include <openssl/evp.h> 11 #include <unordered_map> 17 class OpenSSL_HashFunction
final :
public HashFunction
22 const EVP_MD* algo = EVP_MD_CTX_md(m_md);
23 if(!EVP_DigestInit_ex(m_md, algo,
nullptr))
24 throw OpenSSL_Error(
"EVP_DigestInit_ex", ERR_get_error());
27 std::string provider()
const override {
return "openssl"; }
28 std::string
name()
const override {
return m_name; }
30 HashFunction* clone()
const override 32 const EVP_MD* algo = EVP_MD_CTX_md(m_md);
33 return new OpenSSL_HashFunction(
name(), algo);
36 std::unique_ptr<HashFunction> copy_state()
const override 38 std::unique_ptr<OpenSSL_HashFunction> copy(
new OpenSSL_HashFunction(m_name,
nullptr));
39 EVP_MD_CTX_copy(copy->m_md, m_md);
40 return std::unique_ptr<HashFunction>(copy.release());
43 size_t output_length()
const override 45 return EVP_MD_size(EVP_MD_CTX_md(m_md));
48 size_t hash_block_size()
const override 50 return EVP_MD_block_size(EVP_MD_CTX_md(m_md));
53 OpenSSL_HashFunction(
const std::string&
name,
const EVP_MD* md) : m_name(
name)
55 #if OPENSSL_VERSION_NUMBER < 0x10100000L 56 m_md = EVP_MD_CTX_create();
58 m_md = EVP_MD_CTX_new();
62 throw OpenSSL_Error(
"Can't allocate new context", ERR_get_error());
63 EVP_MD_CTX_init(m_md);
64 if(md && !EVP_DigestInit_ex(m_md, md,
nullptr))
65 throw OpenSSL_Error(
"EVP_DigestInit_ex", ERR_get_error());
68 OpenSSL_HashFunction(EVP_MD_CTX* ctx) : m_md(ctx)
72 ~OpenSSL_HashFunction()
74 #if OPENSSL_VERSION_NUMBER < 0x10100000L 75 EVP_MD_CTX_destroy(m_md);
77 EVP_MD_CTX_free(m_md);
82 void add_data(
const uint8_t input[],
size_t length)
override 84 if(!EVP_DigestUpdate(m_md, input, length))
85 throw OpenSSL_Error(
"EVP_DigestUpdate", ERR_get_error());
88 void final_result(uint8_t output[])
override 90 if(!EVP_DigestFinal_ex(m_md, output,
nullptr))
91 throw OpenSSL_Error(
"EVP_DigestFinal_ex", ERR_get_error());
92 const EVP_MD* algo = EVP_MD_CTX_md(m_md);
93 if(!EVP_DigestInit_ex(m_md, algo,
nullptr))
94 throw OpenSSL_Error(
"EVP_DigestInit_ex", ERR_get_error());
103 std::unique_ptr<HashFunction>
106 #define MAKE_OPENSSL_HASH(fn) \ 107 std::unique_ptr<HashFunction>(new OpenSSL_HashFunction(name, fn ())) 109 #if defined(BOTAN_HAS_SHA2_32) && !defined(OPENSSL_NO_SHA256) 110 if(
name ==
"SHA-224")
112 if(
name ==
"SHA-256")
116 #if defined(BOTAN_HAS_SHA2_64) && !defined(OPENSSL_NO_SHA512) 117 if(
name ==
"SHA-384")
119 if(
name ==
"SHA-512")
123 #if defined(BOTAN_HAS_SHA1) && !defined(OPENSSL_NO_SHA) 124 if(
name ==
"SHA-160" ||
name ==
"SHA-1" ||
name ==
"SHA1")
128 #if defined(BOTAN_HAS_RIPEMD_160) && !defined(OPENSSL_NO_RIPEMD) 129 if(
name ==
"RIPEMD-160")
133 #if defined(BOTAN_HAS_MD5) && !defined(OPENSSL_NO_MD5) 138 #if defined(BOTAN_HAS_MD4) && !defined(OPENSSL_NO_MD4) 143 #if defined(BOTAN_HAS_WHIRLPOOL) && !defined(OPENSSL_NO_WHIRLPOOL) 144 if(
name ==
"Whirlpool")
#define MAKE_OPENSSL_HASH(fn)
int(* final)(unsigned char *, CTX *)
std::unique_ptr< HashFunction > make_openssl_hash(const std::string &name)