SSL签名验证跨语言问题

时间:2014-11-07 07:57:25

标签: c++ c ssl openssl

我在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 ++中相同的代码和相同的输入数据(键,消息等)会产生错误的签名。

我在Ubuntu下编译,使用gcc和g ++(最新)

可能导致此问题的原因是什么?

1 个答案:

答案 0 :(得分:0)

解决。问题是我正在使用std :: string来传递已解码的消息,这在某种程度上是他妈的。我将c ++代码切换为使用此部分的char *字符串,现在很好。

感谢您的回复,我希望其他人认为这很有用。

编辑: PS:我正在使用另一个函数来生成解码消息本身。使用std :: string导致了这个问题。