| @@ -13,6 +13,8 @@ | |||
| #include <string.h> | |||
| #include "field.h" | |||
| #include "ec_point.h" // REMOVE! | |||
| #define WBITS DECAF_WORD_BITS | |||
| #if WBITS == 64 | |||
| @@ -817,18 +819,21 @@ decaf_bool_t decaf_448_direct_scalarmul ( | |||
| decaf_bool_t allow_identity, | |||
| decaf_bool_t short_circuit | |||
| ) { | |||
| gf s0, xa, za, xd, zd, xs, zs; | |||
| (void)short_circuit; | |||
| gf s0, x0, xa, za, xd, zd, xs, zs; | |||
| decaf_bool_t succ = gf_deser ( s0, base ); | |||
| succ &= allow_identity |~ gf_eq(s0, ZERO); | |||
| (void) short_circuit; | |||
| succ &= allow_identity |~ gf_eq( s0, ZERO); | |||
| succ &= ~hibit(s0); | |||
| gf_sqr ( xa, s0 ); | |||
| gf_cpy ( x0, xa ); | |||
| gf_cpy ( za, ONE ); | |||
| gf_cpy ( xd, ONE ); | |||
| gf_cpy ( zd, ZERO ); | |||
| int j; | |||
| int i,j; | |||
| decaf_bool_t pflip = 0; | |||
| for (j=DECAF_448_SCALAR_BITS-1; j>=0; j--) { | |||
| for (j=448-1; j>=0; j--) { /* TODO: DECAF_SCALAR_BITS */ | |||
| decaf_bool_t flip = -((scalar->limb[j/WORD_BITS]>>(j%WORD_BITS))&1);; | |||
| cond_swap(xa,xd,flip^pflip); | |||
| cond_swap(za,zd,flip^pflip); | |||
| @@ -848,7 +853,7 @@ decaf_bool_t decaf_448_direct_scalarmul ( | |||
| gf_mlw ( zd, za, 1-EDWARDS_D ); | |||
| gf_add_nr ( xa, xa, zd ); | |||
| gf_mul ( zd, xa, za ); | |||
| gf_sqr ( xa, xs ); | |||
| gf_sqr ( xa, xs ); | |||
| gf_sqr ( za, zs ); | |||
| pflip = flip; | |||
| } | |||
| @@ -856,7 +861,7 @@ decaf_bool_t decaf_448_direct_scalarmul ( | |||
| cond_swap(za,zd,pflip); | |||
| /* OK, time to reserialize! */ | |||
| gf xz_d, xz_a, x0, den, L0, L1, L2, L3, out; /* TODO: simplify */ | |||
| gf xz_d, xz_a, den, L0, L1, L2, L3, out; /* TODO: simplify */ | |||
| mask_t zcase, output_zero, sflip, za_zero; | |||
| gf_mul(xz_d, xd, zd); | |||
| gf_mul(xz_a, xa, za); | |||
| @@ -864,9 +869,7 @@ decaf_bool_t decaf_448_direct_scalarmul ( | |||
| za_zero = gf_eq(za, ZERO); | |||
| cond_sel(xz_d, xz_d, ONE, output_zero); /* make xz_d always nonzero */ | |||
| zcase = output_zero | gf_eq(xz_a, ZERO); | |||
| gf_sqr(x0, s0); | |||
| /* Curve test in zcase */ | |||
| gf_cpy(L0,x0); | |||
| gf_add(L0,L0,ONE); | |||
| @@ -874,7 +877,7 @@ decaf_bool_t decaf_448_direct_scalarmul ( | |||
| gf_mlw(L0,x0,-4*EDWARDS_D); | |||
| gf_add(L1,L1,L0); | |||
| cond_sel(xz_a,xz_a,L1,zcase); | |||
| /* Compute denominator */ | |||
| gf_mul(L0, x0, xz_d); | |||
| gf_mlw(L2, L0, 4); | |||
| @@ -912,20 +915,20 @@ decaf_bool_t decaf_448_direct_scalarmul ( | |||
| /* compute the output */ | |||
| gf_mul(L1,L0,den); | |||
| cond_sel(L2,zs,s0,zcase); /* zs, but s0 in zcase */ | |||
| gf_mul(L0,L1,L2); | |||
| cond_sel(L3,xd,zd,za_zero); | |||
| cond_sel(L2,xs,L3,zcase); /* xs, but zq or qq in zcase */ | |||
| gf_mul(out,L0,L2); | |||
| cond_sel(out,out,ZERO,output_zero); | |||
| cond_neg(out,hibit(out)); | |||
| /* TODO: resubroutineize? */ | |||
| // | |||
| // /* TODO: resubroutineize? */ | |||
| gf_canon(out); | |||
| int i, k=0, bits=0; | |||
| int k=0, bits=0; | |||
| decaf_dword_t buf=0; | |||
| for (i=0; i<DECAF_448_LIMBS; i++) { | |||
| buf |= (decaf_dword_t)out[i]<<bits; | |||
| @@ -933,7 +936,7 @@ decaf_bool_t decaf_448_direct_scalarmul ( | |||
| scaled[k++]=buf; | |||
| } | |||
| } | |||
| return succ; | |||
| } | |||