【发布时间】:2014-12-10 18:43:37
【问题描述】:
我有一个关于 RSA_size 的问题。
在 WIN32 上崩溃但在 linux 平台上运行的版本:
...
EVP_PKEY* pPublicKey = null;
unsigned int uKeySize = 0;
const unsigned char *pData;
pData = a_publicKey->Key.Data; /* Key.Data = unsigned char *p containing the Key in a string version */
pPublicKey = d2i_PublicKey(EVP_PKEY_RSA, null, &pData, a_publicKey->Key.Length);
if(pPublicKey != null)
{
uKeySize = RSA_size(pPublicKey->pkey.rsa); //Crash
}
...
适用于 win32 的版本(未在 linux 上测试,但我想它也适用):
...
EVP_PKEY* pPublicKey = null;
RSA* pRsaPublicKey = null;
unsigned int uKeySize = 0;
const unsigned char *pData;
pData = a_publicKey->Key.Data; /* Key.Data = unsigned char *p containing the Key in a string version */
pPublicKey = d2i_PublicKey(EVP_PKEY_RSA, null, &pData, a_publicKey->Key.Length);
if(pPublicKey != null)
{
pRsaPublicKey = EVP_PKEY_get1_RSA(pPublicKey);
EVP_PKEY_free(pPublicKey);
uKeySize = RSA_size(pRsaPublicKey);
}
...
我不明白为什么第一个版本会崩溃。但是当我查看 pkey.rsa 结构时,值与第二版中的 RSA 指针不同。 有什么想法吗?
【问题讨论】:
-
你也应该释放你从
EVP_PKEY_get1_RSA回来的RSA*。get1表示引用计数增加了。get0表示计数未递增,因此不需要*_free。 -
@jww 是的,实际上我只是在“...”之后释放了它,但我知道这可能会导致误解。