Changeset View
Changeset View
Standalone View
Standalone View
src/secp256k1/src/field_10x26_impl.h
Show First 20 Lines • Show All 314 Lines • ▼ Show 20 Lines | for (i = 9; i >= 0; i--) { | ||||
if (a->n[i] < b->n[i]) { | if (a->n[i] < b->n[i]) { | ||||
return -1; | return -1; | ||||
} | } | ||||
} | } | ||||
return 0; | return 0; | ||||
} | } | ||||
static int secp256k1_fe_set_b32(secp256k1_fe *r, const unsigned char *a) { | static int secp256k1_fe_set_b32(secp256k1_fe *r, const unsigned char *a) { | ||||
int ret; | |||||
r->n[0] = (uint32_t)a[31] | ((uint32_t)a[30] << 8) | ((uint32_t)a[29] << 16) | ((uint32_t)(a[28] & 0x3) << 24); | r->n[0] = (uint32_t)a[31] | ((uint32_t)a[30] << 8) | ((uint32_t)a[29] << 16) | ((uint32_t)(a[28] & 0x3) << 24); | ||||
r->n[1] = (uint32_t)((a[28] >> 2) & 0x3f) | ((uint32_t)a[27] << 6) | ((uint32_t)a[26] << 14) | ((uint32_t)(a[25] & 0xf) << 22); | r->n[1] = (uint32_t)((a[28] >> 2) & 0x3f) | ((uint32_t)a[27] << 6) | ((uint32_t)a[26] << 14) | ((uint32_t)(a[25] & 0xf) << 22); | ||||
r->n[2] = (uint32_t)((a[25] >> 4) & 0xf) | ((uint32_t)a[24] << 4) | ((uint32_t)a[23] << 12) | ((uint32_t)(a[22] & 0x3f) << 20); | r->n[2] = (uint32_t)((a[25] >> 4) & 0xf) | ((uint32_t)a[24] << 4) | ((uint32_t)a[23] << 12) | ((uint32_t)(a[22] & 0x3f) << 20); | ||||
r->n[3] = (uint32_t)((a[22] >> 6) & 0x3) | ((uint32_t)a[21] << 2) | ((uint32_t)a[20] << 10) | ((uint32_t)a[19] << 18); | r->n[3] = (uint32_t)((a[22] >> 6) & 0x3) | ((uint32_t)a[21] << 2) | ((uint32_t)a[20] << 10) | ((uint32_t)a[19] << 18); | ||||
r->n[4] = (uint32_t)a[18] | ((uint32_t)a[17] << 8) | ((uint32_t)a[16] << 16) | ((uint32_t)(a[15] & 0x3) << 24); | r->n[4] = (uint32_t)a[18] | ((uint32_t)a[17] << 8) | ((uint32_t)a[16] << 16) | ((uint32_t)(a[15] & 0x3) << 24); | ||||
r->n[5] = (uint32_t)((a[15] >> 2) & 0x3f) | ((uint32_t)a[14] << 6) | ((uint32_t)a[13] << 14) | ((uint32_t)(a[12] & 0xf) << 22); | r->n[5] = (uint32_t)((a[15] >> 2) & 0x3f) | ((uint32_t)a[14] << 6) | ((uint32_t)a[13] << 14) | ((uint32_t)(a[12] & 0xf) << 22); | ||||
r->n[6] = (uint32_t)((a[12] >> 4) & 0xf) | ((uint32_t)a[11] << 4) | ((uint32_t)a[10] << 12) | ((uint32_t)(a[9] & 0x3f) << 20); | r->n[6] = (uint32_t)((a[12] >> 4) & 0xf) | ((uint32_t)a[11] << 4) | ((uint32_t)a[10] << 12) | ((uint32_t)(a[9] & 0x3f) << 20); | ||||
r->n[7] = (uint32_t)((a[9] >> 6) & 0x3) | ((uint32_t)a[8] << 2) | ((uint32_t)a[7] << 10) | ((uint32_t)a[6] << 18); | r->n[7] = (uint32_t)((a[9] >> 6) & 0x3) | ((uint32_t)a[8] << 2) | ((uint32_t)a[7] << 10) | ((uint32_t)a[6] << 18); | ||||
r->n[8] = (uint32_t)a[5] | ((uint32_t)a[4] << 8) | ((uint32_t)a[3] << 16) | ((uint32_t)(a[2] & 0x3) << 24); | r->n[8] = (uint32_t)a[5] | ((uint32_t)a[4] << 8) | ((uint32_t)a[3] << 16) | ((uint32_t)(a[2] & 0x3) << 24); | ||||
r->n[9] = (uint32_t)((a[2] >> 2) & 0x3f) | ((uint32_t)a[1] << 6) | ((uint32_t)a[0] << 14); | r->n[9] = (uint32_t)((a[2] >> 2) & 0x3f) | ((uint32_t)a[1] << 6) | ((uint32_t)a[0] << 14); | ||||
if (r->n[9] == 0x3FFFFFUL && (r->n[8] & r->n[7] & r->n[6] & r->n[5] & r->n[4] & r->n[3] & r->n[2]) == 0x3FFFFFFUL && (r->n[1] + 0x40UL + ((r->n[0] + 0x3D1UL) >> 26)) > 0x3FFFFFFUL) { | ret = !((r->n[9] == 0x3FFFFFUL) & ((r->n[8] & r->n[7] & r->n[6] & r->n[5] & r->n[4] & r->n[3] & r->n[2]) == 0x3FFFFFFUL) & ((r->n[1] + 0x40UL + ((r->n[0] + 0x3D1UL) >> 26)) > 0x3FFFFFFUL)); | ||||
return 0; | |||||
} | |||||
#ifdef VERIFY | #ifdef VERIFY | ||||
r->magnitude = 1; | r->magnitude = 1; | ||||
if (ret) { | |||||
r->normalized = 1; | r->normalized = 1; | ||||
secp256k1_fe_verify(r); | secp256k1_fe_verify(r); | ||||
} else { | |||||
r->normalized = 0; | |||||
} | |||||
#endif | #endif | ||||
return 1; | return ret; | ||||
} | } | ||||
/** Convert a field element to a 32-byte big endian value. Requires the input to be normalized */ | /** Convert a field element to a 32-byte big endian value. Requires the input to be normalized */ | ||||
static void secp256k1_fe_get_b32(unsigned char *r, const secp256k1_fe *a) { | static void secp256k1_fe_get_b32(unsigned char *r, const secp256k1_fe *a) { | ||||
#ifdef VERIFY | #ifdef VERIFY | ||||
VERIFY_CHECK(a->normalized); | VERIFY_CHECK(a->normalized); | ||||
secp256k1_fe_verify(a); | secp256k1_fe_verify(a); | ||||
#endif | #endif | ||||
▲ Show 20 Lines • Show All 751 Lines • ▼ Show 20 Lines | static SECP256K1_INLINE void secp256k1_fe_cmov(secp256k1_fe *r, const secp256k1_fe *a, int flag) { | ||||
r->n[3] = (r->n[3] & mask0) | (a->n[3] & mask1); | r->n[3] = (r->n[3] & mask0) | (a->n[3] & mask1); | ||||
r->n[4] = (r->n[4] & mask0) | (a->n[4] & mask1); | r->n[4] = (r->n[4] & mask0) | (a->n[4] & mask1); | ||||
r->n[5] = (r->n[5] & mask0) | (a->n[5] & mask1); | r->n[5] = (r->n[5] & mask0) | (a->n[5] & mask1); | ||||
r->n[6] = (r->n[6] & mask0) | (a->n[6] & mask1); | r->n[6] = (r->n[6] & mask0) | (a->n[6] & mask1); | ||||
r->n[7] = (r->n[7] & mask0) | (a->n[7] & mask1); | r->n[7] = (r->n[7] & mask0) | (a->n[7] & mask1); | ||||
r->n[8] = (r->n[8] & mask0) | (a->n[8] & mask1); | r->n[8] = (r->n[8] & mask0) | (a->n[8] & mask1); | ||||
r->n[9] = (r->n[9] & mask0) | (a->n[9] & mask1); | r->n[9] = (r->n[9] & mask0) | (a->n[9] & mask1); | ||||
#ifdef VERIFY | #ifdef VERIFY | ||||
if (a->magnitude > r->magnitude) { | if (flag) { | ||||
r->magnitude = a->magnitude; | r->magnitude = a->magnitude; | ||||
r->normalized = a->normalized; | |||||
} | } | ||||
r->normalized &= a->normalized; | |||||
#endif | #endif | ||||
} | } | ||||
static SECP256K1_INLINE void secp256k1_fe_storage_cmov(secp256k1_fe_storage *r, const secp256k1_fe_storage *a, int flag) { | static SECP256K1_INLINE void secp256k1_fe_storage_cmov(secp256k1_fe_storage *r, const secp256k1_fe_storage *a, int flag) { | ||||
uint32_t mask0, mask1; | uint32_t mask0, mask1; | ||||
mask0 = flag + ~((uint32_t)0); | mask0 = flag + ~((uint32_t)0); | ||||
mask1 = ~mask0; | mask1 = ~mask0; | ||||
r->n[0] = (r->n[0] & mask0) | (a->n[0] & mask1); | r->n[0] = (r->n[0] & mask0) | (a->n[0] & mask1); | ||||
▲ Show 20 Lines • Show All 41 Lines • Show Last 20 Lines |