aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRohit Aggarwal <[email protected]>2018-03-09 15:58:56 +0000
committerRohit Aggarwal <[email protected]>2018-03-09 15:58:56 +0000
commite655b561a72204d65bdb7712bed9d8c2b040f4c7 (patch)
tree61628a0e73e56816c2ece59141fecbcf7f320e21
parentRemove unneeded paramter (diff)
downloadrust-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.rs39
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