У меня есть следующий код в приложении веб-сервера C, которое у меня есть. Код выполняет проверку подписи ssl в сообщении с данным открытым ключом. Код работает отлично в приложении C, но в последнее время я начал писать его на C++. Проблема, с которой я столкнулся, состоит в том, что тот же самый код, который находится ниже, находится в обоих приложениях без изменений, оба раза получают одни и те же входные данные, но один скомпилированный с C++ дает ошибку SSL плохой подписи.Ошибка SSL-аутентификации в перекрестном языке
Вот код:
int verifyMessageSignature(const char* decoded_message, int pos,
unsigned char* signature, char* publicKey)
{
SSL_library_init();
SSL_load_error_strings();
ERR_load_BIO_strings();
// OpenSSL_add_all_algorithms()
if (!publicKey)
{
printf("publicKey is null\n");
}
BIO* keyBio = BIO_new_mem_buf(publicKey, -1);
if(!keyBio)
{
printf("failed to created BIO\n");
printError(ERR_get_error());
}
BIO_set_mem_eof_return(keyBio, 0);
RSA* rsa = PEM_read_bio_RSA_PUBKEY(keyBio, NULL, NULL, NULL);
if (!rsa)
{
printf("Error in PEM_read_bio_RSA_PUBKEY\n");
printError(ERR_get_error());
}
EVP_MD_CTX *mdctx = NULL;
if (!(mdctx = EVP_MD_CTX_create()))
{
printf("Error in ctx\n");
printError(ERR_get_error());
}
EVP_PKEY* pk = EVP_PKEY_new();
if (EVP_PKEY_set1_RSA(pk, rsa) != 1)
{
printf("err in EVP_PKEY_set1_RSA\n");
printError(ERR_get_error());
}
if (EVP_DigestVerifyInit(mdctx, NULL, EVP_sha1(), NULL, pk) != 1)
{
printf("error in EVP_DigestVerifyInit\n");
printError(ERR_get_error());
}
if (EVP_DigestVerifyUpdate(mdctx, decoded_message, pos) != 1)
{
printf("error in EVP_DigestVerifyUpdate\n");
printError(ERR_get_error());
}
if (EVP_DigestVerifyFinal(mdctx, signature, 512) == 1)
{
/* Success */
printf("Successful verification!\n");
}
else
{
/* Failure */
printf("Unsuccessful verification!\n");
printError(ERR_get_error());
BIO_free_all(keyBio);
RSA_free(rsa);
EVP_PKEY_free(pk);
EVP_MD_CTX_destroy(mdctx);
ERR_free_strings();
return 1;
}
BIO_free_all(keyBio);
RSA_free(rsa);
EVP_PKEY_free(pk);
EVP_MD_CTX_destroy(mdctx);
ERR_free_strings();
return 0;
}
Этот код прекрасно работает в C. успешно проверяет подпись в моих тестах, в то время как тот же код, с теми же самыми входными данными (клавиши, сообщения и т. д.) в C++ дает плохую подпись.
Я компиляция под Ubuntu, используя GCC и г ++ (последняя)
Что может быть причиной этой проблемы?
Вы скомпилировали с помощью -Wall и удостоверились, что у вас нет предупреждений? –
Да. Никаких предупреждений, связанных с этим. –
Не могли бы вы сделать небольшую пробную программу вокруг него, чтобы можно было воспроизвести ошибку в простой форме? –