/** @brief Decaf global constant table precomputation. */ #define _XOPEN_SOURCE 600 /* for posix_memalign */ #include #include #include "field.h" #include "f_field.h" #include "decaf.h" #define API_NS(_id) $(c_ns)_##_id static const unsigned char base_point_ser_for_pregen[SER_BYTES] = { $(ser(msqrt(mont_base,modulus),8)) }; /* To satisfy linker. */ const gf API_NS(precomputed_base_as_fe)[1]; const API_NS(point_t) API_NS(point_base); struct niels_s; const gf_s *API_NS(precomputed_wnaf_as_fe); extern const size_t API_NS(sizeof_precomputed_wnafs); void API_NS(precompute_wnafs) ( struct niels_s *out, const API_NS(point_t) base ); static void field_print(const gf f) { /* UNIFY */ unsigned char ser[X_SER_BYTES]; gf_serialize(ser,f,1); int b=0, i, comma=0; unsigned long long limb = 0; printf("{FIELD_LITERAL("); for (i=0; i= GF_LIT_LIMB_BITS || i == SER_BYTES-1) { limb &= (1ull<>(8-b); } } printf(")}"); assert(b<8); } 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 != DECAF_SUCCESS) return 1; API_NS(precomputed_s) *pre; ret = posix_memalign((void**)&pre, API_NS(alignof_precomputed_s), API_NS(sizeof_precomputed_s)); if (ret || !pre) return 1; API_NS(precompute)(pre, real_point_base); struct niels_s *preWnaf; ret = posix_memalign((void**)&preWnaf, API_NS(alignof_precomputed_s), API_NS(sizeof_precomputed_wnafs)); if (ret || !preWnaf) return 1; API_NS(precompute_wnafs)(preWnaf, real_point_base); const gf_s *output; unsigned i; printf("/** @warning: this file was automatically generated. */\n"); printf("#include \"field.h\"\n\n"); printf("#include \n\n"); printf("#define API_NS(_id) $(c_ns)_##_id\n"); output = (const gf_s *)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(gf)) { if (i) printf(",\n "); field_print(output++); } printf("\n}};\n"); output = (const gf_s *)pre; printf("const gf API_NS(precomputed_base_as_fe)[%d]\n", (int)(API_NS(sizeof_precomputed_s) / sizeof(gf))); printf("__attribute__((aligned(%d),visibility(\"hidden\"))) = {\n ", (int)API_NS(alignof_precomputed_s)); for (i=0; i < API_NS(sizeof_precomputed_s); i+=sizeof(gf)) { if (i) printf(",\n "); field_print(output++); } printf("\n};\n"); output = (const gf_s *)preWnaf; printf("const gf API_NS(precomputed_wnaf_as_fe)[%d]\n", (int)(API_NS(sizeof_precomputed_wnafs) / sizeof(gf))); printf("__attribute__((aligned(%d),visibility(\"hidden\"))) = {\n ", (int)API_NS(alignof_precomputed_s)); for (i=0; i < API_NS(sizeof_precomputed_wnafs); i+=sizeof(gf)) { if (i) printf(",\n "); field_print(output++); } printf("\n};\n"); return 0; }