7#ifndef SECP256K1_ECMULT_CONST_IMPL_H
8#define SECP256K1_ECMULT_CONST_IMPL_H
15#if defined(EXHAUSTIVE_TEST_ORDER)
19# if EXHAUSTIVE_TEST_ORDER == 199
20# define ECMULT_CONST_GROUP_SIZE 4
21# elif EXHAUSTIVE_TEST_ORDER == 13
22# define ECMULT_CONST_GROUP_SIZE 3
23# elif EXHAUSTIVE_TEST_ORDER == 7
24# define ECMULT_CONST_GROUP_SIZE 2
26# error "Unknown EXHAUSTIVE_TEST_ORDER"
30# define ECMULT_CONST_GROUP_SIZE 5
33#define ECMULT_CONST_TABLE_SIZE (1L << (ECMULT_CONST_GROUP_SIZE - 1))
34#define ECMULT_CONST_GROUPS ((129 + ECMULT_CONST_GROUP_SIZE - 1) / ECMULT_CONST_GROUP_SIZE)
35#define ECMULT_CONST_BITS (ECMULT_CONST_GROUPS * ECMULT_CONST_GROUP_SIZE)
61#define ECMULT_CONST_TABLE_GET_GE(r,pre,n) do { \
64 volatile unsigned int negative = ((n) >> (ECMULT_CONST_GROUP_SIZE - 1)) ^ 1; \
86 unsigned int index = ((unsigned int)(-negative) ^ n) & ((1U << (ECMULT_CONST_GROUP_SIZE - 1)) - 1U); \
88 VERIFY_CHECK((n) < (1U << ECMULT_CONST_GROUP_SIZE)); \
89 VERIFY_CHECK(index < (1U << (ECMULT_CONST_GROUP_SIZE - 1))); \
92 secp256k1_ge_set_xy((r), &(pre)[m].x, &(pre)[m].y); \
93 for (m = 1; m < ECMULT_CONST_TABLE_SIZE; m++) { \
96 secp256k1_fe_cmov(&(r)->x, &(pre)[m].x, m == index); \
97 secp256k1_fe_cmov(&(r)->y, &(pre)[m].y, m == index); \
99 secp256k1_fe_negate(&neg_y, &(r)->y, 1); \
100 secp256k1_fe_cmov(&(r)->y, &neg_y, negative); \
106#ifdef EXHAUSTIVE_TEST_ORDER
109#elif ECMULT_CONST_BITS == 129
112#elif ECMULT_CONST_BITS == 130
115#elif ECMULT_CONST_BITS == 132
119# error "Unknown ECMULT_CONST_BITS"
200 if (secp256k1_ge_is_infinity(a)) {
201 secp256k1_gej_set_infinity(r);
207 secp256k1_scalar_half(&s, &s);
208 secp256k1_scalar_split_lambda(&v1, &v2, &s);
209 secp256k1_scalar_add(&v1, &v1, &S_OFFSET);
210 secp256k1_scalar_add(&v2, &v2, &S_OFFSET);
214 for (i = 129; i < 256; ++i) {
215 VERIFY_CHECK(secp256k1_scalar_get_bits_limb32(&v1, i, 1) == 0);
216 VERIFY_CHECK(secp256k1_scalar_get_bits_limb32(&v2, i, 1) == 0);
226 secp256k1_gej_set_ge(r, a);
229 secp256k1_ge_mul_lambda(&pre_a_lam[i], &pre_a[i]);
252 secp256k1_gej_set_ge(r, &
t);
256 secp256k1_gej_double(r, r);
258 secp256k1_gej_add_ge(r, r, &
t);
261 secp256k1_gej_add_ge(r, r, &
t);
354 if (!known_on_curve) {
368 if (!known_on_curve) {
382 secp256k1_ge_set_xy(&p, &x, &y);
static int secp256k1_ecmult_const_xonly(secp256k1_fe *r, const secp256k1_fe *n, const secp256k1_fe *d, const secp256k1_scalar *q, int known_on_curve)
static void secp256k1_ecmult_const_odd_multiples_table_globalz(secp256k1_ge *pre, secp256k1_fe *globalz, const secp256k1_gej *a)
Fill a table 'pre' with precomputed odd multiples of a.
static const secp256k1_scalar secp256k1_ecmult_const_K
#define ECMULT_CONST_GROUP_SIZE
static void secp256k1_ecmult_const(secp256k1_gej *r, const secp256k1_ge *a, const secp256k1_scalar *q)
#define ECMULT_CONST_TABLE_GET_GE(r, pre, n)
#define ECMULT_CONST_TABLE_SIZE
#define ECMULT_CONST_GROUPS
#define ECMULT_CONST_BITS
#define secp256k1_fe_mul_int(r, a)
Multiply a field element with a small integer.
#define SECP256K1_FE_VERIFY_MAGNITUDE(a, m)
#define secp256k1_fe_is_square_var
#define secp256k1_fe_normalizes_to_zero
#define secp256k1_fe_add_int
#define SECP256K1_SCALAR_CONST(d7, d6, d5, d4, d3, d2, d1, d0)
#define VERIFY_CHECK(cond)
This field implementation represents the value as 10 uint32_t limbs in base 2^26.
A group element in affine coordinates on the secp256k1 curve, or occasionally on an isomorphic curve ...
A group element of the secp256k1 curve, in jacobian coordinates.
A scalar modulo the group order of the secp256k1 curve.
#define EXHAUSTIVE_TEST_ORDER