Erreur: “utilisation non valide du type incomplet ‘RSA {aka struct rsa_st}” dans OpenSSL 1.1.0

J’ai un ancien code qui a été écrit pour créer un lien avec une ancienne version de openssl. Une partie de ce code charge une clé à partir d’un fichier PEM et essaie de comprendre si cette clé est une clé privée ou publique en utilisant le code suivant:

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

Avec la dernière version d’openssl, cela ne comstack pas (à juste titre):

 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) ) { ^~ 

Je comprends que l’access direct aux membres privés de la structure a été remplacé par une fonction, mais j’ai du mal à déterminer quelle fonction il s’agit.

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

Comme vous le savez, OpenSSL 1.1.0 a modifié la visibilité d’un grand nombre de membres de la structure. Vous ne pouvez plus accéder directement aux membres. Au lieu de cela, vous devez utiliser les fonctions getter et setter.

Essayez RSA_get0_factors . get0 signifie que les comptages de références ne sont pas incrémentés. Ne pas BN_free eux.

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

Si le code prend en charge plusieurs versions d’OpenSSL, vous aurez besoin d’une protection, car RSA_get0_factors est destiné à OpenSSL 1.1.0 et versions ultérieures. Peut-être quelque chose comme ce qui suit. Consultez également la page de manuel OPENSSL_VERSION_NUMBER .

 #include  #if OPENSSL_VERSION_NUMBER < 0x10100000L /* OpenSSL 1.0.2 and below (old code) */ #else /* OpenSSL 1.1.0 and above (new code) */ #endif 
 #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) ) {