Я использую OpenSSL версии 1.0.2n и пытаюсь достичь dgst с помощью API OpenSSL
Вот мой код
#include <openssl/evp.h>
#include <openssl/err.h>
#include <openssl/ssl.h>
#include <openssl/bio.h>
#include <openssl/buffer.h>
#include <openssl/cms.h>
#include <openssl/hmac.h>
#include <openssl/pem.h>
#include <openssl/md4.h>
#include <openssl/mdc2.h>
#include <openssl/whrlpool.h>
#include <openssl/sha.h>
В конструкторе классов, инициализирующем библиотеку OpenSSL, загружается сообщения об ошибкахи добавление всех алгоритмов
SSL_library_init();
SSL_load_error_strings();
ERR_load_BIO_strings();
ERR_load_crypto_strings();
OpenSSL_add_all_algorithms();
и в функцию класса, которая выполняет dgst
auto md_algorithm = EVP_get_digestbyname(received_dgst_string.c_str());
if (!md_algorithm) {
std::cout << ERR_get_error() << std::endl; // ERR_get_error returns 0 here
return "unknown digest";
}
auto mdctx = EVP_MD_CTX_create();
EVP_DigestInit_ex(mdctx, md_algorithm, nullptr);
EVP_DigestUpdate(mdctx, received_input_string.c_str(), received_input_string.length());
std::unique_ptr<unsigned char, std::function<void(unsigned char *)>> md_value (
new unsigned char[EVP_MAX_MD_SIZE], [](unsigned char* ptr){delete[] ptr;});
unsigned int md_length = 0;
EVP_DigestFinal_ex(mdctx, md_value.get(), &md_length);
EVP_MD_CTX_destroy(mdctx);
std::stringstream ss;
for(unsigned int index = 0; index < md_length; ++index) {
ss << std::hex << std::setw(2) << std::setfill('0') << static_cast<int>(md_value.get()[index]);
}
EVP_get_digestbyname, возвращает действительный дайджест для md5, sha1, sha224, sha256, sha384 и sha512.
Но он возвращает ноль для md4, mdc2, palemd160, ша и джакузи. Любая идея, где я пропускаю.