Changeset View
Changeset View
Standalone View
Standalone View
src/secp256k1/src/scalar_low_impl.h
Show First 20 Lines • Show All 119 Lines • ▼ Show 20 Lines | |||||
static SECP256K1_INLINE void secp256k1_scalar_cmov(secp256k1_scalar *r, const secp256k1_scalar *a, int flag) { | static SECP256K1_INLINE void secp256k1_scalar_cmov(secp256k1_scalar *r, const secp256k1_scalar *a, int flag) { | ||||
uint32_t mask0, mask1; | uint32_t mask0, mask1; | ||||
VG_CHECK_VERIFY(r, sizeof(*r)); | VG_CHECK_VERIFY(r, sizeof(*r)); | ||||
mask0 = flag + ~((uint32_t)0); | mask0 = flag + ~((uint32_t)0); | ||||
mask1 = ~mask0; | mask1 = ~mask0; | ||||
*r = (*r & mask0) | (*a & mask1); | *r = (*r & mask0) | (*a & mask1); | ||||
} | } | ||||
static void secp256k1_scalar_inverse(secp256k1_scalar *r, const secp256k1_scalar *x) { | |||||
int i; | |||||
*r = 0; | |||||
for (i = 0; i < EXHAUSTIVE_TEST_ORDER; i++) | |||||
if ((i * *x) % EXHAUSTIVE_TEST_ORDER == 1) | |||||
*r = i; | |||||
/* If this VERIFY_CHECK triggers we were given a noninvertible scalar (and thus | |||||
* have a composite group order; fix it in exhaustive_tests.c). */ | |||||
VERIFY_CHECK(*r != 0); | |||||
} | |||||
static void secp256k1_scalar_inverse_var(secp256k1_scalar *r, const secp256k1_scalar *x) { | |||||
secp256k1_scalar_inverse(r, x); | |||||
} | |||||
#endif /* SECP256K1_SCALAR_REPR_IMPL_H */ | #endif /* SECP256K1_SCALAR_REPR_IMPL_H */ |