void eb_mul_sim_gen(eb_t r, const bn_t k, const eb_t q, const bn_t m) { eb_t g; eb_null(g); if (bn_is_zero(k)) { eb_mul(r, q, m); return; } if (bn_is_zero(m) || eb_is_infty(q)) { eb_mul_gen(r, k); return; } TRY { eb_new(g); eb_curve_get_gen(g); #if defined(EB_KBLTZ) #if EB_SIM == INTER && EB_FIX == LWNAF && defined(EB_PRECO) if (eb_curve_is_kbltz()) { eb_mul_sim_kbltz(r, g, k, q, m, eb_curve_get_tab()); } #else if (eb_curve_is_kbltz()) { eb_mul_sim(r, g, k, q, m); } #endif #endif #if defined(EB_PLAIN) #if EB_SIM == INTER && EB_FIX == LWNAF && defined(EB_PRECO) if (!eb_curve_is_kbltz()) { eb_mul_sim_plain(r, g, k, q, m, eb_curve_get_tab()); } #else if (!eb_curve_is_kbltz()) { eb_mul_sim(r, g, k, q, m); } #endif #endif } CATCH_ANY { THROW(ERR_CAUGHT); } FINALLY { eb_free(g); } }
void eb_rand(eb_t p) { bn_t n, k; bn_null(n); bn_null(k); TRY { bn_new(k); bn_new(n); eb_curve_get_ord(n); bn_rand(k, BN_POS, bn_bits(n)); bn_mod(k, k, n); eb_mul_gen(p, k); } CATCH_ANY { THROW(ERR_CAUGHT); } FINALLY { bn_free(k); bn_free(n); } }