@@ -829,7 +829,6 @@ decaf_bool_t decaf_448_direct_scalarmul ( | |||
gf s0, x0, xa, za, xd, zd, xs, zs; | |||
decaf_bool_t succ = gf_deser ( s0, base ); | |||
succ &= allow_identity |~ gf_eq( s0, ZERO); | |||
succ &= ~hibit(s0); | |||
gf_sqr ( xa, s0 ); | |||
gf_cpy ( x0, xa ); | |||
@@ -874,16 +873,10 @@ decaf_bool_t decaf_448_direct_scalarmul ( | |||
output_zero = gf_eq(xz_d, ZERO); | |||
cond_sel(xz_d, xz_d, ONE, output_zero); /* make xz_d always nonzero */ | |||
zcase = output_zero | gf_eq(xz_a, ZERO); | |||
za_zero = gf_eq(za, ZERO); | |||
cond_sel(zs,zs,s0,zcase); /* zs, but s0 in zcase */ | |||
cond_sel(L3,xd,zd,za_zero); | |||
cond_sel(xs,xs,L3,zcase); /* xs, but zq or qq in zcase */ | |||
/* Curve test in zcase */ | |||
gf_cpy(L0,x0); | |||
gf_add(L0,L0,ONE); | |||
gf_add(L0,x0,ONE); | |||
gf_sqr(L1,L0); | |||
gf_mlw(L0,x0,-4*EDWARDS_D); | |||
gf_add(L1,L1,L0); | |||
@@ -914,18 +907,26 @@ decaf_bool_t decaf_448_direct_scalarmul ( | |||
gf_mul(L2, L1, den); /* L2 = y0 / x0 */ | |||
gf_mul(L1, L0, den); /* L1 = yO / xO */ | |||
sflip = hibit(L1) ^ hibit(L2) ^ za_zero; | |||
cond_sel(L0, xd, zd, sflip); /* L0 = "times" */ | |||
cond_swap(xd, zd, sflip); /* L0 = "times" */ | |||
/* OK, done with y-coordinates */ | |||
/* OK, now correct for swappage */ | |||
gf_add(den,den,den); | |||
/* OK, now correct for swappage, if last was flip, or in zcase */ | |||
/* Possibly den = (den*s0)^2 * xa * za */ | |||
gf_mul(L1,den,s0); | |||
gf_sqr(L2,L1); | |||
gf_mul(L3,L2,xz_a); | |||
cond_sel(den,L1,L3,pflip|zcase); | |||
/* compute the output */ | |||
gf_mul(L1,L0,den); | |||
/* zs*xs, but s0*(xd or zd) in zcase */ | |||
cond_sel(zs,zs,s0,zcase); | |||
cond_sel(xs,xs,xd,zcase); | |||
/* compute the output xd*den*xs*zs or | |||
* den*xd^2*s0 = (oden*s0*xd)^2 * xa * za * s0 | |||
* in zcase */ | |||
gf_mul(L1,xd,den); | |||
gf_mul(L0,xs,zs); | |||
gf_mul(out,L0,L1); | |||
@@ -353,6 +353,9 @@ int test_decaf_evil (void) { | |||
mask_t s_ed = decaf_deserialize_tw_extended(pt_ed,base,-1); | |||
mask_t s_m = decaf_montgomery_ladder(out_m, base, random_scalar, 448); | |||
uint8_t ser_di[56]; | |||
mask_t s_di = decaf_448_direct_scalarmul(ser_di,random_input,(struct decaf_448_scalar_s *)random_scalar,-1,-1); | |||
tw_extensible_a_t work; | |||
convert_tw_affine_to_tw_extensible(work,pt_te); | |||
scalarmul(work, random_scalar); | |||
@@ -391,10 +394,11 @@ int test_decaf_evil (void) { | |||
eq_pos = decaf_448_point_eq(m,decaf_448_point_identity); | |||
if ((care_should && should != s_m) | |||
|| ~s_base || s_e != s_te || s_m != s_te || s_ed != s_te | |||
|| ~s_base || s_e != s_te || s_m != s_te || s_ed != s_te || s_di != s_te | |||
|| (s_te && ~field_eq(out_e,out_m)) | |||
|| (s_ed && ~field_eq(out_e,out_ed)) | |||
|| memcmp(ser_de, ser_ed, 56) | |||
|| (s_te && memcmp(ser_di, ser_ed, 56)) | |||
|| (s_e & ~succ_dec) | |||
|| (s_e & ~decaf_448_point_eq(pt_dec, pt_dec2) | |||
|| (s_e & ~decaf_448_point_valid(pt_dec)) | |||
@@ -409,8 +413,8 @@ int test_decaf_evil (void) { | |||
field_print(" oute", out_e); | |||
field_print(" outE", out_ed); | |||
field_print(" outm", out_m); | |||
printf(" succ: m=%d, e=%d, t=%d, b=%d, T=%d, D=%d, nur=%d, e+=%d, e-=%d, should=%d[%d]\n", | |||
-(int)s_m,-(int)s_e,-(int)s_te,-(int)s_base,-(int)s_ed,-(int)succ_dec, | |||
printf(" succ: m=%d, e=%d, t=%d, di=%d, b=%d, T=%d, D=%d, nur=%d, e+=%d, e-=%d, should=%d[%d]\n", | |||
-(int)s_m,-(int)s_e,-(int)s_te,-(int)s_di,-(int)s_base,-(int)s_ed,-(int)succ_dec, | |||
-(int)succ_nur, -(int)eq_neg, -(int)eq_pos, | |||
-(int)should,-(int)care_should | |||
); | |||