From d9e0321851ce0b3b9d5f10b6b0dab93478e265e5 Mon Sep 17 00:00:00 2001 From: Bradley Beddoes Date: Wed, 9 Aug 2017 12:44:54 +1000 Subject: [PATCH] Set the private key within EcKeyBuilder The initial usecase here is creating EcKey instances from JWK representations, that hold private keys, as defined within RFC 7517. --- openssl/src/ec.rs | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/openssl/src/ec.rs b/openssl/src/ec.rs index 5ff9fd5b..e221b411 100644 --- a/openssl/src/ec.rs +++ b/openssl/src/ec.rs @@ -472,6 +472,15 @@ impl EcKeyBuilderRef { ).map(|_| self) } } + + /// Sets the private key. + pub fn set_private_key(&mut self, + key: &BigNumRef) + -> Result<&mut EcKeyBuilderRef, ErrorStack> { + unsafe { + cvt(ffi::EC_KEY_set_private_key(self.as_ptr(), key.as_ptr())).map(|_| self) + } + } } #[cfg(test)] @@ -573,4 +582,20 @@ mod test { assert!(ec_key.check_key().is_ok()); assert!(ec_key.public_key().is_some()); } + + #[test] + fn set_private_key() { + let group = EcGroup::from_curve_name(nid::X9_62_PRIME256V1).unwrap(); + let d = data_encoding::base64url::decode_nopad("870MB6gfuTJ4HtUnUvYMyJpr5eUZNP4Bk43bVdj3eAE".as_bytes()) + .unwrap(); + + let dbn = BigNum::from_slice(&d).unwrap(); + + let mut builder = EcKeyBuilder::new().unwrap(); + builder.set_group(&group).unwrap(); + builder.set_private_key(&dbn).unwrap(); + + let ec_key = builder.build(); + assert!(ec_key.private_key().is_some()); + } }