diff options
| author | Steven Fackler <[email protected]> | 2016-04-09 22:19:05 -0700 |
|---|---|---|
| committer | Steven Fackler <[email protected]> | 2016-04-09 22:19:05 -0700 |
| commit | 70e603557cb97267d2c4d6e41ad9cc502e9149bc (patch) | |
| tree | 160814a6524c02a1d0ccb544bb9d2be2e5d6a8d4 | |
| parent | Merge branch 'release' (diff) | |
| parent | copy PKey using DER encode and decode (diff) | |
| download | rust-openssl-70e603557cb97267d2c4d6e41ad9cc502e9149bc.tar.xz rust-openssl-70e603557cb97267d2c4d6e41ad9cc502e9149bc.zip | |
Merge pull request #376 from kcking/kcking-copy-pkey-using-der
Switch to using DER encode/decode to clone PKey (since EVP_PKEY_copy_parameters doesn't work)
| -rw-r--r-- | openssl/src/crypto/pkey.rs | 38 |
1 files changed, 34 insertions, 4 deletions
diff --git a/openssl/src/crypto/pkey.rs b/openssl/src/crypto/pkey.rs index f945276d..ba0a16b6 100644 --- a/openssl/src/crypto/pkey.rs +++ b/openssl/src/crypto/pkey.rs @@ -609,11 +609,19 @@ impl Drop for PKey { impl Clone for PKey { fn clone(&self) -> Self { - unsafe { - let new_evp = ffi::EVP_PKEY_new(); - assert!(ffi::EVP_PKEY_copy_parameters(new_evp, self.evp) == 0); - PKey::from_handle(new_evp, self.parts) + let mut pkey = PKey::from_handle(unsafe { ffi::EVP_PKEY_new() }, self.parts); + // copy by encoding to DER and back + match self.parts { + Parts::Public => { + pkey.load_pub(&self.save_pub()[..]); + }, + Parts::Both => { + pkey.load_priv(&self.save_priv()[..]); + }, + Parts::Neither => { + }, } + pkey } } @@ -874,4 +882,26 @@ mod tests { assert!(old_pkey_n == pkey.get_rsa().n().unwrap()); } + + #[test] + fn test_pkey_clone_copies_private() { + let mut pkey = super::PKey::new(); + pkey.gen(512); + + let pkey2 = pkey.clone(); + + assert!(pkey.get_rsa().q().unwrap() == pkey2.get_rsa().q().unwrap()); + } + + #[test] + fn test_pkey_clone_copies_public() { + let mut pkey = super::PKey::new(); + pkey.gen(512); + let mut pub_key = super::PKey::new(); + pub_key.load_pub(&pkey.save_pub()[..]); + + let pub_key2 = pub_key.clone(); + + assert!(pub_key.get_rsa().n().unwrap() == pub_key2.get_rsa().n().unwrap()); + } } |