diff options
| author | Steven Fackler <[email protected]> | 2018-03-13 21:50:17 -0700 |
|---|---|---|
| committer | GitHub <[email protected]> | 2018-03-13 21:50:17 -0700 |
| commit | 66a2ad76b757606eed85ef6f8a6504aaa96c1af8 (patch) | |
| tree | a6f21200af2ca20edc97498197b9981dc9a6c0ae /openssl/src | |
| parent | Merge pull request #864 from mlen/aes-ccm-bindings (diff) | |
| parent | Change function name to be similar to RSA one (diff) | |
| download | rust-openssl-66a2ad76b757606eed85ef6f8a6504aaa96c1af8.tar.xz rust-openssl-66a2ad76b757606eed85ef6f8a6504aaa96c1af8.zip | |
Merge pull request #874 from rohit-lshift/priv-key-from-num
Added a function to create a EcKey<Private> from its parts
Diffstat (limited to 'openssl/src')
| -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..c4800c73 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_private_components( + 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_private_components() { + let group = EcGroup::from_curve_name(Nid::X9_62_PRIME256V1).unwrap(); + let key = EcKey::generate(&group).unwrap(); + + let dup_key = EcKey::from_private_components(&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 |