7 #ifndef _SECP256K1_FIELD_REPR_IMPL_H_
8 #define _SECP256K1_FIELD_REPR_IMPL_H_
10 #if defined HAVE_CONFIG_H
11 #include "libsecp256k1-config.h"
19 #if defined(USE_FIELD_5X52_ASM)
20 #include "field_5x52_asm_impl.h"
21 #elif defined(USE_FIELD_5X52_INT128)
22 #include "field_5x52_int128_impl.h"
24 #error "Please select field_5x52 implementation"
35 static void secp256k1_fe_inner_start(
void) {}
36 static void secp256k1_fe_inner_stop(
void) {}
40 const uint64_t *d = a->
n;
41 int m = a->normalized ? 1 : 2 * a->magnitude,
r = 1;
42 r &= (d[0] <= 0xFFFFFFFFFFFFFULL * m);
43 r &= (d[1] <= 0xFFFFFFFFFFFFFULL * m);
44 r &= (d[2] <= 0xFFFFFFFFFFFFFULL * m);
45 r &= (d[3] <= 0xFFFFFFFFFFFFFULL * m);
46 r &= (d[4] <= 0x0FFFFFFFFFFFFULL * m);
47 r &= (a->magnitude >= 0);
49 r &= (a->magnitude <= 1);
50 if (
r && (d[4] == 0x0FFFFFFFFFFFFULL) && ((d[3] & d[2] & d[1]) == 0xFFFFFFFFFFFFFULL)) {
51 r &= (d[0] < 0xFFFFEFFFFFC2FULL);
63 uint64_t t0 =
r->n[0], t1 =
r->n[1], t2 =
r->n[2], t3 =
r->n[3], t4 =
r->n[4];
66 uint64_t x = t4 >> 48; t4 &= 0x0FFFFFFFFFFFFULL;
70 t0 += x * 0x1000003D1ULL;
71 t1 += (t0 >> 52); t0 &= 0xFFFFFFFFFFFFFULL;
72 t2 += (t1 >> 52); t1 &= 0xFFFFFFFFFFFFFULL; m = t1;
73 t3 += (t2 >> 52); t2 &= 0xFFFFFFFFFFFFFULL; m &= t2;
74 t4 += (t3 >> 52); t3 &= 0xFFFFFFFFFFFFFULL; m &= t3;
80 x = (t4 >> 48) | ((t4 == 0x0FFFFFFFFFFFFULL) & (m == 0xFFFFFFFFFFFFFULL)
81 & (t0 >= 0xFFFFEFFFFFC2FULL));
84 t0 += x * 0x1000003D1ULL;
85 t1 += (t0 >> 52); t0 &= 0xFFFFFFFFFFFFFULL;
86 t2 += (t1 >> 52); t1 &= 0xFFFFFFFFFFFFFULL;
87 t3 += (t2 >> 52); t2 &= 0xFFFFFFFFFFFFFULL;
88 t4 += (t3 >> 52); t3 &= 0xFFFFFFFFFFFFFULL;
94 t4 &= 0x0FFFFFFFFFFFFULL;
96 r->n[0] = t0;
r->n[1] = t1;
r->n[2] = t2;
r->n[3] = t3;
r->n[4] = t4;
101 secp256k1_fe_verify(
r);
107 r->n[1] =
r->n[2] =
r->n[3] =
r->n[4] = 0;
111 secp256k1_fe_verify(
r);
118 secp256k1_fe_verify(a);
120 const uint64_t *t = a->
n;
121 return (t[0] | t[1] | t[2] | t[3] | t[4]) == 0;
127 secp256k1_fe_verify(a);
137 for (
int i=0; i<5; i++) {
146 secp256k1_fe_verify(a);
147 secp256k1_fe_verify(
b);
149 const uint64_t *t = a->
n, *u =
b->n;
150 return ((t[0]^u[0]) | (t[1]^u[1]) | (t[2]^u[2]) | (t[3]^u[3]) | (t[4]^u[4])) == 0;
157 secp256k1_fe_verify(a);
158 secp256k1_fe_verify(
b);
160 for (
int i = 4; i >= 0; i--) {
161 if (a->
n[i] >
b->n[i])
return 1;
162 if (a->
n[i] <
b->n[i])
return -1;
167 static int secp256k1_fe_set_b32(
secp256k1_fe_t *
r,
const unsigned char *a) {
168 r->n[0] =
r->n[1] =
r->n[2] =
r->n[3] =
r->n[4] = 0;
169 for (
int i=0; i<32; i++) {
170 for (
int j=0; j<2; j++) {
171 int limb = (8*i+4*j)/52;
172 int shift = (8*i+4*j)%52;
173 r->n[limb] |= (uint64_t)((a[31-i] >> (4*j)) & 0xF) << shift;
176 if (
r->n[4] == 0x0FFFFFFFFFFFFULL && (
r->n[3] &
r->n[2] &
r->n[1]) == 0xFFFFFFFFFFFFFULL &&
r->n[0] >= 0xFFFFEFFFFFC2FULL) {
182 secp256k1_fe_verify(
r);
188 static void secp256k1_fe_get_b32(
unsigned char *
r,
const secp256k1_fe_t *a) {
191 secp256k1_fe_verify(a);
193 for (
int i=0; i<32; i++) {
195 for (
int j=0; j<2; j++) {
196 int limb = (8*i+4*j)/52;
197 int shift = (8*i+4*j)%52;
198 c |= ((a->
n[limb] >> shift) & 0xF) << (4 * j);
207 secp256k1_fe_verify(a);
209 r->n[0] = 0xFFFFEFFFFFC2FULL * 2 * (m + 1) - a->
n[0];
210 r->n[1] = 0xFFFFFFFFFFFFFULL * 2 * (m + 1) - a->
n[1];
211 r->n[2] = 0xFFFFFFFFFFFFFULL * 2 * (m + 1) - a->
n[2];
212 r->n[3] = 0xFFFFFFFFFFFFFULL * 2 * (m + 1) - a->
n[3];
213 r->n[4] = 0x0FFFFFFFFFFFFULL * 2 * (m + 1) - a->
n[4];
215 r->magnitude = m + 1;
217 secp256k1_fe_verify(
r);
230 secp256k1_fe_verify(
r);
236 secp256k1_fe_verify(a);
244 r->magnitude += a->magnitude;
246 secp256k1_fe_verify(
r);
254 secp256k1_fe_verify(a);
255 secp256k1_fe_verify(
b);
258 secp256k1_fe_mul_inner(a->
n,
b->n,
r->n);
262 secp256k1_fe_verify(
r);
269 secp256k1_fe_verify(a);
271 secp256k1_fe_sqr_inner(a->
n,
r->n);
275 secp256k1_fe_verify(
r);
280 uint64_t mask0 = flag + ~((uint64_t)0), mask1 = ~mask0;
281 r->n[0] = (
r->n[0] & mask0) | (a->
n[0] & mask1);
282 r->n[1] = (
r->n[1] & mask0) | (a->
n[1] & mask1);
283 r->n[2] = (
r->n[2] & mask0) | (a->
n[2] & mask1);
284 r->n[3] = (
r->n[3] & mask0) | (a->
n[3] & mask1);
285 r->n[4] = (
r->n[4] & mask0) | (a->
n[4] & mask1);
288 r->magnitude = a->magnitude;
289 r->normalized = a->normalized;