diff options
| author | Steven Fackler <[email protected]> | 2016-04-16 20:57:21 -0700 |
|---|---|---|
| committer | Steven Fackler <[email protected]> | 2016-04-16 20:57:21 -0700 |
| commit | eadfe88b17e8c28ae0f9102e01fd5eec796d087d (patch) | |
| tree | a169bf548694ab2c59d67e3297bc40595356b772 /openssl/src/crypto | |
| parent | Merge branch 'release-v0.7.9' into release (diff) | |
| parent | Release v0.7.10 (diff) | |
| download | rust-openssl-0.7.10.tar.xz rust-openssl-0.7.10.zip | |
Merge branch 'release-v0.7.10' into releasev0.7.10
Diffstat (limited to 'openssl/src/crypto')
| -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()); + } } |