18#ifndef TRINITY_CRYPTOHASH_H
19#define TRINITY_CRYPTOHASH_H
28#include <openssl/evp.h>
36 typedef EVP_MD
const* (*HashCreator)();
38 static EVP_MD_CTX*
MakeCTX() noexcept {
return EVP_MD_CTX_new(); }
39 static void DestroyCTX(EVP_MD_CTX* ctx) { EVP_MD_CTX_free(ctx); }
42 template <GenericHashImpl::HashCreator HashCreator,
size_t DigestLength>
47 using Digest = std::array<uint8, DIGEST_LENGTH>;
57 template <
typename... Ts>
58 static auto GetDigestOf(Ts&&... pack) -> std::enable_if_t<std::conjunction_v<std::negation<std::is_integral<Ts>>...>,
Digest>
61 (hash.
UpdateData(std::forward<Ts>(pack)), ...);
68 int result = EVP_DigestInit_ex(
_ctx, HashCreator(),
nullptr);
79 *
this = std::move(right);
95 int result = EVP_MD_CTX_copy_ex(
_ctx, right.
_ctx);
113 int result = EVP_DigestUpdate(
_ctx, data, len);
119 template <
typename Container>
125 int result = EVP_DigestFinal_ex(
_ctx,
_digest.data(), &length);
void UpdateData(Container const &c)
void UpdateData(std::string_view str)
GenericHash(GenericHash &&right) noexcept
GenericHash & operator=(GenericHash &&right) noexcept
void UpdateData(std::string const &str)
std::array< uint8, DIGEST_LENGTH > Digest
void UpdateData(uint8 const *data, size_t len)
GenericHash & operator=(GenericHash const &right)
GenericHash(GenericHash const &right)
static constexpr size_t DIGEST_LENGTH
Digest const & GetDigest() const
static Digest GetDigestOf(uint8 const *data, size_t len)
void UpdateData(char const *str)
static auto GetDigestOf(Ts &&... pack) -> std::enable_if_t< std::conjunction_v< std::negation< std::is_integral< Ts > >... >, Digest >
constexpr std::size_t size()
static void DestroyCTX(EVP_MD_CTX *ctx)
static EVP_MD_CTX * MakeCTX() noexcept