diff options
| author | Steven Fackler <[email protected]> | 2017-08-08 21:45:44 -0700 |
|---|---|---|
| committer | GitHub <[email protected]> | 2017-08-08 21:45:44 -0700 |
| commit | 8f08d66d1e41495891641c0a024e4146ad44fbb3 (patch) | |
| tree | 36b1312de5f353dcd2ad301bf63fbd75a6cf58a8 /openssl/src | |
| parent | Init in bn_ctx constructor (diff) | |
| parent | Refine sig for set_public_key_affine_coordinates (diff) | |
| download | rust-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.rs | 61 | ||||
| -rw-r--r-- | openssl/src/lib.rs | 2 |
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; |