7 #ifndef _SECP256K1_FIELD_REPR_IMPL_H_
8 #define _SECP256K1_FIELD_REPR_IMPL_H_
16 static void secp256k1_fe_inner_start(
void) {}
17 static void secp256k1_fe_inner_stop(
void) {}
21 const uint32_t *d = a->
n;
22 int m = a->normalized ? 1 : 2 * a->magnitude,
r = 1;
23 r &= (d[0] <= 0x3FFFFFFUL * m);
24 r &= (d[1] <= 0x3FFFFFFUL * m);
25 r &= (d[2] <= 0x3FFFFFFUL * m);
26 r &= (d[3] <= 0x3FFFFFFUL * m);
27 r &= (d[4] <= 0x3FFFFFFUL * m);
28 r &= (d[5] <= 0x3FFFFFFUL * m);
29 r &= (d[6] <= 0x3FFFFFFUL * m);
30 r &= (d[7] <= 0x3FFFFFFUL * m);
31 r &= (d[8] <= 0x3FFFFFFUL * m);
32 r &= (d[9] <= 0x03FFFFFUL * m);
33 r &= (a->magnitude >= 0);
35 r &= (a->magnitude <= 1);
36 if (
r && (d[9] == 0x03FFFFFUL)) {
37 uint32_t mid = d[8] & d[7] & d[6] & d[5] & d[4] & d[3] & d[2];
38 if (mid == 0x3FFFFFFUL) {
39 r &= ((d[1] + 0x40UL + ((d[0] + 0x3D1UL) >> 26)) <= 0x3FFFFFFUL);
52 uint32_t t0 =
r->n[0], t1 =
r->n[1], t2 =
r->n[2], t3 =
r->n[3], t4 =
r->n[4],
53 t5 =
r->n[5], t6 =
r->n[6], t7 =
r->n[7], t8 =
r->n[8], t9 =
r->n[9];
56 uint32_t x = t9 >> 22; t9 &= 0x03FFFFFUL;
60 t0 += x * 0x3D1UL; t1 += (x << 6);
61 t1 += (t0 >> 26); t0 &= 0x3FFFFFFUL;
62 t2 += (t1 >> 26); t1 &= 0x3FFFFFFUL;
63 t3 += (t2 >> 26); t2 &= 0x3FFFFFFUL; m = t2;
64 t4 += (t3 >> 26); t3 &= 0x3FFFFFFUL; m &= t3;
65 t5 += (t4 >> 26); t4 &= 0x3FFFFFFUL; m &= t4;
66 t6 += (t5 >> 26); t5 &= 0x3FFFFFFUL; m &= t5;
67 t7 += (t6 >> 26); t6 &= 0x3FFFFFFUL; m &= t6;
68 t8 += (t7 >> 26); t7 &= 0x3FFFFFFUL; m &= t7;
69 t9 += (t8 >> 26); t8 &= 0x3FFFFFFUL; m &= t8;
75 x = (t9 >> 22) | ((t9 == 0x03FFFFFUL) & (m == 0x3FFFFFFUL)
76 & ((t1 + 0x40UL + ((t0 + 0x3D1UL) >> 26)) > 0x3FFFFFFUL));
79 t0 += x * 0x3D1UL; t1 += (x << 6);
80 t1 += (t0 >> 26); t0 &= 0x3FFFFFFUL;
81 t2 += (t1 >> 26); t1 &= 0x3FFFFFFUL;
82 t3 += (t2 >> 26); t2 &= 0x3FFFFFFUL;
83 t4 += (t3 >> 26); t3 &= 0x3FFFFFFUL;
84 t5 += (t4 >> 26); t4 &= 0x3FFFFFFUL;
85 t6 += (t5 >> 26); t5 &= 0x3FFFFFFUL;
86 t7 += (t6 >> 26); t6 &= 0x3FFFFFFUL;
87 t8 += (t7 >> 26); t7 &= 0x3FFFFFFUL;
88 t9 += (t8 >> 26); t8 &= 0x3FFFFFFUL;
96 r->n[0] = t0;
r->n[1] = t1;
r->n[2] = t2;
r->n[3] = t3;
r->n[4] = t4;
97 r->n[5] = t5;
r->n[6] = t6;
r->n[7] = t7;
r->n[8] = t8;
r->n[9] = t9;
102 secp256k1_fe_verify(
r);
108 r->n[1] =
r->n[2] =
r->n[3] =
r->n[4] =
r->n[5] =
r->n[6] =
r->n[7] =
r->n[8] =
r->n[9] = 0;
112 secp256k1_fe_verify(
r);
119 secp256k1_fe_verify(a);
121 const uint32_t *t = a->
n;
122 return (t[0] | t[1] | t[2] | t[3] | t[4] | t[5] | t[6] | t[7] | t[8] | t[9]) == 0;
128 secp256k1_fe_verify(a);
138 for (
int i=0; i<10; i++) {
147 secp256k1_fe_verify(a);
148 secp256k1_fe_verify(
b);
150 const uint32_t *t = a->
n, *u =
b->n;
151 return ((t[0]^u[0]) | (t[1]^u[1]) | (t[2]^u[2]) | (t[3]^u[3]) | (t[4]^u[4])
152 | (t[5]^u[5]) | (t[6]^u[6]) | (t[7]^u[7]) | (t[8]^u[8]) | (t[9]^u[9])) == 0;
159 secp256k1_fe_verify(a);
160 secp256k1_fe_verify(
b);
162 for (
int i = 9; i >= 0; i--) {
163 if (a->
n[i] >
b->n[i])
return 1;
164 if (a->
n[i] <
b->n[i])
return -1;
169 static int secp256k1_fe_set_b32(
secp256k1_fe_t *
r,
const unsigned char *a) {
170 r->n[0] =
r->n[1] =
r->n[2] =
r->n[3] =
r->n[4] = 0;
171 r->n[5] =
r->n[6] =
r->n[7] =
r->n[8] =
r->n[9] = 0;
172 for (
int i=0; i<32; i++) {
173 for (
int j=0; j<4; j++) {
174 int limb = (8*i+2*j)/26;
175 int shift = (8*i+2*j)%26;
176 r->n[limb] |= (uint32_t)((a[31-i] >> (2*j)) & 0x3) << shift;
179 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) {
185 secp256k1_fe_verify(
r);
191 static void secp256k1_fe_get_b32(
unsigned char *
r,
const secp256k1_fe_t *a) {
194 secp256k1_fe_verify(a);
196 for (
int i=0; i<32; i++) {
198 for (
int j=0; j<4; j++) {
199 int limb = (8*i+2*j)/26;
200 int shift = (8*i+2*j)%26;
201 c |= ((a->
n[limb] >> shift) & 0x3) << (2 * j);
210 secp256k1_fe_verify(a);
212 r->n[0] = 0x3FFFC2FUL * 2 * (m + 1) - a->
n[0];
213 r->n[1] = 0x3FFFFBFUL * 2 * (m + 1) - a->
n[1];
214 r->n[2] = 0x3FFFFFFUL * 2 * (m + 1) - a->
n[2];
215 r->n[3] = 0x3FFFFFFUL * 2 * (m + 1) - a->
n[3];
216 r->n[4] = 0x3FFFFFFUL * 2 * (m + 1) - a->
n[4];
217 r->n[5] = 0x3FFFFFFUL * 2 * (m + 1) - a->
n[5];
218 r->n[6] = 0x3FFFFFFUL * 2 * (m + 1) - a->
n[6];
219 r->n[7] = 0x3FFFFFFUL * 2 * (m + 1) - a->
n[7];
220 r->n[8] = 0x3FFFFFFUL * 2 * (m + 1) - a->
n[8];
221 r->n[9] = 0x03FFFFFUL * 2 * (m + 1) - a->
n[9];
223 r->magnitude = m + 1;
225 secp256k1_fe_verify(
r);
243 secp256k1_fe_verify(
r);
249 secp256k1_fe_verify(a);
262 r->magnitude += a->magnitude;
264 secp256k1_fe_verify(
r);
269 #define VERIFY_BITS(x, n) VERIFY_CHECK(((x) >> (n)) == 0)
271 #define VERIFY_BITS(x, n) do { } while(0)
296 const uint32_t
M = 0x3FFFFFFUL, R0 = 0x3D10UL, R1 = 0x400UL;
304 d = (uint64_t)a[0] *
b[9]
305 + (uint64_t)a[1] *
b[8]
306 + (uint64_t)a[2] *
b[7]
307 + (uint64_t)a[3] *
b[6]
308 + (uint64_t)a[4] *
b[5]
309 + (uint64_t)a[5] *
b[4]
310 + (uint64_t)a[6] *
b[3]
311 + (uint64_t)a[7] *
b[2]
312 + (uint64_t)a[8] *
b[1]
313 + (uint64_t)a[9] *
b[0];
316 uint32_t t9 = d &
M; d >>= 26;
321 c = (uint64_t)a[0] *
b[0];
324 d += (uint64_t)a[1] *
b[9]
325 + (uint64_t)a[2] *
b[8]
326 + (uint64_t)a[3] *
b[7]
327 + (uint64_t)a[4] *
b[6]
328 + (uint64_t)a[5] *
b[5]
329 + (uint64_t)a[6] *
b[4]
330 + (uint64_t)a[7] *
b[3]
331 + (uint64_t)a[8] *
b[2]
332 + (uint64_t)a[9] *
b[1];
335 uint64_t u0 = d &
M; d >>= 26; c += u0 * R0;
340 uint32_t t0 = c &
M; c >>= 26; c += u0 * R1;
346 c += (uint64_t)a[0] *
b[1]
347 + (uint64_t)a[1] *
b[0];
350 d += (uint64_t)a[2] *
b[9]
351 + (uint64_t)a[3] *
b[8]
352 + (uint64_t)a[4] *
b[7]
353 + (uint64_t)a[5] *
b[6]
354 + (uint64_t)a[6] *
b[5]
355 + (uint64_t)a[7] *
b[4]
356 + (uint64_t)a[8] *
b[3]
357 + (uint64_t)a[9] *
b[2];
360 uint64_t u1 = d &
M; d >>= 26; c += u1 * R0;
365 uint32_t t1 = c &
M; c >>= 26; c += u1 * R1;
371 c += (uint64_t)a[0] *
b[2]
372 + (uint64_t)a[1] *
b[1]
373 + (uint64_t)a[2] *
b[0];
376 d += (uint64_t)a[3] *
b[9]
377 + (uint64_t)a[4] *
b[8]
378 + (uint64_t)a[5] *
b[7]
379 + (uint64_t)a[6] *
b[6]
380 + (uint64_t)a[7] *
b[5]
381 + (uint64_t)a[8] *
b[4]
382 + (uint64_t)a[9] *
b[3];
385 uint64_t u2 = d &
M; d >>= 26; c += u2 * R0;
390 uint32_t t2 = c &
M; c >>= 26; c += u2 * R1;
396 c += (uint64_t)a[0] *
b[3]
397 + (uint64_t)a[1] *
b[2]
398 + (uint64_t)a[2] *
b[1]
399 + (uint64_t)a[3] *
b[0];
402 d += (uint64_t)a[4] *
b[9]
403 + (uint64_t)a[5] *
b[8]
404 + (uint64_t)a[6] *
b[7]
405 + (uint64_t)a[7] *
b[6]
406 + (uint64_t)a[8] *
b[5]
407 + (uint64_t)a[9] *
b[4];
410 uint64_t u3 = d &
M; d >>= 26; c += u3 * R0;
415 uint32_t t3 = c &
M; c >>= 26; c += u3 * R1;
421 c += (uint64_t)a[0] *
b[4]
422 + (uint64_t)a[1] *
b[3]
423 + (uint64_t)a[2] *
b[2]
424 + (uint64_t)a[3] *
b[1]
425 + (uint64_t)a[4] *
b[0];
428 d += (uint64_t)a[5] *
b[9]
429 + (uint64_t)a[6] *
b[8]
430 + (uint64_t)a[7] *
b[7]
431 + (uint64_t)a[8] *
b[6]
432 + (uint64_t)a[9] *
b[5];
435 uint64_t u4 = d &
M; d >>= 26; c += u4 * R0;
440 uint32_t t4 = c &
M; c >>= 26; c += u4 * R1;
446 c += (uint64_t)a[0] *
b[5]
447 + (uint64_t)a[1] *
b[4]
448 + (uint64_t)a[2] *
b[3]
449 + (uint64_t)a[3] *
b[2]
450 + (uint64_t)a[4] *
b[1]
451 + (uint64_t)a[5] *
b[0];
454 d += (uint64_t)a[6] *
b[9]
455 + (uint64_t)a[7] *
b[8]
456 + (uint64_t)a[8] *
b[7]
457 + (uint64_t)a[9] *
b[6];
460 uint64_t u5 = d &
M; d >>= 26; c += u5 * R0;
465 uint32_t t5 = c &
M; c >>= 26; c += u5 * R1;
471 c += (uint64_t)a[0] *
b[6]
472 + (uint64_t)a[1] *
b[5]
473 + (uint64_t)a[2] *
b[4]
474 + (uint64_t)a[3] *
b[3]
475 + (uint64_t)a[4] *
b[2]
476 + (uint64_t)a[5] *
b[1]
477 + (uint64_t)a[6] *
b[0];
480 d += (uint64_t)a[7] *
b[9]
481 + (uint64_t)a[8] *
b[8]
482 + (uint64_t)a[9] *
b[7];
485 uint64_t u6 = d &
M; d >>= 26; c += u6 * R0;
490 uint32_t t6 = c &
M; c >>= 26; c += u6 * R1;
496 c += (uint64_t)a[0] *
b[7]
497 + (uint64_t)a[1] *
b[6]
498 + (uint64_t)a[2] *
b[5]
499 + (uint64_t)a[3] *
b[4]
500 + (uint64_t)a[4] *
b[3]
501 + (uint64_t)a[5] *
b[2]
502 + (uint64_t)a[6] *
b[1]
503 + (uint64_t)a[7] *
b[0];
507 d += (uint64_t)a[8] *
b[9]
508 + (uint64_t)a[9] *
b[8];
511 uint64_t u7 = d &
M; d >>= 26; c += u7 * R0;
517 uint32_t t7 = c &
M; c >>= 26; c += u7 * R1;
523 c += (uint64_t)a[0] *
b[8]
524 + (uint64_t)a[1] *
b[7]
525 + (uint64_t)a[2] *
b[6]
526 + (uint64_t)a[3] *
b[5]
527 + (uint64_t)a[4] *
b[4]
528 + (uint64_t)a[5] *
b[3]
529 + (uint64_t)a[6] *
b[2]
530 + (uint64_t)a[7] *
b[1]
531 + (uint64_t)a[8] *
b[0];
535 d += (uint64_t)a[9] *
b[9];
538 uint64_t u8 = d &
M; d >>= 26; c += u8 * R0;
561 r[8] = c &
M; c >>= 26; c += u8 * R1;
569 r[9] = c & (
M >> 4); c >>= 22; c += d * (R1 << 4);
576 d = c * (R0 >> 4) + t0;
579 r[0] = d &
M; d >>= 26;
583 d += c * (R1 >> 4) + t1;
588 r[1] = d &
M; d >>= 26;
601 SECP256K1_INLINE static void secp256k1_fe_sqr_inner(
const uint32_t *a, uint32_t *
r) {
613 const uint32_t
M = 0x3FFFFFFUL, R0 = 0x3D10UL, R1 = 0x400UL;
621 d = (uint64_t)(a[0]*2) * a[9]
622 + (uint64_t)(a[1]*2) * a[8]
623 + (uint64_t)(a[2]*2) * a[7]
624 + (uint64_t)(a[3]*2) * a[6]
625 + (uint64_t)(a[4]*2) * a[5];
628 uint32_t t9 = d &
M; d >>= 26;
633 c = (uint64_t)a[0] * a[0];
636 d += (uint64_t)(a[1]*2) * a[9]
637 + (uint64_t)(a[2]*2) * a[8]
638 + (uint64_t)(a[3]*2) * a[7]
639 + (uint64_t)(a[4]*2) * a[6]
640 + (uint64_t)a[5] * a[5];
643 uint64_t u0 = d &
M; d >>= 26; c += u0 * R0;
648 uint32_t t0 = c &
M; c >>= 26; c += u0 * R1;
654 c += (uint64_t)(a[0]*2) * a[1];
657 d += (uint64_t)(a[2]*2) * a[9]
658 + (uint64_t)(a[3]*2) * a[8]
659 + (uint64_t)(a[4]*2) * a[7]
660 + (uint64_t)(a[5]*2) * a[6];
663 uint64_t u1 = d &
M; d >>= 26; c += u1 * R0;
668 uint32_t t1 = c &
M; c >>= 26; c += u1 * R1;
674 c += (uint64_t)(a[0]*2) * a[2]
675 + (uint64_t)a[1] * a[1];
678 d += (uint64_t)(a[3]*2) * a[9]
679 + (uint64_t)(a[4]*2) * a[8]
680 + (uint64_t)(a[5]*2) * a[7]
681 + (uint64_t)a[6] * a[6];
684 uint64_t u2 = d &
M; d >>= 26; c += u2 * R0;
689 uint32_t t2 = c &
M; c >>= 26; c += u2 * R1;
695 c += (uint64_t)(a[0]*2) * a[3]
696 + (uint64_t)(a[1]*2) * a[2];
699 d += (uint64_t)(a[4]*2) * a[9]
700 + (uint64_t)(a[5]*2) * a[8]
701 + (uint64_t)(a[6]*2) * a[7];
704 uint64_t u3 = d &
M; d >>= 26; c += u3 * R0;
709 uint32_t t3 = c &
M; c >>= 26; c += u3 * R1;
715 c += (uint64_t)(a[0]*2) * a[4]
716 + (uint64_t)(a[1]*2) * a[3]
717 + (uint64_t)a[2] * a[2];
720 d += (uint64_t)(a[5]*2) * a[9]
721 + (uint64_t)(a[6]*2) * a[8]
722 + (uint64_t)a[7] * a[7];
725 uint64_t u4 = d &
M; d >>= 26; c += u4 * R0;
730 uint32_t t4 = c &
M; c >>= 26; c += u4 * R1;
736 c += (uint64_t)(a[0]*2) * a[5]
737 + (uint64_t)(a[1]*2) * a[4]
738 + (uint64_t)(a[2]*2) * a[3];
741 d += (uint64_t)(a[6]*2) * a[9]
742 + (uint64_t)(a[7]*2) * a[8];
745 uint64_t u5 = d &
M; d >>= 26; c += u5 * R0;
750 uint32_t t5 = c &
M; c >>= 26; c += u5 * R1;
756 c += (uint64_t)(a[0]*2) * a[6]
757 + (uint64_t)(a[1]*2) * a[5]
758 + (uint64_t)(a[2]*2) * a[4]
759 + (uint64_t)a[3] * a[3];
762 d += (uint64_t)(a[7]*2) * a[9]
763 + (uint64_t)a[8] * a[8];
766 uint64_t u6 = d &
M; d >>= 26; c += u6 * R0;
771 uint32_t t6 = c &
M; c >>= 26; c += u6 * R1;
777 c += (uint64_t)(a[0]*2) * a[7]
778 + (uint64_t)(a[1]*2) * a[6]
779 + (uint64_t)(a[2]*2) * a[5]
780 + (uint64_t)(a[3]*2) * a[4];
784 d += (uint64_t)(a[8]*2) * a[9];
787 uint64_t u7 = d &
M; d >>= 26; c += u7 * R0;
793 uint32_t t7 = c &
M; c >>= 26; c += u7 * R1;
799 c += (uint64_t)(a[0]*2) * a[8]
800 + (uint64_t)(a[1]*2) * a[7]
801 + (uint64_t)(a[2]*2) * a[6]
802 + (uint64_t)(a[3]*2) * a[5]
803 + (uint64_t)a[4] * a[4];
807 d += (uint64_t)a[9] * a[9];
810 uint64_t u8 = d &
M; d >>= 26; c += u8 * R0;
833 r[8] = c &
M; c >>= 26; c += u8 * R1;
841 r[9] = c & (
M >> 4); c >>= 22; c += d * (R1 << 4);
848 d = c * (R0 >> 4) + t0;
851 r[0] = d &
M; d >>= 26;
855 d += c * (R1 >> 4) + t1;
860 r[1] = d &
M; d >>= 26;
878 secp256k1_fe_verify(a);
879 secp256k1_fe_verify(
b);
882 secp256k1_fe_mul_inner(a->
n,
b->n,
r->n);
886 secp256k1_fe_verify(
r);
893 secp256k1_fe_verify(a);
895 secp256k1_fe_sqr_inner(a->
n,
r->n);
899 secp256k1_fe_verify(
r);
904 uint32_t mask0 = flag + ~((uint32_t)0), mask1 = ~mask0;
905 r->n[0] = (
r->n[0] & mask0) | (a->
n[0] & mask1);
906 r->n[1] = (
r->n[1] & mask0) | (a->
n[1] & mask1);
907 r->n[2] = (
r->n[2] & mask0) | (a->
n[2] & mask1);
908 r->n[3] = (
r->n[3] & mask0) | (a->
n[3] & mask1);
909 r->n[4] = (
r->n[4] & mask0) | (a->
n[4] & mask1);
910 r->n[5] = (
r->n[5] & mask0) | (a->
n[5] & mask1);
911 r->n[6] = (
r->n[6] & mask0) | (a->
n[6] & mask1);
912 r->n[7] = (
r->n[7] & mask0) | (a->
n[7] & mask1);
913 r->n[8] = (
r->n[8] & mask0) | (a->
n[8] & mask1);
914 r->n[9] = (
r->n[9] & mask0) | (a->
n[9] & mask1);
917 r->magnitude = a->magnitude;
918 r->normalized = a->normalized;