Changeset View
Changeset View
Standalone View
Standalone View
src/secp256k1/src/field_impl.h
Show First 20 Lines • Show All 257 Lines • ▼ Show 20 Lines | #elif defined(USE_FIELD_INV_NUM) | ||||
secp256k1_fe_mul(&c, &c, r); | secp256k1_fe_mul(&c, &c, r); | ||||
secp256k1_fe_add(&c, &negone); | secp256k1_fe_add(&c, &negone); | ||||
CHECK(secp256k1_fe_normalizes_to_zero_var(&c)); | CHECK(secp256k1_fe_normalizes_to_zero_var(&c)); | ||||
#else | #else | ||||
#error "Please select field inverse implementation" | #error "Please select field inverse implementation" | ||||
#endif | #endif | ||||
} | } | ||||
static void secp256k1_fe_inv_all_var(secp256k1_fe *r, const secp256k1_fe *a, size_t len) { | |||||
secp256k1_fe u; | |||||
size_t i; | |||||
if (len < 1) { | |||||
return; | |||||
} | |||||
VERIFY_CHECK((r + len <= a) || (a + len <= r)); | |||||
r[0] = a[0]; | |||||
i = 0; | |||||
while (++i < len) { | |||||
secp256k1_fe_mul(&r[i], &r[i - 1], &a[i]); | |||||
} | |||||
secp256k1_fe_inv_var(&u, &r[--i]); | |||||
while (i > 0) { | |||||
size_t j = i--; | |||||
secp256k1_fe_mul(&r[j], &r[i], &u); | |||||
secp256k1_fe_mul(&u, &u, &a[j]); | |||||
} | |||||
r[0] = u; | |||||
} | |||||
static int secp256k1_fe_is_quad_var(const secp256k1_fe *a) { | static int secp256k1_fe_is_quad_var(const secp256k1_fe *a) { | ||||
#ifndef USE_NUM_NONE | #ifndef USE_NUM_NONE | ||||
unsigned char b[32]; | unsigned char b[32]; | ||||
secp256k1_num n; | secp256k1_num n; | ||||
secp256k1_num m; | secp256k1_num m; | ||||
/* secp256k1 field prime, value p defined in "Standards for Efficient Cryptography" (SEC2) 2.7.1. */ | /* secp256k1 field prime, value p defined in "Standards for Efficient Cryptography" (SEC2) 2.7.1. */ | ||||
static const unsigned char prime[32] = { | static const unsigned char prime[32] = { | ||||
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, | 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, | ||||
Show All 20 Lines |