aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBradley Beddoes <[email protected]>2017-08-09 12:44:54 +1000
committerBradley Beddoes <[email protected]>2017-08-09 12:44:54 +1000
commitd9e0321851ce0b3b9d5f10b6b0dab93478e265e5 (patch)
treeb5659359988c527783f41c1ac992f22e4595e6ad
parentSupport for EcKey creation from affine coordinates (diff)
downloadrust-openssl-d9e0321851ce0b3b9d5f10b6b0dab93478e265e5.tar.xz
rust-openssl-d9e0321851ce0b3b9d5f10b6b0dab93478e265e5.zip
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.
-rw-r--r--openssl/src/ec.rs25
1 files changed, 25 insertions, 0 deletions
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());
+ }
}