7#ifndef SECP256K1_GROUP_IMPL_H
8#define SECP256K1_GROUP_IMPL_H
22#if defined(EXHAUSTIVE_TEST_ORDER)
23# if EXHAUSTIVE_TEST_ORDER == 13
25 0xc3459c3d, 0x35326167, 0xcd86cce8, 0x07a2417f,
26 0x5b8bd567, 0xde8538ee, 0x0d507b0c, 0xd128f5bb,
27 0x8e467fec, 0xcd30000a, 0x6cc1184e, 0x25d382c2,
28 0xa2f4494e, 0x2fbe9abc, 0x8b64abac, 0xd005fb24
31 0x3d3486b2, 0x159a9ca5, 0xc75638be, 0xb23a69bc,
32 0x946a45ab, 0x24801247, 0xb4ed2b8e, 0x26b6a417
34# elif EXHAUSTIVE_TEST_ORDER == 199
36 0x226e653f, 0xc8df7744, 0x9bacbf12, 0x7d1dcbf9,
37 0x87f05b2a, 0xe7edbd28, 0x1f564575, 0xc48dcf18,
38 0xa13872c2, 0xe933bb17, 0x5d9ffd5b, 0xb5b6e10c,
39 0x57fe3c00, 0xbaaaa15a, 0xe003ec3e, 0x9c269bae
42 0x2cca28fa, 0xfc614b80, 0x2a3db42b, 0x00ba00b1,
43 0xbea8d943, 0xdace9ab2, 0x9536daea, 0x0074defb
46# error No known generator for the specified exhaustive test group order.
53 0x79BE667EUL, 0xF9DCBBACUL, 0x55A06295UL, 0xCE870B07UL,
54 0x029BFCDBUL, 0x2DCE28D9UL, 0x59F2815BUL, 0x16F81798UL,
55 0x483ADA77UL, 0x26A3C465UL, 0x5DA4FBFCUL, 0x0E1108A8UL,
56 0xFD17B448UL, 0xA6855419UL, 0x9C47D08FUL, 0xFB10D4B8UL
120 size_t last_i = SIZE_MAX;
122 for (i = 0; i < len; i++) {
123 if (!a[i].infinity) {
125 if (last_i == SIZE_MAX) {
133 if (last_i == SIZE_MAX) {
141 if (!a[i].infinity) {
150 for (i = 0; i < len; i++) {
152 if (!a[i].infinity) {
336 secp256k1_fe z22, z12, u1, u2, s1, s2, h, i, i2, h2, h3, t;
389 secp256k1_fe z12, u1, u2, s1, s2, h, i, i2, h2, h3, t;
438 secp256k1_fe az, z12, u1, u2, s1, s2, h, i, i2, h2, h3, t;
496 secp256k1_fe zz, u1, u2, s1, s2, t, tt, m, n, q, rr;
498 int infinity, degenerate;
650 0x7ae96a2bul, 0x657c0710ul, 0x6e64479eul, 0xac3434e9ul,
651 0x9cf04975ul, 0x12f58995ul, 0xc1396c28ul, 0x719501eeul
672#ifdef EXHAUSTIVE_TEST_ORDER
678 for (i = 0; i < 32; ++i) {
static void secp256k1_fe_inv_var(secp256k1_fe *r, const secp256k1_fe *a)
Potentially faster version of secp256k1_fe_inv, without constant-time guarantee.
static void secp256k1_fe_normalize_weak(secp256k1_fe *r)
Weakly normalize a field element: reduce its magnitude to 1, but don't fully normalize.
static int secp256k1_fe_is_quad_var(const secp256k1_fe *a)
Checks whether a field element is a quadratic residue.
static int secp256k1_fe_equal_var(const secp256k1_fe *a, const secp256k1_fe *b)
Same as secp256k1_fe_equal, but may be variable time.
static int secp256k1_fe_sqrt(secp256k1_fe *r, const secp256k1_fe *a)
If a has a square root, it is computed in r and 1 is returned.
static void secp256k1_fe_normalize_var(secp256k1_fe *r)
Normalize a field element, without constant-time guarantee.
static void secp256k1_fe_clear(secp256k1_fe *a)
Sets a field element equal to zero, initializing all fields.
static void secp256k1_fe_inv(secp256k1_fe *r, const secp256k1_fe *a)
Sets a field element to be the (modular) inverse of another.
static void secp256k1_fe_cmov(secp256k1_fe *r, const secp256k1_fe *a, int flag)
If flag is true, set *r equal to *a; otherwise leave it.
static void secp256k1_fe_mul_int(secp256k1_fe *r, int a)
Multiplies the passed field element with a small integer constant.
static void secp256k1_fe_negate(secp256k1_fe *r, const secp256k1_fe *a, int m)
Set a field element equal to the additive inverse of another.
static int secp256k1_fe_is_odd(const secp256k1_fe *a)
Check the "oddness" of a field element.
static void secp256k1_fe_set_int(secp256k1_fe *r, int a)
Set a field element equal to a small integer.
static void secp256k1_fe_mul(secp256k1_fe *r, const secp256k1_fe *a, const secp256k1_fe *SECP256K1_RESTRICT b)
Sets a field element to be the product of two others.
static int secp256k1_fe_is_zero(const secp256k1_fe *a)
Verify whether a field element is zero.
static void secp256k1_fe_from_storage(secp256k1_fe *r, const secp256k1_fe_storage *a)
Convert a field element back from the storage type.
static int secp256k1_fe_normalizes_to_zero_var(secp256k1_fe *r)
Verify whether a field element represents zero i.e.
static void secp256k1_fe_sqr(secp256k1_fe *r, const secp256k1_fe *a)
Sets a field element to be the square of another.
static void secp256k1_fe_add(secp256k1_fe *r, const secp256k1_fe *a)
Adds a field element to another.
static void secp256k1_fe_normalize(secp256k1_fe *r)
Field element module.
static void secp256k1_fe_to_storage(secp256k1_fe_storage *r, const secp256k1_fe *a)
Convert a field element to the storage type.
static int secp256k1_fe_normalizes_to_zero(secp256k1_fe *r)
Verify whether a field element represents zero i.e.
static void secp256k1_fe_storage_cmov(secp256k1_fe_storage *r, const secp256k1_fe_storage *a, int flag)
If flag is true, set *r equal to *a; otherwise leave it.
#define SECP256K1_FE_CONST(d7, d6, d5, d4, d3, d2, d1, d0)
#define SECP256K1_GE_CONST(a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p)
static void secp256k1_gej_double_var(secp256k1_gej *r, const secp256k1_gej *a, secp256k1_fe *rzr)
static void secp256k1_gej_add_zinv_var(secp256k1_gej *r, const secp256k1_gej *a, const secp256k1_ge *b, const secp256k1_fe *bzinv)
static void secp256k1_gej_clear(secp256k1_gej *r)
static void secp256k1_ge_mul_lambda(secp256k1_ge *r, const secp256k1_ge *a)
static void secp256k1_gej_set_infinity(secp256k1_gej *r)
static int secp256k1_gej_is_infinity(const secp256k1_gej *a)
static void secp256k1_ge_clear(secp256k1_ge *r)
static void secp256k1_ge_set_xy(secp256k1_ge *r, const secp256k1_fe *x, const secp256k1_fe *y)
static int secp256k1_ge_set_xo_var(secp256k1_ge *r, const secp256k1_fe *x, int odd)
static void secp256k1_gej_add_ge_var(secp256k1_gej *r, const secp256k1_gej *a, const secp256k1_ge *b, secp256k1_fe *rzr)
static void secp256k1_ge_globalz_set_table_gej(size_t len, secp256k1_ge *r, secp256k1_fe *globalz, const secp256k1_gej *a, const secp256k1_fe *zr)
static void secp256k1_gej_add_ge(secp256k1_gej *r, const secp256k1_gej *a, const secp256k1_ge *b)
static void secp256k1_ge_set_gej_zinv(secp256k1_ge *r, const secp256k1_gej *a, const secp256k1_fe *zi)
static int secp256k1_ge_is_valid_var(const secp256k1_ge *a)
static void secp256k1_ge_from_storage(secp256k1_ge *r, const secp256k1_ge_storage *a)
static void secp256k1_gej_add_var(secp256k1_gej *r, const secp256k1_gej *a, const secp256k1_gej *b, secp256k1_fe *rzr)
static void secp256k1_gej_rescale(secp256k1_gej *r, const secp256k1_fe *s)
static int secp256k1_ge_set_xquad(secp256k1_ge *r, const secp256k1_fe *x)
static int secp256k1_gej_eq_x_var(const secp256k1_fe *x, const secp256k1_gej *a)
static void secp256k1_ge_set_gej(secp256k1_ge *r, secp256k1_gej *a)
static int secp256k1_ge_is_in_correct_subgroup(const secp256k1_ge *ge)
static const secp256k1_fe secp256k1_fe_const_b
static void secp256k1_ge_neg(secp256k1_ge *r, const secp256k1_ge *a)
static const secp256k1_ge secp256k1_ge_const_g
Generator for secp256k1, value 'g' defined in "Standards for Efficient Cryptography" (SEC2) 2....
static int secp256k1_ge_is_infinity(const secp256k1_ge *a)
static void secp256k1_ge_set_infinity(secp256k1_ge *r)
static void secp256k1_ge_set_all_gej_var(secp256k1_ge *r, const secp256k1_gej *a, size_t len)
static void secp256k1_gej_set_ge(secp256k1_gej *r, const secp256k1_ge *a)
static void secp256k1_ge_to_storage(secp256k1_ge_storage *r, const secp256k1_ge *a)
static SECP256K1_INLINE void secp256k1_ge_storage_cmov(secp256k1_ge_storage *r, const secp256k1_ge_storage *a, int flag)
static void secp256k1_ge_set_gej_var(secp256k1_ge *r, secp256k1_gej *a)
static int secp256k1_gej_has_quad_y_var(const secp256k1_gej *a)
static void secp256k1_gej_neg(secp256k1_gej *r, const secp256k1_gej *a)
static SECP256K1_INLINE void secp256k1_gej_double(secp256k1_gej *r, const secp256k1_gej *a)
#define VERIFY_CHECK(cond)
A group element of the secp256k1 curve, in affine coordinates.
A group element of the secp256k1 curve, in jacobian coordinates.
#define EXHAUSTIVE_TEST_ORDER