错误:“在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_factors
。 get0
表示引用计数不递增。 不要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) ) {