diff --git a/src/montgomery.rs b/src/montgomery.rs index 1020a24..6c32d81 100644 --- a/src/montgomery.rs +++ b/src/montgomery.rs @@ -425,6 +425,7 @@ impl<'a, 'b> Mul<&'b MontgomeryPoint> for &'a Scalar { #[cfg(test)] mod test { + use constants::ED25519_BASEPOINT_TABLE; use constants::BASE_COMPRESSED_MONTGOMERY; use edwards::Identity; use super::*; @@ -481,6 +482,26 @@ mod test { assert_eq!(p.to_montgomery().compress(), q.compress()); } + #[test] + fn montgomery_ct_eq_ne() { + let mut csprng: OsRng = OsRng::new().unwrap(); + let s1: Scalar = Scalar::random(&mut csprng); + let s2: Scalar = Scalar::random(&mut csprng); + let p1: MontgomeryPoint = (&s1 * &ED25519_BASEPOINT_TABLE).to_montgomery(); + let p2: MontgomeryPoint = (&s2 * &ED25519_BASEPOINT_TABLE).to_montgomery(); + + assert_eq!(p1.ct_eq(&p2), 0); + } + + #[test] + fn montgomery_ct_eq_eq() { + let mut csprng: OsRng = OsRng::new().unwrap(); + let s1: Scalar = Scalar::random(&mut csprng); + let p1: MontgomeryPoint = (&s1 * &ED25519_BASEPOINT_TABLE).to_montgomery(); + + assert_eq!(p1.ct_eq(&p1), 1); + } + #[test] fn differential_add_matches_edwards_model() { let mut csprng: OsRng = OsRng::new().unwrap(); @@ -532,6 +553,17 @@ mod bench { use test::Bencher; use super::*; + #[bench] + fn montgomery_ct_eq(b: &mut Bencher) { + let mut csprng: OsRng = OsRng::new().unwrap(); + let s1: Scalar = Scalar::random(&mut csprng); + let s2: Scalar = Scalar::random(&mut csprng); + let p1: MontgomeryPoint = (&s1 * &ED25519_BASEPOINT_TABLE).to_montgomery(); + let p2: MontgomeryPoint = (&s2 * &ED25519_BASEPOINT_TABLE).to_montgomery(); + + b.iter(| | p1.ct_eq(&p2)) + } + #[bench] fn montgomery_decompress(b: &mut Bencher) { b.iter(| | BASE_COMPRESSED_MONTGOMERY.decompress());