@@ -233,7 +233,7 @@ void API_NS(deisogenize) ( | |||
void API_NS(point_encode)( unsigned char ser[SER_BYTES], const point_t p ) { | |||
gf s,ie1,ie2; | |||
API_NS(deisogenize)(s,ie1,ie2,p,0,0,0); | |||
gf_serialize(ser,s,1); | |||
gf_serialize(ser,s); | |||
} | |||
decaf_error_t API_NS(point_decode) ( | |||
@@ -244,7 +244,7 @@ decaf_error_t API_NS(point_decode) ( | |||
gf s, s2, num, tmp; | |||
gf_s *tmp2=s2, *ynum=p->z, *isr=p->x, *den=p->t; | |||
mask_t succ = gf_deserialize(s, ser, 1, 0); | |||
mask_t succ = gf_deserialize(s, ser, 0); | |||
succ &= bool_to_mask(allow_identity) | ~gf_eq(s, ZERO); | |||
succ &= ~gf_lobit(s); | |||
@@ -840,7 +840,7 @@ void API_NS(point_debugging_pscale) ( | |||
) { | |||
gf gfac,tmp; | |||
/* NB this means you'll never pscale by negative numbers for p521 */ | |||
ignore_result(gf_deserialize(gfac,factor,0,0)); | |||
ignore_result(gf_deserialize(gfac,factor,0)); | |||
gf_cond_sel(gfac,gfac,ONE,gf_eq(gfac,ZERO)); | |||
gf_mul(tmp,p->x,gfac); | |||
gf_copy(q->x,tmp); | |||
@@ -1135,7 +1135,7 @@ void API_NS(point_mul_by_ratio_and_encode_like_eddsa) ( | |||
/* Encode */ | |||
enc[DECAF_EDDSA_$(gf_shortname)_PRIVATE_BYTES-1] = 0; | |||
gf_serialize(enc, x, 1); | |||
gf_serialize(enc, x); | |||
enc[DECAF_EDDSA_$(gf_shortname)_PRIVATE_BYTES-1] |= 0x80 & gf_lobit(t); | |||
decaf_bzero(x,sizeof(x)); | |||
@@ -1156,7 +1156,7 @@ decaf_error_t API_NS(point_decode_like_eddsa_and_mul_by_ratio) ( | |||
mask_t low = ~word_is_zero(enc2[DECAF_EDDSA_$(gf_shortname)_PRIVATE_BYTES-1] & 0x80); | |||
enc2[DECAF_EDDSA_$(gf_shortname)_PRIVATE_BYTES-1] &= ~0x80; | |||
mask_t succ = gf_deserialize(p->y, enc2, 1, 0); | |||
mask_t succ = gf_deserialize(p->y, enc2, 0); | |||
#if $(gf_bits % 8) == 0 | |||
succ &= word_is_zero(enc2[DECAF_EDDSA_$(gf_shortname)_PRIVATE_BYTES-1]); | |||
#endif | |||
@@ -1256,7 +1256,7 @@ decaf_error_t decaf_x$(gf_shortname) ( | |||
const uint8_t scalar[X_PRIVATE_BYTES] | |||
) { | |||
gf x1, x2, z2, x3, z3, t1, t2; | |||
ignore_result(gf_deserialize(x1,base,1,0)); | |||
ignore_result(gf_deserialize(x1,base,0)); | |||
gf_copy(x2,ONE); | |||
gf_copy(z2,ZERO); | |||
gf_copy(x3,x1); | |||
@@ -1307,7 +1307,7 @@ decaf_error_t decaf_x$(gf_shortname) ( | |||
gf_cond_swap(z2,z3,swap); | |||
gf_invert(z2,z2,0); | |||
gf_mul(x1,x2,z2); | |||
gf_serialize(out,x1,1); | |||
gf_serialize(out,x1); | |||
mask_t nz = ~gf_eq(x1,ZERO); | |||
decaf_bzero(x1,sizeof(x1)); | |||
@@ -1328,7 +1328,7 @@ void decaf_ed$(gf_shortname)_convert_public_key_to_x$(gf_shortname) ( | |||
) { | |||
gf y; | |||
const uint8_t mask = (uint8_t)(0xFE<<($((gf_bits-1)%8))); | |||
ignore_result(gf_deserialize(y, ed, 1, mask)); | |||
ignore_result(gf_deserialize(y, ed, mask)); | |||
{ | |||
gf n,d; | |||
@@ -1339,7 +1339,7 @@ void decaf_ed$(gf_shortname)_convert_public_key_to_x$(gf_shortname) ( | |||
gf_sub(d, ONE, y); /* d = 1-y */ | |||
gf_invert(d, d, 0); /* d = 1/(1-y) */ | |||
gf_mul(y, n, d); /* u = (y+1)/(1-y) */ | |||
gf_serialize(x,y,1); | |||
gf_serialize(x,y); | |||
#else /* EDDSA_USE_SIGMA_ISOGENY */ | |||
/* u = y^2 * (1-dy^2) / (1-y^2) */ | |||
gf_sqr(n,y); /* y^2*/ | |||
@@ -1349,7 +1349,7 @@ void decaf_ed$(gf_shortname)_convert_public_key_to_x$(gf_shortname) ( | |||
gf_mulw(d,n,EDWARDS_D); /* dy^2*/ | |||
gf_sub(d, ONE, d); /* 1-dy^2*/ | |||
gf_mul(n, y, d); /* y^2 * (1-dy^2) / (1-y^2) */ | |||
gf_serialize(x,n,1); | |||
gf_serialize(x,n); | |||
#endif /* EDDSA_USE_SIGMA_ISOGENY */ | |||
decaf_bzero(y,sizeof(y)); | |||
@@ -1381,7 +1381,7 @@ void API_NS(point_mul_by_ratio_and_encode_like_x$(gf_shortname)) ( | |||
#if IMAGINE_TWIST | |||
gf_sub(q->y,ZERO,q->y); | |||
#endif | |||
gf_serialize(out,q->y,1); | |||
gf_serialize(out,q->y); | |||
API_NS(point_destroy(q)); | |||
} | |||
@@ -27,7 +27,7 @@ void API_NS(precompute_wnafs) ( | |||
); | |||
static void field_print(const gf f) { | |||
unsigned char ser[X_SER_BYTES]; | |||
gf_serialize(ser,f,1); | |||
gf_serialize(ser,f); | |||
int b=0, i, comma=0; | |||
unsigned long long limb = 0; | |||
printf("{FIELD_LITERAL("); | |||
@@ -31,7 +31,7 @@ void API_NS(point_from_hash_nonuniform) ( | |||
) { | |||
gf r0,r,a,b,c,N,e; | |||
const uint8_t mask = (uint8_t)(0xFE<<($((gf_bits-1)%8))); | |||
ignore_result(gf_deserialize(r0,ser,0,mask)); | |||
ignore_result(gf_deserialize(r0,ser,mask)); | |||
gf_strong_reduce(r0); | |||
gf_sqr(a,r0); | |||
gf_mul_qnr(r,a); | |||
@@ -165,11 +165,7 @@ API_NS(invert_elligator_nonuniform) ( | |||
// succ &= ~(is_identity & sgn_ed_T); /* NB: there are no preimages of rotated identity. */ | |||
// #endif | |||
#if $(gf_bits) == 8*SER_BYTES + 1 /* p521 */ | |||
gf_serialize(recovered_hash,b,0); | |||
#else | |||
gf_serialize(recovered_hash,b,1); | |||
#endif | |||
gf_serialize(recovered_hash,b); | |||
#if $(gf_bits%8) | |||
#if COFACTOR==8 | |||
recovered_hash[SER_BYTES-1] ^= (hint>>4)<<$(gf_bits%8); | |||
@@ -22,7 +22,6 @@ typedef struct gf_$(gf_shortname)_s { | |||
#define gf gf_$(gf_shortname)_t | |||
#define gf_s gf_$(gf_shortname)_s | |||
#define gf_eq gf_$(gf_shortname)_eq | |||
#define gf_hibit gf_$(gf_shortname)_hibit | |||
#define gf_lobit gf_$(gf_shortname)_lobit | |||
#define gf_copy gf_$(gf_shortname)_copy | |||
#define gf_add gf_$(gf_shortname)_add | |||
@@ -68,10 +67,9 @@ void gf_sqr (gf_s *__restrict__ out, const gf a); | |||
mask_t gf_isr(gf a, const gf x); /** a^2 x = 1, QNR, or 0 if x=0. Return true if successful */ | |||
mask_t gf_eq (const gf x, const gf y); | |||
mask_t gf_lobit (const gf x); | |||
mask_t gf_hibit (const gf x); | |||
void gf_serialize (uint8_t *serial, const gf x,int with_highbit); | |||
mask_t gf_deserialize (gf x, const uint8_t serial[SER_BYTES],int with_hibit,uint8_t hi_nmask); | |||
void gf_serialize (uint8_t *serial, const gf x); | |||
mask_t gf_deserialize (gf x, const uint8_t serial[SER_BYTES],uint8_t hi_nmask); | |||
#ifdef __cplusplus | |||
@@ -13,15 +13,14 @@ static const gf MODULUS = {FIELD_LITERAL( | |||
#endif | |||
/** Serialize to wire format. */ | |||
void gf_serialize (uint8_t serial[SER_BYTES], const gf x, int with_hibit) { | |||
void gf_serialize (uint8_t serial[SER_BYTES], const gf x) { | |||
gf red; | |||
gf_copy(red, x); | |||
gf_strong_reduce(red); | |||
if (!with_hibit) { assert(gf_hibit(red) == 0); } | |||
unsigned int j=0, fill=0; | |||
dword_t buffer = 0; | |||
UNROLL for (unsigned int i=0; i<(with_hibit ? X_SER_BYTES : SER_BYTES); i++) { | |||
UNROLL for (unsigned int i=0; i<SER_BYTES; i++) { | |||
if (fill < 8 && j < NLIMBS) { | |||
buffer |= ((dword_t)red->limb[LIMBPERM(j)]) << fill; | |||
fill += LIMB_PLACE_VALUE(LIMBPERM(j)); | |||
@@ -33,14 +32,6 @@ void gf_serialize (uint8_t serial[SER_BYTES], const gf x, int with_hibit) { | |||
} | |||
} | |||
/** Return high bit of x = low bit of 2x mod p */ | |||
mask_t gf_hibit(const gf x) { | |||
gf y; | |||
gf_add(y,x,x); | |||
gf_strong_reduce(y); | |||
return -(y->limb[0]&1); | |||
} | |||
/** Return high bit of x = low bit of 2x mod p */ | |||
mask_t gf_lobit(const gf x) { | |||
gf y; | |||
@@ -50,15 +41,14 @@ mask_t gf_lobit(const gf x) { | |||
} | |||
/** Deserialize from wire format; return -1 on success and 0 on failure. */ | |||
mask_t gf_deserialize (gf x, const uint8_t serial[SER_BYTES], int with_hibit, uint8_t hi_nmask) { | |||
mask_t gf_deserialize (gf x, const uint8_t serial[SER_BYTES], uint8_t hi_nmask) { | |||
unsigned int j=0, fill=0; | |||
dword_t buffer = 0; | |||
dsword_t scarry = 0; | |||
const unsigned nbytes = with_hibit ? X_SER_BYTES : SER_BYTES; | |||
UNROLL for (unsigned int i=0; i<NLIMBS; i++) { | |||
UNROLL while (fill < LIMB_PLACE_VALUE(LIMBPERM(i)) && j < nbytes) { | |||
UNROLL while (fill < LIMB_PLACE_VALUE(LIMBPERM(i)) && j < SER_BYTES) { | |||
uint8_t sj = serial[j]; | |||
if (j==nbytes-1) sj &= ~hi_nmask; | |||
if (j==SER_BYTES-1) sj &= ~hi_nmask; | |||
buffer |= ((dword_t)sj) << fill; | |||
fill += 8; | |||
j++; | |||
@@ -68,8 +58,7 @@ mask_t gf_deserialize (gf x, const uint8_t serial[SER_BYTES], int with_hibit, ui | |||
buffer >>= LIMB_PLACE_VALUE(LIMBPERM(i)); | |||
scarry = (scarry + x->limb[LIMBPERM(i)] - MODULUS->limb[LIMBPERM(i)]) >> (8*sizeof(word_t)); | |||
} | |||
mask_t succ = with_hibit ? -(mask_t)1 : ~gf_hibit(x); | |||
return succ & word_is_zero(buffer) & ~word_is_zero(scarry); | |||
return word_is_zero(buffer) & ~word_is_zero(scarry); | |||
} | |||
/** Reduce to canonical form. */ | |||