2016-11-11 978 views
4

我有舊的代碼被寫入鏈接與舊版本的openssl。這段代碼的部分負荷從PEM文件的關鍵,並試圖瞭解這個鍵是私人或公共密鑰,通過使用下面的代碼:錯誤:OpenSSL 1.1.0中的「使用不完整類型」RSA {aka struct rsa_st}「

if((prv->p==0 || prv->q==0)) { 
    // This is not a private key! 
    throw error("No private key for decryption"); 
} 

與OpenSSL的最新版本,此(理所當然)不能編譯:

crypto.cpp: In function ‘key* decrypt_header(file_t, RSA*)’: 
crypto.cpp:158:13: error: invalid use of incomplete type ‘RSA {aka struct rsa_st}’ 
    if((prv->p==0 || prv->q==0)) { 
      ^~ 

我明白到結構的私有成員直接訪問與功能所取代,但我有一個很難搞清楚哪些功能是。

回答

6
crypto.cpp:158:13: error: invalid use of incomplete type ‘RSA {aka struct rsa_st}’ 
    if((prv->p==0 || prv->q==0)) { 
      ^~ 

如您所知,OpenSSL 1.1.0更改了很多結構成員的可見性。您不能再直接訪問會員。相反,你必須使用getter和setter函數。

嘗試RSA_get0_factorsget0表示參考計數爲而不是遞增。做不是BN_free他們。

void RSA_get0_factors(const RSA *r, const BIGNUM **p, const BIGNUM **q); 

如果代碼支持的OpenSSL的多個版本,那麼你將需要保護,因爲RSA_get0_factors是OpenSSL的1.1.0及以上。可能類似於以下內容。另見OPENSSL_VERSION_NUMBER man page

#include <openssl/opensslv.h> 

#if OPENSSL_VERSION_NUMBER < 0x10100000L 

    /* OpenSSL 1.0.2 and below (old code) */ 

#else 

    /* OpenSSL 1.1.0 and above (new code) */ 

#endif 
+0

感謝。任何想法,我應該找到這個沒有重新學習openssl? –

+0

@ShacharShemesh - 我認爲你必須忍受它...... [1.1.0更改日誌](https://www.openssl.org/news/changelog.html)指出一堆結構是私有的。由於需要替換,我查看了在線的[OpenSSL手冊頁](https://www.openssl.org/docs/manpages.html),查找了獲取「p」和/或「q」的RSA函數'。我從[OpenSSL手冊頁]開始(https://www.openssl.org/docs/manpages.html),鑽入1.1.0,鑽入Crypto,然後搜索***'RSA_' ***。隨着時間的推移,OpenSSL wiki可能會在其示例中累積新代碼。 – jww

+0

'get0'和'get1'事物已經存在了一段時間。當你開始在Valgrind下追逐問題時,你通常會很早就知道這一點(並且很難)。你會想知道爲什麼當你調用'get1'函數時發生泄漏,或者你會通過'get0'函數釋放某些東西來使用double free來分段錯誤。我指出'get0'和'get1'來拯救別人的麻煩。有人會偶然發現這篇文章,並有一個「哦,狗屎」的時刻... – jww

0
#if OPENSSL_VERSION_NUMBER < 0x10100005L 
static void RSA_get0_key(const RSA *r, const BIGNUM **n, const BIGNUM **e, const BIGNUM **d, const BIGNUM **p, const BIGNUM **q) 
{ 
    if(n != NULL) 
     *n = r->n; 

    if(e != NULL) 
     *e = r->e; 

    if(d != NULL) 
     *d = r->d; 

    if(p != NULL) 
     *p = r->p; 

    if(q != NULL) 
     *q = r->q; 
} 
#endif 

const BIGNUM *bn_p; 
const BIGNUM *bn_q; 

RSA_get0_key(key, NULL, NULL, NULL, &bn_p, &bn_q); 
/* if((prv->p==0 || prv->q==0)) { */ 
if((prv_p==0 || prv_q==0)) { 
相關問題