c - para - openssl linux
Error: "uso no vĂ¡lido del tipo incompleto ''RSA{aka struct rsa_st}" en OpenSSL 1.1.0 (2)
#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) ) {
Tengo un código antiguo que se escribió para vincular 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 compila:
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 estoy teniendo dificultades para determinar 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 ya sabe, OpenSSL 1.1.0 cambió la visibilidad de muchos miembros de estructura. Ya no puede acceder a los miembros directamente. En su lugar, debe usar las funciones getter y setter.
Pruebe
RSA_get0_factors
.
get0
significa que los recuentos de referencia
no se
incrementan.
No los
BN_free
.
void RSA_get0_factors(const RSA *r, const BIGNUM **p, const BIGNUM **q);
Si el código admite varias versiones de OpenSSL, necesitará una protección porque
RSA_get0_factors
es para OpenSSL 1.1.0 y superior.
Tal vez algo como lo siguiente.
Consulte también la
página de manual
OPENSSL_VERSION_NUMBER
.
#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