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)
This commit is contained in:
commit
70e603557c
|
|
@ -609,11 +609,19 @@ impl Drop for PKey {
|
||||||
|
|
||||||
impl Clone for PKey {
|
impl Clone for PKey {
|
||||||
fn clone(&self) -> Self {
|
fn clone(&self) -> Self {
|
||||||
unsafe {
|
let mut pkey = PKey::from_handle(unsafe { ffi::EVP_PKEY_new() }, self.parts);
|
||||||
let new_evp = ffi::EVP_PKEY_new();
|
// copy by encoding to DER and back
|
||||||
assert!(ffi::EVP_PKEY_copy_parameters(new_evp, self.evp) == 0);
|
match self.parts {
|
||||||
PKey::from_handle(new_evp, 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());
|
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());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue