9#include <botan/internal/openssl.h>
10#include <openssl/evp.h>
11#include <unordered_map>
17class 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());
103std::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")
int(* final)(unsigned char *, CTX *)
std::unique_ptr< HashFunction > make_openssl_hash(const std::string &name)
#define MAKE_OPENSSL_HASH(fn)