8 #include <botan/hash.h>
9 #include <botan/internal/openssl.h>
10 #include <openssl/evp.h>
11 #include <unordered_map>
17 class OpenSSL_HashFunction :
public HashFunction
22 const EVP_MD* algo = EVP_MD_CTX_md(&
m_md);
23 EVP_DigestInit_ex(&
m_md, algo,
nullptr);
26 std::string provider()
const override {
return "openssl"; }
27 std::string name()
const override {
return m_name; }
29 HashFunction* clone()
const override
31 const EVP_MD* algo = EVP_MD_CTX_md(&
m_md);
32 return new OpenSSL_HashFunction(name(), algo);
35 size_t output_length()
const override
37 return EVP_MD_size(EVP_MD_CTX_md(&
m_md));
40 size_t hash_block_size()
const override
42 return EVP_MD_block_size(EVP_MD_CTX_md(&
m_md));
45 OpenSSL_HashFunction(
const std::string& name,
const EVP_MD* md) :
m_name(name)
47 EVP_MD_CTX_init(&
m_md);
48 EVP_DigestInit_ex(&
m_md, md,
nullptr);
51 ~OpenSSL_HashFunction()
53 EVP_MD_CTX_cleanup(&
m_md);
57 void add_data(
const uint8_t input[],
size_t length)
override
59 EVP_DigestUpdate(&
m_md, input, length);
62 void final_result(uint8_t output[])
override
64 EVP_DigestFinal_ex(&
m_md, output,
nullptr);
65 const EVP_MD* algo = EVP_MD_CTX_md(&
m_md);
66 EVP_DigestInit_ex(&
m_md, algo,
nullptr);
75 std::unique_ptr<HashFunction>
78 #define MAKE_OPENSSL_HASH(fn) \
79 std::unique_ptr<HashFunction>(new OpenSSL_HashFunction(name, fn ()))
81 #if defined(BOTAN_HAS_SHA2_32) && !defined(OPENSSL_NO_SHA256)
88 #if defined(BOTAN_HAS_SHA2_64) && !defined(OPENSSL_NO_SHA512)
95 #if defined(BOTAN_HAS_SHA1) && !defined(OPENSSL_NO_SHA)
100 #if defined(BOTAN_HAS_RIPEMD_160) && !defined(OPENSSL_NO_RIPEMD)
101 if(name ==
"RIPEMD-160")
105 #if defined(BOTAN_HAS_MD5) && !defined(OPENSSL_NO_MD5)
110 #if defined(BOTAN_HAS_MD4) && !defined(OPENSSL_NO_MD4)
#define MAKE_OPENSSL_HASH(fn)
std::unique_ptr< HashFunction > make_openssl_hash(const std::string &name)