@@ -67,24 +67,20 @@ static const decaf_448_scalar_t decaf_448_scalar_r2 = {{{ | |||
static const decaf_word_t DECAF_MONTGOMERY_FACTOR = (decaf_word_t)(0x3bd440fae918bc5ull); | |||
/** base = twist of Goldilocks base point (~,19). */ | |||
#define FIELD_LITERAL(a,b,c,d,e,f,g,h) {{LIMB(a),LIMB(b),LIMB(c),LIMB(d),LIMB(e),LIMB(f),LIMB(g),LIMB(h)}} | |||
const decaf_448_point_t decaf_448_point_base = {{ | |||
{{{ LIMB(0xb39a2d57e08c7b),LIMB(0xb38639c75ff281), | |||
LIMB(0x2ec981082b3288),LIMB(0x99fe8607e5237c), | |||
LIMB(0x0e33fbb1fadd1f),LIMB(0xe714f67055eb4a), | |||
LIMB(0xc9ae06d64067dd),LIMB(0xf7be45054760fa) }}}, | |||
{{{ LIMB(0xbd8715f551617f),LIMB(0x8c17fbeca8f5fc), | |||
LIMB(0xaae0eec209c06f),LIMB(0xce41ad80cbe6b8), | |||
LIMB(0xdf360b5c828c00),LIMB(0xaf25b6bbb40e3b), | |||
LIMB(0x8ed37f0ce4ed31),LIMB(0x72a1c3214557b9) }}}, | |||
{{{ 1 }}}, | |||
{{{ LIMB(0x97ca9c8ed8bde9),LIMB(0xf0b780da83304c), | |||
LIMB(0x0d79c0a7729a69),LIMB(0xc18d3f24aebc1c), | |||
LIMB(0x1fbb5389b3fda5),LIMB(0xbb24f674635948), | |||
LIMB(0x723a55709a3983),LIMB(0xe1c0107a823dd4) }}} | |||
{FIELD_LITERAL(0x00fffffffffffffe,0x00ffffffffffffff,0x00ffffffffffffff,0x00ffffffffffffff, | |||
0x0000000000000003,0x0000000000000000,0x0000000000000000,0x0000000000000000)}, | |||
{FIELD_LITERAL(0x0081e6d37f752992,0x003078ead1c28721,0x00135cfd2394666c,0x0041149c50506061, | |||
0x0031d30e4f5490b3,0x00902014990dc141,0x0052341b04c1e328,0x0014237853c10a1b)}, | |||
{FIELD_LITERAL(0x00fffffffffffffb,0x00ffffffffffffff,0x00ffffffffffffff,0x00ffffffffffffff, | |||
0x00fffffffffffffe,0x00ffffffffffffff,0x00ffffffffffffff,0x00ffffffffffffff)}, | |||
{FIELD_LITERAL(0x008f205b70660415,0x00881c60cfd3824f,0x00377a638d08500d,0x008c66d5d4672615, | |||
0x00e52fa558e08e13,0x0087770ae1b6983d,0x004388f55a0aa7ff,0x00b4d9a785cf1a91)} | |||
}}; | |||
struct decaf_448_precomputed_s { decaf_448_point_t p[1]; }; | |||
/* FIXME: restore */ | |||
@@ -56,50 +56,17 @@ static const scalar_t sc_p = {{{ | |||
SC_LIMB(0xffffffffffffffff), | |||
SC_LIMB(0x3fffffffffffffff) | |||
}}}; | |||
const scalar_t API_NS(scalar_one) = {{{1}}}, API_NS(scalar_zero) = {{{0}}}; | |||
static const scalar_t sc_r2 = {{{ | |||
SC_LIMB(0xe3539257049b9b60), | |||
SC_LIMB(0x7af32c4bc1b195d9), | |||
SC_LIMB(0x0d66de2388ea1859), | |||
SC_LIMB(0xae17cf725ee4d838), | |||
SC_LIMB(0x1a9cc14ba3c47c44), | |||
SC_LIMB(0x2052bcb7e4d070af), | |||
SC_LIMB(0x3402a939f823b729) | |||
}}}; | |||
const scalar_t API_NS(scalar_one) = {{{1}}}, API_NS(scalar_zero) = {{{0}}}; | |||
extern const scalar_t sc_r2; | |||
extern const decaf_word_t MONTGOMERY_FACTOR; | |||
static const scalar_t sc_r1 = {{{ | |||
SC_LIMB(0x721cf5b5529eec34), | |||
SC_LIMB(0x7a4cf635c8e9c2ab), | |||
SC_LIMB(0xeec492d944a725bf), | |||
SC_LIMB(0x000000020cd77058), | |||
SC_LIMB(0), | |||
SC_LIMB(0), | |||
SC_LIMB(0) | |||
}}}; | |||
/* sqrt(5) = 2phi-1 from the curve spec. Not exported, but used by pregen tool. */ | |||
const unsigned char base_point_ser_for_pregen[SER_BYTES] = { | |||
-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,1 | |||
}; | |||
static const decaf_word_t MONTGOMERY_FACTOR = (decaf_word_t)(0x3bd440fae918bc5ull); | |||
/** base = twist of Goldilocks base point (~,19). */ | |||
const point_t API_NS(point_base) = {{ | |||
{ FIELD_LITERAL( | |||
0xb39a2d57e08c7b,0xb38639c75ff281, | |||
0x2ec981082b3288,0x99fe8607e5237c, | |||
0x0e33fbb1fadd1f,0xe714f67055eb4a, | |||
0xc9ae06d64067dd,0xf7be45054760fa )}, | |||
{ FIELD_LITERAL( | |||
0xbd8715f551617f,0x8c17fbeca8f5fc, | |||
0xaae0eec209c06f,0xce41ad80cbe6b8, | |||
0xdf360b5c828c00,0xaf25b6bbb40e3b, | |||
0x8ed37f0ce4ed31,0x72a1c3214557b9 )}, | |||
{{{ 1 }}}, | |||
{ FIELD_LITERAL( | |||
0x97ca9c8ed8bde9,0xf0b780da83304c, | |||
0x0d79c0a7729a69,0xc18d3f24aebc1c, | |||
0x1fbb5389b3fda5,0xbb24f674635948, | |||
0x723a55709a3983,0xe1c0107a823dd4 )} | |||
}}; | |||
extern const point_t API_NS(point_base); | |||
/* Projective Niels coordinates */ | |||
typedef struct { gf a, b, c; } niels_s, niels_t[1]; | |||
@@ -651,7 +618,7 @@ decaf_bool_t API_NS(scalar_decode)( | |||
accum = (accum + s->limb[i] - sc_p->limb[i]) >> WBITS; | |||
} | |||
sc_montmul(s,s,sc_r1); /* ham-handed reduce */ | |||
API_NS(scalar_mul)(s,s,API_NS(scalar_one)); /* ham-handed reduce */ | |||
return accum; | |||
} | |||
@@ -706,7 +673,7 @@ void API_NS(scalar_decode_long)( | |||
if (ser_len == sizeof(scalar_t)) { | |||
assert(i==0); | |||
/* ham-handed reduce */ | |||
sc_montmul(s,t1,sc_r1); | |||
API_NS(scalar_mul)(s,t1,API_NS(scalar_one)); | |||
API_NS(scalar_destroy)(t1); | |||
return; | |||
} | |||
@@ -22,6 +22,11 @@ | |||
const field_t 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) sc_r2 = {{{0}}}; | |||
const decaf_word_t MONTGOMERY_FACTOR = 0; | |||
const unsigned char base_point_ser_for_pregen[DECAF_448_SER_BYTES]; | |||
const API_NS(point_t) API_NS(point_base); | |||
struct niels_s; | |||
const field_t *API_NS(precomputed_wnaf_as_fe); | |||
@@ -32,6 +37,7 @@ void API_NS(precompute_wnafs) ( | |||
const API_NS(point_t) base | |||
); | |||
/* TODO: use SC_LIMB? */ | |||
static void scalar_print(const char *name, const API_NS(scalar_t) sc) { | |||
printf("const API_NS(scalar_t) %s = {{{\n", name); | |||
unsigned i; | |||
@@ -68,17 +74,21 @@ static void field_print(const field_t *f) { | |||
int main(int argc, char **argv) { | |||
(void)argc; (void)argv; | |||
API_NS(point_t) real_point_base; | |||
int ret = API_NS(point_decode)(real_point_base,base_point_ser_for_pregen,0); | |||
if (!ret) return 1; | |||
API_NS(precomputed_s) *pre; | |||
int ret = posix_memalign((void**)&pre, API_NS2(alignof,precomputed_s), API_NS2(sizeof,precomputed_s)); | |||
ret = posix_memalign((void**)&pre, API_NS2(alignof,precomputed_s), API_NS2(sizeof,precomputed_s)); | |||
if (ret || !pre) return 1; | |||
API_NS(precompute)(pre, API_NS(point_base)); | |||
API_NS(precompute)(pre, real_point_base); | |||
struct niels_s *preWnaf; | |||
ret = posix_memalign((void**)&preWnaf, API_NS2(alignof,precomputed_s), API_NS2(sizeof,precomputed_wnafs)); | |||
if (ret || !preWnaf) return 1; | |||
API_NS(precompute_wnafs)(preWnaf, API_NS(point_base)); | |||
API_NS(precompute_wnafs)(preWnaf, real_point_base); | |||
const field_t *output = (const field_t *)pre; | |||
const field_t *output; | |||
unsigned i; | |||
printf("/** @warning: this file was automatically generated. */\n"); | |||
@@ -86,6 +96,18 @@ int main(int argc, char **argv) { | |||
printf("#include \"decaf.h\"\n\n"); | |||
printf("#define API_NS(_id) decaf_448_##_id\n"); | |||
printf("#define API_NS2(_pref,_id) _pref##_decaf_448_##_id\n"); | |||
output = (const field_t *)real_point_base; | |||
printf("const API_NS(point_t) API_NS(point_base) = {{\n"); | |||
for (i=0; i < sizeof(API_NS(point_t)); i+=sizeof(field_t)) { | |||
if (i) printf(",\n "); | |||
printf("{"); | |||
field_print(output++); | |||
printf("}"); | |||
} | |||
printf("\n}};\n"); | |||
output = (const field_t *)pre; | |||
printf("const field_t API_NS(precomputed_base_as_fe)[%d]\n", | |||
(int)(API_NS2(sizeof,precomputed_s) / sizeof(field_t))); | |||
printf("__attribute__((aligned(%d),visibility(\"hidden\"))) = {\n ", (int)API_NS2(alignof,precomputed_s)); | |||
@@ -123,5 +145,22 @@ 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("sc_r2", smadj); | |||
API_NS(scalar_sub)(smadj,API_NS(scalar_zero),API_NS(scalar_one)); /* HACK */ | |||
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 MONTGOMERY_FACTOR = (decaf_word_t)0x%016llxull;\n\n", w); | |||
return 0; | |||
} |