6

EVP_PKEY_copy_parametersコピーできる関数を見つけましたEVP_PKEY。ただし、この関数に関する一部のドキュメントには、DSA/ECCアルゴリズムにのみ使用できると記載されています。( openssl.orgからの)公式ドキュメントには、この関数をRSAEVP_PKEYに使用できるかどうかについては記載されていません。

(RSAキーを含む)の別の実装はEVP_PKEY次のようになります。

EVP_PKEY_assign_RSA(RSAPrivateKey_dup(EVP_PKEY_get1_RSA(pkey)));

何か提案はありますか?

4

2 に答える 2

6

キーを複製する必要が本当にない場合は、次のように参照カウントをインクリメントできます。

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 には存在しません (少なくともこの更新日まで)。

于 2011-08-18T21:00:03.510 に答える
2

OpenSSL 1.0.0d ではEVP_PKEY_copy_parameters動作するはずです。ただし、実装から判断すると、パブリック パラメータをコピーしているように見えます。

static int pkey_rsa_copy(EVP_PKEY_CTX *dst, EVP_PKEY_CTX *src) {
    RSA_PKEY_CTX *dctx, *sctx;
    if (!pkey_rsa_init(dst))
        return 0;
    sctx = src->data;
    dctx = dst->data;
    dctx->nbits = sctx->nbits;
    if (sctx->pub_exp) {
        dctx->pub_exp = BN_dup(sctx->pub_exp);
        if (!dctx->pub_exp)
            return 0;
    }
    dctx->pad_mode = sctx->pad_mode;
    dctx->md = sctx->md;
    return 1;
}

jweyrichのソリューションとは別に、もう1つの簡単な方法は、最初i2d_RSAPrivateKeyにRSAキーをd2i_RSAPrivateKey作成してからもう一度キーを作成することです-コピーがあります:)

于 2011-08-18T21:03:19.067 に答える