diff options
| author | Rohit Aggarwal <[email protected]> | 2018-03-09 15:58:56 +0000 |
|---|---|---|
| committer | Rohit Aggarwal <[email protected]> | 2018-03-09 15:58:56 +0000 |
| commit | e655b561a72204d65bdb7712bed9d8c2b040f4c7 (patch) | |
| tree | 61628a0e73e56816c2ece59141fecbcf7f320e21 | |
| parent | Remove unneeded paramter (diff) | |
| download | rust-openssl-e655b561a72204d65bdb7712bed9d8c2b040f4c7.tar.xz rust-openssl-e655b561a72204d65bdb7712bed9d8c2b040f4c7.zip | |
Added a function to create a EC<Key> from its parts
| -rw-r--r-- | openssl/src/ec.rs | 39 |
1 files changed, 39 insertions, 0 deletions
diff --git a/openssl/src/ec.rs b/openssl/src/ec.rs index ad3b0f54..2ddeef2e 100644 --- a/openssl/src/ec.rs +++ b/openssl/src/ec.rs @@ -729,6 +729,33 @@ impl EcKey<Private> { } } + /// Constructs an public/private key pair given a curve, a private key and a public key point. + pub fn from_keys( + group: &EcGroupRef, + private_number: &BigNumRef, + public_key: &EcPointRef, + ) -> Result<EcKey<Private>, ErrorStack> { + unsafe { + cvt_p(ffi::EC_KEY_new()) + .map(|p| EcKey::from_ptr(p)) + .and_then(|key| { + cvt(ffi::EC_KEY_set_group(key.as_ptr(), group.as_ptr())).map(|_| key) + }) + .and_then(|key| { + cvt(ffi::EC_KEY_set_private_key( + key.as_ptr(), + private_number.as_ptr(), + )).map(|_| key) + }) + .and_then(|key| { + cvt(ffi::EC_KEY_set_public_key( + key.as_ptr(), + public_key.as_ptr(), + )).map(|_| key) + }) + } + } + private_key_from_pem! { /// Deserializes a private key from a PEM-encoded ECPrivateKey structure. /// @@ -846,6 +873,18 @@ mod test { } #[test] + fn key_from_keys() { + let group = EcGroup::from_curve_name(Nid::X9_62_PRIME256V1).unwrap(); + let key = EcKey::generate(&group).unwrap(); + + let dup_key = EcKey::from_keys(&group, key.private_key(), key.public_key()).unwrap(); + let res = dup_key.check_key().unwrap(); + + assert!(res == ()); + assert!(key.private_key() == dup_key.private_key()); + } + + #[test] fn key_from_affine_coordinates() { let group = EcGroup::from_curve_name(Nid::X9_62_PRIME256V1).unwrap(); let x = BASE64URL_NOPAD |