Если вам не нужно действительно дублировать ключ, вы можете просто увеличить его счетчик ссылок, например так:
CRYPTO_add(&your_evp_pkey->references, 1, CRYPTO_LOCK_EVP_PKEY);
В противном случае похожий (почти идентичный) подход к тому, что вы предложили, будет следующим:
int pkey_rsa_dup(EVP_PKEY *dst_pkey, EVP_PKEY *src_key) {
// Validate underlying key type - Only allow a RSA key
if (src_key->type != EVP_PKEY_RSA)
return -1;
RSA *rsa = EVP_PKEY_get1_RSA(src_key); // Get the underlying RSA key
RSA *dup_rsa = RSAPrivateKey_dup(rsa); // Duplicate the RSA key
RSA_free(rsa); // Decrement reference count
EVP_PKEY_set1_RSA(dst_pkey, dup_rsa); // Set the underlying RSA key in dst_pkey
// EVP_PKEY_set1_RSA also adjusts the other members in dst_pkey
return 0;
}
Ссылка: Re: Как продублировать EVP_PKEY -> Как говорит @ X-Istence ниже, метод RSA_dup
, предложенный в этой теме, не существует в OpenSSL (по крайней мере, до даты этого обновления).