9 #include <botan/hash.h> 10 #include <botan/internal/bearssl.h> 11 #include <unordered_map> 14 #include <bearssl_hash.h> 21 class BearSSL_HashFunction
final :
public HashFunction
26 m_ctx.vtable->init(&m_ctx.vtable);
29 std::string provider()
const override {
return "bearssl"; }
30 std::string
name()
const override {
return m_name; }
32 HashFunction* clone()
const override 34 return new BearSSL_HashFunction(m_ctx.vtable, m_name);
37 std::unique_ptr<HashFunction> copy_state()
const override 39 std::unique_ptr<BearSSL_HashFunction> copy(
new BearSSL_HashFunction(m_ctx.vtable, m_name));
40 std::memcpy(©->m_ctx, &m_ctx,
sizeof(m_ctx));
41 return std::move(copy);
44 size_t output_length()
const override 46 return (m_ctx.vtable->desc >> BR_HASHDESC_OUT_OFF) & BR_HASHDESC_OUT_MASK;
49 size_t hash_block_size()
const override 51 return 1 << ((m_ctx.vtable->desc >> BR_HASHDESC_LBLEN_OFF) & BR_HASHDESC_LBLEN_MASK);
54 BearSSL_HashFunction(
const br_hash_class *
hash,
const std::string
name)
57 hash->init(&m_ctx.vtable);
60 ~BearSSL_HashFunction()
65 void add_data(
const uint8_t input[],
size_t length)
override 67 m_ctx.vtable->update(&m_ctx.vtable, input, length);
70 void final_result(uint8_t output[])
override 72 m_ctx.vtable->out(&m_ctx.vtable, output);
73 m_ctx.vtable->init(&m_ctx.vtable);
77 br_hash_compat_context m_ctx;
82 std::unique_ptr<HashFunction>
85 #define MAKE_BEARSSL_HASH(vtable) \ 86 std::unique_ptr<HashFunction>(new BearSSL_HashFunction(vtable, name)) 88 #if defined(BOTAN_HAS_SHA2_32) 95 #if defined(BOTAN_HAS_SHA2_64) 102 #if defined(BOTAN_HAS_SHA1) 103 if(
name ==
"SHA-160" ||
name ==
"SHA-1" ||
name ==
"SHA1")
107 #if defined(BOTAN_HAS_MD5) 112 #if defined(BOTAN_HAS_PARALLEL_HASH) 113 if(
name ==
"Parallel(MD5,SHA-160)")
int(* final)(unsigned char *, CTX *)
std::unique_ptr< HashFunction > make_bearssl_hash(const std::string &name)