aboutsummaryrefslogtreecommitdiff
path: root/openssl/src/crypto/pkey.rs
diff options
context:
space:
mode:
Diffstat (limited to 'openssl/src/crypto/pkey.rs')
-rw-r--r--openssl/src/crypto/pkey.rs38
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());
+ }
}