7 #include <openssl/objects.h>
11 std::string
name(obj->name);
12 for (
const auto& unwanted : {
13 "With",
"with",
"Encryption",
"ssl2-",
"ssl3-",
"160"
15 if (
name.find(unwanted) != decltype(
name)::npos) {
19 if (
name.front() >=
'A' &&
name.front() <=
'Z') {
25 OpenSSL_add_all_digests();
32 ctx = EVP_MD_CTX_create();
36 throw std::runtime_error(
"got no ssl digest named " +
name);
42 EVP_MD_CTX_destroy(
ctx);
46 EVP_DigestUpdate(
ctx, data, size);
49 for (
size_t bytes_done = 0; bytes_done < size;) {
50 auto missing = size - bytes_done;
58 std::vector<unsigned char> md(EVP_MD_size(
mdType));
59 EVP_DigestFinal_ex(
ctx, md.data(),
nullptr);
60 std::ostringstream hashBuffer;
63 hashBuffer << std::hex << std::setw(2) << std::setfill('0') << static_cast<unsigned int>(c);