2011-06-23 16 views
6

EVP_PKEY_copy_parametersというファンクションが見つかりました。コピーできるのはEVP_PKEYです。 しかし、この関数に関するいくつかの文書では、DSA/ECCアルゴリズムにしか使用できないと書かれています。 公式ドキュメント(openssl.org)には、その機能をRSA EVP_PKEYに使用できるかどうかは記載されていません。RSAキーを含むEVP_PKEYはどのようにコピーできますか?

EVP_PKEY_assign_RSA(RSAPrivateKey_dup(EVP_PKEY_get1_RSA(pkey))); 

は、あなたが何か提案を持っていますか:

EVP_PKEYためのもう一つの実装では、(それはRSAキーが含まれている)、このことだろうか?

答えて

6

あなたはない本当にこのように、あなただけの参照カウントをインクリメントすることができ、キーを複製する必要がある場合:

CRYPTO_add(&your_evp_pkey->references, 1, CRYPTO_LOCK_EVP_PKEY); 

そうでない場合、何に似て(ほぼ同じ)のアプローチを> @ X-Istenceは以下の言うように、からRe: How to duplicate an 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; 
} 

参考:以下のだろう提案このリファレンススレッドで提案されている方法は、OpenSSLには存在しません(少なくともこのアップデートの日付まで)。

+0

RSA_dupはOpenSSLソースコードのどこにも存在しません。具体的には、同じ電子メールスレッドでは、同じポスターによるフォローアップには次のように書かれています。http://www.mail-archive.com/[email protected]/msg17617.html –

+0

'dst_pkey'のリーク – Orient

+0

@Orientあなたが正しい。ありがとう!私は 'dst_pkey'に対して偽/不要な割り当てをしていました。渡された引数は、事前に割り当てられたpkeyを参照する必要があります。 i2d/d2i法の場合は+1 – jweyrich

2

OpenSSL 1.0.0dでは、EVP_PKEY_copy_parametersが有効です。しかし、実装から判断すると、それだけで公開パラメータをコピーするようだ:jweyrichの溶液から

別に
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; 
} 

を、別の簡単な方法は、最初i2d_RSAPrivateKeyあなたのRSAキーにある、その後d2i_RSAPrivateKeyそれが再び - あなたのコピーがあります:)

+0

+1。 – jweyrich

+1

i2d/d2iメソッドの代わりに、基になる型を知る必要がある場合は、代わりにPEM_write_PrivateKey/PEM_read_PrivateKeyを使用してください。このようにして、RSA、DH、EC、およびDSA秘密鍵はすべて、基になる型を明示的に知らずにコピーされます。 –

+0

別の目的でi2d/d2iを使用します。この答えは本当に私を仕事の日と日に救った...今、私は明日の締め切りに合うだろう....ありがとう、男 –

関連する問題