12 ctx = EVP_MD_CTX_create();
15 EVP_DigestInit_ex(
ctx, mdType,
nullptr);
21 for (
size_t bytes_done = 0; bytes_done < size;) {
23 auto missing = size - bytes_done;
25 if (missing < bytes) {
29 auto dataStart =
static_cast<void*
>(
static_cast<char*
>(data) + bytes_done);
31 EVP_DigestUpdate(
ctx, dataStart, bytes);
34 if (size & (64 - 1)) {
46 if ((size & (64 - 1)) == 0) {
51 for (
size_t bytes_done = 0; bytes_done < size;) {
52 auto missing = size - bytes_done;
58 if (size & (64 - 1)) {
72 std::vector<unsigned char> md(EVP_MD_size(mdType));
73 EVP_DigestFinal_ex(
ctx, md.data(),
nullptr);
74 EVP_MD_CTX_cleanup(
ctx);
75 EVP_MD_CTX_destroy(
ctx);
80 std::ostringstream hashBuffer;
83 hashBuffer << std::hex << std::setw(2) << std::setfill('0') << static_cast<unsigned int>(c);