diff --git a/curve/src/montgomery.rs b/curve/src/montgomery.rs index 74c238c..ca6b82d 100644 --- a/curve/src/montgomery.rs +++ b/curve/src/montgomery.rs @@ -54,7 +54,12 @@ pub trait MontgomeryCurve: fmt::Debug + Clone + Copy + PartialEq + Eq F: Sqrt3Mod4, { let rhs = x * (x * x + self.a() * x + FieldElement::one()); - let y2 = rhs * self.b().inv(); + let b = self.b(); + let y2 = if b == FieldElement::one() { + rhs + } else { + rhs * b.inv() + }; let y = y2.sqrt(); y * y == y2 } @@ -260,7 +265,12 @@ pub trait ExtensionMontgomeryCurve: E::Base: Sqrt3Mod4, { let rhs = x * (x * x + self.a() * x + ExtensionFieldElement::one()); - let y2 = rhs * self.b().inv(); + let b = self.b(); + let y2 = if b == ExtensionFieldElement::one() { + rhs + } else { + rhs * b.inv() + }; let y = y2.sqrt(); y * y == y2 } diff --git a/field/src/lib.rs b/field/src/lib.rs index 1b6b678..1014773 100644 --- a/field/src/lib.rs +++ b/field/src/lib.rs @@ -293,6 +293,10 @@ impl FieldElement

{ _marker: PhantomData, } } + + pub fn normalize_by(&self, denom: Self) -> Self { + *self * denom.inv() + } } impl FieldElement

{