#include #include "openssl/digest_td.h" #include namespace digest { const EVP_MD *OpensslEVP_SHA1::get_evp() { return EVP_sha1(); } const EVP_MD *OpensslEVP_SHA256::get_evp() { return EVP_sha256(); } const EVP_MD *OpensslEVP_SHA512::get_evp() { return EVP_sha512(); } template void HashCtx::init() { ctx = EVP_MD_CTX_create(); reset(); } template void HashCtx::reset() { EVP_DigestInit_ex(ctx, H::get_evp(), 0); } template void HashCtx::clear() { EVP_MD_CTX_destroy(ctx); ctx = nullptr; } template void HashCtx::feed(const void *data, std::size_t len) { EVP_DigestUpdate(ctx, data, len); } template std::size_t HashCtx::extract(unsigned char buffer[digest_bytes]) { unsigned olen = 0; EVP_DigestFinal_ex(ctx, buffer, &olen); assert(olen == digest_bytes); return olen; } template std::size_t HashCtx::extract(td::MutableSlice slice) { return extract(slice.ubegin()); } template std::string HashCtx::extract() { unsigned char buffer[digest_bytes]; unsigned olen = 0; EVP_DigestFinal_ex(ctx, buffer, &olen); assert(olen == digest_bytes); return std::string((char *)buffer, olen); } } // namespace digest