Error: “uso no válido del tipo incompleto ‘RSA {aka struct rsa_st}” en OpenSSL 1.1.0

Tengo un código antiguo que se escribió para vincularlo con una versión anterior de openssl. Parte de este código carga una clave de un archivo PEM e intenta comprender si esta clave es privada o pública, utilizando el siguiente código:

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

Con la última versión de openssl, esto (justificadamente) no se comstack:

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

Entiendo que el acceso directo a los miembros privados de la estructura fue reemplazado por una función, pero me está costando averiguar qué función es esa.

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

Como sabe, OpenSSL 1.1.0 cambió la visibilidad de muchos miembros de la estructura. Ya no puedes acceder a los miembros directamente. En cambio, debe usar las funciones getter y setter.

Prueba RSA_get0_factors . El get0 significa que los recuentos de referencia no se incrementan. No BN_free ellos.

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

Si el código es compatible con múltiples versiones de OpenSSL, necesitará un guardia porque RSA_get0_factors es para OpenSSL 1.1.0 y superior. Tal vez algo como lo siguiente. Consulte también la página del manual 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) ) {