7 #ifndef _SECP256K1_ECMULT_GEN_IMPL_H_
8 #define _SECP256K1_ECMULT_GEN_IMPL_H_
32 static void secp256k1_ecmult_gen_start(
void) {
33 if (secp256k1_ecmult_gen_consts != NULL)
46 static const unsigned char nums_b32[32] =
"The scalar for this x is unknown";
51 secp256k1_gej_set_ge(&nums_gej, &nums_ge);
53 secp256k1_gej_add_ge_var(&nums_gej, &nums_gej, g);
62 for (
int j=0; j<64; j++) {
64 precj[j*16] = numsbase;
65 for (
int i=1; i<16; i++) {
66 secp256k1_gej_add_var(&precj[j*16 + i], &precj[j*16 + i - 1], &gbase);
69 for (
int i=0; i<4; i++) {
70 secp256k1_gej_double_var(&gbase, &gbase);
73 secp256k1_gej_double_var(&numsbase, &numsbase);
76 secp256k1_gej_neg(&numsbase, &numsbase);
77 secp256k1_gej_add_var(&numsbase, &numsbase, &nums_gej);
80 secp256k1_ge_set_all_gej_var(1024, prec, precj);
82 for (
int j=0; j<64; j++) {
83 for (
int i=0; i<16; i++) {
84 VERIFY_CHECK(!secp256k1_ge_is_infinity(&prec[j*16 + i]));
85 ret->
prec[j][i][0] = prec[j*16 + i].
x;
86 ret->
prec[j][i][1] = prec[j*16 + i].
y;
91 secp256k1_ecmult_gen_consts = ret;
94 static void secp256k1_ecmult_gen_stop(
void) {
95 if (secp256k1_ecmult_gen_consts == NULL)
99 secp256k1_ecmult_gen_consts = NULL;
105 secp256k1_gej_set_infinity(
r);
109 for (
int j=0; j<64; j++) {
110 bits = secp256k1_scalar_get_bits(gn, j * 4, 4);
111 for (
int i=0; i<16; i++) {
112 secp256k1_fe_cmov(&add.
x, &c->
prec[j][i][0], i == bits);
113 secp256k1_fe_cmov(&add.
y, &c->
prec[j][i][1], i == bits);
115 secp256k1_gej_add_ge(
r,
r, &add);
118 secp256k1_ge_clear(&add);