Skip to content

Commit fbd8d0a

Browse files
committed
Rewrite decaf elligator code to avoid two consecutive additions
1 parent b6cb7a7 commit fbd8d0a

File tree

1 file changed

+8
-3
lines changed

1 file changed

+8
-3
lines changed

src/decaf.rs

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -267,18 +267,23 @@ impl DecafPoint {
267267
fn elligator_decaf_flavour(r_0: &FieldElement) -> DecafPoint {
268268
// Follows Appendix C of the Decaf paper.
269269
// Use n = 2 as the quadratic nonresidue so that n*x = x + x.
270+
let minus_one = -&FieldElement::one();
270271

271272
// 1. Compute r <--- nr_0^2.
272273
let r_0_squared = r_0.square();
273274
let r = &r_0_squared + &r_0_squared;
274275

275276
// 2. Compute D <--- (dr + (a-d)) * (dr - (d + ar))
276277
let dr = &constants::d * &r;
277-
// D = (dr + (a-d)) * (dr - (d + ar)) = (dr + (a-d))*(dr - (d-r)) since a=-1
278-
let D = &(&dr + &constants::a_minus_d) * &(&dr - &(&constants::d - &r));
278+
// D = (dr + (a-d)) * (dr - (d + ar))
279+
// = (dr + (a-d)) * (dr - (d-r)) since a=-1
280+
// writing as
281+
// = (dr + (a-d)) * dr - (dr + (a-d)) * (d - r)
282+
// avoids two consecutive additions (could cause overflow)
283+
let dr_plus_amd = &dr + &constants::a_minus_d;
284+
let D = &(&dr_plus_amd * &dr) - &(&dr_plus_amd * &(&constants::d - &r));
279285

280286
// 3. Compute N <--- (r+1) * (a-2d)
281-
let minus_one = -&FieldElement::one();
282287
let N = &(&r + &FieldElement::one()) * &(&minus_one - &constants::d2);
283288

284289
// 4. Compute

0 commit comments

Comments
 (0)