aboutsummaryrefslogtreecommitdiff
path: root/openssl/src
diff options
context:
space:
mode:
authorSteven Fackler <[email protected]>2017-08-08 21:45:44 -0700
committerGitHub <[email protected]>2017-08-08 21:45:44 -0700
commit8f08d66d1e41495891641c0a024e4146ad44fbb3 (patch)
tree36b1312de5f353dcd2ad301bf63fbd75a6cf58a8 /openssl/src
parentInit in bn_ctx constructor (diff)
parentRefine sig for set_public_key_affine_coordinates (diff)
downloadrust-openssl-8f08d66d1e41495891641c0a024e4146ad44fbb3.tar.xz
rust-openssl-8f08d66d1e41495891641c0a024e4146ad44fbb3.zip
Merge pull request #674 from bradleybeddoes/add-ec-functions
Add elliptic curve functions
Diffstat (limited to 'openssl/src')
-rw-r--r--openssl/src/ec.rs61
-rw-r--r--openssl/src/lib.rs2
2 files changed, 62 insertions, 1 deletions
diff --git a/openssl/src/ec.rs b/openssl/src/ec.rs
index 95baa833..e221b411 100644
--- a/openssl/src/ec.rs
+++ b/openssl/src/ec.rs
@@ -459,12 +459,35 @@ impl EcKeyBuilderRef {
pub fn generate_key(&mut self) -> Result<&mut EcKeyBuilderRef, ErrorStack> {
unsafe { cvt(ffi::EC_KEY_generate_key(self.as_ptr())).map(|_| self) }
}
+
+ /// Sets the public key based on affine coordinates.
+ pub fn set_public_key_affine_coordinates(&mut self,
+ x: &BigNumRef,
+ y: &BigNumRef)
+ -> Result<&mut EcKeyBuilderRef, ErrorStack> {
+ unsafe {
+ cvt(ffi::EC_KEY_set_public_key_affine_coordinates(self.as_ptr(),
+ x.as_ptr(),
+ y.as_ptr())
+ ).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)]
mod test {
- use bn::BigNumContext;
+ use bn::{BigNum, BigNumContext};
use nid;
+ use data_encoding;
use super::*;
#[test]
@@ -539,4 +562,40 @@ mod test {
assert!(ec_key.public_key().is_some());
assert!(ec_key.private_key().is_none());
}
+
+ #[test]
+ fn key_from_affine_coordinates() {
+ let group = EcGroup::from_curve_name(nid::X9_62_PRIME256V1).unwrap();
+ let x = data_encoding::base64url::decode_nopad("MKBCTNIcKUSDii11ySs3526iDZ8AiTo7Tu6KPAqv7D4".as_bytes())
+ .unwrap();
+ let y = data_encoding::base64url::decode_nopad("4Etl6SRW2YiLUrN5vfvVHuhp7x8PxltmWWlbbM4IFyM".as_bytes())
+ .unwrap();
+
+ let xbn = BigNum::from_slice(&x).unwrap();
+ let ybn = BigNum::from_slice(&y).unwrap();
+
+ let mut builder = EcKeyBuilder::new().unwrap();
+ builder.set_group(&group).unwrap();
+ builder.set_public_key_affine_coordinates(&xbn, &ybn).unwrap();
+
+ let ec_key = builder.build();
+ 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());
+ }
}
diff --git a/openssl/src/lib.rs b/openssl/src/lib.rs
index 44752dcc..a6d5e6a0 100644
--- a/openssl/src/lib.rs
+++ b/openssl/src/lib.rs
@@ -13,6 +13,8 @@ extern crate openssl_sys as ffi;
extern crate hex;
#[cfg(test)]
extern crate tempdir;
+#[cfg(test)]
+extern crate data_encoding;
#[doc(inline)]
pub use ffi::init;