2011-06-23 58 views
6

我發現功能EVP_PKEY_copy_parameters,它可以複製EVP_PKEY。 但是關於這個函數的一些文檔說它只能用於DSA/ECC算法。 官方文檔(來自openssl.org)未提及該函數是否可用於RSA EVP_PKEYs。我們如何複製包含RSA密鑰的EVP_PKEY?

EVP_PKEY另一種實現(包含RSA密鑰)可能是這樣的:

EVP_PKEY_assign_RSA(RSAPrivateKey_dup(EVP_PKEY_get1_RSA(pkey))); 

你有什麼建議嗎?

回答

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: How to duplicate an EVP_PKEY - >作爲@ X-Istence低於稱,此參考線程中建議的方法在OpenSSL中不存在(至少在此更新的日期之前)。

+0

RSA_dup不存在於OpenSSL源代碼中的任何地方。具體而言,在同一封電子郵件主題中,同一張海報的後續內容中提到的內容如下:http://www.mail-archive.com/[email protected]/msg17617.html –

+0

'dst_pkey'泄漏 – Orient

+0

@Orient你是對的。謝謝!我有'dst_pkey'的假/不必要的分配。傳遞的參數必須引用預分配的pkey。 – jweyrich

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的解決方案

除此之外,另一種簡單的方法是,先i2d_RSAPrivateKey您的RSA密鑰,然後d2i_RSAPrivateKey一遍 - 有你的副本:)

+0

+1爲i2d/d2i方法。 – jweyrich

+1

而不是需要您知道底層類型是什麼的i2d/d2i方法,而是使用PEM_write_PrivateKey/PEM_read_PrivateKey。這樣,RSA,DH,EC和DSA私鑰全部複製,而不明確知道底層類型。 –

+0

我將使用i2d/d2i作其他用途。這個答案真的幫我節省了幾天和幾天的工作時間......現在,我會適應明天的最後期限....非常感謝,夥計 –