错误:“在OpenSSL 1.1.0中无效使用不完整类型’RSA {aka struct rsa_st}”

我有旧的代码编写链接旧版本的openssl。 此代码的一部分从PEM文件加载密钥,并尝试通过使用以下代码来了解此密钥是私钥还是公钥:

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

我理解直接访问struct的私有成员被替换为一个函数,但我很难搞清楚哪个函数是什么。

 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改变了许多struct成员的可见性。 您无法再直接访问成员。 相反,您必须使用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手册页 。

 #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) ) {