| @@ -74,8 +74,6 @@ def ceil_log2(x): | |||
| for field,data in field_data.iteritems(): | |||
| if "modulus" not in data: | |||
| data["modulus"] = eval(data["gf_desc"].replace("^","**")) | |||
| data["p_mod_8"] = data["modulus"] % 8 | |||
| if "gf_bits" not in data: | |||
| data["gf_bits"] = ceil_log2(data["modulus"]) | |||
| @@ -88,10 +86,6 @@ for field,data in field_data.iteritems(): | |||
| if "x_priv_bits" not in data: | |||
| data["x_priv_bits"] = ceil_log2(data["modulus"]*0.99) # not per curve at least in 7748 | |||
| data["ser_modulus"] = ser(data["modulus"], data["gf_lit_limb_bits"]) | |||
| if data["modulus"] % 4 == 1: data["sqrt_minus_one"] = ser(msqrt(-1,data["modulus"]), data["gf_lit_limb_bits"]) | |||
| else: data["sqrt_minus_one"] = "/* NONE */" | |||
| for curve,data in curve_data.iteritems(): | |||
| for key in field_data[data["field"]]: | |||
| @@ -121,7 +115,6 @@ for curve,data in curve_data.iteritems(): | |||
| data["q"] = (data["modulus"]+1-data["trace"]) // data["cofactor"] | |||
| data["bits"] = ceil_log2(data["modulus"]) | |||
| data["decaf_base"] = ser(msqrt(data["mont_base"],data["modulus"]),8) | |||
| data["scalar_p"] = ser(data["q"],64,"SC_LIMB") | |||
| if data["cofactor"] > 4: data["sqrt_one_minus_d"] = ser(msqrt(1-data["d"],data["modulus"]),data["gf_lit_limb_bits"]) | |||
| else: data["sqrt_one_minus_d"] = "/* NONE */" | |||
| @@ -1,4 +1,5 @@ | |||
| from textwrap import dedent | |||
| from curve_data import field_data,curve_data,ser,msqrt | |||
| import os | |||
| import argparse | |||
| @@ -12,8 +13,6 @@ parser.add_argument('--guard', required = False, default = None, help = "header | |||
| parser.add_argument('files', metavar='file', type=str, nargs='+', help='a list of files to fill') | |||
| args = parser.parse_args() | |||
| from curve_data import field_data,curve_data | |||
| per_map = {"field":field_data, "curve":curve_data, "global":{"global":{}} } | |||
| def redoc(filename,doc,author): | |||
| @@ -51,7 +50,7 @@ def fillin(template,data): | |||
| if template[position] == '(': parens += 1 | |||
| elif template[position] == ')': parens -= 1 | |||
| position += 1 | |||
| ret += str(eval(template[dollars+2:position-1],data)) | |||
| ret += str(eval(template[dollars+2:position-1],{'ser':ser,'msqrt':msqrt},data)) | |||
| author = "Mike Hamburg" # FUTURE | |||
| for name in args.files: | |||
| @@ -10,6 +10,7 @@ | |||
| #include <decaf.h> | |||
| /* Template stuff */ | |||
| #define API_NS(_id) $(c_ns)_##_id | |||
| #define SCALAR_BITS $(C_NS)_SCALAR_BITS | |||
| #define SCALAR_LIMBS $(C_NS)_SCALAR_LIMBS | |||
| @@ -20,7 +21,11 @@ | |||
| #define COFACTOR $(cofactor) | |||
| static const int EDWARDS_D = $(d); | |||
| static const scalar_t sc_p = {{{ $(scalar_p) }}}; | |||
| static const scalar_t sc_p = {{{ $(ser(q,64,"SC_LIMB")) }}}; | |||
| static const scalar_t sc_r2 = {{{ $(ser(((2**128)**((scalar_bits+63)/64))%q,64,"SC_LIMB")) }}}; | |||
| extern const scalar_t API_NS(point_scalarmul_adjustment); /* TODO: auto template these too. */ | |||
| extern const scalar_t API_NS(precomputed_scalarmul_adjustment); | |||
| static const decaf_word_t MONTGOMERY_FACTOR = (decaf_word_t)0x$("%x" % pow(-q,2**64-1,2**64))ull; | |||
| #if COFACTOR==8 | |||
| static const gf SQRT_ONE_MINUS_D = {FIELD_LITERAL( | |||
| @@ -49,8 +54,6 @@ extern const gf SQRT_MINUS_ONE; | |||
| #define WBITS DECAF_WORD_BITS /* NB this may be different from ARCH_WORD_BITS */ | |||
| const scalar_t API_NS(scalar_one) = {{{1}}}, API_NS(scalar_zero) = {{{0}}}; | |||
| extern const scalar_t API_NS(sc_r2); | |||
| extern const decaf_word_t API_NS(MONTGOMERY_FACTOR); | |||
| extern const point_t API_NS(point_base); | |||
| /* Projective Niels coordinates */ | |||
| @@ -220,7 +223,7 @@ sc_montmul ( | |||
| } | |||
| accum[j] = chain; | |||
| mand = accum[0] * API_NS(MONTGOMERY_FACTOR); | |||
| mand = accum[0] * MONTGOMERY_FACTOR; | |||
| chain = 0; | |||
| mier = sc_p->limb; | |||
| for (j=0; j<SCALAR_LIMBS; j++) { | |||
| @@ -243,7 +246,7 @@ void API_NS(scalar_mul) ( | |||
| const scalar_t b | |||
| ) { | |||
| sc_montmul(out,a,b); | |||
| sc_montmul(out,out,API_NS(sc_r2)); | |||
| sc_montmul(out,out,sc_r2); | |||
| } | |||
| /* PERF: could implement this */ | |||
| @@ -263,7 +266,7 @@ decaf_error_t API_NS(scalar_invert) ( | |||
| const int LAST = (1<<SCALAR_WINDOW_BITS)-1; | |||
| /* Precompute precmp = [a^1,a^3,...] */ | |||
| sc_montmul(precmp[0],a,API_NS(sc_r2)); | |||
| sc_montmul(precmp[0],a,sc_r2); | |||
| if (LAST > 0) sc_montmul(precmp[LAST],precmp[0],precmp[0]); | |||
| int i; | |||
| @@ -734,7 +737,7 @@ void API_NS(scalar_decode_long)( | |||
| while (i) { | |||
| i -= SER_BYTES; | |||
| sc_montmul(t1,t1,API_NS(sc_r2)); | |||
| sc_montmul(t1,t1,sc_r2); | |||
| ignore_result( API_NS(scalar_decode)(t2, ser+i) ); | |||
| API_NS(scalar_add)(t1, t1, t2); | |||
| } | |||
| @@ -868,8 +871,6 @@ sub_pniels_from_pt ( | |||
| sub_niels_from_pt( p, pn->n, before_double ); | |||
| } | |||
| extern const scalar_t API_NS(point_scalarmul_adjustment); | |||
| static INLINE void | |||
| constant_time_lookup_xx ( | |||
| void *__restrict__ out_, | |||
| @@ -1477,8 +1478,6 @@ void API_NS(precompute) ( | |||
| decaf_bzero(doubles,sizeof(doubles)); | |||
| } | |||
| extern const scalar_t API_NS(precomputed_scalarmul_adjustment); | |||
| static INLINE void | |||
| constant_time_lookup_xx_niels ( | |||
| niels_s *__restrict__ ni, | |||
| @@ -19,8 +19,6 @@ static const unsigned char base_point_ser_for_pregen[SER_BYTES] = { | |||
| 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(point_scalarmul_adjustment); | |||
| const API_NS(scalar_t) API_NS(sc_r2) = {{{0}}}; | |||
| const decaf_word_t API_NS(MONTGOMERY_FACTOR) = 0; | |||
| const API_NS(point_t) API_NS(point_base); | |||
| const uint8_t API_NS(x_base_point)[X_PUBLIC_BYTES] = {0}; | |||
| @@ -148,23 +146,8 @@ int main(int argc, char **argv) { | |||
| API_NS(scalar_sub)(smadj, smadj, API_NS(scalar_one)); | |||
| scalar_print("API_NS(point_scalarmul_adjustment)", smadj); | |||
| API_NS(scalar_copy)(smadj,API_NS(scalar_one)); | |||
| for (i=0; i<sizeof(API_NS(scalar_t))*8*2; i++) { | |||
| API_NS(scalar_add)(smadj,smadj,smadj); | |||
| } | |||
| scalar_print("API_NS(sc_r2)", smadj); | |||
| API_NS(scalar_sub)(smadj,API_NS(scalar_zero),API_NS(scalar_one)); /* get p-1 */ | |||
| unsigned long long w = 1, plo = smadj->limb[0]+1; | |||
| #if DECAF_WORD_BITS == 32 | |||
| plo |= ((unsigned long long)smadj->limb[1]) << 32; | |||
| #endif | |||
| for (i=0; i<6; i++) { | |||
| w *= w*plo + 2; | |||
| } | |||
| printf("const decaf_word_t API_NS(MONTGOMERY_FACTOR) = (decaf_word_t)0x%016llxull;\n\n", w); | |||
| /* Generate the Montgomery ladder version of the base point */ | |||
| gf base1,base2; | |||
| @@ -74,14 +74,10 @@ mask_t gf_deserialize (gf x, const uint8_t serial[SER_BYTES]); | |||
| #include "f_impl.h" /* Bring in the inline implementations */ | |||
| static const gf MODULUS = {FIELD_LITERAL( | |||
| $(ser_modulus) | |||
| )}; | |||
| #define P_MOD_8 $(p_mod_8) | |||
| #define P_MOD_8 $(modulus % 8) | |||
| #if P_MOD_8 == 5 | |||
| static const gf SQRT_MINUS_ONE = {FIELD_LITERAL( /* TODO make not static */ | |||
| $(sqrt_minus_one) | |||
| $(ser(msqrt(-1,modulus),gf_lit_limb_bits) if modulus % 4 == 1 else "/* NOPE */") | |||
| )}; | |||
| #endif | |||
| @@ -10,6 +10,10 @@ | |||
| #include "field.h" | |||
| static const gf MODULUS = {FIELD_LITERAL( | |||
| $(ser(modulus,gf_lit_limb_bits)) | |||
| )}; | |||
| /** Serialize to wire format. */ | |||
| void gf_serialize (uint8_t serial[SER_BYTES], const gf x) { | |||
| gf red; | |||