summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSteven Fackler <sfackler@gmail.com>2021-02-15 19:04:54 -0500
committerGitHub <noreply@github.com>2021-02-15 19:04:54 -0500
commitd7c36c63af66b5272b0b64a803983e5fa4fc3af6 (patch)
tree57dde30634b6abfe75419c21b8df3e0858193e26
parentb602f36a3659e09b8704fd9e0e438d3af87662e7 (diff)
parent53a220bee6d19d3c70f6a60606eea353ad47e72a (diff)
downloadrust-openssl-d7c36c63af66b5272b0b64a803983e5fa4fc3af6.zip
Merge pull request #1414 from nomick/master
Add ec point validation functions
-rw-r--r--openssl-sys/src/ec.rs8
-rw-r--r--openssl/src/ec.rs57
2 files changed, 65 insertions, 0 deletions
diff --git a/openssl-sys/src/ec.rs b/openssl-sys/src/ec.rs
index 98e233fb..82772fe8 100644
--- a/openssl-sys/src/ec.rs
+++ b/openssl-sys/src/ec.rs
@@ -81,6 +81,14 @@ extern "C" {
pub fn EC_GROUP_new_by_curve_name(nid: c_int) -> *mut EC_GROUP;
+ pub fn EC_POINT_is_at_infinity(group: *const EC_GROUP, point: *const EC_POINT) -> c_int;
+
+ pub fn EC_POINT_is_on_curve(
+ group: *const EC_GROUP,
+ point: *const EC_POINT,
+ ctx: *mut BN_CTX,
+ ) -> c_int;
+
pub fn EC_POINT_new(group: *const EC_GROUP) -> *mut EC_POINT;
pub fn EC_POINT_free(point: *mut EC_POINT);
diff --git a/openssl/src/ec.rs b/openssl/src/ec.rs
index efbc26f6..32751cd2 100644
--- a/openssl/src/ec.rs
+++ b/openssl/src/ec.rs
@@ -527,6 +527,38 @@ impl EcPointRef {
.map(|_| ())
}
}
+
+ /// Checks if point is infinity
+ ///
+ /// OpenSSL documentation at [`EC_POINT_is_at_infinity`]
+ ///
+ /// [`EC_POINT_is_at_infinity`]: https://www.openssl.org/docs/man1.1.0/man3/EC_POINT_is_at_infinity.html
+ pub fn is_infinity(&self, group: &EcGroupRef) -> bool {
+ unsafe {
+ let res = ffi::EC_POINT_is_at_infinity(group.as_ptr(), self.as_ptr());
+ res == 1
+ }
+ }
+
+ /// Checks if point is on a given curve
+ ///
+ /// OpenSSL documentation at [`EC_POINT_is_on_curve`]
+ ///
+ /// [`EC_POINT_is_on_curve`]: https://www.openssl.org/docs/man1.1.0/man3/EC_POINT_is_on_curve.html
+ pub fn is_on_curve(
+ &self,
+ group: &EcGroupRef,
+ ctx: &mut BigNumContextRef,
+ ) -> Result<bool, ErrorStack> {
+ unsafe {
+ let res = cvt_n(ffi::EC_POINT_is_on_curve(
+ group.as_ptr(),
+ self.as_ptr(),
+ ctx.as_ptr(),
+ ))?;
+ Ok(res == 1)
+ }
+ }
}
impl EcPoint {
@@ -1074,4 +1106,29 @@ mod test {
assert_eq!(xbn2, xbn);
assert_eq!(ybn2, ybn);
}
+
+ #[test]
+ fn is_infinity() {
+ let group = EcGroup::from_curve_name(Nid::X9_62_PRIME256V1).unwrap();
+ let mut ctx = BigNumContext::new().unwrap();
+ let g = group.generator();
+ assert_eq!(g.is_infinity(&group), false);
+
+ let mut order = BigNum::new().unwrap();
+ group.order(&mut order, &mut ctx).unwrap();
+ let mut inf = EcPoint::new(&group).unwrap();
+ inf.mul_generator(&group, &order, &ctx).unwrap();
+ assert_eq!(inf.is_infinity(&group), true);
+ }
+
+ #[test]
+ fn is_on_curve() {
+ let group = EcGroup::from_curve_name(Nid::X9_62_PRIME256V1).unwrap();
+ let mut ctx = BigNumContext::new().unwrap();
+ let g = group.generator();
+ assert_eq!(g.is_on_curve(&group, &mut ctx).unwrap(), true);
+
+ let group2 = EcGroup::from_curve_name(Nid::X9_62_PRIME239V3).unwrap();
+ assert_eq!(g.is_on_curve(&group2, &mut ctx).unwrap(), false);
+ }
}