7 #ifndef SECP256K1_FIELD_IMPL_H 8 #define SECP256K1_FIELD_IMPL_H 10 #if defined HAVE_CONFIG_H 11 #include "libsecp256k1-config.h" 17 #if defined(SECP256K1_WIDEMUL_INT128) 19 #elif defined(SECP256K1_WIDEMUL_INT64) 22 #error "Please select wide multiplication implementation" 49 secp256k1_fe x2, x3, x6, x9, x11, x22, x44, x88, x176, x220, x223, t1;
84 for (j=0; j<11; j++) {
90 for (j=0; j<22; j++) {
96 for (j=0; j<44; j++) {
102 for (j=0; j<88; j++) {
108 for (j=0; j<44; j++) {
114 for (j=0; j<3; j++) {
122 for (j=0; j<23; j++) {
126 for (j=0; j<6; j++) {
140 secp256k1_fe x2, x3, x6, x9, x11, x22, x44, x88, x176, x220, x223, t1;
155 for (j=0; j<3; j++) {
161 for (j=0; j<3; j++) {
167 for (j=0; j<2; j++) {
173 for (j=0; j<11; j++) {
179 for (j=0; j<22; j++) {
185 for (j=0; j<44; j++) {
191 for (j=0; j<88; j++) {
197 for (j=0; j<44; j++) {
203 for (j=0; j<3; j++) {
211 for (j=0; j<23; j++) {
215 for (j=0; j<5; j++) {
219 for (j=0; j<3; j++) {
223 for (j=0; j<2; j++) {
230 #if defined(USE_FIELD_INV_BUILTIN) 232 #elif defined(USE_FIELD_INV_NUM) 235 0xFFFFFFFFUL, 0xFFFFFFFFUL, 0xFFFFFFFFUL, 0xFFFFFFFFUL,
236 0xFFFFFFFFUL, 0xFFFFFFFFUL, 0xFFFFFFFEUL, 0xFFFFFC2EUL
239 static const unsigned char prime[32] = {
240 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
241 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
242 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
243 0xFF,0xFF,0xFF,0xFE,0xFF,0xFF,0xFC,0x2F
262 #error "Please select field inverse implementation" 299 static const unsigned char prime[32] = {
300 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
301 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
302 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
303 0xFF,0xFF,0xFF,0xFE,0xFF,0xFF,0xFC,0x2F
#define VERIFY_CHECK(cond)
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_num_set_bin(secp256k1_num *r, const unsigned char *a, unsigned int alen)
Set a number to the value of a binary big-endian string.
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 SECP256K1_INLINE int secp256k1_fe_equal(const secp256k1_fe *a, const secp256k1_fe *b)
static SECP256K1_INLINE int secp256k1_fe_equal_var(const secp256k1_fe *a, const secp256k1_fe *b)
static void secp256k1_num_mod_inverse(secp256k1_num *r, const secp256k1_num *a, const secp256k1_num *m)
Compute a modular inverse.
#define SECP256K1_FE_CONST(d7, d6, d5, d4, d3, d2, d1, d0)
static void secp256k1_fe_add(secp256k1_fe *r, const secp256k1_fe *a)
Adds a field element to another.
static int secp256k1_fe_is_quad_var(const secp256k1_fe *a)
static int secp256k1_num_jacobi(const secp256k1_num *a, const secp256k1_num *b)
Compute the jacobi symbol (a|b).
static void secp256k1_fe_inv(secp256k1_fe *r, const secp256k1_fe *a)
static void secp256k1_fe_inv_var(secp256k1_fe *r, const secp256k1_fe *a)
static int secp256k1_fe_normalizes_to_zero(secp256k1_fe *r)
Verify whether a field element represents zero i.e.
static const secp256k1_fe secp256k1_fe_one
static void secp256k1_fe_sqr(secp256k1_fe *r, const secp256k1_fe *a)
Sets a field element to be the square of another.
static int secp256k1_fe_set_b32(secp256k1_fe *r, const unsigned char *a)
Set a field element equal to 32-byte big endian value.
static int secp256k1_fe_sqrt(secp256k1_fe *r, const secp256k1_fe *a)
static void secp256k1_fe_get_b32(unsigned char *r, const secp256k1_fe *a)
Convert a field element to a 32-byte big endian value.
static void secp256k1_fe_inv_all_var(secp256k1_fe *r, const secp256k1_fe *a, size_t len)
static void secp256k1_num_get_bin(unsigned char *r, unsigned int rlen, const secp256k1_num *a)
Convert a number's absolute value to a binary big-endian string.
static int secp256k1_fe_normalizes_to_zero_var(secp256k1_fe *r)
Verify whether a field element represents zero i.e.