我的 C websocket 服务器应用程序中有以下代码。该代码使用给定的公钥对消息执行 ssl 签名验证。该代码在 C 应用程序中运行良好,但最近我开始在 C++ 上编写它。我遇到的问题是相同的代码,即下面,在两个应用程序中都没有变化,两次接收相同的输入数据,但是一个用 C++ 编译产生 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++ 中具有相同输入数据( key 、消息等)的相同代码会产生错误的签名。
我在 Ubuntu 下编译,使用 gcc 和 g++(最新)
可能导致此问题的原因是什么?
最佳答案
已解决。问题是我正在使用 std::string 来传递解码后的消息,这不知何故搞砸了。我将 C++ 代码切换为在本节中也使用 char* 字符串,现在没问题了。
感谢您的回复,希望对其他人有用。
编辑: PS:我正在使用另一个函数来生成解码消息本身。 std::string 的使用导致了这个问题。
关于c++ - SSL签名验证跨语言问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26796625/