2016-11-11 52 views
4

古いバージョンのopensslとリンクするために作成された古いコードがあります。このコードの一部は、PEMファイルから鍵をロードし、このキーは、次のコードを使用することによって、プライベートまたはパブリックキーであるかどうかを理解しようとします。opensslの最新バージョンではエラー: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"); 
} 

を、この(正当)コンパイルされません。

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関数を使用する必要があります。

try 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 Change Log](https://www.openssl.org/news/changelog.html)は、たくさんの構造がプライベートになっていると述べている。交換が必要だったので、私は 'p 'や' q'を取ったものを探しているRSA関数のオンライン[OpenSSL man pages](https://www.openssl.org/docs/manpages.html)を調べました'。私は[OpenSSL man pages](https://www.openssl.org/docs/manpages.html)から始め、1.1.0にドリルダウンし、Cryptoにドリルダウンして、*** 'RSA_' ***を探しました。時間の経過とともに、OpenSSL wikiは新しいコードをその例に蓄積するでしょう。 – jww

+0

'get0'と' get1'はしばらくありました。あなたは、Valgrindのもとで問題を追い始めるときに、早い段階で(そして難しい方法で)学ぶのが普通です。なぜあなたは 'get1'関数を呼び出したときに漏れがあったのか、' get0'関数から何かを自由にして二重の空きを持つことになるでしょう。私は '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)) { 
関連する問題