Constant-time field inversion

WARNING: THIS IS NOT ACTUALLY CONSTANT TIME YET!

The jubjub and bls12_381 crates will replace our constant-time usages,
but we NEED to fix ff_derive because other users will expect it to
implement the Field trait correctly.
This commit is contained in:
Jack Grigg
2019-05-14 14:18:37 +01:00
parent e85a9f309f
commit 40749da9a7
25 changed files with 243 additions and 221 deletions

View File

@@ -344,13 +344,11 @@ impl<E: JubjubEngine> EdwardsPoint<E> {
let mut t1 = E::Fr::one();
t1.add_assign(c.get_value().get()?);
match t1.inverse() {
Some(t1) => {
t0.mul_assign(&t1);
Ok(t0)
}
None => Err(SynthesisError::DivisionByZero),
let res = t1.invert().map(|t1| t0 * &t1);
if bool::from(res.is_some()) {
Ok(res.unwrap())
} else {
Err(SynthesisError::DivisionByZero)
}
})?;
@@ -371,13 +369,11 @@ impl<E: JubjubEngine> EdwardsPoint<E> {
let mut t1 = E::Fr::one();
t1.sub_assign(c.get_value().get()?);
match t1.inverse() {
Some(t1) => {
t0.mul_assign(&t1);
Ok(t0)
}
None => Err(SynthesisError::DivisionByZero),
let res = t1.invert().map(|t1| t0 * &t1);
if bool::from(res.is_some()) {
Ok(res.unwrap())
} else {
Err(SynthesisError::DivisionByZero)
}
})?;
@@ -451,13 +447,11 @@ impl<E: JubjubEngine> EdwardsPoint<E> {
let mut t1 = E::Fr::one();
t1.add_assign(c.get_value().get()?);
match t1.inverse() {
Some(t1) => {
t0.mul_assign(&t1);
Ok(t0)
}
None => Err(SynthesisError::DivisionByZero),
let ret = t1.invert().map(|t1| t0 * &t1);
if bool::from(ret.is_some()) {
Ok(ret.unwrap())
} else {
Err(SynthesisError::DivisionByZero)
}
})?;
@@ -478,13 +472,11 @@ impl<E: JubjubEngine> EdwardsPoint<E> {
let mut t1 = E::Fr::one();
t1.sub_assign(c.get_value().get()?);
match t1.inverse() {
Some(t1) => {
t0.mul_assign(&t1);
Ok(t0)
}
None => Err(SynthesisError::DivisionByZero),
let ret = t1.invert().map(|t1| t0 * &t1);
if bool::from(ret.is_some()) {
Ok(ret.unwrap())
} else {
Err(SynthesisError::DivisionByZero)
}
})?;
@@ -521,13 +513,11 @@ impl<E: JubjubEngine> MontgomeryPoint<E> {
let mut t0 = *self.x.get_value().get()?;
t0.mul_assign(params.scale());
match self.y.get_value().get()?.inverse() {
Some(invy) => {
t0.mul_assign(&invy);
Ok(t0)
}
None => Err(SynthesisError::DivisionByZero),
let ret = self.y.get_value().get()?.invert().map(|invy| t0 * &invy);
if bool::from(ret.is_some()) {
Ok(ret.unwrap())
} else {
Err(SynthesisError::DivisionByZero)
}
})?;
@@ -545,13 +535,11 @@ impl<E: JubjubEngine> MontgomeryPoint<E> {
t0.sub_assign(&E::Fr::one());
t1.add_assign(&E::Fr::one());
match t1.inverse() {
Some(t1) => {
t0.mul_assign(&t1);
Ok(t0)
}
None => Err(SynthesisError::DivisionByZero),
let ret = t1.invert().map(|t1| t0 * &t1);
if bool::from(ret.is_some()) {
Ok(ret.unwrap())
} else {
Err(SynthesisError::DivisionByZero)
}
})?;
@@ -593,12 +581,11 @@ impl<E: JubjubEngine> MontgomeryPoint<E> {
let mut d = *other.x.get_value().get()?;
d.sub_assign(self.x.get_value().get()?);
match d.inverse() {
Some(d) => {
n.mul_assign(&d);
Ok(n)
}
None => Err(SynthesisError::DivisionByZero),
let ret = d.invert().map(|d| n * &d);
if bool::from(ret.is_some()) {
Ok(ret.unwrap())
} else {
Err(SynthesisError::DivisionByZero)
}
})?;