Skip to content

Commit

Permalink
Add ec point validation functions
Browse files Browse the repository at this point in the history
  • Loading branch information
nomick committed Feb 15, 2021
1 parent 71b6e3f commit 687f0d2
Show file tree
Hide file tree
Showing 2 changed files with 57 additions and 0 deletions.
8 changes: 8 additions & 0 deletions openssl-sys/src/ec.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down
49 changes: 49 additions & 0 deletions openssl/src/ec.rs
Original file line number Diff line number Diff line change
Expand Up @@ -527,6 +527,30 @@ impl EcPointRef {
.map(|_| ())
}
}

/// Checks if point is infinity
pub fn is_infinity(&self, group: &EcGroupRef) -> Result<bool, ErrorStack> {
unsafe {
let res = cvt_n(ffi::EC_POINT_is_at_infinity(group.as_ptr(), self.as_ptr()))?;
Ok(res == 1)
}
}

/// Checks if point is on a given curve
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 {
Expand Down Expand Up @@ -1074,4 +1098,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).unwrap(), 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).unwrap(), 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);
}
}

0 comments on commit 687f0d2

Please sign in to comment.