Openssl + EVP_get_digestbyname () возвращает ноль для md4, mdc2, palemd160, sha и джакузи - PullRequest
0 голосов
/ 31 октября 2019

Я использую 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, ша и джакузи. Любая идея, где я пропускаю.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...