| @@ -389,54 +389,56 @@ deisogenize ( | |||
| #if COFACTOR == 4 && !IMAGINE_TWIST | |||
| (void) toggle_rotation; | |||
| /* TODO: Can shave off one mul here; not important but makes consistent with paper */ | |||
| gf b, d; | |||
| gf_s *a = s, *c = minus_t_over_s; | |||
| gf_mulw_sgn ( a, p->y, 1-EDWARDS_D ); | |||
| gf_mul ( c, a, p->t ); /* -dYT, with EDWARDS_D = d-1 */ | |||
| gf_mul ( a, p->x, p->z ); | |||
| gf_sub ( d, c, a ); /* aXZ-dYT with a=-1 */ | |||
| gf_add ( a, p->z, p->y ); | |||
| gf_sub ( b, p->z, p->y ); | |||
| gf_mul ( c, b, a ); | |||
| gf_mulw_sgn ( b, c, -EDWARDS_D ); /* (a-d)(Z+Y)(Z-Y) */ | |||
| mask_t ok = gf_isqrt_chk ( a, b, DECAF_TRUE ); /* r in the paper */ | |||
| gf_s *c = s, *a = minus_t_over_s; | |||
| gf_mulw_sgn(a, p->y, 1-EDWARDS_D); | |||
| gf_mul(c, a, p->t); /* -dYT, with EDWARDS_D = d-1 */ | |||
| gf_mul(a, p->x, p->z); | |||
| gf_sub(d, c, a); /* aXZ-dYT with a=-1 */ | |||
| gf_add(a, p->z, p->y); | |||
| gf_sub(b, p->z, p->y); | |||
| gf_mul(c, b, a); | |||
| gf_mulw_sgn(b, c, -EDWARDS_D); /* (a-d)(Z+Y)(Z-Y) */ | |||
| mask_t ok = gf_isqrt_chk ( a, b, DECAF_TRUE); /* r in the paper */ | |||
| (void)ok; assert(ok); | |||
| gf_mulw_sgn ( b, a, -EDWARDS_D ); /* u in the paper */ | |||
| gf_mul ( c, b, a ); /* ur */ | |||
| gf_mul ( a, c, d ); /* ur (aZX-dYT) */ | |||
| gf_add ( d, b, b ); /* 2u = -2au since a=-1 */ | |||
| gf_mul ( c, d, p->z ); /* 2uZ */ | |||
| cond_neg ( b, toggle_hibit_t_over_s ^ ~hibit(c) ); /* u <- -u if negative. */ | |||
| cond_neg ( c, toggle_hibit_t_over_s ^ ~hibit(c) ); /* u <- -u if negative. */ | |||
| gf_mul ( d, b, p->y ); | |||
| gf_add ( s, a, d ); | |||
| cond_neg ( s, toggle_hibit_s ^ hibit(s) ); | |||
| gf_mulw_sgn (b, a, -EDWARDS_D); /* u in the paper */ | |||
| gf_mul(c,a,d); /* r(aZX-dYT) */ | |||
| gf_mul(a,b,p->z); /* uZ */ | |||
| gf_add(a,a,a); /* 2uZ */ | |||
| cond_neg(c, toggle_hibit_t_over_s ^ ~hibit(a)); /* u <- -u if negative. */ | |||
| cond_neg(a, toggle_hibit_t_over_s ^ ~hibit(a)); /* t/s <-? -t/s */ | |||
| gf_add(d,c,p->y); | |||
| gf_mul(s,b,d); | |||
| cond_neg(s, toggle_hibit_s ^ hibit(s)); | |||
| #else | |||
| /* More complicated because of rotation */ | |||
| /* MAGIC This code is wrong for certain non-Curve25519 curves; check if it's because of Cofactor==8 or IMAGINE_ROTATION */ | |||
| /* MAGIC This code is wrong for certain non-Curve25519 curves; | |||
| * check if it's because of Cofactor==8 or IMAGINE_ROTATION */ | |||
| gf c, d; | |||
| gf_s *b = s, *a = minus_t_over_s; | |||
| #if IMAGINE_TWIST | |||
| gf x, t; | |||
| gf_mul ( x, p->x, SQRT_MINUS_ONE); | |||
| gf_mul ( t, p->t, SQRT_MINUS_ONE); | |||
| gf_sub ( x, ZERO, x ); | |||
| gf_sub ( t, ZERO, t ); | |||
| gf_add ( a, p->z, x ); | |||
| gf_sub ( b, p->z, x ); | |||
| gf_mul ( c, a, b ); /* "zx" = Z^2 - aX^2 = Z^2 - X^2 */ | |||
| #else | |||
| const gf_s *x = p->x, *t = p->t; | |||
| /* Won't hit the cond_sel below because COFACTOR==8 requires IMAGINE_TWIST for now. */ | |||
| gf_sqr ( a, p->z ); | |||
| gf_sqr ( b, p->x ); | |||
| gf_add ( c, a, b ); /* "zx" = Z^2 - aX^2 = Z^2 + X^2 */ | |||
| #endif | |||
| #if IMAGINE_TWIST | |||
| gf x, t; | |||
| gf_mul ( x, p->x, SQRT_MINUS_ONE); | |||
| gf_mul ( t, p->t, SQRT_MINUS_ONE); | |||
| gf_sub ( x, ZERO, x ); | |||
| gf_sub ( t, ZERO, t ); | |||
| gf_add ( a, p->z, x ); | |||
| gf_sub ( b, p->z, x ); | |||
| gf_mul ( c, a, b ); /* "zx" = Z^2 - aX^2 = Z^2 - X^2 */ | |||
| #else | |||
| const gf_s *x = p->x, *t = p->t; | |||
| /* Won't hit the cond_sel below because COFACTOR==8 requires IMAGINE_TWIST for now. */ | |||
| gf_sqr ( a, p->z ); | |||
| gf_sqr ( b, p->x ); | |||
| gf_add ( c, a, b ); /* "zx" = Z^2 - aX^2 = Z^2 + X^2 */ | |||
| #endif | |||
| gf_mul ( a, p->z, t ); /* "tz" = T*Z */ | |||
| gf_sqr ( b, a ); | |||
| @@ -448,8 +450,7 @@ deisogenize ( | |||
| gf_mul ( b, a, d ); /* 1/tz */ | |||
| mask_t rotate; | |||
| #if (COFACTOR == 8) | |||
| { | |||
| #if (COFACTOR == 8) | |||
| gf e; | |||
| gf_sqr(e, p->z); | |||
| gf_mul(a, e, b); /* z^2 / tz = z/t = 1/xy */ | |||
| @@ -458,11 +459,10 @@ deisogenize ( | |||
| gf_mul ( a, b, c ); | |||
| cond_sel ( a, a, SQRT_ONE_MINUS_D, rotate ); | |||
| cond_sel ( x, p->y, x, rotate ); | |||
| } | |||
| #else | |||
| (void)toggle_rotation; | |||
| rotate = 0; | |||
| #endif | |||
| #else | |||
| (void)toggle_rotation; | |||
| rotate = 0; | |||
| #endif | |||
| gf_mul ( c, a, d ); // new "osx" | |||
| gf_mul ( a, c, p->z ); | |||