7 #ifndef SECP256K1_GROUP_IMPL_H 8 #define SECP256K1_GROUP_IMPL_H 23 #if defined(EXHAUSTIVE_TEST_ORDER) 24 # if EXHAUSTIVE_TEST_ORDER == 13 26 0xc3459c3d, 0x35326167, 0xcd86cce8, 0x07a2417f,
27 0x5b8bd567, 0xde8538ee, 0x0d507b0c, 0xd128f5bb,
28 0x8e467fec, 0xcd30000a, 0x6cc1184e, 0x25d382c2,
29 0xa2f4494e, 0x2fbe9abc, 0x8b64abac, 0xd005fb24
32 0x3d3486b2, 0x159a9ca5, 0xc75638be, 0xb23a69bc,
33 0x946a45ab, 0x24801247, 0xb4ed2b8e, 0x26b6a417
35 # elif EXHAUSTIVE_TEST_ORDER == 199 37 0x226e653f, 0xc8df7744, 0x9bacbf12, 0x7d1dcbf9,
38 0x87f05b2a, 0xe7edbd28, 0x1f564575, 0xc48dcf18,
39 0xa13872c2, 0xe933bb17, 0x5d9ffd5b, 0xb5b6e10c,
40 0x57fe3c00, 0xbaaaa15a, 0xe003ec3e, 0x9c269bae
43 0x2cca28fa, 0xfc614b80, 0x2a3db42b, 0x00ba00b1,
44 0xbea8d943, 0xdace9ab2, 0x9536daea, 0x0074defb
47 # error No known generator for the specified exhaustive test group order. 54 0x79BE667EUL, 0xF9DCBBACUL, 0x55A06295UL, 0xCE870B07UL,
55 0x029BFCDBUL, 0x2DCE28D9UL, 0x59F2815BUL, 0x16F81798UL,
56 0x483ADA77UL, 0x26A3C465UL, 0x5DA4FBFCUL, 0x0E1108A8UL,
57 0xFD17B448UL, 0xA6855419UL, 0x9C47D08FUL, 0xFB10D4B8UL
121 size_t last_i = SIZE_MAX;
123 for (i = 0; i < len; i++) {
124 if (!a[i].infinity) {
126 if (last_i == SIZE_MAX) {
134 if (last_i == SIZE_MAX) {
142 if (!a[i].infinity) {
151 for (i = 0; i < len; i++) {
153 if (!a[i].infinity) {
337 secp256k1_fe z22, z12, u1, u2, s1, s2, h, i, i2, h2, h3, t;
390 secp256k1_fe z12, u1, u2, s1, s2, h, i, i2, h2, h3, t;
439 secp256k1_fe az, z12, u1, u2, s1, s2, h, i, i2, h2, h3, t;
497 secp256k1_fe zz, u1, u2, s1, s2, t, tt, m, n, q, rr;
499 int infinity, degenerate;
651 0x7ae96a2bul, 0x657c0710ul, 0x6e64479eul, 0xac3434e9ul,
652 0x9cf04975ul, 0x12f58995ul, 0xc1396c28ul, 0x719501eeul
673 #ifdef EXHAUSTIVE_TEST_ORDER 679 for (i = 0; i < 32; ++i) {
#define VERIFY_CHECK(cond)
static int secp256k1_fe_is_zero(const secp256k1_fe *a)
Verify whether a field element is zero.
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 void secp256k1_fe_normalize_var(secp256k1_fe *r)
Normalize a field element, without constant-time guarantee.
static void secp256k1_gej_rescale(secp256k1_gej *r, const secp256k1_fe *s)
static void secp256k1_ge_set_gej_var(secp256k1_ge *r, secp256k1_gej *a)
static void secp256k1_ge_neg(secp256k1_ge *r, const secp256k1_ge *a)
static void secp256k1_gej_double_var(secp256k1_gej *r, const secp256k1_gej *a, secp256k1_fe *rzr)
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 void secp256k1_fe_from_storage(secp256k1_fe *r, const secp256k1_fe_storage *a)
Convert a field element back from the storage type.
static void secp256k1_gej_add_ge_var(secp256k1_gej *r, const secp256k1_gej *a, const secp256k1_ge *b, secp256k1_fe *rzr)
static void secp256k1_gej_clear(secp256k1_gej *r)
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.
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_ge_set_gej(secp256k1_ge *r, secp256k1_gej *a)
A group element of the secp256k1 curve, in jacobian coordinates.
static void secp256k1_fe_set_int(secp256k1_fe *r, int a)
Set a field element equal to a small integer.
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_gej_has_quad_y_var(const secp256k1_gej *a)
#define SECP256K1_FE_CONST(d7, d6, d5, d4, d3, d2, d1, d0)
static void secp256k1_fe_clear(secp256k1_fe *a)
Sets a field element equal to zero, initializing all fields.
static void secp256k1_fe_add(secp256k1_fe *r, const secp256k1_fe *a)
Adds a field element to another.
static void secp256k1_fe_mul_int(secp256k1_fe *r, int a)
Multiplies the passed field element with a small integer constant.
static void secp256k1_gej_add_ge(secp256k1_gej *r, const secp256k1_gej *a, const secp256k1_ge *b)
static int secp256k1_ge_is_infinity(const secp256k1_ge *a)
static int secp256k1_fe_is_odd(const secp256k1_fe *a)
Check the "oddness" of a field element.
static void secp256k1_gej_set_ge(secp256k1_gej *r, const secp256k1_ge *a)
static int secp256k1_gej_eq_x_var(const secp256k1_fe *x, const secp256k1_gej *a)
static int secp256k1_ge_is_in_correct_subgroup(const secp256k1_ge *ge)
static const secp256k1_ge secp256k1_ge_const_g
Generator for secp256k1, value 'g' defined in "Standards for Efficient Cryptography" (SEC2) 2...
static void secp256k1_ge_from_storage(secp256k1_ge *r, const secp256k1_ge_storage *a)
static void secp256k1_ge_set_xy(secp256k1_ge *r, const secp256k1_fe *x, const secp256k1_fe *y)
static void secp256k1_gej_set_infinity(secp256k1_gej *r)
static void secp256k1_gej_neg(secp256k1_gej *r, const secp256k1_gej *a)
static int secp256k1_ge_set_xquad(secp256k1_ge *r, const secp256k1_fe *x)
static int secp256k1_fe_is_quad_var(const secp256k1_fe *a)
Checks whether a field element is a quadratic residue.
static void secp256k1_ge_mul_lambda(secp256k1_ge *r, const secp256k1_ge *a)
static void secp256k1_ge_set_all_gej_var(secp256k1_ge *r, const secp256k1_gej *a, size_t len)
static int secp256k1_ge_set_xo_var(secp256k1_ge *r, const secp256k1_fe *x, int odd)
A group element of the secp256k1 curve, in affine coordinates.
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_normalizes_to_zero(secp256k1_fe *r)
Verify whether a field element represents zero i.e.
static void secp256k1_ge_set_infinity(secp256k1_ge *r)
static void secp256k1_fe_sqr(secp256k1_fe *r, const secp256k1_fe *a)
Sets a field element to be the square of another.
#define SECP256K1_GE_CONST(a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p)
static const secp256k1_fe secp256k1_fe_const_b
static SECP256K1_INLINE void secp256k1_ge_storage_cmov(secp256k1_ge_storage *r, const secp256k1_ge_storage *a, int flag)
static void secp256k1_gej_add_zinv_var(secp256k1_gej *r, const secp256k1_gej *a, const secp256k1_ge *b, const secp256k1_fe *bzinv)
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 void secp256k1_ge_to_storage(secp256k1_ge_storage *r, const secp256k1_ge *a)
#define EXHAUSTIVE_TEST_ORDER
static int secp256k1_gej_is_infinity(const secp256k1_gej *a)
static void secp256k1_ge_set_gej_zinv(secp256k1_ge *r, const secp256k1_gej *a, const secp256k1_fe *zi)
static SECP256K1_INLINE void secp256k1_gej_double(secp256k1_gej *r, const secp256k1_gej *a)
static void secp256k1_fe_normalize(secp256k1_fe *r)
Field element module.
static int secp256k1_ge_is_valid_var(const secp256k1_ge *a)
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 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_inv_var(secp256k1_fe *r, const secp256k1_fe *a)
Potentially faster version of secp256k1_fe_inv, without constant-time guarantee.
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_gej_add_var(secp256k1_gej *r, const secp256k1_gej *a, const secp256k1_gej *b, secp256k1_fe *rzr)
static void secp256k1_ge_clear(secp256k1_ge *r)
static int secp256k1_fe_normalizes_to_zero_var(secp256k1_fe *r)
Verify whether a field element represents zero i.e.