blob: 48a156091e9b4065fa0f9b7b1d5713375b1898c7 [file] [log] [blame]
Andres Erbsen2a33fae2023-10-30 19:57:59 +00001#include <openssl/base.h>
Andres Erbsen20c94062023-09-25 19:28:44 +00002#include "../../crypto/internal.h"
Adam Langley5813c2c2024-10-30 14:48:00 -07003
Andres Erbsen20c94062023-09-25 19:28:44 +00004#if !defined(OPENSSL_NO_ASM) && defined(__GNUC__) && defined(__x86_64__)
Adam Langley5813c2c2024-10-30 14:48:00 -07005extern "C" {
Andres Erbsen20c94062023-09-25 19:28:44 +00006void fiat_p256_adx_mul(uint64_t*, const uint64_t*, const uint64_t*);
7void fiat_p256_adx_sqr(uint64_t*, const uint64_t*);
Adam Langley5813c2c2024-10-30 14:48:00 -07008}
Andres Erbsen20c94062023-09-25 19:28:44 +00009#endif
10
David Benjamin8c8e7a62022-03-21 15:14:33 -040011/* Autogenerated: 'src/ExtractionOCaml/word_by_word_montgomery' --inline --static --use-value-barrier p256 64 '2^256 - 2^224 + 2^192 + 2^96 - 1' mul square add sub opp from_montgomery to_montgomery nonzero selectznz to_bytes from_bytes one msat divstep divstep_precomp */
David Benjamin32e59d22019-01-08 23:08:42 +000012/* curve description: p256 */
David Benjamin32e59d22019-01-08 23:08:42 +000013/* machine_wordsize = 64 (from "64") */
David Benjamin8c8e7a62022-03-21 15:14:33 -040014/* requested operations: mul, square, add, sub, opp, from_montgomery, to_montgomery, nonzero, selectznz, to_bytes, from_bytes, one, msat, divstep, divstep_precomp */
15/* m = 0xffffffff00000001000000000000000000000000ffffffffffffffffffffffff (from "2^256 - 2^224 + 2^192 + 2^96 - 1") */
David Benjamin32e59d22019-01-08 23:08:42 +000016/* */
17/* NOTE: In addition to the bounds specified above each function, all */
18/* functions synthesized for this Montgomery arithmetic require the */
19/* input to be strictly less than the prime modulus (m), and also */
20/* require the input to be in the unique saturated representation. */
21/* All functions also ensure that these two properties are true of */
22/* return values. */
David Benjamin8c8e7a62022-03-21 15:14:33 -040023/* */
24/* Computed values: */
25/* eval z = z[0] + (z[1] << 64) + (z[2] << 128) + (z[3] << 192) */
26/* bytes_eval z = z[0] + (z[1] << 8) + (z[2] << 16) + (z[3] << 24) + (z[4] << 32) + (z[5] << 40) + (z[6] << 48) + (z[7] << 56) + (z[8] << 64) + (z[9] << 72) + (z[10] << 80) + (z[11] << 88) + (z[12] << 96) + (z[13] << 104) + (z[14] << 112) + (z[15] << 120) + (z[16] << 128) + (z[17] << 136) + (z[18] << 144) + (z[19] << 152) + (z[20] << 160) + (z[21] << 168) + (z[22] << 176) + (z[23] << 184) + (z[24] << 192) + (z[25] << 200) + (z[26] << 208) + (z[27] << 216) + (z[28] << 224) + (z[29] << 232) + (z[30] << 240) + (z[31] << 248) */
27/* twos_complement_eval z = let x1 := z[0] + (z[1] << 64) + (z[2] << 128) + (z[3] << 192) in */
28/* if x1 & (2^256-1) < 2^255 then x1 & (2^256-1) else (x1 & (2^256-1)) - 2^256 */
David Benjamin32e59d22019-01-08 23:08:42 +000029
30#include <stdint.h>
31typedef unsigned char fiat_p256_uint1;
32typedef signed char fiat_p256_int1;
David Benjamin8c8e7a62022-03-21 15:14:33 -040033#if defined(__GNUC__) || defined(__clang__)
34# define FIAT_P256_FIAT_EXTENSION __extension__
35# define FIAT_P256_FIAT_INLINE __inline__
36#else
37# define FIAT_P256_FIAT_EXTENSION
38# define FIAT_P256_FIAT_INLINE
39#endif
40
41FIAT_P256_FIAT_EXTENSION typedef signed __int128 fiat_p256_int128;
42FIAT_P256_FIAT_EXTENSION typedef unsigned __int128 fiat_p256_uint128;
43
44/* The type fiat_p256_montgomery_domain_field_element is a field element in the Montgomery domain. */
45/* Bounds: [[0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff]] */
46typedef uint64_t fiat_p256_montgomery_domain_field_element[4];
47
48/* The type fiat_p256_non_montgomery_domain_field_element is a field element NOT in the Montgomery domain. */
49/* Bounds: [[0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff]] */
50typedef uint64_t fiat_p256_non_montgomery_domain_field_element[4];
David Benjamin32e59d22019-01-08 23:08:42 +000051
David Benjaminbaca5b42020-04-14 15:19:20 -040052#if (-1 & 3) != 3
53#error "This code only works on a two's complement system"
54#endif
55
David Benjamin8c8e7a62022-03-21 15:14:33 -040056#if !defined(FIAT_P256_NO_ASM) && (defined(__GNUC__) || defined(__clang__))
57static __inline__ uint64_t fiat_p256_value_barrier_u64(uint64_t a) {
58 __asm__("" : "+r"(a) : /* no inputs */);
59 return a;
60}
61#else
62# define fiat_p256_value_barrier_u64(x) (x)
63#endif
64
David Benjamin32e59d22019-01-08 23:08:42 +000065
66/*
David Benjaminbaca5b42020-04-14 15:19:20 -040067 * The function fiat_p256_addcarryx_u64 is an addition with carry.
David Benjamin8c8e7a62022-03-21 15:14:33 -040068 *
David Benjaminbaca5b42020-04-14 15:19:20 -040069 * Postconditions:
70 * out1 = (arg1 + arg2 + arg3) mod 2^64
71 * out2 = ⌊(arg1 + arg2 + arg3) / 2^64⌋
72 *
David Benjamin32e59d22019-01-08 23:08:42 +000073 * Input Bounds:
74 * arg1: [0x0 ~> 0x1]
75 * arg2: [0x0 ~> 0xffffffffffffffff]
76 * arg3: [0x0 ~> 0xffffffffffffffff]
77 * Output Bounds:
78 * out1: [0x0 ~> 0xffffffffffffffff]
79 * out2: [0x0 ~> 0x1]
80 */
David Benjamin8c8e7a62022-03-21 15:14:33 -040081static FIAT_P256_FIAT_INLINE void fiat_p256_addcarryx_u64(uint64_t* out1, fiat_p256_uint1* out2, fiat_p256_uint1 arg1, uint64_t arg2, uint64_t arg3) {
82 fiat_p256_uint128 x1;
83 uint64_t x2;
84 fiat_p256_uint1 x3;
85 x1 = ((arg1 + (fiat_p256_uint128)arg2) + arg3);
86 x2 = (uint64_t)(x1 & UINT64_C(0xffffffffffffffff));
87 x3 = (fiat_p256_uint1)(x1 >> 64);
David Benjamin32e59d22019-01-08 23:08:42 +000088 *out1 = x2;
89 *out2 = x3;
90}
91
92/*
David Benjaminbaca5b42020-04-14 15:19:20 -040093 * The function fiat_p256_subborrowx_u64 is a subtraction with borrow.
David Benjamin8c8e7a62022-03-21 15:14:33 -040094 *
David Benjaminbaca5b42020-04-14 15:19:20 -040095 * Postconditions:
96 * out1 = (-arg1 + arg2 + -arg3) mod 2^64
97 * out2 = -⌊(-arg1 + arg2 + -arg3) / 2^64⌋
98 *
David Benjamin32e59d22019-01-08 23:08:42 +000099 * Input Bounds:
100 * arg1: [0x0 ~> 0x1]
101 * arg2: [0x0 ~> 0xffffffffffffffff]
102 * arg3: [0x0 ~> 0xffffffffffffffff]
103 * Output Bounds:
104 * out1: [0x0 ~> 0xffffffffffffffff]
105 * out2: [0x0 ~> 0x1]
106 */
David Benjamin8c8e7a62022-03-21 15:14:33 -0400107static FIAT_P256_FIAT_INLINE void fiat_p256_subborrowx_u64(uint64_t* out1, fiat_p256_uint1* out2, fiat_p256_uint1 arg1, uint64_t arg2, uint64_t arg3) {
108 fiat_p256_int128 x1;
109 fiat_p256_int1 x2;
110 uint64_t x3;
111 x1 = ((arg2 - (fiat_p256_int128)arg1) - arg3);
112 x2 = (fiat_p256_int1)(x1 >> 64);
113 x3 = (uint64_t)(x1 & UINT64_C(0xffffffffffffffff));
David Benjamin32e59d22019-01-08 23:08:42 +0000114 *out1 = x3;
115 *out2 = (fiat_p256_uint1)(0x0 - x2);
116}
117
118/*
David Benjaminbaca5b42020-04-14 15:19:20 -0400119 * The function fiat_p256_mulx_u64 is a multiplication, returning the full double-width result.
David Benjamin8c8e7a62022-03-21 15:14:33 -0400120 *
David Benjaminbaca5b42020-04-14 15:19:20 -0400121 * Postconditions:
122 * out1 = (arg1 * arg2) mod 2^64
123 * out2 = ⌊arg1 * arg2 / 2^64⌋
124 *
David Benjamin32e59d22019-01-08 23:08:42 +0000125 * Input Bounds:
126 * arg1: [0x0 ~> 0xffffffffffffffff]
127 * arg2: [0x0 ~> 0xffffffffffffffff]
128 * Output Bounds:
129 * out1: [0x0 ~> 0xffffffffffffffff]
130 * out2: [0x0 ~> 0xffffffffffffffff]
131 */
David Benjamin8c8e7a62022-03-21 15:14:33 -0400132static FIAT_P256_FIAT_INLINE void fiat_p256_mulx_u64(uint64_t* out1, uint64_t* out2, uint64_t arg1, uint64_t arg2) {
133 fiat_p256_uint128 x1;
134 uint64_t x2;
135 uint64_t x3;
136 x1 = ((fiat_p256_uint128)arg1 * arg2);
137 x2 = (uint64_t)(x1 & UINT64_C(0xffffffffffffffff));
138 x3 = (uint64_t)(x1 >> 64);
David Benjamin32e59d22019-01-08 23:08:42 +0000139 *out1 = x2;
140 *out2 = x3;
141}
142
143/*
David Benjaminbaca5b42020-04-14 15:19:20 -0400144 * The function fiat_p256_cmovznz_u64 is a single-word conditional move.
David Benjamin8c8e7a62022-03-21 15:14:33 -0400145 *
David Benjaminbaca5b42020-04-14 15:19:20 -0400146 * Postconditions:
147 * out1 = (if arg1 = 0 then arg2 else arg3)
148 *
David Benjamin32e59d22019-01-08 23:08:42 +0000149 * Input Bounds:
150 * arg1: [0x0 ~> 0x1]
151 * arg2: [0x0 ~> 0xffffffffffffffff]
152 * arg3: [0x0 ~> 0xffffffffffffffff]
153 * Output Bounds:
154 * out1: [0x0 ~> 0xffffffffffffffff]
155 */
David Benjamin8c8e7a62022-03-21 15:14:33 -0400156static FIAT_P256_FIAT_INLINE void fiat_p256_cmovznz_u64(uint64_t* out1, fiat_p256_uint1 arg1, uint64_t arg2, uint64_t arg3) {
157 fiat_p256_uint1 x1;
158 uint64_t x2;
159 uint64_t x3;
160 x1 = (!(!arg1));
161 x2 = ((fiat_p256_int1)(0x0 - x1) & UINT64_C(0xffffffffffffffff));
162 x3 = ((fiat_p256_value_barrier_u64(x2) & arg3) | (fiat_p256_value_barrier_u64((~x2)) & arg2));
David Benjamin32e59d22019-01-08 23:08:42 +0000163 *out1 = x3;
164}
165
166/*
David Benjaminbaca5b42020-04-14 15:19:20 -0400167 * The function fiat_p256_mul multiplies two field elements in the Montgomery domain.
David Benjamin8c8e7a62022-03-21 15:14:33 -0400168 *
David Benjaminbaca5b42020-04-14 15:19:20 -0400169 * Preconditions:
170 * 0 ≤ eval arg1 < m
171 * 0 ≤ eval arg2 < m
172 * Postconditions:
173 * eval (from_montgomery out1) mod m = (eval (from_montgomery arg1) * eval (from_montgomery arg2)) mod m
174 * 0 ≤ eval out1 < m
175 *
David Benjamin32e59d22019-01-08 23:08:42 +0000176 */
David Benjamin8c8e7a62022-03-21 15:14:33 -0400177static FIAT_P256_FIAT_INLINE void fiat_p256_mul(fiat_p256_montgomery_domain_field_element out1, const fiat_p256_montgomery_domain_field_element arg1, const fiat_p256_montgomery_domain_field_element arg2) {
Andres Erbsen20c94062023-09-25 19:28:44 +0000178#if !defined(OPENSSL_NO_ASM) && defined(__GNUC__) && defined(__x86_64__)
179 if (CRYPTO_is_BMI1_capable() && CRYPTO_is_BMI2_capable() &&
180 CRYPTO_is_ADX_capable()) {
181 fiat_p256_adx_mul(out1, arg1, arg2);
182 return;
183 }
184#endif
David Benjamin8c8e7a62022-03-21 15:14:33 -0400185 uint64_t x1;
186 uint64_t x2;
187 uint64_t x3;
188 uint64_t x4;
David Benjamin32e59d22019-01-08 23:08:42 +0000189 uint64_t x5;
190 uint64_t x6;
David Benjamin32e59d22019-01-08 23:08:42 +0000191 uint64_t x7;
192 uint64_t x8;
David Benjamin32e59d22019-01-08 23:08:42 +0000193 uint64_t x9;
194 uint64_t x10;
David Benjamin32e59d22019-01-08 23:08:42 +0000195 uint64_t x11;
196 uint64_t x12;
David Benjamin32e59d22019-01-08 23:08:42 +0000197 uint64_t x13;
198 fiat_p256_uint1 x14;
David Benjamin32e59d22019-01-08 23:08:42 +0000199 uint64_t x15;
200 fiat_p256_uint1 x16;
David Benjamin32e59d22019-01-08 23:08:42 +0000201 uint64_t x17;
202 fiat_p256_uint1 x18;
David Benjamin8c8e7a62022-03-21 15:14:33 -0400203 uint64_t x19;
David Benjaminbaca5b42020-04-14 15:19:20 -0400204 uint64_t x20;
David Benjamin32e59d22019-01-08 23:08:42 +0000205 uint64_t x21;
206 uint64_t x22;
David Benjamin32e59d22019-01-08 23:08:42 +0000207 uint64_t x23;
208 uint64_t x24;
David Benjamin32e59d22019-01-08 23:08:42 +0000209 uint64_t x25;
210 uint64_t x26;
David Benjaminbaca5b42020-04-14 15:19:20 -0400211 fiat_p256_uint1 x27;
David Benjamin8c8e7a62022-03-21 15:14:33 -0400212 uint64_t x28;
David Benjamin32e59d22019-01-08 23:08:42 +0000213 uint64_t x29;
214 fiat_p256_uint1 x30;
David Benjamin32e59d22019-01-08 23:08:42 +0000215 uint64_t x31;
216 fiat_p256_uint1 x32;
David Benjamin32e59d22019-01-08 23:08:42 +0000217 uint64_t x33;
218 fiat_p256_uint1 x34;
David Benjamin32e59d22019-01-08 23:08:42 +0000219 uint64_t x35;
220 fiat_p256_uint1 x36;
David Benjamin32e59d22019-01-08 23:08:42 +0000221 uint64_t x37;
222 fiat_p256_uint1 x38;
David Benjamin32e59d22019-01-08 23:08:42 +0000223 uint64_t x39;
David Benjaminbaca5b42020-04-14 15:19:20 -0400224 uint64_t x40;
David Benjamin32e59d22019-01-08 23:08:42 +0000225 uint64_t x41;
David Benjaminbaca5b42020-04-14 15:19:20 -0400226 uint64_t x42;
David Benjamin32e59d22019-01-08 23:08:42 +0000227 uint64_t x43;
228 uint64_t x44;
David Benjamin32e59d22019-01-08 23:08:42 +0000229 uint64_t x45;
230 uint64_t x46;
David Benjamin32e59d22019-01-08 23:08:42 +0000231 uint64_t x47;
David Benjaminbaca5b42020-04-14 15:19:20 -0400232 fiat_p256_uint1 x48;
David Benjamin32e59d22019-01-08 23:08:42 +0000233 uint64_t x49;
David Benjaminbaca5b42020-04-14 15:19:20 -0400234 fiat_p256_uint1 x50;
David Benjamin32e59d22019-01-08 23:08:42 +0000235 uint64_t x51;
236 fiat_p256_uint1 x52;
David Benjamin8c8e7a62022-03-21 15:14:33 -0400237 uint64_t x53;
David Benjaminbaca5b42020-04-14 15:19:20 -0400238 uint64_t x54;
239 fiat_p256_uint1 x55;
David Benjaminbaca5b42020-04-14 15:19:20 -0400240 uint64_t x56;
241 fiat_p256_uint1 x57;
David Benjaminbaca5b42020-04-14 15:19:20 -0400242 uint64_t x58;
243 fiat_p256_uint1 x59;
David Benjaminbaca5b42020-04-14 15:19:20 -0400244 uint64_t x60;
245 fiat_p256_uint1 x61;
David Benjaminbaca5b42020-04-14 15:19:20 -0400246 uint64_t x62;
247 fiat_p256_uint1 x63;
David Benjaminbaca5b42020-04-14 15:19:20 -0400248 uint64_t x64;
David Benjamin32e59d22019-01-08 23:08:42 +0000249 uint64_t x65;
David Benjaminbaca5b42020-04-14 15:19:20 -0400250 uint64_t x66;
David Benjamin32e59d22019-01-08 23:08:42 +0000251 uint64_t x67;
David Benjaminbaca5b42020-04-14 15:19:20 -0400252 uint64_t x68;
David Benjamin32e59d22019-01-08 23:08:42 +0000253 uint64_t x69;
254 uint64_t x70;
David Benjaminbaca5b42020-04-14 15:19:20 -0400255 fiat_p256_uint1 x71;
David Benjamin8c8e7a62022-03-21 15:14:33 -0400256 uint64_t x72;
David Benjamin32e59d22019-01-08 23:08:42 +0000257 uint64_t x73;
David Benjaminbaca5b42020-04-14 15:19:20 -0400258 fiat_p256_uint1 x74;
David Benjamin32e59d22019-01-08 23:08:42 +0000259 uint64_t x75;
260 fiat_p256_uint1 x76;
David Benjamin32e59d22019-01-08 23:08:42 +0000261 uint64_t x77;
262 fiat_p256_uint1 x78;
David Benjamin32e59d22019-01-08 23:08:42 +0000263 uint64_t x79;
264 fiat_p256_uint1 x80;
David Benjamin32e59d22019-01-08 23:08:42 +0000265 uint64_t x81;
266 fiat_p256_uint1 x82;
David Benjamin8c8e7a62022-03-21 15:14:33 -0400267 uint64_t x83;
David Benjaminbaca5b42020-04-14 15:19:20 -0400268 uint64_t x84;
David Benjamin32e59d22019-01-08 23:08:42 +0000269 uint64_t x85;
David Benjaminbaca5b42020-04-14 15:19:20 -0400270 uint64_t x86;
David Benjamin32e59d22019-01-08 23:08:42 +0000271 uint64_t x87;
David Benjaminbaca5b42020-04-14 15:19:20 -0400272 uint64_t x88;
David Benjamin32e59d22019-01-08 23:08:42 +0000273 uint64_t x89;
David Benjaminbaca5b42020-04-14 15:19:20 -0400274 uint64_t x90;
David Benjamin32e59d22019-01-08 23:08:42 +0000275 uint64_t x91;
276 uint64_t x92;
David Benjaminbaca5b42020-04-14 15:19:20 -0400277 fiat_p256_uint1 x93;
David Benjamin32e59d22019-01-08 23:08:42 +0000278 uint64_t x94;
David Benjaminbaca5b42020-04-14 15:19:20 -0400279 fiat_p256_uint1 x95;
David Benjamin32e59d22019-01-08 23:08:42 +0000280 uint64_t x96;
David Benjaminbaca5b42020-04-14 15:19:20 -0400281 fiat_p256_uint1 x97;
David Benjamin8c8e7a62022-03-21 15:14:33 -0400282 uint64_t x98;
David Benjamin32e59d22019-01-08 23:08:42 +0000283 uint64_t x99;
284 fiat_p256_uint1 x100;
David Benjamin32e59d22019-01-08 23:08:42 +0000285 uint64_t x101;
286 fiat_p256_uint1 x102;
David Benjamin32e59d22019-01-08 23:08:42 +0000287 uint64_t x103;
288 fiat_p256_uint1 x104;
David Benjamin32e59d22019-01-08 23:08:42 +0000289 uint64_t x105;
290 fiat_p256_uint1 x106;
David Benjamin32e59d22019-01-08 23:08:42 +0000291 uint64_t x107;
292 fiat_p256_uint1 x108;
David Benjamin32e59d22019-01-08 23:08:42 +0000293 uint64_t x109;
David Benjaminbaca5b42020-04-14 15:19:20 -0400294 uint64_t x110;
David Benjamin32e59d22019-01-08 23:08:42 +0000295 uint64_t x111;
David Benjaminbaca5b42020-04-14 15:19:20 -0400296 uint64_t x112;
David Benjamin32e59d22019-01-08 23:08:42 +0000297 uint64_t x113;
David Benjaminbaca5b42020-04-14 15:19:20 -0400298 uint64_t x114;
David Benjamin32e59d22019-01-08 23:08:42 +0000299 uint64_t x115;
300 fiat_p256_uint1 x116;
David Benjamin8c8e7a62022-03-21 15:14:33 -0400301 uint64_t x117;
David Benjamin32e59d22019-01-08 23:08:42 +0000302 uint64_t x118;
David Benjaminbaca5b42020-04-14 15:19:20 -0400303 fiat_p256_uint1 x119;
David Benjamin32e59d22019-01-08 23:08:42 +0000304 uint64_t x120;
David Benjaminbaca5b42020-04-14 15:19:20 -0400305 fiat_p256_uint1 x121;
David Benjamin32e59d22019-01-08 23:08:42 +0000306 uint64_t x122;
David Benjaminbaca5b42020-04-14 15:19:20 -0400307 fiat_p256_uint1 x123;
David Benjaminbaca5b42020-04-14 15:19:20 -0400308 uint64_t x124;
309 fiat_p256_uint1 x125;
David Benjaminbaca5b42020-04-14 15:19:20 -0400310 uint64_t x126;
311 fiat_p256_uint1 x127;
David Benjamin8c8e7a62022-03-21 15:14:33 -0400312 uint64_t x128;
David Benjamin32e59d22019-01-08 23:08:42 +0000313 uint64_t x129;
David Benjaminbaca5b42020-04-14 15:19:20 -0400314 uint64_t x130;
David Benjamin32e59d22019-01-08 23:08:42 +0000315 uint64_t x131;
David Benjaminbaca5b42020-04-14 15:19:20 -0400316 uint64_t x132;
David Benjamin32e59d22019-01-08 23:08:42 +0000317 uint64_t x133;
David Benjaminbaca5b42020-04-14 15:19:20 -0400318 uint64_t x134;
David Benjamin32e59d22019-01-08 23:08:42 +0000319 uint64_t x135;
David Benjaminbaca5b42020-04-14 15:19:20 -0400320 uint64_t x136;
David Benjamin32e59d22019-01-08 23:08:42 +0000321 uint64_t x137;
322 fiat_p256_uint1 x138;
David Benjamin32e59d22019-01-08 23:08:42 +0000323 uint64_t x139;
David Benjaminbaca5b42020-04-14 15:19:20 -0400324 fiat_p256_uint1 x140;
David Benjamin32e59d22019-01-08 23:08:42 +0000325 uint64_t x141;
David Benjaminbaca5b42020-04-14 15:19:20 -0400326 fiat_p256_uint1 x142;
David Benjamin8c8e7a62022-03-21 15:14:33 -0400327 uint64_t x143;
David Benjamin32e59d22019-01-08 23:08:42 +0000328 uint64_t x144;
David Benjaminbaca5b42020-04-14 15:19:20 -0400329 fiat_p256_uint1 x145;
David Benjamin32e59d22019-01-08 23:08:42 +0000330 uint64_t x146;
David Benjaminbaca5b42020-04-14 15:19:20 -0400331 fiat_p256_uint1 x147;
David Benjaminbaca5b42020-04-14 15:19:20 -0400332 uint64_t x148;
333 fiat_p256_uint1 x149;
David Benjaminbaca5b42020-04-14 15:19:20 -0400334 uint64_t x150;
335 fiat_p256_uint1 x151;
David Benjaminbaca5b42020-04-14 15:19:20 -0400336 uint64_t x152;
337 fiat_p256_uint1 x153;
David Benjaminbaca5b42020-04-14 15:19:20 -0400338 uint64_t x154;
David Benjamin32e59d22019-01-08 23:08:42 +0000339 uint64_t x155;
David Benjaminbaca5b42020-04-14 15:19:20 -0400340 uint64_t x156;
David Benjamin32e59d22019-01-08 23:08:42 +0000341 uint64_t x157;
David Benjaminbaca5b42020-04-14 15:19:20 -0400342 uint64_t x158;
David Benjamin32e59d22019-01-08 23:08:42 +0000343 uint64_t x159;
David Benjaminbaca5b42020-04-14 15:19:20 -0400344 uint64_t x160;
345 fiat_p256_uint1 x161;
David Benjamin8c8e7a62022-03-21 15:14:33 -0400346 uint64_t x162;
David Benjamin32e59d22019-01-08 23:08:42 +0000347 uint64_t x163;
348 fiat_p256_uint1 x164;
David Benjamin32e59d22019-01-08 23:08:42 +0000349 uint64_t x165;
David Benjaminbaca5b42020-04-14 15:19:20 -0400350 fiat_p256_uint1 x166;
David Benjamin32e59d22019-01-08 23:08:42 +0000351 uint64_t x167;
David Benjaminbaca5b42020-04-14 15:19:20 -0400352 fiat_p256_uint1 x168;
David Benjamin32e59d22019-01-08 23:08:42 +0000353 uint64_t x169;
David Benjaminbaca5b42020-04-14 15:19:20 -0400354 fiat_p256_uint1 x170;
David Benjamin32e59d22019-01-08 23:08:42 +0000355 uint64_t x171;
356 fiat_p256_uint1 x172;
David Benjamin8c8e7a62022-03-21 15:14:33 -0400357 uint64_t x173;
David Benjaminbaca5b42020-04-14 15:19:20 -0400358 uint64_t x174;
359 fiat_p256_uint1 x175;
David Benjaminbaca5b42020-04-14 15:19:20 -0400360 uint64_t x176;
361 fiat_p256_uint1 x177;
David Benjaminbaca5b42020-04-14 15:19:20 -0400362 uint64_t x178;
363 fiat_p256_uint1 x179;
David Benjaminbaca5b42020-04-14 15:19:20 -0400364 uint64_t x180;
365 fiat_p256_uint1 x181;
David Benjaminbaca5b42020-04-14 15:19:20 -0400366 uint64_t x182;
367 fiat_p256_uint1 x183;
David Benjaminbaca5b42020-04-14 15:19:20 -0400368 uint64_t x184;
David Benjamin32e59d22019-01-08 23:08:42 +0000369 uint64_t x185;
David Benjaminbaca5b42020-04-14 15:19:20 -0400370 uint64_t x186;
David Benjamin32e59d22019-01-08 23:08:42 +0000371 uint64_t x187;
David Benjamin8c8e7a62022-03-21 15:14:33 -0400372 x1 = (arg1[1]);
373 x2 = (arg1[2]);
374 x3 = (arg1[3]);
375 x4 = (arg1[0]);
376 fiat_p256_mulx_u64(&x5, &x6, x4, (arg2[3]));
377 fiat_p256_mulx_u64(&x7, &x8, x4, (arg2[2]));
378 fiat_p256_mulx_u64(&x9, &x10, x4, (arg2[1]));
379 fiat_p256_mulx_u64(&x11, &x12, x4, (arg2[0]));
380 fiat_p256_addcarryx_u64(&x13, &x14, 0x0, x12, x9);
381 fiat_p256_addcarryx_u64(&x15, &x16, x14, x10, x7);
382 fiat_p256_addcarryx_u64(&x17, &x18, x16, x8, x5);
383 x19 = (x18 + x6);
384 fiat_p256_mulx_u64(&x20, &x21, x11, UINT64_C(0xffffffff00000001));
385 fiat_p256_mulx_u64(&x22, &x23, x11, UINT32_C(0xffffffff));
386 fiat_p256_mulx_u64(&x24, &x25, x11, UINT64_C(0xffffffffffffffff));
387 fiat_p256_addcarryx_u64(&x26, &x27, 0x0, x25, x22);
388 x28 = (x27 + x23);
389 fiat_p256_addcarryx_u64(&x29, &x30, 0x0, x11, x24);
390 fiat_p256_addcarryx_u64(&x31, &x32, x30, x13, x26);
391 fiat_p256_addcarryx_u64(&x33, &x34, x32, x15, x28);
392 fiat_p256_addcarryx_u64(&x35, &x36, x34, x17, x20);
393 fiat_p256_addcarryx_u64(&x37, &x38, x36, x19, x21);
394 fiat_p256_mulx_u64(&x39, &x40, x1, (arg2[3]));
395 fiat_p256_mulx_u64(&x41, &x42, x1, (arg2[2]));
396 fiat_p256_mulx_u64(&x43, &x44, x1, (arg2[1]));
397 fiat_p256_mulx_u64(&x45, &x46, x1, (arg2[0]));
398 fiat_p256_addcarryx_u64(&x47, &x48, 0x0, x46, x43);
399 fiat_p256_addcarryx_u64(&x49, &x50, x48, x44, x41);
400 fiat_p256_addcarryx_u64(&x51, &x52, x50, x42, x39);
401 x53 = (x52 + x40);
402 fiat_p256_addcarryx_u64(&x54, &x55, 0x0, x31, x45);
403 fiat_p256_addcarryx_u64(&x56, &x57, x55, x33, x47);
404 fiat_p256_addcarryx_u64(&x58, &x59, x57, x35, x49);
405 fiat_p256_addcarryx_u64(&x60, &x61, x59, x37, x51);
406 fiat_p256_addcarryx_u64(&x62, &x63, x61, x38, x53);
407 fiat_p256_mulx_u64(&x64, &x65, x54, UINT64_C(0xffffffff00000001));
408 fiat_p256_mulx_u64(&x66, &x67, x54, UINT32_C(0xffffffff));
409 fiat_p256_mulx_u64(&x68, &x69, x54, UINT64_C(0xffffffffffffffff));
410 fiat_p256_addcarryx_u64(&x70, &x71, 0x0, x69, x66);
411 x72 = (x71 + x67);
412 fiat_p256_addcarryx_u64(&x73, &x74, 0x0, x54, x68);
413 fiat_p256_addcarryx_u64(&x75, &x76, x74, x56, x70);
414 fiat_p256_addcarryx_u64(&x77, &x78, x76, x58, x72);
415 fiat_p256_addcarryx_u64(&x79, &x80, x78, x60, x64);
416 fiat_p256_addcarryx_u64(&x81, &x82, x80, x62, x65);
417 x83 = ((uint64_t)x82 + x63);
418 fiat_p256_mulx_u64(&x84, &x85, x2, (arg2[3]));
419 fiat_p256_mulx_u64(&x86, &x87, x2, (arg2[2]));
420 fiat_p256_mulx_u64(&x88, &x89, x2, (arg2[1]));
421 fiat_p256_mulx_u64(&x90, &x91, x2, (arg2[0]));
422 fiat_p256_addcarryx_u64(&x92, &x93, 0x0, x91, x88);
423 fiat_p256_addcarryx_u64(&x94, &x95, x93, x89, x86);
424 fiat_p256_addcarryx_u64(&x96, &x97, x95, x87, x84);
425 x98 = (x97 + x85);
426 fiat_p256_addcarryx_u64(&x99, &x100, 0x0, x75, x90);
427 fiat_p256_addcarryx_u64(&x101, &x102, x100, x77, x92);
428 fiat_p256_addcarryx_u64(&x103, &x104, x102, x79, x94);
429 fiat_p256_addcarryx_u64(&x105, &x106, x104, x81, x96);
430 fiat_p256_addcarryx_u64(&x107, &x108, x106, x83, x98);
431 fiat_p256_mulx_u64(&x109, &x110, x99, UINT64_C(0xffffffff00000001));
432 fiat_p256_mulx_u64(&x111, &x112, x99, UINT32_C(0xffffffff));
433 fiat_p256_mulx_u64(&x113, &x114, x99, UINT64_C(0xffffffffffffffff));
434 fiat_p256_addcarryx_u64(&x115, &x116, 0x0, x114, x111);
435 x117 = (x116 + x112);
436 fiat_p256_addcarryx_u64(&x118, &x119, 0x0, x99, x113);
437 fiat_p256_addcarryx_u64(&x120, &x121, x119, x101, x115);
438 fiat_p256_addcarryx_u64(&x122, &x123, x121, x103, x117);
439 fiat_p256_addcarryx_u64(&x124, &x125, x123, x105, x109);
440 fiat_p256_addcarryx_u64(&x126, &x127, x125, x107, x110);
441 x128 = ((uint64_t)x127 + x108);
442 fiat_p256_mulx_u64(&x129, &x130, x3, (arg2[3]));
443 fiat_p256_mulx_u64(&x131, &x132, x3, (arg2[2]));
444 fiat_p256_mulx_u64(&x133, &x134, x3, (arg2[1]));
445 fiat_p256_mulx_u64(&x135, &x136, x3, (arg2[0]));
446 fiat_p256_addcarryx_u64(&x137, &x138, 0x0, x136, x133);
447 fiat_p256_addcarryx_u64(&x139, &x140, x138, x134, x131);
448 fiat_p256_addcarryx_u64(&x141, &x142, x140, x132, x129);
449 x143 = (x142 + x130);
450 fiat_p256_addcarryx_u64(&x144, &x145, 0x0, x120, x135);
451 fiat_p256_addcarryx_u64(&x146, &x147, x145, x122, x137);
452 fiat_p256_addcarryx_u64(&x148, &x149, x147, x124, x139);
453 fiat_p256_addcarryx_u64(&x150, &x151, x149, x126, x141);
454 fiat_p256_addcarryx_u64(&x152, &x153, x151, x128, x143);
455 fiat_p256_mulx_u64(&x154, &x155, x144, UINT64_C(0xffffffff00000001));
456 fiat_p256_mulx_u64(&x156, &x157, x144, UINT32_C(0xffffffff));
457 fiat_p256_mulx_u64(&x158, &x159, x144, UINT64_C(0xffffffffffffffff));
458 fiat_p256_addcarryx_u64(&x160, &x161, 0x0, x159, x156);
459 x162 = (x161 + x157);
460 fiat_p256_addcarryx_u64(&x163, &x164, 0x0, x144, x158);
461 fiat_p256_addcarryx_u64(&x165, &x166, x164, x146, x160);
462 fiat_p256_addcarryx_u64(&x167, &x168, x166, x148, x162);
463 fiat_p256_addcarryx_u64(&x169, &x170, x168, x150, x154);
464 fiat_p256_addcarryx_u64(&x171, &x172, x170, x152, x155);
465 x173 = ((uint64_t)x172 + x153);
466 fiat_p256_subborrowx_u64(&x174, &x175, 0x0, x165, UINT64_C(0xffffffffffffffff));
467 fiat_p256_subborrowx_u64(&x176, &x177, x175, x167, UINT32_C(0xffffffff));
468 fiat_p256_subborrowx_u64(&x178, &x179, x177, x169, 0x0);
469 fiat_p256_subborrowx_u64(&x180, &x181, x179, x171, UINT64_C(0xffffffff00000001));
470 fiat_p256_subborrowx_u64(&x182, &x183, x181, x173, 0x0);
471 fiat_p256_cmovznz_u64(&x184, x183, x174, x165);
472 fiat_p256_cmovznz_u64(&x185, x183, x176, x167);
473 fiat_p256_cmovznz_u64(&x186, x183, x178, x169);
David Benjaminbaca5b42020-04-14 15:19:20 -0400474 fiat_p256_cmovznz_u64(&x187, x183, x180, x171);
475 out1[0] = x184;
476 out1[1] = x185;
477 out1[2] = x186;
478 out1[3] = x187;
David Benjamin32e59d22019-01-08 23:08:42 +0000479}
480
481/*
David Benjaminbaca5b42020-04-14 15:19:20 -0400482 * The function fiat_p256_square squares a field element in the Montgomery domain.
David Benjamin8c8e7a62022-03-21 15:14:33 -0400483 *
David Benjaminbaca5b42020-04-14 15:19:20 -0400484 * Preconditions:
485 * 0 ≤ eval arg1 < m
486 * Postconditions:
487 * eval (from_montgomery out1) mod m = (eval (from_montgomery arg1) * eval (from_montgomery arg1)) mod m
488 * 0 ≤ eval out1 < m
489 *
David Benjamin32e59d22019-01-08 23:08:42 +0000490 */
David Benjamin8c8e7a62022-03-21 15:14:33 -0400491static FIAT_P256_FIAT_INLINE void fiat_p256_square(fiat_p256_montgomery_domain_field_element out1, const fiat_p256_montgomery_domain_field_element arg1) {
Andres Erbsen20c94062023-09-25 19:28:44 +0000492#if !defined(OPENSSL_NO_ASM) && defined(__GNUC__) && defined(__x86_64__)
493 if (CRYPTO_is_BMI1_capable() && CRYPTO_is_BMI2_capable() &&
494 CRYPTO_is_ADX_capable()) {
495 fiat_p256_adx_sqr(out1, arg1);
496 return;
497 }
498#endif
David Benjamin8c8e7a62022-03-21 15:14:33 -0400499 uint64_t x1;
500 uint64_t x2;
501 uint64_t x3;
502 uint64_t x4;
David Benjamin32e59d22019-01-08 23:08:42 +0000503 uint64_t x5;
504 uint64_t x6;
David Benjamin32e59d22019-01-08 23:08:42 +0000505 uint64_t x7;
506 uint64_t x8;
David Benjamin32e59d22019-01-08 23:08:42 +0000507 uint64_t x9;
508 uint64_t x10;
David Benjamin32e59d22019-01-08 23:08:42 +0000509 uint64_t x11;
510 uint64_t x12;
David Benjamin32e59d22019-01-08 23:08:42 +0000511 uint64_t x13;
512 fiat_p256_uint1 x14;
David Benjamin32e59d22019-01-08 23:08:42 +0000513 uint64_t x15;
514 fiat_p256_uint1 x16;
David Benjamin32e59d22019-01-08 23:08:42 +0000515 uint64_t x17;
516 fiat_p256_uint1 x18;
David Benjamin8c8e7a62022-03-21 15:14:33 -0400517 uint64_t x19;
David Benjaminbaca5b42020-04-14 15:19:20 -0400518 uint64_t x20;
David Benjamin32e59d22019-01-08 23:08:42 +0000519 uint64_t x21;
520 uint64_t x22;
David Benjamin32e59d22019-01-08 23:08:42 +0000521 uint64_t x23;
522 uint64_t x24;
David Benjamin32e59d22019-01-08 23:08:42 +0000523 uint64_t x25;
524 uint64_t x26;
David Benjaminbaca5b42020-04-14 15:19:20 -0400525 fiat_p256_uint1 x27;
David Benjamin8c8e7a62022-03-21 15:14:33 -0400526 uint64_t x28;
David Benjamin32e59d22019-01-08 23:08:42 +0000527 uint64_t x29;
528 fiat_p256_uint1 x30;
David Benjamin32e59d22019-01-08 23:08:42 +0000529 uint64_t x31;
530 fiat_p256_uint1 x32;
David Benjamin32e59d22019-01-08 23:08:42 +0000531 uint64_t x33;
532 fiat_p256_uint1 x34;
David Benjamin32e59d22019-01-08 23:08:42 +0000533 uint64_t x35;
534 fiat_p256_uint1 x36;
David Benjamin32e59d22019-01-08 23:08:42 +0000535 uint64_t x37;
536 fiat_p256_uint1 x38;
David Benjamin32e59d22019-01-08 23:08:42 +0000537 uint64_t x39;
David Benjaminbaca5b42020-04-14 15:19:20 -0400538 uint64_t x40;
David Benjamin32e59d22019-01-08 23:08:42 +0000539 uint64_t x41;
David Benjaminbaca5b42020-04-14 15:19:20 -0400540 uint64_t x42;
David Benjamin32e59d22019-01-08 23:08:42 +0000541 uint64_t x43;
542 uint64_t x44;
David Benjamin32e59d22019-01-08 23:08:42 +0000543 uint64_t x45;
544 uint64_t x46;
David Benjamin32e59d22019-01-08 23:08:42 +0000545 uint64_t x47;
David Benjaminbaca5b42020-04-14 15:19:20 -0400546 fiat_p256_uint1 x48;
David Benjamin32e59d22019-01-08 23:08:42 +0000547 uint64_t x49;
David Benjaminbaca5b42020-04-14 15:19:20 -0400548 fiat_p256_uint1 x50;
David Benjamin32e59d22019-01-08 23:08:42 +0000549 uint64_t x51;
550 fiat_p256_uint1 x52;
David Benjamin8c8e7a62022-03-21 15:14:33 -0400551 uint64_t x53;
David Benjaminbaca5b42020-04-14 15:19:20 -0400552 uint64_t x54;
553 fiat_p256_uint1 x55;
David Benjaminbaca5b42020-04-14 15:19:20 -0400554 uint64_t x56;
555 fiat_p256_uint1 x57;
David Benjaminbaca5b42020-04-14 15:19:20 -0400556 uint64_t x58;
557 fiat_p256_uint1 x59;
David Benjaminbaca5b42020-04-14 15:19:20 -0400558 uint64_t x60;
559 fiat_p256_uint1 x61;
David Benjaminbaca5b42020-04-14 15:19:20 -0400560 uint64_t x62;
561 fiat_p256_uint1 x63;
David Benjaminbaca5b42020-04-14 15:19:20 -0400562 uint64_t x64;
David Benjamin32e59d22019-01-08 23:08:42 +0000563 uint64_t x65;
David Benjaminbaca5b42020-04-14 15:19:20 -0400564 uint64_t x66;
David Benjamin32e59d22019-01-08 23:08:42 +0000565 uint64_t x67;
David Benjaminbaca5b42020-04-14 15:19:20 -0400566 uint64_t x68;
David Benjamin32e59d22019-01-08 23:08:42 +0000567 uint64_t x69;
568 uint64_t x70;
David Benjaminbaca5b42020-04-14 15:19:20 -0400569 fiat_p256_uint1 x71;
David Benjamin8c8e7a62022-03-21 15:14:33 -0400570 uint64_t x72;
David Benjamin32e59d22019-01-08 23:08:42 +0000571 uint64_t x73;
David Benjaminbaca5b42020-04-14 15:19:20 -0400572 fiat_p256_uint1 x74;
David Benjamin32e59d22019-01-08 23:08:42 +0000573 uint64_t x75;
574 fiat_p256_uint1 x76;
David Benjamin32e59d22019-01-08 23:08:42 +0000575 uint64_t x77;
576 fiat_p256_uint1 x78;
David Benjamin32e59d22019-01-08 23:08:42 +0000577 uint64_t x79;
578 fiat_p256_uint1 x80;
David Benjamin32e59d22019-01-08 23:08:42 +0000579 uint64_t x81;
580 fiat_p256_uint1 x82;
David Benjamin8c8e7a62022-03-21 15:14:33 -0400581 uint64_t x83;
David Benjaminbaca5b42020-04-14 15:19:20 -0400582 uint64_t x84;
David Benjamin32e59d22019-01-08 23:08:42 +0000583 uint64_t x85;
David Benjaminbaca5b42020-04-14 15:19:20 -0400584 uint64_t x86;
David Benjamin32e59d22019-01-08 23:08:42 +0000585 uint64_t x87;
David Benjaminbaca5b42020-04-14 15:19:20 -0400586 uint64_t x88;
David Benjamin32e59d22019-01-08 23:08:42 +0000587 uint64_t x89;
David Benjaminbaca5b42020-04-14 15:19:20 -0400588 uint64_t x90;
David Benjamin32e59d22019-01-08 23:08:42 +0000589 uint64_t x91;
590 uint64_t x92;
David Benjaminbaca5b42020-04-14 15:19:20 -0400591 fiat_p256_uint1 x93;
David Benjamin32e59d22019-01-08 23:08:42 +0000592 uint64_t x94;
David Benjaminbaca5b42020-04-14 15:19:20 -0400593 fiat_p256_uint1 x95;
David Benjamin32e59d22019-01-08 23:08:42 +0000594 uint64_t x96;
David Benjaminbaca5b42020-04-14 15:19:20 -0400595 fiat_p256_uint1 x97;
David Benjamin8c8e7a62022-03-21 15:14:33 -0400596 uint64_t x98;
David Benjamin32e59d22019-01-08 23:08:42 +0000597 uint64_t x99;
598 fiat_p256_uint1 x100;
David Benjamin32e59d22019-01-08 23:08:42 +0000599 uint64_t x101;
600 fiat_p256_uint1 x102;
David Benjamin32e59d22019-01-08 23:08:42 +0000601 uint64_t x103;
602 fiat_p256_uint1 x104;
David Benjamin32e59d22019-01-08 23:08:42 +0000603 uint64_t x105;
604 fiat_p256_uint1 x106;
David Benjamin32e59d22019-01-08 23:08:42 +0000605 uint64_t x107;
606 fiat_p256_uint1 x108;
David Benjamin32e59d22019-01-08 23:08:42 +0000607 uint64_t x109;
David Benjaminbaca5b42020-04-14 15:19:20 -0400608 uint64_t x110;
David Benjamin32e59d22019-01-08 23:08:42 +0000609 uint64_t x111;
David Benjaminbaca5b42020-04-14 15:19:20 -0400610 uint64_t x112;
David Benjamin32e59d22019-01-08 23:08:42 +0000611 uint64_t x113;
David Benjaminbaca5b42020-04-14 15:19:20 -0400612 uint64_t x114;
David Benjamin32e59d22019-01-08 23:08:42 +0000613 uint64_t x115;
614 fiat_p256_uint1 x116;
David Benjamin8c8e7a62022-03-21 15:14:33 -0400615 uint64_t x117;
David Benjamin32e59d22019-01-08 23:08:42 +0000616 uint64_t x118;
David Benjaminbaca5b42020-04-14 15:19:20 -0400617 fiat_p256_uint1 x119;
David Benjamin32e59d22019-01-08 23:08:42 +0000618 uint64_t x120;
David Benjaminbaca5b42020-04-14 15:19:20 -0400619 fiat_p256_uint1 x121;
David Benjamin32e59d22019-01-08 23:08:42 +0000620 uint64_t x122;
David Benjaminbaca5b42020-04-14 15:19:20 -0400621 fiat_p256_uint1 x123;
David Benjaminbaca5b42020-04-14 15:19:20 -0400622 uint64_t x124;
623 fiat_p256_uint1 x125;
David Benjaminbaca5b42020-04-14 15:19:20 -0400624 uint64_t x126;
625 fiat_p256_uint1 x127;
David Benjamin8c8e7a62022-03-21 15:14:33 -0400626 uint64_t x128;
David Benjamin32e59d22019-01-08 23:08:42 +0000627 uint64_t x129;
David Benjaminbaca5b42020-04-14 15:19:20 -0400628 uint64_t x130;
David Benjamin32e59d22019-01-08 23:08:42 +0000629 uint64_t x131;
David Benjaminbaca5b42020-04-14 15:19:20 -0400630 uint64_t x132;
David Benjamin32e59d22019-01-08 23:08:42 +0000631 uint64_t x133;
David Benjaminbaca5b42020-04-14 15:19:20 -0400632 uint64_t x134;
David Benjamin32e59d22019-01-08 23:08:42 +0000633 uint64_t x135;
David Benjaminbaca5b42020-04-14 15:19:20 -0400634 uint64_t x136;
David Benjamin32e59d22019-01-08 23:08:42 +0000635 uint64_t x137;
636 fiat_p256_uint1 x138;
David Benjamin32e59d22019-01-08 23:08:42 +0000637 uint64_t x139;
David Benjaminbaca5b42020-04-14 15:19:20 -0400638 fiat_p256_uint1 x140;
David Benjamin32e59d22019-01-08 23:08:42 +0000639 uint64_t x141;
David Benjaminbaca5b42020-04-14 15:19:20 -0400640 fiat_p256_uint1 x142;
David Benjamin8c8e7a62022-03-21 15:14:33 -0400641 uint64_t x143;
David Benjamin32e59d22019-01-08 23:08:42 +0000642 uint64_t x144;
David Benjaminbaca5b42020-04-14 15:19:20 -0400643 fiat_p256_uint1 x145;
David Benjamin32e59d22019-01-08 23:08:42 +0000644 uint64_t x146;
David Benjaminbaca5b42020-04-14 15:19:20 -0400645 fiat_p256_uint1 x147;
David Benjaminbaca5b42020-04-14 15:19:20 -0400646 uint64_t x148;
647 fiat_p256_uint1 x149;
David Benjaminbaca5b42020-04-14 15:19:20 -0400648 uint64_t x150;
649 fiat_p256_uint1 x151;
David Benjaminbaca5b42020-04-14 15:19:20 -0400650 uint64_t x152;
651 fiat_p256_uint1 x153;
David Benjaminbaca5b42020-04-14 15:19:20 -0400652 uint64_t x154;
David Benjamin32e59d22019-01-08 23:08:42 +0000653 uint64_t x155;
David Benjaminbaca5b42020-04-14 15:19:20 -0400654 uint64_t x156;
David Benjamin32e59d22019-01-08 23:08:42 +0000655 uint64_t x157;
David Benjaminbaca5b42020-04-14 15:19:20 -0400656 uint64_t x158;
David Benjamin32e59d22019-01-08 23:08:42 +0000657 uint64_t x159;
David Benjaminbaca5b42020-04-14 15:19:20 -0400658 uint64_t x160;
659 fiat_p256_uint1 x161;
David Benjamin8c8e7a62022-03-21 15:14:33 -0400660 uint64_t x162;
David Benjamin32e59d22019-01-08 23:08:42 +0000661 uint64_t x163;
662 fiat_p256_uint1 x164;
David Benjamin32e59d22019-01-08 23:08:42 +0000663 uint64_t x165;
David Benjaminbaca5b42020-04-14 15:19:20 -0400664 fiat_p256_uint1 x166;
David Benjamin32e59d22019-01-08 23:08:42 +0000665 uint64_t x167;
David Benjaminbaca5b42020-04-14 15:19:20 -0400666 fiat_p256_uint1 x168;
David Benjamin32e59d22019-01-08 23:08:42 +0000667 uint64_t x169;
David Benjaminbaca5b42020-04-14 15:19:20 -0400668 fiat_p256_uint1 x170;
David Benjamin32e59d22019-01-08 23:08:42 +0000669 uint64_t x171;
670 fiat_p256_uint1 x172;
David Benjamin8c8e7a62022-03-21 15:14:33 -0400671 uint64_t x173;
David Benjaminbaca5b42020-04-14 15:19:20 -0400672 uint64_t x174;
673 fiat_p256_uint1 x175;
David Benjaminbaca5b42020-04-14 15:19:20 -0400674 uint64_t x176;
675 fiat_p256_uint1 x177;
David Benjaminbaca5b42020-04-14 15:19:20 -0400676 uint64_t x178;
677 fiat_p256_uint1 x179;
David Benjaminbaca5b42020-04-14 15:19:20 -0400678 uint64_t x180;
679 fiat_p256_uint1 x181;
David Benjaminbaca5b42020-04-14 15:19:20 -0400680 uint64_t x182;
681 fiat_p256_uint1 x183;
David Benjaminbaca5b42020-04-14 15:19:20 -0400682 uint64_t x184;
David Benjamin32e59d22019-01-08 23:08:42 +0000683 uint64_t x185;
David Benjaminbaca5b42020-04-14 15:19:20 -0400684 uint64_t x186;
David Benjamin32e59d22019-01-08 23:08:42 +0000685 uint64_t x187;
David Benjamin8c8e7a62022-03-21 15:14:33 -0400686 x1 = (arg1[1]);
687 x2 = (arg1[2]);
688 x3 = (arg1[3]);
689 x4 = (arg1[0]);
690 fiat_p256_mulx_u64(&x5, &x6, x4, (arg1[3]));
691 fiat_p256_mulx_u64(&x7, &x8, x4, (arg1[2]));
692 fiat_p256_mulx_u64(&x9, &x10, x4, (arg1[1]));
693 fiat_p256_mulx_u64(&x11, &x12, x4, (arg1[0]));
694 fiat_p256_addcarryx_u64(&x13, &x14, 0x0, x12, x9);
695 fiat_p256_addcarryx_u64(&x15, &x16, x14, x10, x7);
696 fiat_p256_addcarryx_u64(&x17, &x18, x16, x8, x5);
697 x19 = (x18 + x6);
698 fiat_p256_mulx_u64(&x20, &x21, x11, UINT64_C(0xffffffff00000001));
699 fiat_p256_mulx_u64(&x22, &x23, x11, UINT32_C(0xffffffff));
700 fiat_p256_mulx_u64(&x24, &x25, x11, UINT64_C(0xffffffffffffffff));
701 fiat_p256_addcarryx_u64(&x26, &x27, 0x0, x25, x22);
702 x28 = (x27 + x23);
703 fiat_p256_addcarryx_u64(&x29, &x30, 0x0, x11, x24);
704 fiat_p256_addcarryx_u64(&x31, &x32, x30, x13, x26);
705 fiat_p256_addcarryx_u64(&x33, &x34, x32, x15, x28);
706 fiat_p256_addcarryx_u64(&x35, &x36, x34, x17, x20);
707 fiat_p256_addcarryx_u64(&x37, &x38, x36, x19, x21);
708 fiat_p256_mulx_u64(&x39, &x40, x1, (arg1[3]));
709 fiat_p256_mulx_u64(&x41, &x42, x1, (arg1[2]));
710 fiat_p256_mulx_u64(&x43, &x44, x1, (arg1[1]));
711 fiat_p256_mulx_u64(&x45, &x46, x1, (arg1[0]));
712 fiat_p256_addcarryx_u64(&x47, &x48, 0x0, x46, x43);
713 fiat_p256_addcarryx_u64(&x49, &x50, x48, x44, x41);
714 fiat_p256_addcarryx_u64(&x51, &x52, x50, x42, x39);
715 x53 = (x52 + x40);
716 fiat_p256_addcarryx_u64(&x54, &x55, 0x0, x31, x45);
717 fiat_p256_addcarryx_u64(&x56, &x57, x55, x33, x47);
718 fiat_p256_addcarryx_u64(&x58, &x59, x57, x35, x49);
719 fiat_p256_addcarryx_u64(&x60, &x61, x59, x37, x51);
720 fiat_p256_addcarryx_u64(&x62, &x63, x61, x38, x53);
721 fiat_p256_mulx_u64(&x64, &x65, x54, UINT64_C(0xffffffff00000001));
722 fiat_p256_mulx_u64(&x66, &x67, x54, UINT32_C(0xffffffff));
723 fiat_p256_mulx_u64(&x68, &x69, x54, UINT64_C(0xffffffffffffffff));
724 fiat_p256_addcarryx_u64(&x70, &x71, 0x0, x69, x66);
725 x72 = (x71 + x67);
726 fiat_p256_addcarryx_u64(&x73, &x74, 0x0, x54, x68);
727 fiat_p256_addcarryx_u64(&x75, &x76, x74, x56, x70);
728 fiat_p256_addcarryx_u64(&x77, &x78, x76, x58, x72);
729 fiat_p256_addcarryx_u64(&x79, &x80, x78, x60, x64);
730 fiat_p256_addcarryx_u64(&x81, &x82, x80, x62, x65);
731 x83 = ((uint64_t)x82 + x63);
732 fiat_p256_mulx_u64(&x84, &x85, x2, (arg1[3]));
733 fiat_p256_mulx_u64(&x86, &x87, x2, (arg1[2]));
734 fiat_p256_mulx_u64(&x88, &x89, x2, (arg1[1]));
735 fiat_p256_mulx_u64(&x90, &x91, x2, (arg1[0]));
736 fiat_p256_addcarryx_u64(&x92, &x93, 0x0, x91, x88);
737 fiat_p256_addcarryx_u64(&x94, &x95, x93, x89, x86);
738 fiat_p256_addcarryx_u64(&x96, &x97, x95, x87, x84);
739 x98 = (x97 + x85);
740 fiat_p256_addcarryx_u64(&x99, &x100, 0x0, x75, x90);
741 fiat_p256_addcarryx_u64(&x101, &x102, x100, x77, x92);
742 fiat_p256_addcarryx_u64(&x103, &x104, x102, x79, x94);
743 fiat_p256_addcarryx_u64(&x105, &x106, x104, x81, x96);
744 fiat_p256_addcarryx_u64(&x107, &x108, x106, x83, x98);
745 fiat_p256_mulx_u64(&x109, &x110, x99, UINT64_C(0xffffffff00000001));
746 fiat_p256_mulx_u64(&x111, &x112, x99, UINT32_C(0xffffffff));
747 fiat_p256_mulx_u64(&x113, &x114, x99, UINT64_C(0xffffffffffffffff));
748 fiat_p256_addcarryx_u64(&x115, &x116, 0x0, x114, x111);
749 x117 = (x116 + x112);
750 fiat_p256_addcarryx_u64(&x118, &x119, 0x0, x99, x113);
751 fiat_p256_addcarryx_u64(&x120, &x121, x119, x101, x115);
752 fiat_p256_addcarryx_u64(&x122, &x123, x121, x103, x117);
753 fiat_p256_addcarryx_u64(&x124, &x125, x123, x105, x109);
754 fiat_p256_addcarryx_u64(&x126, &x127, x125, x107, x110);
755 x128 = ((uint64_t)x127 + x108);
756 fiat_p256_mulx_u64(&x129, &x130, x3, (arg1[3]));
757 fiat_p256_mulx_u64(&x131, &x132, x3, (arg1[2]));
758 fiat_p256_mulx_u64(&x133, &x134, x3, (arg1[1]));
759 fiat_p256_mulx_u64(&x135, &x136, x3, (arg1[0]));
760 fiat_p256_addcarryx_u64(&x137, &x138, 0x0, x136, x133);
761 fiat_p256_addcarryx_u64(&x139, &x140, x138, x134, x131);
762 fiat_p256_addcarryx_u64(&x141, &x142, x140, x132, x129);
763 x143 = (x142 + x130);
764 fiat_p256_addcarryx_u64(&x144, &x145, 0x0, x120, x135);
765 fiat_p256_addcarryx_u64(&x146, &x147, x145, x122, x137);
766 fiat_p256_addcarryx_u64(&x148, &x149, x147, x124, x139);
767 fiat_p256_addcarryx_u64(&x150, &x151, x149, x126, x141);
768 fiat_p256_addcarryx_u64(&x152, &x153, x151, x128, x143);
769 fiat_p256_mulx_u64(&x154, &x155, x144, UINT64_C(0xffffffff00000001));
770 fiat_p256_mulx_u64(&x156, &x157, x144, UINT32_C(0xffffffff));
771 fiat_p256_mulx_u64(&x158, &x159, x144, UINT64_C(0xffffffffffffffff));
772 fiat_p256_addcarryx_u64(&x160, &x161, 0x0, x159, x156);
773 x162 = (x161 + x157);
774 fiat_p256_addcarryx_u64(&x163, &x164, 0x0, x144, x158);
775 fiat_p256_addcarryx_u64(&x165, &x166, x164, x146, x160);
776 fiat_p256_addcarryx_u64(&x167, &x168, x166, x148, x162);
777 fiat_p256_addcarryx_u64(&x169, &x170, x168, x150, x154);
778 fiat_p256_addcarryx_u64(&x171, &x172, x170, x152, x155);
779 x173 = ((uint64_t)x172 + x153);
780 fiat_p256_subborrowx_u64(&x174, &x175, 0x0, x165, UINT64_C(0xffffffffffffffff));
781 fiat_p256_subborrowx_u64(&x176, &x177, x175, x167, UINT32_C(0xffffffff));
782 fiat_p256_subborrowx_u64(&x178, &x179, x177, x169, 0x0);
783 fiat_p256_subborrowx_u64(&x180, &x181, x179, x171, UINT64_C(0xffffffff00000001));
784 fiat_p256_subborrowx_u64(&x182, &x183, x181, x173, 0x0);
785 fiat_p256_cmovznz_u64(&x184, x183, x174, x165);
786 fiat_p256_cmovznz_u64(&x185, x183, x176, x167);
787 fiat_p256_cmovznz_u64(&x186, x183, x178, x169);
David Benjaminbaca5b42020-04-14 15:19:20 -0400788 fiat_p256_cmovznz_u64(&x187, x183, x180, x171);
789 out1[0] = x184;
790 out1[1] = x185;
791 out1[2] = x186;
792 out1[3] = x187;
David Benjamin32e59d22019-01-08 23:08:42 +0000793}
794
795/*
David Benjaminbaca5b42020-04-14 15:19:20 -0400796 * The function fiat_p256_add adds two field elements in the Montgomery domain.
David Benjamin8c8e7a62022-03-21 15:14:33 -0400797 *
David Benjaminbaca5b42020-04-14 15:19:20 -0400798 * Preconditions:
799 * 0 ≤ eval arg1 < m
800 * 0 ≤ eval arg2 < m
801 * Postconditions:
802 * eval (from_montgomery out1) mod m = (eval (from_montgomery arg1) + eval (from_montgomery arg2)) mod m
803 * 0 ≤ eval out1 < m
804 *
David Benjamin32e59d22019-01-08 23:08:42 +0000805 */
David Benjamin8c8e7a62022-03-21 15:14:33 -0400806static FIAT_P256_FIAT_INLINE void fiat_p256_add(fiat_p256_montgomery_domain_field_element out1, const fiat_p256_montgomery_domain_field_element arg1, const fiat_p256_montgomery_domain_field_element arg2) {
David Benjamin32e59d22019-01-08 23:08:42 +0000807 uint64_t x1;
808 fiat_p256_uint1 x2;
David Benjamin32e59d22019-01-08 23:08:42 +0000809 uint64_t x3;
810 fiat_p256_uint1 x4;
David Benjamin32e59d22019-01-08 23:08:42 +0000811 uint64_t x5;
812 fiat_p256_uint1 x6;
David Benjamin32e59d22019-01-08 23:08:42 +0000813 uint64_t x7;
814 fiat_p256_uint1 x8;
David Benjamin32e59d22019-01-08 23:08:42 +0000815 uint64_t x9;
816 fiat_p256_uint1 x10;
David Benjamin32e59d22019-01-08 23:08:42 +0000817 uint64_t x11;
818 fiat_p256_uint1 x12;
David Benjamin32e59d22019-01-08 23:08:42 +0000819 uint64_t x13;
820 fiat_p256_uint1 x14;
David Benjamin32e59d22019-01-08 23:08:42 +0000821 uint64_t x15;
822 fiat_p256_uint1 x16;
David Benjamin32e59d22019-01-08 23:08:42 +0000823 uint64_t x17;
824 fiat_p256_uint1 x18;
David Benjamin32e59d22019-01-08 23:08:42 +0000825 uint64_t x19;
David Benjamin32e59d22019-01-08 23:08:42 +0000826 uint64_t x20;
David Benjamin32e59d22019-01-08 23:08:42 +0000827 uint64_t x21;
David Benjamin32e59d22019-01-08 23:08:42 +0000828 uint64_t x22;
David Benjamin8c8e7a62022-03-21 15:14:33 -0400829 fiat_p256_addcarryx_u64(&x1, &x2, 0x0, (arg1[0]), (arg2[0]));
830 fiat_p256_addcarryx_u64(&x3, &x4, x2, (arg1[1]), (arg2[1]));
831 fiat_p256_addcarryx_u64(&x5, &x6, x4, (arg1[2]), (arg2[2]));
832 fiat_p256_addcarryx_u64(&x7, &x8, x6, (arg1[3]), (arg2[3]));
833 fiat_p256_subborrowx_u64(&x9, &x10, 0x0, x1, UINT64_C(0xffffffffffffffff));
834 fiat_p256_subborrowx_u64(&x11, &x12, x10, x3, UINT32_C(0xffffffff));
835 fiat_p256_subborrowx_u64(&x13, &x14, x12, x5, 0x0);
836 fiat_p256_subborrowx_u64(&x15, &x16, x14, x7, UINT64_C(0xffffffff00000001));
837 fiat_p256_subborrowx_u64(&x17, &x18, x16, x8, 0x0);
838 fiat_p256_cmovznz_u64(&x19, x18, x9, x1);
839 fiat_p256_cmovznz_u64(&x20, x18, x11, x3);
840 fiat_p256_cmovznz_u64(&x21, x18, x13, x5);
David Benjamin32e59d22019-01-08 23:08:42 +0000841 fiat_p256_cmovznz_u64(&x22, x18, x15, x7);
842 out1[0] = x19;
843 out1[1] = x20;
844 out1[2] = x21;
845 out1[3] = x22;
846}
847
848/*
David Benjaminbaca5b42020-04-14 15:19:20 -0400849 * The function fiat_p256_sub subtracts two field elements in the Montgomery domain.
David Benjamin8c8e7a62022-03-21 15:14:33 -0400850 *
David Benjaminbaca5b42020-04-14 15:19:20 -0400851 * Preconditions:
852 * 0 ≤ eval arg1 < m
853 * 0 ≤ eval arg2 < m
854 * Postconditions:
855 * eval (from_montgomery out1) mod m = (eval (from_montgomery arg1) - eval (from_montgomery arg2)) mod m
856 * 0 ≤ eval out1 < m
857 *
David Benjamin32e59d22019-01-08 23:08:42 +0000858 */
David Benjamin8c8e7a62022-03-21 15:14:33 -0400859static FIAT_P256_FIAT_INLINE void fiat_p256_sub(fiat_p256_montgomery_domain_field_element out1, const fiat_p256_montgomery_domain_field_element arg1, const fiat_p256_montgomery_domain_field_element arg2) {
David Benjamin32e59d22019-01-08 23:08:42 +0000860 uint64_t x1;
861 fiat_p256_uint1 x2;
David Benjamin32e59d22019-01-08 23:08:42 +0000862 uint64_t x3;
863 fiat_p256_uint1 x4;
David Benjamin32e59d22019-01-08 23:08:42 +0000864 uint64_t x5;
865 fiat_p256_uint1 x6;
David Benjamin32e59d22019-01-08 23:08:42 +0000866 uint64_t x7;
867 fiat_p256_uint1 x8;
David Benjamin32e59d22019-01-08 23:08:42 +0000868 uint64_t x9;
David Benjamin32e59d22019-01-08 23:08:42 +0000869 uint64_t x10;
870 fiat_p256_uint1 x11;
David Benjamin32e59d22019-01-08 23:08:42 +0000871 uint64_t x12;
872 fiat_p256_uint1 x13;
David Benjamin32e59d22019-01-08 23:08:42 +0000873 uint64_t x14;
874 fiat_p256_uint1 x15;
David Benjamin32e59d22019-01-08 23:08:42 +0000875 uint64_t x16;
876 fiat_p256_uint1 x17;
David Benjamin8c8e7a62022-03-21 15:14:33 -0400877 fiat_p256_subborrowx_u64(&x1, &x2, 0x0, (arg1[0]), (arg2[0]));
878 fiat_p256_subborrowx_u64(&x3, &x4, x2, (arg1[1]), (arg2[1]));
879 fiat_p256_subborrowx_u64(&x5, &x6, x4, (arg1[2]), (arg2[2]));
880 fiat_p256_subborrowx_u64(&x7, &x8, x6, (arg1[3]), (arg2[3]));
881 fiat_p256_cmovznz_u64(&x9, x8, 0x0, UINT64_C(0xffffffffffffffff));
882 fiat_p256_addcarryx_u64(&x10, &x11, 0x0, x1, x9);
883 fiat_p256_addcarryx_u64(&x12, &x13, x11, x3, (x9 & UINT32_C(0xffffffff)));
884 fiat_p256_addcarryx_u64(&x14, &x15, x13, x5, 0x0);
David Benjaminbaca5b42020-04-14 15:19:20 -0400885 fiat_p256_addcarryx_u64(&x16, &x17, x15, x7, (x9 & UINT64_C(0xffffffff00000001)));
David Benjamin32e59d22019-01-08 23:08:42 +0000886 out1[0] = x10;
887 out1[1] = x12;
888 out1[2] = x14;
889 out1[3] = x16;
890}
891
892/*
David Benjaminbaca5b42020-04-14 15:19:20 -0400893 * The function fiat_p256_opp negates a field element in the Montgomery domain.
David Benjamin8c8e7a62022-03-21 15:14:33 -0400894 *
David Benjaminbaca5b42020-04-14 15:19:20 -0400895 * Preconditions:
896 * 0 ≤ eval arg1 < m
897 * Postconditions:
898 * eval (from_montgomery out1) mod m = -eval (from_montgomery arg1) mod m
899 * 0 ≤ eval out1 < m
900 *
David Benjamin32e59d22019-01-08 23:08:42 +0000901 */
David Benjamin8c8e7a62022-03-21 15:14:33 -0400902static FIAT_P256_FIAT_INLINE void fiat_p256_opp(fiat_p256_montgomery_domain_field_element out1, const fiat_p256_montgomery_domain_field_element arg1) {
David Benjamin32e59d22019-01-08 23:08:42 +0000903 uint64_t x1;
904 fiat_p256_uint1 x2;
David Benjamin32e59d22019-01-08 23:08:42 +0000905 uint64_t x3;
906 fiat_p256_uint1 x4;
David Benjamin32e59d22019-01-08 23:08:42 +0000907 uint64_t x5;
908 fiat_p256_uint1 x6;
David Benjamin32e59d22019-01-08 23:08:42 +0000909 uint64_t x7;
910 fiat_p256_uint1 x8;
David Benjamin32e59d22019-01-08 23:08:42 +0000911 uint64_t x9;
David Benjamin32e59d22019-01-08 23:08:42 +0000912 uint64_t x10;
913 fiat_p256_uint1 x11;
David Benjamin32e59d22019-01-08 23:08:42 +0000914 uint64_t x12;
915 fiat_p256_uint1 x13;
David Benjamin32e59d22019-01-08 23:08:42 +0000916 uint64_t x14;
917 fiat_p256_uint1 x15;
David Benjamin32e59d22019-01-08 23:08:42 +0000918 uint64_t x16;
919 fiat_p256_uint1 x17;
David Benjamin8c8e7a62022-03-21 15:14:33 -0400920 fiat_p256_subborrowx_u64(&x1, &x2, 0x0, 0x0, (arg1[0]));
921 fiat_p256_subborrowx_u64(&x3, &x4, x2, 0x0, (arg1[1]));
922 fiat_p256_subborrowx_u64(&x5, &x6, x4, 0x0, (arg1[2]));
923 fiat_p256_subborrowx_u64(&x7, &x8, x6, 0x0, (arg1[3]));
924 fiat_p256_cmovznz_u64(&x9, x8, 0x0, UINT64_C(0xffffffffffffffff));
925 fiat_p256_addcarryx_u64(&x10, &x11, 0x0, x1, x9);
926 fiat_p256_addcarryx_u64(&x12, &x13, x11, x3, (x9 & UINT32_C(0xffffffff)));
927 fiat_p256_addcarryx_u64(&x14, &x15, x13, x5, 0x0);
David Benjaminbaca5b42020-04-14 15:19:20 -0400928 fiat_p256_addcarryx_u64(&x16, &x17, x15, x7, (x9 & UINT64_C(0xffffffff00000001)));
David Benjamin32e59d22019-01-08 23:08:42 +0000929 out1[0] = x10;
930 out1[1] = x12;
931 out1[2] = x14;
932 out1[3] = x16;
933}
934
935/*
David Benjaminbaca5b42020-04-14 15:19:20 -0400936 * The function fiat_p256_from_montgomery translates a field element out of the Montgomery domain.
David Benjamin8c8e7a62022-03-21 15:14:33 -0400937 *
David Benjaminbaca5b42020-04-14 15:19:20 -0400938 * Preconditions:
939 * 0 ≤ eval arg1 < m
940 * Postconditions:
941 * eval out1 mod m = (eval arg1 * ((2^64)⁻¹ mod m)^4) mod m
942 * 0 ≤ eval out1 < m
943 *
David Benjamin32e59d22019-01-08 23:08:42 +0000944 */
David Benjamin8c8e7a62022-03-21 15:14:33 -0400945static FIAT_P256_FIAT_INLINE void fiat_p256_from_montgomery(fiat_p256_non_montgomery_domain_field_element out1, const fiat_p256_montgomery_domain_field_element arg1) {
946 uint64_t x1;
David Benjamin32e59d22019-01-08 23:08:42 +0000947 uint64_t x2;
948 uint64_t x3;
David Benjamin32e59d22019-01-08 23:08:42 +0000949 uint64_t x4;
950 uint64_t x5;
David Benjamin32e59d22019-01-08 23:08:42 +0000951 uint64_t x6;
952 uint64_t x7;
David Benjamin32e59d22019-01-08 23:08:42 +0000953 uint64_t x8;
954 fiat_p256_uint1 x9;
David Benjamin32e59d22019-01-08 23:08:42 +0000955 uint64_t x10;
956 fiat_p256_uint1 x11;
David Benjamin32e59d22019-01-08 23:08:42 +0000957 uint64_t x12;
958 fiat_p256_uint1 x13;
David Benjamin32e59d22019-01-08 23:08:42 +0000959 uint64_t x14;
960 fiat_p256_uint1 x15;
David Benjamin32e59d22019-01-08 23:08:42 +0000961 uint64_t x16;
962 uint64_t x17;
David Benjamin32e59d22019-01-08 23:08:42 +0000963 uint64_t x18;
964 uint64_t x19;
David Benjamin32e59d22019-01-08 23:08:42 +0000965 uint64_t x20;
966 uint64_t x21;
David Benjamin32e59d22019-01-08 23:08:42 +0000967 uint64_t x22;
968 fiat_p256_uint1 x23;
David Benjamin32e59d22019-01-08 23:08:42 +0000969 uint64_t x24;
970 fiat_p256_uint1 x25;
David Benjamin32e59d22019-01-08 23:08:42 +0000971 uint64_t x26;
972 fiat_p256_uint1 x27;
David Benjamin32e59d22019-01-08 23:08:42 +0000973 uint64_t x28;
974 fiat_p256_uint1 x29;
David Benjamin32e59d22019-01-08 23:08:42 +0000975 uint64_t x30;
976 fiat_p256_uint1 x31;
David Benjamin32e59d22019-01-08 23:08:42 +0000977 uint64_t x32;
978 fiat_p256_uint1 x33;
David Benjamin32e59d22019-01-08 23:08:42 +0000979 uint64_t x34;
980 fiat_p256_uint1 x35;
David Benjamin32e59d22019-01-08 23:08:42 +0000981 uint64_t x36;
982 fiat_p256_uint1 x37;
David Benjamin32e59d22019-01-08 23:08:42 +0000983 uint64_t x38;
David Benjaminbaca5b42020-04-14 15:19:20 -0400984 uint64_t x39;
David Benjamin32e59d22019-01-08 23:08:42 +0000985 uint64_t x40;
David Benjaminbaca5b42020-04-14 15:19:20 -0400986 uint64_t x41;
David Benjamin32e59d22019-01-08 23:08:42 +0000987 uint64_t x42;
David Benjaminbaca5b42020-04-14 15:19:20 -0400988 uint64_t x43;
David Benjamin32e59d22019-01-08 23:08:42 +0000989 uint64_t x44;
990 fiat_p256_uint1 x45;
David Benjamin32e59d22019-01-08 23:08:42 +0000991 uint64_t x46;
David Benjaminbaca5b42020-04-14 15:19:20 -0400992 fiat_p256_uint1 x47;
David Benjamin32e59d22019-01-08 23:08:42 +0000993 uint64_t x48;
David Benjaminbaca5b42020-04-14 15:19:20 -0400994 fiat_p256_uint1 x49;
David Benjamin32e59d22019-01-08 23:08:42 +0000995 uint64_t x50;
David Benjaminbaca5b42020-04-14 15:19:20 -0400996 fiat_p256_uint1 x51;
David Benjamin32e59d22019-01-08 23:08:42 +0000997 uint64_t x52;
998 fiat_p256_uint1 x53;
David Benjamin32e59d22019-01-08 23:08:42 +0000999 uint64_t x54;
1000 fiat_p256_uint1 x55;
David Benjamin32e59d22019-01-08 23:08:42 +00001001 uint64_t x56;
1002 fiat_p256_uint1 x57;
David Benjamin32e59d22019-01-08 23:08:42 +00001003 uint64_t x58;
1004 fiat_p256_uint1 x59;
David Benjamin32e59d22019-01-08 23:08:42 +00001005 uint64_t x60;
David Benjaminbaca5b42020-04-14 15:19:20 -04001006 uint64_t x61;
David Benjamin32e59d22019-01-08 23:08:42 +00001007 uint64_t x62;
David Benjaminbaca5b42020-04-14 15:19:20 -04001008 uint64_t x63;
David Benjamin32e59d22019-01-08 23:08:42 +00001009 uint64_t x64;
David Benjaminbaca5b42020-04-14 15:19:20 -04001010 uint64_t x65;
David Benjamin32e59d22019-01-08 23:08:42 +00001011 uint64_t x66;
1012 fiat_p256_uint1 x67;
David Benjamin32e59d22019-01-08 23:08:42 +00001013 uint64_t x68;
1014 fiat_p256_uint1 x69;
David Benjamin32e59d22019-01-08 23:08:42 +00001015 uint64_t x70;
1016 fiat_p256_uint1 x71;
David Benjamin32e59d22019-01-08 23:08:42 +00001017 uint64_t x72;
1018 fiat_p256_uint1 x73;
David Benjamin32e59d22019-01-08 23:08:42 +00001019 uint64_t x74;
David Benjaminbaca5b42020-04-14 15:19:20 -04001020 fiat_p256_uint1 x75;
David Benjamin8c8e7a62022-03-21 15:14:33 -04001021 uint64_t x76;
David Benjamin32e59d22019-01-08 23:08:42 +00001022 uint64_t x77;
David Benjaminbaca5b42020-04-14 15:19:20 -04001023 fiat_p256_uint1 x78;
David Benjamin32e59d22019-01-08 23:08:42 +00001024 uint64_t x79;
David Benjaminbaca5b42020-04-14 15:19:20 -04001025 fiat_p256_uint1 x80;
David Benjaminbaca5b42020-04-14 15:19:20 -04001026 uint64_t x81;
1027 fiat_p256_uint1 x82;
David Benjaminbaca5b42020-04-14 15:19:20 -04001028 uint64_t x83;
1029 fiat_p256_uint1 x84;
David Benjaminbaca5b42020-04-14 15:19:20 -04001030 uint64_t x85;
1031 fiat_p256_uint1 x86;
David Benjaminbaca5b42020-04-14 15:19:20 -04001032 uint64_t x87;
David Benjamin32e59d22019-01-08 23:08:42 +00001033 uint64_t x88;
David Benjaminbaca5b42020-04-14 15:19:20 -04001034 uint64_t x89;
David Benjamin32e59d22019-01-08 23:08:42 +00001035 uint64_t x90;
David Benjamin8c8e7a62022-03-21 15:14:33 -04001036 x1 = (arg1[0]);
1037 fiat_p256_mulx_u64(&x2, &x3, x1, UINT64_C(0xffffffff00000001));
1038 fiat_p256_mulx_u64(&x4, &x5, x1, UINT32_C(0xffffffff));
1039 fiat_p256_mulx_u64(&x6, &x7, x1, UINT64_C(0xffffffffffffffff));
1040 fiat_p256_addcarryx_u64(&x8, &x9, 0x0, x7, x4);
1041 fiat_p256_addcarryx_u64(&x10, &x11, 0x0, x1, x6);
1042 fiat_p256_addcarryx_u64(&x12, &x13, x11, 0x0, x8);
1043 fiat_p256_addcarryx_u64(&x14, &x15, 0x0, x12, (arg1[1]));
1044 fiat_p256_mulx_u64(&x16, &x17, x14, UINT64_C(0xffffffff00000001));
1045 fiat_p256_mulx_u64(&x18, &x19, x14, UINT32_C(0xffffffff));
1046 fiat_p256_mulx_u64(&x20, &x21, x14, UINT64_C(0xffffffffffffffff));
1047 fiat_p256_addcarryx_u64(&x22, &x23, 0x0, x21, x18);
1048 fiat_p256_addcarryx_u64(&x24, &x25, 0x0, x14, x20);
1049 fiat_p256_addcarryx_u64(&x26, &x27, x25, (x15 + (x13 + (x9 + x5))), x22);
1050 fiat_p256_addcarryx_u64(&x28, &x29, x27, x2, (x23 + x19));
1051 fiat_p256_addcarryx_u64(&x30, &x31, x29, x3, x16);
1052 fiat_p256_addcarryx_u64(&x32, &x33, 0x0, x26, (arg1[2]));
1053 fiat_p256_addcarryx_u64(&x34, &x35, x33, x28, 0x0);
1054 fiat_p256_addcarryx_u64(&x36, &x37, x35, x30, 0x0);
1055 fiat_p256_mulx_u64(&x38, &x39, x32, UINT64_C(0xffffffff00000001));
1056 fiat_p256_mulx_u64(&x40, &x41, x32, UINT32_C(0xffffffff));
1057 fiat_p256_mulx_u64(&x42, &x43, x32, UINT64_C(0xffffffffffffffff));
1058 fiat_p256_addcarryx_u64(&x44, &x45, 0x0, x43, x40);
1059 fiat_p256_addcarryx_u64(&x46, &x47, 0x0, x32, x42);
1060 fiat_p256_addcarryx_u64(&x48, &x49, x47, x34, x44);
1061 fiat_p256_addcarryx_u64(&x50, &x51, x49, x36, (x45 + x41));
1062 fiat_p256_addcarryx_u64(&x52, &x53, x51, (x37 + (x31 + x17)), x38);
1063 fiat_p256_addcarryx_u64(&x54, &x55, 0x0, x48, (arg1[3]));
1064 fiat_p256_addcarryx_u64(&x56, &x57, x55, x50, 0x0);
1065 fiat_p256_addcarryx_u64(&x58, &x59, x57, x52, 0x0);
1066 fiat_p256_mulx_u64(&x60, &x61, x54, UINT64_C(0xffffffff00000001));
1067 fiat_p256_mulx_u64(&x62, &x63, x54, UINT32_C(0xffffffff));
1068 fiat_p256_mulx_u64(&x64, &x65, x54, UINT64_C(0xffffffffffffffff));
1069 fiat_p256_addcarryx_u64(&x66, &x67, 0x0, x65, x62);
1070 fiat_p256_addcarryx_u64(&x68, &x69, 0x0, x54, x64);
1071 fiat_p256_addcarryx_u64(&x70, &x71, x69, x56, x66);
1072 fiat_p256_addcarryx_u64(&x72, &x73, x71, x58, (x67 + x63));
1073 fiat_p256_addcarryx_u64(&x74, &x75, x73, (x59 + (x53 + x39)), x60);
1074 x76 = (x75 + x61);
1075 fiat_p256_subborrowx_u64(&x77, &x78, 0x0, x70, UINT64_C(0xffffffffffffffff));
1076 fiat_p256_subborrowx_u64(&x79, &x80, x78, x72, UINT32_C(0xffffffff));
1077 fiat_p256_subborrowx_u64(&x81, &x82, x80, x74, 0x0);
1078 fiat_p256_subborrowx_u64(&x83, &x84, x82, x76, UINT64_C(0xffffffff00000001));
1079 fiat_p256_subborrowx_u64(&x85, &x86, x84, 0x0, 0x0);
1080 fiat_p256_cmovznz_u64(&x87, x86, x77, x70);
1081 fiat_p256_cmovznz_u64(&x88, x86, x79, x72);
1082 fiat_p256_cmovznz_u64(&x89, x86, x81, x74);
David Benjaminbaca5b42020-04-14 15:19:20 -04001083 fiat_p256_cmovznz_u64(&x90, x86, x83, x76);
1084 out1[0] = x87;
1085 out1[1] = x88;
1086 out1[2] = x89;
1087 out1[3] = x90;
David Benjamin32e59d22019-01-08 23:08:42 +00001088}
1089
1090/*
David Benjamin8c8e7a62022-03-21 15:14:33 -04001091 * The function fiat_p256_to_montgomery translates a field element into the Montgomery domain.
1092 *
1093 * Preconditions:
1094 * 0 ≤ eval arg1 < m
1095 * Postconditions:
1096 * eval (from_montgomery out1) mod m = eval arg1 mod m
1097 * 0 ≤ eval out1 < m
1098 *
1099 */
1100static FIAT_P256_FIAT_INLINE void fiat_p256_to_montgomery(fiat_p256_montgomery_domain_field_element out1, const fiat_p256_non_montgomery_domain_field_element arg1) {
1101 uint64_t x1;
1102 uint64_t x2;
1103 uint64_t x3;
1104 uint64_t x4;
1105 uint64_t x5;
1106 uint64_t x6;
1107 uint64_t x7;
1108 uint64_t x8;
1109 uint64_t x9;
1110 uint64_t x10;
1111 uint64_t x11;
1112 uint64_t x12;
1113 uint64_t x13;
1114 fiat_p256_uint1 x14;
1115 uint64_t x15;
1116 fiat_p256_uint1 x16;
1117 uint64_t x17;
1118 fiat_p256_uint1 x18;
1119 uint64_t x19;
1120 uint64_t x20;
1121 uint64_t x21;
1122 uint64_t x22;
1123 uint64_t x23;
1124 uint64_t x24;
1125 uint64_t x25;
1126 fiat_p256_uint1 x26;
1127 uint64_t x27;
1128 fiat_p256_uint1 x28;
1129 uint64_t x29;
1130 fiat_p256_uint1 x30;
1131 uint64_t x31;
1132 fiat_p256_uint1 x32;
1133 uint64_t x33;
1134 fiat_p256_uint1 x34;
1135 uint64_t x35;
1136 fiat_p256_uint1 x36;
1137 uint64_t x37;
1138 uint64_t x38;
1139 uint64_t x39;
1140 uint64_t x40;
1141 uint64_t x41;
1142 uint64_t x42;
1143 uint64_t x43;
1144 uint64_t x44;
1145 uint64_t x45;
1146 fiat_p256_uint1 x46;
1147 uint64_t x47;
1148 fiat_p256_uint1 x48;
1149 uint64_t x49;
1150 fiat_p256_uint1 x50;
1151 uint64_t x51;
1152 fiat_p256_uint1 x52;
1153 uint64_t x53;
1154 fiat_p256_uint1 x54;
1155 uint64_t x55;
1156 fiat_p256_uint1 x56;
1157 uint64_t x57;
1158 fiat_p256_uint1 x58;
1159 uint64_t x59;
1160 uint64_t x60;
1161 uint64_t x61;
1162 uint64_t x62;
1163 uint64_t x63;
1164 uint64_t x64;
1165 uint64_t x65;
1166 fiat_p256_uint1 x66;
1167 uint64_t x67;
1168 fiat_p256_uint1 x68;
1169 uint64_t x69;
1170 fiat_p256_uint1 x70;
1171 uint64_t x71;
1172 fiat_p256_uint1 x72;
1173 uint64_t x73;
1174 fiat_p256_uint1 x74;
1175 uint64_t x75;
1176 fiat_p256_uint1 x76;
1177 uint64_t x77;
1178 uint64_t x78;
1179 uint64_t x79;
1180 uint64_t x80;
1181 uint64_t x81;
1182 uint64_t x82;
1183 uint64_t x83;
1184 uint64_t x84;
1185 uint64_t x85;
1186 fiat_p256_uint1 x86;
1187 uint64_t x87;
1188 fiat_p256_uint1 x88;
1189 uint64_t x89;
1190 fiat_p256_uint1 x90;
1191 uint64_t x91;
1192 fiat_p256_uint1 x92;
1193 uint64_t x93;
1194 fiat_p256_uint1 x94;
1195 uint64_t x95;
1196 fiat_p256_uint1 x96;
1197 uint64_t x97;
1198 fiat_p256_uint1 x98;
1199 uint64_t x99;
1200 uint64_t x100;
1201 uint64_t x101;
1202 uint64_t x102;
1203 uint64_t x103;
1204 uint64_t x104;
1205 uint64_t x105;
1206 fiat_p256_uint1 x106;
1207 uint64_t x107;
1208 fiat_p256_uint1 x108;
1209 uint64_t x109;
1210 fiat_p256_uint1 x110;
1211 uint64_t x111;
1212 fiat_p256_uint1 x112;
1213 uint64_t x113;
1214 fiat_p256_uint1 x114;
1215 uint64_t x115;
1216 fiat_p256_uint1 x116;
1217 uint64_t x117;
1218 uint64_t x118;
1219 uint64_t x119;
1220 uint64_t x120;
1221 uint64_t x121;
1222 uint64_t x122;
1223 uint64_t x123;
1224 uint64_t x124;
1225 uint64_t x125;
1226 fiat_p256_uint1 x126;
1227 uint64_t x127;
1228 fiat_p256_uint1 x128;
1229 uint64_t x129;
1230 fiat_p256_uint1 x130;
1231 uint64_t x131;
1232 fiat_p256_uint1 x132;
1233 uint64_t x133;
1234 fiat_p256_uint1 x134;
1235 uint64_t x135;
1236 fiat_p256_uint1 x136;
1237 uint64_t x137;
1238 fiat_p256_uint1 x138;
1239 uint64_t x139;
1240 uint64_t x140;
1241 uint64_t x141;
1242 uint64_t x142;
1243 uint64_t x143;
1244 uint64_t x144;
1245 uint64_t x145;
1246 fiat_p256_uint1 x146;
1247 uint64_t x147;
1248 fiat_p256_uint1 x148;
1249 uint64_t x149;
1250 fiat_p256_uint1 x150;
1251 uint64_t x151;
1252 fiat_p256_uint1 x152;
1253 uint64_t x153;
1254 fiat_p256_uint1 x154;
1255 uint64_t x155;
1256 fiat_p256_uint1 x156;
1257 uint64_t x157;
1258 fiat_p256_uint1 x158;
1259 uint64_t x159;
1260 fiat_p256_uint1 x160;
1261 uint64_t x161;
1262 fiat_p256_uint1 x162;
1263 uint64_t x163;
1264 fiat_p256_uint1 x164;
1265 uint64_t x165;
1266 fiat_p256_uint1 x166;
1267 uint64_t x167;
1268 uint64_t x168;
1269 uint64_t x169;
1270 uint64_t x170;
1271 x1 = (arg1[1]);
1272 x2 = (arg1[2]);
1273 x3 = (arg1[3]);
1274 x4 = (arg1[0]);
1275 fiat_p256_mulx_u64(&x5, &x6, x4, UINT64_C(0x4fffffffd));
1276 fiat_p256_mulx_u64(&x7, &x8, x4, UINT64_C(0xfffffffffffffffe));
1277 fiat_p256_mulx_u64(&x9, &x10, x4, UINT64_C(0xfffffffbffffffff));
1278 fiat_p256_mulx_u64(&x11, &x12, x4, 0x3);
1279 fiat_p256_addcarryx_u64(&x13, &x14, 0x0, x12, x9);
1280 fiat_p256_addcarryx_u64(&x15, &x16, x14, x10, x7);
1281 fiat_p256_addcarryx_u64(&x17, &x18, x16, x8, x5);
1282 fiat_p256_mulx_u64(&x19, &x20, x11, UINT64_C(0xffffffff00000001));
1283 fiat_p256_mulx_u64(&x21, &x22, x11, UINT32_C(0xffffffff));
1284 fiat_p256_mulx_u64(&x23, &x24, x11, UINT64_C(0xffffffffffffffff));
1285 fiat_p256_addcarryx_u64(&x25, &x26, 0x0, x24, x21);
1286 fiat_p256_addcarryx_u64(&x27, &x28, 0x0, x11, x23);
1287 fiat_p256_addcarryx_u64(&x29, &x30, x28, x13, x25);
1288 fiat_p256_addcarryx_u64(&x31, &x32, x30, x15, (x26 + x22));
1289 fiat_p256_addcarryx_u64(&x33, &x34, x32, x17, x19);
1290 fiat_p256_addcarryx_u64(&x35, &x36, x34, (x18 + x6), x20);
1291 fiat_p256_mulx_u64(&x37, &x38, x1, UINT64_C(0x4fffffffd));
1292 fiat_p256_mulx_u64(&x39, &x40, x1, UINT64_C(0xfffffffffffffffe));
1293 fiat_p256_mulx_u64(&x41, &x42, x1, UINT64_C(0xfffffffbffffffff));
1294 fiat_p256_mulx_u64(&x43, &x44, x1, 0x3);
1295 fiat_p256_addcarryx_u64(&x45, &x46, 0x0, x44, x41);
1296 fiat_p256_addcarryx_u64(&x47, &x48, x46, x42, x39);
1297 fiat_p256_addcarryx_u64(&x49, &x50, x48, x40, x37);
1298 fiat_p256_addcarryx_u64(&x51, &x52, 0x0, x29, x43);
1299 fiat_p256_addcarryx_u64(&x53, &x54, x52, x31, x45);
1300 fiat_p256_addcarryx_u64(&x55, &x56, x54, x33, x47);
1301 fiat_p256_addcarryx_u64(&x57, &x58, x56, x35, x49);
1302 fiat_p256_mulx_u64(&x59, &x60, x51, UINT64_C(0xffffffff00000001));
1303 fiat_p256_mulx_u64(&x61, &x62, x51, UINT32_C(0xffffffff));
1304 fiat_p256_mulx_u64(&x63, &x64, x51, UINT64_C(0xffffffffffffffff));
1305 fiat_p256_addcarryx_u64(&x65, &x66, 0x0, x64, x61);
1306 fiat_p256_addcarryx_u64(&x67, &x68, 0x0, x51, x63);
1307 fiat_p256_addcarryx_u64(&x69, &x70, x68, x53, x65);
1308 fiat_p256_addcarryx_u64(&x71, &x72, x70, x55, (x66 + x62));
1309 fiat_p256_addcarryx_u64(&x73, &x74, x72, x57, x59);
1310 fiat_p256_addcarryx_u64(&x75, &x76, x74, (((uint64_t)x58 + x36) + (x50 + x38)), x60);
1311 fiat_p256_mulx_u64(&x77, &x78, x2, UINT64_C(0x4fffffffd));
1312 fiat_p256_mulx_u64(&x79, &x80, x2, UINT64_C(0xfffffffffffffffe));
1313 fiat_p256_mulx_u64(&x81, &x82, x2, UINT64_C(0xfffffffbffffffff));
1314 fiat_p256_mulx_u64(&x83, &x84, x2, 0x3);
1315 fiat_p256_addcarryx_u64(&x85, &x86, 0x0, x84, x81);
1316 fiat_p256_addcarryx_u64(&x87, &x88, x86, x82, x79);
1317 fiat_p256_addcarryx_u64(&x89, &x90, x88, x80, x77);
1318 fiat_p256_addcarryx_u64(&x91, &x92, 0x0, x69, x83);
1319 fiat_p256_addcarryx_u64(&x93, &x94, x92, x71, x85);
1320 fiat_p256_addcarryx_u64(&x95, &x96, x94, x73, x87);
1321 fiat_p256_addcarryx_u64(&x97, &x98, x96, x75, x89);
1322 fiat_p256_mulx_u64(&x99, &x100, x91, UINT64_C(0xffffffff00000001));
1323 fiat_p256_mulx_u64(&x101, &x102, x91, UINT32_C(0xffffffff));
1324 fiat_p256_mulx_u64(&x103, &x104, x91, UINT64_C(0xffffffffffffffff));
1325 fiat_p256_addcarryx_u64(&x105, &x106, 0x0, x104, x101);
1326 fiat_p256_addcarryx_u64(&x107, &x108, 0x0, x91, x103);
1327 fiat_p256_addcarryx_u64(&x109, &x110, x108, x93, x105);
1328 fiat_p256_addcarryx_u64(&x111, &x112, x110, x95, (x106 + x102));
1329 fiat_p256_addcarryx_u64(&x113, &x114, x112, x97, x99);
1330 fiat_p256_addcarryx_u64(&x115, &x116, x114, (((uint64_t)x98 + x76) + (x90 + x78)), x100);
1331 fiat_p256_mulx_u64(&x117, &x118, x3, UINT64_C(0x4fffffffd));
1332 fiat_p256_mulx_u64(&x119, &x120, x3, UINT64_C(0xfffffffffffffffe));
1333 fiat_p256_mulx_u64(&x121, &x122, x3, UINT64_C(0xfffffffbffffffff));
1334 fiat_p256_mulx_u64(&x123, &x124, x3, 0x3);
1335 fiat_p256_addcarryx_u64(&x125, &x126, 0x0, x124, x121);
1336 fiat_p256_addcarryx_u64(&x127, &x128, x126, x122, x119);
1337 fiat_p256_addcarryx_u64(&x129, &x130, x128, x120, x117);
1338 fiat_p256_addcarryx_u64(&x131, &x132, 0x0, x109, x123);
1339 fiat_p256_addcarryx_u64(&x133, &x134, x132, x111, x125);
1340 fiat_p256_addcarryx_u64(&x135, &x136, x134, x113, x127);
1341 fiat_p256_addcarryx_u64(&x137, &x138, x136, x115, x129);
1342 fiat_p256_mulx_u64(&x139, &x140, x131, UINT64_C(0xffffffff00000001));
1343 fiat_p256_mulx_u64(&x141, &x142, x131, UINT32_C(0xffffffff));
1344 fiat_p256_mulx_u64(&x143, &x144, x131, UINT64_C(0xffffffffffffffff));
1345 fiat_p256_addcarryx_u64(&x145, &x146, 0x0, x144, x141);
1346 fiat_p256_addcarryx_u64(&x147, &x148, 0x0, x131, x143);
1347 fiat_p256_addcarryx_u64(&x149, &x150, x148, x133, x145);
1348 fiat_p256_addcarryx_u64(&x151, &x152, x150, x135, (x146 + x142));
1349 fiat_p256_addcarryx_u64(&x153, &x154, x152, x137, x139);
1350 fiat_p256_addcarryx_u64(&x155, &x156, x154, (((uint64_t)x138 + x116) + (x130 + x118)), x140);
1351 fiat_p256_subborrowx_u64(&x157, &x158, 0x0, x149, UINT64_C(0xffffffffffffffff));
1352 fiat_p256_subborrowx_u64(&x159, &x160, x158, x151, UINT32_C(0xffffffff));
1353 fiat_p256_subborrowx_u64(&x161, &x162, x160, x153, 0x0);
1354 fiat_p256_subborrowx_u64(&x163, &x164, x162, x155, UINT64_C(0xffffffff00000001));
1355 fiat_p256_subborrowx_u64(&x165, &x166, x164, x156, 0x0);
1356 fiat_p256_cmovznz_u64(&x167, x166, x157, x149);
1357 fiat_p256_cmovznz_u64(&x168, x166, x159, x151);
1358 fiat_p256_cmovznz_u64(&x169, x166, x161, x153);
1359 fiat_p256_cmovznz_u64(&x170, x166, x163, x155);
1360 out1[0] = x167;
1361 out1[1] = x168;
1362 out1[2] = x169;
1363 out1[3] = x170;
1364}
1365
1366/*
David Benjaminbaca5b42020-04-14 15:19:20 -04001367 * The function fiat_p256_nonzero outputs a single non-zero word if the input is non-zero and zero otherwise.
David Benjamin8c8e7a62022-03-21 15:14:33 -04001368 *
David Benjaminbaca5b42020-04-14 15:19:20 -04001369 * Preconditions:
1370 * 0 ≤ eval arg1 < m
1371 * Postconditions:
1372 * out1 = 0 ↔ eval (from_montgomery arg1) mod m = 0
1373 *
David Benjamin32e59d22019-01-08 23:08:42 +00001374 * Input Bounds:
1375 * arg1: [[0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff]]
1376 * Output Bounds:
1377 * out1: [0x0 ~> 0xffffffffffffffff]
1378 */
David Benjamin8c8e7a62022-03-21 15:14:33 -04001379static FIAT_P256_FIAT_INLINE void fiat_p256_nonzero(uint64_t* out1, const uint64_t arg1[4]) {
1380 uint64_t x1;
1381 x1 = ((arg1[0]) | ((arg1[1]) | ((arg1[2]) | (arg1[3]))));
David Benjamin32e59d22019-01-08 23:08:42 +00001382 *out1 = x1;
1383}
1384
1385/*
David Benjaminbaca5b42020-04-14 15:19:20 -04001386 * The function fiat_p256_selectznz is a multi-limb conditional select.
David Benjamin8c8e7a62022-03-21 15:14:33 -04001387 *
David Benjaminbaca5b42020-04-14 15:19:20 -04001388 * Postconditions:
1389 * eval out1 = (if arg1 = 0 then eval arg2 else eval arg3)
1390 *
David Benjamin32e59d22019-01-08 23:08:42 +00001391 * Input Bounds:
1392 * arg1: [0x0 ~> 0x1]
1393 * arg2: [[0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff]]
1394 * arg3: [[0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff]]
1395 * Output Bounds:
1396 * out1: [[0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff]]
1397 */
David Benjamin8c8e7a62022-03-21 15:14:33 -04001398static FIAT_P256_FIAT_INLINE void fiat_p256_selectznz(uint64_t out1[4], fiat_p256_uint1 arg1, const uint64_t arg2[4], const uint64_t arg3[4]) {
David Benjamin32e59d22019-01-08 23:08:42 +00001399 uint64_t x1;
David Benjamin32e59d22019-01-08 23:08:42 +00001400 uint64_t x2;
David Benjamin32e59d22019-01-08 23:08:42 +00001401 uint64_t x3;
David Benjamin32e59d22019-01-08 23:08:42 +00001402 uint64_t x4;
David Benjamin8c8e7a62022-03-21 15:14:33 -04001403 fiat_p256_cmovznz_u64(&x1, arg1, (arg2[0]), (arg3[0]));
1404 fiat_p256_cmovznz_u64(&x2, arg1, (arg2[1]), (arg3[1]));
1405 fiat_p256_cmovznz_u64(&x3, arg1, (arg2[2]), (arg3[2]));
David Benjamin32e59d22019-01-08 23:08:42 +00001406 fiat_p256_cmovznz_u64(&x4, arg1, (arg2[3]), (arg3[3]));
1407 out1[0] = x1;
1408 out1[1] = x2;
1409 out1[2] = x3;
1410 out1[3] = x4;
1411}
1412
1413/*
David Benjamin8c8e7a62022-03-21 15:14:33 -04001414 * The function fiat_p256_to_bytes serializes a field element NOT in the Montgomery domain to bytes in little-endian order.
1415 *
David Benjaminbaca5b42020-04-14 15:19:20 -04001416 * Preconditions:
1417 * 0 ≤ eval arg1 < m
1418 * Postconditions:
1419 * out1 = map (λ x, ⌊((eval arg1 mod m) mod 2^(8 * (x + 1))) / 2^(8 * x)⌋) [0..31]
1420 *
David Benjamin32e59d22019-01-08 23:08:42 +00001421 * Input Bounds:
1422 * arg1: [[0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff]]
1423 * Output Bounds:
1424 * out1: [[0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff]]
1425 */
David Benjamin8c8e7a62022-03-21 15:14:33 -04001426static FIAT_P256_FIAT_INLINE void fiat_p256_to_bytes(uint8_t out1[32], const uint64_t arg1[4]) {
1427 uint64_t x1;
1428 uint64_t x2;
1429 uint64_t x3;
1430 uint64_t x4;
1431 uint8_t x5;
1432 uint64_t x6;
1433 uint8_t x7;
1434 uint64_t x8;
1435 uint8_t x9;
1436 uint64_t x10;
1437 uint8_t x11;
1438 uint64_t x12;
1439 uint8_t x13;
1440 uint64_t x14;
1441 uint8_t x15;
1442 uint64_t x16;
1443 uint8_t x17;
1444 uint8_t x18;
1445 uint8_t x19;
1446 uint64_t x20;
1447 uint8_t x21;
1448 uint64_t x22;
1449 uint8_t x23;
1450 uint64_t x24;
1451 uint8_t x25;
1452 uint64_t x26;
1453 uint8_t x27;
1454 uint64_t x28;
1455 uint8_t x29;
1456 uint64_t x30;
1457 uint8_t x31;
1458 uint8_t x32;
1459 uint8_t x33;
1460 uint64_t x34;
1461 uint8_t x35;
1462 uint64_t x36;
1463 uint8_t x37;
1464 uint64_t x38;
1465 uint8_t x39;
1466 uint64_t x40;
1467 uint8_t x41;
1468 uint64_t x42;
1469 uint8_t x43;
1470 uint64_t x44;
1471 uint8_t x45;
1472 uint8_t x46;
1473 uint8_t x47;
1474 uint64_t x48;
1475 uint8_t x49;
1476 uint64_t x50;
1477 uint8_t x51;
1478 uint64_t x52;
1479 uint8_t x53;
1480 uint64_t x54;
1481 uint8_t x55;
1482 uint64_t x56;
1483 uint8_t x57;
1484 uint64_t x58;
1485 uint8_t x59;
1486 uint8_t x60;
1487 x1 = (arg1[3]);
1488 x2 = (arg1[2]);
1489 x3 = (arg1[1]);
1490 x4 = (arg1[0]);
1491 x5 = (uint8_t)(x4 & UINT8_C(0xff));
1492 x6 = (x4 >> 8);
1493 x7 = (uint8_t)(x6 & UINT8_C(0xff));
1494 x8 = (x6 >> 8);
1495 x9 = (uint8_t)(x8 & UINT8_C(0xff));
1496 x10 = (x8 >> 8);
1497 x11 = (uint8_t)(x10 & UINT8_C(0xff));
1498 x12 = (x10 >> 8);
1499 x13 = (uint8_t)(x12 & UINT8_C(0xff));
1500 x14 = (x12 >> 8);
1501 x15 = (uint8_t)(x14 & UINT8_C(0xff));
1502 x16 = (x14 >> 8);
1503 x17 = (uint8_t)(x16 & UINT8_C(0xff));
1504 x18 = (uint8_t)(x16 >> 8);
1505 x19 = (uint8_t)(x3 & UINT8_C(0xff));
1506 x20 = (x3 >> 8);
1507 x21 = (uint8_t)(x20 & UINT8_C(0xff));
1508 x22 = (x20 >> 8);
1509 x23 = (uint8_t)(x22 & UINT8_C(0xff));
1510 x24 = (x22 >> 8);
1511 x25 = (uint8_t)(x24 & UINT8_C(0xff));
1512 x26 = (x24 >> 8);
1513 x27 = (uint8_t)(x26 & UINT8_C(0xff));
1514 x28 = (x26 >> 8);
1515 x29 = (uint8_t)(x28 & UINT8_C(0xff));
1516 x30 = (x28 >> 8);
1517 x31 = (uint8_t)(x30 & UINT8_C(0xff));
1518 x32 = (uint8_t)(x30 >> 8);
1519 x33 = (uint8_t)(x2 & UINT8_C(0xff));
1520 x34 = (x2 >> 8);
1521 x35 = (uint8_t)(x34 & UINT8_C(0xff));
1522 x36 = (x34 >> 8);
1523 x37 = (uint8_t)(x36 & UINT8_C(0xff));
1524 x38 = (x36 >> 8);
1525 x39 = (uint8_t)(x38 & UINT8_C(0xff));
1526 x40 = (x38 >> 8);
1527 x41 = (uint8_t)(x40 & UINT8_C(0xff));
1528 x42 = (x40 >> 8);
1529 x43 = (uint8_t)(x42 & UINT8_C(0xff));
1530 x44 = (x42 >> 8);
1531 x45 = (uint8_t)(x44 & UINT8_C(0xff));
1532 x46 = (uint8_t)(x44 >> 8);
1533 x47 = (uint8_t)(x1 & UINT8_C(0xff));
1534 x48 = (x1 >> 8);
1535 x49 = (uint8_t)(x48 & UINT8_C(0xff));
1536 x50 = (x48 >> 8);
1537 x51 = (uint8_t)(x50 & UINT8_C(0xff));
1538 x52 = (x50 >> 8);
1539 x53 = (uint8_t)(x52 & UINT8_C(0xff));
1540 x54 = (x52 >> 8);
1541 x55 = (uint8_t)(x54 & UINT8_C(0xff));
1542 x56 = (x54 >> 8);
1543 x57 = (uint8_t)(x56 & UINT8_C(0xff));
1544 x58 = (x56 >> 8);
1545 x59 = (uint8_t)(x58 & UINT8_C(0xff));
1546 x60 = (uint8_t)(x58 >> 8);
1547 out1[0] = x5;
1548 out1[1] = x7;
1549 out1[2] = x9;
1550 out1[3] = x11;
1551 out1[4] = x13;
1552 out1[5] = x15;
1553 out1[6] = x17;
1554 out1[7] = x18;
1555 out1[8] = x19;
1556 out1[9] = x21;
1557 out1[10] = x23;
1558 out1[11] = x25;
1559 out1[12] = x27;
1560 out1[13] = x29;
1561 out1[14] = x31;
1562 out1[15] = x32;
1563 out1[16] = x33;
1564 out1[17] = x35;
1565 out1[18] = x37;
1566 out1[19] = x39;
1567 out1[20] = x41;
1568 out1[21] = x43;
1569 out1[22] = x45;
1570 out1[23] = x46;
1571 out1[24] = x47;
1572 out1[25] = x49;
1573 out1[26] = x51;
1574 out1[27] = x53;
1575 out1[28] = x55;
1576 out1[29] = x57;
1577 out1[30] = x59;
1578 out1[31] = x60;
David Benjamin32e59d22019-01-08 23:08:42 +00001579}
1580
1581/*
David Benjamin8c8e7a62022-03-21 15:14:33 -04001582 * The function fiat_p256_from_bytes deserializes a field element NOT in the Montgomery domain from bytes in little-endian order.
1583 *
David Benjaminbaca5b42020-04-14 15:19:20 -04001584 * Preconditions:
1585 * 0 ≤ bytes_eval arg1 < m
1586 * Postconditions:
1587 * eval out1 mod m = bytes_eval arg1 mod m
1588 * 0 ≤ eval out1 < m
1589 *
David Benjamin32e59d22019-01-08 23:08:42 +00001590 * Input Bounds:
1591 * arg1: [[0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff], [0x0 ~> 0xff]]
1592 * Output Bounds:
1593 * out1: [[0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff]]
1594 */
David Benjamin8c8e7a62022-03-21 15:14:33 -04001595static FIAT_P256_FIAT_INLINE void fiat_p256_from_bytes(uint64_t out1[4], const uint8_t arg1[32]) {
1596 uint64_t x1;
1597 uint64_t x2;
1598 uint64_t x3;
1599 uint64_t x4;
1600 uint64_t x5;
1601 uint64_t x6;
1602 uint64_t x7;
1603 uint8_t x8;
1604 uint64_t x9;
1605 uint64_t x10;
1606 uint64_t x11;
1607 uint64_t x12;
1608 uint64_t x13;
1609 uint64_t x14;
1610 uint64_t x15;
1611 uint8_t x16;
1612 uint64_t x17;
1613 uint64_t x18;
1614 uint64_t x19;
1615 uint64_t x20;
1616 uint64_t x21;
1617 uint64_t x22;
1618 uint64_t x23;
1619 uint8_t x24;
1620 uint64_t x25;
1621 uint64_t x26;
1622 uint64_t x27;
1623 uint64_t x28;
1624 uint64_t x29;
1625 uint64_t x30;
1626 uint64_t x31;
1627 uint8_t x32;
1628 uint64_t x33;
1629 uint64_t x34;
1630 uint64_t x35;
1631 uint64_t x36;
1632 uint64_t x37;
1633 uint64_t x38;
1634 uint64_t x39;
1635 uint64_t x40;
1636 uint64_t x41;
1637 uint64_t x42;
1638 uint64_t x43;
1639 uint64_t x44;
1640 uint64_t x45;
1641 uint64_t x46;
1642 uint64_t x47;
1643 uint64_t x48;
1644 uint64_t x49;
1645 uint64_t x50;
1646 uint64_t x51;
1647 uint64_t x52;
1648 uint64_t x53;
1649 uint64_t x54;
1650 uint64_t x55;
1651 uint64_t x56;
1652 uint64_t x57;
1653 uint64_t x58;
1654 uint64_t x59;
1655 uint64_t x60;
1656 x1 = ((uint64_t)(arg1[31]) << 56);
1657 x2 = ((uint64_t)(arg1[30]) << 48);
1658 x3 = ((uint64_t)(arg1[29]) << 40);
1659 x4 = ((uint64_t)(arg1[28]) << 32);
1660 x5 = ((uint64_t)(arg1[27]) << 24);
1661 x6 = ((uint64_t)(arg1[26]) << 16);
1662 x7 = ((uint64_t)(arg1[25]) << 8);
1663 x8 = (arg1[24]);
1664 x9 = ((uint64_t)(arg1[23]) << 56);
1665 x10 = ((uint64_t)(arg1[22]) << 48);
1666 x11 = ((uint64_t)(arg1[21]) << 40);
1667 x12 = ((uint64_t)(arg1[20]) << 32);
1668 x13 = ((uint64_t)(arg1[19]) << 24);
1669 x14 = ((uint64_t)(arg1[18]) << 16);
1670 x15 = ((uint64_t)(arg1[17]) << 8);
1671 x16 = (arg1[16]);
1672 x17 = ((uint64_t)(arg1[15]) << 56);
1673 x18 = ((uint64_t)(arg1[14]) << 48);
1674 x19 = ((uint64_t)(arg1[13]) << 40);
1675 x20 = ((uint64_t)(arg1[12]) << 32);
1676 x21 = ((uint64_t)(arg1[11]) << 24);
1677 x22 = ((uint64_t)(arg1[10]) << 16);
1678 x23 = ((uint64_t)(arg1[9]) << 8);
1679 x24 = (arg1[8]);
1680 x25 = ((uint64_t)(arg1[7]) << 56);
1681 x26 = ((uint64_t)(arg1[6]) << 48);
1682 x27 = ((uint64_t)(arg1[5]) << 40);
1683 x28 = ((uint64_t)(arg1[4]) << 32);
1684 x29 = ((uint64_t)(arg1[3]) << 24);
1685 x30 = ((uint64_t)(arg1[2]) << 16);
1686 x31 = ((uint64_t)(arg1[1]) << 8);
1687 x32 = (arg1[0]);
1688 x33 = (x31 + (uint64_t)x32);
1689 x34 = (x30 + x33);
1690 x35 = (x29 + x34);
1691 x36 = (x28 + x35);
1692 x37 = (x27 + x36);
1693 x38 = (x26 + x37);
1694 x39 = (x25 + x38);
1695 x40 = (x23 + (uint64_t)x24);
1696 x41 = (x22 + x40);
1697 x42 = (x21 + x41);
1698 x43 = (x20 + x42);
1699 x44 = (x19 + x43);
1700 x45 = (x18 + x44);
1701 x46 = (x17 + x45);
1702 x47 = (x15 + (uint64_t)x16);
1703 x48 = (x14 + x47);
1704 x49 = (x13 + x48);
1705 x50 = (x12 + x49);
1706 x51 = (x11 + x50);
1707 x52 = (x10 + x51);
1708 x53 = (x9 + x52);
1709 x54 = (x7 + (uint64_t)x8);
1710 x55 = (x6 + x54);
1711 x56 = (x5 + x55);
1712 x57 = (x4 + x56);
1713 x58 = (x3 + x57);
1714 x59 = (x2 + x58);
1715 x60 = (x1 + x59);
1716 out1[0] = x39;
1717 out1[1] = x46;
1718 out1[2] = x53;
1719 out1[3] = x60;
David Benjamin32e59d22019-01-08 23:08:42 +00001720}
1721
David Benjamin8c8e7a62022-03-21 15:14:33 -04001722/*
1723 * The function fiat_p256_set_one returns the field element one in the Montgomery domain.
1724 *
1725 * Postconditions:
1726 * eval (from_montgomery out1) mod m = 1 mod m
1727 * 0 ≤ eval out1 < m
1728 *
1729 */
1730static FIAT_P256_FIAT_INLINE void fiat_p256_set_one(fiat_p256_montgomery_domain_field_element out1) {
1731 out1[0] = 0x1;
1732 out1[1] = UINT64_C(0xffffffff00000000);
1733 out1[2] = UINT64_C(0xffffffffffffffff);
1734 out1[3] = UINT32_C(0xfffffffe);
1735}
1736
1737/*
1738 * The function fiat_p256_msat returns the saturated representation of the prime modulus.
1739 *
1740 * Postconditions:
1741 * twos_complement_eval out1 = m
1742 * 0 ≤ eval out1 < m
1743 *
1744 * Output Bounds:
1745 * out1: [[0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff]]
1746 */
1747static FIAT_P256_FIAT_INLINE void fiat_p256_msat(uint64_t out1[5]) {
1748 out1[0] = UINT64_C(0xffffffffffffffff);
1749 out1[1] = UINT32_C(0xffffffff);
1750 out1[2] = 0x0;
1751 out1[3] = UINT64_C(0xffffffff00000001);
1752 out1[4] = 0x0;
1753}
1754
1755/*
1756 * The function fiat_p256_divstep computes a divstep.
1757 *
1758 * Preconditions:
1759 * 0 ≤ eval arg4 < m
1760 * 0 ≤ eval arg5 < m
1761 * Postconditions:
1762 * out1 = (if 0 < arg1 ∧ (twos_complement_eval arg3) is odd then 1 - arg1 else 1 + arg1)
1763 * twos_complement_eval out2 = (if 0 < arg1 ∧ (twos_complement_eval arg3) is odd then twos_complement_eval arg3 else twos_complement_eval arg2)
1764 * twos_complement_eval out3 = (if 0 < arg1 ∧ (twos_complement_eval arg3) is odd then ⌊(twos_complement_eval arg3 - twos_complement_eval arg2) / 2⌋ else ⌊(twos_complement_eval arg3 + (twos_complement_eval arg3 mod 2) * twos_complement_eval arg2) / 2⌋)
1765 * eval (from_montgomery out4) mod m = (if 0 < arg1 ∧ (twos_complement_eval arg3) is odd then (2 * eval (from_montgomery arg5)) mod m else (2 * eval (from_montgomery arg4)) mod m)
1766 * eval (from_montgomery out5) mod m = (if 0 < arg1 ∧ (twos_complement_eval arg3) is odd then (eval (from_montgomery arg4) - eval (from_montgomery arg4)) mod m else (eval (from_montgomery arg5) + (twos_complement_eval arg3 mod 2) * eval (from_montgomery arg4)) mod m)
1767 * 0 ≤ eval out5 < m
1768 * 0 ≤ eval out5 < m
1769 * 0 ≤ eval out2 < m
1770 * 0 ≤ eval out3 < m
1771 *
1772 * Input Bounds:
1773 * arg1: [0x0 ~> 0xffffffffffffffff]
1774 * arg2: [[0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff]]
1775 * arg3: [[0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff]]
1776 * arg4: [[0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff]]
1777 * arg5: [[0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff]]
1778 * Output Bounds:
1779 * out1: [0x0 ~> 0xffffffffffffffff]
1780 * out2: [[0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff]]
1781 * out3: [[0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff]]
1782 * out4: [[0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff]]
1783 * out5: [[0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff]]
1784 */
1785static FIAT_P256_FIAT_INLINE void fiat_p256_divstep(uint64_t* out1, uint64_t out2[5], uint64_t out3[5], uint64_t out4[4], uint64_t out5[4], uint64_t arg1, const uint64_t arg2[5], const uint64_t arg3[5], const uint64_t arg4[4], const uint64_t arg5[4]) {
1786 uint64_t x1;
1787 fiat_p256_uint1 x2;
1788 fiat_p256_uint1 x3;
1789 uint64_t x4;
1790 fiat_p256_uint1 x5;
1791 uint64_t x6;
1792 uint64_t x7;
1793 uint64_t x8;
1794 uint64_t x9;
1795 uint64_t x10;
1796 uint64_t x11;
1797 uint64_t x12;
1798 fiat_p256_uint1 x13;
1799 uint64_t x14;
1800 fiat_p256_uint1 x15;
1801 uint64_t x16;
1802 fiat_p256_uint1 x17;
1803 uint64_t x18;
1804 fiat_p256_uint1 x19;
1805 uint64_t x20;
1806 fiat_p256_uint1 x21;
1807 uint64_t x22;
1808 uint64_t x23;
1809 uint64_t x24;
1810 uint64_t x25;
1811 uint64_t x26;
1812 uint64_t x27;
1813 uint64_t x28;
1814 uint64_t x29;
1815 uint64_t x30;
1816 uint64_t x31;
1817 fiat_p256_uint1 x32;
1818 uint64_t x33;
1819 fiat_p256_uint1 x34;
1820 uint64_t x35;
1821 fiat_p256_uint1 x36;
1822 uint64_t x37;
1823 fiat_p256_uint1 x38;
1824 uint64_t x39;
1825 fiat_p256_uint1 x40;
1826 uint64_t x41;
1827 fiat_p256_uint1 x42;
1828 uint64_t x43;
1829 fiat_p256_uint1 x44;
1830 uint64_t x45;
1831 fiat_p256_uint1 x46;
1832 uint64_t x47;
1833 fiat_p256_uint1 x48;
1834 uint64_t x49;
1835 uint64_t x50;
1836 uint64_t x51;
1837 uint64_t x52;
1838 uint64_t x53;
1839 fiat_p256_uint1 x54;
1840 uint64_t x55;
1841 fiat_p256_uint1 x56;
1842 uint64_t x57;
1843 fiat_p256_uint1 x58;
1844 uint64_t x59;
1845 fiat_p256_uint1 x60;
1846 uint64_t x61;
1847 uint64_t x62;
1848 fiat_p256_uint1 x63;
1849 uint64_t x64;
1850 fiat_p256_uint1 x65;
1851 uint64_t x66;
1852 fiat_p256_uint1 x67;
1853 uint64_t x68;
1854 fiat_p256_uint1 x69;
1855 uint64_t x70;
1856 uint64_t x71;
1857 uint64_t x72;
1858 uint64_t x73;
1859 fiat_p256_uint1 x74;
1860 uint64_t x75;
1861 uint64_t x76;
1862 uint64_t x77;
1863 uint64_t x78;
1864 uint64_t x79;
1865 uint64_t x80;
1866 fiat_p256_uint1 x81;
1867 uint64_t x82;
1868 fiat_p256_uint1 x83;
1869 uint64_t x84;
1870 fiat_p256_uint1 x85;
1871 uint64_t x86;
1872 fiat_p256_uint1 x87;
1873 uint64_t x88;
1874 fiat_p256_uint1 x89;
1875 uint64_t x90;
1876 uint64_t x91;
1877 uint64_t x92;
1878 uint64_t x93;
1879 uint64_t x94;
1880 fiat_p256_uint1 x95;
1881 uint64_t x96;
1882 fiat_p256_uint1 x97;
1883 uint64_t x98;
1884 fiat_p256_uint1 x99;
1885 uint64_t x100;
1886 fiat_p256_uint1 x101;
1887 uint64_t x102;
1888 fiat_p256_uint1 x103;
1889 uint64_t x104;
1890 fiat_p256_uint1 x105;
1891 uint64_t x106;
1892 fiat_p256_uint1 x107;
1893 uint64_t x108;
1894 fiat_p256_uint1 x109;
1895 uint64_t x110;
1896 fiat_p256_uint1 x111;
1897 uint64_t x112;
1898 fiat_p256_uint1 x113;
1899 uint64_t x114;
1900 uint64_t x115;
1901 uint64_t x116;
1902 uint64_t x117;
1903 uint64_t x118;
1904 uint64_t x119;
1905 uint64_t x120;
1906 uint64_t x121;
1907 uint64_t x122;
1908 uint64_t x123;
1909 uint64_t x124;
1910 uint64_t x125;
1911 uint64_t x126;
1912 fiat_p256_addcarryx_u64(&x1, &x2, 0x0, (~arg1), 0x1);
1913 x3 = (fiat_p256_uint1)((fiat_p256_uint1)(x1 >> 63) & (fiat_p256_uint1)((arg3[0]) & 0x1));
1914 fiat_p256_addcarryx_u64(&x4, &x5, 0x0, (~arg1), 0x1);
1915 fiat_p256_cmovznz_u64(&x6, x3, arg1, x4);
1916 fiat_p256_cmovznz_u64(&x7, x3, (arg2[0]), (arg3[0]));
1917 fiat_p256_cmovznz_u64(&x8, x3, (arg2[1]), (arg3[1]));
1918 fiat_p256_cmovznz_u64(&x9, x3, (arg2[2]), (arg3[2]));
1919 fiat_p256_cmovznz_u64(&x10, x3, (arg2[3]), (arg3[3]));
1920 fiat_p256_cmovznz_u64(&x11, x3, (arg2[4]), (arg3[4]));
1921 fiat_p256_addcarryx_u64(&x12, &x13, 0x0, 0x1, (~(arg2[0])));
1922 fiat_p256_addcarryx_u64(&x14, &x15, x13, 0x0, (~(arg2[1])));
1923 fiat_p256_addcarryx_u64(&x16, &x17, x15, 0x0, (~(arg2[2])));
1924 fiat_p256_addcarryx_u64(&x18, &x19, x17, 0x0, (~(arg2[3])));
1925 fiat_p256_addcarryx_u64(&x20, &x21, x19, 0x0, (~(arg2[4])));
1926 fiat_p256_cmovznz_u64(&x22, x3, (arg3[0]), x12);
1927 fiat_p256_cmovznz_u64(&x23, x3, (arg3[1]), x14);
1928 fiat_p256_cmovznz_u64(&x24, x3, (arg3[2]), x16);
1929 fiat_p256_cmovznz_u64(&x25, x3, (arg3[3]), x18);
1930 fiat_p256_cmovznz_u64(&x26, x3, (arg3[4]), x20);
1931 fiat_p256_cmovznz_u64(&x27, x3, (arg4[0]), (arg5[0]));
1932 fiat_p256_cmovznz_u64(&x28, x3, (arg4[1]), (arg5[1]));
1933 fiat_p256_cmovznz_u64(&x29, x3, (arg4[2]), (arg5[2]));
1934 fiat_p256_cmovznz_u64(&x30, x3, (arg4[3]), (arg5[3]));
1935 fiat_p256_addcarryx_u64(&x31, &x32, 0x0, x27, x27);
1936 fiat_p256_addcarryx_u64(&x33, &x34, x32, x28, x28);
1937 fiat_p256_addcarryx_u64(&x35, &x36, x34, x29, x29);
1938 fiat_p256_addcarryx_u64(&x37, &x38, x36, x30, x30);
1939 fiat_p256_subborrowx_u64(&x39, &x40, 0x0, x31, UINT64_C(0xffffffffffffffff));
1940 fiat_p256_subborrowx_u64(&x41, &x42, x40, x33, UINT32_C(0xffffffff));
1941 fiat_p256_subborrowx_u64(&x43, &x44, x42, x35, 0x0);
1942 fiat_p256_subborrowx_u64(&x45, &x46, x44, x37, UINT64_C(0xffffffff00000001));
1943 fiat_p256_subborrowx_u64(&x47, &x48, x46, x38, 0x0);
1944 x49 = (arg4[3]);
1945 x50 = (arg4[2]);
1946 x51 = (arg4[1]);
1947 x52 = (arg4[0]);
1948 fiat_p256_subborrowx_u64(&x53, &x54, 0x0, 0x0, x52);
1949 fiat_p256_subborrowx_u64(&x55, &x56, x54, 0x0, x51);
1950 fiat_p256_subborrowx_u64(&x57, &x58, x56, 0x0, x50);
1951 fiat_p256_subborrowx_u64(&x59, &x60, x58, 0x0, x49);
1952 fiat_p256_cmovznz_u64(&x61, x60, 0x0, UINT64_C(0xffffffffffffffff));
1953 fiat_p256_addcarryx_u64(&x62, &x63, 0x0, x53, x61);
1954 fiat_p256_addcarryx_u64(&x64, &x65, x63, x55, (x61 & UINT32_C(0xffffffff)));
1955 fiat_p256_addcarryx_u64(&x66, &x67, x65, x57, 0x0);
1956 fiat_p256_addcarryx_u64(&x68, &x69, x67, x59, (x61 & UINT64_C(0xffffffff00000001)));
1957 fiat_p256_cmovznz_u64(&x70, x3, (arg5[0]), x62);
1958 fiat_p256_cmovznz_u64(&x71, x3, (arg5[1]), x64);
1959 fiat_p256_cmovznz_u64(&x72, x3, (arg5[2]), x66);
1960 fiat_p256_cmovznz_u64(&x73, x3, (arg5[3]), x68);
1961 x74 = (fiat_p256_uint1)(x22 & 0x1);
1962 fiat_p256_cmovznz_u64(&x75, x74, 0x0, x7);
1963 fiat_p256_cmovznz_u64(&x76, x74, 0x0, x8);
1964 fiat_p256_cmovznz_u64(&x77, x74, 0x0, x9);
1965 fiat_p256_cmovznz_u64(&x78, x74, 0x0, x10);
1966 fiat_p256_cmovznz_u64(&x79, x74, 0x0, x11);
1967 fiat_p256_addcarryx_u64(&x80, &x81, 0x0, x22, x75);
1968 fiat_p256_addcarryx_u64(&x82, &x83, x81, x23, x76);
1969 fiat_p256_addcarryx_u64(&x84, &x85, x83, x24, x77);
1970 fiat_p256_addcarryx_u64(&x86, &x87, x85, x25, x78);
1971 fiat_p256_addcarryx_u64(&x88, &x89, x87, x26, x79);
1972 fiat_p256_cmovznz_u64(&x90, x74, 0x0, x27);
1973 fiat_p256_cmovznz_u64(&x91, x74, 0x0, x28);
1974 fiat_p256_cmovznz_u64(&x92, x74, 0x0, x29);
1975 fiat_p256_cmovznz_u64(&x93, x74, 0x0, x30);
1976 fiat_p256_addcarryx_u64(&x94, &x95, 0x0, x70, x90);
1977 fiat_p256_addcarryx_u64(&x96, &x97, x95, x71, x91);
1978 fiat_p256_addcarryx_u64(&x98, &x99, x97, x72, x92);
1979 fiat_p256_addcarryx_u64(&x100, &x101, x99, x73, x93);
1980 fiat_p256_subborrowx_u64(&x102, &x103, 0x0, x94, UINT64_C(0xffffffffffffffff));
1981 fiat_p256_subborrowx_u64(&x104, &x105, x103, x96, UINT32_C(0xffffffff));
1982 fiat_p256_subborrowx_u64(&x106, &x107, x105, x98, 0x0);
1983 fiat_p256_subborrowx_u64(&x108, &x109, x107, x100, UINT64_C(0xffffffff00000001));
1984 fiat_p256_subborrowx_u64(&x110, &x111, x109, x101, 0x0);
1985 fiat_p256_addcarryx_u64(&x112, &x113, 0x0, x6, 0x1);
1986 x114 = ((x80 >> 1) | ((x82 << 63) & UINT64_C(0xffffffffffffffff)));
1987 x115 = ((x82 >> 1) | ((x84 << 63) & UINT64_C(0xffffffffffffffff)));
1988 x116 = ((x84 >> 1) | ((x86 << 63) & UINT64_C(0xffffffffffffffff)));
1989 x117 = ((x86 >> 1) | ((x88 << 63) & UINT64_C(0xffffffffffffffff)));
1990 x118 = ((x88 & UINT64_C(0x8000000000000000)) | (x88 >> 1));
1991 fiat_p256_cmovznz_u64(&x119, x48, x39, x31);
1992 fiat_p256_cmovznz_u64(&x120, x48, x41, x33);
1993 fiat_p256_cmovznz_u64(&x121, x48, x43, x35);
1994 fiat_p256_cmovznz_u64(&x122, x48, x45, x37);
1995 fiat_p256_cmovznz_u64(&x123, x111, x102, x94);
1996 fiat_p256_cmovznz_u64(&x124, x111, x104, x96);
1997 fiat_p256_cmovznz_u64(&x125, x111, x106, x98);
1998 fiat_p256_cmovznz_u64(&x126, x111, x108, x100);
1999 *out1 = x112;
2000 out2[0] = x7;
2001 out2[1] = x8;
2002 out2[2] = x9;
2003 out2[3] = x10;
2004 out2[4] = x11;
2005 out3[0] = x114;
2006 out3[1] = x115;
2007 out3[2] = x116;
2008 out3[3] = x117;
2009 out3[4] = x118;
2010 out4[0] = x119;
2011 out4[1] = x120;
2012 out4[2] = x121;
2013 out4[3] = x122;
2014 out5[0] = x123;
2015 out5[1] = x124;
2016 out5[2] = x125;
2017 out5[3] = x126;
2018}
2019
2020/*
2021 * The function fiat_p256_divstep_precomp returns the precomputed value for Bernstein-Yang-inversion (in montgomery form).
2022 *
2023 * Postconditions:
2024 * eval (from_montgomery out1) = ⌊(m - 1) / 2⌋^(if ⌊log2 m⌋ + 1 < 46 then ⌊(49 * (⌊log2 m⌋ + 1) + 80) / 17⌋ else ⌊(49 * (⌊log2 m⌋ + 1) + 57) / 17⌋)
2025 * 0 ≤ eval out1 < m
2026 *
2027 * Output Bounds:
2028 * out1: [[0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff]]
2029 */
2030static FIAT_P256_FIAT_INLINE void fiat_p256_divstep_precomp(uint64_t out1[4]) {
2031 out1[0] = UINT64_C(0x67ffffffb8000000);
2032 out1[1] = UINT64_C(0xc000000038000000);
2033 out1[2] = UINT64_C(0xd80000007fffffff);
2034 out1[3] = UINT64_C(0x2fffffffffffffff);
2035}