| @@ -27,8 +27,6 @@ | |||||
| #define point_t decaf_255_point_t | #define point_t decaf_255_point_t | ||||
| #define precomputed_s decaf_255_precomputed_s | #define precomputed_s decaf_255_precomputed_s | ||||
| #define SER_BYTES DECAF_255_SER_BYTES | #define SER_BYTES DECAF_255_SER_BYTES | ||||
| #define gf_s gf_255_s | |||||
| #define gf gf_255_t | |||||
| #if WBITS == 64 | #if WBITS == 64 | ||||
| typedef __int128_t decaf_sdword_t; | typedef __int128_t decaf_sdword_t; | ||||
| @@ -72,7 +70,7 @@ typedef struct { niels_t n; gf z; } __attribute__((aligned(32))) pniels_s, pniel | |||||
| /* Precomputed base */ | /* Precomputed base */ | ||||
| struct precomputed_s { niels_t table [DECAF_COMBS_N<<(DECAF_COMBS_T-1)]; }; | struct precomputed_s { niels_t table [DECAF_COMBS_N<<(DECAF_COMBS_T-1)]; }; | ||||
| extern const field_t API_NS(precomputed_base_as_fe)[]; | |||||
| extern const gf API_NS(precomputed_base_as_fe)[]; | |||||
| const precomputed_s *API_NS(precomputed_base) = | const precomputed_s *API_NS(precomputed_base) = | ||||
| (const precomputed_s *) &API_NS(precomputed_base_as_fe); | (const precomputed_s *) &API_NS(precomputed_base_as_fe); | ||||
| @@ -95,52 +93,6 @@ const size_t API_NS2(alignof,precomputed_s) = 32; | |||||
| /** Copy x = y */ | /** Copy x = y */ | ||||
| siv gf_cpy(gf x, const gf y) { x[0] = y[0]; } | siv gf_cpy(gf x, const gf y) { x[0] = y[0]; } | ||||
| /** Mostly-unoptimized multiply, but at least it's unrolled. */ | |||||
| siv gf_mul (gf c, const gf a, const gf b) { | |||||
| field_mul((field_t *)c, (const field_t *)a, (const field_t *)b); | |||||
| } | |||||
| /** Dedicated square */ | |||||
| siv gf_sqr (gf c, const gf a) { | |||||
| field_sqr((field_t *)c, (const field_t *)a); | |||||
| } | |||||
| /** Add mod p. Conservatively always weak-reduce. */ | |||||
| snv gf_add ( gf_s *__restrict__ c, const gf a, const gf b ) { | |||||
| field_add((field_t *)c, (const field_t *)a, (const field_t *)b); | |||||
| } | |||||
| /** Subtract mod p. Conservatively always weak-reduce. */ | |||||
| snv 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.) */ | |||||
| siv gf_bias ( gf c, int amt) { | |||||
| field_bias((field_t *)c, amt); | |||||
| } | |||||
| /** Subtract mod p. Bias by 2 and don't reduce */ | |||||
| siv gf_sub_nr ( gf_s *__restrict__ c, const gf a, const gf b ) { | |||||
| // FOR_LIMB_U(i, c->limb[i] = a->limb[i] - b->limb[i] + 2*P->limb[i] ); | |||||
| field_sub_nr((field_t *)c, (const field_t *)a, (const field_t *)b); | |||||
| gf_bias(c, 2); | |||||
| if (WBITS==32) field_weak_reduce((field_t*) c); // HACK | |||||
| } | |||||
| /** Subtract mod p. Bias by amt but don't reduce. */ | |||||
| siv gf_sub_nr_x ( gf c, const gf a, const gf b, int amt ) { | |||||
| field_sub_nr((field_t *)c, (const field_t *)a, (const field_t *)b); | |||||
| gf_bias(c, amt); | |||||
| if (WBITS==32) field_weak_reduce((field_t*) c); // HACK | |||||
| } | |||||
| /** Add mod p. Don't reduce. */ | |||||
| siv gf_add_nr ( gf c, const gf a, const gf b ) { | |||||
| // FOR_LIMB_U(i, c->limb[i] = a->limb[i] + b->limb[i]); | |||||
| field_add_nr((field_t *)c, (const field_t *)a, (const field_t *)b); | |||||
| } | |||||
| /** Constant time, x = is_z ? z : y */ | /** Constant time, x = is_z ? z : y */ | ||||
| siv cond_sel(gf x, const gf y, const gf z, decaf_bool_t is_z) { | siv cond_sel(gf x, const gf y, const gf z, decaf_bool_t is_z) { | ||||
| constant_time_select(x,z,y,sizeof(gf),is_z); | constant_time_select(x,z,y,sizeof(gf),is_z); | ||||
| @@ -162,29 +114,11 @@ siv cond_swap(gf x, gf_s *__restrict__ y, decaf_bool_t swap) { | |||||
| }); | }); | ||||
| } | } | ||||
| /** | |||||
| * Mul by signed int. Not constant-time WRT the sign of that int. | |||||
| * Just uses a full mul (PERF) | |||||
| */ | |||||
| siv gf_mlw(gf c, const gf a, int w) { | |||||
| if (w>0) { | |||||
| field_mulw((field_t *)c, (const field_t *)a, w); | |||||
| } else { | |||||
| field_mulw((field_t *)c, (const field_t *)a, -w); | |||||
| gf_sub(c,ZERO,c); | |||||
| } | |||||
| } | |||||
| /** Canonicalize */ | |||||
| siv gf_canon ( gf a ) { | |||||
| field_strong_reduce((field_t *)a); | |||||
| } | |||||
| /** Compare a==b */ | /** Compare a==b */ | ||||
| static decaf_word_t __attribute__((noinline)) gf_eq(const gf a, const gf b) { | static decaf_word_t __attribute__((noinline)) gf_eq(const gf a, const gf b) { | ||||
| gf c; | gf c; | ||||
| gf_sub(c,a,b); | gf_sub(c,a,b); | ||||
| gf_canon(c); | |||||
| gf_strong_reduce(c); | |||||
| decaf_word_t ret=0; | decaf_word_t ret=0; | ||||
| FOR_LIMB(i, ret |= c->limb[i] ); | FOR_LIMB(i, ret |= c->limb[i] ); | ||||
| /* Hope the compiler is too dumb to optimize this, thus noinline */ | /* Hope the compiler is too dumb to optimize this, thus noinline */ | ||||
| @@ -194,7 +128,7 @@ static decaf_word_t __attribute__((noinline)) gf_eq(const gf a, const gf b) { | |||||
| /** Inverse square root using addition chain. */ | /** Inverse square root using addition chain. */ | ||||
| static decaf_bool_t gf_isqrt_chk(gf y, const gf x, decaf_bool_t allow_zero) { | static decaf_bool_t gf_isqrt_chk(gf y, const gf x, decaf_bool_t allow_zero) { | ||||
| gf tmp0, tmp1; | gf tmp0, tmp1; | ||||
| field_isr((field_t *)y, (const field_t *)x); | |||||
| gf_isr((gf_s *)y, (const gf_s *)x); | |||||
| gf_sqr(tmp0,y); | gf_sqr(tmp0,y); | ||||
| gf_mul(tmp1,tmp0,x); | gf_mul(tmp1,tmp0,x); | ||||
| return gf_eq(tmp1,ONE) | (allow_zero & gf_eq(tmp1,ZERO)); | return gf_eq(tmp1,ONE) | (allow_zero & gf_eq(tmp1,ZERO)); | ||||
| @@ -211,11 +145,24 @@ sv gf_invert(gf y, const gf x) { | |||||
| gf_cpy(y, t2); | gf_cpy(y, t2); | ||||
| } | } | ||||
| /** | |||||
| * Mul by signed int. Not constant-time WRT the sign of that int. | |||||
| * Just uses a full mul (PERF) | |||||
| */ | |||||
| static inline void gf_mulw_sgn(gf c, const gf a, int w) { | |||||
| if (w>0) { | |||||
| gf_mulw(c, a, w); | |||||
| } else { | |||||
| gf_mulw(c, a, -w); | |||||
| gf_sub(c,ZERO,c); | |||||
| } | |||||
| } | |||||
| /** Return high bit of x = low bit of 2x mod p */ | /** Return high bit of x = low bit of 2x mod p */ | ||||
| static decaf_word_t hibit(const gf x) { | static decaf_word_t hibit(const gf x) { | ||||
| gf y; | gf y; | ||||
| gf_add(y,x,x); | gf_add(y,x,x); | ||||
| gf_canon(y); | |||||
| gf_strong_reduce(y); | |||||
| return -(y->limb[0]&1); | return -(y->limb[0]&1); | ||||
| } | } | ||||
| @@ -223,7 +170,7 @@ static decaf_word_t hibit(const gf x) { | |||||
| static decaf_word_t lobit(const gf x) { | static decaf_word_t lobit(const gf x) { | ||||
| gf y; | gf y; | ||||
| gf_cpy(y,x); | gf_cpy(y,x); | ||||
| gf_canon(y); | |||||
| gf_strong_reduce(y); | |||||
| return -(y->limb[0]&1); | return -(y->limb[0]&1); | ||||
| } | } | ||||
| @@ -454,7 +401,7 @@ decaf_bool_t API_NS(scalar_eq) ( | |||||
| const point_t API_NS(point_identity) = {{{{{0}}},{{{1}}},{{{1}}},{{{0}}}}}; | const point_t API_NS(point_identity) = {{{{{0}}},{{{1}}},{{{1}}},{{{0}}}}}; | ||||
| static void gf_encode ( unsigned char ser[SER_BYTES], gf a ) { | static void gf_encode ( unsigned char ser[SER_BYTES], gf a ) { | ||||
| field_serialize(ser, (field_t *)a); | |||||
| gf_serialize(ser, (gf_s *)a); | |||||
| } | } | ||||
| extern const gf SQRT_MINUS_ONE, SQRT_ONE_MINUS_D; /* Intern this? */ | extern const gf SQRT_MINUS_ONE, SQRT_ONE_MINUS_D; /* Intern this? */ | ||||
| @@ -528,7 +475,7 @@ void API_NS(point_encode)( unsigned char ser[SER_BYTES], const point_t p ) { | |||||
| * Deserialize a bool, return TRUE if < p. | * Deserialize a bool, return TRUE if < p. | ||||
| */ | */ | ||||
| static decaf_bool_t gf_deser(gf s, const unsigned char ser[SER_BYTES]) { | static decaf_bool_t gf_deser(gf s, const unsigned char ser[SER_BYTES]) { | ||||
| return field_deserialize((field_t *)s, ser); | |||||
| return gf_deserialize((gf_s *)s, ser); | |||||
| } | } | ||||
| decaf_bool_t API_NS(point_decode) ( | decaf_bool_t API_NS(point_decode) ( | ||||
| @@ -544,7 +491,7 @@ decaf_bool_t API_NS(point_decode) ( | |||||
| gf_sub ( f, ONE, a ); /* f = 1-s^2 = 1-as^2 since a=1 */ | gf_sub ( f, ONE, a ); /* f = 1-s^2 = 1-as^2 since a=1 */ | ||||
| succ &= ~ gf_eq( f, ZERO ); | succ &= ~ gf_eq( f, ZERO ); | ||||
| gf_sqr ( b, f ); | gf_sqr ( b, f ); | ||||
| gf_mlw ( c, a, 4-4*EDWARDS_D ); | |||||
| gf_mulw_sgn ( c, a, 4-4*EDWARDS_D ); | |||||
| gf_add ( c, c, b ); /* t^2 */ | gf_add ( c, c, b ); /* t^2 */ | ||||
| gf_mul ( d, f, s ); /* s(1-s^2) for denoms */ | gf_mul ( d, f, s ); /* s(1-s^2) for denoms */ | ||||
| gf_sqr ( e, d ); | gf_sqr ( e, d ); | ||||
| @@ -596,7 +543,7 @@ void API_NS(point_sub) ( | |||||
| gf_add_nr ( b, q->y, q->x ); | gf_add_nr ( b, q->y, q->x ); | ||||
| gf_mul ( p->y, d, b ); | gf_mul ( p->y, d, b ); | ||||
| gf_mul ( b, r->t, q->t ); | gf_mul ( b, r->t, q->t ); | ||||
| gf_mlw ( p->x, b, -2*EDWARDS_D ); | |||||
| gf_mulw_sgn ( p->x, b, -2*EDWARDS_D ); | |||||
| gf_add_nr ( b, a, p->y ); | gf_add_nr ( b, a, p->y ); | ||||
| gf_sub_nr ( c, p->y, a ); | gf_sub_nr ( c, p->y, a ); | ||||
| gf_mul ( a, q->z, r->z ); | gf_mul ( a, q->z, r->z ); | ||||
| @@ -622,7 +569,7 @@ void API_NS(point_add) ( | |||||
| gf_add_nr ( b, q->y, q->x ); | gf_add_nr ( b, q->y, q->x ); | ||||
| gf_mul ( p->y, d, b ); | gf_mul ( p->y, d, b ); | ||||
| gf_mul ( b, r->t, q->t ); | gf_mul ( b, r->t, q->t ); | ||||
| gf_mlw ( p->x, b, -2*EDWARDS_D ); | |||||
| gf_mulw_sgn ( p->x, b, -2*EDWARDS_D ); | |||||
| gf_add_nr ( b, a, p->y ); | gf_add_nr ( b, a, p->y ); | ||||
| gf_sub_nr ( c, p->y, a ); | gf_sub_nr ( c, p->y, a ); | ||||
| gf_mul ( a, q->z, r->z ); | gf_mul ( a, q->z, r->z ); | ||||
| @@ -646,11 +593,11 @@ snv point_double_internal ( | |||||
| gf_add_nr ( d, c, a ); | gf_add_nr ( d, c, a ); | ||||
| gf_add_nr ( p->t, q->y, q->x ); | gf_add_nr ( p->t, q->y, q->x ); | ||||
| gf_sqr ( b, p->t ); | gf_sqr ( b, p->t ); | ||||
| gf_sub_nr_x ( b, b, d, 3 ); | |||||
| gf_subx_nr ( b, b, d, 3 ); | |||||
| gf_sub_nr ( p->t, a, c ); | gf_sub_nr ( p->t, a, c ); | ||||
| gf_sqr ( p->x, q->z ); | gf_sqr ( p->x, q->z ); | ||||
| gf_add_nr ( p->z, p->x, p->x ); | gf_add_nr ( p->z, p->x, p->x ); | ||||
| gf_sub_nr_x ( a, p->z, p->t, 4 ); | |||||
| gf_subx_nr ( a, p->z, p->t, 4 ); | |||||
| gf_mul ( p->x, a, b ); | gf_mul ( p->x, a, b ); | ||||
| gf_mul ( p->z, p->t, a ); | gf_mul ( p->z, p->t, a ); | ||||
| gf_mul ( p->y, p->t, d ); | gf_mul ( p->y, p->t, d ); | ||||
| @@ -777,7 +724,7 @@ static void pt_to_pniels ( | |||||
| ) { | ) { | ||||
| gf_sub ( b->n->a, a->y, a->x ); | gf_sub ( b->n->a, a->y, a->x ); | ||||
| gf_add ( b->n->b, a->x, a->y ); | gf_add ( b->n->b, a->x, a->y ); | ||||
| gf_mlw ( b->n->c, a->t, -2*EDWARDS_D ); | |||||
| gf_mulw_sgn ( b->n->c, a->t, -2*EDWARDS_D ); | |||||
| gf_add ( b->z, a->z, a->z ); | gf_add ( b->z, a->z, a->z ); | ||||
| } | } | ||||
| @@ -1047,12 +994,12 @@ void API_NS(point_from_hash_nonuniform) ( | |||||
| // TODO: simplify since we don't return a hint anymore | // TODO: simplify since we don't return a hint anymore | ||||
| gf r0,r,a,b,c,dee,D,N,rN,e; | gf r0,r,a,b,c,dee,D,N,rN,e; | ||||
| gf_deser(r0,ser); | gf_deser(r0,ser); | ||||
| gf_canon(r0); | |||||
| gf_strong_reduce(r0); | |||||
| gf_sqr(a,r0); | gf_sqr(a,r0); | ||||
| //gf_sub(r,ZERO,a); /*gf_mlw(r,a,QUADRATIC_NONRESIDUE);*/ | |||||
| //gf_sub(r,ZERO,a); /*gf_mulw_sgn(r,a,QUADRATIC_NONRESIDUE);*/ | |||||
| gf_mul(r,a,SQRT_MINUS_ONE); | gf_mul(r,a,SQRT_MINUS_ONE); | ||||
| gf_mlw(dee,ONE,EDWARDS_D); | |||||
| gf_mlw(c,r,EDWARDS_D); | |||||
| gf_mulw_sgn(dee,ONE,EDWARDS_D); | |||||
| gf_mulw_sgn(c,r,EDWARDS_D); | |||||
| /* Compute D := (dr+a-d)(dr-ar-d) with a=1 */ | /* Compute D := (dr+a-d)(dr-ar-d) with a=1 */ | ||||
| gf_sub(a,c,dee); | gf_sub(a,c,dee); | ||||
| @@ -1064,7 +1011,7 @@ void API_NS(point_from_hash_nonuniform) ( | |||||
| /* compute N := (r+1)(a-2d) */ | /* compute N := (r+1)(a-2d) */ | ||||
| gf_add(a,r,ONE); | gf_add(a,r,ONE); | ||||
| gf_mlw(N,a,1-2*EDWARDS_D); | |||||
| gf_mulw_sgn(N,a,1-2*EDWARDS_D); | |||||
| /* e = +-1/sqrt(+-ND) */ | /* e = +-1/sqrt(+-ND) */ | ||||
| gf_mul(rN,r,N); | gf_mul(rN,r,N); | ||||
| @@ -1078,8 +1025,8 @@ void API_NS(point_from_hash_nonuniform) ( | |||||
| /* b <- t/s */ | /* b <- t/s */ | ||||
| cond_sel(c,r0,r,square); /* r? = sqr ? r : 1 */ | cond_sel(c,r0,r,square); /* r? = sqr ? r : 1 */ | ||||
| /* In two steps to avoid overflow on 32-bit arch */ | /* In two steps to avoid overflow on 32-bit arch */ | ||||
| gf_mlw(a,c,1-2*EDWARDS_D); | |||||
| gf_mlw(b,a,1-2*EDWARDS_D); | |||||
| gf_mulw_sgn(a,c,1-2*EDWARDS_D); | |||||
| gf_mulw_sgn(b,a,1-2*EDWARDS_D); | |||||
| gf_sub(c,r,ONE); | gf_sub(c,r,ONE); | ||||
| gf_mul(a,b,c); /* = r? * (r-1) * (a-2d)^2 with a=1 */ | gf_mul(a,b,c); /* = r? * (r-1) * (a-2d)^2 with a=1 */ | ||||
| gf_mul(b,a,e); | gf_mul(b,a,e); | ||||
| @@ -1148,7 +1095,7 @@ API_NS(invert_elligator_nonuniform) ( | |||||
| cond_sel(b,b,ZERO,is_identity & ~sgn_t_over_s & ~sgn_s); /* identity adjust */ | cond_sel(b,b,ZERO,is_identity & ~sgn_t_over_s & ~sgn_s); /* identity adjust */ | ||||
| } | } | ||||
| gf_mlw(d,c,2*EDWARDS_D-1); /* $d = (2d-a)s^2 */ | |||||
| gf_mulw_sgn(d,c,2*EDWARDS_D-1); /* $d = (2d-a)s^2 */ | |||||
| gf_add(a,d,b); /* num? */ | gf_add(a,d,b); /* num? */ | ||||
| gf_sub(d,d,b); /* den? */ | gf_sub(d,d,b); /* den? */ | ||||
| gf_mul(b,a,d); /* n*d */ | gf_mul(b,a,d); /* n*d */ | ||||
| @@ -1199,7 +1146,7 @@ decaf_bool_t API_NS(point_valid) ( | |||||
| gf_sqr(b,p->y); | gf_sqr(b,p->y); | ||||
| gf_sub(a,b,a); | gf_sub(a,b,a); | ||||
| gf_sqr(b,p->t); | gf_sqr(b,p->t); | ||||
| gf_mlw(c,b,-EDWARDS_D); | |||||
| gf_mulw_sgn(c,b,-EDWARDS_D); | |||||
| gf_sqr(b,p->z); | gf_sqr(b,p->z); | ||||
| gf_add(b,b,c); | gf_add(b,b,c); | ||||
| out &= gf_eq(a,b); | out &= gf_eq(a,b); | ||||
| @@ -1281,15 +1228,15 @@ static void batch_normalize_niels ( | |||||
| for (i=0; i<n; i++) { | for (i=0; i<n; i++) { | ||||
| gf_mul(product, table[i]->a, zis[i]); | gf_mul(product, table[i]->a, zis[i]); | ||||
| gf_canon(product); | |||||
| gf_strong_reduce(product); | |||||
| gf_cpy(table[i]->a, product); | gf_cpy(table[i]->a, product); | ||||
| gf_mul(product, table[i]->b, zis[i]); | gf_mul(product, table[i]->b, zis[i]); | ||||
| gf_canon(product); | |||||
| gf_strong_reduce(product); | |||||
| gf_cpy(table[i]->b, product); | gf_cpy(table[i]->b, product); | ||||
| gf_mul(product, table[i]->c, zis[i]); | gf_mul(product, table[i]->c, zis[i]); | ||||
| gf_canon(product); | |||||
| gf_strong_reduce(product); | |||||
| gf_cpy(table[i]->c, product); | gf_cpy(table[i]->c, product); | ||||
| } | } | ||||
| } | } | ||||
| @@ -1510,7 +1457,7 @@ sv prepare_wnaf_table( | |||||
| } | } | ||||
| } | } | ||||
| extern const field_t API_NS(precomputed_wnaf_as_fe)[]; | |||||
| extern const gf API_NS(precomputed_wnaf_as_fe)[]; | |||||
| static const niels_t *API_NS(wnaf_base) = (const niels_t *)API_NS(precomputed_wnaf_as_fe); | static const niels_t *API_NS(wnaf_base) = (const niels_t *)API_NS(precomputed_wnaf_as_fe); | ||||
| const size_t API_NS2(sizeof,precomputed_wnafs) __attribute((visibility("hidden"))) | const size_t API_NS2(sizeof,precomputed_wnafs) __attribute((visibility("hidden"))) | ||||
| = sizeof(niels_t)<<DECAF_WNAF_FIXED_TABLE_BITS; | = sizeof(niels_t)<<DECAF_WNAF_FIXED_TABLE_BITS; | ||||
| @@ -19,7 +19,7 @@ | |||||
| #define API_NS2(_pref,_id) _pref##_decaf_255_##_id | #define API_NS2(_pref,_id) _pref##_decaf_255_##_id | ||||
| /* To satisfy linker. */ | /* To satisfy linker. */ | ||||
| const field_t API_NS(precomputed_base_as_fe)[1]; | |||||
| const gf API_NS(precomputed_base_as_fe)[1]; | |||||
| const API_NS(scalar_t) API_NS(precomputed_scalarmul_adjustment); | const API_NS(scalar_t) API_NS(precomputed_scalarmul_adjustment); | ||||
| const API_NS(scalar_t) API_NS(point_scalarmul_adjustment); | const API_NS(scalar_t) API_NS(point_scalarmul_adjustment); | ||||
| const API_NS(scalar_t) sc_r2 = {{{0}}}; | const API_NS(scalar_t) sc_r2 = {{{0}}}; | ||||
| @@ -29,7 +29,7 @@ const unsigned char base_point_ser_for_pregen[DECAF_255_SER_BYTES]; | |||||
| const API_NS(point_t) API_NS(point_base); | const API_NS(point_t) API_NS(point_base); | ||||
| struct niels_s; | struct niels_s; | ||||
| const field_t *API_NS(precomputed_wnaf_as_fe); | |||||
| const gf_s *API_NS(precomputed_wnaf_as_fe); | |||||
| extern const size_t API_NS2(sizeof,precomputed_wnafs); | extern const size_t API_NS2(sizeof,precomputed_wnafs); | ||||
| void API_NS(precompute_wnafs) ( | void API_NS(precompute_wnafs) ( | ||||
| @@ -48,26 +48,26 @@ static void scalar_print(const char *name, const API_NS(scalar_t) sc) { | |||||
| printf("}}};\n\n"); | printf("}}};\n\n"); | ||||
| } | } | ||||
| static void field_print(const field_t *f) { | |||||
| const int FIELD_SER_BYTES = (FIELD_BITS + 7) / 8; | |||||
| unsigned char ser[FIELD_SER_BYTES]; | |||||
| field_serialize(ser,f); | |||||
| static void field_print(const gf f) { | |||||
| const int GF_SER_BYTES = (GF_BITS + 7) / 8; | |||||
| unsigned char ser[GF_SER_BYTES]; | |||||
| gf_serialize(ser,f); | |||||
| int b=0, i, comma=0; | int b=0, i, comma=0; | ||||
| unsigned long long limb = 0; | unsigned long long limb = 0; | ||||
| printf("FIELD_LITERAL("); | |||||
| for (i=0; i<FIELD_SER_BYTES; i++) { | |||||
| printf("{FIELD_LITERAL("); | |||||
| for (i=0; i<GF_SER_BYTES; i++) { | |||||
| limb |= ((uint64_t)ser[i])<<b; | limb |= ((uint64_t)ser[i])<<b; | ||||
| b += 8; | b += 8; | ||||
| if (b >= FIELD_LIT_LIMB_BITS) { | |||||
| limb &= (1ull<<FIELD_LIT_LIMB_BITS) -1; | |||||
| b -= FIELD_LIT_LIMB_BITS; | |||||
| if (b >= GF_LIT_LIMB_BITS) { | |||||
| limb &= (1ull<<GF_LIT_LIMB_BITS) -1; | |||||
| b -= GF_LIT_LIMB_BITS; | |||||
| if (comma) printf(","); | if (comma) printf(","); | ||||
| comma = 1; | comma = 1; | ||||
| printf("0x%016llx", limb); | printf("0x%016llx", limb); | ||||
| limb = ((uint64_t)ser[i])>>(8-b); | limb = ((uint64_t)ser[i])>>(8-b); | ||||
| } | } | ||||
| } | } | ||||
| printf(")"); | |||||
| printf(")}"); | |||||
| assert(b<8); | assert(b<8); | ||||
| } | } | ||||
| @@ -88,41 +88,39 @@ int main(int argc, char **argv) { | |||||
| if (ret || !preWnaf) return 1; | if (ret || !preWnaf) return 1; | ||||
| API_NS(precompute_wnafs)(preWnaf, real_point_base); | API_NS(precompute_wnafs)(preWnaf, real_point_base); | ||||
| const field_t *output; | |||||
| const gf_s *output; | |||||
| unsigned i; | unsigned i; | ||||
| printf("/** @warning: this file was automatically generated. */\n"); | printf("/** @warning: this file was automatically generated. */\n"); | ||||
| printf("#include <decaf.h>\n\n"); | |||||
| printf("#include \"field.h\"\n\n"); | printf("#include \"field.h\"\n\n"); | ||||
| printf("#include \"decaf.h\"\n\n"); | |||||
| printf("#define API_NS(_id) decaf_255_##_id\n"); | printf("#define API_NS(_id) decaf_255_##_id\n"); | ||||
| printf("#define API_NS2(_pref,_id) _pref##_decaf_255_##_id\n"); | printf("#define API_NS2(_pref,_id) _pref##_decaf_255_##_id\n"); | ||||
| output = (const field_t *)real_point_base; | |||||
| output = (const gf_s *)real_point_base; | |||||
| printf("const API_NS(point_t) API_NS(point_base) = {{\n"); | printf("const API_NS(point_t) API_NS(point_base) = {{\n"); | ||||
| for (i=0; i < sizeof(API_NS(point_t)); i+=sizeof(field_t)) { | |||||
| for (i=0; i < sizeof(API_NS(point_t)); i+=sizeof(gf)) { | |||||
| if (i) printf(",\n "); | if (i) printf(",\n "); | ||||
| printf("{"); | |||||
| field_print(output++); | field_print(output++); | ||||
| printf("}"); | |||||
| } | } | ||||
| printf("\n}};\n"); | printf("\n}};\n"); | ||||
| output = (const field_t *)pre; | |||||
| printf("const field_t API_NS(precomputed_base_as_fe)[%d]\n", | |||||
| (int)(API_NS2(sizeof,precomputed_s) / sizeof(field_t))); | |||||
| output = (const gf_s *)pre; | |||||
| printf("const gf API_NS(precomputed_base_as_fe)[%d]\n", | |||||
| (int)(API_NS2(sizeof,precomputed_s) / sizeof(gf))); | |||||
| printf("__attribute__((aligned(%d),visibility(\"hidden\"))) = {\n ", (int)API_NS2(alignof,precomputed_s)); | printf("__attribute__((aligned(%d),visibility(\"hidden\"))) = {\n ", (int)API_NS2(alignof,precomputed_s)); | ||||
| for (i=0; i < API_NS2(sizeof,precomputed_s); i+=sizeof(field_t)) { | |||||
| for (i=0; i < API_NS2(sizeof,precomputed_s); i+=sizeof(gf)) { | |||||
| if (i) printf(",\n "); | if (i) printf(",\n "); | ||||
| field_print(output++); | field_print(output++); | ||||
| } | } | ||||
| printf("\n};\n"); | printf("\n};\n"); | ||||
| output = (const field_t *)preWnaf; | |||||
| printf("const field_t API_NS(precomputed_wnaf_as_fe)[%d]\n", | |||||
| (int)(API_NS2(sizeof,precomputed_wnafs) / sizeof(field_t))); | |||||
| output = (const gf_s *)preWnaf; | |||||
| printf("const gf API_NS(precomputed_wnaf_as_fe)[%d]\n", | |||||
| (int)(API_NS2(sizeof,precomputed_wnafs) / sizeof(gf))); | |||||
| printf("__attribute__((aligned(%d),visibility(\"hidden\"))) = {\n ", (int)API_NS2(alignof,precomputed_s)); | printf("__attribute__((aligned(%d),visibility(\"hidden\"))) = {\n ", (int)API_NS2(alignof,precomputed_s)); | ||||
| for (i=0; i < API_NS2(sizeof,precomputed_wnafs); i+=sizeof(field_t)) { | |||||
| for (i=0; i < API_NS2(sizeof,precomputed_wnafs); i+=sizeof(gf)) { | |||||
| if (i) printf(",\n "); | if (i) printf(",\n "); | ||||
| field_print(output++); | field_print(output++); | ||||
| } | } | ||||
| @@ -1,23 +1,20 @@ | |||||
| /** | /** | ||||
| * @file field.h | * @file field.h | ||||
| * @brief Generic field header. | |||||
| * @brief Generic gf header. | |||||
| * @copyright | * @copyright | ||||
| * Copyright (c) 2014 Cryptography Research, Inc. \n | * Copyright (c) 2014 Cryptography Research, Inc. \n | ||||
| * Released under the MIT License. See LICENSE.txt for license information. | * Released under the MIT License. See LICENSE.txt for license information. | ||||
| * @author Mike Hamburg | * @author Mike Hamburg | ||||
| */ | */ | ||||
| #ifndef __FIELD_H__ | |||||
| #define __FIELD_H__ | |||||
| #ifndef __GF_H__ | |||||
| #define __GF_H__ | |||||
| #include "constant_time.h" | #include "constant_time.h" | ||||
| #include "f_field.h" | #include "f_field.h" | ||||
| #include <string.h> | #include <string.h> | ||||
| typedef struct field_t field_a_t[1]; | |||||
| #define field_a_restrict_t struct field_t *__restrict__ | |||||
| #define is32 (GOLDI_BITS == 32 || FIELD_BITS != 448) | |||||
| #define is32 (GOLDI_BITS == 32 || GF_BITS != 448) | |||||
| #if (is32) | #if (is32) | ||||
| #define IF32(s) (s) | #define IF32(s) (s) | ||||
| #else | #else | ||||
| @@ -33,9 +30,9 @@ typedef struct field_t field_a_t[1]; | |||||
| * If x=0, returns 0. | * If x=0, returns 0. | ||||
| */ | */ | ||||
| void | void | ||||
| field_isr ( | |||||
| field_a_t a, | |||||
| const field_a_t x | |||||
| gf_isr ( | |||||
| gf a, | |||||
| const gf x | |||||
| ); | ); | ||||
| /** | /** | ||||
| @@ -43,62 +40,75 @@ field_isr ( | |||||
| */ | */ | ||||
| static __inline__ void | static __inline__ void | ||||
| __attribute__((unused,always_inline)) | __attribute__((unused,always_inline)) | ||||
| field_sqrn ( | |||||
| field_a_restrict_t y, | |||||
| const field_a_t x, | |||||
| gf_sqrn ( | |||||
| gf_s *__restrict__ y, | |||||
| const gf x, | |||||
| int n | int n | ||||
| ) { | ) { | ||||
| field_a_t tmp; | |||||
| gf tmp; | |||||
| assert(n>0); | assert(n>0); | ||||
| if (n&1) { | if (n&1) { | ||||
| field_sqr(y,x); | |||||
| gf_sqr(y,x); | |||||
| n--; | n--; | ||||
| } else { | } else { | ||||
| field_sqr(tmp,x); | |||||
| field_sqr(y,tmp); | |||||
| gf_sqr(tmp,x); | |||||
| gf_sqr(y,tmp); | |||||
| n-=2; | n-=2; | ||||
| } | } | ||||
| for (; n; n-=2) { | for (; n; n-=2) { | ||||
| field_sqr(tmp,y); | |||||
| field_sqr(y,tmp); | |||||
| gf_sqr(tmp,y); | |||||
| gf_sqr(y,tmp); | |||||
| } | } | ||||
| } | } | ||||
| static __inline__ void | static __inline__ void | ||||
| field_subx_RAW ( | |||||
| field_a_t d, | |||||
| const field_a_t a, | |||||
| const field_a_t b | |||||
| gf_subx_RAW ( | |||||
| gf d, | |||||
| const gf a, | |||||
| const gf b | |||||
| ) { | ) { | ||||
| field_sub_RAW ( d, a, b ); | |||||
| field_bias( d, 2 ); | |||||
| IF32( field_weak_reduce ( d ) ); | |||||
| gf_sub_RAW ( d, a, b ); | |||||
| gf_bias( d, 2 ); | |||||
| IF32( gf_weak_reduce ( d ) ); | |||||
| } | } | ||||
| static __inline__ void | static __inline__ void | ||||
| field_sub ( | |||||
| field_a_t d, | |||||
| const field_a_t a, | |||||
| const field_a_t b | |||||
| gf_sub ( | |||||
| gf d, | |||||
| const gf a, | |||||
| const gf b | |||||
| ) { | ) { | ||||
| field_sub_RAW ( d, a, b ); | |||||
| field_bias( d, 2 ); | |||||
| field_weak_reduce ( d ); | |||||
| gf_sub_RAW ( d, a, b ); | |||||
| gf_bias( d, 2 ); | |||||
| gf_weak_reduce ( d ); | |||||
| } | } | ||||
| static __inline__ void | static __inline__ void | ||||
| field_add ( | |||||
| field_a_t d, | |||||
| const field_a_t a, | |||||
| const field_a_t b | |||||
| gf_add ( | |||||
| gf d, | |||||
| const gf a, | |||||
| const gf b | |||||
| ) { | ) { | ||||
| field_add_RAW ( d, a, b ); | |||||
| field_weak_reduce ( d ); | |||||
| gf_add_RAW ( d, a, b ); | |||||
| gf_weak_reduce ( d ); | |||||
| } | |||||
| #define gf_add_nr gf_add_RAW | |||||
| /** Subtract mod p. Bias by 2 and don't reduce */ | |||||
| static inline void gf_sub_nr ( gf c, const gf a, const gf b ) { | |||||
| // FOR_LIMB_U(i, c->limb[i] = a->limb[i] - b->limb[i] + 2*P->limb[i] ); | |||||
| gf_sub_RAW(c,a,b); | |||||
| gf_bias(c, 2); | |||||
| if (DECAF_WORD_BITS==32) gf_weak_reduce(c); // HACK | |||||
| } | |||||
| /** Subtract mod p. Bias by amt but don't reduce. */ | |||||
| static inline void gf_subx_nr ( gf c, const gf a, const gf b, int amt ) { | |||||
| gf_sub_RAW(c,a,b); | |||||
| gf_bias(c, amt); | |||||
| if (DECAF_WORD_BITS==32) gf_weak_reduce(c); // HACK | |||||
| } | } | ||||
| /* FIXME: no warnings on RAW routines */ | |||||
| #define field_add_nr field_add_RAW | |||||
| #define field_sub_nr field_sub_RAW | |||||
| #define field_subx_nr field_subx_RAW | |||||
| #endif // __FIELD_H__ | |||||
| #endif // __GF_H__ | |||||
| @@ -17,10 +17,10 @@ static __inline__ uint64_t is_zero(uint64_t a) { | |||||
| } | } | ||||
| void | void | ||||
| p255_mul ( | |||||
| p255_t *__restrict__ cs, | |||||
| const p255_t *as, | |||||
| const p255_t *bs | |||||
| gf_25519_mul ( | |||||
| gf_25519_t __restrict__ cs, | |||||
| const gf_25519_t as, | |||||
| const gf_25519_t bs | |||||
| ) { | ) { | ||||
| const uint64_t *a = as->limb, *b = bs->limb, mask = ((1ull<<51)-1); | const uint64_t *a = as->limb, *b = bs->limb, mask = ((1ull<<51)-1); | ||||
| @@ -52,9 +52,9 @@ p255_mul ( | |||||
| } | } | ||||
| void | void | ||||
| p255_mulw ( | |||||
| p255_t *__restrict__ cs, | |||||
| const p255_t *as, | |||||
| gf_25519_mulw ( | |||||
| gf_25519_t __restrict__ cs, | |||||
| const gf_25519_t as, | |||||
| uint64_t b | uint64_t b | ||||
| ) { | ) { | ||||
| const uint64_t *a = as->limb, mask = ((1ull<<51)-1); | const uint64_t *a = as->limb, mask = ((1ull<<51)-1); | ||||
| @@ -79,16 +79,16 @@ p255_mulw ( | |||||
| } | } | ||||
| void | void | ||||
| p255_sqr ( | |||||
| p255_t *__restrict__ cs, | |||||
| const p255_t *as | |||||
| gf_25519_t qr ( | |||||
| gf_25519_t __restrict__ cs, | |||||
| const gf_25519_t as | |||||
| ) { | ) { | ||||
| p255_mul(cs,as,as); // TODO | |||||
| gf_25519_mul(cs,as,as); // TODO | |||||
| } | } | ||||
| void | void | ||||
| p255_strong_reduce ( | |||||
| p255_t *a | |||||
| gf_25519_t trong_reduce ( | |||||
| gf_25519_t a | |||||
| ) { | ) { | ||||
| uint64_t mask = (1ull<<51)-1; | uint64_t mask = (1ull<<51)-1; | ||||
| @@ -128,14 +128,14 @@ p255_strong_reduce ( | |||||
| } | } | ||||
| void | void | ||||
| p255_serialize ( | |||||
| gf_25519_t erialize ( | |||||
| uint8_t serial[32], | uint8_t serial[32], | ||||
| const struct p255_t *x | |||||
| const struct gf_25519_t x | |||||
| ) { | ) { | ||||
| int i,j; | int i,j; | ||||
| p255_t red; | |||||
| p255_copy(&red, x); | |||||
| p255_strong_reduce(&red); | |||||
| gf_25519_t red; | |||||
| gf_25519_copy(&red, x); | |||||
| gf_25519_t trong_reduce(&red); | |||||
| uint64_t *r = red.limb; | uint64_t *r = red.limb; | ||||
| uint64_t ser64[4] = {r[0] | r[1]<<51, r[1]>>13|r[2]<<38, r[2]>>26|r[3]<<25, r[3]>>39|r[4]<<12}; | uint64_t ser64[4] = {r[0] | r[1]<<51, r[1]>>13|r[2]<<38, r[2]>>26|r[3]<<25, r[3]>>39|r[4]<<12}; | ||||
| for (i=0; i<4; i++) { | for (i=0; i<4; i++) { | ||||
| @@ -147,8 +147,8 @@ p255_serialize ( | |||||
| } | } | ||||
| mask_t | mask_t | ||||
| p255_deserialize ( | |||||
| p255_t *x, | |||||
| gf_25519_deserialize ( | |||||
| gf_25519_t x, | |||||
| const uint8_t serial[32] | const uint8_t serial[32] | ||||
| ) { | ) { | ||||
| int i,j; | int i,j; | ||||
| @@ -1,8 +1,8 @@ | |||||
| /* Copyright (c) 2014 Cryptography Research, Inc. | /* Copyright (c) 2014 Cryptography Research, Inc. | ||||
| * Released under the MIT License. See LICENSE.txt for license information. | * Released under the MIT License. See LICENSE.txt for license information. | ||||
| */ | */ | ||||
| #ifndef __P255_H__ | |||||
| #define __P255_H__ 1 | |||||
| #ifndef __P25519_H__ | |||||
| #define __P25519_H__ 1 | |||||
| #include <stdint.h> | #include <stdint.h> | ||||
| #include <assert.h> | #include <assert.h> | ||||
| @@ -10,9 +10,9 @@ | |||||
| #include "word.h" | #include "word.h" | ||||
| typedef struct p255_t { | |||||
| typedef struct gf_25519_s { | |||||
| uint64_t limb[5]; | uint64_t limb[5]; | ||||
| } p255_t; | |||||
| } gf_25519_s, gf_25519_t[1]; | |||||
| #define LBITS 51 | #define LBITS 51 | ||||
| #define FIELD_LITERAL(a,b,c,d,e) {{ a,b,c,d,e }} | #define FIELD_LITERAL(a,b,c,d,e) {{ a,b,c,d,e }} | ||||
| @@ -32,113 +32,113 @@ extern "C" { | |||||
| #endif | #endif | ||||
| static __inline__ void | static __inline__ void | ||||
| p255_add_RAW ( | |||||
| p255_t *out, | |||||
| const p255_t *a, | |||||
| const p255_t *b | |||||
| gf_25519_add_RAW ( | |||||
| gf_25519_t out, | |||||
| const gf_25519_t a, | |||||
| const gf_25519_t b | |||||
| ) __attribute__((unused)); | ) __attribute__((unused)); | ||||
| static __inline__ void | static __inline__ void | ||||
| p255_sub_RAW ( | |||||
| p255_t *out, | |||||
| const p255_t *a, | |||||
| const p255_t *b | |||||
| gf_25519_sub_RAW ( | |||||
| gf_25519_t out, | |||||
| const gf_25519_t a, | |||||
| const gf_25519_t b | |||||
| ) __attribute__((unused)); | ) __attribute__((unused)); | ||||
| static __inline__ void | static __inline__ void | ||||
| p255_copy ( | |||||
| p255_t *out, | |||||
| const p255_t *a | |||||
| gf_25519_copy ( | |||||
| gf_25519_t out, | |||||
| const gf_25519_t a | |||||
| ) __attribute__((unused)); | ) __attribute__((unused)); | ||||
| static __inline__ void | static __inline__ void | ||||
| p255_weak_reduce ( | |||||
| p255_t *inout | |||||
| gf_25519_weak_reduce ( | |||||
| gf_25519_t inout | |||||
| ) __attribute__((unused)); | ) __attribute__((unused)); | ||||
| void | void | ||||
| p255_strong_reduce ( | |||||
| p255_t *inout | |||||
| gf_25519_strong_reduce ( | |||||
| gf_25519_t inout | |||||
| ); | ); | ||||
| static __inline__ void | static __inline__ void | ||||
| p255_bias ( | |||||
| p255_t *inout, | |||||
| gf_25519_bias ( | |||||
| gf_25519_t inout, | |||||
| int amount | int amount | ||||
| ) __attribute__((unused)); | ) __attribute__((unused)); | ||||
| void | void | ||||
| p255_mul ( | |||||
| p255_t *__restrict__ out, | |||||
| const p255_t *a, | |||||
| const p255_t *b | |||||
| gf_25519_mul ( | |||||
| gf_25519_s *__restrict__ out, | |||||
| const gf_25519_t a, | |||||
| const gf_25519_t b | |||||
| ); | ); | ||||
| void | void | ||||
| p255_mulw ( | |||||
| p255_t *__restrict__ out, | |||||
| const p255_t *a, | |||||
| gf_25519_mulw ( | |||||
| gf_25519_s *__restrict__ out, | |||||
| const gf_25519_t a, | |||||
| uint64_t b | uint64_t b | ||||
| ); | ); | ||||
| void | void | ||||
| p255_sqr ( | |||||
| p255_t *__restrict__ out, | |||||
| const p255_t *a | |||||
| gf_25519_sqr ( | |||||
| gf_25519_s *__restrict__ out, | |||||
| const gf_25519_t a | |||||
| ); | ); | ||||
| void | void | ||||
| p255_serialize ( | |||||
| gf_25519_serialize ( | |||||
| uint8_t serial[32], | uint8_t serial[32], | ||||
| const struct p255_t *x | |||||
| const gf_25519_t x | |||||
| ); | ); | ||||
| mask_t | mask_t | ||||
| p255_deserialize ( | |||||
| p255_t *x, | |||||
| gf_25519_deserialize ( | |||||
| gf_25519_t x, | |||||
| const uint8_t serial[32] | const uint8_t serial[32] | ||||
| ); | ); | ||||
| /* -------------- Inline functions begin here -------------- */ | /* -------------- Inline functions begin here -------------- */ | ||||
| void | void | ||||
| p255_add_RAW ( | |||||
| p255_t *out, | |||||
| const p255_t *a, | |||||
| const p255_t *b | |||||
| gf_25519_add_RAW ( | |||||
| gf_25519_t out, | |||||
| const gf_25519_t a, | |||||
| const gf_25519_t b | |||||
| ) { | ) { | ||||
| unsigned int i; | unsigned int i; | ||||
| for (i=0; i<5; i++) { | for (i=0; i<5; i++) { | ||||
| out->limb[i] = a->limb[i] + b->limb[i]; | out->limb[i] = a->limb[i] + b->limb[i]; | ||||
| } | } | ||||
| p255_weak_reduce(out); | |||||
| gf_25519_weak_reduce(out); | |||||
| } | } | ||||
| void | void | ||||
| p255_sub_RAW ( | |||||
| p255_t *out, | |||||
| const p255_t *a, | |||||
| const p255_t *b | |||||
| gf_25519_sub_RAW ( | |||||
| gf_25519_t out, | |||||
| const gf_25519_t a, | |||||
| const gf_25519_t b | |||||
| ) { | ) { | ||||
| unsigned int i; | unsigned int i; | ||||
| uint64_t co1 = ((1ull<<51)-1)*2, co2 = co1-36; | uint64_t co1 = ((1ull<<51)-1)*2, co2 = co1-36; | ||||
| for (i=0; i<5; i++) { | for (i=0; i<5; i++) { | ||||
| out->limb[i] = a->limb[i] - b->limb[i] + ((i==0) ? co2 : co1); | out->limb[i] = a->limb[i] - b->limb[i] + ((i==0) ? co2 : co1); | ||||
| } | } | ||||
| p255_weak_reduce(out); | |||||
| gf_25519_weak_reduce(out); | |||||
| } | } | ||||
| void | void | ||||
| p255_copy ( | |||||
| p255_t *out, | |||||
| const p255_t *a | |||||
| gf_25519_copy ( | |||||
| gf_25519_t out, | |||||
| const gf_25519_t a | |||||
| ) { | ) { | ||||
| memcpy(out,a,sizeof(*a)); | memcpy(out,a,sizeof(*a)); | ||||
| } | } | ||||
| void | void | ||||
| p255_bias ( | |||||
| p255_t *a, | |||||
| gf_25519_bias ( | |||||
| gf_25519_t a, | |||||
| int amt | int amt | ||||
| ) { | ) { | ||||
| (void) a; | (void) a; | ||||
| @@ -146,8 +146,8 @@ p255_bias ( | |||||
| } | } | ||||
| void | void | ||||
| p255_weak_reduce ( | |||||
| p255_t *a | |||||
| gf_25519_weak_reduce ( | |||||
| gf_25519_t a | |||||
| ) { | ) { | ||||
| uint64_t mask = (1ull<<51) - 1; | uint64_t mask = (1ull<<51) - 1; | ||||
| uint64_t tmp = a->limb[4] >> 51; | uint64_t tmp = a->limb[4] >> 51; | ||||
| @@ -162,4 +162,4 @@ p255_weak_reduce ( | |||||
| }; /* extern "C" */ | }; /* extern "C" */ | ||||
| #endif | #endif | ||||
| #endif /* __P255_H__ */ | |||||
| #endif /* __P25519_H__ */ | |||||
| @@ -10,10 +10,10 @@ static inline uint64_t shr(__uint128_t x, int n) { | |||||
| } | } | ||||
| void | void | ||||
| p255_mul ( | |||||
| p255_t *__restrict__ cs, | |||||
| const p255_t *as, | |||||
| const p255_t *bs | |||||
| gf_25519_mul ( | |||||
| gf_25519_s *__restrict__ cs, | |||||
| const gf_25519_t as, | |||||
| const gf_25519_t bs | |||||
| ) { | ) { | ||||
| const uint64_t *a = as->limb, *b = bs->limb, mask = ((1ull<<51)-1); | const uint64_t *a = as->limb, *b = bs->limb, mask = ((1ull<<51)-1); | ||||
| uint64_t *c = cs->limb; | uint64_t *c = cs->limb; | ||||
| @@ -92,9 +92,9 @@ p255_mul ( | |||||
| } | } | ||||
| void | void | ||||
| p255_sqr ( | |||||
| p255_t *__restrict__ cs, | |||||
| const p255_t *as | |||||
| gf_25519_sqr ( | |||||
| gf_25519_s *__restrict__ cs, | |||||
| const gf_25519_t as | |||||
| ) { | ) { | ||||
| const uint64_t *a = as->limb, mask = ((1ull<<51)-1); | const uint64_t *a = as->limb, mask = ((1ull<<51)-1); | ||||
| uint64_t *c = cs->limb; | uint64_t *c = cs->limb; | ||||
| @@ -156,9 +156,9 @@ p255_sqr ( | |||||
| } | } | ||||
| void | void | ||||
| p255_mulw ( | |||||
| p255_t *__restrict__ cs, | |||||
| const p255_t *as, | |||||
| gf_25519_mulw ( | |||||
| gf_25519_s *__restrict__ cs, | |||||
| const gf_25519_t as, | |||||
| uint64_t b | uint64_t b | ||||
| ) { | ) { | ||||
| const uint64_t *a = as->limb, mask = ((1ull<<51)-1); | const uint64_t *a = as->limb, mask = ((1ull<<51)-1); | ||||
| @@ -191,8 +191,8 @@ p255_mulw ( | |||||
| } | } | ||||
| void | void | ||||
| p255_strong_reduce ( | |||||
| p255_t *a | |||||
| gf_25519_strong_reduce ( | |||||
| gf_25519_t a | |||||
| ) { | ) { | ||||
| uint64_t mask = (1ull<<51)-1; | uint64_t mask = (1ull<<51)-1; | ||||
| @@ -232,15 +232,15 @@ p255_strong_reduce ( | |||||
| } | } | ||||
| void | void | ||||
| p255_serialize ( | |||||
| gf_25519_serialize ( | |||||
| uint8_t serial[32], | uint8_t serial[32], | ||||
| const struct p255_t *x | |||||
| const gf_25519_t x | |||||
| ) { | ) { | ||||
| int i,j; | int i,j; | ||||
| p255_t red; | |||||
| p255_copy(&red, x); | |||||
| p255_strong_reduce(&red); | |||||
| uint64_t *r = red.limb; | |||||
| gf_25519_t red; | |||||
| gf_25519_copy(red, x); | |||||
| gf_25519_strong_reduce(red); | |||||
| uint64_t *r = red->limb; | |||||
| uint64_t ser64[4] = {r[0] | r[1]<<51, r[1]>>13|r[2]<<38, r[2]>>26|r[3]<<25, r[3]>>39|r[4]<<12}; | uint64_t ser64[4] = {r[0] | r[1]<<51, r[1]>>13|r[2]<<38, r[2]>>26|r[3]<<25, r[3]>>39|r[4]<<12}; | ||||
| for (i=0; i<4; i++) { | for (i=0; i<4; i++) { | ||||
| for (j=0; j<8; j++) { | for (j=0; j<8; j++) { | ||||
| @@ -251,8 +251,8 @@ p255_serialize ( | |||||
| } | } | ||||
| mask_t | mask_t | ||||
| p255_deserialize ( | |||||
| p255_t *x, | |||||
| gf_25519_deserialize ( | |||||
| gf_25519_t x, | |||||
| const uint8_t serial[32] | const uint8_t serial[32] | ||||
| ) { | ) { | ||||
| int i,j; | int i,j; | ||||
| @@ -1,8 +1,8 @@ | |||||
| /* Copyright (c) 2014 Cryptography Research, Inc. | /* Copyright (c) 2014 Cryptography Research, Inc. | ||||
| * Released under the MIT License. See LICENSE.txt for license information. | * Released under the MIT License. See LICENSE.txt for license information. | ||||
| */ | */ | ||||
| #ifndef __P255_H__ | |||||
| #define __P255_H__ 1 | |||||
| #ifndef __P25519_H__ | |||||
| #define __P25519_H__ 1 | |||||
| #include <stdint.h> | #include <stdint.h> | ||||
| #include <assert.h> | #include <assert.h> | ||||
| @@ -10,9 +10,12 @@ | |||||
| #include "word.h" | #include "word.h" | ||||
| typedef struct p255_t { | |||||
| #ifndef __DECAF_255_H__ // HACK FIXME | |||||
| #define DECAF_WORD_BITS 64 | |||||
| typedef struct gf_25519_s { | |||||
| uint64_t limb[5]; | uint64_t limb[5]; | ||||
| } p255_t; | |||||
| } gf_25519_s, gf_25519_t[1]; | |||||
| #endif | |||||
| #define LBITS 51 | #define LBITS 51 | ||||
| #define FIELD_LITERAL(a,b,c,d,e) {{ a,b,c,d,e }} | #define FIELD_LITERAL(a,b,c,d,e) {{ a,b,c,d,e }} | ||||
| @@ -32,80 +35,80 @@ extern "C" { | |||||
| #endif | #endif | ||||
| static __inline__ void | static __inline__ void | ||||
| p255_add_RAW ( | |||||
| p255_t *out, | |||||
| const p255_t *a, | |||||
| const p255_t *b | |||||
| gf_25519_add_RAW ( | |||||
| gf_25519_t out, | |||||
| const gf_25519_t a, | |||||
| const gf_25519_t b | |||||
| ) __attribute__((unused)); | ) __attribute__((unused)); | ||||
| static __inline__ void | static __inline__ void | ||||
| p255_sub_RAW ( | |||||
| p255_t *out, | |||||
| const p255_t *a, | |||||
| const p255_t *b | |||||
| gf_25519_sub_RAW ( | |||||
| gf_25519_t out, | |||||
| const gf_25519_t a, | |||||
| const gf_25519_t b | |||||
| ) __attribute__((unused)); | ) __attribute__((unused)); | ||||
| static __inline__ void | static __inline__ void | ||||
| p255_copy ( | |||||
| p255_t *out, | |||||
| const p255_t *a | |||||
| gf_25519_copy ( | |||||
| gf_25519_t out, | |||||
| const gf_25519_t a | |||||
| ) __attribute__((unused)); | ) __attribute__((unused)); | ||||
| static __inline__ void | static __inline__ void | ||||
| p255_weak_reduce ( | |||||
| p255_t *inout | |||||
| gf_25519_weak_reduce ( | |||||
| gf_25519_t inout | |||||
| ) __attribute__((unused)); | ) __attribute__((unused)); | ||||
| void | void | ||||
| p255_strong_reduce ( | |||||
| p255_t *inout | |||||
| gf_25519_strong_reduce ( | |||||
| gf_25519_t inout | |||||
| ); | ); | ||||
| static __inline__ void | static __inline__ void | ||||
| p255_bias ( | |||||
| p255_t *inout, | |||||
| gf_25519_bias ( | |||||
| gf_25519_t inout, | |||||
| int amount | int amount | ||||
| ) __attribute__((unused)); | ) __attribute__((unused)); | ||||
| void | void | ||||
| p255_mul ( | |||||
| p255_t *__restrict__ out, | |||||
| const p255_t *a, | |||||
| const p255_t *b | |||||
| gf_25519_mul ( | |||||
| gf_25519_s *__restrict__ out, | |||||
| const gf_25519_t a, | |||||
| const gf_25519_t b | |||||
| ); | ); | ||||
| void | void | ||||
| p255_mulw ( | |||||
| p255_t *__restrict__ out, | |||||
| const p255_t *a, | |||||
| gf_25519_mulw ( | |||||
| gf_25519_s *__restrict__ out, | |||||
| const gf_25519_t a, | |||||
| uint64_t b | uint64_t b | ||||
| ); | ); | ||||
| void | void | ||||
| p255_sqr ( | |||||
| p255_t *__restrict__ out, | |||||
| const p255_t *a | |||||
| gf_25519_sqr ( | |||||
| gf_25519_s *__restrict__ out, | |||||
| const gf_25519_t a | |||||
| ); | ); | ||||
| void | void | ||||
| p255_serialize ( | |||||
| gf_25519_serialize ( | |||||
| uint8_t serial[32], | uint8_t serial[32], | ||||
| const struct p255_t *x | |||||
| const gf_25519_t x | |||||
| ); | ); | ||||
| mask_t | mask_t | ||||
| p255_deserialize ( | |||||
| p255_t *x, | |||||
| gf_25519_deserialize ( | |||||
| gf_25519_t x, | |||||
| const uint8_t serial[32] | const uint8_t serial[32] | ||||
| ); | ); | ||||
| /* -------------- Inline functions begin here -------------- */ | /* -------------- Inline functions begin here -------------- */ | ||||
| void | void | ||||
| p255_add_RAW ( | |||||
| p255_t *out, | |||||
| const p255_t *a, | |||||
| const p255_t *b | |||||
| gf_25519_add_RAW ( | |||||
| gf_25519_t out, | |||||
| const gf_25519_t a, | |||||
| const gf_25519_t b | |||||
| ) { | ) { | ||||
| unsigned int i; | unsigned int i; | ||||
| for (i=0; i<5; i++) { | for (i=0; i<5; i++) { | ||||
| @@ -114,10 +117,10 @@ p255_add_RAW ( | |||||
| } | } | ||||
| void | void | ||||
| p255_sub_RAW ( | |||||
| p255_t *out, | |||||
| const p255_t *a, | |||||
| const p255_t *b | |||||
| gf_25519_sub_RAW ( | |||||
| gf_25519_t out, | |||||
| const gf_25519_t a, | |||||
| const gf_25519_t b | |||||
| ) { | ) { | ||||
| unsigned int i; | unsigned int i; | ||||
| uint64_t co1 = ((1ull<<51)-1)*2, co2 = co1-36; | uint64_t co1 = ((1ull<<51)-1)*2, co2 = co1-36; | ||||
| @@ -127,16 +130,16 @@ p255_sub_RAW ( | |||||
| } | } | ||||
| void | void | ||||
| p255_copy ( | |||||
| p255_t *out, | |||||
| const p255_t *a | |||||
| gf_25519_copy ( | |||||
| gf_25519_t out, | |||||
| const gf_25519_t a | |||||
| ) { | ) { | ||||
| memcpy(out,a,sizeof(*a)); | memcpy(out,a,sizeof(*a)); | ||||
| } | } | ||||
| void | void | ||||
| p255_bias ( | |||||
| p255_t *a, | |||||
| gf_25519_bias ( | |||||
| gf_25519_t a, | |||||
| int amt | int amt | ||||
| ) { | ) { | ||||
| a->limb[0] += ((uint64_t)(amt)<<52) - 38*amt; | a->limb[0] += ((uint64_t)(amt)<<52) - 38*amt; | ||||
| @@ -147,8 +150,8 @@ p255_bias ( | |||||
| } | } | ||||
| void | void | ||||
| p255_weak_reduce ( | |||||
| p255_t *a | |||||
| gf_25519_weak_reduce ( | |||||
| gf_25519_t a | |||||
| ) { | ) { | ||||
| uint64_t mask = (1ull<<51) - 1; | uint64_t mask = (1ull<<51) - 1; | ||||
| uint64_t tmp = a->limb[4] >> 51; | uint64_t tmp = a->limb[4] >> 51; | ||||
| @@ -163,4 +166,4 @@ p255_weak_reduce ( | |||||
| }; /* extern "C" */ | }; /* extern "C" */ | ||||
| #endif | #endif | ||||
| #endif /* __P255_H__ */ | |||||
| #endif /* __P25519_H__ */ | |||||
| @@ -1 +0,0 @@ | |||||
| ../../p448/arch_x86_64/x86-64-arith.h | |||||
| @@ -0,0 +1,323 @@ | |||||
| /* Copyright (c) 2014 Cryptography Research, Inc. | |||||
| * Released under the MIT License. See LICENSE.txt for license information. | |||||
| */ | |||||
| #ifndef __X86_64_ARITH_H__ | |||||
| #define __X86_64_ARITH_H__ | |||||
| #include <stdint.h> | |||||
| /* TODO: non x86-64 versions of these. | |||||
| * FUTURE: autogenerate | |||||
| */ | |||||
| static __inline__ __uint128_t widemul(const uint64_t *a, const uint64_t *b) { | |||||
| #ifndef __BMI2__ | |||||
| uint64_t c,d; | |||||
| __asm__ volatile | |||||
| ("movq %[a], %%rax;" | |||||
| "mulq %[b];" | |||||
| : [c]"=a"(c), [d]"=d"(d) | |||||
| : [b]"m"(*b), [a]"m"(*a) | |||||
| : "cc"); | |||||
| return (((__uint128_t)(d))<<64) | c; | |||||
| #else | |||||
| uint64_t c,d; | |||||
| __asm__ volatile | |||||
| ("movq %[a], %%rdx;" | |||||
| "mulx %[b], %[c], %[d];" | |||||
| : [c]"=r"(c), [d]"=r"(d) | |||||
| : [b]"m"(*b), [a]"m"(*a) | |||||
| : "rdx"); | |||||
| return (((__uint128_t)(d))<<64) | c; | |||||
| #endif | |||||
| } | |||||
| static __inline__ __uint128_t widemul_rm(uint64_t a, const uint64_t *b) { | |||||
| #ifndef __BMI2__ | |||||
| uint64_t c,d; | |||||
| __asm__ volatile | |||||
| ("movq %[a], %%rax;" | |||||
| "mulq %[b];" | |||||
| : [c]"=a"(c), [d]"=d"(d) | |||||
| : [b]"m"(*b), [a]"r"(a) | |||||
| : "cc"); | |||||
| return (((__uint128_t)(d))<<64) | c; | |||||
| #else | |||||
| uint64_t c,d; | |||||
| __asm__ volatile | |||||
| ("mulx %[b], %[c], %[d];" | |||||
| : [c]"=r"(c), [d]"=r"(d) | |||||
| : [b]"m"(*b), [a]"d"(a)); | |||||
| return (((__uint128_t)(d))<<64) | c; | |||||
| #endif | |||||
| } | |||||
| static __inline__ __uint128_t widemul_rr(uint64_t a, uint64_t b) { | |||||
| #ifndef __BMI2__ | |||||
| uint64_t c,d; | |||||
| __asm__ volatile | |||||
| ("mulq %[b];" | |||||
| : [c]"=a"(c), [d]"=d"(d) | |||||
| : [b]"r"(b), "a"(a) | |||||
| : "cc"); | |||||
| return (((__uint128_t)(d))<<64) | c; | |||||
| #else | |||||
| uint64_t c,d; | |||||
| __asm__ volatile | |||||
| ("mulx %[b], %[c], %[d];" | |||||
| : [c]"=r"(c), [d]"=r"(d) | |||||
| : [b]"r"(b), [a]"d"(a)); | |||||
| return (((__uint128_t)(d))<<64) | c; | |||||
| #endif | |||||
| } | |||||
| static __inline__ __uint128_t widemul2(const uint64_t *a, const uint64_t *b) { | |||||
| #ifndef __BMI2__ | |||||
| uint64_t c,d; | |||||
| __asm__ volatile | |||||
| ("movq %[a], %%rax; " | |||||
| "addq %%rax, %%rax; " | |||||
| "mulq %[b];" | |||||
| : [c]"=a"(c), [d]"=d"(d) | |||||
| : [b]"m"(*b), [a]"m"(*a) | |||||
| : "cc"); | |||||
| return (((__uint128_t)(d))<<64) | c; | |||||
| #else | |||||
| uint64_t c,d; | |||||
| __asm__ volatile | |||||
| ("movq %[a], %%rdx;" | |||||
| "leaq (,%%rdx,2), %%rdx;" | |||||
| "mulx %[b], %[c], %[d];" | |||||
| : [c]"=r"(c), [d]"=r"(d) | |||||
| : [b]"m"(*b), [a]"m"(*a) | |||||
| : "rdx"); | |||||
| return (((__uint128_t)(d))<<64) | c; | |||||
| #endif | |||||
| } | |||||
| static __inline__ void mac(__uint128_t *acc, const uint64_t *a, const uint64_t *b) { | |||||
| uint64_t lo = *acc, hi = *acc>>64; | |||||
| #ifdef __BMI2__ | |||||
| uint64_t c,d; | |||||
| __asm__ volatile | |||||
| ("movq %[a], %%rdx; " | |||||
| "mulx %[b], %[c], %[d]; " | |||||
| "addq %[c], %[lo]; " | |||||
| "adcq %[d], %[hi]; " | |||||
| : [c]"=r"(c), [d]"=r"(d), [lo]"+r"(lo), [hi]"+r"(hi) | |||||
| : [b]"m"(*b), [a]"m"(*a) | |||||
| : "rdx", "cc"); | |||||
| #else | |||||
| __asm__ volatile | |||||
| ("movq %[a], %%rax; " | |||||
| "mulq %[b]; " | |||||
| "addq %%rax, %[lo]; " | |||||
| "adcq %%rdx, %[hi]; " | |||||
| : [lo]"+r"(lo), [hi]"+r"(hi) | |||||
| : [b]"m"(*b), [a]"m"(*a) | |||||
| : "rax", "rdx", "cc"); | |||||
| #endif | |||||
| *acc = (((__uint128_t)(hi))<<64) | lo; | |||||
| } | |||||
| static __inline__ void macac(__uint128_t *acc, __uint128_t *acc2, const uint64_t *a, const uint64_t *b) { | |||||
| uint64_t lo = *acc, hi = *acc>>64; | |||||
| uint64_t lo2 = *acc2, hi2 = *acc2>>64; | |||||
| #ifdef __BMI2__ | |||||
| uint64_t c,d; | |||||
| __asm__ volatile | |||||
| ("movq %[a], %%rdx; " | |||||
| "mulx %[b], %[c], %[d]; " | |||||
| "addq %[c], %[lo]; " | |||||
| "adcq %[d], %[hi]; " | |||||
| "addq %[c], %[lo2]; " | |||||
| "adcq %[d], %[hi2]; " | |||||
| : [c]"=r"(c), [d]"=r"(d), [lo]"+r"(lo), [hi]"+r"(hi), [lo2]"+r"(lo2), [hi2]"+r"(hi2) | |||||
| : [b]"m"(*b), [a]"m"(*a) | |||||
| : "rdx", "cc"); | |||||
| #else | |||||
| __asm__ volatile | |||||
| ("movq %[a], %%rax; " | |||||
| "mulq %[b]; " | |||||
| "addq %%rax, %[lo]; " | |||||
| "adcq %%rdx, %[hi]; " | |||||
| "addq %%rax, %[lo2]; " | |||||
| "adcq %%rdx, %[hi2]; " | |||||
| : [lo]"+r"(lo), [hi]"+r"(hi), [lo2]"+r"(lo2), [hi2]"+r"(hi2) | |||||
| : [b]"m"(*b), [a]"m"(*a) | |||||
| : "rax", "rdx", "cc"); | |||||
| #endif | |||||
| *acc = (((__uint128_t)(hi))<<64) | lo; | |||||
| *acc2 = (((__uint128_t)(hi2))<<64) | lo2; | |||||
| } | |||||
| static __inline__ void mac_rm(__uint128_t *acc, uint64_t a, const uint64_t *b) { | |||||
| uint64_t lo = *acc, hi = *acc>>64; | |||||
| #ifdef __BMI2__ | |||||
| uint64_t c,d; | |||||
| __asm__ volatile | |||||
| ("mulx %[b], %[c], %[d]; " | |||||
| "addq %[c], %[lo]; " | |||||
| "adcq %[d], %[hi]; " | |||||
| : [c]"=r"(c), [d]"=r"(d), [lo]"+r"(lo), [hi]"+r"(hi) | |||||
| : [b]"m"(*b), [a]"d"(a) | |||||
| : "cc"); | |||||
| #else | |||||
| __asm__ volatile | |||||
| ("movq %[a], %%rax; " | |||||
| "mulq %[b]; " | |||||
| "addq %%rax, %[lo]; " | |||||
| "adcq %%rdx, %[hi]; " | |||||
| : [lo]"+r"(lo), [hi]"+r"(hi) | |||||
| : [b]"m"(*b), [a]"r"(a) | |||||
| : "rax", "rdx", "cc"); | |||||
| #endif | |||||
| *acc = (((__uint128_t)(hi))<<64) | lo; | |||||
| } | |||||
| static __inline__ void mac_rr(__uint128_t *acc, uint64_t a, const uint64_t b) { | |||||
| uint64_t lo = *acc, hi = *acc>>64; | |||||
| #ifdef __BMI2__ | |||||
| uint64_t c,d; | |||||
| __asm__ volatile | |||||
| ("mulx %[b], %[c], %[d]; " | |||||
| "addq %[c], %[lo]; " | |||||
| "adcq %[d], %[hi]; " | |||||
| : [c]"=r"(c), [d]"=r"(d), [lo]"+r"(lo), [hi]"+r"(hi) | |||||
| : [b]"r"(b), [a]"d"(a) | |||||
| : "cc"); | |||||
| #else | |||||
| __asm__ volatile | |||||
| ("mulq %[b]; " | |||||
| "addq %%rax, %[lo]; " | |||||
| "adcq %%rdx, %[hi]; " | |||||
| : [lo]"+r"(lo), [hi]"+r"(hi) | |||||
| : [b]"r"(b), "a"(a) | |||||
| : "rax", "rdx", "cc"); | |||||
| #endif | |||||
| *acc = (((__uint128_t)(hi))<<64) | lo; | |||||
| } | |||||
| static __inline__ void mac2(__uint128_t *acc, const uint64_t *a, const uint64_t *b) { | |||||
| uint64_t lo = *acc, hi = *acc>>64; | |||||
| #ifdef __BMI2__ | |||||
| uint64_t c,d; | |||||
| __asm__ volatile | |||||
| ("movq %[a], %%rdx; " | |||||
| "addq %%rdx, %%rdx; " | |||||
| "mulx %[b], %[c], %[d]; " | |||||
| "addq %[c], %[lo]; " | |||||
| "adcq %[d], %[hi]; " | |||||
| : [c]"=r"(c), [d]"=r"(d), [lo]"+r"(lo), [hi]"+r"(hi) | |||||
| : [b]"m"(*b), [a]"m"(*a) | |||||
| : "rdx", "cc"); | |||||
| #else | |||||
| __asm__ volatile | |||||
| ("movq %[a], %%rax; " | |||||
| "addq %%rax, %%rax; " | |||||
| "mulq %[b]; " | |||||
| "addq %%rax, %[lo]; " | |||||
| "adcq %%rdx, %[hi]; " | |||||
| : [lo]"+r"(lo), [hi]"+r"(hi) | |||||
| : [b]"m"(*b), [a]"m"(*a) | |||||
| : "rax", "rdx", "cc"); | |||||
| #endif | |||||
| *acc = (((__uint128_t)(hi))<<64) | lo; | |||||
| } | |||||
| static __inline__ void msb(__uint128_t *acc, const uint64_t *a, const uint64_t *b) { | |||||
| uint64_t lo = *acc, hi = *acc>>64; | |||||
| #ifdef __BMI2__ | |||||
| uint64_t c,d; | |||||
| __asm__ volatile | |||||
| ("movq %[a], %%rdx; " | |||||
| "mulx %[b], %[c], %[d]; " | |||||
| "subq %[c], %[lo]; " | |||||
| "sbbq %[d], %[hi]; " | |||||
| : [c]"=r"(c), [d]"=r"(d), [lo]"+r"(lo), [hi]"+r"(hi) | |||||
| : [b]"m"(*b), [a]"m"(*a) | |||||
| : "rdx", "cc"); | |||||
| #else | |||||
| __asm__ volatile | |||||
| ("movq %[a], %%rax; " | |||||
| "mulq %[b]; " | |||||
| "subq %%rax, %[lo]; " | |||||
| "sbbq %%rdx, %[hi]; " | |||||
| : [lo]"+r"(lo), [hi]"+r"(hi) | |||||
| : [b]"m"(*b), [a]"m"(*a) | |||||
| : "rax", "rdx", "cc"); | |||||
| #endif | |||||
| *acc = (((__uint128_t)(hi))<<64) | lo; | |||||
| } | |||||
| static __inline__ void msb2(__uint128_t *acc, const uint64_t *a, const uint64_t *b) { | |||||
| uint64_t lo = *acc, hi = *acc>>64; | |||||
| #ifdef __BMI2__ | |||||
| uint64_t c,d; | |||||
| __asm__ volatile | |||||
| ("movq %[a], %%rdx; " | |||||
| "addq %%rdx, %%rdx; " | |||||
| "mulx %[b], %[c], %[d]; " | |||||
| "subq %[c], %[lo]; " | |||||
| "sbbq %[d], %[hi]; " | |||||
| : [c]"=r"(c), [d]"=r"(d), [lo]"+r"(lo), [hi]"+r"(hi) | |||||
| : [b]"m"(*b), [a]"m"(*a) | |||||
| : "rdx", "cc"); | |||||
| #else | |||||
| __asm__ volatile | |||||
| ("movq %[a], %%rax; " | |||||
| "addq %%rax, %%rax; " | |||||
| "mulq %[b]; " | |||||
| "subq %%rax, %[lo]; " | |||||
| "sbbq %%rdx, %[hi]; " | |||||
| : [lo]"+r"(lo), [hi]"+r"(hi) | |||||
| : [b]"m"(*b), [a]"m"(*a) | |||||
| : "rax", "rdx", "cc"); | |||||
| #endif | |||||
| *acc = (((__uint128_t)(hi))<<64) | lo; | |||||
| } | |||||
| static __inline__ void mrs(__uint128_t *acc, const uint64_t *a, const uint64_t *b) { | |||||
| uint64_t c,d, lo = *acc, hi = *acc>>64; | |||||
| __asm__ volatile | |||||
| ("movq %[a], %%rdx; " | |||||
| "mulx %[b], %[c], %[d]; " | |||||
| "subq %[lo], %[c]; " | |||||
| "sbbq %[hi], %[d]; " | |||||
| : [c]"=r"(c), [d]"=r"(d), [lo]"+r"(lo), [hi]"+r"(hi) | |||||
| : [b]"m"(*b), [a]"m"(*a) | |||||
| : "rdx", "cc"); | |||||
| *acc = (((__uint128_t)(d))<<64) | c; | |||||
| } | |||||
| static __inline__ __uint128_t widemulu(uint64_t a, uint64_t b) { | |||||
| return ((__uint128_t)(a)) * b; | |||||
| } | |||||
| static __inline__ __int128_t widemuls(int64_t a, int64_t b) { | |||||
| return ((__int128_t)(a)) * b; | |||||
| } | |||||
| static __inline__ uint64_t opacify(uint64_t x) { | |||||
| __asm__ volatile("" : "+r"(x)); | |||||
| return x; | |||||
| } | |||||
| static __inline__ mask_t is_zero(uint64_t x) { | |||||
| __asm__ volatile("neg %0; sbb %0, %0;" : "+r"(x)); | |||||
| return ~x; | |||||
| } | |||||
| #endif /* __X86_64_ARITH_H__ */ | |||||
| @@ -10,7 +10,7 @@ | |||||
| #include "field.h" | #include "field.h" | ||||
| const field_a_t P25519_SQRT_MINUS_ONE = {FIELD_LITERAL( | |||||
| const gf_25519_t P25519_SQRT_MINUS_ONE = {FIELD_LITERAL( | |||||
| 0x61b274a0ea0b0, | 0x61b274a0ea0b0, | ||||
| 0x0d5a5fc8f189d, | 0x0d5a5fc8f189d, | ||||
| 0x7ef5e9cbd0c60, | 0x7ef5e9cbd0c60, | ||||
| @@ -18,7 +18,7 @@ const field_a_t P25519_SQRT_MINUS_ONE = {FIELD_LITERAL( | |||||
| 0x2b8324804fc1d | 0x2b8324804fc1d | ||||
| )}; | )}; | ||||
| const field_a_t SQRT_ONE_MINUS_D = {FIELD_LITERAL( // FIXME MAGIC goes elsewhere? | |||||
| const gf_25519_t SQRT_ONE_MINUS_D = {FIELD_LITERAL( // FIXME MAGIC goes elsewhere? | |||||
| 0x6db8831bbddec, | 0x6db8831bbddec, | ||||
| 0x38d7b56c9c165, | 0x38d7b56c9c165, | ||||
| 0x016b221394bdc, | 0x016b221394bdc, | ||||
| @@ -26,15 +26,15 @@ const field_a_t SQRT_ONE_MINUS_D = {FIELD_LITERAL( // FIXME MAGIC goes elsewhere | |||||
| 0x0a0d85b4032b1 | 0x0a0d85b4032b1 | ||||
| )}; | )}; | ||||
| static const field_a_t ONE = {FIELD_LITERAL( // FIXME copy-pasted | |||||
| static const gf_25519_t ONE = {FIELD_LITERAL( // FIXME copy-pasted | |||||
| 1,0,0,0,0 | 1,0,0,0,0 | ||||
| )}; | )}; | ||||
| // ARCH MAGIC FIXME copy-pasted from decaf_fast.c | // ARCH MAGIC FIXME copy-pasted from decaf_fast.c | ||||
| static mask_t gf_eq(const field_a_t a, const field_a_t b) { | |||||
| field_a_t c; | |||||
| field_sub(c,a,b); | |||||
| field_strong_reduce(c); | |||||
| static mask_t gf_eq(const gf_25519_t a, const gf_25519_t b) { | |||||
| gf_25519_t c; | |||||
| gf_sub(c,a,b); | |||||
| gf_strong_reduce(c); | |||||
| mask_t ret=0; | mask_t ret=0; | ||||
| int i; | int i; | ||||
| for (i=0; i<5; i++) { ret |= c->limb[i]; } | for (i=0; i<5; i++) { ret |= c->limb[i]; } | ||||
| @@ -43,19 +43,19 @@ static mask_t gf_eq(const field_a_t a, const field_a_t b) { | |||||
| /* Guarantee: a^2 x = 0 if x = 0; else a^2 x = 1 or SQRT_MINUS_ONE; */ | /* Guarantee: a^2 x = 0 if x = 0; else a^2 x = 1 or SQRT_MINUS_ONE; */ | ||||
| void | void | ||||
| field_isr ( | |||||
| field_a_t a, | |||||
| const field_a_t x | |||||
| gf_isr ( | |||||
| gf_25519_t a, | |||||
| const gf_25519_t x | |||||
| ) { | ) { | ||||
| field_a_t st[3], tmp1, tmp2; | |||||
| gf_25519_t st[3], tmp1, tmp2; | |||||
| const struct { unsigned char sh, idx; } ops[] = { | const struct { unsigned char sh, idx; } ops[] = { | ||||
| {1,2},{1,2},{3,1},{6,0},{1,2},{12,1},{25,1},{25,1},{50,0},{125,0},{2,2},{1,2} | {1,2},{1,2},{3,1},{6,0},{1,2},{12,1},{25,1},{25,1},{50,0},{125,0},{2,2},{1,2} | ||||
| }; | }; | ||||
| st[0][0] = st[1][0] = st[2][0] = x[0]; | st[0][0] = st[1][0] = st[2][0] = x[0]; | ||||
| unsigned int i; | unsigned int i; | ||||
| for (i=0; i<sizeof(ops)/sizeof(ops[0]); i++) { | for (i=0; i<sizeof(ops)/sizeof(ops[0]); i++) { | ||||
| field_sqrn(tmp1, st[1^(i&1)], ops[i].sh); | |||||
| field_mul(tmp2, tmp1, st[ops[i].idx]); | |||||
| gf_sqrn(tmp1, st[1^(i&1)], ops[i].sh); | |||||
| gf_mul(tmp2, tmp1, st[ops[i].idx]); | |||||
| st[i&1][0] = tmp2[0]; | st[i&1][0] = tmp2[0]; | ||||
| } | } | ||||
| @@ -64,5 +64,5 @@ field_isr ( | |||||
| // ARCH MAGIC FIXME: should be cond_sel | // ARCH MAGIC FIXME: should be cond_sel | ||||
| for (i=0; i<5; i++) tmp1->limb[i] = (ONE->limb[i] & mask) | for (i=0; i<5; i++) tmp1->limb[i] = (ONE->limb[i] & mask) | ||||
| | (SQRT_MINUS_ONE->limb[i] & ~mask); | | (SQRT_MINUS_ONE->limb[i] & ~mask); | ||||
| field_mul(a,tmp1,st[0]); | |||||
| gf_mul(a,tmp1,st[0]); | |||||
| } | } | ||||
| @@ -13,20 +13,21 @@ | |||||
| #include <string.h> | #include <string.h> | ||||
| #include "p25519.h" | #include "p25519.h" | ||||
| #define FIELD_LIT_LIMB_BITS 51 | |||||
| #define FIELD_BITS 255 | |||||
| #define field_t p255_t | |||||
| #define field_mul p255_mul | |||||
| #define field_sqr p255_sqr | |||||
| #define field_add_RAW p255_add_RAW | |||||
| #define field_sub_RAW p255_sub_RAW | |||||
| #define field_mulw p255_mulw | |||||
| #define field_bias p255_bias | |||||
| #define field_isr p255_isr | |||||
| #define field_weak_reduce p255_weak_reduce | |||||
| #define field_strong_reduce p255_strong_reduce | |||||
| #define field_serialize p255_serialize | |||||
| #define field_deserialize p255_deserialize | |||||
| #define SQRT_MINUS_ONE P25519_SQRT_MINUS_ONE | |||||
| #define GF_LIT_LIMB_BITS 51 | |||||
| #define GF_BITS 255 | |||||
| #define gf gf_25519_t | |||||
| #define gf_s gf_25519_s | |||||
| #define gf_mul gf_25519_mul | |||||
| #define gf_sqr gf_25519_sqr | |||||
| #define gf_add_RAW gf_25519_add_RAW | |||||
| #define gf_sub_RAW gf_25519_sub_RAW | |||||
| #define gf_mulw gf_25519_mulw | |||||
| #define gf_bias gf_25519_bias | |||||
| #define gf_isr gf_25519_isr | |||||
| #define gf_weak_reduce gf_25519_weak_reduce | |||||
| #define gf_strong_reduce gf_25519_strong_reduce | |||||
| #define gf_serialize gf_25519_serialize | |||||
| #define gf_deserialize gf_25519_deserialize | |||||
| #define SQRT_MINUS_ONE P25519_SQRT_MINUS_ONE | |||||
| #endif /* __F_FIELD_H__ */ | #endif /* __F_FIELD_H__ */ | ||||
| @@ -11,33 +11,33 @@ | |||||
| #include "field.h" | #include "field.h" | ||||
| void | void | ||||
| field_isr ( | |||||
| field_a_t a, | |||||
| const field_a_t x | |||||
| gf_isr ( | |||||
| gf_a_t a, | |||||
| const gf_a_t x | |||||
| ) { | ) { | ||||
| field_a_t L0, L1, L2; | |||||
| field_sqr ( L1, x ); | |||||
| field_mul ( L2, x, L1 ); | |||||
| field_sqr ( L1, L2 ); | |||||
| field_mul ( L2, x, L1 ); | |||||
| field_sqrn ( L1, L2, 3 ); | |||||
| field_mul ( L0, L2, L1 ); | |||||
| field_sqrn ( L1, L0, 3 ); | |||||
| field_mul ( L0, L2, L1 ); | |||||
| field_sqrn ( L2, L0, 9 ); | |||||
| field_mul ( L1, L0, L2 ); | |||||
| field_sqr ( L0, L1 ); | |||||
| field_mul ( L2, x, L0 ); | |||||
| field_sqrn ( L0, L2, 18 ); | |||||
| field_mul ( L2, L1, L0 ); | |||||
| field_sqrn ( L0, L2, 37 ); | |||||
| field_mul ( L1, L2, L0 ); | |||||
| field_sqrn ( L0, L1, 37 ); | |||||
| field_mul ( L1, L2, L0 ); | |||||
| field_sqrn ( L0, L1, 111 ); | |||||
| field_mul ( L2, L1, L0 ); | |||||
| field_sqr ( L0, L2 ); | |||||
| field_mul ( L1, x, L0 ); | |||||
| field_sqrn ( L0, L1, 223 ); | |||||
| field_mul ( a, L2, L0 ); | |||||
| gf_a_t L0, L1, L2; | |||||
| gf_sqr ( L1, x ); | |||||
| gf_mul ( L2, x, L1 ); | |||||
| gf_sqr ( L1, L2 ); | |||||
| gf_mul ( L2, x, L1 ); | |||||
| gf_sqrn ( L1, L2, 3 ); | |||||
| gf_mul ( L0, L2, L1 ); | |||||
| gf_sqrn ( L1, L0, 3 ); | |||||
| gf_mul ( L0, L2, L1 ); | |||||
| gf_sqrn ( L2, L0, 9 ); | |||||
| gf_mul ( L1, L0, L2 ); | |||||
| gf_sqr ( L0, L1 ); | |||||
| gf_mul ( L2, x, L0 ); | |||||
| gf_sqrn ( L0, L2, 18 ); | |||||
| gf_mul ( L2, L1, L0 ); | |||||
| gf_sqrn ( L0, L2, 37 ); | |||||
| gf_mul ( L1, L2, L0 ); | |||||
| gf_sqrn ( L0, L1, 37 ); | |||||
| gf_mul ( L1, L2, L0 ); | |||||
| gf_sqrn ( L0, L1, 111 ); | |||||
| gf_mul ( L2, L1, L0 ); | |||||
| gf_sqr ( L0, L2 ); | |||||
| gf_mul ( L1, x, L0 ); | |||||
| gf_sqrn ( L0, L1, 223 ); | |||||
| gf_mul ( a, L2, L0 ); | |||||
| } | } | ||||
| @@ -13,19 +13,19 @@ | |||||
| #include <string.h> | #include <string.h> | ||||
| #include "p448.h" | #include "p448.h" | ||||
| #define FIELD_LIT_LIMB_BITS 56 | |||||
| #define FIELD_BITS 448 | |||||
| #define field_t p448_t | |||||
| #define field_mul p448_mul | |||||
| #define field_sqr p448_sqr | |||||
| #define field_add_RAW p448_add_RAW | |||||
| #define field_sub_RAW p448_sub_RAW | |||||
| #define field_mulw p448_mulw | |||||
| #define field_bias p448_bias | |||||
| #define field_isr p448_isr | |||||
| #define field_weak_reduce p448_weak_reduce | |||||
| #define field_strong_reduce p448_strong_reduce | |||||
| #define field_serialize p448_serialize | |||||
| #define field_deserialize p448_deserialize | |||||
| #define GF_LIT_LIMB_BITS 56 | |||||
| #define GF_BITS 448 | |||||
| #define gf p448_t | |||||
| #define gf_mul p448_mul | |||||
| #define gf_sqr p448_sqr | |||||
| #define gf_add_RAW p448_add_RAW | |||||
| #define gf_sub_RAW p448_sub_RAW | |||||
| #define gf_mulw p448_mulw | |||||
| #define gf_bias p448_bias | |||||
| #define gf_isr p448_isr | |||||
| #define gf_weak_reduce p448_weak_reduce | |||||
| #define gf_strong_reduce p448_strong_reduce | |||||
| #define gf_serialize p448_serialize | |||||
| #define gf_deserialize p448_deserialize | |||||
| #endif /* __F_FIELD_H__ */ | #endif /* __F_FIELD_H__ */ | ||||
| @@ -11,33 +11,33 @@ | |||||
| #include "field.h" | #include "field.h" | ||||
| void | void | ||||
| field_isr ( | |||||
| field_a_t a, | |||||
| const field_a_t x | |||||
| gf_isr ( | |||||
| gf_a_t a, | |||||
| const gf_a_t x | |||||
| ) { | ) { | ||||
| field_a_t L0, L1, L2, L3; | |||||
| field_sqr ( L2, x ); | |||||
| field_mul ( L1, x, L2 ); | |||||
| field_sqrn ( L0, L1, 2 ); | |||||
| field_mul ( L2, L1, L0 ); | |||||
| field_sqrn ( L0, L2, 4 ); | |||||
| field_mul ( L1, L2, L0 ); | |||||
| field_sqr ( L0, L1 ); | |||||
| field_mul ( L2, x, L0 ); | |||||
| field_sqrn ( L0, L2, 8 ); | |||||
| field_mul ( L2, L1, L0 ); | |||||
| field_sqrn ( L0, L2, 17 ); | |||||
| field_mul ( L1, L2, L0 ); | |||||
| field_sqrn ( L0, L1, 17 ); | |||||
| field_mul ( L1, L2, L0 ); | |||||
| field_sqrn ( L3, L1, 17 ); | |||||
| field_mul ( L0, L2, L3 ); | |||||
| field_sqrn ( L2, L0, 51 ); | |||||
| field_mul ( L0, L1, L2 ); | |||||
| field_sqrn ( L1, L0, 119 ); | |||||
| field_mul ( L2, L0, L1 ); | |||||
| field_sqr ( L0, L2 ); | |||||
| field_mul ( L1, x, L0 ); | |||||
| field_sqrn ( L0, L1, 239 ); | |||||
| field_mul ( a, L2, L0 ); | |||||
| gf_a_t L0, L1, L2, L3; | |||||
| gf_sqr ( L2, x ); | |||||
| gf_mul ( L1, x, L2 ); | |||||
| gf_sqrn ( L0, L1, 2 ); | |||||
| gf_mul ( L2, L1, L0 ); | |||||
| gf_sqrn ( L0, L2, 4 ); | |||||
| gf_mul ( L1, L2, L0 ); | |||||
| gf_sqr ( L0, L1 ); | |||||
| gf_mul ( L2, x, L0 ); | |||||
| gf_sqrn ( L0, L2, 8 ); | |||||
| gf_mul ( L2, L1, L0 ); | |||||
| gf_sqrn ( L0, L2, 17 ); | |||||
| gf_mul ( L1, L2, L0 ); | |||||
| gf_sqrn ( L0, L1, 17 ); | |||||
| gf_mul ( L1, L2, L0 ); | |||||
| gf_sqrn ( L3, L1, 17 ); | |||||
| gf_mul ( L0, L2, L3 ); | |||||
| gf_sqrn ( L2, L0, 51 ); | |||||
| gf_mul ( L0, L1, L2 ); | |||||
| gf_sqrn ( L1, L0, 119 ); | |||||
| gf_mul ( L2, L0, L1 ); | |||||
| gf_sqr ( L0, L2 ); | |||||
| gf_mul ( L1, x, L0 ); | |||||
| gf_sqrn ( L0, L1, 239 ); | |||||
| gf_mul ( a, L2, L0 ); | |||||
| } | } | ||||
| @@ -13,19 +13,19 @@ | |||||
| #include <string.h> | #include <string.h> | ||||
| #include "p480.h" | #include "p480.h" | ||||
| #define FIELD_LIT_LIMB_BITS 60 | |||||
| #define FIELD_BITS 480 | |||||
| #define field_t p480_t | |||||
| #define field_mul p480_mul | |||||
| #define field_sqr p480_sqr | |||||
| #define field_add_RAW p480_add_RAW | |||||
| #define field_sub_RAW p480_sub_RAW | |||||
| #define field_mulw p480_mulw | |||||
| #define field_bias p480_bias | |||||
| #define field_isr p480_isr | |||||
| #define field_weak_reduce p480_weak_reduce | |||||
| #define field_strong_reduce p480_strong_reduce | |||||
| #define field_serialize p480_serialize | |||||
| #define field_deserialize p480_deserialize | |||||
| #define GF_LIT_LIMB_BITS 60 | |||||
| #define GF_BITS 480 | |||||
| #define gf p480_t | |||||
| #define gf_mul p480_mul | |||||
| #define gf_sqr p480_sqr | |||||
| #define gf_add_RAW p480_add_RAW | |||||
| #define gf_sub_RAW p480_sub_RAW | |||||
| #define gf_mulw p480_mulw | |||||
| #define gf_bias p480_bias | |||||
| #define gf_isr p480_isr | |||||
| #define gf_weak_reduce p480_weak_reduce | |||||
| #define gf_strong_reduce p480_strong_reduce | |||||
| #define gf_serialize p480_serialize | |||||
| #define gf_deserialize p480_deserialize | |||||
| #endif /* __F_FIELD_H__ */ | #endif /* __F_FIELD_H__ */ | ||||
| @@ -11,33 +11,33 @@ | |||||
| #include "field.h" | #include "field.h" | ||||
| void | void | ||||
| field_isr ( | |||||
| field_a_t a, | |||||
| const field_a_t x | |||||
| gf_isr ( | |||||
| gf_a_t a, | |||||
| const gf_a_t x | |||||
| ) { | ) { | ||||
| field_a_t L0, L1, L2; | |||||
| field_sqr ( L1, x ); | |||||
| field_mul ( L0, x, L1 ); | |||||
| field_sqrn ( L2, L0, 2 ); | |||||
| field_mul ( L1, L0, L2 ); | |||||
| field_sqrn ( L2, L1, 4 ); | |||||
| field_mul ( L0, L1, L2 ); | |||||
| field_sqrn ( L2, L0, 8 ); | |||||
| field_mul ( L1, L0, L2 ); | |||||
| field_sqrn ( L2, L1, 16 ); | |||||
| field_mul ( L0, L1, L2 ); | |||||
| field_sqrn ( L2, L0, 32 ); | |||||
| field_mul ( L1, L0, L2 ); | |||||
| field_sqr ( L2, L1 ); | |||||
| field_mul ( L0, x, L2 ); | |||||
| field_sqrn ( L2, L0, 64 ); | |||||
| field_mul ( L0, L1, L2 ); | |||||
| field_sqrn ( L2, L0, 129 ); | |||||
| field_mul ( L1, L0, L2 ); | |||||
| field_sqr ( L2, L1 ); | |||||
| field_mul ( L0, x, L2 ); | |||||
| field_sqrn ( L2, L0, 259 ); | |||||
| field_mul ( L1, L0, L2 ); | |||||
| field_sqr ( L0, L1 ); | |||||
| field_mul ( a, x, L0 ); | |||||
| gf_a_t L0, L1, L2; | |||||
| gf_sqr ( L1, x ); | |||||
| gf_mul ( L0, x, L1 ); | |||||
| gf_sqrn ( L2, L0, 2 ); | |||||
| gf_mul ( L1, L0, L2 ); | |||||
| gf_sqrn ( L2, L1, 4 ); | |||||
| gf_mul ( L0, L1, L2 ); | |||||
| gf_sqrn ( L2, L0, 8 ); | |||||
| gf_mul ( L1, L0, L2 ); | |||||
| gf_sqrn ( L2, L1, 16 ); | |||||
| gf_mul ( L0, L1, L2 ); | |||||
| gf_sqrn ( L2, L0, 32 ); | |||||
| gf_mul ( L1, L0, L2 ); | |||||
| gf_sqr ( L2, L1 ); | |||||
| gf_mul ( L0, x, L2 ); | |||||
| gf_sqrn ( L2, L0, 64 ); | |||||
| gf_mul ( L0, L1, L2 ); | |||||
| gf_sqrn ( L2, L0, 129 ); | |||||
| gf_mul ( L1, L0, L2 ); | |||||
| gf_sqr ( L2, L1 ); | |||||
| gf_mul ( L0, x, L2 ); | |||||
| gf_sqrn ( L2, L0, 259 ); | |||||
| gf_mul ( L1, L0, L2 ); | |||||
| gf_sqr ( L0, L1 ); | |||||
| gf_mul ( a, x, L0 ); | |||||
| } | } | ||||
| @@ -13,19 +13,19 @@ | |||||
| #include "constant_time.h" | #include "constant_time.h" | ||||
| #include "p521.h" | #include "p521.h" | ||||
| #define FIELD_LIT_LIMB_BITS 58 | |||||
| #define FIELD_BITS 521 | |||||
| #define field_t p521_t | |||||
| #define field_mul p521_mul | |||||
| #define field_sqr p521_sqr | |||||
| #define field_add_RAW p521_add_RAW | |||||
| #define field_sub_RAW p521_sub_RAW | |||||
| #define field_mulw p521_mulw | |||||
| #define field_bias p521_bias | |||||
| #define field_isr p521_isr | |||||
| #define field_weak_reduce p521_weak_reduce | |||||
| #define field_strong_reduce p521_strong_reduce | |||||
| #define field_serialize p521_serialize | |||||
| #define field_deserialize p521_deserialize | |||||
| #define GF_LIT_LIMB_BITS 58 | |||||
| #define GF_BITS 521 | |||||
| #define gf p521_t | |||||
| #define gf_mul p521_mul | |||||
| #define gf_sqr p521_sqr | |||||
| #define gf_add_RAW p521_add_RAW | |||||
| #define gf_sub_RAW p521_sub_RAW | |||||
| #define gf_mulw p521_mulw | |||||
| #define gf_bias p521_bias | |||||
| #define gf_isr p521_isr | |||||
| #define gf_weak_reduce p521_weak_reduce | |||||
| #define gf_strong_reduce p521_strong_reduce | |||||
| #define gf_serialize p521_serialize | |||||
| #define gf_deserialize p521_deserialize | |||||
| #endif /* __F_FIELD_H__ */ | #endif /* __F_FIELD_H__ */ | ||||
| @@ -21,11 +21,13 @@ extern "C" { | |||||
| #define DECAF_255_SCALAR_BITS 254 // Curve25519: 253 | #define DECAF_255_SCALAR_BITS 254 // Curve25519: 253 | ||||
| #define DECAF_255_SCALAR_LIMBS (256/DECAF_WORD_BITS) | #define DECAF_255_SCALAR_LIMBS (256/DECAF_WORD_BITS) | ||||
| #ifndef __DECAF_GF_ALREADY_DEFINED__ | |||||
| /** Galois field element internal structure */ | /** Galois field element internal structure */ | ||||
| typedef struct gf_255_s { | |||||
| typedef struct gf_25519_s { | |||||
| decaf_word_t limb[DECAF_255_LIMBS]; | decaf_word_t limb[DECAF_255_LIMBS]; | ||||
| } gf_255_s, gf_255_t[1]; | |||||
| } gf_25519_s, gf_25519_t[1]; | |||||
| /** @endcond */ | /** @endcond */ | ||||
| #endif /* __DECAF_GF_ALREADY_DEFINED__ */ | |||||
| /** Number of bytes in a serialized point. */ | /** Number of bytes in a serialized point. */ | ||||
| #define DECAF_255_SER_BYTES 32 | #define DECAF_255_SER_BYTES 32 | ||||
| @@ -34,7 +36,7 @@ typedef struct gf_255_s { | |||||
| #define DECAF_255_SCALAR_BYTES 32 | #define DECAF_255_SCALAR_BYTES 32 | ||||
| /** Twisted Edwards (-1,d-1) extended homogeneous coordinates */ | /** Twisted Edwards (-1,d-1) extended homogeneous coordinates */ | ||||
| typedef struct decaf_255_point_s { /**@cond internal*/gf_255_t x,y,z,t;/**@endcond*/ } decaf_255_point_t[1]; | |||||
| typedef struct decaf_255_point_s { /**@cond internal*/gf_25519_t x,y,z,t;/**@endcond*/ } decaf_255_point_t[1]; | |||||
| /** Precomputed table based on a point. Can be trivial implementation. */ | /** Precomputed table based on a point. Can be trivial implementation. */ | ||||
| struct decaf_255_precomputed_s; | struct decaf_255_precomputed_s; | ||||