| @@ -381,6 +381,7 @@ decaf_bool_t decaf_scalar_eq ( | |||||
| const decaf_point_t decaf_point_identity = {{{0},{1},{1},{0}}}; | const decaf_point_t decaf_point_identity = {{{0},{1},{1},{0}}}; | ||||
| void decaf_point_encode( unsigned char ser[DECAF_SER_BYTES], const decaf_point_t p ) { | void decaf_point_encode( unsigned char ser[DECAF_SER_BYTES], const decaf_point_t p ) { | ||||
| /* Can shave off one mul here; not important but makes consistent with paper */ | |||||
| gf a, b, c, d; | gf a, b, c, d; | ||||
| gf_mlw ( a, p->y, 1-EDWARDS_D ); | gf_mlw ( a, p->y, 1-EDWARDS_D ); | ||||
| gf_mul ( c, a, p->t ); | gf_mul ( c, a, p->t ); | ||||
| @@ -468,8 +469,7 @@ decaf_bool_t decaf_point_decode ( | |||||
| ) { | ) { | ||||
| gf s, a, b, c, d, e; | gf s, a, b, c, d, e; | ||||
| decaf_bool_t succ = gf_deser(s, ser); | decaf_bool_t succ = gf_deser(s, ser); | ||||
| decaf_bool_t zero = gf_eq(s, ZERO); | |||||
| succ &= allow_identity | ~zero; | |||||
| succ &= allow_identity | ~gf_eq(s, ZERO); | |||||
| succ &= ~hibit(s); | succ &= ~hibit(s); | ||||
| gf_sqr ( a, s ); | gf_sqr ( a, s ); | ||||
| gf_sub ( p->z, ONE, a ); | gf_sub ( p->z, ONE, a ); | ||||
| @@ -490,8 +490,9 @@ decaf_bool_t decaf_point_decode ( | |||||
| gf_mul ( a, b, c ); | gf_mul ( a, b, c ); | ||||
| gf_mul ( p->y,a,p->z ); | gf_mul ( p->y,a,p->z ); | ||||
| gf_mul ( p->t,p->x,a ); | gf_mul ( p->t,p->x,a ); | ||||
| p->y[0] -= zero; | |||||
| /* TODO: do something safe if ~succ? */ | |||||
| /* TODO: do something safe if ~succ? | |||||
| * TODO: double-check that this works on identity... | |||||
| */ | |||||
| return succ; | return succ; | ||||
| } | } | ||||