From 390d71f1e546aa33b0ef34bf93e2a0f4327b978e Mon Sep 17 00:00:00 2001 From: Mike Belopuhov Date: Thu, 13 Jun 2019 02:55:15 +0200 Subject: [PATCH] Expose EC_GROUP_get0_generator as EcGroup::generator --- openssl-sys/src/ec.rs | 2 ++ openssl/src/ec.rs | 23 +++++++++++++++++++++++ 2 files changed, 25 insertions(+) diff --git a/openssl-sys/src/ec.rs b/openssl-sys/src/ec.rs index ca4c09ea..05faee27 100644 --- a/openssl-sys/src/ec.rs +++ b/openssl-sys/src/ec.rs @@ -30,6 +30,8 @@ extern "C" { ctx: *mut BN_CTX, ) -> c_int; + pub fn EC_GROUP_get0_generator(group: *const EC_GROUP) -> *const EC_POINT; + pub fn EC_GROUP_get_curve_name(group: *const EC_GROUP) -> c_int; pub fn EC_GROUP_set_asn1_flag(key: *mut EC_GROUP, flag: c_int); diff --git a/openssl/src/ec.rs b/openssl/src/ec.rs index c65dd441..34b7f05e 100644 --- a/openssl/src/ec.rs +++ b/openssl/src/ec.rs @@ -208,6 +208,18 @@ impl EcGroupRef { unsafe { ffi::EC_GROUP_get_degree(self.as_ptr()) as u32 } } + /// Returns the generator for the given curve as a [`EcPoint`]. + /// + /// OpenSSL documentation at [`EC_GROUP_get0_generator`] + /// + /// [`EC_GROUP_get0_generator`]: https://www.openssl.org/docs/man1.1.0/man3/EC_GROUP_get0_generator.html + pub fn generator(&self) -> &EcPointRef { + unsafe { + let ptr = ffi::EC_GROUP_get0_generator(self.as_ptr()); + EcPointRef::from_ptr(ptr as *mut _) + } + } + /// Places the order of the curve in the provided `BigNum`. /// /// OpenSSL documentation at [`EC_GROUP_get_order`] @@ -889,6 +901,17 @@ mod test { assert!(public_key.eq(&group, key.public_key(), &mut ctx).unwrap()); } + #[test] + fn generator() { + let group = EcGroup::from_curve_name(Nid::X9_62_PRIME256V1).unwrap(); + let gen = group.generator(); + let one = BigNum::from_u32(1).unwrap(); + let mut ctx = BigNumContext::new().unwrap(); + let mut ecp = EcPoint::new(&group).unwrap(); + ecp.mul_generator(&group, &one, &mut ctx).unwrap(); + assert!(ecp.eq(&group, gen, &mut ctx).unwrap()); + } + #[test] fn key_from_public_key() { let group = EcGroup::from_curve_name(Nid::X9_62_PRIME256V1).unwrap();