|
|
@@ -141,6 +141,31 @@ static inline void gf_sub ( gf c, const gf a, const gf b ) { |
|
|
|
field_sub((field_t *)c, (const field_t *)a, (const field_t *)b); |
|
|
|
} |
|
|
|
|
|
|
|
/** Add mod p. Conservatively always weak-reduce. (PERF) */ |
|
|
|
static inline void gf_bias ( gf c, int amt) { |
|
|
|
field_bias((field_t *)c, amt); |
|
|
|
} |
|
|
|
|
|
|
|
/** Subtract mod p. Bias by 2 and don't reduce */ |
|
|
|
static inline void gf_sub_nr ( gf c, const gf a, const gf b ) { |
|
|
|
ANALYZE_THIS_ROUTINE_CAREFULLY; //TODO |
|
|
|
field_sub_nr((field_t *)c, (const field_t *)a, (const field_t *)b); |
|
|
|
gf_bias(c, 2); |
|
|
|
} |
|
|
|
|
|
|
|
/** Subtract mod p. Bias by 3 but don't reduce. */ |
|
|
|
static inline void gf_sub_nr_nr ( gf c, const gf a, const gf b ) { |
|
|
|
ANALYZE_THIS_ROUTINE_CAREFULLY; //TODO |
|
|
|
field_sub_nr((field_t *)c, (const field_t *)a, (const field_t *)b); |
|
|
|
gf_bias(c, 3); |
|
|
|
} |
|
|
|
|
|
|
|
/** Add mod p. Don't reduce. */ |
|
|
|
static inline void gf_add_nr ( gf c, const gf a, const gf b ) { |
|
|
|
ANALYZE_THIS_ROUTINE_CAREFULLY; //TODO |
|
|
|
field_add_nr((field_t *)c, (const field_t *)a, (const field_t *)b); |
|
|
|
} |
|
|
|
|
|
|
|
/** Constant time, x = is_z ? z : y */ |
|
|
|
sv cond_sel(gf x, const gf y, const gf z, decaf_bool_t is_z) { |
|
|
|
FOR_LIMB(i, x[i] = (y[i] & ~is_z) | (z[i] & is_z) ); |
|
|
@@ -398,21 +423,21 @@ sv decaf_448_point_add_sub ( |
|
|
|
) { |
|
|
|
/* Twisted Edward formulas, complete when 4-torsion isn't involved */ |
|
|
|
gf a, b, c, d; |
|
|
|
gf_sub ( b, q->y, q->x ); |
|
|
|
gf_sub ( c, r->y, r->x ); |
|
|
|
gf_add ( d, r->y, r->x ); |
|
|
|
gf_sub_nr ( b, q->y, q->x ); |
|
|
|
gf_sub_nr ( c, r->y, r->x ); |
|
|
|
gf_add_nr ( d, r->y, r->x ); |
|
|
|
cond_swap(c,d,do_sub); |
|
|
|
gf_mul ( a, c, b ); |
|
|
|
gf_add ( b, q->y, q->x ); |
|
|
|
gf_add_nr ( b, q->y, q->x ); |
|
|
|
gf_mul ( p->y, d, b ); |
|
|
|
gf_mul ( b, r->t, q->t ); |
|
|
|
gf_mlw ( p->x, b, 2-2*EDWARDS_D ); |
|
|
|
gf_add ( b, a, p->y ); |
|
|
|
gf_sub ( c, p->y, a ); |
|
|
|
gf_add_nr ( b, a, p->y ); |
|
|
|
gf_sub_nr ( c, p->y, a ); |
|
|
|
gf_mul ( a, q->z, r->z ); |
|
|
|
gf_add ( a, a, a ); |
|
|
|
gf_add ( p->y, a, p->x ); |
|
|
|
gf_sub ( a, a, p->x ); |
|
|
|
gf_add_nr ( a, a, a ); |
|
|
|
gf_add_nr ( p->y, a, p->x ); |
|
|
|
gf_sub_nr ( a, a, p->x ); |
|
|
|
cond_swap(a,p->y,do_sub); |
|
|
|
gf_mul ( p->z, a, p->y ); |
|
|
|
gf_mul ( p->x, p->y, c ); |
|
|
@@ -459,20 +484,20 @@ void decaf_448_point_sub ( |
|
|
|
const decaf_448_point_t r |
|
|
|
) { |
|
|
|
gf a, b, c, d; |
|
|
|
gf_sub ( b, q->y, q->x ); |
|
|
|
gf_sub ( d, r->y, r->x ); |
|
|
|
gf_add ( c, r->y, r->x ); |
|
|
|
gf_sub_nr ( b, q->y, q->x ); |
|
|
|
gf_sub_nr ( d, r->y, r->x ); |
|
|
|
gf_add_nr ( c, r->y, r->x ); |
|
|
|
gf_mul ( a, c, b ); |
|
|
|
gf_add ( b, q->y, q->x ); |
|
|
|
gf_add_nr ( b, q->y, q->x ); |
|
|
|
gf_mul ( p->y, d, b ); |
|
|
|
gf_mul ( b, r->t, q->t ); |
|
|
|
gf_mlw ( p->x, b, 2-2*EDWARDS_D ); |
|
|
|
gf_add ( b, a, p->y ); |
|
|
|
gf_sub ( c, p->y, a ); |
|
|
|
gf_add_nr ( b, a, p->y ); |
|
|
|
gf_sub_nr ( c, p->y, a ); |
|
|
|
gf_mul ( a, q->z, r->z ); |
|
|
|
gf_add ( a, a, a ); |
|
|
|
gf_sub ( p->y, a, p->x ); |
|
|
|
gf_add ( a, a, p->x ); |
|
|
|
gf_add_nr ( a, a, a ); |
|
|
|
gf_sub_nr ( p->y, a, p->x ); |
|
|
|
gf_add_nr ( a, a, p->x ); |
|
|
|
gf_mul ( p->z, a, p->y ); |
|
|
|
gf_mul ( p->x, p->y, c ); |
|
|
|
gf_mul ( p->y, a, b ); |
|
|
@@ -485,20 +510,20 @@ void decaf_448_point_add ( |
|
|
|
const decaf_448_point_t r |
|
|
|
) { |
|
|
|
gf a, b, c, d; |
|
|
|
gf_sub ( b, q->y, q->x ); |
|
|
|
gf_sub ( c, r->y, r->x ); |
|
|
|
gf_add ( d, r->y, r->x ); |
|
|
|
gf_sub_nr ( b, q->y, q->x ); |
|
|
|
gf_sub_nr ( c, r->y, r->x ); |
|
|
|
gf_add_nr ( d, r->y, r->x ); |
|
|
|
gf_mul ( a, c, b ); |
|
|
|
gf_add ( b, q->y, q->x ); |
|
|
|
gf_add_nr ( b, q->y, q->x ); |
|
|
|
gf_mul ( p->y, d, b ); |
|
|
|
gf_mul ( b, r->t, q->t ); |
|
|
|
gf_mlw ( p->x, b, 2-2*EDWARDS_D ); |
|
|
|
gf_add ( b, a, p->y ); |
|
|
|
gf_sub ( c, p->y, a ); |
|
|
|
gf_add_nr ( b, a, p->y ); |
|
|
|
gf_sub_nr ( c, p->y, a ); |
|
|
|
gf_mul ( a, q->z, r->z ); |
|
|
|
gf_add ( a, a, a ); |
|
|
|
gf_add ( p->y, a, p->x ); |
|
|
|
gf_sub ( a, a, p->x ); |
|
|
|
gf_add_nr ( a, a, a ); |
|
|
|
gf_add_nr ( p->y, a, p->x ); |
|
|
|
gf_sub_nr ( a, a, p->x ); |
|
|
|
gf_mul ( p->z, a, p->y ); |
|
|
|
gf_mul ( p->x, p->y, c ); |
|
|
|
gf_mul ( p->y, a, b ); |
|
|
@@ -510,14 +535,14 @@ void decaf_448_point_double(decaf_448_point_t p, const decaf_448_point_t q) { |
|
|
|
gf a, b, c, d; |
|
|
|
gf_sqr ( c, q->x ); |
|
|
|
gf_sqr ( a, q->y ); |
|
|
|
gf_add ( d, c, a ); |
|
|
|
gf_add ( p->t, q->y, q->x ); |
|
|
|
gf_add_nr ( d, c, a ); |
|
|
|
gf_add_nr ( p->t, q->y, q->x ); |
|
|
|
gf_sqr ( b, p->t ); |
|
|
|
gf_sub ( b, b, d ); |
|
|
|
gf_sub ( p->t, a, c ); |
|
|
|
gf_sub_nr_nr ( b, b, d ); |
|
|
|
gf_sub_nr ( p->t, a, c ); |
|
|
|
gf_sqr ( p->x, q->z ); |
|
|
|
gf_add ( p->z, p->x, p->x ); |
|
|
|
gf_sub ( a, p->z, p->t ); |
|
|
|
gf_add_nr ( p->z, p->x, p->x ); |
|
|
|
gf_sub_nr_nr ( a, p->z, p->t ); |
|
|
|
gf_mul ( p->x, a, b ); |
|
|
|
gf_mul ( p->z, p->t, a ); |
|
|
|
gf_mul ( p->y, p->t, d ); |
|
|
|