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_MD5) && !defined(OPENSSL_NO_MD5)
#define MAKE_OPENSSL_HASH(fn)
int(* final)(unsigned char *, CTX *)
std::unique_ptr< HashFunction > make_openssl_hash(const std::string &name)