authorgravatar for 124872+jedisct1@users.noreply.github.comFrank Denis <124872+jedisct1@users.noreply.github.com> 2022-05-31 17:29:38+02:00
committergravatar for noreply@github.comGitHub <noreply@github.com> 2022-05-31 17:29:38+02:00
log26aea8cfa1ea98329e18458cb23be2d60ef52507
tree01dc2913b2244369873bf50d4319bd808402183a
parent83beed09e1ce5a15e2b9801a50cf601352d8383e
signaturebadge-question-mark Signed by PGP key 4AEE18F83AFDEB23

crypto: add support for the NIST P-384 curve (#11735)

After P-256, here comes P-384, also known as secp384r1. Like P-256, it is required for TLS, and is the current NIST recommendation for key exchange and signatures, for better or for worse. Like P-256, all the finite field arithmetic has been computed and verified to be correct by fiat-crypto.

13 files changed, 8192 insertions(+), 129 deletions(-)

lib/std/crypto.zig+2
...@@ -62,6 +62,7 @@ pub const ecc = struct {...@@ -62,6 +62,7 @@ pub const ecc = struct {
62 pub const Curve25519 = @import("crypto/25519/curve25519.zig").Curve25519;62 pub const Curve25519 = @import("crypto/25519/curve25519.zig").Curve25519;
63 pub const Edwards25519 = @import("crypto/25519/edwards25519.zig").Edwards25519;63 pub const Edwards25519 = @import("crypto/25519/edwards25519.zig").Edwards25519;
64 pub const P256 = @import("crypto/pcurves/p256.zig").P256;64 pub const P256 = @import("crypto/pcurves/p256.zig").P256;
65 pub const P384 = @import("crypto/pcurves/p384.zig").P384;
65 pub const Ristretto255 = @import("crypto/25519/ristretto255.zig").Ristretto255;66 pub const Ristretto255 = @import("crypto/25519/ristretto255.zig").Ristretto255;
66};67};
6768
...@@ -201,6 +202,7 @@ test {...@@ -201,6 +202,7 @@ test {
201 _ = ecc.Curve25519;202 _ = ecc.Curve25519;
202 _ = ecc.Edwards25519;203 _ = ecc.Edwards25519;
203 _ = ecc.P256;204 _ = ecc.P256;
205 _ = ecc.P384;
204 _ = ecc.Ristretto255;206 _ = ecc.Ristretto255;
205207
206 _ = hash.blake2;208 _ = hash.blake2;
lib/std/crypto/pcurves/common.zig+23
...@@ -253,6 +253,18 @@ pub fn Field(comptime params: FieldParams) type {...@@ -253,6 +253,18 @@ pub fn Field(comptime params: FieldParams) type {
253 const x47 = x15.mul(x53);253 const x47 = x15.mul(x53);
254 const ls = x47.mul(((x53.sqn(17).mul(x2)).sqn(143).mul(x47)).sqn(47)).sq().mul(x2);254 const ls = x47.mul(((x53.sqn(17).mul(x2)).sqn(143).mul(x47)).sqn(47)).sq().mul(x2);
255 return ls.equivalent(Fe.one);255 return ls.equivalent(Fe.one);
256 } else if (field_order == 39402006196394479212279040100143613805079739270465446667948293404245721771496870329047266088258938001861606973112319) {
257 const t111 = x2.mul(x2.mul(x2.sq()).sq());
258 const t111111 = t111.mul(t111.sqn(3));
259 const t1111110 = t111111.sq();
260 const t1111111 = x2.mul(t1111110);
261 const x12 = t1111110.sqn(5).mul(t111111);
262 const x31 = x12.sqn(12).mul(x12).sqn(7).mul(t1111111);
263 const x32 = x31.sq().mul(x2);
264 const x63 = x32.sqn(31).mul(x31);
265 const x126 = x63.sqn(63).mul(x63);
266 const ls = x126.sqn(126).mul(x126).sqn(3).mul(t111).sqn(33).mul(x32).sqn(95).mul(x31);
267 return ls.equivalent(Fe.one);
256 } else {268 } else {
257 const ls = x2.pow(std.meta.Int(.unsigned, field_bits), (field_order - 1) / 2); // Legendre symbol269 const ls = x2.pow(std.meta.Int(.unsigned, field_bits), (field_order - 1) / 2); // Legendre symbol
258 return ls.equivalent(Fe.one);270 return ls.equivalent(Fe.one);
...@@ -268,6 +280,17 @@ pub fn Field(comptime params: FieldParams) type {...@@ -268,6 +280,17 @@ pub fn Field(comptime params: FieldParams) type {
268 const t11111111 = t1111.mul(t1111.sqn(4));280 const t11111111 = t1111.mul(t1111.sqn(4));
269 const x16 = t11111111.sqn(8).mul(t11111111);281 const x16 = t11111111.sqn(8).mul(t11111111);
270 return x16.sqn(16).mul(x16).sqn(32).mul(x2).sqn(96).mul(x2).sqn(94);282 return x16.sqn(16).mul(x16).sqn(32).mul(x2).sqn(96).mul(x2).sqn(94);
283 } else if (field_order == 39402006196394479212279040100143613805079739270465446667948293404245721771496870329047266088258938001861606973112319) {
284 const t111 = x2.mul(x2.mul(x2.sq()).sq());
285 const t111111 = t111.mul(t111.sqn(3));
286 const t1111110 = t111111.sq();
287 const t1111111 = x2.mul(t1111110);
288 const x12 = t1111110.sqn(5).mul(t111111);
289 const x31 = x12.sqn(12).mul(x12).sqn(7).mul(t1111111);
290 const x32 = x31.sq().mul(x2);
291 const x63 = x32.sqn(31).mul(x31);
292 const x126 = x63.sqn(63).mul(x63);
293 return x126.sqn(126).mul(x126).sqn(3).mul(t111).sqn(33).mul(x32).sqn(64).mul(x2).sqn(30);
271 } else {294 } else {
272 return x2.pow(std.meta.Int(.unsigned, field_bits), (field_order + 1) / 4);295 return x2.pow(std.meta.Int(.unsigned, field_bits), (field_order + 1) / 4);
273 }296 }
lib/std/crypto/pcurves/p256.zig+1-1
...@@ -474,5 +474,5 @@ pub const AffineCoordinates = struct {...@@ -474,5 +474,5 @@ pub const AffineCoordinates = struct {
474};474};
475475
476test "p256" {476test "p256" {
477 _ = @import("tests.zig");477 _ = @import("tests/p256.zig");
478}478}
lib/std/crypto/pcurves/p256/field.zig+1-1
...@@ -7,6 +7,6 @@ pub const Fe = Field(.{...@@ -7,6 +7,6 @@ pub const Fe = Field(.{
7 .fiat = @import("p256_64.zig"),7 .fiat = @import("p256_64.zig"),
8 .field_order = 115792089210356248762697446949407573530086143415290314195533631308867097853951,8 .field_order = 115792089210356248762697446949407573530086143415290314195533631308867097853951,
9 .field_bits = 256,9 .field_bits = 256,
10 .saturated_bits = 255,10 .saturated_bits = 256,
11 .encoded_length = 32,11 .encoded_length = 32,
12});12});
lib/std/crypto/pcurves/p256/scalar.zig+1-1
...@@ -20,7 +20,7 @@ const Fe = Field(.{...@@ -20,7 +20,7 @@ const Fe = Field(.{
20 .fiat = @import("p256_scalar_64.zig"),20 .fiat = @import("p256_scalar_64.zig"),
21 .field_order = 115792089210356248762697446949407573529996955224135760342422259061068512044369,21 .field_order = 115792089210356248762697446949407573529996955224135760342422259061068512044369,
22 .field_bits = 256,22 .field_bits = 256,
23 .saturated_bits = 255,23 .saturated_bits = 256,
24 .encoded_length = encoded_length,24 .encoded_length = encoded_length,
25});25});
2626
lib/std/crypto/pcurves/p384.zig created+478
...@@ -0,0 +1,478 @@
1const std = @import("std");
2const crypto = std.crypto;
3const mem = std.mem;
4const meta = std.meta;
5
6const EncodingError = crypto.errors.EncodingError;
7const IdentityElementError = crypto.errors.IdentityElementError;
8const NonCanonicalError = crypto.errors.NonCanonicalError;
9const NotSquareError = crypto.errors.NotSquareError;
10
11/// Group operations over P384.
12pub const P384 = struct {
13 /// The underlying prime field.
14 pub const Fe = @import("p384/field.zig").Fe;
15 /// Field arithmetic mod the order of the main subgroup.
16 pub const scalar = @import("p384/scalar.zig");
17
18 x: Fe,
19 y: Fe,
20 z: Fe = Fe.one,
21
22 is_base: bool = false,
23
24 /// The P384 base point.
25 pub const basePoint = P384{
26 .x = Fe.fromInt(26247035095799689268623156744566981891852923491109213387815615900925518854738050089022388053975719786650872476732087) catch unreachable,
27 .y = Fe.fromInt(8325710961489029985546751289520108179287853048861315594709205902480503199884419224438643760392947333078086511627871) catch unreachable,
28 .z = Fe.one,
29 .is_base = true,
30 };
31
32 /// The P384 neutral element.
33 pub const identityElement = P384{ .x = Fe.zero, .y = Fe.one, .z = Fe.zero };
34
35 pub const B = Fe.fromInt(27580193559959705877849011840389048093056905856361568521428707301988689241309860865136260764883745107765439761230575) catch unreachable;
36
37 /// Reject the neutral element.
38 pub fn rejectIdentity(p: P384) IdentityElementError!void {
39 if (p.x.isZero()) {
40 return error.IdentityElement;
41 }
42 }
43
44 /// Create a point from affine coordinates after checking that they match the curve equation.
45 pub fn fromAffineCoordinates(p: AffineCoordinates) EncodingError!P384 {
46 const x = p.x;
47 const y = p.y;
48 const x3AxB = x.sq().mul(x).sub(x).sub(x).sub(x).add(B);
49 const yy = y.sq();
50 const on_curve = @boolToInt(x3AxB.equivalent(yy));
51 const is_identity = @boolToInt(x.equivalent(AffineCoordinates.identityElement.x)) & @boolToInt(y.equivalent(AffineCoordinates.identityElement.y));
52 if ((on_curve | is_identity) == 0) {
53 return error.InvalidEncoding;
54 }
55 var ret = P384{ .x = x, .y = y, .z = Fe.one };
56 ret.z.cMov(P384.identityElement.z, is_identity);
57 return ret;
58 }
59
60 /// Create a point from serialized affine coordinates.
61 pub fn fromSerializedAffineCoordinates(xs: [48]u8, ys: [48]u8, endian: std.builtin.Endian) (NonCanonicalError || EncodingError)!P384 {
62 const x = try Fe.fromBytes(xs, endian);
63 const y = try Fe.fromBytes(ys, endian);
64 return fromAffineCoordinates(.{ .x = x, .y = y });
65 }
66
67 /// Recover the Y coordinate from the X coordinate.
68 pub fn recoverY(x: Fe, is_odd: bool) NotSquareError!Fe {
69 const x3AxB = x.sq().mul(x).sub(x).sub(x).sub(x).add(B);
70 var y = try x3AxB.sqrt();
71 const yn = y.neg();
72 y.cMov(yn, @boolToInt(is_odd) ^ @boolToInt(y.isOdd()));
73 return y;
74 }
75
76 /// Deserialize a SEC1-encoded point.
77 pub fn fromSec1(s: []const u8) (EncodingError || NotSquareError || NonCanonicalError)!P384 {
78 if (s.len < 1) return error.InvalidEncoding;
79 const encoding_type = s[0];
80 const encoded = s[1..];
81 switch (encoding_type) {
82 0 => {
83 if (encoded.len != 0) return error.InvalidEncoding;
84 return P384.identityElement;
85 },
86 2, 3 => {
87 if (encoded.len != 48) return error.InvalidEncoding;
88 const x = try Fe.fromBytes(encoded[0..48].*, .Big);
89 const y_is_odd = (encoding_type == 3);
90 const y = try recoverY(x, y_is_odd);
91 return P384{ .x = x, .y = y };
92 },
93 4 => {
94 if (encoded.len != 96) return error.InvalidEncoding;
95 const x = try Fe.fromBytes(encoded[0..48].*, .Big);
96 const y = try Fe.fromBytes(encoded[48..96].*, .Big);
97 return P384.fromAffineCoordinates(.{ .x = x, .y = y });
98 },
99 else => return error.InvalidEncoding,
100 }
101 }
102
103 /// Serialize a point using the compressed SEC-1 format.
104 pub fn toCompressedSec1(p: P384) [49]u8 {
105 var out: [49]u8 = undefined;
106 const xy = p.affineCoordinates();
107 out[0] = if (xy.y.isOdd()) 3 else 2;
108 mem.copy(u8, out[1..], &xy.x.toBytes(.Big));
109 return out;
110 }
111
112 /// Serialize a point using the uncompressed SEC-1 format.
113 pub fn toUncompressedSec1(p: P384) [97]u8 {
114 var out: [97]u8 = undefined;
115 out[0] = 4;
116 const xy = p.affineCoordinates();
117 mem.copy(u8, out[1..49], &xy.x.toBytes(.Big));
118 mem.copy(u8, out[49..97], &xy.y.toBytes(.Big));
119 return out;
120 }
121
122 /// Return a random point.
123 pub fn random() P384 {
124 const n = scalar.random(.Little);
125 return basePoint.mul(n, .Little) catch unreachable;
126 }
127
128 /// Flip the sign of the X coordinate.
129 pub fn neg(p: P384) P384 {
130 return .{ .x = p.x, .y = p.y.neg(), .z = p.z };
131 }
132
133 /// Double a P384 point.
134 // Algorithm 6 from https://eprint.iacr.org/2015/1060.pdf
135 pub fn dbl(p: P384) P384 {
136 var t0 = p.x.sq();
137 var t1 = p.y.sq();
138 var t2 = p.z.sq();
139 var t3 = p.x.mul(p.y);
140 t3 = t3.dbl();
141 var Z3 = p.x.mul(p.z);
142 Z3 = Z3.add(Z3);
143 var Y3 = B.mul(t2);
144 Y3 = Y3.sub(Z3);
145 var X3 = Y3.dbl();
146 Y3 = X3.add(Y3);
147 X3 = t1.sub(Y3);
148 Y3 = t1.add(Y3);
149 Y3 = X3.mul(Y3);
150 X3 = X3.mul(t3);
151 t3 = t2.dbl();
152 t2 = t2.add(t3);
153 Z3 = B.mul(Z3);
154 Z3 = Z3.sub(t2);
155 Z3 = Z3.sub(t0);
156 t3 = Z3.dbl();
157 Z3 = Z3.add(t3);
158 t3 = t0.dbl();
159 t0 = t3.add(t0);
160 t0 = t0.sub(t2);
161 t0 = t0.mul(Z3);
162 Y3 = Y3.add(t0);
163 t0 = p.y.mul(p.z);
164 t0 = t0.dbl();
165 Z3 = t0.mul(Z3);
166 X3 = X3.sub(Z3);
167 Z3 = t0.mul(t1);
168 Z3 = Z3.dbl().dbl();
169 return .{
170 .x = X3,
171 .y = Y3,
172 .z = Z3,
173 };
174 }
175
176 /// Add P384 points, the second being specified using affine coordinates.
177 // Algorithm 5 from https://eprint.iacr.org/2015/1060.pdf
178 pub fn addMixed(p: P384, q: AffineCoordinates) P384 {
179 var t0 = p.x.mul(q.x);
180 var t1 = p.y.mul(q.y);
181 var t3 = q.x.add(q.y);
182 var t4 = p.x.add(p.y);
183 t3 = t3.mul(t4);
184 t4 = t0.add(t1);
185 t3 = t3.sub(t4);
186 t4 = q.y.mul(p.z);
187 t4 = t4.add(p.y);
188 var Y3 = q.x.mul(p.z);
189 Y3 = Y3.add(p.x);
190 var Z3 = B.mul(p.z);
191 var X3 = Y3.sub(Z3);
192 Z3 = X3.dbl();
193 X3 = X3.add(Z3);
194 Z3 = t1.sub(X3);
195 X3 = t1.add(X3);
196 Y3 = B.mul(Y3);
197 t1 = p.z.dbl();
198 var t2 = t1.add(p.z);
199 Y3 = Y3.sub(t2);
200 Y3 = Y3.sub(t0);
201 t1 = Y3.dbl();
202 Y3 = t1.add(Y3);
203 t1 = t0.dbl();
204 t0 = t1.add(t0);
205 t0 = t0.sub(t2);
206 t1 = t4.mul(Y3);
207 t2 = t0.mul(Y3);
208 Y3 = X3.mul(Z3);
209 Y3 = Y3.add(t2);
210 X3 = t3.mul(X3);
211 X3 = X3.sub(t1);
212 Z3 = t4.mul(Z3);
213 t1 = t3.mul(t0);
214 Z3 = Z3.add(t1);
215 var ret = P384{
216 .x = X3,
217 .y = Y3,
218 .z = Z3,
219 };
220 ret.cMov(p, @boolToInt(q.x.isZero()));
221 return ret;
222 }
223
224 /// Add P384 points.
225 // Algorithm 4 from https://eprint.iacr.org/2015/1060.pdf
226 pub fn add(p: P384, q: P384) P384 {
227 var t0 = p.x.mul(q.x);
228 var t1 = p.y.mul(q.y);
229 var t2 = p.z.mul(q.z);
230 var t3 = p.x.add(p.y);
231 var t4 = q.x.add(q.y);
232 t3 = t3.mul(t4);
233 t4 = t0.add(t1);
234 t3 = t3.sub(t4);
235 t4 = p.y.add(p.z);
236 var X3 = q.y.add(q.z);
237 t4 = t4.mul(X3);
238 X3 = t1.add(t2);
239 t4 = t4.sub(X3);
240 X3 = p.x.add(p.z);
241 var Y3 = q.x.add(q.z);
242 X3 = X3.mul(Y3);
243 Y3 = t0.add(t2);
244 Y3 = X3.sub(Y3);
245 var Z3 = B.mul(t2);
246 X3 = Y3.sub(Z3);
247 Z3 = X3.dbl();
248 X3 = X3.add(Z3);
249 Z3 = t1.sub(X3);
250 X3 = t1.add(X3);
251 Y3 = B.mul(Y3);
252 t1 = t2.dbl();
253 t2 = t1.add(t2);
254 Y3 = Y3.sub(t2);
255 Y3 = Y3.sub(t0);
256 t1 = Y3.dbl();
257 Y3 = t1.add(Y3);
258 t1 = t0.dbl();
259 t0 = t1.add(t0);
260 t0 = t0.sub(t2);
261 t1 = t4.mul(Y3);
262 t2 = t0.mul(Y3);
263 Y3 = X3.mul(Z3);
264 Y3 = Y3.add(t2);
265 X3 = t3.mul(X3);
266 X3 = X3.sub(t1);
267 Z3 = t4.mul(Z3);
268 t1 = t3.mul(t0);
269 Z3 = Z3.add(t1);
270 return .{
271 .x = X3,
272 .y = Y3,
273 .z = Z3,
274 };
275 }
276
277 /// Subtract P384 points.
278 pub fn sub(p: P384, q: P384) P384 {
279 return p.add(q.neg());
280 }
281
282 /// Subtract P384 points, the second being specified using affine coordinates.
283 pub fn subMixed(p: P384, q: AffineCoordinates) P384 {
284 return p.addMixed(q.neg());
285 }
286
287 /// Return affine coordinates.
288 pub fn affineCoordinates(p: P384) AffineCoordinates {
289 const zinv = p.z.invert();
290 var ret = AffineCoordinates{
291 .x = p.x.mul(zinv),
292 .y = p.y.mul(zinv),
293 };
294 ret.cMov(AffineCoordinates.identityElement, @boolToInt(p.x.isZero()));
295 return ret;
296 }
297
298 /// Return true if both coordinate sets represent the same point.
299 pub fn equivalent(a: P384, b: P384) bool {
300 if (a.sub(b).rejectIdentity()) {
301 return false;
302 } else |_| {
303 return true;
304 }
305 }
306
307 fn cMov(p: *P384, a: P384, c: u1) void {
308 p.x.cMov(a.x, c);
309 p.y.cMov(a.y, c);
310 p.z.cMov(a.z, c);
311 }
312
313 fn pcSelect(comptime n: usize, pc: *const [n]P384, b: u8) P384 {
314 var t = P384.identityElement;
315 comptime var i: u8 = 1;
316 inline while (i < pc.len) : (i += 1) {
317 t.cMov(pc[i], @truncate(u1, (@as(usize, b ^ i) -% 1) >> 8));
318 }
319 return t;
320 }
321
322 fn slide(s: [48]u8) [2 * 48 + 1]i8 {
323 var e: [2 * 48 + 1]i8 = undefined;
324 for (s) |x, i| {
325 e[i * 2 + 0] = @as(i8, @truncate(u4, x));
326 e[i * 2 + 1] = @as(i8, @truncate(u4, x >> 4));
327 }
328 // Now, e[0..63] is between 0 and 15, e[63] is between 0 and 7
329 var carry: i8 = 0;
330 for (e[0..96]) |*x| {
331 x.* += carry;
332 carry = (x.* + 8) >> 4;
333 x.* -= carry * 16;
334 std.debug.assert(x.* >= -8 and x.* <= 8);
335 }
336 e[96] = carry;
337 // Now, e[*] is between -8 and 8, including e[64]
338 std.debug.assert(carry >= -8 and carry <= 8);
339 return e;
340 }
341
342 fn pcMul(pc: *const [9]P384, s: [48]u8, comptime vartime: bool) IdentityElementError!P384 {
343 std.debug.assert(vartime);
344 const e = slide(s);
345 var q = P384.identityElement;
346 var pos = e.len - 1;
347 while (true) : (pos -= 1) {
348 const slot = e[pos];
349 if (slot > 0) {
350 q = q.add(pc[@intCast(usize, slot)]);
351 } else if (slot < 0) {
352 q = q.sub(pc[@intCast(usize, -slot)]);
353 }
354 if (pos == 0) break;
355 q = q.dbl().dbl().dbl().dbl();
356 }
357 try q.rejectIdentity();
358 return q;
359 }
360
361 fn pcMul16(pc: *const [16]P384, s: [48]u8, comptime vartime: bool) IdentityElementError!P384 {
362 var q = P384.identityElement;
363 var pos: usize = 380;
364 while (true) : (pos -= 4) {
365 const slot = @truncate(u4, (s[pos >> 3] >> @truncate(u3, pos)));
366 if (vartime) {
367 if (slot != 0) {
368 q = q.add(pc[slot]);
369 }
370 } else {
371 q = q.add(pcSelect(16, pc, slot));
372 }
373 if (pos == 0) break;
374 q = q.dbl().dbl().dbl().dbl();
375 }
376 try q.rejectIdentity();
377 return q;
378 }
379
380 fn precompute(p: P384, comptime count: usize) [1 + count]P384 {
381 var pc: [1 + count]P384 = undefined;
382 pc[0] = P384.identityElement;
383 pc[1] = p;
384 var i: usize = 2;
385 while (i <= count) : (i += 1) {
386 pc[i] = if (i % 2 == 0) pc[i / 2].dbl() else pc[i - 1].add(p);
387 }
388 return pc;
389 }
390
391 const basePointPc = pc: {
392 @setEvalBranchQuota(50000);
393 break :pc precompute(P384.basePoint, 15);
394 };
395
396 /// Multiply an elliptic curve point by a scalar.
397 /// Return error.IdentityElement if the result is the identity element.
398 pub fn mul(p: P384, s_: [48]u8, endian: std.builtin.Endian) IdentityElementError!P384 {
399 const s = if (endian == .Little) s_ else Fe.orderSwap(s_);
400 if (p.is_base) {
401 return pcMul16(&basePointPc, s, false);
402 }
403 try p.rejectIdentity();
404 const pc = precompute(p, 15);
405 return pcMul16(&pc, s, false);
406 }
407
408 /// Multiply an elliptic curve point by a *PUBLIC* scalar *IN VARIABLE TIME*
409 /// This can be used for signature verification.
410 pub fn mulPublic(p: P384, s_: [48]u8, endian: std.builtin.Endian) IdentityElementError!P384 {
411 const s = if (endian == .Little) s_ else Fe.orderSwap(s_);
412 if (p.is_base) {
413 return pcMul16(&basePointPc, s, true);
414 }
415 try p.rejectIdentity();
416 const pc = precompute(p, 8);
417 return pcMul(&pc, s, true);
418 }
419
420 /// Double-base multiplication of public parameters - Compute (p1*s1)+(p2*s2) *IN VARIABLE TIME*
421 /// This can be used for signature verification.
422 pub fn mulDoubleBasePublic(p1: P384, s1_: [48]u8, p2: P384, s2_: [48]u8, endian: std.builtin.Endian) IdentityElementError!P384 {
423 const s1 = if (endian == .Little) s1_ else Fe.orderSwap(s1_);
424 const s2 = if (endian == .Little) s2_ else Fe.orderSwap(s2_);
425 try p1.rejectIdentity();
426 var pc1_array: [9]P384 = undefined;
427 const pc1 = if (p1.is_base) basePointPc[0..9] else pc: {
428 pc1_array = precompute(p1, 8);
429 break :pc &pc1_array;
430 };
431 try p2.rejectIdentity();
432 var pc2_array: [9]P384 = undefined;
433 const pc2 = if (p2.is_base) basePointPc[0..9] else pc: {
434 pc2_array = precompute(p2, 8);
435 break :pc &pc2_array;
436 };
437 const e1 = slide(s1);
438 const e2 = slide(s2);
439 var q = P384.identityElement;
440 var pos: usize = 2 * 48 - 1;
441 while (true) : (pos -= 1) {
442 const slot1 = e1[pos];
443 if (slot1 > 0) {
444 q = q.add(pc1[@intCast(usize, slot1)]);
445 } else if (slot1 < 0) {
446 q = q.sub(pc1[@intCast(usize, -slot1)]);
447 }
448 const slot2 = e2[pos];
449 if (slot2 > 0) {
450 q = q.add(pc2[@intCast(usize, slot2)]);
451 } else if (slot2 < 0) {
452 q = q.sub(pc2[@intCast(usize, -slot2)]);
453 }
454 if (pos == 0) break;
455 q = q.dbl().dbl().dbl().dbl();
456 }
457 try q.rejectIdentity();
458 return q;
459 }
460};
461
462/// A point in affine coordinates.
463pub const AffineCoordinates = struct {
464 x: P384.Fe,
465 y: P384.Fe,
466
467 /// Identity element in affine coordinates.
468 pub const identityElement = AffineCoordinates{ .x = P384.identityElement.x, .y = P384.identityElement.y };
469
470 fn cMov(p: *AffineCoordinates, a: AffineCoordinates, c: u1) void {
471 p.x.cMov(a.x, c);
472 p.y.cMov(a.y, c);
473 }
474};
475
476test "p384" {
477 _ = @import("tests/p384.zig");
478}
lib/std/crypto/pcurves/p384/field.zig created+12
...@@ -0,0 +1,12 @@
1const std = @import("std");
2const common = @import("../common.zig");
3
4const Field = common.Field;
5
6pub const Fe = Field(.{
7 .fiat = @import("p384_64.zig"),
8 .field_order = 39402006196394479212279040100143613805079739270465446667948293404245721771496870329047266088258938001861606973112319,
9 .field_bits = 384,
10 .saturated_bits = 384,
11 .encoded_length = 48,
12});
lib/std/crypto/pcurves/p384/p384_64.zig created+3578
...@@ -0,0 +1,3578 @@
1// Autogenerated: 'src/ExtractionOCaml/word_by_word_montgomery' --lang Zig --internal-static --public-function-case camelCase --private-function-case camelCase --public-type-case UpperCamelCase --private-type-case UpperCamelCase --no-prefix-fiat --package-name p384 '' 64 '2^384 - 2^128 - 2^96 + 2^32 - 1' mul square add sub opp from_montgomery to_montgomery nonzero selectznz to_bytes from_bytes one msat divstep divstep_precomp
2// curve description (via package name): p384
3// machine_wordsize = 64 (from "64")
4// requested operations: mul, square, add, sub, opp, from_montgomery, to_montgomery, nonzero, selectznz, to_bytes, from_bytes, one, msat, divstep, divstep_precomp
5// m = 0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff0000000000000000ffffffff (from "2^384 - 2^128 - 2^96 + 2^32 - 1")
6//
7// NOTE: In addition to the bounds specified above each function, all
8// functions synthesized for this Montgomery arithmetic require the
9// input to be strictly less than the prime modulus (m), and also
10// require the input to be in the unique saturated representation.
11// All functions also ensure that these two properties are true of
12// return values.
13//
14// Computed values:
15// eval z = z[0] + (z[1] << 64) + (z[2] << 128) + (z[3] << 192) + (z[4] << 256) + (z[5] << 0x140)
16// 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) + (z[32] << 256) + (z[33] << 0x108) + (z[34] << 0x110) + (z[35] << 0x118) + (z[36] << 0x120) + (z[37] << 0x128) + (z[38] << 0x130) + (z[39] << 0x138) + (z[40] << 0x140) + (z[41] << 0x148) + (z[42] << 0x150) + (z[43] << 0x158) + (z[44] << 0x160) + (z[45] << 0x168) + (z[46] << 0x170) + (z[47] << 0x178)
17// twos_complement_eval z = let x1 := z[0] + (z[1] << 64) + (z[2] << 128) + (z[3] << 192) + (z[4] << 256) + (z[5] << 0x140) in
18// if x1 & (2^384-1) < 2^383 then x1 & (2^384-1) else (x1 & (2^384-1)) - 2^384
19
20const std = @import("std");
21const mode = @import("builtin").mode; // Checked arithmetic is disabled in non-debug modes to avoid side channels
22
23// The type MontgomeryDomainFieldElement is a field element in the Montgomery domain.
24// Bounds: [[0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff]]
25pub const MontgomeryDomainFieldElement = [6]u64;
26
27// The type NonMontgomeryDomainFieldElement is a field element NOT in the Montgomery domain.
28// Bounds: [[0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff]]
29pub const NonMontgomeryDomainFieldElement = [6]u64;
30
31/// The function addcarryxU64 is an addition with carry.
32///
33/// Postconditions:
34/// out1 = (arg1 + arg2 + arg3) mod 2^64
35/// out2 = ⌊(arg1 + arg2 + arg3) / 2^64⌋
36///
37/// Input Bounds:
38/// arg1: [0x0 ~> 0x1]
39/// arg2: [0x0 ~> 0xffffffffffffffff]
40/// arg3: [0x0 ~> 0xffffffffffffffff]
41/// Output Bounds:
42/// out1: [0x0 ~> 0xffffffffffffffff]
43/// out2: [0x0 ~> 0x1]
44inline fn addcarryxU64(out1: *u64, out2: *u1, arg1: u1, arg2: u64, arg3: u64) void {
45 @setRuntimeSafety(mode == .Debug);
46
47 var t: u64 = undefined;
48 const carry1 = @addWithOverflow(u64, arg2, arg3, &t);
49 const carry2 = @addWithOverflow(u64, t, arg1, out1);
50 out2.* = @boolToInt(carry1) | @boolToInt(carry2);
51}
52
53/// The function subborrowxU64 is a subtraction with borrow.
54///
55/// Postconditions:
56/// out1 = (-arg1 + arg2 + -arg3) mod 2^64
57/// out2 = -⌊(-arg1 + arg2 + -arg3) / 2^64⌋
58///
59/// Input Bounds:
60/// arg1: [0x0 ~> 0x1]
61/// arg2: [0x0 ~> 0xffffffffffffffff]
62/// arg3: [0x0 ~> 0xffffffffffffffff]
63/// Output Bounds:
64/// out1: [0x0 ~> 0xffffffffffffffff]
65/// out2: [0x0 ~> 0x1]
66inline fn subborrowxU64(out1: *u64, out2: *u1, arg1: u1, arg2: u64, arg3: u64) void {
67 @setRuntimeSafety(mode == .Debug);
68
69 var t: u64 = undefined;
70 const carry1 = @subWithOverflow(u64, arg2, arg3, &t);
71 const carry2 = @subWithOverflow(u64, t, arg1, out1);
72 out2.* = @boolToInt(carry1) | @boolToInt(carry2);
73}
74
75/// The function mulxU64 is a multiplication, returning the full double-width result.
76///
77/// Postconditions:
78/// out1 = (arg1 * arg2) mod 2^64
79/// out2 = ⌊arg1 * arg2 / 2^64⌋
80///
81/// Input Bounds:
82/// arg1: [0x0 ~> 0xffffffffffffffff]
83/// arg2: [0x0 ~> 0xffffffffffffffff]
84/// Output Bounds:
85/// out1: [0x0 ~> 0xffffffffffffffff]
86/// out2: [0x0 ~> 0xffffffffffffffff]
87inline fn mulxU64(out1: *u64, out2: *u64, arg1: u64, arg2: u64) void {
88 @setRuntimeSafety(mode == .Debug);
89
90 const x = @as(u128, arg1) * @as(u128, arg2);
91 out1.* = @truncate(u64, x);
92 out2.* = @truncate(u64, x >> 64);
93}
94
95/// The function cmovznzU64 is a single-word conditional move.
96///
97/// Postconditions:
98/// out1 = (if arg1 = 0 then arg2 else arg3)
99///
100/// Input Bounds:
101/// arg1: [0x0 ~> 0x1]
102/// arg2: [0x0 ~> 0xffffffffffffffff]
103/// arg3: [0x0 ~> 0xffffffffffffffff]
104/// Output Bounds:
105/// out1: [0x0 ~> 0xffffffffffffffff]
106inline fn cmovznzU64(out1: *u64, arg1: u1, arg2: u64, arg3: u64) void {
107 @setRuntimeSafety(mode == .Debug);
108
109 const mask = 0 -% @as(u64, arg1);
110 out1.* = (mask & arg3) | ((~mask) & arg2);
111}
112
113/// The function mul multiplies two field elements in the Montgomery domain.
114///
115/// Preconditions:
116/// 0 ≤ eval arg1 < m
117/// 0 ≤ eval arg2 < m
118/// Postconditions:
119/// eval (from_montgomery out1) mod m = (eval (from_montgomery arg1) * eval (from_montgomery arg2)) mod m
120/// 0 ≤ eval out1 < m
121///
122pub fn mul(out1: *MontgomeryDomainFieldElement, arg1: MontgomeryDomainFieldElement, arg2: MontgomeryDomainFieldElement) void {
123 @setRuntimeSafety(mode == .Debug);
124
125 const x1 = (arg1[1]);
126 const x2 = (arg1[2]);
127 const x3 = (arg1[3]);
128 const x4 = (arg1[4]);
129 const x5 = (arg1[5]);
130 const x6 = (arg1[0]);
131 var x7: u64 = undefined;
132 var x8: u64 = undefined;
133 mulxU64(&x7, &x8, x6, (arg2[5]));
134 var x9: u64 = undefined;
135 var x10: u64 = undefined;
136 mulxU64(&x9, &x10, x6, (arg2[4]));
137 var x11: u64 = undefined;
138 var x12: u64 = undefined;
139 mulxU64(&x11, &x12, x6, (arg2[3]));
140 var x13: u64 = undefined;
141 var x14: u64 = undefined;
142 mulxU64(&x13, &x14, x6, (arg2[2]));
143 var x15: u64 = undefined;
144 var x16: u64 = undefined;
145 mulxU64(&x15, &x16, x6, (arg2[1]));
146 var x17: u64 = undefined;
147 var x18: u64 = undefined;
148 mulxU64(&x17, &x18, x6, (arg2[0]));
149 var x19: u64 = undefined;
150 var x20: u1 = undefined;
151 addcarryxU64(&x19, &x20, 0x0, x18, x15);
152 var x21: u64 = undefined;
153 var x22: u1 = undefined;
154 addcarryxU64(&x21, &x22, x20, x16, x13);
155 var x23: u64 = undefined;
156 var x24: u1 = undefined;
157 addcarryxU64(&x23, &x24, x22, x14, x11);
158 var x25: u64 = undefined;
159 var x26: u1 = undefined;
160 addcarryxU64(&x25, &x26, x24, x12, x9);
161 var x27: u64 = undefined;
162 var x28: u1 = undefined;
163 addcarryxU64(&x27, &x28, x26, x10, x7);
164 const x29 = (@as(u64, x28) + x8);
165 var x30: u64 = undefined;
166 var x31: u64 = undefined;
167 mulxU64(&x30, &x31, x17, 0x100000001);
168 var x32: u64 = undefined;
169 var x33: u64 = undefined;
170 mulxU64(&x32, &x33, x30, 0xffffffffffffffff);
171 var x34: u64 = undefined;
172 var x35: u64 = undefined;
173 mulxU64(&x34, &x35, x30, 0xffffffffffffffff);
174 var x36: u64 = undefined;
175 var x37: u64 = undefined;
176 mulxU64(&x36, &x37, x30, 0xffffffffffffffff);
177 var x38: u64 = undefined;
178 var x39: u64 = undefined;
179 mulxU64(&x38, &x39, x30, 0xfffffffffffffffe);
180 var x40: u64 = undefined;
181 var x41: u64 = undefined;
182 mulxU64(&x40, &x41, x30, 0xffffffff00000000);
183 var x42: u64 = undefined;
184 var x43: u64 = undefined;
185 mulxU64(&x42, &x43, x30, 0xffffffff);
186 var x44: u64 = undefined;
187 var x45: u1 = undefined;
188 addcarryxU64(&x44, &x45, 0x0, x43, x40);
189 var x46: u64 = undefined;
190 var x47: u1 = undefined;
191 addcarryxU64(&x46, &x47, x45, x41, x38);
192 var x48: u64 = undefined;
193 var x49: u1 = undefined;
194 addcarryxU64(&x48, &x49, x47, x39, x36);
195 var x50: u64 = undefined;
196 var x51: u1 = undefined;
197 addcarryxU64(&x50, &x51, x49, x37, x34);
198 var x52: u64 = undefined;
199 var x53: u1 = undefined;
200 addcarryxU64(&x52, &x53, x51, x35, x32);
201 const x54 = (@as(u64, x53) + x33);
202 var x55: u64 = undefined;
203 var x56: u1 = undefined;
204 addcarryxU64(&x55, &x56, 0x0, x17, x42);
205 var x57: u64 = undefined;
206 var x58: u1 = undefined;
207 addcarryxU64(&x57, &x58, x56, x19, x44);
208 var x59: u64 = undefined;
209 var x60: u1 = undefined;
210 addcarryxU64(&x59, &x60, x58, x21, x46);
211 var x61: u64 = undefined;
212 var x62: u1 = undefined;
213 addcarryxU64(&x61, &x62, x60, x23, x48);
214 var x63: u64 = undefined;
215 var x64: u1 = undefined;
216 addcarryxU64(&x63, &x64, x62, x25, x50);
217 var x65: u64 = undefined;
218 var x66: u1 = undefined;
219 addcarryxU64(&x65, &x66, x64, x27, x52);
220 var x67: u64 = undefined;
221 var x68: u1 = undefined;
222 addcarryxU64(&x67, &x68, x66, x29, x54);
223 var x69: u64 = undefined;
224 var x70: u64 = undefined;
225 mulxU64(&x69, &x70, x1, (arg2[5]));
226 var x71: u64 = undefined;
227 var x72: u64 = undefined;
228 mulxU64(&x71, &x72, x1, (arg2[4]));
229 var x73: u64 = undefined;
230 var x74: u64 = undefined;
231 mulxU64(&x73, &x74, x1, (arg2[3]));
232 var x75: u64 = undefined;
233 var x76: u64 = undefined;
234 mulxU64(&x75, &x76, x1, (arg2[2]));
235 var x77: u64 = undefined;
236 var x78: u64 = undefined;
237 mulxU64(&x77, &x78, x1, (arg2[1]));
238 var x79: u64 = undefined;
239 var x80: u64 = undefined;
240 mulxU64(&x79, &x80, x1, (arg2[0]));
241 var x81: u64 = undefined;
242 var x82: u1 = undefined;
243 addcarryxU64(&x81, &x82, 0x0, x80, x77);
244 var x83: u64 = undefined;
245 var x84: u1 = undefined;
246 addcarryxU64(&x83, &x84, x82, x78, x75);
247 var x85: u64 = undefined;
248 var x86: u1 = undefined;
249 addcarryxU64(&x85, &x86, x84, x76, x73);
250 var x87: u64 = undefined;
251 var x88: u1 = undefined;
252 addcarryxU64(&x87, &x88, x86, x74, x71);
253 var x89: u64 = undefined;
254 var x90: u1 = undefined;
255 addcarryxU64(&x89, &x90, x88, x72, x69);
256 const x91 = (@as(u64, x90) + x70);
257 var x92: u64 = undefined;
258 var x93: u1 = undefined;
259 addcarryxU64(&x92, &x93, 0x0, x57, x79);
260 var x94: u64 = undefined;
261 var x95: u1 = undefined;
262 addcarryxU64(&x94, &x95, x93, x59, x81);
263 var x96: u64 = undefined;
264 var x97: u1 = undefined;
265 addcarryxU64(&x96, &x97, x95, x61, x83);
266 var x98: u64 = undefined;
267 var x99: u1 = undefined;
268 addcarryxU64(&x98, &x99, x97, x63, x85);
269 var x100: u64 = undefined;
270 var x101: u1 = undefined;
271 addcarryxU64(&x100, &x101, x99, x65, x87);
272 var x102: u64 = undefined;
273 var x103: u1 = undefined;
274 addcarryxU64(&x102, &x103, x101, x67, x89);
275 var x104: u64 = undefined;
276 var x105: u1 = undefined;
277 addcarryxU64(&x104, &x105, x103, @as(u64, x68), x91);
278 var x106: u64 = undefined;
279 var x107: u64 = undefined;
280 mulxU64(&x106, &x107, x92, 0x100000001);
281 var x108: u64 = undefined;
282 var x109: u64 = undefined;
283 mulxU64(&x108, &x109, x106, 0xffffffffffffffff);
284 var x110: u64 = undefined;
285 var x111: u64 = undefined;
286 mulxU64(&x110, &x111, x106, 0xffffffffffffffff);
287 var x112: u64 = undefined;
288 var x113: u64 = undefined;
289 mulxU64(&x112, &x113, x106, 0xffffffffffffffff);
290 var x114: u64 = undefined;
291 var x115: u64 = undefined;
292 mulxU64(&x114, &x115, x106, 0xfffffffffffffffe);
293 var x116: u64 = undefined;
294 var x117: u64 = undefined;
295 mulxU64(&x116, &x117, x106, 0xffffffff00000000);
296 var x118: u64 = undefined;
297 var x119: u64 = undefined;
298 mulxU64(&x118, &x119, x106, 0xffffffff);
299 var x120: u64 = undefined;
300 var x121: u1 = undefined;
301 addcarryxU64(&x120, &x121, 0x0, x119, x116);
302 var x122: u64 = undefined;
303 var x123: u1 = undefined;
304 addcarryxU64(&x122, &x123, x121, x117, x114);
305 var x124: u64 = undefined;
306 var x125: u1 = undefined;
307 addcarryxU64(&x124, &x125, x123, x115, x112);
308 var x126: u64 = undefined;
309 var x127: u1 = undefined;
310 addcarryxU64(&x126, &x127, x125, x113, x110);
311 var x128: u64 = undefined;
312 var x129: u1 = undefined;
313 addcarryxU64(&x128, &x129, x127, x111, x108);
314 const x130 = (@as(u64, x129) + x109);
315 var x131: u64 = undefined;
316 var x132: u1 = undefined;
317 addcarryxU64(&x131, &x132, 0x0, x92, x118);
318 var x133: u64 = undefined;
319 var x134: u1 = undefined;
320 addcarryxU64(&x133, &x134, x132, x94, x120);
321 var x135: u64 = undefined;
322 var x136: u1 = undefined;
323 addcarryxU64(&x135, &x136, x134, x96, x122);
324 var x137: u64 = undefined;
325 var x138: u1 = undefined;
326 addcarryxU64(&x137, &x138, x136, x98, x124);
327 var x139: u64 = undefined;
328 var x140: u1 = undefined;
329 addcarryxU64(&x139, &x140, x138, x100, x126);
330 var x141: u64 = undefined;
331 var x142: u1 = undefined;
332 addcarryxU64(&x141, &x142, x140, x102, x128);
333 var x143: u64 = undefined;
334 var x144: u1 = undefined;
335 addcarryxU64(&x143, &x144, x142, x104, x130);
336 const x145 = (@as(u64, x144) + @as(u64, x105));
337 var x146: u64 = undefined;
338 var x147: u64 = undefined;
339 mulxU64(&x146, &x147, x2, (arg2[5]));
340 var x148: u64 = undefined;
341 var x149: u64 = undefined;
342 mulxU64(&x148, &x149, x2, (arg2[4]));
343 var x150: u64 = undefined;
344 var x151: u64 = undefined;
345 mulxU64(&x150, &x151, x2, (arg2[3]));
346 var x152: u64 = undefined;
347 var x153: u64 = undefined;
348 mulxU64(&x152, &x153, x2, (arg2[2]));
349 var x154: u64 = undefined;
350 var x155: u64 = undefined;
351 mulxU64(&x154, &x155, x2, (arg2[1]));
352 var x156: u64 = undefined;
353 var x157: u64 = undefined;
354 mulxU64(&x156, &x157, x2, (arg2[0]));
355 var x158: u64 = undefined;
356 var x159: u1 = undefined;
357 addcarryxU64(&x158, &x159, 0x0, x157, x154);
358 var x160: u64 = undefined;
359 var x161: u1 = undefined;
360 addcarryxU64(&x160, &x161, x159, x155, x152);
361 var x162: u64 = undefined;
362 var x163: u1 = undefined;
363 addcarryxU64(&x162, &x163, x161, x153, x150);
364 var x164: u64 = undefined;
365 var x165: u1 = undefined;
366 addcarryxU64(&x164, &x165, x163, x151, x148);
367 var x166: u64 = undefined;
368 var x167: u1 = undefined;
369 addcarryxU64(&x166, &x167, x165, x149, x146);
370 const x168 = (@as(u64, x167) + x147);
371 var x169: u64 = undefined;
372 var x170: u1 = undefined;
373 addcarryxU64(&x169, &x170, 0x0, x133, x156);
374 var x171: u64 = undefined;
375 var x172: u1 = undefined;
376 addcarryxU64(&x171, &x172, x170, x135, x158);
377 var x173: u64 = undefined;
378 var x174: u1 = undefined;
379 addcarryxU64(&x173, &x174, x172, x137, x160);
380 var x175: u64 = undefined;
381 var x176: u1 = undefined;
382 addcarryxU64(&x175, &x176, x174, x139, x162);
383 var x177: u64 = undefined;
384 var x178: u1 = undefined;
385 addcarryxU64(&x177, &x178, x176, x141, x164);
386 var x179: u64 = undefined;
387 var x180: u1 = undefined;
388 addcarryxU64(&x179, &x180, x178, x143, x166);
389 var x181: u64 = undefined;
390 var x182: u1 = undefined;
391 addcarryxU64(&x181, &x182, x180, x145, x168);
392 var x183: u64 = undefined;
393 var x184: u64 = undefined;
394 mulxU64(&x183, &x184, x169, 0x100000001);
395 var x185: u64 = undefined;
396 var x186: u64 = undefined;
397 mulxU64(&x185, &x186, x183, 0xffffffffffffffff);
398 var x187: u64 = undefined;
399 var x188: u64 = undefined;
400 mulxU64(&x187, &x188, x183, 0xffffffffffffffff);
401 var x189: u64 = undefined;
402 var x190: u64 = undefined;
403 mulxU64(&x189, &x190, x183, 0xffffffffffffffff);
404 var x191: u64 = undefined;
405 var x192: u64 = undefined;
406 mulxU64(&x191, &x192, x183, 0xfffffffffffffffe);
407 var x193: u64 = undefined;
408 var x194: u64 = undefined;
409 mulxU64(&x193, &x194, x183, 0xffffffff00000000);
410 var x195: u64 = undefined;
411 var x196: u64 = undefined;
412 mulxU64(&x195, &x196, x183, 0xffffffff);
413 var x197: u64 = undefined;
414 var x198: u1 = undefined;
415 addcarryxU64(&x197, &x198, 0x0, x196, x193);
416 var x199: u64 = undefined;
417 var x200: u1 = undefined;
418 addcarryxU64(&x199, &x200, x198, x194, x191);
419 var x201: u64 = undefined;
420 var x202: u1 = undefined;
421 addcarryxU64(&x201, &x202, x200, x192, x189);
422 var x203: u64 = undefined;
423 var x204: u1 = undefined;
424 addcarryxU64(&x203, &x204, x202, x190, x187);
425 var x205: u64 = undefined;
426 var x206: u1 = undefined;
427 addcarryxU64(&x205, &x206, x204, x188, x185);
428 const x207 = (@as(u64, x206) + x186);
429 var x208: u64 = undefined;
430 var x209: u1 = undefined;
431 addcarryxU64(&x208, &x209, 0x0, x169, x195);
432 var x210: u64 = undefined;
433 var x211: u1 = undefined;
434 addcarryxU64(&x210, &x211, x209, x171, x197);
435 var x212: u64 = undefined;
436 var x213: u1 = undefined;
437 addcarryxU64(&x212, &x213, x211, x173, x199);
438 var x214: u64 = undefined;
439 var x215: u1 = undefined;
440 addcarryxU64(&x214, &x215, x213, x175, x201);
441 var x216: u64 = undefined;
442 var x217: u1 = undefined;
443 addcarryxU64(&x216, &x217, x215, x177, x203);
444 var x218: u64 = undefined;
445 var x219: u1 = undefined;
446 addcarryxU64(&x218, &x219, x217, x179, x205);
447 var x220: u64 = undefined;
448 var x221: u1 = undefined;
449 addcarryxU64(&x220, &x221, x219, x181, x207);
450 const x222 = (@as(u64, x221) + @as(u64, x182));
451 var x223: u64 = undefined;
452 var x224: u64 = undefined;
453 mulxU64(&x223, &x224, x3, (arg2[5]));
454 var x225: u64 = undefined;
455 var x226: u64 = undefined;
456 mulxU64(&x225, &x226, x3, (arg2[4]));
457 var x227: u64 = undefined;
458 var x228: u64 = undefined;
459 mulxU64(&x227, &x228, x3, (arg2[3]));
460 var x229: u64 = undefined;
461 var x230: u64 = undefined;
462 mulxU64(&x229, &x230, x3, (arg2[2]));
463 var x231: u64 = undefined;
464 var x232: u64 = undefined;
465 mulxU64(&x231, &x232, x3, (arg2[1]));
466 var x233: u64 = undefined;
467 var x234: u64 = undefined;
468 mulxU64(&x233, &x234, x3, (arg2[0]));
469 var x235: u64 = undefined;
470 var x236: u1 = undefined;
471 addcarryxU64(&x235, &x236, 0x0, x234, x231);
472 var x237: u64 = undefined;
473 var x238: u1 = undefined;
474 addcarryxU64(&x237, &x238, x236, x232, x229);
475 var x239: u64 = undefined;
476 var x240: u1 = undefined;
477 addcarryxU64(&x239, &x240, x238, x230, x227);
478 var x241: u64 = undefined;
479 var x242: u1 = undefined;
480 addcarryxU64(&x241, &x242, x240, x228, x225);
481 var x243: u64 = undefined;
482 var x244: u1 = undefined;
483 addcarryxU64(&x243, &x244, x242, x226, x223);
484 const x245 = (@as(u64, x244) + x224);
485 var x246: u64 = undefined;
486 var x247: u1 = undefined;
487 addcarryxU64(&x246, &x247, 0x0, x210, x233);
488 var x248: u64 = undefined;
489 var x249: u1 = undefined;
490 addcarryxU64(&x248, &x249, x247, x212, x235);
491 var x250: u64 = undefined;
492 var x251: u1 = undefined;
493 addcarryxU64(&x250, &x251, x249, x214, x237);
494 var x252: u64 = undefined;
495 var x253: u1 = undefined;
496 addcarryxU64(&x252, &x253, x251, x216, x239);
497 var x254: u64 = undefined;
498 var x255: u1 = undefined;
499 addcarryxU64(&x254, &x255, x253, x218, x241);
500 var x256: u64 = undefined;
501 var x257: u1 = undefined;
502 addcarryxU64(&x256, &x257, x255, x220, x243);
503 var x258: u64 = undefined;
504 var x259: u1 = undefined;
505 addcarryxU64(&x258, &x259, x257, x222, x245);
506 var x260: u64 = undefined;
507 var x261: u64 = undefined;
508 mulxU64(&x260, &x261, x246, 0x100000001);
509 var x262: u64 = undefined;
510 var x263: u64 = undefined;
511 mulxU64(&x262, &x263, x260, 0xffffffffffffffff);
512 var x264: u64 = undefined;
513 var x265: u64 = undefined;
514 mulxU64(&x264, &x265, x260, 0xffffffffffffffff);
515 var x266: u64 = undefined;
516 var x267: u64 = undefined;
517 mulxU64(&x266, &x267, x260, 0xffffffffffffffff);
518 var x268: u64 = undefined;
519 var x269: u64 = undefined;
520 mulxU64(&x268, &x269, x260, 0xfffffffffffffffe);
521 var x270: u64 = undefined;
522 var x271: u64 = undefined;
523 mulxU64(&x270, &x271, x260, 0xffffffff00000000);
524 var x272: u64 = undefined;
525 var x273: u64 = undefined;
526 mulxU64(&x272, &x273, x260, 0xffffffff);
527 var x274: u64 = undefined;
528 var x275: u1 = undefined;
529 addcarryxU64(&x274, &x275, 0x0, x273, x270);
530 var x276: u64 = undefined;
531 var x277: u1 = undefined;
532 addcarryxU64(&x276, &x277, x275, x271, x268);
533 var x278: u64 = undefined;
534 var x279: u1 = undefined;
535 addcarryxU64(&x278, &x279, x277, x269, x266);
536 var x280: u64 = undefined;
537 var x281: u1 = undefined;
538 addcarryxU64(&x280, &x281, x279, x267, x264);
539 var x282: u64 = undefined;
540 var x283: u1 = undefined;
541 addcarryxU64(&x282, &x283, x281, x265, x262);
542 const x284 = (@as(u64, x283) + x263);
543 var x285: u64 = undefined;
544 var x286: u1 = undefined;
545 addcarryxU64(&x285, &x286, 0x0, x246, x272);
546 var x287: u64 = undefined;
547 var x288: u1 = undefined;
548 addcarryxU64(&x287, &x288, x286, x248, x274);
549 var x289: u64 = undefined;
550 var x290: u1 = undefined;
551 addcarryxU64(&x289, &x290, x288, x250, x276);
552 var x291: u64 = undefined;
553 var x292: u1 = undefined;
554 addcarryxU64(&x291, &x292, x290, x252, x278);
555 var x293: u64 = undefined;
556 var x294: u1 = undefined;
557 addcarryxU64(&x293, &x294, x292, x254, x280);
558 var x295: u64 = undefined;
559 var x296: u1 = undefined;
560 addcarryxU64(&x295, &x296, x294, x256, x282);
561 var x297: u64 = undefined;
562 var x298: u1 = undefined;
563 addcarryxU64(&x297, &x298, x296, x258, x284);
564 const x299 = (@as(u64, x298) + @as(u64, x259));
565 var x300: u64 = undefined;
566 var x301: u64 = undefined;
567 mulxU64(&x300, &x301, x4, (arg2[5]));
568 var x302: u64 = undefined;
569 var x303: u64 = undefined;
570 mulxU64(&x302, &x303, x4, (arg2[4]));
571 var x304: u64 = undefined;
572 var x305: u64 = undefined;
573 mulxU64(&x304, &x305, x4, (arg2[3]));
574 var x306: u64 = undefined;
575 var x307: u64 = undefined;
576 mulxU64(&x306, &x307, x4, (arg2[2]));
577 var x308: u64 = undefined;
578 var x309: u64 = undefined;
579 mulxU64(&x308, &x309, x4, (arg2[1]));
580 var x310: u64 = undefined;
581 var x311: u64 = undefined;
582 mulxU64(&x310, &x311, x4, (arg2[0]));
583 var x312: u64 = undefined;
584 var x313: u1 = undefined;
585 addcarryxU64(&x312, &x313, 0x0, x311, x308);
586 var x314: u64 = undefined;
587 var x315: u1 = undefined;
588 addcarryxU64(&x314, &x315, x313, x309, x306);
589 var x316: u64 = undefined;
590 var x317: u1 = undefined;
591 addcarryxU64(&x316, &x317, x315, x307, x304);
592 var x318: u64 = undefined;
593 var x319: u1 = undefined;
594 addcarryxU64(&x318, &x319, x317, x305, x302);
595 var x320: u64 = undefined;
596 var x321: u1 = undefined;
597 addcarryxU64(&x320, &x321, x319, x303, x300);
598 const x322 = (@as(u64, x321) + x301);
599 var x323: u64 = undefined;
600 var x324: u1 = undefined;
601 addcarryxU64(&x323, &x324, 0x0, x287, x310);
602 var x325: u64 = undefined;
603 var x326: u1 = undefined;
604 addcarryxU64(&x325, &x326, x324, x289, x312);
605 var x327: u64 = undefined;
606 var x328: u1 = undefined;
607 addcarryxU64(&x327, &x328, x326, x291, x314);
608 var x329: u64 = undefined;
609 var x330: u1 = undefined;
610 addcarryxU64(&x329, &x330, x328, x293, x316);
611 var x331: u64 = undefined;
612 var x332: u1 = undefined;
613 addcarryxU64(&x331, &x332, x330, x295, x318);
614 var x333: u64 = undefined;
615 var x334: u1 = undefined;
616 addcarryxU64(&x333, &x334, x332, x297, x320);
617 var x335: u64 = undefined;
618 var x336: u1 = undefined;
619 addcarryxU64(&x335, &x336, x334, x299, x322);
620 var x337: u64 = undefined;
621 var x338: u64 = undefined;
622 mulxU64(&x337, &x338, x323, 0x100000001);
623 var x339: u64 = undefined;
624 var x340: u64 = undefined;
625 mulxU64(&x339, &x340, x337, 0xffffffffffffffff);
626 var x341: u64 = undefined;
627 var x342: u64 = undefined;
628 mulxU64(&x341, &x342, x337, 0xffffffffffffffff);
629 var x343: u64 = undefined;
630 var x344: u64 = undefined;
631 mulxU64(&x343, &x344, x337, 0xffffffffffffffff);
632 var x345: u64 = undefined;
633 var x346: u64 = undefined;
634 mulxU64(&x345, &x346, x337, 0xfffffffffffffffe);
635 var x347: u64 = undefined;
636 var x348: u64 = undefined;
637 mulxU64(&x347, &x348, x337, 0xffffffff00000000);
638 var x349: u64 = undefined;
639 var x350: u64 = undefined;
640 mulxU64(&x349, &x350, x337, 0xffffffff);
641 var x351: u64 = undefined;
642 var x352: u1 = undefined;
643 addcarryxU64(&x351, &x352, 0x0, x350, x347);
644 var x353: u64 = undefined;
645 var x354: u1 = undefined;
646 addcarryxU64(&x353, &x354, x352, x348, x345);
647 var x355: u64 = undefined;
648 var x356: u1 = undefined;
649 addcarryxU64(&x355, &x356, x354, x346, x343);
650 var x357: u64 = undefined;
651 var x358: u1 = undefined;
652 addcarryxU64(&x357, &x358, x356, x344, x341);
653 var x359: u64 = undefined;
654 var x360: u1 = undefined;
655 addcarryxU64(&x359, &x360, x358, x342, x339);
656 const x361 = (@as(u64, x360) + x340);
657 var x362: u64 = undefined;
658 var x363: u1 = undefined;
659 addcarryxU64(&x362, &x363, 0x0, x323, x349);
660 var x364: u64 = undefined;
661 var x365: u1 = undefined;
662 addcarryxU64(&x364, &x365, x363, x325, x351);
663 var x366: u64 = undefined;
664 var x367: u1 = undefined;
665 addcarryxU64(&x366, &x367, x365, x327, x353);
666 var x368: u64 = undefined;
667 var x369: u1 = undefined;
668 addcarryxU64(&x368, &x369, x367, x329, x355);
669 var x370: u64 = undefined;
670 var x371: u1 = undefined;
671 addcarryxU64(&x370, &x371, x369, x331, x357);
672 var x372: u64 = undefined;
673 var x373: u1 = undefined;
674 addcarryxU64(&x372, &x373, x371, x333, x359);
675 var x374: u64 = undefined;
676 var x375: u1 = undefined;
677 addcarryxU64(&x374, &x375, x373, x335, x361);
678 const x376 = (@as(u64, x375) + @as(u64, x336));
679 var x377: u64 = undefined;
680 var x378: u64 = undefined;
681 mulxU64(&x377, &x378, x5, (arg2[5]));
682 var x379: u64 = undefined;
683 var x380: u64 = undefined;
684 mulxU64(&x379, &x380, x5, (arg2[4]));
685 var x381: u64 = undefined;
686 var x382: u64 = undefined;
687 mulxU64(&x381, &x382, x5, (arg2[3]));
688 var x383: u64 = undefined;
689 var x384: u64 = undefined;
690 mulxU64(&x383, &x384, x5, (arg2[2]));
691 var x385: u64 = undefined;
692 var x386: u64 = undefined;
693 mulxU64(&x385, &x386, x5, (arg2[1]));
694 var x387: u64 = undefined;
695 var x388: u64 = undefined;
696 mulxU64(&x387, &x388, x5, (arg2[0]));
697 var x389: u64 = undefined;
698 var x390: u1 = undefined;
699 addcarryxU64(&x389, &x390, 0x0, x388, x385);
700 var x391: u64 = undefined;
701 var x392: u1 = undefined;
702 addcarryxU64(&x391, &x392, x390, x386, x383);
703 var x393: u64 = undefined;
704 var x394: u1 = undefined;
705 addcarryxU64(&x393, &x394, x392, x384, x381);
706 var x395: u64 = undefined;
707 var x396: u1 = undefined;
708 addcarryxU64(&x395, &x396, x394, x382, x379);
709 var x397: u64 = undefined;
710 var x398: u1 = undefined;
711 addcarryxU64(&x397, &x398, x396, x380, x377);
712 const x399 = (@as(u64, x398) + x378);
713 var x400: u64 = undefined;
714 var x401: u1 = undefined;
715 addcarryxU64(&x400, &x401, 0x0, x364, x387);
716 var x402: u64 = undefined;
717 var x403: u1 = undefined;
718 addcarryxU64(&x402, &x403, x401, x366, x389);
719 var x404: u64 = undefined;
720 var x405: u1 = undefined;
721 addcarryxU64(&x404, &x405, x403, x368, x391);
722 var x406: u64 = undefined;
723 var x407: u1 = undefined;
724 addcarryxU64(&x406, &x407, x405, x370, x393);
725 var x408: u64 = undefined;
726 var x409: u1 = undefined;
727 addcarryxU64(&x408, &x409, x407, x372, x395);
728 var x410: u64 = undefined;
729 var x411: u1 = undefined;
730 addcarryxU64(&x410, &x411, x409, x374, x397);
731 var x412: u64 = undefined;
732 var x413: u1 = undefined;
733 addcarryxU64(&x412, &x413, x411, x376, x399);
734 var x414: u64 = undefined;
735 var x415: u64 = undefined;
736 mulxU64(&x414, &x415, x400, 0x100000001);
737 var x416: u64 = undefined;
738 var x417: u64 = undefined;
739 mulxU64(&x416, &x417, x414, 0xffffffffffffffff);
740 var x418: u64 = undefined;
741 var x419: u64 = undefined;
742 mulxU64(&x418, &x419, x414, 0xffffffffffffffff);
743 var x420: u64 = undefined;
744 var x421: u64 = undefined;
745 mulxU64(&x420, &x421, x414, 0xffffffffffffffff);
746 var x422: u64 = undefined;
747 var x423: u64 = undefined;
748 mulxU64(&x422, &x423, x414, 0xfffffffffffffffe);
749 var x424: u64 = undefined;
750 var x425: u64 = undefined;
751 mulxU64(&x424, &x425, x414, 0xffffffff00000000);
752 var x426: u64 = undefined;
753 var x427: u64 = undefined;
754 mulxU64(&x426, &x427, x414, 0xffffffff);
755 var x428: u64 = undefined;
756 var x429: u1 = undefined;
757 addcarryxU64(&x428, &x429, 0x0, x427, x424);
758 var x430: u64 = undefined;
759 var x431: u1 = undefined;
760 addcarryxU64(&x430, &x431, x429, x425, x422);
761 var x432: u64 = undefined;
762 var x433: u1 = undefined;
763 addcarryxU64(&x432, &x433, x431, x423, x420);
764 var x434: u64 = undefined;
765 var x435: u1 = undefined;
766 addcarryxU64(&x434, &x435, x433, x421, x418);
767 var x436: u64 = undefined;
768 var x437: u1 = undefined;
769 addcarryxU64(&x436, &x437, x435, x419, x416);
770 const x438 = (@as(u64, x437) + x417);
771 var x439: u64 = undefined;
772 var x440: u1 = undefined;
773 addcarryxU64(&x439, &x440, 0x0, x400, x426);
774 var x441: u64 = undefined;
775 var x442: u1 = undefined;
776 addcarryxU64(&x441, &x442, x440, x402, x428);
777 var x443: u64 = undefined;
778 var x444: u1 = undefined;
779 addcarryxU64(&x443, &x444, x442, x404, x430);
780 var x445: u64 = undefined;
781 var x446: u1 = undefined;
782 addcarryxU64(&x445, &x446, x444, x406, x432);
783 var x447: u64 = undefined;
784 var x448: u1 = undefined;
785 addcarryxU64(&x447, &x448, x446, x408, x434);
786 var x449: u64 = undefined;
787 var x450: u1 = undefined;
788 addcarryxU64(&x449, &x450, x448, x410, x436);
789 var x451: u64 = undefined;
790 var x452: u1 = undefined;
791 addcarryxU64(&x451, &x452, x450, x412, x438);
792 const x453 = (@as(u64, x452) + @as(u64, x413));
793 var x454: u64 = undefined;
794 var x455: u1 = undefined;
795 subborrowxU64(&x454, &x455, 0x0, x441, 0xffffffff);
796 var x456: u64 = undefined;
797 var x457: u1 = undefined;
798 subborrowxU64(&x456, &x457, x455, x443, 0xffffffff00000000);
799 var x458: u64 = undefined;
800 var x459: u1 = undefined;
801 subborrowxU64(&x458, &x459, x457, x445, 0xfffffffffffffffe);
802 var x460: u64 = undefined;
803 var x461: u1 = undefined;
804 subborrowxU64(&x460, &x461, x459, x447, 0xffffffffffffffff);
805 var x462: u64 = undefined;
806 var x463: u1 = undefined;
807 subborrowxU64(&x462, &x463, x461, x449, 0xffffffffffffffff);
808 var x464: u64 = undefined;
809 var x465: u1 = undefined;
810 subborrowxU64(&x464, &x465, x463, x451, 0xffffffffffffffff);
811 var x466: u64 = undefined;
812 var x467: u1 = undefined;
813 subborrowxU64(&x466, &x467, x465, x453, 0x0);
814 var x468: u64 = undefined;
815 cmovznzU64(&x468, x467, x454, x441);
816 var x469: u64 = undefined;
817 cmovznzU64(&x469, x467, x456, x443);
818 var x470: u64 = undefined;
819 cmovznzU64(&x470, x467, x458, x445);
820 var x471: u64 = undefined;
821 cmovznzU64(&x471, x467, x460, x447);
822 var x472: u64 = undefined;
823 cmovznzU64(&x472, x467, x462, x449);
824 var x473: u64 = undefined;
825 cmovznzU64(&x473, x467, x464, x451);
826 out1[0] = x468;
827 out1[1] = x469;
828 out1[2] = x470;
829 out1[3] = x471;
830 out1[4] = x472;
831 out1[5] = x473;
832}
833
834/// The function square squares a field element in the Montgomery domain.
835///
836/// Preconditions:
837/// 0 ≤ eval arg1 < m
838/// Postconditions:
839/// eval (from_montgomery out1) mod m = (eval (from_montgomery arg1) * eval (from_montgomery arg1)) mod m
840/// 0 ≤ eval out1 < m
841///
842pub fn square(out1: *MontgomeryDomainFieldElement, arg1: MontgomeryDomainFieldElement) void {
843 @setRuntimeSafety(mode == .Debug);
844
845 const x1 = (arg1[1]);
846 const x2 = (arg1[2]);
847 const x3 = (arg1[3]);
848 const x4 = (arg1[4]);
849 const x5 = (arg1[5]);
850 const x6 = (arg1[0]);
851 var x7: u64 = undefined;
852 var x8: u64 = undefined;
853 mulxU64(&x7, &x8, x6, (arg1[5]));
854 var x9: u64 = undefined;
855 var x10: u64 = undefined;
856 mulxU64(&x9, &x10, x6, (arg1[4]));
857 var x11: u64 = undefined;
858 var x12: u64 = undefined;
859 mulxU64(&x11, &x12, x6, (arg1[3]));
860 var x13: u64 = undefined;
861 var x14: u64 = undefined;
862 mulxU64(&x13, &x14, x6, (arg1[2]));
863 var x15: u64 = undefined;
864 var x16: u64 = undefined;
865 mulxU64(&x15, &x16, x6, (arg1[1]));
866 var x17: u64 = undefined;
867 var x18: u64 = undefined;
868 mulxU64(&x17, &x18, x6, (arg1[0]));
869 var x19: u64 = undefined;
870 var x20: u1 = undefined;
871 addcarryxU64(&x19, &x20, 0x0, x18, x15);
872 var x21: u64 = undefined;
873 var x22: u1 = undefined;
874 addcarryxU64(&x21, &x22, x20, x16, x13);
875 var x23: u64 = undefined;
876 var x24: u1 = undefined;
877 addcarryxU64(&x23, &x24, x22, x14, x11);
878 var x25: u64 = undefined;
879 var x26: u1 = undefined;
880 addcarryxU64(&x25, &x26, x24, x12, x9);
881 var x27: u64 = undefined;
882 var x28: u1 = undefined;
883 addcarryxU64(&x27, &x28, x26, x10, x7);
884 const x29 = (@as(u64, x28) + x8);
885 var x30: u64 = undefined;
886 var x31: u64 = undefined;
887 mulxU64(&x30, &x31, x17, 0x100000001);
888 var x32: u64 = undefined;
889 var x33: u64 = undefined;
890 mulxU64(&x32, &x33, x30, 0xffffffffffffffff);
891 var x34: u64 = undefined;
892 var x35: u64 = undefined;
893 mulxU64(&x34, &x35, x30, 0xffffffffffffffff);
894 var x36: u64 = undefined;
895 var x37: u64 = undefined;
896 mulxU64(&x36, &x37, x30, 0xffffffffffffffff);
897 var x38: u64 = undefined;
898 var x39: u64 = undefined;
899 mulxU64(&x38, &x39, x30, 0xfffffffffffffffe);
900 var x40: u64 = undefined;
901 var x41: u64 = undefined;
902 mulxU64(&x40, &x41, x30, 0xffffffff00000000);
903 var x42: u64 = undefined;
904 var x43: u64 = undefined;
905 mulxU64(&x42, &x43, x30, 0xffffffff);
906 var x44: u64 = undefined;
907 var x45: u1 = undefined;
908 addcarryxU64(&x44, &x45, 0x0, x43, x40);
909 var x46: u64 = undefined;
910 var x47: u1 = undefined;
911 addcarryxU64(&x46, &x47, x45, x41, x38);
912 var x48: u64 = undefined;
913 var x49: u1 = undefined;
914 addcarryxU64(&x48, &x49, x47, x39, x36);
915 var x50: u64 = undefined;
916 var x51: u1 = undefined;
917 addcarryxU64(&x50, &x51, x49, x37, x34);
918 var x52: u64 = undefined;
919 var x53: u1 = undefined;
920 addcarryxU64(&x52, &x53, x51, x35, x32);
921 const x54 = (@as(u64, x53) + x33);
922 var x55: u64 = undefined;
923 var x56: u1 = undefined;
924 addcarryxU64(&x55, &x56, 0x0, x17, x42);
925 var x57: u64 = undefined;
926 var x58: u1 = undefined;
927 addcarryxU64(&x57, &x58, x56, x19, x44);
928 var x59: u64 = undefined;
929 var x60: u1 = undefined;
930 addcarryxU64(&x59, &x60, x58, x21, x46);
931 var x61: u64 = undefined;
932 var x62: u1 = undefined;
933 addcarryxU64(&x61, &x62, x60, x23, x48);
934 var x63: u64 = undefined;
935 var x64: u1 = undefined;
936 addcarryxU64(&x63, &x64, x62, x25, x50);
937 var x65: u64 = undefined;
938 var x66: u1 = undefined;
939 addcarryxU64(&x65, &x66, x64, x27, x52);
940 var x67: u64 = undefined;
941 var x68: u1 = undefined;
942 addcarryxU64(&x67, &x68, x66, x29, x54);
943 var x69: u64 = undefined;
944 var x70: u64 = undefined;
945 mulxU64(&x69, &x70, x1, (arg1[5]));
946 var x71: u64 = undefined;
947 var x72: u64 = undefined;
948 mulxU64(&x71, &x72, x1, (arg1[4]));
949 var x73: u64 = undefined;
950 var x74: u64 = undefined;
951 mulxU64(&x73, &x74, x1, (arg1[3]));
952 var x75: u64 = undefined;
953 var x76: u64 = undefined;
954 mulxU64(&x75, &x76, x1, (arg1[2]));
955 var x77: u64 = undefined;
956 var x78: u64 = undefined;
957 mulxU64(&x77, &x78, x1, (arg1[1]));
958 var x79: u64 = undefined;
959 var x80: u64 = undefined;
960 mulxU64(&x79, &x80, x1, (arg1[0]));
961 var x81: u64 = undefined;
962 var x82: u1 = undefined;
963 addcarryxU64(&x81, &x82, 0x0, x80, x77);
964 var x83: u64 = undefined;
965 var x84: u1 = undefined;
966 addcarryxU64(&x83, &x84, x82, x78, x75);
967 var x85: u64 = undefined;
968 var x86: u1 = undefined;
969 addcarryxU64(&x85, &x86, x84, x76, x73);
970 var x87: u64 = undefined;
971 var x88: u1 = undefined;
972 addcarryxU64(&x87, &x88, x86, x74, x71);
973 var x89: u64 = undefined;
974 var x90: u1 = undefined;
975 addcarryxU64(&x89, &x90, x88, x72, x69);
976 const x91 = (@as(u64, x90) + x70);
977 var x92: u64 = undefined;
978 var x93: u1 = undefined;
979 addcarryxU64(&x92, &x93, 0x0, x57, x79);
980 var x94: u64 = undefined;
981 var x95: u1 = undefined;
982 addcarryxU64(&x94, &x95, x93, x59, x81);
983 var x96: u64 = undefined;
984 var x97: u1 = undefined;
985 addcarryxU64(&x96, &x97, x95, x61, x83);
986 var x98: u64 = undefined;
987 var x99: u1 = undefined;
988 addcarryxU64(&x98, &x99, x97, x63, x85);
989 var x100: u64 = undefined;
990 var x101: u1 = undefined;
991 addcarryxU64(&x100, &x101, x99, x65, x87);
992 var x102: u64 = undefined;
993 var x103: u1 = undefined;
994 addcarryxU64(&x102, &x103, x101, x67, x89);
995 var x104: u64 = undefined;
996 var x105: u1 = undefined;
997 addcarryxU64(&x104, &x105, x103, @as(u64, x68), x91);
998 var x106: u64 = undefined;
999 var x107: u64 = undefined;
1000 mulxU64(&x106, &x107, x92, 0x100000001);
1001 var x108: u64 = undefined;
1002 var x109: u64 = undefined;
1003 mulxU64(&x108, &x109, x106, 0xffffffffffffffff);
1004 var x110: u64 = undefined;
1005 var x111: u64 = undefined;
1006 mulxU64(&x110, &x111, x106, 0xffffffffffffffff);
1007 var x112: u64 = undefined;
1008 var x113: u64 = undefined;
1009 mulxU64(&x112, &x113, x106, 0xffffffffffffffff);
1010 var x114: u64 = undefined;
1011 var x115: u64 = undefined;
1012 mulxU64(&x114, &x115, x106, 0xfffffffffffffffe);
1013 var x116: u64 = undefined;
1014 var x117: u64 = undefined;
1015 mulxU64(&x116, &x117, x106, 0xffffffff00000000);
1016 var x118: u64 = undefined;
1017 var x119: u64 = undefined;
1018 mulxU64(&x118, &x119, x106, 0xffffffff);
1019 var x120: u64 = undefined;
1020 var x121: u1 = undefined;
1021 addcarryxU64(&x120, &x121, 0x0, x119, x116);
1022 var x122: u64 = undefined;
1023 var x123: u1 = undefined;
1024 addcarryxU64(&x122, &x123, x121, x117, x114);
1025 var x124: u64 = undefined;
1026 var x125: u1 = undefined;
1027 addcarryxU64(&x124, &x125, x123, x115, x112);
1028 var x126: u64 = undefined;
1029 var x127: u1 = undefined;
1030 addcarryxU64(&x126, &x127, x125, x113, x110);
1031 var x128: u64 = undefined;
1032 var x129: u1 = undefined;
1033 addcarryxU64(&x128, &x129, x127, x111, x108);
1034 const x130 = (@as(u64, x129) + x109);
1035 var x131: u64 = undefined;
1036 var x132: u1 = undefined;
1037 addcarryxU64(&x131, &x132, 0x0, x92, x118);
1038 var x133: u64 = undefined;
1039 var x134: u1 = undefined;
1040 addcarryxU64(&x133, &x134, x132, x94, x120);
1041 var x135: u64 = undefined;
1042 var x136: u1 = undefined;
1043 addcarryxU64(&x135, &x136, x134, x96, x122);
1044 var x137: u64 = undefined;
1045 var x138: u1 = undefined;
1046 addcarryxU64(&x137, &x138, x136, x98, x124);
1047 var x139: u64 = undefined;
1048 var x140: u1 = undefined;
1049 addcarryxU64(&x139, &x140, x138, x100, x126);
1050 var x141: u64 = undefined;
1051 var x142: u1 = undefined;
1052 addcarryxU64(&x141, &x142, x140, x102, x128);
1053 var x143: u64 = undefined;
1054 var x144: u1 = undefined;
1055 addcarryxU64(&x143, &x144, x142, x104, x130);
1056 const x145 = (@as(u64, x144) + @as(u64, x105));
1057 var x146: u64 = undefined;
1058 var x147: u64 = undefined;
1059 mulxU64(&x146, &x147, x2, (arg1[5]));
1060 var x148: u64 = undefined;
1061 var x149: u64 = undefined;
1062 mulxU64(&x148, &x149, x2, (arg1[4]));
1063 var x150: u64 = undefined;
1064 var x151: u64 = undefined;
1065 mulxU64(&x150, &x151, x2, (arg1[3]));
1066 var x152: u64 = undefined;
1067 var x153: u64 = undefined;
1068 mulxU64(&x152, &x153, x2, (arg1[2]));
1069 var x154: u64 = undefined;
1070 var x155: u64 = undefined;
1071 mulxU64(&x154, &x155, x2, (arg1[1]));
1072 var x156: u64 = undefined;
1073 var x157: u64 = undefined;
1074 mulxU64(&x156, &x157, x2, (arg1[0]));
1075 var x158: u64 = undefined;
1076 var x159: u1 = undefined;
1077 addcarryxU64(&x158, &x159, 0x0, x157, x154);
1078 var x160: u64 = undefined;
1079 var x161: u1 = undefined;
1080 addcarryxU64(&x160, &x161, x159, x155, x152);
1081 var x162: u64 = undefined;
1082 var x163: u1 = undefined;
1083 addcarryxU64(&x162, &x163, x161, x153, x150);
1084 var x164: u64 = undefined;
1085 var x165: u1 = undefined;
1086 addcarryxU64(&x164, &x165, x163, x151, x148);
1087 var x166: u64 = undefined;
1088 var x167: u1 = undefined;
1089 addcarryxU64(&x166, &x167, x165, x149, x146);
1090 const x168 = (@as(u64, x167) + x147);
1091 var x169: u64 = undefined;
1092 var x170: u1 = undefined;
1093 addcarryxU64(&x169, &x170, 0x0, x133, x156);
1094 var x171: u64 = undefined;
1095 var x172: u1 = undefined;
1096 addcarryxU64(&x171, &x172, x170, x135, x158);
1097 var x173: u64 = undefined;
1098 var x174: u1 = undefined;
1099 addcarryxU64(&x173, &x174, x172, x137, x160);
1100 var x175: u64 = undefined;
1101 var x176: u1 = undefined;
1102 addcarryxU64(&x175, &x176, x174, x139, x162);
1103 var x177: u64 = undefined;
1104 var x178: u1 = undefined;
1105 addcarryxU64(&x177, &x178, x176, x141, x164);
1106 var x179: u64 = undefined;
1107 var x180: u1 = undefined;
1108 addcarryxU64(&x179, &x180, x178, x143, x166);
1109 var x181: u64 = undefined;
1110 var x182: u1 = undefined;
1111 addcarryxU64(&x181, &x182, x180, x145, x168);
1112 var x183: u64 = undefined;
1113 var x184: u64 = undefined;
1114 mulxU64(&x183, &x184, x169, 0x100000001);
1115 var x185: u64 = undefined;
1116 var x186: u64 = undefined;
1117 mulxU64(&x185, &x186, x183, 0xffffffffffffffff);
1118 var x187: u64 = undefined;
1119 var x188: u64 = undefined;
1120 mulxU64(&x187, &x188, x183, 0xffffffffffffffff);
1121 var x189: u64 = undefined;
1122 var x190: u64 = undefined;
1123 mulxU64(&x189, &x190, x183, 0xffffffffffffffff);
1124 var x191: u64 = undefined;
1125 var x192: u64 = undefined;
1126 mulxU64(&x191, &x192, x183, 0xfffffffffffffffe);
1127 var x193: u64 = undefined;
1128 var x194: u64 = undefined;
1129 mulxU64(&x193, &x194, x183, 0xffffffff00000000);
1130 var x195: u64 = undefined;
1131 var x196: u64 = undefined;
1132 mulxU64(&x195, &x196, x183, 0xffffffff);
1133 var x197: u64 = undefined;
1134 var x198: u1 = undefined;
1135 addcarryxU64(&x197, &x198, 0x0, x196, x193);
1136 var x199: u64 = undefined;
1137 var x200: u1 = undefined;
1138 addcarryxU64(&x199, &x200, x198, x194, x191);
1139 var x201: u64 = undefined;
1140 var x202: u1 = undefined;
1141 addcarryxU64(&x201, &x202, x200, x192, x189);
1142 var x203: u64 = undefined;
1143 var x204: u1 = undefined;
1144 addcarryxU64(&x203, &x204, x202, x190, x187);
1145 var x205: u64 = undefined;
1146 var x206: u1 = undefined;
1147 addcarryxU64(&x205, &x206, x204, x188, x185);
1148 const x207 = (@as(u64, x206) + x186);
1149 var x208: u64 = undefined;
1150 var x209: u1 = undefined;
1151 addcarryxU64(&x208, &x209, 0x0, x169, x195);
1152 var x210: u64 = undefined;
1153 var x211: u1 = undefined;
1154 addcarryxU64(&x210, &x211, x209, x171, x197);
1155 var x212: u64 = undefined;
1156 var x213: u1 = undefined;
1157 addcarryxU64(&x212, &x213, x211, x173, x199);
1158 var x214: u64 = undefined;
1159 var x215: u1 = undefined;
1160 addcarryxU64(&x214, &x215, x213, x175, x201);
1161 var x216: u64 = undefined;
1162 var x217: u1 = undefined;
1163 addcarryxU64(&x216, &x217, x215, x177, x203);
1164 var x218: u64 = undefined;
1165 var x219: u1 = undefined;
1166 addcarryxU64(&x218, &x219, x217, x179, x205);
1167 var x220: u64 = undefined;
1168 var x221: u1 = undefined;
1169 addcarryxU64(&x220, &x221, x219, x181, x207);
1170 const x222 = (@as(u64, x221) + @as(u64, x182));
1171 var x223: u64 = undefined;
1172 var x224: u64 = undefined;
1173 mulxU64(&x223, &x224, x3, (arg1[5]));
1174 var x225: u64 = undefined;
1175 var x226: u64 = undefined;
1176 mulxU64(&x225, &x226, x3, (arg1[4]));
1177 var x227: u64 = undefined;
1178 var x228: u64 = undefined;
1179 mulxU64(&x227, &x228, x3, (arg1[3]));
1180 var x229: u64 = undefined;
1181 var x230: u64 = undefined;
1182 mulxU64(&x229, &x230, x3, (arg1[2]));
1183 var x231: u64 = undefined;
1184 var x232: u64 = undefined;
1185 mulxU64(&x231, &x232, x3, (arg1[1]));
1186 var x233: u64 = undefined;
1187 var x234: u64 = undefined;
1188 mulxU64(&x233, &x234, x3, (arg1[0]));
1189 var x235: u64 = undefined;
1190 var x236: u1 = undefined;
1191 addcarryxU64(&x235, &x236, 0x0, x234, x231);
1192 var x237: u64 = undefined;
1193 var x238: u1 = undefined;
1194 addcarryxU64(&x237, &x238, x236, x232, x229);
1195 var x239: u64 = undefined;
1196 var x240: u1 = undefined;
1197 addcarryxU64(&x239, &x240, x238, x230, x227);
1198 var x241: u64 = undefined;
1199 var x242: u1 = undefined;
1200 addcarryxU64(&x241, &x242, x240, x228, x225);
1201 var x243: u64 = undefined;
1202 var x244: u1 = undefined;
1203 addcarryxU64(&x243, &x244, x242, x226, x223);
1204 const x245 = (@as(u64, x244) + x224);
1205 var x246: u64 = undefined;
1206 var x247: u1 = undefined;
1207 addcarryxU64(&x246, &x247, 0x0, x210, x233);
1208 var x248: u64 = undefined;
1209 var x249: u1 = undefined;
1210 addcarryxU64(&x248, &x249, x247, x212, x235);
1211 var x250: u64 = undefined;
1212 var x251: u1 = undefined;
1213 addcarryxU64(&x250, &x251, x249, x214, x237);
1214 var x252: u64 = undefined;
1215 var x253: u1 = undefined;
1216 addcarryxU64(&x252, &x253, x251, x216, x239);
1217 var x254: u64 = undefined;
1218 var x255: u1 = undefined;
1219 addcarryxU64(&x254, &x255, x253, x218, x241);
1220 var x256: u64 = undefined;
1221 var x257: u1 = undefined;
1222 addcarryxU64(&x256, &x257, x255, x220, x243);
1223 var x258: u64 = undefined;
1224 var x259: u1 = undefined;
1225 addcarryxU64(&x258, &x259, x257, x222, x245);
1226 var x260: u64 = undefined;
1227 var x261: u64 = undefined;
1228 mulxU64(&x260, &x261, x246, 0x100000001);
1229 var x262: u64 = undefined;
1230 var x263: u64 = undefined;
1231 mulxU64(&x262, &x263, x260, 0xffffffffffffffff);
1232 var x264: u64 = undefined;
1233 var x265: u64 = undefined;
1234 mulxU64(&x264, &x265, x260, 0xffffffffffffffff);
1235 var x266: u64 = undefined;
1236 var x267: u64 = undefined;
1237 mulxU64(&x266, &x267, x260, 0xffffffffffffffff);
1238 var x268: u64 = undefined;
1239 var x269: u64 = undefined;
1240 mulxU64(&x268, &x269, x260, 0xfffffffffffffffe);
1241 var x270: u64 = undefined;
1242 var x271: u64 = undefined;
1243 mulxU64(&x270, &x271, x260, 0xffffffff00000000);
1244 var x272: u64 = undefined;
1245 var x273: u64 = undefined;
1246 mulxU64(&x272, &x273, x260, 0xffffffff);
1247 var x274: u64 = undefined;
1248 var x275: u1 = undefined;
1249 addcarryxU64(&x274, &x275, 0x0, x273, x270);
1250 var x276: u64 = undefined;
1251 var x277: u1 = undefined;
1252 addcarryxU64(&x276, &x277, x275, x271, x268);
1253 var x278: u64 = undefined;
1254 var x279: u1 = undefined;
1255 addcarryxU64(&x278, &x279, x277, x269, x266);
1256 var x280: u64 = undefined;
1257 var x281: u1 = undefined;
1258 addcarryxU64(&x280, &x281, x279, x267, x264);
1259 var x282: u64 = undefined;
1260 var x283: u1 = undefined;
1261 addcarryxU64(&x282, &x283, x281, x265, x262);
1262 const x284 = (@as(u64, x283) + x263);
1263 var x285: u64 = undefined;
1264 var x286: u1 = undefined;
1265 addcarryxU64(&x285, &x286, 0x0, x246, x272);
1266 var x287: u64 = undefined;
1267 var x288: u1 = undefined;
1268 addcarryxU64(&x287, &x288, x286, x248, x274);
1269 var x289: u64 = undefined;
1270 var x290: u1 = undefined;
1271 addcarryxU64(&x289, &x290, x288, x250, x276);
1272 var x291: u64 = undefined;
1273 var x292: u1 = undefined;
1274 addcarryxU64(&x291, &x292, x290, x252, x278);
1275 var x293: u64 = undefined;
1276 var x294: u1 = undefined;
1277 addcarryxU64(&x293, &x294, x292, x254, x280);
1278 var x295: u64 = undefined;
1279 var x296: u1 = undefined;
1280 addcarryxU64(&x295, &x296, x294, x256, x282);
1281 var x297: u64 = undefined;
1282 var x298: u1 = undefined;
1283 addcarryxU64(&x297, &x298, x296, x258, x284);
1284 const x299 = (@as(u64, x298) + @as(u64, x259));
1285 var x300: u64 = undefined;
1286 var x301: u64 = undefined;
1287 mulxU64(&x300, &x301, x4, (arg1[5]));
1288 var x302: u64 = undefined;
1289 var x303: u64 = undefined;
1290 mulxU64(&x302, &x303, x4, (arg1[4]));
1291 var x304: u64 = undefined;
1292 var x305: u64 = undefined;
1293 mulxU64(&x304, &x305, x4, (arg1[3]));
1294 var x306: u64 = undefined;
1295 var x307: u64 = undefined;
1296 mulxU64(&x306, &x307, x4, (arg1[2]));
1297 var x308: u64 = undefined;
1298 var x309: u64 = undefined;
1299 mulxU64(&x308, &x309, x4, (arg1[1]));
1300 var x310: u64 = undefined;
1301 var x311: u64 = undefined;
1302 mulxU64(&x310, &x311, x4, (arg1[0]));
1303 var x312: u64 = undefined;
1304 var x313: u1 = undefined;
1305 addcarryxU64(&x312, &x313, 0x0, x311, x308);
1306 var x314: u64 = undefined;
1307 var x315: u1 = undefined;
1308 addcarryxU64(&x314, &x315, x313, x309, x306);
1309 var x316: u64 = undefined;
1310 var x317: u1 = undefined;
1311 addcarryxU64(&x316, &x317, x315, x307, x304);
1312 var x318: u64 = undefined;
1313 var x319: u1 = undefined;
1314 addcarryxU64(&x318, &x319, x317, x305, x302);
1315 var x320: u64 = undefined;
1316 var x321: u1 = undefined;
1317 addcarryxU64(&x320, &x321, x319, x303, x300);
1318 const x322 = (@as(u64, x321) + x301);
1319 var x323: u64 = undefined;
1320 var x324: u1 = undefined;
1321 addcarryxU64(&x323, &x324, 0x0, x287, x310);
1322 var x325: u64 = undefined;
1323 var x326: u1 = undefined;
1324 addcarryxU64(&x325, &x326, x324, x289, x312);
1325 var x327: u64 = undefined;
1326 var x328: u1 = undefined;
1327 addcarryxU64(&x327, &x328, x326, x291, x314);
1328 var x329: u64 = undefined;
1329 var x330: u1 = undefined;
1330 addcarryxU64(&x329, &x330, x328, x293, x316);
1331 var x331: u64 = undefined;
1332 var x332: u1 = undefined;
1333 addcarryxU64(&x331, &x332, x330, x295, x318);
1334 var x333: u64 = undefined;
1335 var x334: u1 = undefined;
1336 addcarryxU64(&x333, &x334, x332, x297, x320);
1337 var x335: u64 = undefined;
1338 var x336: u1 = undefined;
1339 addcarryxU64(&x335, &x336, x334, x299, x322);
1340 var x337: u64 = undefined;
1341 var x338: u64 = undefined;
1342 mulxU64(&x337, &x338, x323, 0x100000001);
1343 var x339: u64 = undefined;
1344 var x340: u64 = undefined;
1345 mulxU64(&x339, &x340, x337, 0xffffffffffffffff);
1346 var x341: u64 = undefined;
1347 var x342: u64 = undefined;
1348 mulxU64(&x341, &x342, x337, 0xffffffffffffffff);
1349 var x343: u64 = undefined;
1350 var x344: u64 = undefined;
1351 mulxU64(&x343, &x344, x337, 0xffffffffffffffff);
1352 var x345: u64 = undefined;
1353 var x346: u64 = undefined;
1354 mulxU64(&x345, &x346, x337, 0xfffffffffffffffe);
1355 var x347: u64 = undefined;
1356 var x348: u64 = undefined;
1357 mulxU64(&x347, &x348, x337, 0xffffffff00000000);
1358 var x349: u64 = undefined;
1359 var x350: u64 = undefined;
1360 mulxU64(&x349, &x350, x337, 0xffffffff);
1361 var x351: u64 = undefined;
1362 var x352: u1 = undefined;
1363 addcarryxU64(&x351, &x352, 0x0, x350, x347);
1364 var x353: u64 = undefined;
1365 var x354: u1 = undefined;
1366 addcarryxU64(&x353, &x354, x352, x348, x345);
1367 var x355: u64 = undefined;
1368 var x356: u1 = undefined;
1369 addcarryxU64(&x355, &x356, x354, x346, x343);
1370 var x357: u64 = undefined;
1371 var x358: u1 = undefined;
1372 addcarryxU64(&x357, &x358, x356, x344, x341);
1373 var x359: u64 = undefined;
1374 var x360: u1 = undefined;
1375 addcarryxU64(&x359, &x360, x358, x342, x339);
1376 const x361 = (@as(u64, x360) + x340);
1377 var x362: u64 = undefined;
1378 var x363: u1 = undefined;
1379 addcarryxU64(&x362, &x363, 0x0, x323, x349);
1380 var x364: u64 = undefined;
1381 var x365: u1 = undefined;
1382 addcarryxU64(&x364, &x365, x363, x325, x351);
1383 var x366: u64 = undefined;
1384 var x367: u1 = undefined;
1385 addcarryxU64(&x366, &x367, x365, x327, x353);
1386 var x368: u64 = undefined;
1387 var x369: u1 = undefined;
1388 addcarryxU64(&x368, &x369, x367, x329, x355);
1389 var x370: u64 = undefined;
1390 var x371: u1 = undefined;
1391 addcarryxU64(&x370, &x371, x369, x331, x357);
1392 var x372: u64 = undefined;
1393 var x373: u1 = undefined;
1394 addcarryxU64(&x372, &x373, x371, x333, x359);
1395 var x374: u64 = undefined;
1396 var x375: u1 = undefined;
1397 addcarryxU64(&x374, &x375, x373, x335, x361);
1398 const x376 = (@as(u64, x375) + @as(u64, x336));
1399 var x377: u64 = undefined;
1400 var x378: u64 = undefined;
1401 mulxU64(&x377, &x378, x5, (arg1[5]));
1402 var x379: u64 = undefined;
1403 var x380: u64 = undefined;
1404 mulxU64(&x379, &x380, x5, (arg1[4]));
1405 var x381: u64 = undefined;
1406 var x382: u64 = undefined;
1407 mulxU64(&x381, &x382, x5, (arg1[3]));
1408 var x383: u64 = undefined;
1409 var x384: u64 = undefined;
1410 mulxU64(&x383, &x384, x5, (arg1[2]));
1411 var x385: u64 = undefined;
1412 var x386: u64 = undefined;
1413 mulxU64(&x385, &x386, x5, (arg1[1]));
1414 var x387: u64 = undefined;
1415 var x388: u64 = undefined;
1416 mulxU64(&x387, &x388, x5, (arg1[0]));
1417 var x389: u64 = undefined;
1418 var x390: u1 = undefined;
1419 addcarryxU64(&x389, &x390, 0x0, x388, x385);
1420 var x391: u64 = undefined;
1421 var x392: u1 = undefined;
1422 addcarryxU64(&x391, &x392, x390, x386, x383);
1423 var x393: u64 = undefined;
1424 var x394: u1 = undefined;
1425 addcarryxU64(&x393, &x394, x392, x384, x381);
1426 var x395: u64 = undefined;
1427 var x396: u1 = undefined;
1428 addcarryxU64(&x395, &x396, x394, x382, x379);
1429 var x397: u64 = undefined;
1430 var x398: u1 = undefined;
1431 addcarryxU64(&x397, &x398, x396, x380, x377);
1432 const x399 = (@as(u64, x398) + x378);
1433 var x400: u64 = undefined;
1434 var x401: u1 = undefined;
1435 addcarryxU64(&x400, &x401, 0x0, x364, x387);
1436 var x402: u64 = undefined;
1437 var x403: u1 = undefined;
1438 addcarryxU64(&x402, &x403, x401, x366, x389);
1439 var x404: u64 = undefined;
1440 var x405: u1 = undefined;
1441 addcarryxU64(&x404, &x405, x403, x368, x391);
1442 var x406: u64 = undefined;
1443 var x407: u1 = undefined;
1444 addcarryxU64(&x406, &x407, x405, x370, x393);
1445 var x408: u64 = undefined;
1446 var x409: u1 = undefined;
1447 addcarryxU64(&x408, &x409, x407, x372, x395);
1448 var x410: u64 = undefined;
1449 var x411: u1 = undefined;
1450 addcarryxU64(&x410, &x411, x409, x374, x397);
1451 var x412: u64 = undefined;
1452 var x413: u1 = undefined;
1453 addcarryxU64(&x412, &x413, x411, x376, x399);
1454 var x414: u64 = undefined;
1455 var x415: u64 = undefined;
1456 mulxU64(&x414, &x415, x400, 0x100000001);
1457 var x416: u64 = undefined;
1458 var x417: u64 = undefined;
1459 mulxU64(&x416, &x417, x414, 0xffffffffffffffff);
1460 var x418: u64 = undefined;
1461 var x419: u64 = undefined;
1462 mulxU64(&x418, &x419, x414, 0xffffffffffffffff);
1463 var x420: u64 = undefined;
1464 var x421: u64 = undefined;
1465 mulxU64(&x420, &x421, x414, 0xffffffffffffffff);
1466 var x422: u64 = undefined;
1467 var x423: u64 = undefined;
1468 mulxU64(&x422, &x423, x414, 0xfffffffffffffffe);
1469 var x424: u64 = undefined;
1470 var x425: u64 = undefined;
1471 mulxU64(&x424, &x425, x414, 0xffffffff00000000);
1472 var x426: u64 = undefined;
1473 var x427: u64 = undefined;
1474 mulxU64(&x426, &x427, x414, 0xffffffff);
1475 var x428: u64 = undefined;
1476 var x429: u1 = undefined;
1477 addcarryxU64(&x428, &x429, 0x0, x427, x424);
1478 var x430: u64 = undefined;
1479 var x431: u1 = undefined;
1480 addcarryxU64(&x430, &x431, x429, x425, x422);
1481 var x432: u64 = undefined;
1482 var x433: u1 = undefined;
1483 addcarryxU64(&x432, &x433, x431, x423, x420);
1484 var x434: u64 = undefined;
1485 var x435: u1 = undefined;
1486 addcarryxU64(&x434, &x435, x433, x421, x418);
1487 var x436: u64 = undefined;
1488 var x437: u1 = undefined;
1489 addcarryxU64(&x436, &x437, x435, x419, x416);
1490 const x438 = (@as(u64, x437) + x417);
1491 var x439: u64 = undefined;
1492 var x440: u1 = undefined;
1493 addcarryxU64(&x439, &x440, 0x0, x400, x426);
1494 var x441: u64 = undefined;
1495 var x442: u1 = undefined;
1496 addcarryxU64(&x441, &x442, x440, x402, x428);
1497 var x443: u64 = undefined;
1498 var x444: u1 = undefined;
1499 addcarryxU64(&x443, &x444, x442, x404, x430);
1500 var x445: u64 = undefined;
1501 var x446: u1 = undefined;
1502 addcarryxU64(&x445, &x446, x444, x406, x432);
1503 var x447: u64 = undefined;
1504 var x448: u1 = undefined;
1505 addcarryxU64(&x447, &x448, x446, x408, x434);
1506 var x449: u64 = undefined;
1507 var x450: u1 = undefined;
1508 addcarryxU64(&x449, &x450, x448, x410, x436);
1509 var x451: u64 = undefined;
1510 var x452: u1 = undefined;
1511 addcarryxU64(&x451, &x452, x450, x412, x438);
1512 const x453 = (@as(u64, x452) + @as(u64, x413));
1513 var x454: u64 = undefined;
1514 var x455: u1 = undefined;
1515 subborrowxU64(&x454, &x455, 0x0, x441, 0xffffffff);
1516 var x456: u64 = undefined;
1517 var x457: u1 = undefined;
1518 subborrowxU64(&x456, &x457, x455, x443, 0xffffffff00000000);
1519 var x458: u64 = undefined;
1520 var x459: u1 = undefined;
1521 subborrowxU64(&x458, &x459, x457, x445, 0xfffffffffffffffe);
1522 var x460: u64 = undefined;
1523 var x461: u1 = undefined;
1524 subborrowxU64(&x460, &x461, x459, x447, 0xffffffffffffffff);
1525 var x462: u64 = undefined;
1526 var x463: u1 = undefined;
1527 subborrowxU64(&x462, &x463, x461, x449, 0xffffffffffffffff);
1528 var x464: u64 = undefined;
1529 var x465: u1 = undefined;
1530 subborrowxU64(&x464, &x465, x463, x451, 0xffffffffffffffff);
1531 var x466: u64 = undefined;
1532 var x467: u1 = undefined;
1533 subborrowxU64(&x466, &x467, x465, x453, 0x0);
1534 var x468: u64 = undefined;
1535 cmovznzU64(&x468, x467, x454, x441);
1536 var x469: u64 = undefined;
1537 cmovznzU64(&x469, x467, x456, x443);
1538 var x470: u64 = undefined;
1539 cmovznzU64(&x470, x467, x458, x445);
1540 var x471: u64 = undefined;
1541 cmovznzU64(&x471, x467, x460, x447);
1542 var x472: u64 = undefined;
1543 cmovznzU64(&x472, x467, x462, x449);
1544 var x473: u64 = undefined;
1545 cmovznzU64(&x473, x467, x464, x451);
1546 out1[0] = x468;
1547 out1[1] = x469;
1548 out1[2] = x470;
1549 out1[3] = x471;
1550 out1[4] = x472;
1551 out1[5] = x473;
1552}
1553
1554/// The function add adds two field elements in the Montgomery domain.
1555///
1556/// Preconditions:
1557/// 0 ≤ eval arg1 < m
1558/// 0 ≤ eval arg2 < m
1559/// Postconditions:
1560/// eval (from_montgomery out1) mod m = (eval (from_montgomery arg1) + eval (from_montgomery arg2)) mod m
1561/// 0 ≤ eval out1 < m
1562///
1563pub fn add(out1: *MontgomeryDomainFieldElement, arg1: MontgomeryDomainFieldElement, arg2: MontgomeryDomainFieldElement) void {
1564 @setRuntimeSafety(mode == .Debug);
1565
1566 var x1: u64 = undefined;
1567 var x2: u1 = undefined;
1568 addcarryxU64(&x1, &x2, 0x0, (arg1[0]), (arg2[0]));
1569 var x3: u64 = undefined;
1570 var x4: u1 = undefined;
1571 addcarryxU64(&x3, &x4, x2, (arg1[1]), (arg2[1]));
1572 var x5: u64 = undefined;
1573 var x6: u1 = undefined;
1574 addcarryxU64(&x5, &x6, x4, (arg1[2]), (arg2[2]));
1575 var x7: u64 = undefined;
1576 var x8: u1 = undefined;
1577 addcarryxU64(&x7, &x8, x6, (arg1[3]), (arg2[3]));
1578 var x9: u64 = undefined;
1579 var x10: u1 = undefined;
1580 addcarryxU64(&x9, &x10, x8, (arg1[4]), (arg2[4]));
1581 var x11: u64 = undefined;
1582 var x12: u1 = undefined;
1583 addcarryxU64(&x11, &x12, x10, (arg1[5]), (arg2[5]));
1584 var x13: u64 = undefined;
1585 var x14: u1 = undefined;
1586 subborrowxU64(&x13, &x14, 0x0, x1, 0xffffffff);
1587 var x15: u64 = undefined;
1588 var x16: u1 = undefined;
1589 subborrowxU64(&x15, &x16, x14, x3, 0xffffffff00000000);
1590 var x17: u64 = undefined;
1591 var x18: u1 = undefined;
1592 subborrowxU64(&x17, &x18, x16, x5, 0xfffffffffffffffe);
1593 var x19: u64 = undefined;
1594 var x20: u1 = undefined;
1595 subborrowxU64(&x19, &x20, x18, x7, 0xffffffffffffffff);
1596 var x21: u64 = undefined;
1597 var x22: u1 = undefined;
1598 subborrowxU64(&x21, &x22, x20, x9, 0xffffffffffffffff);
1599 var x23: u64 = undefined;
1600 var x24: u1 = undefined;
1601 subborrowxU64(&x23, &x24, x22, x11, 0xffffffffffffffff);
1602 var x25: u64 = undefined;
1603 var x26: u1 = undefined;
1604 subborrowxU64(&x25, &x26, x24, @as(u64, x12), 0x0);
1605 var x27: u64 = undefined;
1606 cmovznzU64(&x27, x26, x13, x1);
1607 var x28: u64 = undefined;
1608 cmovznzU64(&x28, x26, x15, x3);
1609 var x29: u64 = undefined;
1610 cmovznzU64(&x29, x26, x17, x5);
1611 var x30: u64 = undefined;
1612 cmovznzU64(&x30, x26, x19, x7);
1613 var x31: u64 = undefined;
1614 cmovznzU64(&x31, x26, x21, x9);
1615 var x32: u64 = undefined;
1616 cmovznzU64(&x32, x26, x23, x11);
1617 out1[0] = x27;
1618 out1[1] = x28;
1619 out1[2] = x29;
1620 out1[3] = x30;
1621 out1[4] = x31;
1622 out1[5] = x32;
1623}
1624
1625/// The function sub subtracts two field elements in the Montgomery domain.
1626///
1627/// Preconditions:
1628/// 0 ≤ eval arg1 < m
1629/// 0 ≤ eval arg2 < m
1630/// Postconditions:
1631/// eval (from_montgomery out1) mod m = (eval (from_montgomery arg1) - eval (from_montgomery arg2)) mod m
1632/// 0 ≤ eval out1 < m
1633///
1634pub fn sub(out1: *MontgomeryDomainFieldElement, arg1: MontgomeryDomainFieldElement, arg2: MontgomeryDomainFieldElement) void {
1635 @setRuntimeSafety(mode == .Debug);
1636
1637 var x1: u64 = undefined;
1638 var x2: u1 = undefined;
1639 subborrowxU64(&x1, &x2, 0x0, (arg1[0]), (arg2[0]));
1640 var x3: u64 = undefined;
1641 var x4: u1 = undefined;
1642 subborrowxU64(&x3, &x4, x2, (arg1[1]), (arg2[1]));
1643 var x5: u64 = undefined;
1644 var x6: u1 = undefined;
1645 subborrowxU64(&x5, &x6, x4, (arg1[2]), (arg2[2]));
1646 var x7: u64 = undefined;
1647 var x8: u1 = undefined;
1648 subborrowxU64(&x7, &x8, x6, (arg1[3]), (arg2[3]));
1649 var x9: u64 = undefined;
1650 var x10: u1 = undefined;
1651 subborrowxU64(&x9, &x10, x8, (arg1[4]), (arg2[4]));
1652 var x11: u64 = undefined;
1653 var x12: u1 = undefined;
1654 subborrowxU64(&x11, &x12, x10, (arg1[5]), (arg2[5]));
1655 var x13: u64 = undefined;
1656 cmovznzU64(&x13, x12, 0x0, 0xffffffffffffffff);
1657 var x14: u64 = undefined;
1658 var x15: u1 = undefined;
1659 addcarryxU64(&x14, &x15, 0x0, x1, (x13 & 0xffffffff));
1660 var x16: u64 = undefined;
1661 var x17: u1 = undefined;
1662 addcarryxU64(&x16, &x17, x15, x3, (x13 & 0xffffffff00000000));
1663 var x18: u64 = undefined;
1664 var x19: u1 = undefined;
1665 addcarryxU64(&x18, &x19, x17, x5, (x13 & 0xfffffffffffffffe));
1666 var x20: u64 = undefined;
1667 var x21: u1 = undefined;
1668 addcarryxU64(&x20, &x21, x19, x7, x13);
1669 var x22: u64 = undefined;
1670 var x23: u1 = undefined;
1671 addcarryxU64(&x22, &x23, x21, x9, x13);
1672 var x24: u64 = undefined;
1673 var x25: u1 = undefined;
1674 addcarryxU64(&x24, &x25, x23, x11, x13);
1675 out1[0] = x14;
1676 out1[1] = x16;
1677 out1[2] = x18;
1678 out1[3] = x20;
1679 out1[4] = x22;
1680 out1[5] = x24;
1681}
1682
1683/// The function opp negates a field element in the Montgomery domain.
1684///
1685/// Preconditions:
1686/// 0 ≤ eval arg1 < m
1687/// Postconditions:
1688/// eval (from_montgomery out1) mod m = -eval (from_montgomery arg1) mod m
1689/// 0 ≤ eval out1 < m
1690///
1691pub fn opp(out1: *MontgomeryDomainFieldElement, arg1: MontgomeryDomainFieldElement) void {
1692 @setRuntimeSafety(mode == .Debug);
1693
1694 var x1: u64 = undefined;
1695 var x2: u1 = undefined;
1696 subborrowxU64(&x1, &x2, 0x0, 0x0, (arg1[0]));
1697 var x3: u64 = undefined;
1698 var x4: u1 = undefined;
1699 subborrowxU64(&x3, &x4, x2, 0x0, (arg1[1]));
1700 var x5: u64 = undefined;
1701 var x6: u1 = undefined;
1702 subborrowxU64(&x5, &x6, x4, 0x0, (arg1[2]));
1703 var x7: u64 = undefined;
1704 var x8: u1 = undefined;
1705 subborrowxU64(&x7, &x8, x6, 0x0, (arg1[3]));
1706 var x9: u64 = undefined;
1707 var x10: u1 = undefined;
1708 subborrowxU64(&x9, &x10, x8, 0x0, (arg1[4]));
1709 var x11: u64 = undefined;
1710 var x12: u1 = undefined;
1711 subborrowxU64(&x11, &x12, x10, 0x0, (arg1[5]));
1712 var x13: u64 = undefined;
1713 cmovznzU64(&x13, x12, 0x0, 0xffffffffffffffff);
1714 var x14: u64 = undefined;
1715 var x15: u1 = undefined;
1716 addcarryxU64(&x14, &x15, 0x0, x1, (x13 & 0xffffffff));
1717 var x16: u64 = undefined;
1718 var x17: u1 = undefined;
1719 addcarryxU64(&x16, &x17, x15, x3, (x13 & 0xffffffff00000000));
1720 var x18: u64 = undefined;
1721 var x19: u1 = undefined;
1722 addcarryxU64(&x18, &x19, x17, x5, (x13 & 0xfffffffffffffffe));
1723 var x20: u64 = undefined;
1724 var x21: u1 = undefined;
1725 addcarryxU64(&x20, &x21, x19, x7, x13);
1726 var x22: u64 = undefined;
1727 var x23: u1 = undefined;
1728 addcarryxU64(&x22, &x23, x21, x9, x13);
1729 var x24: u64 = undefined;
1730 var x25: u1 = undefined;
1731 addcarryxU64(&x24, &x25, x23, x11, x13);
1732 out1[0] = x14;
1733 out1[1] = x16;
1734 out1[2] = x18;
1735 out1[3] = x20;
1736 out1[4] = x22;
1737 out1[5] = x24;
1738}
1739
1740/// The function fromMontgomery translates a field element out of the Montgomery domain.
1741///
1742/// Preconditions:
1743/// 0 ≤ eval arg1 < m
1744/// Postconditions:
1745/// eval out1 mod m = (eval arg1 * ((2^64)⁻¹ mod m)^6) mod m
1746/// 0 ≤ eval out1 < m
1747///
1748pub fn fromMontgomery(out1: *NonMontgomeryDomainFieldElement, arg1: MontgomeryDomainFieldElement) void {
1749 @setRuntimeSafety(mode == .Debug);
1750
1751 const x1 = (arg1[0]);
1752 var x2: u64 = undefined;
1753 var x3: u64 = undefined;
1754 mulxU64(&x2, &x3, x1, 0x100000001);
1755 var x4: u64 = undefined;
1756 var x5: u64 = undefined;
1757 mulxU64(&x4, &x5, x2, 0xffffffffffffffff);
1758 var x6: u64 = undefined;
1759 var x7: u64 = undefined;
1760 mulxU64(&x6, &x7, x2, 0xffffffffffffffff);
1761 var x8: u64 = undefined;
1762 var x9: u64 = undefined;
1763 mulxU64(&x8, &x9, x2, 0xffffffffffffffff);
1764 var x10: u64 = undefined;
1765 var x11: u64 = undefined;
1766 mulxU64(&x10, &x11, x2, 0xfffffffffffffffe);
1767 var x12: u64 = undefined;
1768 var x13: u64 = undefined;
1769 mulxU64(&x12, &x13, x2, 0xffffffff00000000);
1770 var x14: u64 = undefined;
1771 var x15: u64 = undefined;
1772 mulxU64(&x14, &x15, x2, 0xffffffff);
1773 var x16: u64 = undefined;
1774 var x17: u1 = undefined;
1775 addcarryxU64(&x16, &x17, 0x0, x15, x12);
1776 var x18: u64 = undefined;
1777 var x19: u1 = undefined;
1778 addcarryxU64(&x18, &x19, x17, x13, x10);
1779 var x20: u64 = undefined;
1780 var x21: u1 = undefined;
1781 addcarryxU64(&x20, &x21, x19, x11, x8);
1782 var x22: u64 = undefined;
1783 var x23: u1 = undefined;
1784 addcarryxU64(&x22, &x23, x21, x9, x6);
1785 var x24: u64 = undefined;
1786 var x25: u1 = undefined;
1787 addcarryxU64(&x24, &x25, x23, x7, x4);
1788 var x26: u64 = undefined;
1789 var x27: u1 = undefined;
1790 addcarryxU64(&x26, &x27, 0x0, x1, x14);
1791 var x28: u64 = undefined;
1792 var x29: u1 = undefined;
1793 addcarryxU64(&x28, &x29, x27, 0x0, x16);
1794 var x30: u64 = undefined;
1795 var x31: u1 = undefined;
1796 addcarryxU64(&x30, &x31, x29, 0x0, x18);
1797 var x32: u64 = undefined;
1798 var x33: u1 = undefined;
1799 addcarryxU64(&x32, &x33, x31, 0x0, x20);
1800 var x34: u64 = undefined;
1801 var x35: u1 = undefined;
1802 addcarryxU64(&x34, &x35, x33, 0x0, x22);
1803 var x36: u64 = undefined;
1804 var x37: u1 = undefined;
1805 addcarryxU64(&x36, &x37, x35, 0x0, x24);
1806 var x38: u64 = undefined;
1807 var x39: u1 = undefined;
1808 addcarryxU64(&x38, &x39, x37, 0x0, (@as(u64, x25) + x5));
1809 var x40: u64 = undefined;
1810 var x41: u1 = undefined;
1811 addcarryxU64(&x40, &x41, 0x0, x28, (arg1[1]));
1812 var x42: u64 = undefined;
1813 var x43: u1 = undefined;
1814 addcarryxU64(&x42, &x43, x41, x30, 0x0);
1815 var x44: u64 = undefined;
1816 var x45: u1 = undefined;
1817 addcarryxU64(&x44, &x45, x43, x32, 0x0);
1818 var x46: u64 = undefined;
1819 var x47: u1 = undefined;
1820 addcarryxU64(&x46, &x47, x45, x34, 0x0);
1821 var x48: u64 = undefined;
1822 var x49: u1 = undefined;
1823 addcarryxU64(&x48, &x49, x47, x36, 0x0);
1824 var x50: u64 = undefined;
1825 var x51: u1 = undefined;
1826 addcarryxU64(&x50, &x51, x49, x38, 0x0);
1827 var x52: u64 = undefined;
1828 var x53: u64 = undefined;
1829 mulxU64(&x52, &x53, x40, 0x100000001);
1830 var x54: u64 = undefined;
1831 var x55: u64 = undefined;
1832 mulxU64(&x54, &x55, x52, 0xffffffffffffffff);
1833 var x56: u64 = undefined;
1834 var x57: u64 = undefined;
1835 mulxU64(&x56, &x57, x52, 0xffffffffffffffff);
1836 var x58: u64 = undefined;
1837 var x59: u64 = undefined;
1838 mulxU64(&x58, &x59, x52, 0xffffffffffffffff);
1839 var x60: u64 = undefined;
1840 var x61: u64 = undefined;
1841 mulxU64(&x60, &x61, x52, 0xfffffffffffffffe);
1842 var x62: u64 = undefined;
1843 var x63: u64 = undefined;
1844 mulxU64(&x62, &x63, x52, 0xffffffff00000000);
1845 var x64: u64 = undefined;
1846 var x65: u64 = undefined;
1847 mulxU64(&x64, &x65, x52, 0xffffffff);
1848 var x66: u64 = undefined;
1849 var x67: u1 = undefined;
1850 addcarryxU64(&x66, &x67, 0x0, x65, x62);
1851 var x68: u64 = undefined;
1852 var x69: u1 = undefined;
1853 addcarryxU64(&x68, &x69, x67, x63, x60);
1854 var x70: u64 = undefined;
1855 var x71: u1 = undefined;
1856 addcarryxU64(&x70, &x71, x69, x61, x58);
1857 var x72: u64 = undefined;
1858 var x73: u1 = undefined;
1859 addcarryxU64(&x72, &x73, x71, x59, x56);
1860 var x74: u64 = undefined;
1861 var x75: u1 = undefined;
1862 addcarryxU64(&x74, &x75, x73, x57, x54);
1863 var x76: u64 = undefined;
1864 var x77: u1 = undefined;
1865 addcarryxU64(&x76, &x77, 0x0, x40, x64);
1866 var x78: u64 = undefined;
1867 var x79: u1 = undefined;
1868 addcarryxU64(&x78, &x79, x77, x42, x66);
1869 var x80: u64 = undefined;
1870 var x81: u1 = undefined;
1871 addcarryxU64(&x80, &x81, x79, x44, x68);
1872 var x82: u64 = undefined;
1873 var x83: u1 = undefined;
1874 addcarryxU64(&x82, &x83, x81, x46, x70);
1875 var x84: u64 = undefined;
1876 var x85: u1 = undefined;
1877 addcarryxU64(&x84, &x85, x83, x48, x72);
1878 var x86: u64 = undefined;
1879 var x87: u1 = undefined;
1880 addcarryxU64(&x86, &x87, x85, x50, x74);
1881 var x88: u64 = undefined;
1882 var x89: u1 = undefined;
1883 addcarryxU64(&x88, &x89, x87, (@as(u64, x51) + @as(u64, x39)), (@as(u64, x75) + x55));
1884 var x90: u64 = undefined;
1885 var x91: u1 = undefined;
1886 addcarryxU64(&x90, &x91, 0x0, x78, (arg1[2]));
1887 var x92: u64 = undefined;
1888 var x93: u1 = undefined;
1889 addcarryxU64(&x92, &x93, x91, x80, 0x0);
1890 var x94: u64 = undefined;
1891 var x95: u1 = undefined;
1892 addcarryxU64(&x94, &x95, x93, x82, 0x0);
1893 var x96: u64 = undefined;
1894 var x97: u1 = undefined;
1895 addcarryxU64(&x96, &x97, x95, x84, 0x0);
1896 var x98: u64 = undefined;
1897 var x99: u1 = undefined;
1898 addcarryxU64(&x98, &x99, x97, x86, 0x0);
1899 var x100: u64 = undefined;
1900 var x101: u1 = undefined;
1901 addcarryxU64(&x100, &x101, x99, x88, 0x0);
1902 var x102: u64 = undefined;
1903 var x103: u64 = undefined;
1904 mulxU64(&x102, &x103, x90, 0x100000001);
1905 var x104: u64 = undefined;
1906 var x105: u64 = undefined;
1907 mulxU64(&x104, &x105, x102, 0xffffffffffffffff);
1908 var x106: u64 = undefined;
1909 var x107: u64 = undefined;
1910 mulxU64(&x106, &x107, x102, 0xffffffffffffffff);
1911 var x108: u64 = undefined;
1912 var x109: u64 = undefined;
1913 mulxU64(&x108, &x109, x102, 0xffffffffffffffff);
1914 var x110: u64 = undefined;
1915 var x111: u64 = undefined;
1916 mulxU64(&x110, &x111, x102, 0xfffffffffffffffe);
1917 var x112: u64 = undefined;
1918 var x113: u64 = undefined;
1919 mulxU64(&x112, &x113, x102, 0xffffffff00000000);
1920 var x114: u64 = undefined;
1921 var x115: u64 = undefined;
1922 mulxU64(&x114, &x115, x102, 0xffffffff);
1923 var x116: u64 = undefined;
1924 var x117: u1 = undefined;
1925 addcarryxU64(&x116, &x117, 0x0, x115, x112);
1926 var x118: u64 = undefined;
1927 var x119: u1 = undefined;
1928 addcarryxU64(&x118, &x119, x117, x113, x110);
1929 var x120: u64 = undefined;
1930 var x121: u1 = undefined;
1931 addcarryxU64(&x120, &x121, x119, x111, x108);
1932 var x122: u64 = undefined;
1933 var x123: u1 = undefined;
1934 addcarryxU64(&x122, &x123, x121, x109, x106);
1935 var x124: u64 = undefined;
1936 var x125: u1 = undefined;
1937 addcarryxU64(&x124, &x125, x123, x107, x104);
1938 var x126: u64 = undefined;
1939 var x127: u1 = undefined;
1940 addcarryxU64(&x126, &x127, 0x0, x90, x114);
1941 var x128: u64 = undefined;
1942 var x129: u1 = undefined;
1943 addcarryxU64(&x128, &x129, x127, x92, x116);
1944 var x130: u64 = undefined;
1945 var x131: u1 = undefined;
1946 addcarryxU64(&x130, &x131, x129, x94, x118);
1947 var x132: u64 = undefined;
1948 var x133: u1 = undefined;
1949 addcarryxU64(&x132, &x133, x131, x96, x120);
1950 var x134: u64 = undefined;
1951 var x135: u1 = undefined;
1952 addcarryxU64(&x134, &x135, x133, x98, x122);
1953 var x136: u64 = undefined;
1954 var x137: u1 = undefined;
1955 addcarryxU64(&x136, &x137, x135, x100, x124);
1956 var x138: u64 = undefined;
1957 var x139: u1 = undefined;
1958 addcarryxU64(&x138, &x139, x137, (@as(u64, x101) + @as(u64, x89)), (@as(u64, x125) + x105));
1959 var x140: u64 = undefined;
1960 var x141: u1 = undefined;
1961 addcarryxU64(&x140, &x141, 0x0, x128, (arg1[3]));
1962 var x142: u64 = undefined;
1963 var x143: u1 = undefined;
1964 addcarryxU64(&x142, &x143, x141, x130, 0x0);
1965 var x144: u64 = undefined;
1966 var x145: u1 = undefined;
1967 addcarryxU64(&x144, &x145, x143, x132, 0x0);
1968 var x146: u64 = undefined;
1969 var x147: u1 = undefined;
1970 addcarryxU64(&x146, &x147, x145, x134, 0x0);
1971 var x148: u64 = undefined;
1972 var x149: u1 = undefined;
1973 addcarryxU64(&x148, &x149, x147, x136, 0x0);
1974 var x150: u64 = undefined;
1975 var x151: u1 = undefined;
1976 addcarryxU64(&x150, &x151, x149, x138, 0x0);
1977 var x152: u64 = undefined;
1978 var x153: u64 = undefined;
1979 mulxU64(&x152, &x153, x140, 0x100000001);
1980 var x154: u64 = undefined;
1981 var x155: u64 = undefined;
1982 mulxU64(&x154, &x155, x152, 0xffffffffffffffff);
1983 var x156: u64 = undefined;
1984 var x157: u64 = undefined;
1985 mulxU64(&x156, &x157, x152, 0xffffffffffffffff);
1986 var x158: u64 = undefined;
1987 var x159: u64 = undefined;
1988 mulxU64(&x158, &x159, x152, 0xffffffffffffffff);
1989 var x160: u64 = undefined;
1990 var x161: u64 = undefined;
1991 mulxU64(&x160, &x161, x152, 0xfffffffffffffffe);
1992 var x162: u64 = undefined;
1993 var x163: u64 = undefined;
1994 mulxU64(&x162, &x163, x152, 0xffffffff00000000);
1995 var x164: u64 = undefined;
1996 var x165: u64 = undefined;
1997 mulxU64(&x164, &x165, x152, 0xffffffff);
1998 var x166: u64 = undefined;
1999 var x167: u1 = undefined;
2000 addcarryxU64(&x166, &x167, 0x0, x165, x162);
2001 var x168: u64 = undefined;
2002 var x169: u1 = undefined;
2003 addcarryxU64(&x168, &x169, x167, x163, x160);
2004 var x170: u64 = undefined;
2005 var x171: u1 = undefined;
2006 addcarryxU64(&x170, &x171, x169, x161, x158);
2007 var x172: u64 = undefined;
2008 var x173: u1 = undefined;
2009 addcarryxU64(&x172, &x173, x171, x159, x156);
2010 var x174: u64 = undefined;
2011 var x175: u1 = undefined;
2012 addcarryxU64(&x174, &x175, x173, x157, x154);
2013 var x176: u64 = undefined;
2014 var x177: u1 = undefined;
2015 addcarryxU64(&x176, &x177, 0x0, x140, x164);
2016 var x178: u64 = undefined;
2017 var x179: u1 = undefined;
2018 addcarryxU64(&x178, &x179, x177, x142, x166);
2019 var x180: u64 = undefined;
2020 var x181: u1 = undefined;
2021 addcarryxU64(&x180, &x181, x179, x144, x168);
2022 var x182: u64 = undefined;
2023 var x183: u1 = undefined;
2024 addcarryxU64(&x182, &x183, x181, x146, x170);
2025 var x184: u64 = undefined;
2026 var x185: u1 = undefined;
2027 addcarryxU64(&x184, &x185, x183, x148, x172);
2028 var x186: u64 = undefined;
2029 var x187: u1 = undefined;
2030 addcarryxU64(&x186, &x187, x185, x150, x174);
2031 var x188: u64 = undefined;
2032 var x189: u1 = undefined;
2033 addcarryxU64(&x188, &x189, x187, (@as(u64, x151) + @as(u64, x139)), (@as(u64, x175) + x155));
2034 var x190: u64 = undefined;
2035 var x191: u1 = undefined;
2036 addcarryxU64(&x190, &x191, 0x0, x178, (arg1[4]));
2037 var x192: u64 = undefined;
2038 var x193: u1 = undefined;
2039 addcarryxU64(&x192, &x193, x191, x180, 0x0);
2040 var x194: u64 = undefined;
2041 var x195: u1 = undefined;
2042 addcarryxU64(&x194, &x195, x193, x182, 0x0);
2043 var x196: u64 = undefined;
2044 var x197: u1 = undefined;
2045 addcarryxU64(&x196, &x197, x195, x184, 0x0);
2046 var x198: u64 = undefined;
2047 var x199: u1 = undefined;
2048 addcarryxU64(&x198, &x199, x197, x186, 0x0);
2049 var x200: u64 = undefined;
2050 var x201: u1 = undefined;
2051 addcarryxU64(&x200, &x201, x199, x188, 0x0);
2052 var x202: u64 = undefined;
2053 var x203: u64 = undefined;
2054 mulxU64(&x202, &x203, x190, 0x100000001);
2055 var x204: u64 = undefined;
2056 var x205: u64 = undefined;
2057 mulxU64(&x204, &x205, x202, 0xffffffffffffffff);
2058 var x206: u64 = undefined;
2059 var x207: u64 = undefined;
2060 mulxU64(&x206, &x207, x202, 0xffffffffffffffff);
2061 var x208: u64 = undefined;
2062 var x209: u64 = undefined;
2063 mulxU64(&x208, &x209, x202, 0xffffffffffffffff);
2064 var x210: u64 = undefined;
2065 var x211: u64 = undefined;
2066 mulxU64(&x210, &x211, x202, 0xfffffffffffffffe);
2067 var x212: u64 = undefined;
2068 var x213: u64 = undefined;
2069 mulxU64(&x212, &x213, x202, 0xffffffff00000000);
2070 var x214: u64 = undefined;
2071 var x215: u64 = undefined;
2072 mulxU64(&x214, &x215, x202, 0xffffffff);
2073 var x216: u64 = undefined;
2074 var x217: u1 = undefined;
2075 addcarryxU64(&x216, &x217, 0x0, x215, x212);
2076 var x218: u64 = undefined;
2077 var x219: u1 = undefined;
2078 addcarryxU64(&x218, &x219, x217, x213, x210);
2079 var x220: u64 = undefined;
2080 var x221: u1 = undefined;
2081 addcarryxU64(&x220, &x221, x219, x211, x208);
2082 var x222: u64 = undefined;
2083 var x223: u1 = undefined;
2084 addcarryxU64(&x222, &x223, x221, x209, x206);
2085 var x224: u64 = undefined;
2086 var x225: u1 = undefined;
2087 addcarryxU64(&x224, &x225, x223, x207, x204);
2088 var x226: u64 = undefined;
2089 var x227: u1 = undefined;
2090 addcarryxU64(&x226, &x227, 0x0, x190, x214);
2091 var x228: u64 = undefined;
2092 var x229: u1 = undefined;
2093 addcarryxU64(&x228, &x229, x227, x192, x216);
2094 var x230: u64 = undefined;
2095 var x231: u1 = undefined;
2096 addcarryxU64(&x230, &x231, x229, x194, x218);
2097 var x232: u64 = undefined;
2098 var x233: u1 = undefined;
2099 addcarryxU64(&x232, &x233, x231, x196, x220);
2100 var x234: u64 = undefined;
2101 var x235: u1 = undefined;
2102 addcarryxU64(&x234, &x235, x233, x198, x222);
2103 var x236: u64 = undefined;
2104 var x237: u1 = undefined;
2105 addcarryxU64(&x236, &x237, x235, x200, x224);
2106 var x238: u64 = undefined;
2107 var x239: u1 = undefined;
2108 addcarryxU64(&x238, &x239, x237, (@as(u64, x201) + @as(u64, x189)), (@as(u64, x225) + x205));
2109 var x240: u64 = undefined;
2110 var x241: u1 = undefined;
2111 addcarryxU64(&x240, &x241, 0x0, x228, (arg1[5]));
2112 var x242: u64 = undefined;
2113 var x243: u1 = undefined;
2114 addcarryxU64(&x242, &x243, x241, x230, 0x0);
2115 var x244: u64 = undefined;
2116 var x245: u1 = undefined;
2117 addcarryxU64(&x244, &x245, x243, x232, 0x0);
2118 var x246: u64 = undefined;
2119 var x247: u1 = undefined;
2120 addcarryxU64(&x246, &x247, x245, x234, 0x0);
2121 var x248: u64 = undefined;
2122 var x249: u1 = undefined;
2123 addcarryxU64(&x248, &x249, x247, x236, 0x0);
2124 var x250: u64 = undefined;
2125 var x251: u1 = undefined;
2126 addcarryxU64(&x250, &x251, x249, x238, 0x0);
2127 var x252: u64 = undefined;
2128 var x253: u64 = undefined;
2129 mulxU64(&x252, &x253, x240, 0x100000001);
2130 var x254: u64 = undefined;
2131 var x255: u64 = undefined;
2132 mulxU64(&x254, &x255, x252, 0xffffffffffffffff);
2133 var x256: u64 = undefined;
2134 var x257: u64 = undefined;
2135 mulxU64(&x256, &x257, x252, 0xffffffffffffffff);
2136 var x258: u64 = undefined;
2137 var x259: u64 = undefined;
2138 mulxU64(&x258, &x259, x252, 0xffffffffffffffff);
2139 var x260: u64 = undefined;
2140 var x261: u64 = undefined;
2141 mulxU64(&x260, &x261, x252, 0xfffffffffffffffe);
2142 var x262: u64 = undefined;
2143 var x263: u64 = undefined;
2144 mulxU64(&x262, &x263, x252, 0xffffffff00000000);
2145 var x264: u64 = undefined;
2146 var x265: u64 = undefined;
2147 mulxU64(&x264, &x265, x252, 0xffffffff);
2148 var x266: u64 = undefined;
2149 var x267: u1 = undefined;
2150 addcarryxU64(&x266, &x267, 0x0, x265, x262);
2151 var x268: u64 = undefined;
2152 var x269: u1 = undefined;
2153 addcarryxU64(&x268, &x269, x267, x263, x260);
2154 var x270: u64 = undefined;
2155 var x271: u1 = undefined;
2156 addcarryxU64(&x270, &x271, x269, x261, x258);
2157 var x272: u64 = undefined;
2158 var x273: u1 = undefined;
2159 addcarryxU64(&x272, &x273, x271, x259, x256);
2160 var x274: u64 = undefined;
2161 var x275: u1 = undefined;
2162 addcarryxU64(&x274, &x275, x273, x257, x254);
2163 var x276: u64 = undefined;
2164 var x277: u1 = undefined;
2165 addcarryxU64(&x276, &x277, 0x0, x240, x264);
2166 var x278: u64 = undefined;
2167 var x279: u1 = undefined;
2168 addcarryxU64(&x278, &x279, x277, x242, x266);
2169 var x280: u64 = undefined;
2170 var x281: u1 = undefined;
2171 addcarryxU64(&x280, &x281, x279, x244, x268);
2172 var x282: u64 = undefined;
2173 var x283: u1 = undefined;
2174 addcarryxU64(&x282, &x283, x281, x246, x270);
2175 var x284: u64 = undefined;
2176 var x285: u1 = undefined;
2177 addcarryxU64(&x284, &x285, x283, x248, x272);
2178 var x286: u64 = undefined;
2179 var x287: u1 = undefined;
2180 addcarryxU64(&x286, &x287, x285, x250, x274);
2181 var x288: u64 = undefined;
2182 var x289: u1 = undefined;
2183 addcarryxU64(&x288, &x289, x287, (@as(u64, x251) + @as(u64, x239)), (@as(u64, x275) + x255));
2184 var x290: u64 = undefined;
2185 var x291: u1 = undefined;
2186 subborrowxU64(&x290, &x291, 0x0, x278, 0xffffffff);
2187 var x292: u64 = undefined;
2188 var x293: u1 = undefined;
2189 subborrowxU64(&x292, &x293, x291, x280, 0xffffffff00000000);
2190 var x294: u64 = undefined;
2191 var x295: u1 = undefined;
2192 subborrowxU64(&x294, &x295, x293, x282, 0xfffffffffffffffe);
2193 var x296: u64 = undefined;
2194 var x297: u1 = undefined;
2195 subborrowxU64(&x296, &x297, x295, x284, 0xffffffffffffffff);
2196 var x298: u64 = undefined;
2197 var x299: u1 = undefined;
2198 subborrowxU64(&x298, &x299, x297, x286, 0xffffffffffffffff);
2199 var x300: u64 = undefined;
2200 var x301: u1 = undefined;
2201 subborrowxU64(&x300, &x301, x299, x288, 0xffffffffffffffff);
2202 var x302: u64 = undefined;
2203 var x303: u1 = undefined;
2204 subborrowxU64(&x302, &x303, x301, @as(u64, x289), 0x0);
2205 var x304: u64 = undefined;
2206 cmovznzU64(&x304, x303, x290, x278);
2207 var x305: u64 = undefined;
2208 cmovznzU64(&x305, x303, x292, x280);
2209 var x306: u64 = undefined;
2210 cmovznzU64(&x306, x303, x294, x282);
2211 var x307: u64 = undefined;
2212 cmovznzU64(&x307, x303, x296, x284);
2213 var x308: u64 = undefined;
2214 cmovznzU64(&x308, x303, x298, x286);
2215 var x309: u64 = undefined;
2216 cmovznzU64(&x309, x303, x300, x288);
2217 out1[0] = x304;
2218 out1[1] = x305;
2219 out1[2] = x306;
2220 out1[3] = x307;
2221 out1[4] = x308;
2222 out1[5] = x309;
2223}
2224
2225/// The function toMontgomery translates a field element into the Montgomery domain.
2226///
2227/// Preconditions:
2228/// 0 ≤ eval arg1 < m
2229/// Postconditions:
2230/// eval (from_montgomery out1) mod m = eval arg1 mod m
2231/// 0 ≤ eval out1 < m
2232///
2233pub fn toMontgomery(out1: *MontgomeryDomainFieldElement, arg1: NonMontgomeryDomainFieldElement) void {
2234 @setRuntimeSafety(mode == .Debug);
2235
2236 const x1 = (arg1[1]);
2237 const x2 = (arg1[2]);
2238 const x3 = (arg1[3]);
2239 const x4 = (arg1[4]);
2240 const x5 = (arg1[5]);
2241 const x6 = (arg1[0]);
2242 var x7: u64 = undefined;
2243 var x8: u64 = undefined;
2244 mulxU64(&x7, &x8, x6, 0x200000000);
2245 var x9: u64 = undefined;
2246 var x10: u64 = undefined;
2247 mulxU64(&x9, &x10, x6, 0xfffffffe00000000);
2248 var x11: u64 = undefined;
2249 var x12: u64 = undefined;
2250 mulxU64(&x11, &x12, x6, 0x200000000);
2251 var x13: u64 = undefined;
2252 var x14: u64 = undefined;
2253 mulxU64(&x13, &x14, x6, 0xfffffffe00000001);
2254 var x15: u64 = undefined;
2255 var x16: u1 = undefined;
2256 addcarryxU64(&x15, &x16, 0x0, x14, x11);
2257 var x17: u64 = undefined;
2258 var x18: u1 = undefined;
2259 addcarryxU64(&x17, &x18, x16, x12, x9);
2260 var x19: u64 = undefined;
2261 var x20: u1 = undefined;
2262 addcarryxU64(&x19, &x20, x18, x10, x7);
2263 var x21: u64 = undefined;
2264 var x22: u1 = undefined;
2265 addcarryxU64(&x21, &x22, x20, x8, x6);
2266 var x23: u64 = undefined;
2267 var x24: u64 = undefined;
2268 mulxU64(&x23, &x24, x13, 0x100000001);
2269 var x25: u64 = undefined;
2270 var x26: u64 = undefined;
2271 mulxU64(&x25, &x26, x23, 0xffffffffffffffff);
2272 var x27: u64 = undefined;
2273 var x28: u64 = undefined;
2274 mulxU64(&x27, &x28, x23, 0xffffffffffffffff);
2275 var x29: u64 = undefined;
2276 var x30: u64 = undefined;
2277 mulxU64(&x29, &x30, x23, 0xffffffffffffffff);
2278 var x31: u64 = undefined;
2279 var x32: u64 = undefined;
2280 mulxU64(&x31, &x32, x23, 0xfffffffffffffffe);
2281 var x33: u64 = undefined;
2282 var x34: u64 = undefined;
2283 mulxU64(&x33, &x34, x23, 0xffffffff00000000);
2284 var x35: u64 = undefined;
2285 var x36: u64 = undefined;
2286 mulxU64(&x35, &x36, x23, 0xffffffff);
2287 var x37: u64 = undefined;
2288 var x38: u1 = undefined;
2289 addcarryxU64(&x37, &x38, 0x0, x36, x33);
2290 var x39: u64 = undefined;
2291 var x40: u1 = undefined;
2292 addcarryxU64(&x39, &x40, x38, x34, x31);
2293 var x41: u64 = undefined;
2294 var x42: u1 = undefined;
2295 addcarryxU64(&x41, &x42, x40, x32, x29);
2296 var x43: u64 = undefined;
2297 var x44: u1 = undefined;
2298 addcarryxU64(&x43, &x44, x42, x30, x27);
2299 var x45: u64 = undefined;
2300 var x46: u1 = undefined;
2301 addcarryxU64(&x45, &x46, x44, x28, x25);
2302 var x47: u64 = undefined;
2303 var x48: u1 = undefined;
2304 addcarryxU64(&x47, &x48, 0x0, x13, x35);
2305 var x49: u64 = undefined;
2306 var x50: u1 = undefined;
2307 addcarryxU64(&x49, &x50, x48, x15, x37);
2308 var x51: u64 = undefined;
2309 var x52: u1 = undefined;
2310 addcarryxU64(&x51, &x52, x50, x17, x39);
2311 var x53: u64 = undefined;
2312 var x54: u1 = undefined;
2313 addcarryxU64(&x53, &x54, x52, x19, x41);
2314 var x55: u64 = undefined;
2315 var x56: u1 = undefined;
2316 addcarryxU64(&x55, &x56, x54, x21, x43);
2317 var x57: u64 = undefined;
2318 var x58: u1 = undefined;
2319 addcarryxU64(&x57, &x58, x56, @as(u64, x22), x45);
2320 var x59: u64 = undefined;
2321 var x60: u1 = undefined;
2322 addcarryxU64(&x59, &x60, x58, 0x0, (@as(u64, x46) + x26));
2323 var x61: u64 = undefined;
2324 var x62: u64 = undefined;
2325 mulxU64(&x61, &x62, x1, 0x200000000);
2326 var x63: u64 = undefined;
2327 var x64: u64 = undefined;
2328 mulxU64(&x63, &x64, x1, 0xfffffffe00000000);
2329 var x65: u64 = undefined;
2330 var x66: u64 = undefined;
2331 mulxU64(&x65, &x66, x1, 0x200000000);
2332 var x67: u64 = undefined;
2333 var x68: u64 = undefined;
2334 mulxU64(&x67, &x68, x1, 0xfffffffe00000001);
2335 var x69: u64 = undefined;
2336 var x70: u1 = undefined;
2337 addcarryxU64(&x69, &x70, 0x0, x68, x65);
2338 var x71: u64 = undefined;
2339 var x72: u1 = undefined;
2340 addcarryxU64(&x71, &x72, x70, x66, x63);
2341 var x73: u64 = undefined;
2342 var x74: u1 = undefined;
2343 addcarryxU64(&x73, &x74, x72, x64, x61);
2344 var x75: u64 = undefined;
2345 var x76: u1 = undefined;
2346 addcarryxU64(&x75, &x76, x74, x62, x1);
2347 var x77: u64 = undefined;
2348 var x78: u1 = undefined;
2349 addcarryxU64(&x77, &x78, 0x0, x49, x67);
2350 var x79: u64 = undefined;
2351 var x80: u1 = undefined;
2352 addcarryxU64(&x79, &x80, x78, x51, x69);
2353 var x81: u64 = undefined;
2354 var x82: u1 = undefined;
2355 addcarryxU64(&x81, &x82, x80, x53, x71);
2356 var x83: u64 = undefined;
2357 var x84: u1 = undefined;
2358 addcarryxU64(&x83, &x84, x82, x55, x73);
2359 var x85: u64 = undefined;
2360 var x86: u1 = undefined;
2361 addcarryxU64(&x85, &x86, x84, x57, x75);
2362 var x87: u64 = undefined;
2363 var x88: u1 = undefined;
2364 addcarryxU64(&x87, &x88, x86, x59, @as(u64, x76));
2365 var x89: u64 = undefined;
2366 var x90: u64 = undefined;
2367 mulxU64(&x89, &x90, x77, 0x100000001);
2368 var x91: u64 = undefined;
2369 var x92: u64 = undefined;
2370 mulxU64(&x91, &x92, x89, 0xffffffffffffffff);
2371 var x93: u64 = undefined;
2372 var x94: u64 = undefined;
2373 mulxU64(&x93, &x94, x89, 0xffffffffffffffff);
2374 var x95: u64 = undefined;
2375 var x96: u64 = undefined;
2376 mulxU64(&x95, &x96, x89, 0xffffffffffffffff);
2377 var x97: u64 = undefined;
2378 var x98: u64 = undefined;
2379 mulxU64(&x97, &x98, x89, 0xfffffffffffffffe);
2380 var x99: u64 = undefined;
2381 var x100: u64 = undefined;
2382 mulxU64(&x99, &x100, x89, 0xffffffff00000000);
2383 var x101: u64 = undefined;
2384 var x102: u64 = undefined;
2385 mulxU64(&x101, &x102, x89, 0xffffffff);
2386 var x103: u64 = undefined;
2387 var x104: u1 = undefined;
2388 addcarryxU64(&x103, &x104, 0x0, x102, x99);
2389 var x105: u64 = undefined;
2390 var x106: u1 = undefined;
2391 addcarryxU64(&x105, &x106, x104, x100, x97);
2392 var x107: u64 = undefined;
2393 var x108: u1 = undefined;
2394 addcarryxU64(&x107, &x108, x106, x98, x95);
2395 var x109: u64 = undefined;
2396 var x110: u1 = undefined;
2397 addcarryxU64(&x109, &x110, x108, x96, x93);
2398 var x111: u64 = undefined;
2399 var x112: u1 = undefined;
2400 addcarryxU64(&x111, &x112, x110, x94, x91);
2401 var x113: u64 = undefined;
2402 var x114: u1 = undefined;
2403 addcarryxU64(&x113, &x114, 0x0, x77, x101);
2404 var x115: u64 = undefined;
2405 var x116: u1 = undefined;
2406 addcarryxU64(&x115, &x116, x114, x79, x103);
2407 var x117: u64 = undefined;
2408 var x118: u1 = undefined;
2409 addcarryxU64(&x117, &x118, x116, x81, x105);
2410 var x119: u64 = undefined;
2411 var x120: u1 = undefined;
2412 addcarryxU64(&x119, &x120, x118, x83, x107);
2413 var x121: u64 = undefined;
2414 var x122: u1 = undefined;
2415 addcarryxU64(&x121, &x122, x120, x85, x109);
2416 var x123: u64 = undefined;
2417 var x124: u1 = undefined;
2418 addcarryxU64(&x123, &x124, x122, x87, x111);
2419 var x125: u64 = undefined;
2420 var x126: u1 = undefined;
2421 addcarryxU64(&x125, &x126, x124, (@as(u64, x88) + @as(u64, x60)), (@as(u64, x112) + x92));
2422 var x127: u64 = undefined;
2423 var x128: u64 = undefined;
2424 mulxU64(&x127, &x128, x2, 0x200000000);
2425 var x129: u64 = undefined;
2426 var x130: u64 = undefined;
2427 mulxU64(&x129, &x130, x2, 0xfffffffe00000000);
2428 var x131: u64 = undefined;
2429 var x132: u64 = undefined;
2430 mulxU64(&x131, &x132, x2, 0x200000000);
2431 var x133: u64 = undefined;
2432 var x134: u64 = undefined;
2433 mulxU64(&x133, &x134, x2, 0xfffffffe00000001);
2434 var x135: u64 = undefined;
2435 var x136: u1 = undefined;
2436 addcarryxU64(&x135, &x136, 0x0, x134, x131);
2437 var x137: u64 = undefined;
2438 var x138: u1 = undefined;
2439 addcarryxU64(&x137, &x138, x136, x132, x129);
2440 var x139: u64 = undefined;
2441 var x140: u1 = undefined;
2442 addcarryxU64(&x139, &x140, x138, x130, x127);
2443 var x141: u64 = undefined;
2444 var x142: u1 = undefined;
2445 addcarryxU64(&x141, &x142, x140, x128, x2);
2446 var x143: u64 = undefined;
2447 var x144: u1 = undefined;
2448 addcarryxU64(&x143, &x144, 0x0, x115, x133);
2449 var x145: u64 = undefined;
2450 var x146: u1 = undefined;
2451 addcarryxU64(&x145, &x146, x144, x117, x135);
2452 var x147: u64 = undefined;
2453 var x148: u1 = undefined;
2454 addcarryxU64(&x147, &x148, x146, x119, x137);
2455 var x149: u64 = undefined;
2456 var x150: u1 = undefined;
2457 addcarryxU64(&x149, &x150, x148, x121, x139);
2458 var x151: u64 = undefined;
2459 var x152: u1 = undefined;
2460 addcarryxU64(&x151, &x152, x150, x123, x141);
2461 var x153: u64 = undefined;
2462 var x154: u1 = undefined;
2463 addcarryxU64(&x153, &x154, x152, x125, @as(u64, x142));
2464 var x155: u64 = undefined;
2465 var x156: u64 = undefined;
2466 mulxU64(&x155, &x156, x143, 0x100000001);
2467 var x157: u64 = undefined;
2468 var x158: u64 = undefined;
2469 mulxU64(&x157, &x158, x155, 0xffffffffffffffff);
2470 var x159: u64 = undefined;
2471 var x160: u64 = undefined;
2472 mulxU64(&x159, &x160, x155, 0xffffffffffffffff);
2473 var x161: u64 = undefined;
2474 var x162: u64 = undefined;
2475 mulxU64(&x161, &x162, x155, 0xffffffffffffffff);
2476 var x163: u64 = undefined;
2477 var x164: u64 = undefined;
2478 mulxU64(&x163, &x164, x155, 0xfffffffffffffffe);
2479 var x165: u64 = undefined;
2480 var x166: u64 = undefined;
2481 mulxU64(&x165, &x166, x155, 0xffffffff00000000);
2482 var x167: u64 = undefined;
2483 var x168: u64 = undefined;
2484 mulxU64(&x167, &x168, x155, 0xffffffff);
2485 var x169: u64 = undefined;
2486 var x170: u1 = undefined;
2487 addcarryxU64(&x169, &x170, 0x0, x168, x165);
2488 var x171: u64 = undefined;
2489 var x172: u1 = undefined;
2490 addcarryxU64(&x171, &x172, x170, x166, x163);
2491 var x173: u64 = undefined;
2492 var x174: u1 = undefined;
2493 addcarryxU64(&x173, &x174, x172, x164, x161);
2494 var x175: u64 = undefined;
2495 var x176: u1 = undefined;
2496 addcarryxU64(&x175, &x176, x174, x162, x159);
2497 var x177: u64 = undefined;
2498 var x178: u1 = undefined;
2499 addcarryxU64(&x177, &x178, x176, x160, x157);
2500 var x179: u64 = undefined;
2501 var x180: u1 = undefined;
2502 addcarryxU64(&x179, &x180, 0x0, x143, x167);
2503 var x181: u64 = undefined;
2504 var x182: u1 = undefined;
2505 addcarryxU64(&x181, &x182, x180, x145, x169);
2506 var x183: u64 = undefined;
2507 var x184: u1 = undefined;
2508 addcarryxU64(&x183, &x184, x182, x147, x171);
2509 var x185: u64 = undefined;
2510 var x186: u1 = undefined;
2511 addcarryxU64(&x185, &x186, x184, x149, x173);
2512 var x187: u64 = undefined;
2513 var x188: u1 = undefined;
2514 addcarryxU64(&x187, &x188, x186, x151, x175);
2515 var x189: u64 = undefined;
2516 var x190: u1 = undefined;
2517 addcarryxU64(&x189, &x190, x188, x153, x177);
2518 var x191: u64 = undefined;
2519 var x192: u1 = undefined;
2520 addcarryxU64(&x191, &x192, x190, (@as(u64, x154) + @as(u64, x126)), (@as(u64, x178) + x158));
2521 var x193: u64 = undefined;
2522 var x194: u64 = undefined;
2523 mulxU64(&x193, &x194, x3, 0x200000000);
2524 var x195: u64 = undefined;
2525 var x196: u64 = undefined;
2526 mulxU64(&x195, &x196, x3, 0xfffffffe00000000);
2527 var x197: u64 = undefined;
2528 var x198: u64 = undefined;
2529 mulxU64(&x197, &x198, x3, 0x200000000);
2530 var x199: u64 = undefined;
2531 var x200: u64 = undefined;
2532 mulxU64(&x199, &x200, x3, 0xfffffffe00000001);
2533 var x201: u64 = undefined;
2534 var x202: u1 = undefined;
2535 addcarryxU64(&x201, &x202, 0x0, x200, x197);
2536 var x203: u64 = undefined;
2537 var x204: u1 = undefined;
2538 addcarryxU64(&x203, &x204, x202, x198, x195);
2539 var x205: u64 = undefined;
2540 var x206: u1 = undefined;
2541 addcarryxU64(&x205, &x206, x204, x196, x193);
2542 var x207: u64 = undefined;
2543 var x208: u1 = undefined;
2544 addcarryxU64(&x207, &x208, x206, x194, x3);
2545 var x209: u64 = undefined;
2546 var x210: u1 = undefined;
2547 addcarryxU64(&x209, &x210, 0x0, x181, x199);
2548 var x211: u64 = undefined;
2549 var x212: u1 = undefined;
2550 addcarryxU64(&x211, &x212, x210, x183, x201);
2551 var x213: u64 = undefined;
2552 var x214: u1 = undefined;
2553 addcarryxU64(&x213, &x214, x212, x185, x203);
2554 var x215: u64 = undefined;
2555 var x216: u1 = undefined;
2556 addcarryxU64(&x215, &x216, x214, x187, x205);
2557 var x217: u64 = undefined;
2558 var x218: u1 = undefined;
2559 addcarryxU64(&x217, &x218, x216, x189, x207);
2560 var x219: u64 = undefined;
2561 var x220: u1 = undefined;
2562 addcarryxU64(&x219, &x220, x218, x191, @as(u64, x208));
2563 var x221: u64 = undefined;
2564 var x222: u64 = undefined;
2565 mulxU64(&x221, &x222, x209, 0x100000001);
2566 var x223: u64 = undefined;
2567 var x224: u64 = undefined;
2568 mulxU64(&x223, &x224, x221, 0xffffffffffffffff);
2569 var x225: u64 = undefined;
2570 var x226: u64 = undefined;
2571 mulxU64(&x225, &x226, x221, 0xffffffffffffffff);
2572 var x227: u64 = undefined;
2573 var x228: u64 = undefined;
2574 mulxU64(&x227, &x228, x221, 0xffffffffffffffff);
2575 var x229: u64 = undefined;
2576 var x230: u64 = undefined;
2577 mulxU64(&x229, &x230, x221, 0xfffffffffffffffe);
2578 var x231: u64 = undefined;
2579 var x232: u64 = undefined;
2580 mulxU64(&x231, &x232, x221, 0xffffffff00000000);
2581 var x233: u64 = undefined;
2582 var x234: u64 = undefined;
2583 mulxU64(&x233, &x234, x221, 0xffffffff);
2584 var x235: u64 = undefined;
2585 var x236: u1 = undefined;
2586 addcarryxU64(&x235, &x236, 0x0, x234, x231);
2587 var x237: u64 = undefined;
2588 var x238: u1 = undefined;
2589 addcarryxU64(&x237, &x238, x236, x232, x229);
2590 var x239: u64 = undefined;
2591 var x240: u1 = undefined;
2592 addcarryxU64(&x239, &x240, x238, x230, x227);
2593 var x241: u64 = undefined;
2594 var x242: u1 = undefined;
2595 addcarryxU64(&x241, &x242, x240, x228, x225);
2596 var x243: u64 = undefined;
2597 var x244: u1 = undefined;
2598 addcarryxU64(&x243, &x244, x242, x226, x223);
2599 var x245: u64 = undefined;
2600 var x246: u1 = undefined;
2601 addcarryxU64(&x245, &x246, 0x0, x209, x233);
2602 var x247: u64 = undefined;
2603 var x248: u1 = undefined;
2604 addcarryxU64(&x247, &x248, x246, x211, x235);
2605 var x249: u64 = undefined;
2606 var x250: u1 = undefined;
2607 addcarryxU64(&x249, &x250, x248, x213, x237);
2608 var x251: u64 = undefined;
2609 var x252: u1 = undefined;
2610 addcarryxU64(&x251, &x252, x250, x215, x239);
2611 var x253: u64 = undefined;
2612 var x254: u1 = undefined;
2613 addcarryxU64(&x253, &x254, x252, x217, x241);
2614 var x255: u64 = undefined;
2615 var x256: u1 = undefined;
2616 addcarryxU64(&x255, &x256, x254, x219, x243);
2617 var x257: u64 = undefined;
2618 var x258: u1 = undefined;
2619 addcarryxU64(&x257, &x258, x256, (@as(u64, x220) + @as(u64, x192)), (@as(u64, x244) + x224));
2620 var x259: u64 = undefined;
2621 var x260: u64 = undefined;
2622 mulxU64(&x259, &x260, x4, 0x200000000);
2623 var x261: u64 = undefined;
2624 var x262: u64 = undefined;
2625 mulxU64(&x261, &x262, x4, 0xfffffffe00000000);
2626 var x263: u64 = undefined;
2627 var x264: u64 = undefined;
2628 mulxU64(&x263, &x264, x4, 0x200000000);
2629 var x265: u64 = undefined;
2630 var x266: u64 = undefined;
2631 mulxU64(&x265, &x266, x4, 0xfffffffe00000001);
2632 var x267: u64 = undefined;
2633 var x268: u1 = undefined;
2634 addcarryxU64(&x267, &x268, 0x0, x266, x263);
2635 var x269: u64 = undefined;
2636 var x270: u1 = undefined;
2637 addcarryxU64(&x269, &x270, x268, x264, x261);
2638 var x271: u64 = undefined;
2639 var x272: u1 = undefined;
2640 addcarryxU64(&x271, &x272, x270, x262, x259);
2641 var x273: u64 = undefined;
2642 var x274: u1 = undefined;
2643 addcarryxU64(&x273, &x274, x272, x260, x4);
2644 var x275: u64 = undefined;
2645 var x276: u1 = undefined;
2646 addcarryxU64(&x275, &x276, 0x0, x247, x265);
2647 var x277: u64 = undefined;
2648 var x278: u1 = undefined;
2649 addcarryxU64(&x277, &x278, x276, x249, x267);
2650 var x279: u64 = undefined;
2651 var x280: u1 = undefined;
2652 addcarryxU64(&x279, &x280, x278, x251, x269);
2653 var x281: u64 = undefined;
2654 var x282: u1 = undefined;
2655 addcarryxU64(&x281, &x282, x280, x253, x271);
2656 var x283: u64 = undefined;
2657 var x284: u1 = undefined;
2658 addcarryxU64(&x283, &x284, x282, x255, x273);
2659 var x285: u64 = undefined;
2660 var x286: u1 = undefined;
2661 addcarryxU64(&x285, &x286, x284, x257, @as(u64, x274));
2662 var x287: u64 = undefined;
2663 var x288: u64 = undefined;
2664 mulxU64(&x287, &x288, x275, 0x100000001);
2665 var x289: u64 = undefined;
2666 var x290: u64 = undefined;
2667 mulxU64(&x289, &x290, x287, 0xffffffffffffffff);
2668 var x291: u64 = undefined;
2669 var x292: u64 = undefined;
2670 mulxU64(&x291, &x292, x287, 0xffffffffffffffff);
2671 var x293: u64 = undefined;
2672 var x294: u64 = undefined;
2673 mulxU64(&x293, &x294, x287, 0xffffffffffffffff);
2674 var x295: u64 = undefined;
2675 var x296: u64 = undefined;
2676 mulxU64(&x295, &x296, x287, 0xfffffffffffffffe);
2677 var x297: u64 = undefined;
2678 var x298: u64 = undefined;
2679 mulxU64(&x297, &x298, x287, 0xffffffff00000000);
2680 var x299: u64 = undefined;
2681 var x300: u64 = undefined;
2682 mulxU64(&x299, &x300, x287, 0xffffffff);
2683 var x301: u64 = undefined;
2684 var x302: u1 = undefined;
2685 addcarryxU64(&x301, &x302, 0x0, x300, x297);
2686 var x303: u64 = undefined;
2687 var x304: u1 = undefined;
2688 addcarryxU64(&x303, &x304, x302, x298, x295);
2689 var x305: u64 = undefined;
2690 var x306: u1 = undefined;
2691 addcarryxU64(&x305, &x306, x304, x296, x293);
2692 var x307: u64 = undefined;
2693 var x308: u1 = undefined;
2694 addcarryxU64(&x307, &x308, x306, x294, x291);
2695 var x309: u64 = undefined;
2696 var x310: u1 = undefined;
2697 addcarryxU64(&x309, &x310, x308, x292, x289);
2698 var x311: u64 = undefined;
2699 var x312: u1 = undefined;
2700 addcarryxU64(&x311, &x312, 0x0, x275, x299);
2701 var x313: u64 = undefined;
2702 var x314: u1 = undefined;
2703 addcarryxU64(&x313, &x314, x312, x277, x301);
2704 var x315: u64 = undefined;
2705 var x316: u1 = undefined;
2706 addcarryxU64(&x315, &x316, x314, x279, x303);
2707 var x317: u64 = undefined;
2708 var x318: u1 = undefined;
2709 addcarryxU64(&x317, &x318, x316, x281, x305);
2710 var x319: u64 = undefined;
2711 var x320: u1 = undefined;
2712 addcarryxU64(&x319, &x320, x318, x283, x307);
2713 var x321: u64 = undefined;
2714 var x322: u1 = undefined;
2715 addcarryxU64(&x321, &x322, x320, x285, x309);
2716 var x323: u64 = undefined;
2717 var x324: u1 = undefined;
2718 addcarryxU64(&x323, &x324, x322, (@as(u64, x286) + @as(u64, x258)), (@as(u64, x310) + x290));
2719 var x325: u64 = undefined;
2720 var x326: u64 = undefined;
2721 mulxU64(&x325, &x326, x5, 0x200000000);
2722 var x327: u64 = undefined;
2723 var x328: u64 = undefined;
2724 mulxU64(&x327, &x328, x5, 0xfffffffe00000000);
2725 var x329: u64 = undefined;
2726 var x330: u64 = undefined;
2727 mulxU64(&x329, &x330, x5, 0x200000000);
2728 var x331: u64 = undefined;
2729 var x332: u64 = undefined;
2730 mulxU64(&x331, &x332, x5, 0xfffffffe00000001);
2731 var x333: u64 = undefined;
2732 var x334: u1 = undefined;
2733 addcarryxU64(&x333, &x334, 0x0, x332, x329);
2734 var x335: u64 = undefined;
2735 var x336: u1 = undefined;
2736 addcarryxU64(&x335, &x336, x334, x330, x327);
2737 var x337: u64 = undefined;
2738 var x338: u1 = undefined;
2739 addcarryxU64(&x337, &x338, x336, x328, x325);
2740 var x339: u64 = undefined;
2741 var x340: u1 = undefined;
2742 addcarryxU64(&x339, &x340, x338, x326, x5);
2743 var x341: u64 = undefined;
2744 var x342: u1 = undefined;
2745 addcarryxU64(&x341, &x342, 0x0, x313, x331);
2746 var x343: u64 = undefined;
2747 var x344: u1 = undefined;
2748 addcarryxU64(&x343, &x344, x342, x315, x333);
2749 var x345: u64 = undefined;
2750 var x346: u1 = undefined;
2751 addcarryxU64(&x345, &x346, x344, x317, x335);
2752 var x347: u64 = undefined;
2753 var x348: u1 = undefined;
2754 addcarryxU64(&x347, &x348, x346, x319, x337);
2755 var x349: u64 = undefined;
2756 var x350: u1 = undefined;
2757 addcarryxU64(&x349, &x350, x348, x321, x339);
2758 var x351: u64 = undefined;
2759 var x352: u1 = undefined;
2760 addcarryxU64(&x351, &x352, x350, x323, @as(u64, x340));
2761 var x353: u64 = undefined;
2762 var x354: u64 = undefined;
2763 mulxU64(&x353, &x354, x341, 0x100000001);
2764 var x355: u64 = undefined;
2765 var x356: u64 = undefined;
2766 mulxU64(&x355, &x356, x353, 0xffffffffffffffff);
2767 var x357: u64 = undefined;
2768 var x358: u64 = undefined;
2769 mulxU64(&x357, &x358, x353, 0xffffffffffffffff);
2770 var x359: u64 = undefined;
2771 var x360: u64 = undefined;
2772 mulxU64(&x359, &x360, x353, 0xffffffffffffffff);
2773 var x361: u64 = undefined;
2774 var x362: u64 = undefined;
2775 mulxU64(&x361, &x362, x353, 0xfffffffffffffffe);
2776 var x363: u64 = undefined;
2777 var x364: u64 = undefined;
2778 mulxU64(&x363, &x364, x353, 0xffffffff00000000);
2779 var x365: u64 = undefined;
2780 var x366: u64 = undefined;
2781 mulxU64(&x365, &x366, x353, 0xffffffff);
2782 var x367: u64 = undefined;
2783 var x368: u1 = undefined;
2784 addcarryxU64(&x367, &x368, 0x0, x366, x363);
2785 var x369: u64 = undefined;
2786 var x370: u1 = undefined;
2787 addcarryxU64(&x369, &x370, x368, x364, x361);
2788 var x371: u64 = undefined;
2789 var x372: u1 = undefined;
2790 addcarryxU64(&x371, &x372, x370, x362, x359);
2791 var x373: u64 = undefined;
2792 var x374: u1 = undefined;
2793 addcarryxU64(&x373, &x374, x372, x360, x357);
2794 var x375: u64 = undefined;
2795 var x376: u1 = undefined;
2796 addcarryxU64(&x375, &x376, x374, x358, x355);
2797 var x377: u64 = undefined;
2798 var x378: u1 = undefined;
2799 addcarryxU64(&x377, &x378, 0x0, x341, x365);
2800 var x379: u64 = undefined;
2801 var x380: u1 = undefined;
2802 addcarryxU64(&x379, &x380, x378, x343, x367);
2803 var x381: u64 = undefined;
2804 var x382: u1 = undefined;
2805 addcarryxU64(&x381, &x382, x380, x345, x369);
2806 var x383: u64 = undefined;
2807 var x384: u1 = undefined;
2808 addcarryxU64(&x383, &x384, x382, x347, x371);
2809 var x385: u64 = undefined;
2810 var x386: u1 = undefined;
2811 addcarryxU64(&x385, &x386, x384, x349, x373);
2812 var x387: u64 = undefined;
2813 var x388: u1 = undefined;
2814 addcarryxU64(&x387, &x388, x386, x351, x375);
2815 var x389: u64 = undefined;
2816 var x390: u1 = undefined;
2817 addcarryxU64(&x389, &x390, x388, (@as(u64, x352) + @as(u64, x324)), (@as(u64, x376) + x356));
2818 var x391: u64 = undefined;
2819 var x392: u1 = undefined;
2820 subborrowxU64(&x391, &x392, 0x0, x379, 0xffffffff);
2821 var x393: u64 = undefined;
2822 var x394: u1 = undefined;
2823 subborrowxU64(&x393, &x394, x392, x381, 0xffffffff00000000);
2824 var x395: u64 = undefined;
2825 var x396: u1 = undefined;
2826 subborrowxU64(&x395, &x396, x394, x383, 0xfffffffffffffffe);
2827 var x397: u64 = undefined;
2828 var x398: u1 = undefined;
2829 subborrowxU64(&x397, &x398, x396, x385, 0xffffffffffffffff);
2830 var x399: u64 = undefined;
2831 var x400: u1 = undefined;
2832 subborrowxU64(&x399, &x400, x398, x387, 0xffffffffffffffff);
2833 var x401: u64 = undefined;
2834 var x402: u1 = undefined;
2835 subborrowxU64(&x401, &x402, x400, x389, 0xffffffffffffffff);
2836 var x403: u64 = undefined;
2837 var x404: u1 = undefined;
2838 subborrowxU64(&x403, &x404, x402, @as(u64, x390), 0x0);
2839 var x405: u64 = undefined;
2840 cmovznzU64(&x405, x404, x391, x379);
2841 var x406: u64 = undefined;
2842 cmovznzU64(&x406, x404, x393, x381);
2843 var x407: u64 = undefined;
2844 cmovznzU64(&x407, x404, x395, x383);
2845 var x408: u64 = undefined;
2846 cmovznzU64(&x408, x404, x397, x385);
2847 var x409: u64 = undefined;
2848 cmovznzU64(&x409, x404, x399, x387);
2849 var x410: u64 = undefined;
2850 cmovznzU64(&x410, x404, x401, x389);
2851 out1[0] = x405;
2852 out1[1] = x406;
2853 out1[2] = x407;
2854 out1[3] = x408;
2855 out1[4] = x409;
2856 out1[5] = x410;
2857}
2858
2859/// The function nonzero outputs a single non-zero word if the input is non-zero and zero otherwise.
2860///
2861/// Preconditions:
2862/// 0 ≤ eval arg1 < m
2863/// Postconditions:
2864/// out1 = 0 ↔ eval (from_montgomery arg1) mod m = 0
2865///
2866/// Input Bounds:
2867/// arg1: [[0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff]]
2868/// Output Bounds:
2869/// out1: [0x0 ~> 0xffffffffffffffff]
2870pub fn nonzero(out1: *u64, arg1: [6]u64) void {
2871 @setRuntimeSafety(mode == .Debug);
2872
2873 const x1 = ((arg1[0]) | ((arg1[1]) | ((arg1[2]) | ((arg1[3]) | ((arg1[4]) | (arg1[5]))))));
2874 out1.* = x1;
2875}
2876
2877/// The function selectznz is a multi-limb conditional select.
2878///
2879/// Postconditions:
2880/// out1 = (if arg1 = 0 then arg2 else arg3)
2881///
2882/// Input Bounds:
2883/// arg1: [0x0 ~> 0x1]
2884/// arg2: [[0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff]]
2885/// arg3: [[0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff]]
2886/// Output Bounds:
2887/// out1: [[0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff]]
2888pub fn selectznz(out1: *[6]u64, arg1: u1, arg2: [6]u64, arg3: [6]u64) void {
2889 @setRuntimeSafety(mode == .Debug);
2890
2891 var x1: u64 = undefined;
2892 cmovznzU64(&x1, arg1, (arg2[0]), (arg3[0]));
2893 var x2: u64 = undefined;
2894 cmovznzU64(&x2, arg1, (arg2[1]), (arg3[1]));
2895 var x3: u64 = undefined;
2896 cmovznzU64(&x3, arg1, (arg2[2]), (arg3[2]));
2897 var x4: u64 = undefined;
2898 cmovznzU64(&x4, arg1, (arg2[3]), (arg3[3]));
2899 var x5: u64 = undefined;
2900 cmovznzU64(&x5, arg1, (arg2[4]), (arg3[4]));
2901 var x6: u64 = undefined;
2902 cmovznzU64(&x6, arg1, (arg2[5]), (arg3[5]));
2903 out1[0] = x1;
2904 out1[1] = x2;
2905 out1[2] = x3;
2906 out1[3] = x4;
2907 out1[4] = x5;
2908 out1[5] = x6;
2909}
2910
2911/// The function toBytes serializes a field element NOT in the Montgomery domain to bytes in little-endian order.
2912///
2913/// Preconditions:
2914/// 0 ≤ eval arg1 < m
2915/// Postconditions:
2916/// out1 = map (λ x, ⌊((eval arg1 mod m) mod 2^(8 * (x + 1))) / 2^(8 * x)⌋) [0..47]
2917///
2918/// Input Bounds:
2919/// arg1: [[0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff]]
2920/// Output Bounds:
2921/// 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], [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]]
2922pub fn toBytes(out1: *[48]u8, arg1: [6]u64) void {
2923 @setRuntimeSafety(mode == .Debug);
2924
2925 const x1 = (arg1[5]);
2926 const x2 = (arg1[4]);
2927 const x3 = (arg1[3]);
2928 const x4 = (arg1[2]);
2929 const x5 = (arg1[1]);
2930 const x6 = (arg1[0]);
2931 const x7 = @truncate(u8, (x6 & 0xff));
2932 const x8 = (x6 >> 8);
2933 const x9 = @truncate(u8, (x8 & 0xff));
2934 const x10 = (x8 >> 8);
2935 const x11 = @truncate(u8, (x10 & 0xff));
2936 const x12 = (x10 >> 8);
2937 const x13 = @truncate(u8, (x12 & 0xff));
2938 const x14 = (x12 >> 8);
2939 const x15 = @truncate(u8, (x14 & 0xff));
2940 const x16 = (x14 >> 8);
2941 const x17 = @truncate(u8, (x16 & 0xff));
2942 const x18 = (x16 >> 8);
2943 const x19 = @truncate(u8, (x18 & 0xff));
2944 const x20 = @truncate(u8, (x18 >> 8));
2945 const x21 = @truncate(u8, (x5 & 0xff));
2946 const x22 = (x5 >> 8);
2947 const x23 = @truncate(u8, (x22 & 0xff));
2948 const x24 = (x22 >> 8);
2949 const x25 = @truncate(u8, (x24 & 0xff));
2950 const x26 = (x24 >> 8);
2951 const x27 = @truncate(u8, (x26 & 0xff));
2952 const x28 = (x26 >> 8);
2953 const x29 = @truncate(u8, (x28 & 0xff));
2954 const x30 = (x28 >> 8);
2955 const x31 = @truncate(u8, (x30 & 0xff));
2956 const x32 = (x30 >> 8);
2957 const x33 = @truncate(u8, (x32 & 0xff));
2958 const x34 = @truncate(u8, (x32 >> 8));
2959 const x35 = @truncate(u8, (x4 & 0xff));
2960 const x36 = (x4 >> 8);
2961 const x37 = @truncate(u8, (x36 & 0xff));
2962 const x38 = (x36 >> 8);
2963 const x39 = @truncate(u8, (x38 & 0xff));
2964 const x40 = (x38 >> 8);
2965 const x41 = @truncate(u8, (x40 & 0xff));
2966 const x42 = (x40 >> 8);
2967 const x43 = @truncate(u8, (x42 & 0xff));
2968 const x44 = (x42 >> 8);
2969 const x45 = @truncate(u8, (x44 & 0xff));
2970 const x46 = (x44 >> 8);
2971 const x47 = @truncate(u8, (x46 & 0xff));
2972 const x48 = @truncate(u8, (x46 >> 8));
2973 const x49 = @truncate(u8, (x3 & 0xff));
2974 const x50 = (x3 >> 8);
2975 const x51 = @truncate(u8, (x50 & 0xff));
2976 const x52 = (x50 >> 8);
2977 const x53 = @truncate(u8, (x52 & 0xff));
2978 const x54 = (x52 >> 8);
2979 const x55 = @truncate(u8, (x54 & 0xff));
2980 const x56 = (x54 >> 8);
2981 const x57 = @truncate(u8, (x56 & 0xff));
2982 const x58 = (x56 >> 8);
2983 const x59 = @truncate(u8, (x58 & 0xff));
2984 const x60 = (x58 >> 8);
2985 const x61 = @truncate(u8, (x60 & 0xff));
2986 const x62 = @truncate(u8, (x60 >> 8));
2987 const x63 = @truncate(u8, (x2 & 0xff));
2988 const x64 = (x2 >> 8);
2989 const x65 = @truncate(u8, (x64 & 0xff));
2990 const x66 = (x64 >> 8);
2991 const x67 = @truncate(u8, (x66 & 0xff));
2992 const x68 = (x66 >> 8);
2993 const x69 = @truncate(u8, (x68 & 0xff));
2994 const x70 = (x68 >> 8);
2995 const x71 = @truncate(u8, (x70 & 0xff));
2996 const x72 = (x70 >> 8);
2997 const x73 = @truncate(u8, (x72 & 0xff));
2998 const x74 = (x72 >> 8);
2999 const x75 = @truncate(u8, (x74 & 0xff));
3000 const x76 = @truncate(u8, (x74 >> 8));
3001 const x77 = @truncate(u8, (x1 & 0xff));
3002 const x78 = (x1 >> 8);
3003 const x79 = @truncate(u8, (x78 & 0xff));
3004 const x80 = (x78 >> 8);
3005 const x81 = @truncate(u8, (x80 & 0xff));
3006 const x82 = (x80 >> 8);
3007 const x83 = @truncate(u8, (x82 & 0xff));
3008 const x84 = (x82 >> 8);
3009 const x85 = @truncate(u8, (x84 & 0xff));
3010 const x86 = (x84 >> 8);
3011 const x87 = @truncate(u8, (x86 & 0xff));
3012 const x88 = (x86 >> 8);
3013 const x89 = @truncate(u8, (x88 & 0xff));
3014 const x90 = @truncate(u8, (x88 >> 8));
3015 out1[0] = x7;
3016 out1[1] = x9;
3017 out1[2] = x11;
3018 out1[3] = x13;
3019 out1[4] = x15;
3020 out1[5] = x17;
3021 out1[6] = x19;
3022 out1[7] = x20;
3023 out1[8] = x21;
3024 out1[9] = x23;
3025 out1[10] = x25;
3026 out1[11] = x27;
3027 out1[12] = x29;
3028 out1[13] = x31;
3029 out1[14] = x33;
3030 out1[15] = x34;
3031 out1[16] = x35;
3032 out1[17] = x37;
3033 out1[18] = x39;
3034 out1[19] = x41;
3035 out1[20] = x43;
3036 out1[21] = x45;
3037 out1[22] = x47;
3038 out1[23] = x48;
3039 out1[24] = x49;
3040 out1[25] = x51;
3041 out1[26] = x53;
3042 out1[27] = x55;
3043 out1[28] = x57;
3044 out1[29] = x59;
3045 out1[30] = x61;
3046 out1[31] = x62;
3047 out1[32] = x63;
3048 out1[33] = x65;
3049 out1[34] = x67;
3050 out1[35] = x69;
3051 out1[36] = x71;
3052 out1[37] = x73;
3053 out1[38] = x75;
3054 out1[39] = x76;
3055 out1[40] = x77;
3056 out1[41] = x79;
3057 out1[42] = x81;
3058 out1[43] = x83;
3059 out1[44] = x85;
3060 out1[45] = x87;
3061 out1[46] = x89;
3062 out1[47] = x90;
3063}
3064
3065/// The function fromBytes deserializes a field element NOT in the Montgomery domain from bytes in little-endian order.
3066///
3067/// Preconditions:
3068/// 0 ≤ bytes_eval arg1 < m
3069/// Postconditions:
3070/// eval out1 mod m = bytes_eval arg1 mod m
3071/// 0 ≤ eval out1 < m
3072///
3073/// Input Bounds:
3074/// 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], [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]]
3075/// Output Bounds:
3076/// out1: [[0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff]]
3077pub fn fromBytes(out1: *[6]u64, arg1: [48]u8) void {
3078 @setRuntimeSafety(mode == .Debug);
3079
3080 const x1 = (@as(u64, (arg1[47])) << 56);
3081 const x2 = (@as(u64, (arg1[46])) << 48);
3082 const x3 = (@as(u64, (arg1[45])) << 40);
3083 const x4 = (@as(u64, (arg1[44])) << 32);
3084 const x5 = (@as(u64, (arg1[43])) << 24);
3085 const x6 = (@as(u64, (arg1[42])) << 16);
3086 const x7 = (@as(u64, (arg1[41])) << 8);
3087 const x8 = (arg1[40]);
3088 const x9 = (@as(u64, (arg1[39])) << 56);
3089 const x10 = (@as(u64, (arg1[38])) << 48);
3090 const x11 = (@as(u64, (arg1[37])) << 40);
3091 const x12 = (@as(u64, (arg1[36])) << 32);
3092 const x13 = (@as(u64, (arg1[35])) << 24);
3093 const x14 = (@as(u64, (arg1[34])) << 16);
3094 const x15 = (@as(u64, (arg1[33])) << 8);
3095 const x16 = (arg1[32]);
3096 const x17 = (@as(u64, (arg1[31])) << 56);
3097 const x18 = (@as(u64, (arg1[30])) << 48);
3098 const x19 = (@as(u64, (arg1[29])) << 40);
3099 const x20 = (@as(u64, (arg1[28])) << 32);
3100 const x21 = (@as(u64, (arg1[27])) << 24);
3101 const x22 = (@as(u64, (arg1[26])) << 16);
3102 const x23 = (@as(u64, (arg1[25])) << 8);
3103 const x24 = (arg1[24]);
3104 const x25 = (@as(u64, (arg1[23])) << 56);
3105 const x26 = (@as(u64, (arg1[22])) << 48);
3106 const x27 = (@as(u64, (arg1[21])) << 40);
3107 const x28 = (@as(u64, (arg1[20])) << 32);
3108 const x29 = (@as(u64, (arg1[19])) << 24);
3109 const x30 = (@as(u64, (arg1[18])) << 16);
3110 const x31 = (@as(u64, (arg1[17])) << 8);
3111 const x32 = (arg1[16]);
3112 const x33 = (@as(u64, (arg1[15])) << 56);
3113 const x34 = (@as(u64, (arg1[14])) << 48);
3114 const x35 = (@as(u64, (arg1[13])) << 40);
3115 const x36 = (@as(u64, (arg1[12])) << 32);
3116 const x37 = (@as(u64, (arg1[11])) << 24);
3117 const x38 = (@as(u64, (arg1[10])) << 16);
3118 const x39 = (@as(u64, (arg1[9])) << 8);
3119 const x40 = (arg1[8]);
3120 const x41 = (@as(u64, (arg1[7])) << 56);
3121 const x42 = (@as(u64, (arg1[6])) << 48);
3122 const x43 = (@as(u64, (arg1[5])) << 40);
3123 const x44 = (@as(u64, (arg1[4])) << 32);
3124 const x45 = (@as(u64, (arg1[3])) << 24);
3125 const x46 = (@as(u64, (arg1[2])) << 16);
3126 const x47 = (@as(u64, (arg1[1])) << 8);
3127 const x48 = (arg1[0]);
3128 const x49 = (x47 + @as(u64, x48));
3129 const x50 = (x46 + x49);
3130 const x51 = (x45 + x50);
3131 const x52 = (x44 + x51);
3132 const x53 = (x43 + x52);
3133 const x54 = (x42 + x53);
3134 const x55 = (x41 + x54);
3135 const x56 = (x39 + @as(u64, x40));
3136 const x57 = (x38 + x56);
3137 const x58 = (x37 + x57);
3138 const x59 = (x36 + x58);
3139 const x60 = (x35 + x59);
3140 const x61 = (x34 + x60);
3141 const x62 = (x33 + x61);
3142 const x63 = (x31 + @as(u64, x32));
3143 const x64 = (x30 + x63);
3144 const x65 = (x29 + x64);
3145 const x66 = (x28 + x65);
3146 const x67 = (x27 + x66);
3147 const x68 = (x26 + x67);
3148 const x69 = (x25 + x68);
3149 const x70 = (x23 + @as(u64, x24));
3150 const x71 = (x22 + x70);
3151 const x72 = (x21 + x71);
3152 const x73 = (x20 + x72);
3153 const x74 = (x19 + x73);
3154 const x75 = (x18 + x74);
3155 const x76 = (x17 + x75);
3156 const x77 = (x15 + @as(u64, x16));
3157 const x78 = (x14 + x77);
3158 const x79 = (x13 + x78);
3159 const x80 = (x12 + x79);
3160 const x81 = (x11 + x80);
3161 const x82 = (x10 + x81);
3162 const x83 = (x9 + x82);
3163 const x84 = (x7 + @as(u64, x8));
3164 const x85 = (x6 + x84);
3165 const x86 = (x5 + x85);
3166 const x87 = (x4 + x86);
3167 const x88 = (x3 + x87);
3168 const x89 = (x2 + x88);
3169 const x90 = (x1 + x89);
3170 out1[0] = x55;
3171 out1[1] = x62;
3172 out1[2] = x69;
3173 out1[3] = x76;
3174 out1[4] = x83;
3175 out1[5] = x90;
3176}
3177
3178/// The function setOne returns the field element one in the Montgomery domain.
3179///
3180/// Postconditions:
3181/// eval (from_montgomery out1) mod m = 1 mod m
3182/// 0 ≤ eval out1 < m
3183///
3184pub fn setOne(out1: *MontgomeryDomainFieldElement) void {
3185 @setRuntimeSafety(mode == .Debug);
3186
3187 out1[0] = 0xffffffff00000001;
3188 out1[1] = 0xffffffff;
3189 out1[2] = 0x1;
3190 out1[3] = 0x0;
3191 out1[4] = 0x0;
3192 out1[5] = 0x0;
3193}
3194
3195/// The function msat returns the saturated representation of the prime modulus.
3196///
3197/// Postconditions:
3198/// twos_complement_eval out1 = m
3199/// 0 ≤ eval out1 < m
3200///
3201/// Output Bounds:
3202/// out1: [[0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff]]
3203pub fn msat(out1: *[7]u64) void {
3204 @setRuntimeSafety(mode == .Debug);
3205
3206 out1[0] = 0xffffffff;
3207 out1[1] = 0xffffffff00000000;
3208 out1[2] = 0xfffffffffffffffe;
3209 out1[3] = 0xffffffffffffffff;
3210 out1[4] = 0xffffffffffffffff;
3211 out1[5] = 0xffffffffffffffff;
3212 out1[6] = 0x0;
3213}
3214
3215/// The function divstep computes a divstep.
3216///
3217/// Preconditions:
3218/// 0 ≤ eval arg4 < m
3219/// 0 ≤ eval arg5 < m
3220/// Postconditions:
3221/// out1 = (if 0 < arg1 ∧ (twos_complement_eval arg3) is odd then 1 - arg1 else 1 + arg1)
3222/// twos_complement_eval out2 = (if 0 < arg1 ∧ (twos_complement_eval arg3) is odd then twos_complement_eval arg3 else twos_complement_eval arg2)
3223/// 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⌋)
3224/// 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)
3225/// 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)
3226/// 0 ≤ eval out5 < m
3227/// 0 ≤ eval out5 < m
3228/// 0 ≤ eval out2 < m
3229/// 0 ≤ eval out3 < m
3230///
3231/// Input Bounds:
3232/// arg1: [0x0 ~> 0xffffffffffffffff]
3233/// arg2: [[0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff]]
3234/// arg3: [[0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff]]
3235/// arg4: [[0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff]]
3236/// arg5: [[0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff]]
3237/// Output Bounds:
3238/// out1: [0x0 ~> 0xffffffffffffffff]
3239/// out2: [[0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff]]
3240/// out3: [[0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff]]
3241/// out4: [[0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff]]
3242/// out5: [[0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff]]
3243pub fn divstep(out1: *u64, out2: *[7]u64, out3: *[7]u64, out4: *[6]u64, out5: *[6]u64, arg1: u64, arg2: [7]u64, arg3: [7]u64, arg4: [6]u64, arg5: [6]u64) void {
3244 @setRuntimeSafety(mode == .Debug);
3245
3246 var x1: u64 = undefined;
3247 var x2: u1 = undefined;
3248 addcarryxU64(&x1, &x2, 0x0, (~arg1), 0x1);
3249 const x3 = (@truncate(u1, (x1 >> 63)) & @truncate(u1, ((arg3[0]) & 0x1)));
3250 var x4: u64 = undefined;
3251 var x5: u1 = undefined;
3252 addcarryxU64(&x4, &x5, 0x0, (~arg1), 0x1);
3253 var x6: u64 = undefined;
3254 cmovznzU64(&x6, x3, arg1, x4);
3255 var x7: u64 = undefined;
3256 cmovznzU64(&x7, x3, (arg2[0]), (arg3[0]));
3257 var x8: u64 = undefined;
3258 cmovznzU64(&x8, x3, (arg2[1]), (arg3[1]));
3259 var x9: u64 = undefined;
3260 cmovznzU64(&x9, x3, (arg2[2]), (arg3[2]));
3261 var x10: u64 = undefined;
3262 cmovznzU64(&x10, x3, (arg2[3]), (arg3[3]));
3263 var x11: u64 = undefined;
3264 cmovznzU64(&x11, x3, (arg2[4]), (arg3[4]));
3265 var x12: u64 = undefined;
3266 cmovznzU64(&x12, x3, (arg2[5]), (arg3[5]));
3267 var x13: u64 = undefined;
3268 cmovznzU64(&x13, x3, (arg2[6]), (arg3[6]));
3269 var x14: u64 = undefined;
3270 var x15: u1 = undefined;
3271 addcarryxU64(&x14, &x15, 0x0, 0x1, (~(arg2[0])));
3272 var x16: u64 = undefined;
3273 var x17: u1 = undefined;
3274 addcarryxU64(&x16, &x17, x15, 0x0, (~(arg2[1])));
3275 var x18: u64 = undefined;
3276 var x19: u1 = undefined;
3277 addcarryxU64(&x18, &x19, x17, 0x0, (~(arg2[2])));
3278 var x20: u64 = undefined;
3279 var x21: u1 = undefined;
3280 addcarryxU64(&x20, &x21, x19, 0x0, (~(arg2[3])));
3281 var x22: u64 = undefined;
3282 var x23: u1 = undefined;
3283 addcarryxU64(&x22, &x23, x21, 0x0, (~(arg2[4])));
3284 var x24: u64 = undefined;
3285 var x25: u1 = undefined;
3286 addcarryxU64(&x24, &x25, x23, 0x0, (~(arg2[5])));
3287 var x26: u64 = undefined;
3288 var x27: u1 = undefined;
3289 addcarryxU64(&x26, &x27, x25, 0x0, (~(arg2[6])));
3290 var x28: u64 = undefined;
3291 cmovznzU64(&x28, x3, (arg3[0]), x14);
3292 var x29: u64 = undefined;
3293 cmovznzU64(&x29, x3, (arg3[1]), x16);
3294 var x30: u64 = undefined;
3295 cmovznzU64(&x30, x3, (arg3[2]), x18);
3296 var x31: u64 = undefined;
3297 cmovznzU64(&x31, x3, (arg3[3]), x20);
3298 var x32: u64 = undefined;
3299 cmovznzU64(&x32, x3, (arg3[4]), x22);
3300 var x33: u64 = undefined;
3301 cmovznzU64(&x33, x3, (arg3[5]), x24);
3302 var x34: u64 = undefined;
3303 cmovznzU64(&x34, x3, (arg3[6]), x26);
3304 var x35: u64 = undefined;
3305 cmovznzU64(&x35, x3, (arg4[0]), (arg5[0]));
3306 var x36: u64 = undefined;
3307 cmovznzU64(&x36, x3, (arg4[1]), (arg5[1]));
3308 var x37: u64 = undefined;
3309 cmovznzU64(&x37, x3, (arg4[2]), (arg5[2]));
3310 var x38: u64 = undefined;
3311 cmovznzU64(&x38, x3, (arg4[3]), (arg5[3]));
3312 var x39: u64 = undefined;
3313 cmovznzU64(&x39, x3, (arg4[4]), (arg5[4]));
3314 var x40: u64 = undefined;
3315 cmovznzU64(&x40, x3, (arg4[5]), (arg5[5]));
3316 var x41: u64 = undefined;
3317 var x42: u1 = undefined;
3318 addcarryxU64(&x41, &x42, 0x0, x35, x35);
3319 var x43: u64 = undefined;
3320 var x44: u1 = undefined;
3321 addcarryxU64(&x43, &x44, x42, x36, x36);
3322 var x45: u64 = undefined;
3323 var x46: u1 = undefined;
3324 addcarryxU64(&x45, &x46, x44, x37, x37);
3325 var x47: u64 = undefined;
3326 var x48: u1 = undefined;
3327 addcarryxU64(&x47, &x48, x46, x38, x38);
3328 var x49: u64 = undefined;
3329 var x50: u1 = undefined;
3330 addcarryxU64(&x49, &x50, x48, x39, x39);
3331 var x51: u64 = undefined;
3332 var x52: u1 = undefined;
3333 addcarryxU64(&x51, &x52, x50, x40, x40);
3334 var x53: u64 = undefined;
3335 var x54: u1 = undefined;
3336 subborrowxU64(&x53, &x54, 0x0, x41, 0xffffffff);
3337 var x55: u64 = undefined;
3338 var x56: u1 = undefined;
3339 subborrowxU64(&x55, &x56, x54, x43, 0xffffffff00000000);
3340 var x57: u64 = undefined;
3341 var x58: u1 = undefined;
3342 subborrowxU64(&x57, &x58, x56, x45, 0xfffffffffffffffe);
3343 var x59: u64 = undefined;
3344 var x60: u1 = undefined;
3345 subborrowxU64(&x59, &x60, x58, x47, 0xffffffffffffffff);
3346 var x61: u64 = undefined;
3347 var x62: u1 = undefined;
3348 subborrowxU64(&x61, &x62, x60, x49, 0xffffffffffffffff);
3349 var x63: u64 = undefined;
3350 var x64: u1 = undefined;
3351 subborrowxU64(&x63, &x64, x62, x51, 0xffffffffffffffff);
3352 var x65: u64 = undefined;
3353 var x66: u1 = undefined;
3354 subborrowxU64(&x65, &x66, x64, @as(u64, x52), 0x0);
3355 const x67 = (arg4[5]);
3356 const x68 = (arg4[4]);
3357 const x69 = (arg4[3]);
3358 const x70 = (arg4[2]);
3359 const x71 = (arg4[1]);
3360 const x72 = (arg4[0]);
3361 var x73: u64 = undefined;
3362 var x74: u1 = undefined;
3363 subborrowxU64(&x73, &x74, 0x0, 0x0, x72);
3364 var x75: u64 = undefined;
3365 var x76: u1 = undefined;
3366 subborrowxU64(&x75, &x76, x74, 0x0, x71);
3367 var x77: u64 = undefined;
3368 var x78: u1 = undefined;
3369 subborrowxU64(&x77, &x78, x76, 0x0, x70);
3370 var x79: u64 = undefined;
3371 var x80: u1 = undefined;
3372 subborrowxU64(&x79, &x80, x78, 0x0, x69);
3373 var x81: u64 = undefined;
3374 var x82: u1 = undefined;
3375 subborrowxU64(&x81, &x82, x80, 0x0, x68);
3376 var x83: u64 = undefined;
3377 var x84: u1 = undefined;
3378 subborrowxU64(&x83, &x84, x82, 0x0, x67);
3379 var x85: u64 = undefined;
3380 cmovznzU64(&x85, x84, 0x0, 0xffffffffffffffff);
3381 var x86: u64 = undefined;
3382 var x87: u1 = undefined;
3383 addcarryxU64(&x86, &x87, 0x0, x73, (x85 & 0xffffffff));
3384 var x88: u64 = undefined;
3385 var x89: u1 = undefined;
3386 addcarryxU64(&x88, &x89, x87, x75, (x85 & 0xffffffff00000000));
3387 var x90: u64 = undefined;
3388 var x91: u1 = undefined;
3389 addcarryxU64(&x90, &x91, x89, x77, (x85 & 0xfffffffffffffffe));
3390 var x92: u64 = undefined;
3391 var x93: u1 = undefined;
3392 addcarryxU64(&x92, &x93, x91, x79, x85);
3393 var x94: u64 = undefined;
3394 var x95: u1 = undefined;
3395 addcarryxU64(&x94, &x95, x93, x81, x85);
3396 var x96: u64 = undefined;
3397 var x97: u1 = undefined;
3398 addcarryxU64(&x96, &x97, x95, x83, x85);
3399 var x98: u64 = undefined;
3400 cmovznzU64(&x98, x3, (arg5[0]), x86);
3401 var x99: u64 = undefined;
3402 cmovznzU64(&x99, x3, (arg5[1]), x88);
3403 var x100: u64 = undefined;
3404 cmovznzU64(&x100, x3, (arg5[2]), x90);
3405 var x101: u64 = undefined;
3406 cmovznzU64(&x101, x3, (arg5[3]), x92);
3407 var x102: u64 = undefined;
3408 cmovznzU64(&x102, x3, (arg5[4]), x94);
3409 var x103: u64 = undefined;
3410 cmovznzU64(&x103, x3, (arg5[5]), x96);
3411 const x104 = @truncate(u1, (x28 & 0x1));
3412 var x105: u64 = undefined;
3413 cmovznzU64(&x105, x104, 0x0, x7);
3414 var x106: u64 = undefined;
3415 cmovznzU64(&x106, x104, 0x0, x8);
3416 var x107: u64 = undefined;
3417 cmovznzU64(&x107, x104, 0x0, x9);
3418 var x108: u64 = undefined;
3419 cmovznzU64(&x108, x104, 0x0, x10);
3420 var x109: u64 = undefined;
3421 cmovznzU64(&x109, x104, 0x0, x11);
3422 var x110: u64 = undefined;
3423 cmovznzU64(&x110, x104, 0x0, x12);
3424 var x111: u64 = undefined;
3425 cmovznzU64(&x111, x104, 0x0, x13);
3426 var x112: u64 = undefined;
3427 var x113: u1 = undefined;
3428 addcarryxU64(&x112, &x113, 0x0, x28, x105);
3429 var x114: u64 = undefined;
3430 var x115: u1 = undefined;
3431 addcarryxU64(&x114, &x115, x113, x29, x106);
3432 var x116: u64 = undefined;
3433 var x117: u1 = undefined;
3434 addcarryxU64(&x116, &x117, x115, x30, x107);
3435 var x118: u64 = undefined;
3436 var x119: u1 = undefined;
3437 addcarryxU64(&x118, &x119, x117, x31, x108);
3438 var x120: u64 = undefined;
3439 var x121: u1 = undefined;
3440 addcarryxU64(&x120, &x121, x119, x32, x109);
3441 var x122: u64 = undefined;
3442 var x123: u1 = undefined;
3443 addcarryxU64(&x122, &x123, x121, x33, x110);
3444 var x124: u64 = undefined;
3445 var x125: u1 = undefined;
3446 addcarryxU64(&x124, &x125, x123, x34, x111);
3447 var x126: u64 = undefined;
3448 cmovznzU64(&x126, x104, 0x0, x35);
3449 var x127: u64 = undefined;
3450 cmovznzU64(&x127, x104, 0x0, x36);
3451 var x128: u64 = undefined;
3452 cmovznzU64(&x128, x104, 0x0, x37);
3453 var x129: u64 = undefined;
3454 cmovznzU64(&x129, x104, 0x0, x38);
3455 var x130: u64 = undefined;
3456 cmovznzU64(&x130, x104, 0x0, x39);
3457 var x131: u64 = undefined;
3458 cmovznzU64(&x131, x104, 0x0, x40);
3459 var x132: u64 = undefined;
3460 var x133: u1 = undefined;
3461 addcarryxU64(&x132, &x133, 0x0, x98, x126);
3462 var x134: u64 = undefined;
3463 var x135: u1 = undefined;
3464 addcarryxU64(&x134, &x135, x133, x99, x127);
3465 var x136: u64 = undefined;
3466 var x137: u1 = undefined;
3467 addcarryxU64(&x136, &x137, x135, x100, x128);
3468 var x138: u64 = undefined;
3469 var x139: u1 = undefined;
3470 addcarryxU64(&x138, &x139, x137, x101, x129);
3471 var x140: u64 = undefined;
3472 var x141: u1 = undefined;
3473 addcarryxU64(&x140, &x141, x139, x102, x130);
3474 var x142: u64 = undefined;
3475 var x143: u1 = undefined;
3476 addcarryxU64(&x142, &x143, x141, x103, x131);
3477 var x144: u64 = undefined;
3478 var x145: u1 = undefined;
3479 subborrowxU64(&x144, &x145, 0x0, x132, 0xffffffff);
3480 var x146: u64 = undefined;
3481 var x147: u1 = undefined;
3482 subborrowxU64(&x146, &x147, x145, x134, 0xffffffff00000000);
3483 var x148: u64 = undefined;
3484 var x149: u1 = undefined;
3485 subborrowxU64(&x148, &x149, x147, x136, 0xfffffffffffffffe);
3486 var x150: u64 = undefined;
3487 var x151: u1 = undefined;
3488 subborrowxU64(&x150, &x151, x149, x138, 0xffffffffffffffff);
3489 var x152: u64 = undefined;
3490 var x153: u1 = undefined;
3491 subborrowxU64(&x152, &x153, x151, x140, 0xffffffffffffffff);
3492 var x154: u64 = undefined;
3493 var x155: u1 = undefined;
3494 subborrowxU64(&x154, &x155, x153, x142, 0xffffffffffffffff);
3495 var x156: u64 = undefined;
3496 var x157: u1 = undefined;
3497 subborrowxU64(&x156, &x157, x155, @as(u64, x143), 0x0);
3498 var x158: u64 = undefined;
3499 var x159: u1 = undefined;
3500 addcarryxU64(&x158, &x159, 0x0, x6, 0x1);
3501 const x160 = ((x112 >> 1) | ((x114 << 63) & 0xffffffffffffffff));
3502 const x161 = ((x114 >> 1) | ((x116 << 63) & 0xffffffffffffffff));
3503 const x162 = ((x116 >> 1) | ((x118 << 63) & 0xffffffffffffffff));
3504 const x163 = ((x118 >> 1) | ((x120 << 63) & 0xffffffffffffffff));
3505 const x164 = ((x120 >> 1) | ((x122 << 63) & 0xffffffffffffffff));
3506 const x165 = ((x122 >> 1) | ((x124 << 63) & 0xffffffffffffffff));
3507 const x166 = ((x124 & 0x8000000000000000) | (x124 >> 1));
3508 var x167: u64 = undefined;
3509 cmovznzU64(&x167, x66, x53, x41);
3510 var x168: u64 = undefined;
3511 cmovznzU64(&x168, x66, x55, x43);
3512 var x169: u64 = undefined;
3513 cmovznzU64(&x169, x66, x57, x45);
3514 var x170: u64 = undefined;
3515 cmovznzU64(&x170, x66, x59, x47);
3516 var x171: u64 = undefined;
3517 cmovznzU64(&x171, x66, x61, x49);
3518 var x172: u64 = undefined;
3519 cmovznzU64(&x172, x66, x63, x51);
3520 var x173: u64 = undefined;
3521 cmovznzU64(&x173, x157, x144, x132);
3522 var x174: u64 = undefined;
3523 cmovznzU64(&x174, x157, x146, x134);
3524 var x175: u64 = undefined;
3525 cmovznzU64(&x175, x157, x148, x136);
3526 var x176: u64 = undefined;
3527 cmovznzU64(&x176, x157, x150, x138);
3528 var x177: u64 = undefined;
3529 cmovznzU64(&x177, x157, x152, x140);
3530 var x178: u64 = undefined;
3531 cmovznzU64(&x178, x157, x154, x142);
3532 out1.* = x158;
3533 out2[0] = x7;
3534 out2[1] = x8;
3535 out2[2] = x9;
3536 out2[3] = x10;
3537 out2[4] = x11;
3538 out2[5] = x12;
3539 out2[6] = x13;
3540 out3[0] = x160;
3541 out3[1] = x161;
3542 out3[2] = x162;
3543 out3[3] = x163;
3544 out3[4] = x164;
3545 out3[5] = x165;
3546 out3[6] = x166;
3547 out4[0] = x167;
3548 out4[1] = x168;
3549 out4[2] = x169;
3550 out4[3] = x170;
3551 out4[4] = x171;
3552 out4[5] = x172;
3553 out5[0] = x173;
3554 out5[1] = x174;
3555 out5[2] = x175;
3556 out5[3] = x176;
3557 out5[4] = x177;
3558 out5[5] = x178;
3559}
3560
3561/// The function divstepPrecomp returns the precomputed value for Bernstein-Yang-inversion (in montgomery form).
3562///
3563/// Postconditions:
3564/// 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⌋)
3565/// 0 ≤ eval out1 < m
3566///
3567/// Output Bounds:
3568/// out1: [[0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff]]
3569pub fn divstepPrecomp(out1: *[6]u64) void {
3570 @setRuntimeSafety(mode == .Debug);
3571
3572 out1[0] = 0xfff69400fff18fff;
3573 out1[1] = 0x2b7feffffd3ff;
3574 out1[2] = 0xfffedbfffffe97ff;
3575 out1[3] = 0x2840000002fff;
3576 out1[4] = 0x6040000050400;
3577 out1[5] = 0xfffc480000038000;
3578}
lib/std/crypto/pcurves/p384/p384_scalar_64.zig created+3632
...@@ -0,0 +1,3632 @@
1// Autogenerated: 'src/ExtractionOCaml/word_by_word_montgomery' --lang Zig --internal-static --public-function-case camelCase --private-function-case camelCase --public-type-case UpperCamelCase --private-type-case UpperCamelCase --no-prefix-fiat --package-name p384_scalar '' 64 '2^384 - 1388124618062372383947042015309946732620727252194336364173' mul square add sub opp from_montgomery to_montgomery nonzero selectznz to_bytes from_bytes one msat divstep divstep_precomp
2// curve description (via package name): p384_scalar
3// machine_wordsize = 64 (from "64")
4// requested operations: mul, square, add, sub, opp, from_montgomery, to_montgomery, nonzero, selectznz, to_bytes, from_bytes, one, msat, divstep, divstep_precomp
5// m = 0xffffffffffffffffffffffffffffffffffffffffffffffffc7634d81f4372ddf581a0db248b0a77aecec196accc52973 (from "2^384 - 1388124618062372383947042015309946732620727252194336364173")
6//
7// NOTE: In addition to the bounds specified above each function, all
8// functions synthesized for this Montgomery arithmetic require the
9// input to be strictly less than the prime modulus (m), and also
10// require the input to be in the unique saturated representation.
11// All functions also ensure that these two properties are true of
12// return values.
13//
14// Computed values:
15// eval z = z[0] + (z[1] << 64) + (z[2] << 128) + (z[3] << 192) + (z[4] << 256) + (z[5] << 0x140)
16// 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) + (z[32] << 256) + (z[33] << 0x108) + (z[34] << 0x110) + (z[35] << 0x118) + (z[36] << 0x120) + (z[37] << 0x128) + (z[38] << 0x130) + (z[39] << 0x138) + (z[40] << 0x140) + (z[41] << 0x148) + (z[42] << 0x150) + (z[43] << 0x158) + (z[44] << 0x160) + (z[45] << 0x168) + (z[46] << 0x170) + (z[47] << 0x178)
17// twos_complement_eval z = let x1 := z[0] + (z[1] << 64) + (z[2] << 128) + (z[3] << 192) + (z[4] << 256) + (z[5] << 0x140) in
18// if x1 & (2^384-1) < 2^383 then x1 & (2^384-1) else (x1 & (2^384-1)) - 2^384
19
20const std = @import("std");
21const mode = @import("builtin").mode; // Checked arithmetic is disabled in non-debug modes to avoid side channels
22
23// The type MontgomeryDomainFieldElement is a field element in the Montgomery domain.
24// Bounds: [[0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff]]
25pub const MontgomeryDomainFieldElement = [6]u64;
26
27// The type NonMontgomeryDomainFieldElement is a field element NOT in the Montgomery domain.
28// Bounds: [[0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff]]
29pub const NonMontgomeryDomainFieldElement = [6]u64;
30
31/// The function addcarryxU64 is an addition with carry.
32///
33/// Postconditions:
34/// out1 = (arg1 + arg2 + arg3) mod 2^64
35/// out2 = ⌊(arg1 + arg2 + arg3) / 2^64⌋
36///
37/// Input Bounds:
38/// arg1: [0x0 ~> 0x1]
39/// arg2: [0x0 ~> 0xffffffffffffffff]
40/// arg3: [0x0 ~> 0xffffffffffffffff]
41/// Output Bounds:
42/// out1: [0x0 ~> 0xffffffffffffffff]
43/// out2: [0x0 ~> 0x1]
44inline fn addcarryxU64(out1: *u64, out2: *u1, arg1: u1, arg2: u64, arg3: u64) void {
45 @setRuntimeSafety(mode == .Debug);
46
47 var t: u64 = undefined;
48 const carry1 = @addWithOverflow(u64, arg2, arg3, &t);
49 const carry2 = @addWithOverflow(u64, t, arg1, out1);
50 out2.* = @boolToInt(carry1) | @boolToInt(carry2);
51}
52
53/// The function subborrowxU64 is a subtraction with borrow.
54///
55/// Postconditions:
56/// out1 = (-arg1 + arg2 + -arg3) mod 2^64
57/// out2 = -⌊(-arg1 + arg2 + -arg3) / 2^64⌋
58///
59/// Input Bounds:
60/// arg1: [0x0 ~> 0x1]
61/// arg2: [0x0 ~> 0xffffffffffffffff]
62/// arg3: [0x0 ~> 0xffffffffffffffff]
63/// Output Bounds:
64/// out1: [0x0 ~> 0xffffffffffffffff]
65/// out2: [0x0 ~> 0x1]
66inline fn subborrowxU64(out1: *u64, out2: *u1, arg1: u1, arg2: u64, arg3: u64) void {
67 @setRuntimeSafety(mode == .Debug);
68
69 var t: u64 = undefined;
70 const carry1 = @subWithOverflow(u64, arg2, arg3, &t);
71 const carry2 = @subWithOverflow(u64, t, arg1, out1);
72 out2.* = @boolToInt(carry1) | @boolToInt(carry2);
73}
74
75/// The function mulxU64 is a multiplication, returning the full double-width result.
76///
77/// Postconditions:
78/// out1 = (arg1 * arg2) mod 2^64
79/// out2 = ⌊arg1 * arg2 / 2^64⌋
80///
81/// Input Bounds:
82/// arg1: [0x0 ~> 0xffffffffffffffff]
83/// arg2: [0x0 ~> 0xffffffffffffffff]
84/// Output Bounds:
85/// out1: [0x0 ~> 0xffffffffffffffff]
86/// out2: [0x0 ~> 0xffffffffffffffff]
87inline fn mulxU64(out1: *u64, out2: *u64, arg1: u64, arg2: u64) void {
88 @setRuntimeSafety(mode == .Debug);
89
90 const x = @as(u128, arg1) * @as(u128, arg2);
91 out1.* = @truncate(u64, x);
92 out2.* = @truncate(u64, x >> 64);
93}
94
95/// The function cmovznzU64 is a single-word conditional move.
96///
97/// Postconditions:
98/// out1 = (if arg1 = 0 then arg2 else arg3)
99///
100/// Input Bounds:
101/// arg1: [0x0 ~> 0x1]
102/// arg2: [0x0 ~> 0xffffffffffffffff]
103/// arg3: [0x0 ~> 0xffffffffffffffff]
104/// Output Bounds:
105/// out1: [0x0 ~> 0xffffffffffffffff]
106inline fn cmovznzU64(out1: *u64, arg1: u1, arg2: u64, arg3: u64) void {
107 @setRuntimeSafety(mode == .Debug);
108
109 const mask = 0 -% @as(u64, arg1);
110 out1.* = (mask & arg3) | ((~mask) & arg2);
111}
112
113/// The function mul multiplies two field elements in the Montgomery domain.
114///
115/// Preconditions:
116/// 0 ≤ eval arg1 < m
117/// 0 ≤ eval arg2 < m
118/// Postconditions:
119/// eval (from_montgomery out1) mod m = (eval (from_montgomery arg1) * eval (from_montgomery arg2)) mod m
120/// 0 ≤ eval out1 < m
121///
122pub fn mul(out1: *MontgomeryDomainFieldElement, arg1: MontgomeryDomainFieldElement, arg2: MontgomeryDomainFieldElement) void {
123 @setRuntimeSafety(mode == .Debug);
124
125 const x1 = (arg1[1]);
126 const x2 = (arg1[2]);
127 const x3 = (arg1[3]);
128 const x4 = (arg1[4]);
129 const x5 = (arg1[5]);
130 const x6 = (arg1[0]);
131 var x7: u64 = undefined;
132 var x8: u64 = undefined;
133 mulxU64(&x7, &x8, x6, (arg2[5]));
134 var x9: u64 = undefined;
135 var x10: u64 = undefined;
136 mulxU64(&x9, &x10, x6, (arg2[4]));
137 var x11: u64 = undefined;
138 var x12: u64 = undefined;
139 mulxU64(&x11, &x12, x6, (arg2[3]));
140 var x13: u64 = undefined;
141 var x14: u64 = undefined;
142 mulxU64(&x13, &x14, x6, (arg2[2]));
143 var x15: u64 = undefined;
144 var x16: u64 = undefined;
145 mulxU64(&x15, &x16, x6, (arg2[1]));
146 var x17: u64 = undefined;
147 var x18: u64 = undefined;
148 mulxU64(&x17, &x18, x6, (arg2[0]));
149 var x19: u64 = undefined;
150 var x20: u1 = undefined;
151 addcarryxU64(&x19, &x20, 0x0, x18, x15);
152 var x21: u64 = undefined;
153 var x22: u1 = undefined;
154 addcarryxU64(&x21, &x22, x20, x16, x13);
155 var x23: u64 = undefined;
156 var x24: u1 = undefined;
157 addcarryxU64(&x23, &x24, x22, x14, x11);
158 var x25: u64 = undefined;
159 var x26: u1 = undefined;
160 addcarryxU64(&x25, &x26, x24, x12, x9);
161 var x27: u64 = undefined;
162 var x28: u1 = undefined;
163 addcarryxU64(&x27, &x28, x26, x10, x7);
164 const x29 = (@as(u64, x28) + x8);
165 var x30: u64 = undefined;
166 var x31: u64 = undefined;
167 mulxU64(&x30, &x31, x17, 0x6ed46089e88fdc45);
168 var x32: u64 = undefined;
169 var x33: u64 = undefined;
170 mulxU64(&x32, &x33, x30, 0xffffffffffffffff);
171 var x34: u64 = undefined;
172 var x35: u64 = undefined;
173 mulxU64(&x34, &x35, x30, 0xffffffffffffffff);
174 var x36: u64 = undefined;
175 var x37: u64 = undefined;
176 mulxU64(&x36, &x37, x30, 0xffffffffffffffff);
177 var x38: u64 = undefined;
178 var x39: u64 = undefined;
179 mulxU64(&x38, &x39, x30, 0xc7634d81f4372ddf);
180 var x40: u64 = undefined;
181 var x41: u64 = undefined;
182 mulxU64(&x40, &x41, x30, 0x581a0db248b0a77a);
183 var x42: u64 = undefined;
184 var x43: u64 = undefined;
185 mulxU64(&x42, &x43, x30, 0xecec196accc52973);
186 var x44: u64 = undefined;
187 var x45: u1 = undefined;
188 addcarryxU64(&x44, &x45, 0x0, x43, x40);
189 var x46: u64 = undefined;
190 var x47: u1 = undefined;
191 addcarryxU64(&x46, &x47, x45, x41, x38);
192 var x48: u64 = undefined;
193 var x49: u1 = undefined;
194 addcarryxU64(&x48, &x49, x47, x39, x36);
195 var x50: u64 = undefined;
196 var x51: u1 = undefined;
197 addcarryxU64(&x50, &x51, x49, x37, x34);
198 var x52: u64 = undefined;
199 var x53: u1 = undefined;
200 addcarryxU64(&x52, &x53, x51, x35, x32);
201 const x54 = (@as(u64, x53) + x33);
202 var x55: u64 = undefined;
203 var x56: u1 = undefined;
204 addcarryxU64(&x55, &x56, 0x0, x17, x42);
205 var x57: u64 = undefined;
206 var x58: u1 = undefined;
207 addcarryxU64(&x57, &x58, x56, x19, x44);
208 var x59: u64 = undefined;
209 var x60: u1 = undefined;
210 addcarryxU64(&x59, &x60, x58, x21, x46);
211 var x61: u64 = undefined;
212 var x62: u1 = undefined;
213 addcarryxU64(&x61, &x62, x60, x23, x48);
214 var x63: u64 = undefined;
215 var x64: u1 = undefined;
216 addcarryxU64(&x63, &x64, x62, x25, x50);
217 var x65: u64 = undefined;
218 var x66: u1 = undefined;
219 addcarryxU64(&x65, &x66, x64, x27, x52);
220 var x67: u64 = undefined;
221 var x68: u1 = undefined;
222 addcarryxU64(&x67, &x68, x66, x29, x54);
223 var x69: u64 = undefined;
224 var x70: u64 = undefined;
225 mulxU64(&x69, &x70, x1, (arg2[5]));
226 var x71: u64 = undefined;
227 var x72: u64 = undefined;
228 mulxU64(&x71, &x72, x1, (arg2[4]));
229 var x73: u64 = undefined;
230 var x74: u64 = undefined;
231 mulxU64(&x73, &x74, x1, (arg2[3]));
232 var x75: u64 = undefined;
233 var x76: u64 = undefined;
234 mulxU64(&x75, &x76, x1, (arg2[2]));
235 var x77: u64 = undefined;
236 var x78: u64 = undefined;
237 mulxU64(&x77, &x78, x1, (arg2[1]));
238 var x79: u64 = undefined;
239 var x80: u64 = undefined;
240 mulxU64(&x79, &x80, x1, (arg2[0]));
241 var x81: u64 = undefined;
242 var x82: u1 = undefined;
243 addcarryxU64(&x81, &x82, 0x0, x80, x77);
244 var x83: u64 = undefined;
245 var x84: u1 = undefined;
246 addcarryxU64(&x83, &x84, x82, x78, x75);
247 var x85: u64 = undefined;
248 var x86: u1 = undefined;
249 addcarryxU64(&x85, &x86, x84, x76, x73);
250 var x87: u64 = undefined;
251 var x88: u1 = undefined;
252 addcarryxU64(&x87, &x88, x86, x74, x71);
253 var x89: u64 = undefined;
254 var x90: u1 = undefined;
255 addcarryxU64(&x89, &x90, x88, x72, x69);
256 const x91 = (@as(u64, x90) + x70);
257 var x92: u64 = undefined;
258 var x93: u1 = undefined;
259 addcarryxU64(&x92, &x93, 0x0, x57, x79);
260 var x94: u64 = undefined;
261 var x95: u1 = undefined;
262 addcarryxU64(&x94, &x95, x93, x59, x81);
263 var x96: u64 = undefined;
264 var x97: u1 = undefined;
265 addcarryxU64(&x96, &x97, x95, x61, x83);
266 var x98: u64 = undefined;
267 var x99: u1 = undefined;
268 addcarryxU64(&x98, &x99, x97, x63, x85);
269 var x100: u64 = undefined;
270 var x101: u1 = undefined;
271 addcarryxU64(&x100, &x101, x99, x65, x87);
272 var x102: u64 = undefined;
273 var x103: u1 = undefined;
274 addcarryxU64(&x102, &x103, x101, x67, x89);
275 var x104: u64 = undefined;
276 var x105: u1 = undefined;
277 addcarryxU64(&x104, &x105, x103, @as(u64, x68), x91);
278 var x106: u64 = undefined;
279 var x107: u64 = undefined;
280 mulxU64(&x106, &x107, x92, 0x6ed46089e88fdc45);
281 var x108: u64 = undefined;
282 var x109: u64 = undefined;
283 mulxU64(&x108, &x109, x106, 0xffffffffffffffff);
284 var x110: u64 = undefined;
285 var x111: u64 = undefined;
286 mulxU64(&x110, &x111, x106, 0xffffffffffffffff);
287 var x112: u64 = undefined;
288 var x113: u64 = undefined;
289 mulxU64(&x112, &x113, x106, 0xffffffffffffffff);
290 var x114: u64 = undefined;
291 var x115: u64 = undefined;
292 mulxU64(&x114, &x115, x106, 0xc7634d81f4372ddf);
293 var x116: u64 = undefined;
294 var x117: u64 = undefined;
295 mulxU64(&x116, &x117, x106, 0x581a0db248b0a77a);
296 var x118: u64 = undefined;
297 var x119: u64 = undefined;
298 mulxU64(&x118, &x119, x106, 0xecec196accc52973);
299 var x120: u64 = undefined;
300 var x121: u1 = undefined;
301 addcarryxU64(&x120, &x121, 0x0, x119, x116);
302 var x122: u64 = undefined;
303 var x123: u1 = undefined;
304 addcarryxU64(&x122, &x123, x121, x117, x114);
305 var x124: u64 = undefined;
306 var x125: u1 = undefined;
307 addcarryxU64(&x124, &x125, x123, x115, x112);
308 var x126: u64 = undefined;
309 var x127: u1 = undefined;
310 addcarryxU64(&x126, &x127, x125, x113, x110);
311 var x128: u64 = undefined;
312 var x129: u1 = undefined;
313 addcarryxU64(&x128, &x129, x127, x111, x108);
314 const x130 = (@as(u64, x129) + x109);
315 var x131: u64 = undefined;
316 var x132: u1 = undefined;
317 addcarryxU64(&x131, &x132, 0x0, x92, x118);
318 var x133: u64 = undefined;
319 var x134: u1 = undefined;
320 addcarryxU64(&x133, &x134, x132, x94, x120);
321 var x135: u64 = undefined;
322 var x136: u1 = undefined;
323 addcarryxU64(&x135, &x136, x134, x96, x122);
324 var x137: u64 = undefined;
325 var x138: u1 = undefined;
326 addcarryxU64(&x137, &x138, x136, x98, x124);
327 var x139: u64 = undefined;
328 var x140: u1 = undefined;
329 addcarryxU64(&x139, &x140, x138, x100, x126);
330 var x141: u64 = undefined;
331 var x142: u1 = undefined;
332 addcarryxU64(&x141, &x142, x140, x102, x128);
333 var x143: u64 = undefined;
334 var x144: u1 = undefined;
335 addcarryxU64(&x143, &x144, x142, x104, x130);
336 const x145 = (@as(u64, x144) + @as(u64, x105));
337 var x146: u64 = undefined;
338 var x147: u64 = undefined;
339 mulxU64(&x146, &x147, x2, (arg2[5]));
340 var x148: u64 = undefined;
341 var x149: u64 = undefined;
342 mulxU64(&x148, &x149, x2, (arg2[4]));
343 var x150: u64 = undefined;
344 var x151: u64 = undefined;
345 mulxU64(&x150, &x151, x2, (arg2[3]));
346 var x152: u64 = undefined;
347 var x153: u64 = undefined;
348 mulxU64(&x152, &x153, x2, (arg2[2]));
349 var x154: u64 = undefined;
350 var x155: u64 = undefined;
351 mulxU64(&x154, &x155, x2, (arg2[1]));
352 var x156: u64 = undefined;
353 var x157: u64 = undefined;
354 mulxU64(&x156, &x157, x2, (arg2[0]));
355 var x158: u64 = undefined;
356 var x159: u1 = undefined;
357 addcarryxU64(&x158, &x159, 0x0, x157, x154);
358 var x160: u64 = undefined;
359 var x161: u1 = undefined;
360 addcarryxU64(&x160, &x161, x159, x155, x152);
361 var x162: u64 = undefined;
362 var x163: u1 = undefined;
363 addcarryxU64(&x162, &x163, x161, x153, x150);
364 var x164: u64 = undefined;
365 var x165: u1 = undefined;
366 addcarryxU64(&x164, &x165, x163, x151, x148);
367 var x166: u64 = undefined;
368 var x167: u1 = undefined;
369 addcarryxU64(&x166, &x167, x165, x149, x146);
370 const x168 = (@as(u64, x167) + x147);
371 var x169: u64 = undefined;
372 var x170: u1 = undefined;
373 addcarryxU64(&x169, &x170, 0x0, x133, x156);
374 var x171: u64 = undefined;
375 var x172: u1 = undefined;
376 addcarryxU64(&x171, &x172, x170, x135, x158);
377 var x173: u64 = undefined;
378 var x174: u1 = undefined;
379 addcarryxU64(&x173, &x174, x172, x137, x160);
380 var x175: u64 = undefined;
381 var x176: u1 = undefined;
382 addcarryxU64(&x175, &x176, x174, x139, x162);
383 var x177: u64 = undefined;
384 var x178: u1 = undefined;
385 addcarryxU64(&x177, &x178, x176, x141, x164);
386 var x179: u64 = undefined;
387 var x180: u1 = undefined;
388 addcarryxU64(&x179, &x180, x178, x143, x166);
389 var x181: u64 = undefined;
390 var x182: u1 = undefined;
391 addcarryxU64(&x181, &x182, x180, x145, x168);
392 var x183: u64 = undefined;
393 var x184: u64 = undefined;
394 mulxU64(&x183, &x184, x169, 0x6ed46089e88fdc45);
395 var x185: u64 = undefined;
396 var x186: u64 = undefined;
397 mulxU64(&x185, &x186, x183, 0xffffffffffffffff);
398 var x187: u64 = undefined;
399 var x188: u64 = undefined;
400 mulxU64(&x187, &x188, x183, 0xffffffffffffffff);
401 var x189: u64 = undefined;
402 var x190: u64 = undefined;
403 mulxU64(&x189, &x190, x183, 0xffffffffffffffff);
404 var x191: u64 = undefined;
405 var x192: u64 = undefined;
406 mulxU64(&x191, &x192, x183, 0xc7634d81f4372ddf);
407 var x193: u64 = undefined;
408 var x194: u64 = undefined;
409 mulxU64(&x193, &x194, x183, 0x581a0db248b0a77a);
410 var x195: u64 = undefined;
411 var x196: u64 = undefined;
412 mulxU64(&x195, &x196, x183, 0xecec196accc52973);
413 var x197: u64 = undefined;
414 var x198: u1 = undefined;
415 addcarryxU64(&x197, &x198, 0x0, x196, x193);
416 var x199: u64 = undefined;
417 var x200: u1 = undefined;
418 addcarryxU64(&x199, &x200, x198, x194, x191);
419 var x201: u64 = undefined;
420 var x202: u1 = undefined;
421 addcarryxU64(&x201, &x202, x200, x192, x189);
422 var x203: u64 = undefined;
423 var x204: u1 = undefined;
424 addcarryxU64(&x203, &x204, x202, x190, x187);
425 var x205: u64 = undefined;
426 var x206: u1 = undefined;
427 addcarryxU64(&x205, &x206, x204, x188, x185);
428 const x207 = (@as(u64, x206) + x186);
429 var x208: u64 = undefined;
430 var x209: u1 = undefined;
431 addcarryxU64(&x208, &x209, 0x0, x169, x195);
432 var x210: u64 = undefined;
433 var x211: u1 = undefined;
434 addcarryxU64(&x210, &x211, x209, x171, x197);
435 var x212: u64 = undefined;
436 var x213: u1 = undefined;
437 addcarryxU64(&x212, &x213, x211, x173, x199);
438 var x214: u64 = undefined;
439 var x215: u1 = undefined;
440 addcarryxU64(&x214, &x215, x213, x175, x201);
441 var x216: u64 = undefined;
442 var x217: u1 = undefined;
443 addcarryxU64(&x216, &x217, x215, x177, x203);
444 var x218: u64 = undefined;
445 var x219: u1 = undefined;
446 addcarryxU64(&x218, &x219, x217, x179, x205);
447 var x220: u64 = undefined;
448 var x221: u1 = undefined;
449 addcarryxU64(&x220, &x221, x219, x181, x207);
450 const x222 = (@as(u64, x221) + @as(u64, x182));
451 var x223: u64 = undefined;
452 var x224: u64 = undefined;
453 mulxU64(&x223, &x224, x3, (arg2[5]));
454 var x225: u64 = undefined;
455 var x226: u64 = undefined;
456 mulxU64(&x225, &x226, x3, (arg2[4]));
457 var x227: u64 = undefined;
458 var x228: u64 = undefined;
459 mulxU64(&x227, &x228, x3, (arg2[3]));
460 var x229: u64 = undefined;
461 var x230: u64 = undefined;
462 mulxU64(&x229, &x230, x3, (arg2[2]));
463 var x231: u64 = undefined;
464 var x232: u64 = undefined;
465 mulxU64(&x231, &x232, x3, (arg2[1]));
466 var x233: u64 = undefined;
467 var x234: u64 = undefined;
468 mulxU64(&x233, &x234, x3, (arg2[0]));
469 var x235: u64 = undefined;
470 var x236: u1 = undefined;
471 addcarryxU64(&x235, &x236, 0x0, x234, x231);
472 var x237: u64 = undefined;
473 var x238: u1 = undefined;
474 addcarryxU64(&x237, &x238, x236, x232, x229);
475 var x239: u64 = undefined;
476 var x240: u1 = undefined;
477 addcarryxU64(&x239, &x240, x238, x230, x227);
478 var x241: u64 = undefined;
479 var x242: u1 = undefined;
480 addcarryxU64(&x241, &x242, x240, x228, x225);
481 var x243: u64 = undefined;
482 var x244: u1 = undefined;
483 addcarryxU64(&x243, &x244, x242, x226, x223);
484 const x245 = (@as(u64, x244) + x224);
485 var x246: u64 = undefined;
486 var x247: u1 = undefined;
487 addcarryxU64(&x246, &x247, 0x0, x210, x233);
488 var x248: u64 = undefined;
489 var x249: u1 = undefined;
490 addcarryxU64(&x248, &x249, x247, x212, x235);
491 var x250: u64 = undefined;
492 var x251: u1 = undefined;
493 addcarryxU64(&x250, &x251, x249, x214, x237);
494 var x252: u64 = undefined;
495 var x253: u1 = undefined;
496 addcarryxU64(&x252, &x253, x251, x216, x239);
497 var x254: u64 = undefined;
498 var x255: u1 = undefined;
499 addcarryxU64(&x254, &x255, x253, x218, x241);
500 var x256: u64 = undefined;
501 var x257: u1 = undefined;
502 addcarryxU64(&x256, &x257, x255, x220, x243);
503 var x258: u64 = undefined;
504 var x259: u1 = undefined;
505 addcarryxU64(&x258, &x259, x257, x222, x245);
506 var x260: u64 = undefined;
507 var x261: u64 = undefined;
508 mulxU64(&x260, &x261, x246, 0x6ed46089e88fdc45);
509 var x262: u64 = undefined;
510 var x263: u64 = undefined;
511 mulxU64(&x262, &x263, x260, 0xffffffffffffffff);
512 var x264: u64 = undefined;
513 var x265: u64 = undefined;
514 mulxU64(&x264, &x265, x260, 0xffffffffffffffff);
515 var x266: u64 = undefined;
516 var x267: u64 = undefined;
517 mulxU64(&x266, &x267, x260, 0xffffffffffffffff);
518 var x268: u64 = undefined;
519 var x269: u64 = undefined;
520 mulxU64(&x268, &x269, x260, 0xc7634d81f4372ddf);
521 var x270: u64 = undefined;
522 var x271: u64 = undefined;
523 mulxU64(&x270, &x271, x260, 0x581a0db248b0a77a);
524 var x272: u64 = undefined;
525 var x273: u64 = undefined;
526 mulxU64(&x272, &x273, x260, 0xecec196accc52973);
527 var x274: u64 = undefined;
528 var x275: u1 = undefined;
529 addcarryxU64(&x274, &x275, 0x0, x273, x270);
530 var x276: u64 = undefined;
531 var x277: u1 = undefined;
532 addcarryxU64(&x276, &x277, x275, x271, x268);
533 var x278: u64 = undefined;
534 var x279: u1 = undefined;
535 addcarryxU64(&x278, &x279, x277, x269, x266);
536 var x280: u64 = undefined;
537 var x281: u1 = undefined;
538 addcarryxU64(&x280, &x281, x279, x267, x264);
539 var x282: u64 = undefined;
540 var x283: u1 = undefined;
541 addcarryxU64(&x282, &x283, x281, x265, x262);
542 const x284 = (@as(u64, x283) + x263);
543 var x285: u64 = undefined;
544 var x286: u1 = undefined;
545 addcarryxU64(&x285, &x286, 0x0, x246, x272);
546 var x287: u64 = undefined;
547 var x288: u1 = undefined;
548 addcarryxU64(&x287, &x288, x286, x248, x274);
549 var x289: u64 = undefined;
550 var x290: u1 = undefined;
551 addcarryxU64(&x289, &x290, x288, x250, x276);
552 var x291: u64 = undefined;
553 var x292: u1 = undefined;
554 addcarryxU64(&x291, &x292, x290, x252, x278);
555 var x293: u64 = undefined;
556 var x294: u1 = undefined;
557 addcarryxU64(&x293, &x294, x292, x254, x280);
558 var x295: u64 = undefined;
559 var x296: u1 = undefined;
560 addcarryxU64(&x295, &x296, x294, x256, x282);
561 var x297: u64 = undefined;
562 var x298: u1 = undefined;
563 addcarryxU64(&x297, &x298, x296, x258, x284);
564 const x299 = (@as(u64, x298) + @as(u64, x259));
565 var x300: u64 = undefined;
566 var x301: u64 = undefined;
567 mulxU64(&x300, &x301, x4, (arg2[5]));
568 var x302: u64 = undefined;
569 var x303: u64 = undefined;
570 mulxU64(&x302, &x303, x4, (arg2[4]));
571 var x304: u64 = undefined;
572 var x305: u64 = undefined;
573 mulxU64(&x304, &x305, x4, (arg2[3]));
574 var x306: u64 = undefined;
575 var x307: u64 = undefined;
576 mulxU64(&x306, &x307, x4, (arg2[2]));
577 var x308: u64 = undefined;
578 var x309: u64 = undefined;
579 mulxU64(&x308, &x309, x4, (arg2[1]));
580 var x310: u64 = undefined;
581 var x311: u64 = undefined;
582 mulxU64(&x310, &x311, x4, (arg2[0]));
583 var x312: u64 = undefined;
584 var x313: u1 = undefined;
585 addcarryxU64(&x312, &x313, 0x0, x311, x308);
586 var x314: u64 = undefined;
587 var x315: u1 = undefined;
588 addcarryxU64(&x314, &x315, x313, x309, x306);
589 var x316: u64 = undefined;
590 var x317: u1 = undefined;
591 addcarryxU64(&x316, &x317, x315, x307, x304);
592 var x318: u64 = undefined;
593 var x319: u1 = undefined;
594 addcarryxU64(&x318, &x319, x317, x305, x302);
595 var x320: u64 = undefined;
596 var x321: u1 = undefined;
597 addcarryxU64(&x320, &x321, x319, x303, x300);
598 const x322 = (@as(u64, x321) + x301);
599 var x323: u64 = undefined;
600 var x324: u1 = undefined;
601 addcarryxU64(&x323, &x324, 0x0, x287, x310);
602 var x325: u64 = undefined;
603 var x326: u1 = undefined;
604 addcarryxU64(&x325, &x326, x324, x289, x312);
605 var x327: u64 = undefined;
606 var x328: u1 = undefined;
607 addcarryxU64(&x327, &x328, x326, x291, x314);
608 var x329: u64 = undefined;
609 var x330: u1 = undefined;
610 addcarryxU64(&x329, &x330, x328, x293, x316);
611 var x331: u64 = undefined;
612 var x332: u1 = undefined;
613 addcarryxU64(&x331, &x332, x330, x295, x318);
614 var x333: u64 = undefined;
615 var x334: u1 = undefined;
616 addcarryxU64(&x333, &x334, x332, x297, x320);
617 var x335: u64 = undefined;
618 var x336: u1 = undefined;
619 addcarryxU64(&x335, &x336, x334, x299, x322);
620 var x337: u64 = undefined;
621 var x338: u64 = undefined;
622 mulxU64(&x337, &x338, x323, 0x6ed46089e88fdc45);
623 var x339: u64 = undefined;
624 var x340: u64 = undefined;
625 mulxU64(&x339, &x340, x337, 0xffffffffffffffff);
626 var x341: u64 = undefined;
627 var x342: u64 = undefined;
628 mulxU64(&x341, &x342, x337, 0xffffffffffffffff);
629 var x343: u64 = undefined;
630 var x344: u64 = undefined;
631 mulxU64(&x343, &x344, x337, 0xffffffffffffffff);
632 var x345: u64 = undefined;
633 var x346: u64 = undefined;
634 mulxU64(&x345, &x346, x337, 0xc7634d81f4372ddf);
635 var x347: u64 = undefined;
636 var x348: u64 = undefined;
637 mulxU64(&x347, &x348, x337, 0x581a0db248b0a77a);
638 var x349: u64 = undefined;
639 var x350: u64 = undefined;
640 mulxU64(&x349, &x350, x337, 0xecec196accc52973);
641 var x351: u64 = undefined;
642 var x352: u1 = undefined;
643 addcarryxU64(&x351, &x352, 0x0, x350, x347);
644 var x353: u64 = undefined;
645 var x354: u1 = undefined;
646 addcarryxU64(&x353, &x354, x352, x348, x345);
647 var x355: u64 = undefined;
648 var x356: u1 = undefined;
649 addcarryxU64(&x355, &x356, x354, x346, x343);
650 var x357: u64 = undefined;
651 var x358: u1 = undefined;
652 addcarryxU64(&x357, &x358, x356, x344, x341);
653 var x359: u64 = undefined;
654 var x360: u1 = undefined;
655 addcarryxU64(&x359, &x360, x358, x342, x339);
656 const x361 = (@as(u64, x360) + x340);
657 var x362: u64 = undefined;
658 var x363: u1 = undefined;
659 addcarryxU64(&x362, &x363, 0x0, x323, x349);
660 var x364: u64 = undefined;
661 var x365: u1 = undefined;
662 addcarryxU64(&x364, &x365, x363, x325, x351);
663 var x366: u64 = undefined;
664 var x367: u1 = undefined;
665 addcarryxU64(&x366, &x367, x365, x327, x353);
666 var x368: u64 = undefined;
667 var x369: u1 = undefined;
668 addcarryxU64(&x368, &x369, x367, x329, x355);
669 var x370: u64 = undefined;
670 var x371: u1 = undefined;
671 addcarryxU64(&x370, &x371, x369, x331, x357);
672 var x372: u64 = undefined;
673 var x373: u1 = undefined;
674 addcarryxU64(&x372, &x373, x371, x333, x359);
675 var x374: u64 = undefined;
676 var x375: u1 = undefined;
677 addcarryxU64(&x374, &x375, x373, x335, x361);
678 const x376 = (@as(u64, x375) + @as(u64, x336));
679 var x377: u64 = undefined;
680 var x378: u64 = undefined;
681 mulxU64(&x377, &x378, x5, (arg2[5]));
682 var x379: u64 = undefined;
683 var x380: u64 = undefined;
684 mulxU64(&x379, &x380, x5, (arg2[4]));
685 var x381: u64 = undefined;
686 var x382: u64 = undefined;
687 mulxU64(&x381, &x382, x5, (arg2[3]));
688 var x383: u64 = undefined;
689 var x384: u64 = undefined;
690 mulxU64(&x383, &x384, x5, (arg2[2]));
691 var x385: u64 = undefined;
692 var x386: u64 = undefined;
693 mulxU64(&x385, &x386, x5, (arg2[1]));
694 var x387: u64 = undefined;
695 var x388: u64 = undefined;
696 mulxU64(&x387, &x388, x5, (arg2[0]));
697 var x389: u64 = undefined;
698 var x390: u1 = undefined;
699 addcarryxU64(&x389, &x390, 0x0, x388, x385);
700 var x391: u64 = undefined;
701 var x392: u1 = undefined;
702 addcarryxU64(&x391, &x392, x390, x386, x383);
703 var x393: u64 = undefined;
704 var x394: u1 = undefined;
705 addcarryxU64(&x393, &x394, x392, x384, x381);
706 var x395: u64 = undefined;
707 var x396: u1 = undefined;
708 addcarryxU64(&x395, &x396, x394, x382, x379);
709 var x397: u64 = undefined;
710 var x398: u1 = undefined;
711 addcarryxU64(&x397, &x398, x396, x380, x377);
712 const x399 = (@as(u64, x398) + x378);
713 var x400: u64 = undefined;
714 var x401: u1 = undefined;
715 addcarryxU64(&x400, &x401, 0x0, x364, x387);
716 var x402: u64 = undefined;
717 var x403: u1 = undefined;
718 addcarryxU64(&x402, &x403, x401, x366, x389);
719 var x404: u64 = undefined;
720 var x405: u1 = undefined;
721 addcarryxU64(&x404, &x405, x403, x368, x391);
722 var x406: u64 = undefined;
723 var x407: u1 = undefined;
724 addcarryxU64(&x406, &x407, x405, x370, x393);
725 var x408: u64 = undefined;
726 var x409: u1 = undefined;
727 addcarryxU64(&x408, &x409, x407, x372, x395);
728 var x410: u64 = undefined;
729 var x411: u1 = undefined;
730 addcarryxU64(&x410, &x411, x409, x374, x397);
731 var x412: u64 = undefined;
732 var x413: u1 = undefined;
733 addcarryxU64(&x412, &x413, x411, x376, x399);
734 var x414: u64 = undefined;
735 var x415: u64 = undefined;
736 mulxU64(&x414, &x415, x400, 0x6ed46089e88fdc45);
737 var x416: u64 = undefined;
738 var x417: u64 = undefined;
739 mulxU64(&x416, &x417, x414, 0xffffffffffffffff);
740 var x418: u64 = undefined;
741 var x419: u64 = undefined;
742 mulxU64(&x418, &x419, x414, 0xffffffffffffffff);
743 var x420: u64 = undefined;
744 var x421: u64 = undefined;
745 mulxU64(&x420, &x421, x414, 0xffffffffffffffff);
746 var x422: u64 = undefined;
747 var x423: u64 = undefined;
748 mulxU64(&x422, &x423, x414, 0xc7634d81f4372ddf);
749 var x424: u64 = undefined;
750 var x425: u64 = undefined;
751 mulxU64(&x424, &x425, x414, 0x581a0db248b0a77a);
752 var x426: u64 = undefined;
753 var x427: u64 = undefined;
754 mulxU64(&x426, &x427, x414, 0xecec196accc52973);
755 var x428: u64 = undefined;
756 var x429: u1 = undefined;
757 addcarryxU64(&x428, &x429, 0x0, x427, x424);
758 var x430: u64 = undefined;
759 var x431: u1 = undefined;
760 addcarryxU64(&x430, &x431, x429, x425, x422);
761 var x432: u64 = undefined;
762 var x433: u1 = undefined;
763 addcarryxU64(&x432, &x433, x431, x423, x420);
764 var x434: u64 = undefined;
765 var x435: u1 = undefined;
766 addcarryxU64(&x434, &x435, x433, x421, x418);
767 var x436: u64 = undefined;
768 var x437: u1 = undefined;
769 addcarryxU64(&x436, &x437, x435, x419, x416);
770 const x438 = (@as(u64, x437) + x417);
771 var x439: u64 = undefined;
772 var x440: u1 = undefined;
773 addcarryxU64(&x439, &x440, 0x0, x400, x426);
774 var x441: u64 = undefined;
775 var x442: u1 = undefined;
776 addcarryxU64(&x441, &x442, x440, x402, x428);
777 var x443: u64 = undefined;
778 var x444: u1 = undefined;
779 addcarryxU64(&x443, &x444, x442, x404, x430);
780 var x445: u64 = undefined;
781 var x446: u1 = undefined;
782 addcarryxU64(&x445, &x446, x444, x406, x432);
783 var x447: u64 = undefined;
784 var x448: u1 = undefined;
785 addcarryxU64(&x447, &x448, x446, x408, x434);
786 var x449: u64 = undefined;
787 var x450: u1 = undefined;
788 addcarryxU64(&x449, &x450, x448, x410, x436);
789 var x451: u64 = undefined;
790 var x452: u1 = undefined;
791 addcarryxU64(&x451, &x452, x450, x412, x438);
792 const x453 = (@as(u64, x452) + @as(u64, x413));
793 var x454: u64 = undefined;
794 var x455: u1 = undefined;
795 subborrowxU64(&x454, &x455, 0x0, x441, 0xecec196accc52973);
796 var x456: u64 = undefined;
797 var x457: u1 = undefined;
798 subborrowxU64(&x456, &x457, x455, x443, 0x581a0db248b0a77a);
799 var x458: u64 = undefined;
800 var x459: u1 = undefined;
801 subborrowxU64(&x458, &x459, x457, x445, 0xc7634d81f4372ddf);
802 var x460: u64 = undefined;
803 var x461: u1 = undefined;
804 subborrowxU64(&x460, &x461, x459, x447, 0xffffffffffffffff);
805 var x462: u64 = undefined;
806 var x463: u1 = undefined;
807 subborrowxU64(&x462, &x463, x461, x449, 0xffffffffffffffff);
808 var x464: u64 = undefined;
809 var x465: u1 = undefined;
810 subborrowxU64(&x464, &x465, x463, x451, 0xffffffffffffffff);
811 var x466: u64 = undefined;
812 var x467: u1 = undefined;
813 subborrowxU64(&x466, &x467, x465, x453, 0x0);
814 var x468: u64 = undefined;
815 cmovznzU64(&x468, x467, x454, x441);
816 var x469: u64 = undefined;
817 cmovznzU64(&x469, x467, x456, x443);
818 var x470: u64 = undefined;
819 cmovznzU64(&x470, x467, x458, x445);
820 var x471: u64 = undefined;
821 cmovznzU64(&x471, x467, x460, x447);
822 var x472: u64 = undefined;
823 cmovznzU64(&x472, x467, x462, x449);
824 var x473: u64 = undefined;
825 cmovznzU64(&x473, x467, x464, x451);
826 out1[0] = x468;
827 out1[1] = x469;
828 out1[2] = x470;
829 out1[3] = x471;
830 out1[4] = x472;
831 out1[5] = x473;
832}
833
834/// The function square squares a field element in the Montgomery domain.
835///
836/// Preconditions:
837/// 0 ≤ eval arg1 < m
838/// Postconditions:
839/// eval (from_montgomery out1) mod m = (eval (from_montgomery arg1) * eval (from_montgomery arg1)) mod m
840/// 0 ≤ eval out1 < m
841///
842pub fn square(out1: *MontgomeryDomainFieldElement, arg1: MontgomeryDomainFieldElement) void {
843 @setRuntimeSafety(mode == .Debug);
844
845 const x1 = (arg1[1]);
846 const x2 = (arg1[2]);
847 const x3 = (arg1[3]);
848 const x4 = (arg1[4]);
849 const x5 = (arg1[5]);
850 const x6 = (arg1[0]);
851 var x7: u64 = undefined;
852 var x8: u64 = undefined;
853 mulxU64(&x7, &x8, x6, (arg1[5]));
854 var x9: u64 = undefined;
855 var x10: u64 = undefined;
856 mulxU64(&x9, &x10, x6, (arg1[4]));
857 var x11: u64 = undefined;
858 var x12: u64 = undefined;
859 mulxU64(&x11, &x12, x6, (arg1[3]));
860 var x13: u64 = undefined;
861 var x14: u64 = undefined;
862 mulxU64(&x13, &x14, x6, (arg1[2]));
863 var x15: u64 = undefined;
864 var x16: u64 = undefined;
865 mulxU64(&x15, &x16, x6, (arg1[1]));
866 var x17: u64 = undefined;
867 var x18: u64 = undefined;
868 mulxU64(&x17, &x18, x6, (arg1[0]));
869 var x19: u64 = undefined;
870 var x20: u1 = undefined;
871 addcarryxU64(&x19, &x20, 0x0, x18, x15);
872 var x21: u64 = undefined;
873 var x22: u1 = undefined;
874 addcarryxU64(&x21, &x22, x20, x16, x13);
875 var x23: u64 = undefined;
876 var x24: u1 = undefined;
877 addcarryxU64(&x23, &x24, x22, x14, x11);
878 var x25: u64 = undefined;
879 var x26: u1 = undefined;
880 addcarryxU64(&x25, &x26, x24, x12, x9);
881 var x27: u64 = undefined;
882 var x28: u1 = undefined;
883 addcarryxU64(&x27, &x28, x26, x10, x7);
884 const x29 = (@as(u64, x28) + x8);
885 var x30: u64 = undefined;
886 var x31: u64 = undefined;
887 mulxU64(&x30, &x31, x17, 0x6ed46089e88fdc45);
888 var x32: u64 = undefined;
889 var x33: u64 = undefined;
890 mulxU64(&x32, &x33, x30, 0xffffffffffffffff);
891 var x34: u64 = undefined;
892 var x35: u64 = undefined;
893 mulxU64(&x34, &x35, x30, 0xffffffffffffffff);
894 var x36: u64 = undefined;
895 var x37: u64 = undefined;
896 mulxU64(&x36, &x37, x30, 0xffffffffffffffff);
897 var x38: u64 = undefined;
898 var x39: u64 = undefined;
899 mulxU64(&x38, &x39, x30, 0xc7634d81f4372ddf);
900 var x40: u64 = undefined;
901 var x41: u64 = undefined;
902 mulxU64(&x40, &x41, x30, 0x581a0db248b0a77a);
903 var x42: u64 = undefined;
904 var x43: u64 = undefined;
905 mulxU64(&x42, &x43, x30, 0xecec196accc52973);
906 var x44: u64 = undefined;
907 var x45: u1 = undefined;
908 addcarryxU64(&x44, &x45, 0x0, x43, x40);
909 var x46: u64 = undefined;
910 var x47: u1 = undefined;
911 addcarryxU64(&x46, &x47, x45, x41, x38);
912 var x48: u64 = undefined;
913 var x49: u1 = undefined;
914 addcarryxU64(&x48, &x49, x47, x39, x36);
915 var x50: u64 = undefined;
916 var x51: u1 = undefined;
917 addcarryxU64(&x50, &x51, x49, x37, x34);
918 var x52: u64 = undefined;
919 var x53: u1 = undefined;
920 addcarryxU64(&x52, &x53, x51, x35, x32);
921 const x54 = (@as(u64, x53) + x33);
922 var x55: u64 = undefined;
923 var x56: u1 = undefined;
924 addcarryxU64(&x55, &x56, 0x0, x17, x42);
925 var x57: u64 = undefined;
926 var x58: u1 = undefined;
927 addcarryxU64(&x57, &x58, x56, x19, x44);
928 var x59: u64 = undefined;
929 var x60: u1 = undefined;
930 addcarryxU64(&x59, &x60, x58, x21, x46);
931 var x61: u64 = undefined;
932 var x62: u1 = undefined;
933 addcarryxU64(&x61, &x62, x60, x23, x48);
934 var x63: u64 = undefined;
935 var x64: u1 = undefined;
936 addcarryxU64(&x63, &x64, x62, x25, x50);
937 var x65: u64 = undefined;
938 var x66: u1 = undefined;
939 addcarryxU64(&x65, &x66, x64, x27, x52);
940 var x67: u64 = undefined;
941 var x68: u1 = undefined;
942 addcarryxU64(&x67, &x68, x66, x29, x54);
943 var x69: u64 = undefined;
944 var x70: u64 = undefined;
945 mulxU64(&x69, &x70, x1, (arg1[5]));
946 var x71: u64 = undefined;
947 var x72: u64 = undefined;
948 mulxU64(&x71, &x72, x1, (arg1[4]));
949 var x73: u64 = undefined;
950 var x74: u64 = undefined;
951 mulxU64(&x73, &x74, x1, (arg1[3]));
952 var x75: u64 = undefined;
953 var x76: u64 = undefined;
954 mulxU64(&x75, &x76, x1, (arg1[2]));
955 var x77: u64 = undefined;
956 var x78: u64 = undefined;
957 mulxU64(&x77, &x78, x1, (arg1[1]));
958 var x79: u64 = undefined;
959 var x80: u64 = undefined;
960 mulxU64(&x79, &x80, x1, (arg1[0]));
961 var x81: u64 = undefined;
962 var x82: u1 = undefined;
963 addcarryxU64(&x81, &x82, 0x0, x80, x77);
964 var x83: u64 = undefined;
965 var x84: u1 = undefined;
966 addcarryxU64(&x83, &x84, x82, x78, x75);
967 var x85: u64 = undefined;
968 var x86: u1 = undefined;
969 addcarryxU64(&x85, &x86, x84, x76, x73);
970 var x87: u64 = undefined;
971 var x88: u1 = undefined;
972 addcarryxU64(&x87, &x88, x86, x74, x71);
973 var x89: u64 = undefined;
974 var x90: u1 = undefined;
975 addcarryxU64(&x89, &x90, x88, x72, x69);
976 const x91 = (@as(u64, x90) + x70);
977 var x92: u64 = undefined;
978 var x93: u1 = undefined;
979 addcarryxU64(&x92, &x93, 0x0, x57, x79);
980 var x94: u64 = undefined;
981 var x95: u1 = undefined;
982 addcarryxU64(&x94, &x95, x93, x59, x81);
983 var x96: u64 = undefined;
984 var x97: u1 = undefined;
985 addcarryxU64(&x96, &x97, x95, x61, x83);
986 var x98: u64 = undefined;
987 var x99: u1 = undefined;
988 addcarryxU64(&x98, &x99, x97, x63, x85);
989 var x100: u64 = undefined;
990 var x101: u1 = undefined;
991 addcarryxU64(&x100, &x101, x99, x65, x87);
992 var x102: u64 = undefined;
993 var x103: u1 = undefined;
994 addcarryxU64(&x102, &x103, x101, x67, x89);
995 var x104: u64 = undefined;
996 var x105: u1 = undefined;
997 addcarryxU64(&x104, &x105, x103, @as(u64, x68), x91);
998 var x106: u64 = undefined;
999 var x107: u64 = undefined;
1000 mulxU64(&x106, &x107, x92, 0x6ed46089e88fdc45);
1001 var x108: u64 = undefined;
1002 var x109: u64 = undefined;
1003 mulxU64(&x108, &x109, x106, 0xffffffffffffffff);
1004 var x110: u64 = undefined;
1005 var x111: u64 = undefined;
1006 mulxU64(&x110, &x111, x106, 0xffffffffffffffff);
1007 var x112: u64 = undefined;
1008 var x113: u64 = undefined;
1009 mulxU64(&x112, &x113, x106, 0xffffffffffffffff);
1010 var x114: u64 = undefined;
1011 var x115: u64 = undefined;
1012 mulxU64(&x114, &x115, x106, 0xc7634d81f4372ddf);
1013 var x116: u64 = undefined;
1014 var x117: u64 = undefined;
1015 mulxU64(&x116, &x117, x106, 0x581a0db248b0a77a);
1016 var x118: u64 = undefined;
1017 var x119: u64 = undefined;
1018 mulxU64(&x118, &x119, x106, 0xecec196accc52973);
1019 var x120: u64 = undefined;
1020 var x121: u1 = undefined;
1021 addcarryxU64(&x120, &x121, 0x0, x119, x116);
1022 var x122: u64 = undefined;
1023 var x123: u1 = undefined;
1024 addcarryxU64(&x122, &x123, x121, x117, x114);
1025 var x124: u64 = undefined;
1026 var x125: u1 = undefined;
1027 addcarryxU64(&x124, &x125, x123, x115, x112);
1028 var x126: u64 = undefined;
1029 var x127: u1 = undefined;
1030 addcarryxU64(&x126, &x127, x125, x113, x110);
1031 var x128: u64 = undefined;
1032 var x129: u1 = undefined;
1033 addcarryxU64(&x128, &x129, x127, x111, x108);
1034 const x130 = (@as(u64, x129) + x109);
1035 var x131: u64 = undefined;
1036 var x132: u1 = undefined;
1037 addcarryxU64(&x131, &x132, 0x0, x92, x118);
1038 var x133: u64 = undefined;
1039 var x134: u1 = undefined;
1040 addcarryxU64(&x133, &x134, x132, x94, x120);
1041 var x135: u64 = undefined;
1042 var x136: u1 = undefined;
1043 addcarryxU64(&x135, &x136, x134, x96, x122);
1044 var x137: u64 = undefined;
1045 var x138: u1 = undefined;
1046 addcarryxU64(&x137, &x138, x136, x98, x124);
1047 var x139: u64 = undefined;
1048 var x140: u1 = undefined;
1049 addcarryxU64(&x139, &x140, x138, x100, x126);
1050 var x141: u64 = undefined;
1051 var x142: u1 = undefined;
1052 addcarryxU64(&x141, &x142, x140, x102, x128);
1053 var x143: u64 = undefined;
1054 var x144: u1 = undefined;
1055 addcarryxU64(&x143, &x144, x142, x104, x130);
1056 const x145 = (@as(u64, x144) + @as(u64, x105));
1057 var x146: u64 = undefined;
1058 var x147: u64 = undefined;
1059 mulxU64(&x146, &x147, x2, (arg1[5]));
1060 var x148: u64 = undefined;
1061 var x149: u64 = undefined;
1062 mulxU64(&x148, &x149, x2, (arg1[4]));
1063 var x150: u64 = undefined;
1064 var x151: u64 = undefined;
1065 mulxU64(&x150, &x151, x2, (arg1[3]));
1066 var x152: u64 = undefined;
1067 var x153: u64 = undefined;
1068 mulxU64(&x152, &x153, x2, (arg1[2]));
1069 var x154: u64 = undefined;
1070 var x155: u64 = undefined;
1071 mulxU64(&x154, &x155, x2, (arg1[1]));
1072 var x156: u64 = undefined;
1073 var x157: u64 = undefined;
1074 mulxU64(&x156, &x157, x2, (arg1[0]));
1075 var x158: u64 = undefined;
1076 var x159: u1 = undefined;
1077 addcarryxU64(&x158, &x159, 0x0, x157, x154);
1078 var x160: u64 = undefined;
1079 var x161: u1 = undefined;
1080 addcarryxU64(&x160, &x161, x159, x155, x152);
1081 var x162: u64 = undefined;
1082 var x163: u1 = undefined;
1083 addcarryxU64(&x162, &x163, x161, x153, x150);
1084 var x164: u64 = undefined;
1085 var x165: u1 = undefined;
1086 addcarryxU64(&x164, &x165, x163, x151, x148);
1087 var x166: u64 = undefined;
1088 var x167: u1 = undefined;
1089 addcarryxU64(&x166, &x167, x165, x149, x146);
1090 const x168 = (@as(u64, x167) + x147);
1091 var x169: u64 = undefined;
1092 var x170: u1 = undefined;
1093 addcarryxU64(&x169, &x170, 0x0, x133, x156);
1094 var x171: u64 = undefined;
1095 var x172: u1 = undefined;
1096 addcarryxU64(&x171, &x172, x170, x135, x158);
1097 var x173: u64 = undefined;
1098 var x174: u1 = undefined;
1099 addcarryxU64(&x173, &x174, x172, x137, x160);
1100 var x175: u64 = undefined;
1101 var x176: u1 = undefined;
1102 addcarryxU64(&x175, &x176, x174, x139, x162);
1103 var x177: u64 = undefined;
1104 var x178: u1 = undefined;
1105 addcarryxU64(&x177, &x178, x176, x141, x164);
1106 var x179: u64 = undefined;
1107 var x180: u1 = undefined;
1108 addcarryxU64(&x179, &x180, x178, x143, x166);
1109 var x181: u64 = undefined;
1110 var x182: u1 = undefined;
1111 addcarryxU64(&x181, &x182, x180, x145, x168);
1112 var x183: u64 = undefined;
1113 var x184: u64 = undefined;
1114 mulxU64(&x183, &x184, x169, 0x6ed46089e88fdc45);
1115 var x185: u64 = undefined;
1116 var x186: u64 = undefined;
1117 mulxU64(&x185, &x186, x183, 0xffffffffffffffff);
1118 var x187: u64 = undefined;
1119 var x188: u64 = undefined;
1120 mulxU64(&x187, &x188, x183, 0xffffffffffffffff);
1121 var x189: u64 = undefined;
1122 var x190: u64 = undefined;
1123 mulxU64(&x189, &x190, x183, 0xffffffffffffffff);
1124 var x191: u64 = undefined;
1125 var x192: u64 = undefined;
1126 mulxU64(&x191, &x192, x183, 0xc7634d81f4372ddf);
1127 var x193: u64 = undefined;
1128 var x194: u64 = undefined;
1129 mulxU64(&x193, &x194, x183, 0x581a0db248b0a77a);
1130 var x195: u64 = undefined;
1131 var x196: u64 = undefined;
1132 mulxU64(&x195, &x196, x183, 0xecec196accc52973);
1133 var x197: u64 = undefined;
1134 var x198: u1 = undefined;
1135 addcarryxU64(&x197, &x198, 0x0, x196, x193);
1136 var x199: u64 = undefined;
1137 var x200: u1 = undefined;
1138 addcarryxU64(&x199, &x200, x198, x194, x191);
1139 var x201: u64 = undefined;
1140 var x202: u1 = undefined;
1141 addcarryxU64(&x201, &x202, x200, x192, x189);
1142 var x203: u64 = undefined;
1143 var x204: u1 = undefined;
1144 addcarryxU64(&x203, &x204, x202, x190, x187);
1145 var x205: u64 = undefined;
1146 var x206: u1 = undefined;
1147 addcarryxU64(&x205, &x206, x204, x188, x185);
1148 const x207 = (@as(u64, x206) + x186);
1149 var x208: u64 = undefined;
1150 var x209: u1 = undefined;
1151 addcarryxU64(&x208, &x209, 0x0, x169, x195);
1152 var x210: u64 = undefined;
1153 var x211: u1 = undefined;
1154 addcarryxU64(&x210, &x211, x209, x171, x197);
1155 var x212: u64 = undefined;
1156 var x213: u1 = undefined;
1157 addcarryxU64(&x212, &x213, x211, x173, x199);
1158 var x214: u64 = undefined;
1159 var x215: u1 = undefined;
1160 addcarryxU64(&x214, &x215, x213, x175, x201);
1161 var x216: u64 = undefined;
1162 var x217: u1 = undefined;
1163 addcarryxU64(&x216, &x217, x215, x177, x203);
1164 var x218: u64 = undefined;
1165 var x219: u1 = undefined;
1166 addcarryxU64(&x218, &x219, x217, x179, x205);
1167 var x220: u64 = undefined;
1168 var x221: u1 = undefined;
1169 addcarryxU64(&x220, &x221, x219, x181, x207);
1170 const x222 = (@as(u64, x221) + @as(u64, x182));
1171 var x223: u64 = undefined;
1172 var x224: u64 = undefined;
1173 mulxU64(&x223, &x224, x3, (arg1[5]));
1174 var x225: u64 = undefined;
1175 var x226: u64 = undefined;
1176 mulxU64(&x225, &x226, x3, (arg1[4]));
1177 var x227: u64 = undefined;
1178 var x228: u64 = undefined;
1179 mulxU64(&x227, &x228, x3, (arg1[3]));
1180 var x229: u64 = undefined;
1181 var x230: u64 = undefined;
1182 mulxU64(&x229, &x230, x3, (arg1[2]));
1183 var x231: u64 = undefined;
1184 var x232: u64 = undefined;
1185 mulxU64(&x231, &x232, x3, (arg1[1]));
1186 var x233: u64 = undefined;
1187 var x234: u64 = undefined;
1188 mulxU64(&x233, &x234, x3, (arg1[0]));
1189 var x235: u64 = undefined;
1190 var x236: u1 = undefined;
1191 addcarryxU64(&x235, &x236, 0x0, x234, x231);
1192 var x237: u64 = undefined;
1193 var x238: u1 = undefined;
1194 addcarryxU64(&x237, &x238, x236, x232, x229);
1195 var x239: u64 = undefined;
1196 var x240: u1 = undefined;
1197 addcarryxU64(&x239, &x240, x238, x230, x227);
1198 var x241: u64 = undefined;
1199 var x242: u1 = undefined;
1200 addcarryxU64(&x241, &x242, x240, x228, x225);
1201 var x243: u64 = undefined;
1202 var x244: u1 = undefined;
1203 addcarryxU64(&x243, &x244, x242, x226, x223);
1204 const x245 = (@as(u64, x244) + x224);
1205 var x246: u64 = undefined;
1206 var x247: u1 = undefined;
1207 addcarryxU64(&x246, &x247, 0x0, x210, x233);
1208 var x248: u64 = undefined;
1209 var x249: u1 = undefined;
1210 addcarryxU64(&x248, &x249, x247, x212, x235);
1211 var x250: u64 = undefined;
1212 var x251: u1 = undefined;
1213 addcarryxU64(&x250, &x251, x249, x214, x237);
1214 var x252: u64 = undefined;
1215 var x253: u1 = undefined;
1216 addcarryxU64(&x252, &x253, x251, x216, x239);
1217 var x254: u64 = undefined;
1218 var x255: u1 = undefined;
1219 addcarryxU64(&x254, &x255, x253, x218, x241);
1220 var x256: u64 = undefined;
1221 var x257: u1 = undefined;
1222 addcarryxU64(&x256, &x257, x255, x220, x243);
1223 var x258: u64 = undefined;
1224 var x259: u1 = undefined;
1225 addcarryxU64(&x258, &x259, x257, x222, x245);
1226 var x260: u64 = undefined;
1227 var x261: u64 = undefined;
1228 mulxU64(&x260, &x261, x246, 0x6ed46089e88fdc45);
1229 var x262: u64 = undefined;
1230 var x263: u64 = undefined;
1231 mulxU64(&x262, &x263, x260, 0xffffffffffffffff);
1232 var x264: u64 = undefined;
1233 var x265: u64 = undefined;
1234 mulxU64(&x264, &x265, x260, 0xffffffffffffffff);
1235 var x266: u64 = undefined;
1236 var x267: u64 = undefined;
1237 mulxU64(&x266, &x267, x260, 0xffffffffffffffff);
1238 var x268: u64 = undefined;
1239 var x269: u64 = undefined;
1240 mulxU64(&x268, &x269, x260, 0xc7634d81f4372ddf);
1241 var x270: u64 = undefined;
1242 var x271: u64 = undefined;
1243 mulxU64(&x270, &x271, x260, 0x581a0db248b0a77a);
1244 var x272: u64 = undefined;
1245 var x273: u64 = undefined;
1246 mulxU64(&x272, &x273, x260, 0xecec196accc52973);
1247 var x274: u64 = undefined;
1248 var x275: u1 = undefined;
1249 addcarryxU64(&x274, &x275, 0x0, x273, x270);
1250 var x276: u64 = undefined;
1251 var x277: u1 = undefined;
1252 addcarryxU64(&x276, &x277, x275, x271, x268);
1253 var x278: u64 = undefined;
1254 var x279: u1 = undefined;
1255 addcarryxU64(&x278, &x279, x277, x269, x266);
1256 var x280: u64 = undefined;
1257 var x281: u1 = undefined;
1258 addcarryxU64(&x280, &x281, x279, x267, x264);
1259 var x282: u64 = undefined;
1260 var x283: u1 = undefined;
1261 addcarryxU64(&x282, &x283, x281, x265, x262);
1262 const x284 = (@as(u64, x283) + x263);
1263 var x285: u64 = undefined;
1264 var x286: u1 = undefined;
1265 addcarryxU64(&x285, &x286, 0x0, x246, x272);
1266 var x287: u64 = undefined;
1267 var x288: u1 = undefined;
1268 addcarryxU64(&x287, &x288, x286, x248, x274);
1269 var x289: u64 = undefined;
1270 var x290: u1 = undefined;
1271 addcarryxU64(&x289, &x290, x288, x250, x276);
1272 var x291: u64 = undefined;
1273 var x292: u1 = undefined;
1274 addcarryxU64(&x291, &x292, x290, x252, x278);
1275 var x293: u64 = undefined;
1276 var x294: u1 = undefined;
1277 addcarryxU64(&x293, &x294, x292, x254, x280);
1278 var x295: u64 = undefined;
1279 var x296: u1 = undefined;
1280 addcarryxU64(&x295, &x296, x294, x256, x282);
1281 var x297: u64 = undefined;
1282 var x298: u1 = undefined;
1283 addcarryxU64(&x297, &x298, x296, x258, x284);
1284 const x299 = (@as(u64, x298) + @as(u64, x259));
1285 var x300: u64 = undefined;
1286 var x301: u64 = undefined;
1287 mulxU64(&x300, &x301, x4, (arg1[5]));
1288 var x302: u64 = undefined;
1289 var x303: u64 = undefined;
1290 mulxU64(&x302, &x303, x4, (arg1[4]));
1291 var x304: u64 = undefined;
1292 var x305: u64 = undefined;
1293 mulxU64(&x304, &x305, x4, (arg1[3]));
1294 var x306: u64 = undefined;
1295 var x307: u64 = undefined;
1296 mulxU64(&x306, &x307, x4, (arg1[2]));
1297 var x308: u64 = undefined;
1298 var x309: u64 = undefined;
1299 mulxU64(&x308, &x309, x4, (arg1[1]));
1300 var x310: u64 = undefined;
1301 var x311: u64 = undefined;
1302 mulxU64(&x310, &x311, x4, (arg1[0]));
1303 var x312: u64 = undefined;
1304 var x313: u1 = undefined;
1305 addcarryxU64(&x312, &x313, 0x0, x311, x308);
1306 var x314: u64 = undefined;
1307 var x315: u1 = undefined;
1308 addcarryxU64(&x314, &x315, x313, x309, x306);
1309 var x316: u64 = undefined;
1310 var x317: u1 = undefined;
1311 addcarryxU64(&x316, &x317, x315, x307, x304);
1312 var x318: u64 = undefined;
1313 var x319: u1 = undefined;
1314 addcarryxU64(&x318, &x319, x317, x305, x302);
1315 var x320: u64 = undefined;
1316 var x321: u1 = undefined;
1317 addcarryxU64(&x320, &x321, x319, x303, x300);
1318 const x322 = (@as(u64, x321) + x301);
1319 var x323: u64 = undefined;
1320 var x324: u1 = undefined;
1321 addcarryxU64(&x323, &x324, 0x0, x287, x310);
1322 var x325: u64 = undefined;
1323 var x326: u1 = undefined;
1324 addcarryxU64(&x325, &x326, x324, x289, x312);
1325 var x327: u64 = undefined;
1326 var x328: u1 = undefined;
1327 addcarryxU64(&x327, &x328, x326, x291, x314);
1328 var x329: u64 = undefined;
1329 var x330: u1 = undefined;
1330 addcarryxU64(&x329, &x330, x328, x293, x316);
1331 var x331: u64 = undefined;
1332 var x332: u1 = undefined;
1333 addcarryxU64(&x331, &x332, x330, x295, x318);
1334 var x333: u64 = undefined;
1335 var x334: u1 = undefined;
1336 addcarryxU64(&x333, &x334, x332, x297, x320);
1337 var x335: u64 = undefined;
1338 var x336: u1 = undefined;
1339 addcarryxU64(&x335, &x336, x334, x299, x322);
1340 var x337: u64 = undefined;
1341 var x338: u64 = undefined;
1342 mulxU64(&x337, &x338, x323, 0x6ed46089e88fdc45);
1343 var x339: u64 = undefined;
1344 var x340: u64 = undefined;
1345 mulxU64(&x339, &x340, x337, 0xffffffffffffffff);
1346 var x341: u64 = undefined;
1347 var x342: u64 = undefined;
1348 mulxU64(&x341, &x342, x337, 0xffffffffffffffff);
1349 var x343: u64 = undefined;
1350 var x344: u64 = undefined;
1351 mulxU64(&x343, &x344, x337, 0xffffffffffffffff);
1352 var x345: u64 = undefined;
1353 var x346: u64 = undefined;
1354 mulxU64(&x345, &x346, x337, 0xc7634d81f4372ddf);
1355 var x347: u64 = undefined;
1356 var x348: u64 = undefined;
1357 mulxU64(&x347, &x348, x337, 0x581a0db248b0a77a);
1358 var x349: u64 = undefined;
1359 var x350: u64 = undefined;
1360 mulxU64(&x349, &x350, x337, 0xecec196accc52973);
1361 var x351: u64 = undefined;
1362 var x352: u1 = undefined;
1363 addcarryxU64(&x351, &x352, 0x0, x350, x347);
1364 var x353: u64 = undefined;
1365 var x354: u1 = undefined;
1366 addcarryxU64(&x353, &x354, x352, x348, x345);
1367 var x355: u64 = undefined;
1368 var x356: u1 = undefined;
1369 addcarryxU64(&x355, &x356, x354, x346, x343);
1370 var x357: u64 = undefined;
1371 var x358: u1 = undefined;
1372 addcarryxU64(&x357, &x358, x356, x344, x341);
1373 var x359: u64 = undefined;
1374 var x360: u1 = undefined;
1375 addcarryxU64(&x359, &x360, x358, x342, x339);
1376 const x361 = (@as(u64, x360) + x340);
1377 var x362: u64 = undefined;
1378 var x363: u1 = undefined;
1379 addcarryxU64(&x362, &x363, 0x0, x323, x349);
1380 var x364: u64 = undefined;
1381 var x365: u1 = undefined;
1382 addcarryxU64(&x364, &x365, x363, x325, x351);
1383 var x366: u64 = undefined;
1384 var x367: u1 = undefined;
1385 addcarryxU64(&x366, &x367, x365, x327, x353);
1386 var x368: u64 = undefined;
1387 var x369: u1 = undefined;
1388 addcarryxU64(&x368, &x369, x367, x329, x355);
1389 var x370: u64 = undefined;
1390 var x371: u1 = undefined;
1391 addcarryxU64(&x370, &x371, x369, x331, x357);
1392 var x372: u64 = undefined;
1393 var x373: u1 = undefined;
1394 addcarryxU64(&x372, &x373, x371, x333, x359);
1395 var x374: u64 = undefined;
1396 var x375: u1 = undefined;
1397 addcarryxU64(&x374, &x375, x373, x335, x361);
1398 const x376 = (@as(u64, x375) + @as(u64, x336));
1399 var x377: u64 = undefined;
1400 var x378: u64 = undefined;
1401 mulxU64(&x377, &x378, x5, (arg1[5]));
1402 var x379: u64 = undefined;
1403 var x380: u64 = undefined;
1404 mulxU64(&x379, &x380, x5, (arg1[4]));
1405 var x381: u64 = undefined;
1406 var x382: u64 = undefined;
1407 mulxU64(&x381, &x382, x5, (arg1[3]));
1408 var x383: u64 = undefined;
1409 var x384: u64 = undefined;
1410 mulxU64(&x383, &x384, x5, (arg1[2]));
1411 var x385: u64 = undefined;
1412 var x386: u64 = undefined;
1413 mulxU64(&x385, &x386, x5, (arg1[1]));
1414 var x387: u64 = undefined;
1415 var x388: u64 = undefined;
1416 mulxU64(&x387, &x388, x5, (arg1[0]));
1417 var x389: u64 = undefined;
1418 var x390: u1 = undefined;
1419 addcarryxU64(&x389, &x390, 0x0, x388, x385);
1420 var x391: u64 = undefined;
1421 var x392: u1 = undefined;
1422 addcarryxU64(&x391, &x392, x390, x386, x383);
1423 var x393: u64 = undefined;
1424 var x394: u1 = undefined;
1425 addcarryxU64(&x393, &x394, x392, x384, x381);
1426 var x395: u64 = undefined;
1427 var x396: u1 = undefined;
1428 addcarryxU64(&x395, &x396, x394, x382, x379);
1429 var x397: u64 = undefined;
1430 var x398: u1 = undefined;
1431 addcarryxU64(&x397, &x398, x396, x380, x377);
1432 const x399 = (@as(u64, x398) + x378);
1433 var x400: u64 = undefined;
1434 var x401: u1 = undefined;
1435 addcarryxU64(&x400, &x401, 0x0, x364, x387);
1436 var x402: u64 = undefined;
1437 var x403: u1 = undefined;
1438 addcarryxU64(&x402, &x403, x401, x366, x389);
1439 var x404: u64 = undefined;
1440 var x405: u1 = undefined;
1441 addcarryxU64(&x404, &x405, x403, x368, x391);
1442 var x406: u64 = undefined;
1443 var x407: u1 = undefined;
1444 addcarryxU64(&x406, &x407, x405, x370, x393);
1445 var x408: u64 = undefined;
1446 var x409: u1 = undefined;
1447 addcarryxU64(&x408, &x409, x407, x372, x395);
1448 var x410: u64 = undefined;
1449 var x411: u1 = undefined;
1450 addcarryxU64(&x410, &x411, x409, x374, x397);
1451 var x412: u64 = undefined;
1452 var x413: u1 = undefined;
1453 addcarryxU64(&x412, &x413, x411, x376, x399);
1454 var x414: u64 = undefined;
1455 var x415: u64 = undefined;
1456 mulxU64(&x414, &x415, x400, 0x6ed46089e88fdc45);
1457 var x416: u64 = undefined;
1458 var x417: u64 = undefined;
1459 mulxU64(&x416, &x417, x414, 0xffffffffffffffff);
1460 var x418: u64 = undefined;
1461 var x419: u64 = undefined;
1462 mulxU64(&x418, &x419, x414, 0xffffffffffffffff);
1463 var x420: u64 = undefined;
1464 var x421: u64 = undefined;
1465 mulxU64(&x420, &x421, x414, 0xffffffffffffffff);
1466 var x422: u64 = undefined;
1467 var x423: u64 = undefined;
1468 mulxU64(&x422, &x423, x414, 0xc7634d81f4372ddf);
1469 var x424: u64 = undefined;
1470 var x425: u64 = undefined;
1471 mulxU64(&x424, &x425, x414, 0x581a0db248b0a77a);
1472 var x426: u64 = undefined;
1473 var x427: u64 = undefined;
1474 mulxU64(&x426, &x427, x414, 0xecec196accc52973);
1475 var x428: u64 = undefined;
1476 var x429: u1 = undefined;
1477 addcarryxU64(&x428, &x429, 0x0, x427, x424);
1478 var x430: u64 = undefined;
1479 var x431: u1 = undefined;
1480 addcarryxU64(&x430, &x431, x429, x425, x422);
1481 var x432: u64 = undefined;
1482 var x433: u1 = undefined;
1483 addcarryxU64(&x432, &x433, x431, x423, x420);
1484 var x434: u64 = undefined;
1485 var x435: u1 = undefined;
1486 addcarryxU64(&x434, &x435, x433, x421, x418);
1487 var x436: u64 = undefined;
1488 var x437: u1 = undefined;
1489 addcarryxU64(&x436, &x437, x435, x419, x416);
1490 const x438 = (@as(u64, x437) + x417);
1491 var x439: u64 = undefined;
1492 var x440: u1 = undefined;
1493 addcarryxU64(&x439, &x440, 0x0, x400, x426);
1494 var x441: u64 = undefined;
1495 var x442: u1 = undefined;
1496 addcarryxU64(&x441, &x442, x440, x402, x428);
1497 var x443: u64 = undefined;
1498 var x444: u1 = undefined;
1499 addcarryxU64(&x443, &x444, x442, x404, x430);
1500 var x445: u64 = undefined;
1501 var x446: u1 = undefined;
1502 addcarryxU64(&x445, &x446, x444, x406, x432);
1503 var x447: u64 = undefined;
1504 var x448: u1 = undefined;
1505 addcarryxU64(&x447, &x448, x446, x408, x434);
1506 var x449: u64 = undefined;
1507 var x450: u1 = undefined;
1508 addcarryxU64(&x449, &x450, x448, x410, x436);
1509 var x451: u64 = undefined;
1510 var x452: u1 = undefined;
1511 addcarryxU64(&x451, &x452, x450, x412, x438);
1512 const x453 = (@as(u64, x452) + @as(u64, x413));
1513 var x454: u64 = undefined;
1514 var x455: u1 = undefined;
1515 subborrowxU64(&x454, &x455, 0x0, x441, 0xecec196accc52973);
1516 var x456: u64 = undefined;
1517 var x457: u1 = undefined;
1518 subborrowxU64(&x456, &x457, x455, x443, 0x581a0db248b0a77a);
1519 var x458: u64 = undefined;
1520 var x459: u1 = undefined;
1521 subborrowxU64(&x458, &x459, x457, x445, 0xc7634d81f4372ddf);
1522 var x460: u64 = undefined;
1523 var x461: u1 = undefined;
1524 subborrowxU64(&x460, &x461, x459, x447, 0xffffffffffffffff);
1525 var x462: u64 = undefined;
1526 var x463: u1 = undefined;
1527 subborrowxU64(&x462, &x463, x461, x449, 0xffffffffffffffff);
1528 var x464: u64 = undefined;
1529 var x465: u1 = undefined;
1530 subborrowxU64(&x464, &x465, x463, x451, 0xffffffffffffffff);
1531 var x466: u64 = undefined;
1532 var x467: u1 = undefined;
1533 subborrowxU64(&x466, &x467, x465, x453, 0x0);
1534 var x468: u64 = undefined;
1535 cmovznzU64(&x468, x467, x454, x441);
1536 var x469: u64 = undefined;
1537 cmovznzU64(&x469, x467, x456, x443);
1538 var x470: u64 = undefined;
1539 cmovznzU64(&x470, x467, x458, x445);
1540 var x471: u64 = undefined;
1541 cmovznzU64(&x471, x467, x460, x447);
1542 var x472: u64 = undefined;
1543 cmovznzU64(&x472, x467, x462, x449);
1544 var x473: u64 = undefined;
1545 cmovznzU64(&x473, x467, x464, x451);
1546 out1[0] = x468;
1547 out1[1] = x469;
1548 out1[2] = x470;
1549 out1[3] = x471;
1550 out1[4] = x472;
1551 out1[5] = x473;
1552}
1553
1554/// The function add adds two field elements in the Montgomery domain.
1555///
1556/// Preconditions:
1557/// 0 ≤ eval arg1 < m
1558/// 0 ≤ eval arg2 < m
1559/// Postconditions:
1560/// eval (from_montgomery out1) mod m = (eval (from_montgomery arg1) + eval (from_montgomery arg2)) mod m
1561/// 0 ≤ eval out1 < m
1562///
1563pub fn add(out1: *MontgomeryDomainFieldElement, arg1: MontgomeryDomainFieldElement, arg2: MontgomeryDomainFieldElement) void {
1564 @setRuntimeSafety(mode == .Debug);
1565
1566 var x1: u64 = undefined;
1567 var x2: u1 = undefined;
1568 addcarryxU64(&x1, &x2, 0x0, (arg1[0]), (arg2[0]));
1569 var x3: u64 = undefined;
1570 var x4: u1 = undefined;
1571 addcarryxU64(&x3, &x4, x2, (arg1[1]), (arg2[1]));
1572 var x5: u64 = undefined;
1573 var x6: u1 = undefined;
1574 addcarryxU64(&x5, &x6, x4, (arg1[2]), (arg2[2]));
1575 var x7: u64 = undefined;
1576 var x8: u1 = undefined;
1577 addcarryxU64(&x7, &x8, x6, (arg1[3]), (arg2[3]));
1578 var x9: u64 = undefined;
1579 var x10: u1 = undefined;
1580 addcarryxU64(&x9, &x10, x8, (arg1[4]), (arg2[4]));
1581 var x11: u64 = undefined;
1582 var x12: u1 = undefined;
1583 addcarryxU64(&x11, &x12, x10, (arg1[5]), (arg2[5]));
1584 var x13: u64 = undefined;
1585 var x14: u1 = undefined;
1586 subborrowxU64(&x13, &x14, 0x0, x1, 0xecec196accc52973);
1587 var x15: u64 = undefined;
1588 var x16: u1 = undefined;
1589 subborrowxU64(&x15, &x16, x14, x3, 0x581a0db248b0a77a);
1590 var x17: u64 = undefined;
1591 var x18: u1 = undefined;
1592 subborrowxU64(&x17, &x18, x16, x5, 0xc7634d81f4372ddf);
1593 var x19: u64 = undefined;
1594 var x20: u1 = undefined;
1595 subborrowxU64(&x19, &x20, x18, x7, 0xffffffffffffffff);
1596 var x21: u64 = undefined;
1597 var x22: u1 = undefined;
1598 subborrowxU64(&x21, &x22, x20, x9, 0xffffffffffffffff);
1599 var x23: u64 = undefined;
1600 var x24: u1 = undefined;
1601 subborrowxU64(&x23, &x24, x22, x11, 0xffffffffffffffff);
1602 var x25: u64 = undefined;
1603 var x26: u1 = undefined;
1604 subborrowxU64(&x25, &x26, x24, @as(u64, x12), 0x0);
1605 var x27: u64 = undefined;
1606 cmovznzU64(&x27, x26, x13, x1);
1607 var x28: u64 = undefined;
1608 cmovznzU64(&x28, x26, x15, x3);
1609 var x29: u64 = undefined;
1610 cmovznzU64(&x29, x26, x17, x5);
1611 var x30: u64 = undefined;
1612 cmovznzU64(&x30, x26, x19, x7);
1613 var x31: u64 = undefined;
1614 cmovznzU64(&x31, x26, x21, x9);
1615 var x32: u64 = undefined;
1616 cmovznzU64(&x32, x26, x23, x11);
1617 out1[0] = x27;
1618 out1[1] = x28;
1619 out1[2] = x29;
1620 out1[3] = x30;
1621 out1[4] = x31;
1622 out1[5] = x32;
1623}
1624
1625/// The function sub subtracts two field elements in the Montgomery domain.
1626///
1627/// Preconditions:
1628/// 0 ≤ eval arg1 < m
1629/// 0 ≤ eval arg2 < m
1630/// Postconditions:
1631/// eval (from_montgomery out1) mod m = (eval (from_montgomery arg1) - eval (from_montgomery arg2)) mod m
1632/// 0 ≤ eval out1 < m
1633///
1634pub fn sub(out1: *MontgomeryDomainFieldElement, arg1: MontgomeryDomainFieldElement, arg2: MontgomeryDomainFieldElement) void {
1635 @setRuntimeSafety(mode == .Debug);
1636
1637 var x1: u64 = undefined;
1638 var x2: u1 = undefined;
1639 subborrowxU64(&x1, &x2, 0x0, (arg1[0]), (arg2[0]));
1640 var x3: u64 = undefined;
1641 var x4: u1 = undefined;
1642 subborrowxU64(&x3, &x4, x2, (arg1[1]), (arg2[1]));
1643 var x5: u64 = undefined;
1644 var x6: u1 = undefined;
1645 subborrowxU64(&x5, &x6, x4, (arg1[2]), (arg2[2]));
1646 var x7: u64 = undefined;
1647 var x8: u1 = undefined;
1648 subborrowxU64(&x7, &x8, x6, (arg1[3]), (arg2[3]));
1649 var x9: u64 = undefined;
1650 var x10: u1 = undefined;
1651 subborrowxU64(&x9, &x10, x8, (arg1[4]), (arg2[4]));
1652 var x11: u64 = undefined;
1653 var x12: u1 = undefined;
1654 subborrowxU64(&x11, &x12, x10, (arg1[5]), (arg2[5]));
1655 var x13: u64 = undefined;
1656 cmovznzU64(&x13, x12, 0x0, 0xffffffffffffffff);
1657 var x14: u64 = undefined;
1658 var x15: u1 = undefined;
1659 addcarryxU64(&x14, &x15, 0x0, x1, (x13 & 0xecec196accc52973));
1660 var x16: u64 = undefined;
1661 var x17: u1 = undefined;
1662 addcarryxU64(&x16, &x17, x15, x3, (x13 & 0x581a0db248b0a77a));
1663 var x18: u64 = undefined;
1664 var x19: u1 = undefined;
1665 addcarryxU64(&x18, &x19, x17, x5, (x13 & 0xc7634d81f4372ddf));
1666 var x20: u64 = undefined;
1667 var x21: u1 = undefined;
1668 addcarryxU64(&x20, &x21, x19, x7, x13);
1669 var x22: u64 = undefined;
1670 var x23: u1 = undefined;
1671 addcarryxU64(&x22, &x23, x21, x9, x13);
1672 var x24: u64 = undefined;
1673 var x25: u1 = undefined;
1674 addcarryxU64(&x24, &x25, x23, x11, x13);
1675 out1[0] = x14;
1676 out1[1] = x16;
1677 out1[2] = x18;
1678 out1[3] = x20;
1679 out1[4] = x22;
1680 out1[5] = x24;
1681}
1682
1683/// The function opp negates a field element in the Montgomery domain.
1684///
1685/// Preconditions:
1686/// 0 ≤ eval arg1 < m
1687/// Postconditions:
1688/// eval (from_montgomery out1) mod m = -eval (from_montgomery arg1) mod m
1689/// 0 ≤ eval out1 < m
1690///
1691pub fn opp(out1: *MontgomeryDomainFieldElement, arg1: MontgomeryDomainFieldElement) void {
1692 @setRuntimeSafety(mode == .Debug);
1693
1694 var x1: u64 = undefined;
1695 var x2: u1 = undefined;
1696 subborrowxU64(&x1, &x2, 0x0, 0x0, (arg1[0]));
1697 var x3: u64 = undefined;
1698 var x4: u1 = undefined;
1699 subborrowxU64(&x3, &x4, x2, 0x0, (arg1[1]));
1700 var x5: u64 = undefined;
1701 var x6: u1 = undefined;
1702 subborrowxU64(&x5, &x6, x4, 0x0, (arg1[2]));
1703 var x7: u64 = undefined;
1704 var x8: u1 = undefined;
1705 subborrowxU64(&x7, &x8, x6, 0x0, (arg1[3]));
1706 var x9: u64 = undefined;
1707 var x10: u1 = undefined;
1708 subborrowxU64(&x9, &x10, x8, 0x0, (arg1[4]));
1709 var x11: u64 = undefined;
1710 var x12: u1 = undefined;
1711 subborrowxU64(&x11, &x12, x10, 0x0, (arg1[5]));
1712 var x13: u64 = undefined;
1713 cmovznzU64(&x13, x12, 0x0, 0xffffffffffffffff);
1714 var x14: u64 = undefined;
1715 var x15: u1 = undefined;
1716 addcarryxU64(&x14, &x15, 0x0, x1, (x13 & 0xecec196accc52973));
1717 var x16: u64 = undefined;
1718 var x17: u1 = undefined;
1719 addcarryxU64(&x16, &x17, x15, x3, (x13 & 0x581a0db248b0a77a));
1720 var x18: u64 = undefined;
1721 var x19: u1 = undefined;
1722 addcarryxU64(&x18, &x19, x17, x5, (x13 & 0xc7634d81f4372ddf));
1723 var x20: u64 = undefined;
1724 var x21: u1 = undefined;
1725 addcarryxU64(&x20, &x21, x19, x7, x13);
1726 var x22: u64 = undefined;
1727 var x23: u1 = undefined;
1728 addcarryxU64(&x22, &x23, x21, x9, x13);
1729 var x24: u64 = undefined;
1730 var x25: u1 = undefined;
1731 addcarryxU64(&x24, &x25, x23, x11, x13);
1732 out1[0] = x14;
1733 out1[1] = x16;
1734 out1[2] = x18;
1735 out1[3] = x20;
1736 out1[4] = x22;
1737 out1[5] = x24;
1738}
1739
1740/// The function fromMontgomery translates a field element out of the Montgomery domain.
1741///
1742/// Preconditions:
1743/// 0 ≤ eval arg1 < m
1744/// Postconditions:
1745/// eval out1 mod m = (eval arg1 * ((2^64)⁻¹ mod m)^6) mod m
1746/// 0 ≤ eval out1 < m
1747///
1748pub fn fromMontgomery(out1: *NonMontgomeryDomainFieldElement, arg1: MontgomeryDomainFieldElement) void {
1749 @setRuntimeSafety(mode == .Debug);
1750
1751 const x1 = (arg1[0]);
1752 var x2: u64 = undefined;
1753 var x3: u64 = undefined;
1754 mulxU64(&x2, &x3, x1, 0x6ed46089e88fdc45);
1755 var x4: u64 = undefined;
1756 var x5: u64 = undefined;
1757 mulxU64(&x4, &x5, x2, 0xffffffffffffffff);
1758 var x6: u64 = undefined;
1759 var x7: u64 = undefined;
1760 mulxU64(&x6, &x7, x2, 0xffffffffffffffff);
1761 var x8: u64 = undefined;
1762 var x9: u64 = undefined;
1763 mulxU64(&x8, &x9, x2, 0xffffffffffffffff);
1764 var x10: u64 = undefined;
1765 var x11: u64 = undefined;
1766 mulxU64(&x10, &x11, x2, 0xc7634d81f4372ddf);
1767 var x12: u64 = undefined;
1768 var x13: u64 = undefined;
1769 mulxU64(&x12, &x13, x2, 0x581a0db248b0a77a);
1770 var x14: u64 = undefined;
1771 var x15: u64 = undefined;
1772 mulxU64(&x14, &x15, x2, 0xecec196accc52973);
1773 var x16: u64 = undefined;
1774 var x17: u1 = undefined;
1775 addcarryxU64(&x16, &x17, 0x0, x15, x12);
1776 var x18: u64 = undefined;
1777 var x19: u1 = undefined;
1778 addcarryxU64(&x18, &x19, x17, x13, x10);
1779 var x20: u64 = undefined;
1780 var x21: u1 = undefined;
1781 addcarryxU64(&x20, &x21, x19, x11, x8);
1782 var x22: u64 = undefined;
1783 var x23: u1 = undefined;
1784 addcarryxU64(&x22, &x23, x21, x9, x6);
1785 var x24: u64 = undefined;
1786 var x25: u1 = undefined;
1787 addcarryxU64(&x24, &x25, x23, x7, x4);
1788 var x26: u64 = undefined;
1789 var x27: u1 = undefined;
1790 addcarryxU64(&x26, &x27, 0x0, x1, x14);
1791 var x28: u64 = undefined;
1792 var x29: u1 = undefined;
1793 addcarryxU64(&x28, &x29, x27, 0x0, x16);
1794 var x30: u64 = undefined;
1795 var x31: u1 = undefined;
1796 addcarryxU64(&x30, &x31, x29, 0x0, x18);
1797 var x32: u64 = undefined;
1798 var x33: u1 = undefined;
1799 addcarryxU64(&x32, &x33, x31, 0x0, x20);
1800 var x34: u64 = undefined;
1801 var x35: u1 = undefined;
1802 addcarryxU64(&x34, &x35, x33, 0x0, x22);
1803 var x36: u64 = undefined;
1804 var x37: u1 = undefined;
1805 addcarryxU64(&x36, &x37, x35, 0x0, x24);
1806 var x38: u64 = undefined;
1807 var x39: u1 = undefined;
1808 addcarryxU64(&x38, &x39, x37, 0x0, (@as(u64, x25) + x5));
1809 var x40: u64 = undefined;
1810 var x41: u1 = undefined;
1811 addcarryxU64(&x40, &x41, 0x0, x28, (arg1[1]));
1812 var x42: u64 = undefined;
1813 var x43: u1 = undefined;
1814 addcarryxU64(&x42, &x43, x41, x30, 0x0);
1815 var x44: u64 = undefined;
1816 var x45: u1 = undefined;
1817 addcarryxU64(&x44, &x45, x43, x32, 0x0);
1818 var x46: u64 = undefined;
1819 var x47: u1 = undefined;
1820 addcarryxU64(&x46, &x47, x45, x34, 0x0);
1821 var x48: u64 = undefined;
1822 var x49: u1 = undefined;
1823 addcarryxU64(&x48, &x49, x47, x36, 0x0);
1824 var x50: u64 = undefined;
1825 var x51: u1 = undefined;
1826 addcarryxU64(&x50, &x51, x49, x38, 0x0);
1827 var x52: u64 = undefined;
1828 var x53: u64 = undefined;
1829 mulxU64(&x52, &x53, x40, 0x6ed46089e88fdc45);
1830 var x54: u64 = undefined;
1831 var x55: u64 = undefined;
1832 mulxU64(&x54, &x55, x52, 0xffffffffffffffff);
1833 var x56: u64 = undefined;
1834 var x57: u64 = undefined;
1835 mulxU64(&x56, &x57, x52, 0xffffffffffffffff);
1836 var x58: u64 = undefined;
1837 var x59: u64 = undefined;
1838 mulxU64(&x58, &x59, x52, 0xffffffffffffffff);
1839 var x60: u64 = undefined;
1840 var x61: u64 = undefined;
1841 mulxU64(&x60, &x61, x52, 0xc7634d81f4372ddf);
1842 var x62: u64 = undefined;
1843 var x63: u64 = undefined;
1844 mulxU64(&x62, &x63, x52, 0x581a0db248b0a77a);
1845 var x64: u64 = undefined;
1846 var x65: u64 = undefined;
1847 mulxU64(&x64, &x65, x52, 0xecec196accc52973);
1848 var x66: u64 = undefined;
1849 var x67: u1 = undefined;
1850 addcarryxU64(&x66, &x67, 0x0, x65, x62);
1851 var x68: u64 = undefined;
1852 var x69: u1 = undefined;
1853 addcarryxU64(&x68, &x69, x67, x63, x60);
1854 var x70: u64 = undefined;
1855 var x71: u1 = undefined;
1856 addcarryxU64(&x70, &x71, x69, x61, x58);
1857 var x72: u64 = undefined;
1858 var x73: u1 = undefined;
1859 addcarryxU64(&x72, &x73, x71, x59, x56);
1860 var x74: u64 = undefined;
1861 var x75: u1 = undefined;
1862 addcarryxU64(&x74, &x75, x73, x57, x54);
1863 var x76: u64 = undefined;
1864 var x77: u1 = undefined;
1865 addcarryxU64(&x76, &x77, 0x0, x40, x64);
1866 var x78: u64 = undefined;
1867 var x79: u1 = undefined;
1868 addcarryxU64(&x78, &x79, x77, x42, x66);
1869 var x80: u64 = undefined;
1870 var x81: u1 = undefined;
1871 addcarryxU64(&x80, &x81, x79, x44, x68);
1872 var x82: u64 = undefined;
1873 var x83: u1 = undefined;
1874 addcarryxU64(&x82, &x83, x81, x46, x70);
1875 var x84: u64 = undefined;
1876 var x85: u1 = undefined;
1877 addcarryxU64(&x84, &x85, x83, x48, x72);
1878 var x86: u64 = undefined;
1879 var x87: u1 = undefined;
1880 addcarryxU64(&x86, &x87, x85, x50, x74);
1881 var x88: u64 = undefined;
1882 var x89: u1 = undefined;
1883 addcarryxU64(&x88, &x89, x87, (@as(u64, x51) + @as(u64, x39)), (@as(u64, x75) + x55));
1884 var x90: u64 = undefined;
1885 var x91: u1 = undefined;
1886 addcarryxU64(&x90, &x91, 0x0, x78, (arg1[2]));
1887 var x92: u64 = undefined;
1888 var x93: u1 = undefined;
1889 addcarryxU64(&x92, &x93, x91, x80, 0x0);
1890 var x94: u64 = undefined;
1891 var x95: u1 = undefined;
1892 addcarryxU64(&x94, &x95, x93, x82, 0x0);
1893 var x96: u64 = undefined;
1894 var x97: u1 = undefined;
1895 addcarryxU64(&x96, &x97, x95, x84, 0x0);
1896 var x98: u64 = undefined;
1897 var x99: u1 = undefined;
1898 addcarryxU64(&x98, &x99, x97, x86, 0x0);
1899 var x100: u64 = undefined;
1900 var x101: u1 = undefined;
1901 addcarryxU64(&x100, &x101, x99, x88, 0x0);
1902 var x102: u64 = undefined;
1903 var x103: u64 = undefined;
1904 mulxU64(&x102, &x103, x90, 0x6ed46089e88fdc45);
1905 var x104: u64 = undefined;
1906 var x105: u64 = undefined;
1907 mulxU64(&x104, &x105, x102, 0xffffffffffffffff);
1908 var x106: u64 = undefined;
1909 var x107: u64 = undefined;
1910 mulxU64(&x106, &x107, x102, 0xffffffffffffffff);
1911 var x108: u64 = undefined;
1912 var x109: u64 = undefined;
1913 mulxU64(&x108, &x109, x102, 0xffffffffffffffff);
1914 var x110: u64 = undefined;
1915 var x111: u64 = undefined;
1916 mulxU64(&x110, &x111, x102, 0xc7634d81f4372ddf);
1917 var x112: u64 = undefined;
1918 var x113: u64 = undefined;
1919 mulxU64(&x112, &x113, x102, 0x581a0db248b0a77a);
1920 var x114: u64 = undefined;
1921 var x115: u64 = undefined;
1922 mulxU64(&x114, &x115, x102, 0xecec196accc52973);
1923 var x116: u64 = undefined;
1924 var x117: u1 = undefined;
1925 addcarryxU64(&x116, &x117, 0x0, x115, x112);
1926 var x118: u64 = undefined;
1927 var x119: u1 = undefined;
1928 addcarryxU64(&x118, &x119, x117, x113, x110);
1929 var x120: u64 = undefined;
1930 var x121: u1 = undefined;
1931 addcarryxU64(&x120, &x121, x119, x111, x108);
1932 var x122: u64 = undefined;
1933 var x123: u1 = undefined;
1934 addcarryxU64(&x122, &x123, x121, x109, x106);
1935 var x124: u64 = undefined;
1936 var x125: u1 = undefined;
1937 addcarryxU64(&x124, &x125, x123, x107, x104);
1938 var x126: u64 = undefined;
1939 var x127: u1 = undefined;
1940 addcarryxU64(&x126, &x127, 0x0, x90, x114);
1941 var x128: u64 = undefined;
1942 var x129: u1 = undefined;
1943 addcarryxU64(&x128, &x129, x127, x92, x116);
1944 var x130: u64 = undefined;
1945 var x131: u1 = undefined;
1946 addcarryxU64(&x130, &x131, x129, x94, x118);
1947 var x132: u64 = undefined;
1948 var x133: u1 = undefined;
1949 addcarryxU64(&x132, &x133, x131, x96, x120);
1950 var x134: u64 = undefined;
1951 var x135: u1 = undefined;
1952 addcarryxU64(&x134, &x135, x133, x98, x122);
1953 var x136: u64 = undefined;
1954 var x137: u1 = undefined;
1955 addcarryxU64(&x136, &x137, x135, x100, x124);
1956 var x138: u64 = undefined;
1957 var x139: u1 = undefined;
1958 addcarryxU64(&x138, &x139, x137, (@as(u64, x101) + @as(u64, x89)), (@as(u64, x125) + x105));
1959 var x140: u64 = undefined;
1960 var x141: u1 = undefined;
1961 addcarryxU64(&x140, &x141, 0x0, x128, (arg1[3]));
1962 var x142: u64 = undefined;
1963 var x143: u1 = undefined;
1964 addcarryxU64(&x142, &x143, x141, x130, 0x0);
1965 var x144: u64 = undefined;
1966 var x145: u1 = undefined;
1967 addcarryxU64(&x144, &x145, x143, x132, 0x0);
1968 var x146: u64 = undefined;
1969 var x147: u1 = undefined;
1970 addcarryxU64(&x146, &x147, x145, x134, 0x0);
1971 var x148: u64 = undefined;
1972 var x149: u1 = undefined;
1973 addcarryxU64(&x148, &x149, x147, x136, 0x0);
1974 var x150: u64 = undefined;
1975 var x151: u1 = undefined;
1976 addcarryxU64(&x150, &x151, x149, x138, 0x0);
1977 var x152: u64 = undefined;
1978 var x153: u64 = undefined;
1979 mulxU64(&x152, &x153, x140, 0x6ed46089e88fdc45);
1980 var x154: u64 = undefined;
1981 var x155: u64 = undefined;
1982 mulxU64(&x154, &x155, x152, 0xffffffffffffffff);
1983 var x156: u64 = undefined;
1984 var x157: u64 = undefined;
1985 mulxU64(&x156, &x157, x152, 0xffffffffffffffff);
1986 var x158: u64 = undefined;
1987 var x159: u64 = undefined;
1988 mulxU64(&x158, &x159, x152, 0xffffffffffffffff);
1989 var x160: u64 = undefined;
1990 var x161: u64 = undefined;
1991 mulxU64(&x160, &x161, x152, 0xc7634d81f4372ddf);
1992 var x162: u64 = undefined;
1993 var x163: u64 = undefined;
1994 mulxU64(&x162, &x163, x152, 0x581a0db248b0a77a);
1995 var x164: u64 = undefined;
1996 var x165: u64 = undefined;
1997 mulxU64(&x164, &x165, x152, 0xecec196accc52973);
1998 var x166: u64 = undefined;
1999 var x167: u1 = undefined;
2000 addcarryxU64(&x166, &x167, 0x0, x165, x162);
2001 var x168: u64 = undefined;
2002 var x169: u1 = undefined;
2003 addcarryxU64(&x168, &x169, x167, x163, x160);
2004 var x170: u64 = undefined;
2005 var x171: u1 = undefined;
2006 addcarryxU64(&x170, &x171, x169, x161, x158);
2007 var x172: u64 = undefined;
2008 var x173: u1 = undefined;
2009 addcarryxU64(&x172, &x173, x171, x159, x156);
2010 var x174: u64 = undefined;
2011 var x175: u1 = undefined;
2012 addcarryxU64(&x174, &x175, x173, x157, x154);
2013 var x176: u64 = undefined;
2014 var x177: u1 = undefined;
2015 addcarryxU64(&x176, &x177, 0x0, x140, x164);
2016 var x178: u64 = undefined;
2017 var x179: u1 = undefined;
2018 addcarryxU64(&x178, &x179, x177, x142, x166);
2019 var x180: u64 = undefined;
2020 var x181: u1 = undefined;
2021 addcarryxU64(&x180, &x181, x179, x144, x168);
2022 var x182: u64 = undefined;
2023 var x183: u1 = undefined;
2024 addcarryxU64(&x182, &x183, x181, x146, x170);
2025 var x184: u64 = undefined;
2026 var x185: u1 = undefined;
2027 addcarryxU64(&x184, &x185, x183, x148, x172);
2028 var x186: u64 = undefined;
2029 var x187: u1 = undefined;
2030 addcarryxU64(&x186, &x187, x185, x150, x174);
2031 var x188: u64 = undefined;
2032 var x189: u1 = undefined;
2033 addcarryxU64(&x188, &x189, x187, (@as(u64, x151) + @as(u64, x139)), (@as(u64, x175) + x155));
2034 var x190: u64 = undefined;
2035 var x191: u1 = undefined;
2036 addcarryxU64(&x190, &x191, 0x0, x178, (arg1[4]));
2037 var x192: u64 = undefined;
2038 var x193: u1 = undefined;
2039 addcarryxU64(&x192, &x193, x191, x180, 0x0);
2040 var x194: u64 = undefined;
2041 var x195: u1 = undefined;
2042 addcarryxU64(&x194, &x195, x193, x182, 0x0);
2043 var x196: u64 = undefined;
2044 var x197: u1 = undefined;
2045 addcarryxU64(&x196, &x197, x195, x184, 0x0);
2046 var x198: u64 = undefined;
2047 var x199: u1 = undefined;
2048 addcarryxU64(&x198, &x199, x197, x186, 0x0);
2049 var x200: u64 = undefined;
2050 var x201: u1 = undefined;
2051 addcarryxU64(&x200, &x201, x199, x188, 0x0);
2052 var x202: u64 = undefined;
2053 var x203: u64 = undefined;
2054 mulxU64(&x202, &x203, x190, 0x6ed46089e88fdc45);
2055 var x204: u64 = undefined;
2056 var x205: u64 = undefined;
2057 mulxU64(&x204, &x205, x202, 0xffffffffffffffff);
2058 var x206: u64 = undefined;
2059 var x207: u64 = undefined;
2060 mulxU64(&x206, &x207, x202, 0xffffffffffffffff);
2061 var x208: u64 = undefined;
2062 var x209: u64 = undefined;
2063 mulxU64(&x208, &x209, x202, 0xffffffffffffffff);
2064 var x210: u64 = undefined;
2065 var x211: u64 = undefined;
2066 mulxU64(&x210, &x211, x202, 0xc7634d81f4372ddf);
2067 var x212: u64 = undefined;
2068 var x213: u64 = undefined;
2069 mulxU64(&x212, &x213, x202, 0x581a0db248b0a77a);
2070 var x214: u64 = undefined;
2071 var x215: u64 = undefined;
2072 mulxU64(&x214, &x215, x202, 0xecec196accc52973);
2073 var x216: u64 = undefined;
2074 var x217: u1 = undefined;
2075 addcarryxU64(&x216, &x217, 0x0, x215, x212);
2076 var x218: u64 = undefined;
2077 var x219: u1 = undefined;
2078 addcarryxU64(&x218, &x219, x217, x213, x210);
2079 var x220: u64 = undefined;
2080 var x221: u1 = undefined;
2081 addcarryxU64(&x220, &x221, x219, x211, x208);
2082 var x222: u64 = undefined;
2083 var x223: u1 = undefined;
2084 addcarryxU64(&x222, &x223, x221, x209, x206);
2085 var x224: u64 = undefined;
2086 var x225: u1 = undefined;
2087 addcarryxU64(&x224, &x225, x223, x207, x204);
2088 var x226: u64 = undefined;
2089 var x227: u1 = undefined;
2090 addcarryxU64(&x226, &x227, 0x0, x190, x214);
2091 var x228: u64 = undefined;
2092 var x229: u1 = undefined;
2093 addcarryxU64(&x228, &x229, x227, x192, x216);
2094 var x230: u64 = undefined;
2095 var x231: u1 = undefined;
2096 addcarryxU64(&x230, &x231, x229, x194, x218);
2097 var x232: u64 = undefined;
2098 var x233: u1 = undefined;
2099 addcarryxU64(&x232, &x233, x231, x196, x220);
2100 var x234: u64 = undefined;
2101 var x235: u1 = undefined;
2102 addcarryxU64(&x234, &x235, x233, x198, x222);
2103 var x236: u64 = undefined;
2104 var x237: u1 = undefined;
2105 addcarryxU64(&x236, &x237, x235, x200, x224);
2106 var x238: u64 = undefined;
2107 var x239: u1 = undefined;
2108 addcarryxU64(&x238, &x239, x237, (@as(u64, x201) + @as(u64, x189)), (@as(u64, x225) + x205));
2109 var x240: u64 = undefined;
2110 var x241: u1 = undefined;
2111 addcarryxU64(&x240, &x241, 0x0, x228, (arg1[5]));
2112 var x242: u64 = undefined;
2113 var x243: u1 = undefined;
2114 addcarryxU64(&x242, &x243, x241, x230, 0x0);
2115 var x244: u64 = undefined;
2116 var x245: u1 = undefined;
2117 addcarryxU64(&x244, &x245, x243, x232, 0x0);
2118 var x246: u64 = undefined;
2119 var x247: u1 = undefined;
2120 addcarryxU64(&x246, &x247, x245, x234, 0x0);
2121 var x248: u64 = undefined;
2122 var x249: u1 = undefined;
2123 addcarryxU64(&x248, &x249, x247, x236, 0x0);
2124 var x250: u64 = undefined;
2125 var x251: u1 = undefined;
2126 addcarryxU64(&x250, &x251, x249, x238, 0x0);
2127 var x252: u64 = undefined;
2128 var x253: u64 = undefined;
2129 mulxU64(&x252, &x253, x240, 0x6ed46089e88fdc45);
2130 var x254: u64 = undefined;
2131 var x255: u64 = undefined;
2132 mulxU64(&x254, &x255, x252, 0xffffffffffffffff);
2133 var x256: u64 = undefined;
2134 var x257: u64 = undefined;
2135 mulxU64(&x256, &x257, x252, 0xffffffffffffffff);
2136 var x258: u64 = undefined;
2137 var x259: u64 = undefined;
2138 mulxU64(&x258, &x259, x252, 0xffffffffffffffff);
2139 var x260: u64 = undefined;
2140 var x261: u64 = undefined;
2141 mulxU64(&x260, &x261, x252, 0xc7634d81f4372ddf);
2142 var x262: u64 = undefined;
2143 var x263: u64 = undefined;
2144 mulxU64(&x262, &x263, x252, 0x581a0db248b0a77a);
2145 var x264: u64 = undefined;
2146 var x265: u64 = undefined;
2147 mulxU64(&x264, &x265, x252, 0xecec196accc52973);
2148 var x266: u64 = undefined;
2149 var x267: u1 = undefined;
2150 addcarryxU64(&x266, &x267, 0x0, x265, x262);
2151 var x268: u64 = undefined;
2152 var x269: u1 = undefined;
2153 addcarryxU64(&x268, &x269, x267, x263, x260);
2154 var x270: u64 = undefined;
2155 var x271: u1 = undefined;
2156 addcarryxU64(&x270, &x271, x269, x261, x258);
2157 var x272: u64 = undefined;
2158 var x273: u1 = undefined;
2159 addcarryxU64(&x272, &x273, x271, x259, x256);
2160 var x274: u64 = undefined;
2161 var x275: u1 = undefined;
2162 addcarryxU64(&x274, &x275, x273, x257, x254);
2163 var x276: u64 = undefined;
2164 var x277: u1 = undefined;
2165 addcarryxU64(&x276, &x277, 0x0, x240, x264);
2166 var x278: u64 = undefined;
2167 var x279: u1 = undefined;
2168 addcarryxU64(&x278, &x279, x277, x242, x266);
2169 var x280: u64 = undefined;
2170 var x281: u1 = undefined;
2171 addcarryxU64(&x280, &x281, x279, x244, x268);
2172 var x282: u64 = undefined;
2173 var x283: u1 = undefined;
2174 addcarryxU64(&x282, &x283, x281, x246, x270);
2175 var x284: u64 = undefined;
2176 var x285: u1 = undefined;
2177 addcarryxU64(&x284, &x285, x283, x248, x272);
2178 var x286: u64 = undefined;
2179 var x287: u1 = undefined;
2180 addcarryxU64(&x286, &x287, x285, x250, x274);
2181 var x288: u64 = undefined;
2182 var x289: u1 = undefined;
2183 addcarryxU64(&x288, &x289, x287, (@as(u64, x251) + @as(u64, x239)), (@as(u64, x275) + x255));
2184 var x290: u64 = undefined;
2185 var x291: u1 = undefined;
2186 subborrowxU64(&x290, &x291, 0x0, x278, 0xecec196accc52973);
2187 var x292: u64 = undefined;
2188 var x293: u1 = undefined;
2189 subborrowxU64(&x292, &x293, x291, x280, 0x581a0db248b0a77a);
2190 var x294: u64 = undefined;
2191 var x295: u1 = undefined;
2192 subborrowxU64(&x294, &x295, x293, x282, 0xc7634d81f4372ddf);
2193 var x296: u64 = undefined;
2194 var x297: u1 = undefined;
2195 subborrowxU64(&x296, &x297, x295, x284, 0xffffffffffffffff);
2196 var x298: u64 = undefined;
2197 var x299: u1 = undefined;
2198 subborrowxU64(&x298, &x299, x297, x286, 0xffffffffffffffff);
2199 var x300: u64 = undefined;
2200 var x301: u1 = undefined;
2201 subborrowxU64(&x300, &x301, x299, x288, 0xffffffffffffffff);
2202 var x302: u64 = undefined;
2203 var x303: u1 = undefined;
2204 subborrowxU64(&x302, &x303, x301, @as(u64, x289), 0x0);
2205 var x304: u64 = undefined;
2206 cmovznzU64(&x304, x303, x290, x278);
2207 var x305: u64 = undefined;
2208 cmovznzU64(&x305, x303, x292, x280);
2209 var x306: u64 = undefined;
2210 cmovznzU64(&x306, x303, x294, x282);
2211 var x307: u64 = undefined;
2212 cmovznzU64(&x307, x303, x296, x284);
2213 var x308: u64 = undefined;
2214 cmovznzU64(&x308, x303, x298, x286);
2215 var x309: u64 = undefined;
2216 cmovznzU64(&x309, x303, x300, x288);
2217 out1[0] = x304;
2218 out1[1] = x305;
2219 out1[2] = x306;
2220 out1[3] = x307;
2221 out1[4] = x308;
2222 out1[5] = x309;
2223}
2224
2225/// The function toMontgomery translates a field element into the Montgomery domain.
2226///
2227/// Preconditions:
2228/// 0 ≤ eval arg1 < m
2229/// Postconditions:
2230/// eval (from_montgomery out1) mod m = eval arg1 mod m
2231/// 0 ≤ eval out1 < m
2232///
2233pub fn toMontgomery(out1: *MontgomeryDomainFieldElement, arg1: NonMontgomeryDomainFieldElement) void {
2234 @setRuntimeSafety(mode == .Debug);
2235
2236 const x1 = (arg1[1]);
2237 const x2 = (arg1[2]);
2238 const x3 = (arg1[3]);
2239 const x4 = (arg1[4]);
2240 const x5 = (arg1[5]);
2241 const x6 = (arg1[0]);
2242 var x7: u64 = undefined;
2243 var x8: u64 = undefined;
2244 mulxU64(&x7, &x8, x6, 0xc84ee012b39bf21);
2245 var x9: u64 = undefined;
2246 var x10: u64 = undefined;
2247 mulxU64(&x9, &x10, x6, 0x3fb05b7a28266895);
2248 var x11: u64 = undefined;
2249 var x12: u64 = undefined;
2250 mulxU64(&x11, &x12, x6, 0xd40d49174aab1cc5);
2251 var x13: u64 = undefined;
2252 var x14: u64 = undefined;
2253 mulxU64(&x13, &x14, x6, 0xbc3e483afcb82947);
2254 var x15: u64 = undefined;
2255 var x16: u64 = undefined;
2256 mulxU64(&x15, &x16, x6, 0xff3d81e5df1aa419);
2257 var x17: u64 = undefined;
2258 var x18: u64 = undefined;
2259 mulxU64(&x17, &x18, x6, 0x2d319b2419b409a9);
2260 var x19: u64 = undefined;
2261 var x20: u1 = undefined;
2262 addcarryxU64(&x19, &x20, 0x0, x18, x15);
2263 var x21: u64 = undefined;
2264 var x22: u1 = undefined;
2265 addcarryxU64(&x21, &x22, x20, x16, x13);
2266 var x23: u64 = undefined;
2267 var x24: u1 = undefined;
2268 addcarryxU64(&x23, &x24, x22, x14, x11);
2269 var x25: u64 = undefined;
2270 var x26: u1 = undefined;
2271 addcarryxU64(&x25, &x26, x24, x12, x9);
2272 var x27: u64 = undefined;
2273 var x28: u1 = undefined;
2274 addcarryxU64(&x27, &x28, x26, x10, x7);
2275 var x29: u64 = undefined;
2276 var x30: u64 = undefined;
2277 mulxU64(&x29, &x30, x17, 0x6ed46089e88fdc45);
2278 var x31: u64 = undefined;
2279 var x32: u64 = undefined;
2280 mulxU64(&x31, &x32, x29, 0xffffffffffffffff);
2281 var x33: u64 = undefined;
2282 var x34: u64 = undefined;
2283 mulxU64(&x33, &x34, x29, 0xffffffffffffffff);
2284 var x35: u64 = undefined;
2285 var x36: u64 = undefined;
2286 mulxU64(&x35, &x36, x29, 0xffffffffffffffff);
2287 var x37: u64 = undefined;
2288 var x38: u64 = undefined;
2289 mulxU64(&x37, &x38, x29, 0xc7634d81f4372ddf);
2290 var x39: u64 = undefined;
2291 var x40: u64 = undefined;
2292 mulxU64(&x39, &x40, x29, 0x581a0db248b0a77a);
2293 var x41: u64 = undefined;
2294 var x42: u64 = undefined;
2295 mulxU64(&x41, &x42, x29, 0xecec196accc52973);
2296 var x43: u64 = undefined;
2297 var x44: u1 = undefined;
2298 addcarryxU64(&x43, &x44, 0x0, x42, x39);
2299 var x45: u64 = undefined;
2300 var x46: u1 = undefined;
2301 addcarryxU64(&x45, &x46, x44, x40, x37);
2302 var x47: u64 = undefined;
2303 var x48: u1 = undefined;
2304 addcarryxU64(&x47, &x48, x46, x38, x35);
2305 var x49: u64 = undefined;
2306 var x50: u1 = undefined;
2307 addcarryxU64(&x49, &x50, x48, x36, x33);
2308 var x51: u64 = undefined;
2309 var x52: u1 = undefined;
2310 addcarryxU64(&x51, &x52, x50, x34, x31);
2311 var x53: u64 = undefined;
2312 var x54: u1 = undefined;
2313 addcarryxU64(&x53, &x54, 0x0, x17, x41);
2314 var x55: u64 = undefined;
2315 var x56: u1 = undefined;
2316 addcarryxU64(&x55, &x56, x54, x19, x43);
2317 var x57: u64 = undefined;
2318 var x58: u1 = undefined;
2319 addcarryxU64(&x57, &x58, x56, x21, x45);
2320 var x59: u64 = undefined;
2321 var x60: u1 = undefined;
2322 addcarryxU64(&x59, &x60, x58, x23, x47);
2323 var x61: u64 = undefined;
2324 var x62: u1 = undefined;
2325 addcarryxU64(&x61, &x62, x60, x25, x49);
2326 var x63: u64 = undefined;
2327 var x64: u1 = undefined;
2328 addcarryxU64(&x63, &x64, x62, x27, x51);
2329 var x65: u64 = undefined;
2330 var x66: u1 = undefined;
2331 addcarryxU64(&x65, &x66, x64, (@as(u64, x28) + x8), (@as(u64, x52) + x32));
2332 var x67: u64 = undefined;
2333 var x68: u64 = undefined;
2334 mulxU64(&x67, &x68, x1, 0xc84ee012b39bf21);
2335 var x69: u64 = undefined;
2336 var x70: u64 = undefined;
2337 mulxU64(&x69, &x70, x1, 0x3fb05b7a28266895);
2338 var x71: u64 = undefined;
2339 var x72: u64 = undefined;
2340 mulxU64(&x71, &x72, x1, 0xd40d49174aab1cc5);
2341 var x73: u64 = undefined;
2342 var x74: u64 = undefined;
2343 mulxU64(&x73, &x74, x1, 0xbc3e483afcb82947);
2344 var x75: u64 = undefined;
2345 var x76: u64 = undefined;
2346 mulxU64(&x75, &x76, x1, 0xff3d81e5df1aa419);
2347 var x77: u64 = undefined;
2348 var x78: u64 = undefined;
2349 mulxU64(&x77, &x78, x1, 0x2d319b2419b409a9);
2350 var x79: u64 = undefined;
2351 var x80: u1 = undefined;
2352 addcarryxU64(&x79, &x80, 0x0, x78, x75);
2353 var x81: u64 = undefined;
2354 var x82: u1 = undefined;
2355 addcarryxU64(&x81, &x82, x80, x76, x73);
2356 var x83: u64 = undefined;
2357 var x84: u1 = undefined;
2358 addcarryxU64(&x83, &x84, x82, x74, x71);
2359 var x85: u64 = undefined;
2360 var x86: u1 = undefined;
2361 addcarryxU64(&x85, &x86, x84, x72, x69);
2362 var x87: u64 = undefined;
2363 var x88: u1 = undefined;
2364 addcarryxU64(&x87, &x88, x86, x70, x67);
2365 var x89: u64 = undefined;
2366 var x90: u1 = undefined;
2367 addcarryxU64(&x89, &x90, 0x0, x55, x77);
2368 var x91: u64 = undefined;
2369 var x92: u1 = undefined;
2370 addcarryxU64(&x91, &x92, x90, x57, x79);
2371 var x93: u64 = undefined;
2372 var x94: u1 = undefined;
2373 addcarryxU64(&x93, &x94, x92, x59, x81);
2374 var x95: u64 = undefined;
2375 var x96: u1 = undefined;
2376 addcarryxU64(&x95, &x96, x94, x61, x83);
2377 var x97: u64 = undefined;
2378 var x98: u1 = undefined;
2379 addcarryxU64(&x97, &x98, x96, x63, x85);
2380 var x99: u64 = undefined;
2381 var x100: u1 = undefined;
2382 addcarryxU64(&x99, &x100, x98, x65, x87);
2383 var x101: u64 = undefined;
2384 var x102: u64 = undefined;
2385 mulxU64(&x101, &x102, x89, 0x6ed46089e88fdc45);
2386 var x103: u64 = undefined;
2387 var x104: u64 = undefined;
2388 mulxU64(&x103, &x104, x101, 0xffffffffffffffff);
2389 var x105: u64 = undefined;
2390 var x106: u64 = undefined;
2391 mulxU64(&x105, &x106, x101, 0xffffffffffffffff);
2392 var x107: u64 = undefined;
2393 var x108: u64 = undefined;
2394 mulxU64(&x107, &x108, x101, 0xffffffffffffffff);
2395 var x109: u64 = undefined;
2396 var x110: u64 = undefined;
2397 mulxU64(&x109, &x110, x101, 0xc7634d81f4372ddf);
2398 var x111: u64 = undefined;
2399 var x112: u64 = undefined;
2400 mulxU64(&x111, &x112, x101, 0x581a0db248b0a77a);
2401 var x113: u64 = undefined;
2402 var x114: u64 = undefined;
2403 mulxU64(&x113, &x114, x101, 0xecec196accc52973);
2404 var x115: u64 = undefined;
2405 var x116: u1 = undefined;
2406 addcarryxU64(&x115, &x116, 0x0, x114, x111);
2407 var x117: u64 = undefined;
2408 var x118: u1 = undefined;
2409 addcarryxU64(&x117, &x118, x116, x112, x109);
2410 var x119: u64 = undefined;
2411 var x120: u1 = undefined;
2412 addcarryxU64(&x119, &x120, x118, x110, x107);
2413 var x121: u64 = undefined;
2414 var x122: u1 = undefined;
2415 addcarryxU64(&x121, &x122, x120, x108, x105);
2416 var x123: u64 = undefined;
2417 var x124: u1 = undefined;
2418 addcarryxU64(&x123, &x124, x122, x106, x103);
2419 var x125: u64 = undefined;
2420 var x126: u1 = undefined;
2421 addcarryxU64(&x125, &x126, 0x0, x89, x113);
2422 var x127: u64 = undefined;
2423 var x128: u1 = undefined;
2424 addcarryxU64(&x127, &x128, x126, x91, x115);
2425 var x129: u64 = undefined;
2426 var x130: u1 = undefined;
2427 addcarryxU64(&x129, &x130, x128, x93, x117);
2428 var x131: u64 = undefined;
2429 var x132: u1 = undefined;
2430 addcarryxU64(&x131, &x132, x130, x95, x119);
2431 var x133: u64 = undefined;
2432 var x134: u1 = undefined;
2433 addcarryxU64(&x133, &x134, x132, x97, x121);
2434 var x135: u64 = undefined;
2435 var x136: u1 = undefined;
2436 addcarryxU64(&x135, &x136, x134, x99, x123);
2437 var x137: u64 = undefined;
2438 var x138: u1 = undefined;
2439 addcarryxU64(&x137, &x138, x136, ((@as(u64, x100) + @as(u64, x66)) + (@as(u64, x88) + x68)), (@as(u64, x124) + x104));
2440 var x139: u64 = undefined;
2441 var x140: u64 = undefined;
2442 mulxU64(&x139, &x140, x2, 0xc84ee012b39bf21);
2443 var x141: u64 = undefined;
2444 var x142: u64 = undefined;
2445 mulxU64(&x141, &x142, x2, 0x3fb05b7a28266895);
2446 var x143: u64 = undefined;
2447 var x144: u64 = undefined;
2448 mulxU64(&x143, &x144, x2, 0xd40d49174aab1cc5);
2449 var x145: u64 = undefined;
2450 var x146: u64 = undefined;
2451 mulxU64(&x145, &x146, x2, 0xbc3e483afcb82947);
2452 var x147: u64 = undefined;
2453 var x148: u64 = undefined;
2454 mulxU64(&x147, &x148, x2, 0xff3d81e5df1aa419);
2455 var x149: u64 = undefined;
2456 var x150: u64 = undefined;
2457 mulxU64(&x149, &x150, x2, 0x2d319b2419b409a9);
2458 var x151: u64 = undefined;
2459 var x152: u1 = undefined;
2460 addcarryxU64(&x151, &x152, 0x0, x150, x147);
2461 var x153: u64 = undefined;
2462 var x154: u1 = undefined;
2463 addcarryxU64(&x153, &x154, x152, x148, x145);
2464 var x155: u64 = undefined;
2465 var x156: u1 = undefined;
2466 addcarryxU64(&x155, &x156, x154, x146, x143);
2467 var x157: u64 = undefined;
2468 var x158: u1 = undefined;
2469 addcarryxU64(&x157, &x158, x156, x144, x141);
2470 var x159: u64 = undefined;
2471 var x160: u1 = undefined;
2472 addcarryxU64(&x159, &x160, x158, x142, x139);
2473 var x161: u64 = undefined;
2474 var x162: u1 = undefined;
2475 addcarryxU64(&x161, &x162, 0x0, x127, x149);
2476 var x163: u64 = undefined;
2477 var x164: u1 = undefined;
2478 addcarryxU64(&x163, &x164, x162, x129, x151);
2479 var x165: u64 = undefined;
2480 var x166: u1 = undefined;
2481 addcarryxU64(&x165, &x166, x164, x131, x153);
2482 var x167: u64 = undefined;
2483 var x168: u1 = undefined;
2484 addcarryxU64(&x167, &x168, x166, x133, x155);
2485 var x169: u64 = undefined;
2486 var x170: u1 = undefined;
2487 addcarryxU64(&x169, &x170, x168, x135, x157);
2488 var x171: u64 = undefined;
2489 var x172: u1 = undefined;
2490 addcarryxU64(&x171, &x172, x170, x137, x159);
2491 var x173: u64 = undefined;
2492 var x174: u64 = undefined;
2493 mulxU64(&x173, &x174, x161, 0x6ed46089e88fdc45);
2494 var x175: u64 = undefined;
2495 var x176: u64 = undefined;
2496 mulxU64(&x175, &x176, x173, 0xffffffffffffffff);
2497 var x177: u64 = undefined;
2498 var x178: u64 = undefined;
2499 mulxU64(&x177, &x178, x173, 0xffffffffffffffff);
2500 var x179: u64 = undefined;
2501 var x180: u64 = undefined;
2502 mulxU64(&x179, &x180, x173, 0xffffffffffffffff);
2503 var x181: u64 = undefined;
2504 var x182: u64 = undefined;
2505 mulxU64(&x181, &x182, x173, 0xc7634d81f4372ddf);
2506 var x183: u64 = undefined;
2507 var x184: u64 = undefined;
2508 mulxU64(&x183, &x184, x173, 0x581a0db248b0a77a);
2509 var x185: u64 = undefined;
2510 var x186: u64 = undefined;
2511 mulxU64(&x185, &x186, x173, 0xecec196accc52973);
2512 var x187: u64 = undefined;
2513 var x188: u1 = undefined;
2514 addcarryxU64(&x187, &x188, 0x0, x186, x183);
2515 var x189: u64 = undefined;
2516 var x190: u1 = undefined;
2517 addcarryxU64(&x189, &x190, x188, x184, x181);
2518 var x191: u64 = undefined;
2519 var x192: u1 = undefined;
2520 addcarryxU64(&x191, &x192, x190, x182, x179);
2521 var x193: u64 = undefined;
2522 var x194: u1 = undefined;
2523 addcarryxU64(&x193, &x194, x192, x180, x177);
2524 var x195: u64 = undefined;
2525 var x196: u1 = undefined;
2526 addcarryxU64(&x195, &x196, x194, x178, x175);
2527 var x197: u64 = undefined;
2528 var x198: u1 = undefined;
2529 addcarryxU64(&x197, &x198, 0x0, x161, x185);
2530 var x199: u64 = undefined;
2531 var x200: u1 = undefined;
2532 addcarryxU64(&x199, &x200, x198, x163, x187);
2533 var x201: u64 = undefined;
2534 var x202: u1 = undefined;
2535 addcarryxU64(&x201, &x202, x200, x165, x189);
2536 var x203: u64 = undefined;
2537 var x204: u1 = undefined;
2538 addcarryxU64(&x203, &x204, x202, x167, x191);
2539 var x205: u64 = undefined;
2540 var x206: u1 = undefined;
2541 addcarryxU64(&x205, &x206, x204, x169, x193);
2542 var x207: u64 = undefined;
2543 var x208: u1 = undefined;
2544 addcarryxU64(&x207, &x208, x206, x171, x195);
2545 var x209: u64 = undefined;
2546 var x210: u1 = undefined;
2547 addcarryxU64(&x209, &x210, x208, ((@as(u64, x172) + @as(u64, x138)) + (@as(u64, x160) + x140)), (@as(u64, x196) + x176));
2548 var x211: u64 = undefined;
2549 var x212: u64 = undefined;
2550 mulxU64(&x211, &x212, x3, 0xc84ee012b39bf21);
2551 var x213: u64 = undefined;
2552 var x214: u64 = undefined;
2553 mulxU64(&x213, &x214, x3, 0x3fb05b7a28266895);
2554 var x215: u64 = undefined;
2555 var x216: u64 = undefined;
2556 mulxU64(&x215, &x216, x3, 0xd40d49174aab1cc5);
2557 var x217: u64 = undefined;
2558 var x218: u64 = undefined;
2559 mulxU64(&x217, &x218, x3, 0xbc3e483afcb82947);
2560 var x219: u64 = undefined;
2561 var x220: u64 = undefined;
2562 mulxU64(&x219, &x220, x3, 0xff3d81e5df1aa419);
2563 var x221: u64 = undefined;
2564 var x222: u64 = undefined;
2565 mulxU64(&x221, &x222, x3, 0x2d319b2419b409a9);
2566 var x223: u64 = undefined;
2567 var x224: u1 = undefined;
2568 addcarryxU64(&x223, &x224, 0x0, x222, x219);
2569 var x225: u64 = undefined;
2570 var x226: u1 = undefined;
2571 addcarryxU64(&x225, &x226, x224, x220, x217);
2572 var x227: u64 = undefined;
2573 var x228: u1 = undefined;
2574 addcarryxU64(&x227, &x228, x226, x218, x215);
2575 var x229: u64 = undefined;
2576 var x230: u1 = undefined;
2577 addcarryxU64(&x229, &x230, x228, x216, x213);
2578 var x231: u64 = undefined;
2579 var x232: u1 = undefined;
2580 addcarryxU64(&x231, &x232, x230, x214, x211);
2581 var x233: u64 = undefined;
2582 var x234: u1 = undefined;
2583 addcarryxU64(&x233, &x234, 0x0, x199, x221);
2584 var x235: u64 = undefined;
2585 var x236: u1 = undefined;
2586 addcarryxU64(&x235, &x236, x234, x201, x223);
2587 var x237: u64 = undefined;
2588 var x238: u1 = undefined;
2589 addcarryxU64(&x237, &x238, x236, x203, x225);
2590 var x239: u64 = undefined;
2591 var x240: u1 = undefined;
2592 addcarryxU64(&x239, &x240, x238, x205, x227);
2593 var x241: u64 = undefined;
2594 var x242: u1 = undefined;
2595 addcarryxU64(&x241, &x242, x240, x207, x229);
2596 var x243: u64 = undefined;
2597 var x244: u1 = undefined;
2598 addcarryxU64(&x243, &x244, x242, x209, x231);
2599 var x245: u64 = undefined;
2600 var x246: u64 = undefined;
2601 mulxU64(&x245, &x246, x233, 0x6ed46089e88fdc45);
2602 var x247: u64 = undefined;
2603 var x248: u64 = undefined;
2604 mulxU64(&x247, &x248, x245, 0xffffffffffffffff);
2605 var x249: u64 = undefined;
2606 var x250: u64 = undefined;
2607 mulxU64(&x249, &x250, x245, 0xffffffffffffffff);
2608 var x251: u64 = undefined;
2609 var x252: u64 = undefined;
2610 mulxU64(&x251, &x252, x245, 0xffffffffffffffff);
2611 var x253: u64 = undefined;
2612 var x254: u64 = undefined;
2613 mulxU64(&x253, &x254, x245, 0xc7634d81f4372ddf);
2614 var x255: u64 = undefined;
2615 var x256: u64 = undefined;
2616 mulxU64(&x255, &x256, x245, 0x581a0db248b0a77a);
2617 var x257: u64 = undefined;
2618 var x258: u64 = undefined;
2619 mulxU64(&x257, &x258, x245, 0xecec196accc52973);
2620 var x259: u64 = undefined;
2621 var x260: u1 = undefined;
2622 addcarryxU64(&x259, &x260, 0x0, x258, x255);
2623 var x261: u64 = undefined;
2624 var x262: u1 = undefined;
2625 addcarryxU64(&x261, &x262, x260, x256, x253);
2626 var x263: u64 = undefined;
2627 var x264: u1 = undefined;
2628 addcarryxU64(&x263, &x264, x262, x254, x251);
2629 var x265: u64 = undefined;
2630 var x266: u1 = undefined;
2631 addcarryxU64(&x265, &x266, x264, x252, x249);
2632 var x267: u64 = undefined;
2633 var x268: u1 = undefined;
2634 addcarryxU64(&x267, &x268, x266, x250, x247);
2635 var x269: u64 = undefined;
2636 var x270: u1 = undefined;
2637 addcarryxU64(&x269, &x270, 0x0, x233, x257);
2638 var x271: u64 = undefined;
2639 var x272: u1 = undefined;
2640 addcarryxU64(&x271, &x272, x270, x235, x259);
2641 var x273: u64 = undefined;
2642 var x274: u1 = undefined;
2643 addcarryxU64(&x273, &x274, x272, x237, x261);
2644 var x275: u64 = undefined;
2645 var x276: u1 = undefined;
2646 addcarryxU64(&x275, &x276, x274, x239, x263);
2647 var x277: u64 = undefined;
2648 var x278: u1 = undefined;
2649 addcarryxU64(&x277, &x278, x276, x241, x265);
2650 var x279: u64 = undefined;
2651 var x280: u1 = undefined;
2652 addcarryxU64(&x279, &x280, x278, x243, x267);
2653 var x281: u64 = undefined;
2654 var x282: u1 = undefined;
2655 addcarryxU64(&x281, &x282, x280, ((@as(u64, x244) + @as(u64, x210)) + (@as(u64, x232) + x212)), (@as(u64, x268) + x248));
2656 var x283: u64 = undefined;
2657 var x284: u64 = undefined;
2658 mulxU64(&x283, &x284, x4, 0xc84ee012b39bf21);
2659 var x285: u64 = undefined;
2660 var x286: u64 = undefined;
2661 mulxU64(&x285, &x286, x4, 0x3fb05b7a28266895);
2662 var x287: u64 = undefined;
2663 var x288: u64 = undefined;
2664 mulxU64(&x287, &x288, x4, 0xd40d49174aab1cc5);
2665 var x289: u64 = undefined;
2666 var x290: u64 = undefined;
2667 mulxU64(&x289, &x290, x4, 0xbc3e483afcb82947);
2668 var x291: u64 = undefined;
2669 var x292: u64 = undefined;
2670 mulxU64(&x291, &x292, x4, 0xff3d81e5df1aa419);
2671 var x293: u64 = undefined;
2672 var x294: u64 = undefined;
2673 mulxU64(&x293, &x294, x4, 0x2d319b2419b409a9);
2674 var x295: u64 = undefined;
2675 var x296: u1 = undefined;
2676 addcarryxU64(&x295, &x296, 0x0, x294, x291);
2677 var x297: u64 = undefined;
2678 var x298: u1 = undefined;
2679 addcarryxU64(&x297, &x298, x296, x292, x289);
2680 var x299: u64 = undefined;
2681 var x300: u1 = undefined;
2682 addcarryxU64(&x299, &x300, x298, x290, x287);
2683 var x301: u64 = undefined;
2684 var x302: u1 = undefined;
2685 addcarryxU64(&x301, &x302, x300, x288, x285);
2686 var x303: u64 = undefined;
2687 var x304: u1 = undefined;
2688 addcarryxU64(&x303, &x304, x302, x286, x283);
2689 var x305: u64 = undefined;
2690 var x306: u1 = undefined;
2691 addcarryxU64(&x305, &x306, 0x0, x271, x293);
2692 var x307: u64 = undefined;
2693 var x308: u1 = undefined;
2694 addcarryxU64(&x307, &x308, x306, x273, x295);
2695 var x309: u64 = undefined;
2696 var x310: u1 = undefined;
2697 addcarryxU64(&x309, &x310, x308, x275, x297);
2698 var x311: u64 = undefined;
2699 var x312: u1 = undefined;
2700 addcarryxU64(&x311, &x312, x310, x277, x299);
2701 var x313: u64 = undefined;
2702 var x314: u1 = undefined;
2703 addcarryxU64(&x313, &x314, x312, x279, x301);
2704 var x315: u64 = undefined;
2705 var x316: u1 = undefined;
2706 addcarryxU64(&x315, &x316, x314, x281, x303);
2707 var x317: u64 = undefined;
2708 var x318: u64 = undefined;
2709 mulxU64(&x317, &x318, x305, 0x6ed46089e88fdc45);
2710 var x319: u64 = undefined;
2711 var x320: u64 = undefined;
2712 mulxU64(&x319, &x320, x317, 0xffffffffffffffff);
2713 var x321: u64 = undefined;
2714 var x322: u64 = undefined;
2715 mulxU64(&x321, &x322, x317, 0xffffffffffffffff);
2716 var x323: u64 = undefined;
2717 var x324: u64 = undefined;
2718 mulxU64(&x323, &x324, x317, 0xffffffffffffffff);
2719 var x325: u64 = undefined;
2720 var x326: u64 = undefined;
2721 mulxU64(&x325, &x326, x317, 0xc7634d81f4372ddf);
2722 var x327: u64 = undefined;
2723 var x328: u64 = undefined;
2724 mulxU64(&x327, &x328, x317, 0x581a0db248b0a77a);
2725 var x329: u64 = undefined;
2726 var x330: u64 = undefined;
2727 mulxU64(&x329, &x330, x317, 0xecec196accc52973);
2728 var x331: u64 = undefined;
2729 var x332: u1 = undefined;
2730 addcarryxU64(&x331, &x332, 0x0, x330, x327);
2731 var x333: u64 = undefined;
2732 var x334: u1 = undefined;
2733 addcarryxU64(&x333, &x334, x332, x328, x325);
2734 var x335: u64 = undefined;
2735 var x336: u1 = undefined;
2736 addcarryxU64(&x335, &x336, x334, x326, x323);
2737 var x337: u64 = undefined;
2738 var x338: u1 = undefined;
2739 addcarryxU64(&x337, &x338, x336, x324, x321);
2740 var x339: u64 = undefined;
2741 var x340: u1 = undefined;
2742 addcarryxU64(&x339, &x340, x338, x322, x319);
2743 var x341: u64 = undefined;
2744 var x342: u1 = undefined;
2745 addcarryxU64(&x341, &x342, 0x0, x305, x329);
2746 var x343: u64 = undefined;
2747 var x344: u1 = undefined;
2748 addcarryxU64(&x343, &x344, x342, x307, x331);
2749 var x345: u64 = undefined;
2750 var x346: u1 = undefined;
2751 addcarryxU64(&x345, &x346, x344, x309, x333);
2752 var x347: u64 = undefined;
2753 var x348: u1 = undefined;
2754 addcarryxU64(&x347, &x348, x346, x311, x335);
2755 var x349: u64 = undefined;
2756 var x350: u1 = undefined;
2757 addcarryxU64(&x349, &x350, x348, x313, x337);
2758 var x351: u64 = undefined;
2759 var x352: u1 = undefined;
2760 addcarryxU64(&x351, &x352, x350, x315, x339);
2761 var x353: u64 = undefined;
2762 var x354: u1 = undefined;
2763 addcarryxU64(&x353, &x354, x352, ((@as(u64, x316) + @as(u64, x282)) + (@as(u64, x304) + x284)), (@as(u64, x340) + x320));
2764 var x355: u64 = undefined;
2765 var x356: u64 = undefined;
2766 mulxU64(&x355, &x356, x5, 0xc84ee012b39bf21);
2767 var x357: u64 = undefined;
2768 var x358: u64 = undefined;
2769 mulxU64(&x357, &x358, x5, 0x3fb05b7a28266895);
2770 var x359: u64 = undefined;
2771 var x360: u64 = undefined;
2772 mulxU64(&x359, &x360, x5, 0xd40d49174aab1cc5);
2773 var x361: u64 = undefined;
2774 var x362: u64 = undefined;
2775 mulxU64(&x361, &x362, x5, 0xbc3e483afcb82947);
2776 var x363: u64 = undefined;
2777 var x364: u64 = undefined;
2778 mulxU64(&x363, &x364, x5, 0xff3d81e5df1aa419);
2779 var x365: u64 = undefined;
2780 var x366: u64 = undefined;
2781 mulxU64(&x365, &x366, x5, 0x2d319b2419b409a9);
2782 var x367: u64 = undefined;
2783 var x368: u1 = undefined;
2784 addcarryxU64(&x367, &x368, 0x0, x366, x363);
2785 var x369: u64 = undefined;
2786 var x370: u1 = undefined;
2787 addcarryxU64(&x369, &x370, x368, x364, x361);
2788 var x371: u64 = undefined;
2789 var x372: u1 = undefined;
2790 addcarryxU64(&x371, &x372, x370, x362, x359);
2791 var x373: u64 = undefined;
2792 var x374: u1 = undefined;
2793 addcarryxU64(&x373, &x374, x372, x360, x357);
2794 var x375: u64 = undefined;
2795 var x376: u1 = undefined;
2796 addcarryxU64(&x375, &x376, x374, x358, x355);
2797 var x377: u64 = undefined;
2798 var x378: u1 = undefined;
2799 addcarryxU64(&x377, &x378, 0x0, x343, x365);
2800 var x379: u64 = undefined;
2801 var x380: u1 = undefined;
2802 addcarryxU64(&x379, &x380, x378, x345, x367);
2803 var x381: u64 = undefined;
2804 var x382: u1 = undefined;
2805 addcarryxU64(&x381, &x382, x380, x347, x369);
2806 var x383: u64 = undefined;
2807 var x384: u1 = undefined;
2808 addcarryxU64(&x383, &x384, x382, x349, x371);
2809 var x385: u64 = undefined;
2810 var x386: u1 = undefined;
2811 addcarryxU64(&x385, &x386, x384, x351, x373);
2812 var x387: u64 = undefined;
2813 var x388: u1 = undefined;
2814 addcarryxU64(&x387, &x388, x386, x353, x375);
2815 var x389: u64 = undefined;
2816 var x390: u64 = undefined;
2817 mulxU64(&x389, &x390, x377, 0x6ed46089e88fdc45);
2818 var x391: u64 = undefined;
2819 var x392: u64 = undefined;
2820 mulxU64(&x391, &x392, x389, 0xffffffffffffffff);
2821 var x393: u64 = undefined;
2822 var x394: u64 = undefined;
2823 mulxU64(&x393, &x394, x389, 0xffffffffffffffff);
2824 var x395: u64 = undefined;
2825 var x396: u64 = undefined;
2826 mulxU64(&x395, &x396, x389, 0xffffffffffffffff);
2827 var x397: u64 = undefined;
2828 var x398: u64 = undefined;
2829 mulxU64(&x397, &x398, x389, 0xc7634d81f4372ddf);
2830 var x399: u64 = undefined;
2831 var x400: u64 = undefined;
2832 mulxU64(&x399, &x400, x389, 0x581a0db248b0a77a);
2833 var x401: u64 = undefined;
2834 var x402: u64 = undefined;
2835 mulxU64(&x401, &x402, x389, 0xecec196accc52973);
2836 var x403: u64 = undefined;
2837 var x404: u1 = undefined;
2838 addcarryxU64(&x403, &x404, 0x0, x402, x399);
2839 var x405: u64 = undefined;
2840 var x406: u1 = undefined;
2841 addcarryxU64(&x405, &x406, x404, x400, x397);
2842 var x407: u64 = undefined;
2843 var x408: u1 = undefined;
2844 addcarryxU64(&x407, &x408, x406, x398, x395);
2845 var x409: u64 = undefined;
2846 var x410: u1 = undefined;
2847 addcarryxU64(&x409, &x410, x408, x396, x393);
2848 var x411: u64 = undefined;
2849 var x412: u1 = undefined;
2850 addcarryxU64(&x411, &x412, x410, x394, x391);
2851 var x413: u64 = undefined;
2852 var x414: u1 = undefined;
2853 addcarryxU64(&x413, &x414, 0x0, x377, x401);
2854 var x415: u64 = undefined;
2855 var x416: u1 = undefined;
2856 addcarryxU64(&x415, &x416, x414, x379, x403);
2857 var x417: u64 = undefined;
2858 var x418: u1 = undefined;
2859 addcarryxU64(&x417, &x418, x416, x381, x405);
2860 var x419: u64 = undefined;
2861 var x420: u1 = undefined;
2862 addcarryxU64(&x419, &x420, x418, x383, x407);
2863 var x421: u64 = undefined;
2864 var x422: u1 = undefined;
2865 addcarryxU64(&x421, &x422, x420, x385, x409);
2866 var x423: u64 = undefined;
2867 var x424: u1 = undefined;
2868 addcarryxU64(&x423, &x424, x422, x387, x411);
2869 var x425: u64 = undefined;
2870 var x426: u1 = undefined;
2871 addcarryxU64(&x425, &x426, x424, ((@as(u64, x388) + @as(u64, x354)) + (@as(u64, x376) + x356)), (@as(u64, x412) + x392));
2872 var x427: u64 = undefined;
2873 var x428: u1 = undefined;
2874 subborrowxU64(&x427, &x428, 0x0, x415, 0xecec196accc52973);
2875 var x429: u64 = undefined;
2876 var x430: u1 = undefined;
2877 subborrowxU64(&x429, &x430, x428, x417, 0x581a0db248b0a77a);
2878 var x431: u64 = undefined;
2879 var x432: u1 = undefined;
2880 subborrowxU64(&x431, &x432, x430, x419, 0xc7634d81f4372ddf);
2881 var x433: u64 = undefined;
2882 var x434: u1 = undefined;
2883 subborrowxU64(&x433, &x434, x432, x421, 0xffffffffffffffff);
2884 var x435: u64 = undefined;
2885 var x436: u1 = undefined;
2886 subborrowxU64(&x435, &x436, x434, x423, 0xffffffffffffffff);
2887 var x437: u64 = undefined;
2888 var x438: u1 = undefined;
2889 subborrowxU64(&x437, &x438, x436, x425, 0xffffffffffffffff);
2890 var x439: u64 = undefined;
2891 var x440: u1 = undefined;
2892 subborrowxU64(&x439, &x440, x438, @as(u64, x426), 0x0);
2893 var x441: u64 = undefined;
2894 cmovznzU64(&x441, x440, x427, x415);
2895 var x442: u64 = undefined;
2896 cmovznzU64(&x442, x440, x429, x417);
2897 var x443: u64 = undefined;
2898 cmovznzU64(&x443, x440, x431, x419);
2899 var x444: u64 = undefined;
2900 cmovznzU64(&x444, x440, x433, x421);
2901 var x445: u64 = undefined;
2902 cmovznzU64(&x445, x440, x435, x423);
2903 var x446: u64 = undefined;
2904 cmovznzU64(&x446, x440, x437, x425);
2905 out1[0] = x441;
2906 out1[1] = x442;
2907 out1[2] = x443;
2908 out1[3] = x444;
2909 out1[4] = x445;
2910 out1[5] = x446;
2911}
2912
2913/// The function nonzero outputs a single non-zero word if the input is non-zero and zero otherwise.
2914///
2915/// Preconditions:
2916/// 0 ≤ eval arg1 < m
2917/// Postconditions:
2918/// out1 = 0 ↔ eval (from_montgomery arg1) mod m = 0
2919///
2920/// Input Bounds:
2921/// arg1: [[0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff]]
2922/// Output Bounds:
2923/// out1: [0x0 ~> 0xffffffffffffffff]
2924pub fn nonzero(out1: *u64, arg1: [6]u64) void {
2925 @setRuntimeSafety(mode == .Debug);
2926
2927 const x1 = ((arg1[0]) | ((arg1[1]) | ((arg1[2]) | ((arg1[3]) | ((arg1[4]) | (arg1[5]))))));
2928 out1.* = x1;
2929}
2930
2931/// The function selectznz is a multi-limb conditional select.
2932///
2933/// Postconditions:
2934/// out1 = (if arg1 = 0 then arg2 else arg3)
2935///
2936/// Input Bounds:
2937/// arg1: [0x0 ~> 0x1]
2938/// arg2: [[0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff]]
2939/// arg3: [[0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff]]
2940/// Output Bounds:
2941/// out1: [[0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff]]
2942pub fn selectznz(out1: *[6]u64, arg1: u1, arg2: [6]u64, arg3: [6]u64) void {
2943 @setRuntimeSafety(mode == .Debug);
2944
2945 var x1: u64 = undefined;
2946 cmovznzU64(&x1, arg1, (arg2[0]), (arg3[0]));
2947 var x2: u64 = undefined;
2948 cmovznzU64(&x2, arg1, (arg2[1]), (arg3[1]));
2949 var x3: u64 = undefined;
2950 cmovznzU64(&x3, arg1, (arg2[2]), (arg3[2]));
2951 var x4: u64 = undefined;
2952 cmovznzU64(&x4, arg1, (arg2[3]), (arg3[3]));
2953 var x5: u64 = undefined;
2954 cmovznzU64(&x5, arg1, (arg2[4]), (arg3[4]));
2955 var x6: u64 = undefined;
2956 cmovznzU64(&x6, arg1, (arg2[5]), (arg3[5]));
2957 out1[0] = x1;
2958 out1[1] = x2;
2959 out1[2] = x3;
2960 out1[3] = x4;
2961 out1[4] = x5;
2962 out1[5] = x6;
2963}
2964
2965/// The function toBytes serializes a field element NOT in the Montgomery domain to bytes in little-endian order.
2966///
2967/// Preconditions:
2968/// 0 ≤ eval arg1 < m
2969/// Postconditions:
2970/// out1 = map (λ x, ⌊((eval arg1 mod m) mod 2^(8 * (x + 1))) / 2^(8 * x)⌋) [0..47]
2971///
2972/// Input Bounds:
2973/// arg1: [[0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff]]
2974/// Output Bounds:
2975/// 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], [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]]
2976pub fn toBytes(out1: *[48]u8, arg1: [6]u64) void {
2977 @setRuntimeSafety(mode == .Debug);
2978
2979 const x1 = (arg1[5]);
2980 const x2 = (arg1[4]);
2981 const x3 = (arg1[3]);
2982 const x4 = (arg1[2]);
2983 const x5 = (arg1[1]);
2984 const x6 = (arg1[0]);
2985 const x7 = @truncate(u8, (x6 & 0xff));
2986 const x8 = (x6 >> 8);
2987 const x9 = @truncate(u8, (x8 & 0xff));
2988 const x10 = (x8 >> 8);
2989 const x11 = @truncate(u8, (x10 & 0xff));
2990 const x12 = (x10 >> 8);
2991 const x13 = @truncate(u8, (x12 & 0xff));
2992 const x14 = (x12 >> 8);
2993 const x15 = @truncate(u8, (x14 & 0xff));
2994 const x16 = (x14 >> 8);
2995 const x17 = @truncate(u8, (x16 & 0xff));
2996 const x18 = (x16 >> 8);
2997 const x19 = @truncate(u8, (x18 & 0xff));
2998 const x20 = @truncate(u8, (x18 >> 8));
2999 const x21 = @truncate(u8, (x5 & 0xff));
3000 const x22 = (x5 >> 8);
3001 const x23 = @truncate(u8, (x22 & 0xff));
3002 const x24 = (x22 >> 8);
3003 const x25 = @truncate(u8, (x24 & 0xff));
3004 const x26 = (x24 >> 8);
3005 const x27 = @truncate(u8, (x26 & 0xff));
3006 const x28 = (x26 >> 8);
3007 const x29 = @truncate(u8, (x28 & 0xff));
3008 const x30 = (x28 >> 8);
3009 const x31 = @truncate(u8, (x30 & 0xff));
3010 const x32 = (x30 >> 8);
3011 const x33 = @truncate(u8, (x32 & 0xff));
3012 const x34 = @truncate(u8, (x32 >> 8));
3013 const x35 = @truncate(u8, (x4 & 0xff));
3014 const x36 = (x4 >> 8);
3015 const x37 = @truncate(u8, (x36 & 0xff));
3016 const x38 = (x36 >> 8);
3017 const x39 = @truncate(u8, (x38 & 0xff));
3018 const x40 = (x38 >> 8);
3019 const x41 = @truncate(u8, (x40 & 0xff));
3020 const x42 = (x40 >> 8);
3021 const x43 = @truncate(u8, (x42 & 0xff));
3022 const x44 = (x42 >> 8);
3023 const x45 = @truncate(u8, (x44 & 0xff));
3024 const x46 = (x44 >> 8);
3025 const x47 = @truncate(u8, (x46 & 0xff));
3026 const x48 = @truncate(u8, (x46 >> 8));
3027 const x49 = @truncate(u8, (x3 & 0xff));
3028 const x50 = (x3 >> 8);
3029 const x51 = @truncate(u8, (x50 & 0xff));
3030 const x52 = (x50 >> 8);
3031 const x53 = @truncate(u8, (x52 & 0xff));
3032 const x54 = (x52 >> 8);
3033 const x55 = @truncate(u8, (x54 & 0xff));
3034 const x56 = (x54 >> 8);
3035 const x57 = @truncate(u8, (x56 & 0xff));
3036 const x58 = (x56 >> 8);
3037 const x59 = @truncate(u8, (x58 & 0xff));
3038 const x60 = (x58 >> 8);
3039 const x61 = @truncate(u8, (x60 & 0xff));
3040 const x62 = @truncate(u8, (x60 >> 8));
3041 const x63 = @truncate(u8, (x2 & 0xff));
3042 const x64 = (x2 >> 8);
3043 const x65 = @truncate(u8, (x64 & 0xff));
3044 const x66 = (x64 >> 8);
3045 const x67 = @truncate(u8, (x66 & 0xff));
3046 const x68 = (x66 >> 8);
3047 const x69 = @truncate(u8, (x68 & 0xff));
3048 const x70 = (x68 >> 8);
3049 const x71 = @truncate(u8, (x70 & 0xff));
3050 const x72 = (x70 >> 8);
3051 const x73 = @truncate(u8, (x72 & 0xff));
3052 const x74 = (x72 >> 8);
3053 const x75 = @truncate(u8, (x74 & 0xff));
3054 const x76 = @truncate(u8, (x74 >> 8));
3055 const x77 = @truncate(u8, (x1 & 0xff));
3056 const x78 = (x1 >> 8);
3057 const x79 = @truncate(u8, (x78 & 0xff));
3058 const x80 = (x78 >> 8);
3059 const x81 = @truncate(u8, (x80 & 0xff));
3060 const x82 = (x80 >> 8);
3061 const x83 = @truncate(u8, (x82 & 0xff));
3062 const x84 = (x82 >> 8);
3063 const x85 = @truncate(u8, (x84 & 0xff));
3064 const x86 = (x84 >> 8);
3065 const x87 = @truncate(u8, (x86 & 0xff));
3066 const x88 = (x86 >> 8);
3067 const x89 = @truncate(u8, (x88 & 0xff));
3068 const x90 = @truncate(u8, (x88 >> 8));
3069 out1[0] = x7;
3070 out1[1] = x9;
3071 out1[2] = x11;
3072 out1[3] = x13;
3073 out1[4] = x15;
3074 out1[5] = x17;
3075 out1[6] = x19;
3076 out1[7] = x20;
3077 out1[8] = x21;
3078 out1[9] = x23;
3079 out1[10] = x25;
3080 out1[11] = x27;
3081 out1[12] = x29;
3082 out1[13] = x31;
3083 out1[14] = x33;
3084 out1[15] = x34;
3085 out1[16] = x35;
3086 out1[17] = x37;
3087 out1[18] = x39;
3088 out1[19] = x41;
3089 out1[20] = x43;
3090 out1[21] = x45;
3091 out1[22] = x47;
3092 out1[23] = x48;
3093 out1[24] = x49;
3094 out1[25] = x51;
3095 out1[26] = x53;
3096 out1[27] = x55;
3097 out1[28] = x57;
3098 out1[29] = x59;
3099 out1[30] = x61;
3100 out1[31] = x62;
3101 out1[32] = x63;
3102 out1[33] = x65;
3103 out1[34] = x67;
3104 out1[35] = x69;
3105 out1[36] = x71;
3106 out1[37] = x73;
3107 out1[38] = x75;
3108 out1[39] = x76;
3109 out1[40] = x77;
3110 out1[41] = x79;
3111 out1[42] = x81;
3112 out1[43] = x83;
3113 out1[44] = x85;
3114 out1[45] = x87;
3115 out1[46] = x89;
3116 out1[47] = x90;
3117}
3118
3119/// The function fromBytes deserializes a field element NOT in the Montgomery domain from bytes in little-endian order.
3120///
3121/// Preconditions:
3122/// 0 ≤ bytes_eval arg1 < m
3123/// Postconditions:
3124/// eval out1 mod m = bytes_eval arg1 mod m
3125/// 0 ≤ eval out1 < m
3126///
3127/// Input Bounds:
3128/// 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], [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]]
3129/// Output Bounds:
3130/// out1: [[0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff]]
3131pub fn fromBytes(out1: *[6]u64, arg1: [48]u8) void {
3132 @setRuntimeSafety(mode == .Debug);
3133
3134 const x1 = (@as(u64, (arg1[47])) << 56);
3135 const x2 = (@as(u64, (arg1[46])) << 48);
3136 const x3 = (@as(u64, (arg1[45])) << 40);
3137 const x4 = (@as(u64, (arg1[44])) << 32);
3138 const x5 = (@as(u64, (arg1[43])) << 24);
3139 const x6 = (@as(u64, (arg1[42])) << 16);
3140 const x7 = (@as(u64, (arg1[41])) << 8);
3141 const x8 = (arg1[40]);
3142 const x9 = (@as(u64, (arg1[39])) << 56);
3143 const x10 = (@as(u64, (arg1[38])) << 48);
3144 const x11 = (@as(u64, (arg1[37])) << 40);
3145 const x12 = (@as(u64, (arg1[36])) << 32);
3146 const x13 = (@as(u64, (arg1[35])) << 24);
3147 const x14 = (@as(u64, (arg1[34])) << 16);
3148 const x15 = (@as(u64, (arg1[33])) << 8);
3149 const x16 = (arg1[32]);
3150 const x17 = (@as(u64, (arg1[31])) << 56);
3151 const x18 = (@as(u64, (arg1[30])) << 48);
3152 const x19 = (@as(u64, (arg1[29])) << 40);
3153 const x20 = (@as(u64, (arg1[28])) << 32);
3154 const x21 = (@as(u64, (arg1[27])) << 24);
3155 const x22 = (@as(u64, (arg1[26])) << 16);
3156 const x23 = (@as(u64, (arg1[25])) << 8);
3157 const x24 = (arg1[24]);
3158 const x25 = (@as(u64, (arg1[23])) << 56);
3159 const x26 = (@as(u64, (arg1[22])) << 48);
3160 const x27 = (@as(u64, (arg1[21])) << 40);
3161 const x28 = (@as(u64, (arg1[20])) << 32);
3162 const x29 = (@as(u64, (arg1[19])) << 24);
3163 const x30 = (@as(u64, (arg1[18])) << 16);
3164 const x31 = (@as(u64, (arg1[17])) << 8);
3165 const x32 = (arg1[16]);
3166 const x33 = (@as(u64, (arg1[15])) << 56);
3167 const x34 = (@as(u64, (arg1[14])) << 48);
3168 const x35 = (@as(u64, (arg1[13])) << 40);
3169 const x36 = (@as(u64, (arg1[12])) << 32);
3170 const x37 = (@as(u64, (arg1[11])) << 24);
3171 const x38 = (@as(u64, (arg1[10])) << 16);
3172 const x39 = (@as(u64, (arg1[9])) << 8);
3173 const x40 = (arg1[8]);
3174 const x41 = (@as(u64, (arg1[7])) << 56);
3175 const x42 = (@as(u64, (arg1[6])) << 48);
3176 const x43 = (@as(u64, (arg1[5])) << 40);
3177 const x44 = (@as(u64, (arg1[4])) << 32);
3178 const x45 = (@as(u64, (arg1[3])) << 24);
3179 const x46 = (@as(u64, (arg1[2])) << 16);
3180 const x47 = (@as(u64, (arg1[1])) << 8);
3181 const x48 = (arg1[0]);
3182 const x49 = (x47 + @as(u64, x48));
3183 const x50 = (x46 + x49);
3184 const x51 = (x45 + x50);
3185 const x52 = (x44 + x51);
3186 const x53 = (x43 + x52);
3187 const x54 = (x42 + x53);
3188 const x55 = (x41 + x54);
3189 const x56 = (x39 + @as(u64, x40));
3190 const x57 = (x38 + x56);
3191 const x58 = (x37 + x57);
3192 const x59 = (x36 + x58);
3193 const x60 = (x35 + x59);
3194 const x61 = (x34 + x60);
3195 const x62 = (x33 + x61);
3196 const x63 = (x31 + @as(u64, x32));
3197 const x64 = (x30 + x63);
3198 const x65 = (x29 + x64);
3199 const x66 = (x28 + x65);
3200 const x67 = (x27 + x66);
3201 const x68 = (x26 + x67);
3202 const x69 = (x25 + x68);
3203 const x70 = (x23 + @as(u64, x24));
3204 const x71 = (x22 + x70);
3205 const x72 = (x21 + x71);
3206 const x73 = (x20 + x72);
3207 const x74 = (x19 + x73);
3208 const x75 = (x18 + x74);
3209 const x76 = (x17 + x75);
3210 const x77 = (x15 + @as(u64, x16));
3211 const x78 = (x14 + x77);
3212 const x79 = (x13 + x78);
3213 const x80 = (x12 + x79);
3214 const x81 = (x11 + x80);
3215 const x82 = (x10 + x81);
3216 const x83 = (x9 + x82);
3217 const x84 = (x7 + @as(u64, x8));
3218 const x85 = (x6 + x84);
3219 const x86 = (x5 + x85);
3220 const x87 = (x4 + x86);
3221 const x88 = (x3 + x87);
3222 const x89 = (x2 + x88);
3223 const x90 = (x1 + x89);
3224 out1[0] = x55;
3225 out1[1] = x62;
3226 out1[2] = x69;
3227 out1[3] = x76;
3228 out1[4] = x83;
3229 out1[5] = x90;
3230}
3231
3232/// The function setOne returns the field element one in the Montgomery domain.
3233///
3234/// Postconditions:
3235/// eval (from_montgomery out1) mod m = 1 mod m
3236/// 0 ≤ eval out1 < m
3237///
3238pub fn setOne(out1: *MontgomeryDomainFieldElement) void {
3239 @setRuntimeSafety(mode == .Debug);
3240
3241 out1[0] = 0x1313e695333ad68d;
3242 out1[1] = 0xa7e5f24db74f5885;
3243 out1[2] = 0x389cb27e0bc8d220;
3244 out1[3] = 0x0;
3245 out1[4] = 0x0;
3246 out1[5] = 0x0;
3247}
3248
3249/// The function msat returns the saturated representation of the prime modulus.
3250///
3251/// Postconditions:
3252/// twos_complement_eval out1 = m
3253/// 0 ≤ eval out1 < m
3254///
3255/// Output Bounds:
3256/// out1: [[0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff]]
3257pub fn msat(out1: *[7]u64) void {
3258 @setRuntimeSafety(mode == .Debug);
3259
3260 out1[0] = 0xecec196accc52973;
3261 out1[1] = 0x581a0db248b0a77a;
3262 out1[2] = 0xc7634d81f4372ddf;
3263 out1[3] = 0xffffffffffffffff;
3264 out1[4] = 0xffffffffffffffff;
3265 out1[5] = 0xffffffffffffffff;
3266 out1[6] = 0x0;
3267}
3268
3269/// The function divstep computes a divstep.
3270///
3271/// Preconditions:
3272/// 0 ≤ eval arg4 < m
3273/// 0 ≤ eval arg5 < m
3274/// Postconditions:
3275/// out1 = (if 0 < arg1 ∧ (twos_complement_eval arg3) is odd then 1 - arg1 else 1 + arg1)
3276/// twos_complement_eval out2 = (if 0 < arg1 ∧ (twos_complement_eval arg3) is odd then twos_complement_eval arg3 else twos_complement_eval arg2)
3277/// 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⌋)
3278/// 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)
3279/// 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)
3280/// 0 ≤ eval out5 < m
3281/// 0 ≤ eval out5 < m
3282/// 0 ≤ eval out2 < m
3283/// 0 ≤ eval out3 < m
3284///
3285/// Input Bounds:
3286/// arg1: [0x0 ~> 0xffffffffffffffff]
3287/// arg2: [[0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff]]
3288/// arg3: [[0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff]]
3289/// arg4: [[0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff]]
3290/// arg5: [[0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff]]
3291/// Output Bounds:
3292/// out1: [0x0 ~> 0xffffffffffffffff]
3293/// out2: [[0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff]]
3294/// out3: [[0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff]]
3295/// out4: [[0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff]]
3296/// out5: [[0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff]]
3297pub fn divstep(out1: *u64, out2: *[7]u64, out3: *[7]u64, out4: *[6]u64, out5: *[6]u64, arg1: u64, arg2: [7]u64, arg3: [7]u64, arg4: [6]u64, arg5: [6]u64) void {
3298 @setRuntimeSafety(mode == .Debug);
3299
3300 var x1: u64 = undefined;
3301 var x2: u1 = undefined;
3302 addcarryxU64(&x1, &x2, 0x0, (~arg1), 0x1);
3303 const x3 = (@truncate(u1, (x1 >> 63)) & @truncate(u1, ((arg3[0]) & 0x1)));
3304 var x4: u64 = undefined;
3305 var x5: u1 = undefined;
3306 addcarryxU64(&x4, &x5, 0x0, (~arg1), 0x1);
3307 var x6: u64 = undefined;
3308 cmovznzU64(&x6, x3, arg1, x4);
3309 var x7: u64 = undefined;
3310 cmovznzU64(&x7, x3, (arg2[0]), (arg3[0]));
3311 var x8: u64 = undefined;
3312 cmovznzU64(&x8, x3, (arg2[1]), (arg3[1]));
3313 var x9: u64 = undefined;
3314 cmovznzU64(&x9, x3, (arg2[2]), (arg3[2]));
3315 var x10: u64 = undefined;
3316 cmovznzU64(&x10, x3, (arg2[3]), (arg3[3]));
3317 var x11: u64 = undefined;
3318 cmovznzU64(&x11, x3, (arg2[4]), (arg3[4]));
3319 var x12: u64 = undefined;
3320 cmovznzU64(&x12, x3, (arg2[5]), (arg3[5]));
3321 var x13: u64 = undefined;
3322 cmovznzU64(&x13, x3, (arg2[6]), (arg3[6]));
3323 var x14: u64 = undefined;
3324 var x15: u1 = undefined;
3325 addcarryxU64(&x14, &x15, 0x0, 0x1, (~(arg2[0])));
3326 var x16: u64 = undefined;
3327 var x17: u1 = undefined;
3328 addcarryxU64(&x16, &x17, x15, 0x0, (~(arg2[1])));
3329 var x18: u64 = undefined;
3330 var x19: u1 = undefined;
3331 addcarryxU64(&x18, &x19, x17, 0x0, (~(arg2[2])));
3332 var x20: u64 = undefined;
3333 var x21: u1 = undefined;
3334 addcarryxU64(&x20, &x21, x19, 0x0, (~(arg2[3])));
3335 var x22: u64 = undefined;
3336 var x23: u1 = undefined;
3337 addcarryxU64(&x22, &x23, x21, 0x0, (~(arg2[4])));
3338 var x24: u64 = undefined;
3339 var x25: u1 = undefined;
3340 addcarryxU64(&x24, &x25, x23, 0x0, (~(arg2[5])));
3341 var x26: u64 = undefined;
3342 var x27: u1 = undefined;
3343 addcarryxU64(&x26, &x27, x25, 0x0, (~(arg2[6])));
3344 var x28: u64 = undefined;
3345 cmovznzU64(&x28, x3, (arg3[0]), x14);
3346 var x29: u64 = undefined;
3347 cmovznzU64(&x29, x3, (arg3[1]), x16);
3348 var x30: u64 = undefined;
3349 cmovznzU64(&x30, x3, (arg3[2]), x18);
3350 var x31: u64 = undefined;
3351 cmovznzU64(&x31, x3, (arg3[3]), x20);
3352 var x32: u64 = undefined;
3353 cmovznzU64(&x32, x3, (arg3[4]), x22);
3354 var x33: u64 = undefined;
3355 cmovznzU64(&x33, x3, (arg3[5]), x24);
3356 var x34: u64 = undefined;
3357 cmovznzU64(&x34, x3, (arg3[6]), x26);
3358 var x35: u64 = undefined;
3359 cmovznzU64(&x35, x3, (arg4[0]), (arg5[0]));
3360 var x36: u64 = undefined;
3361 cmovznzU64(&x36, x3, (arg4[1]), (arg5[1]));
3362 var x37: u64 = undefined;
3363 cmovznzU64(&x37, x3, (arg4[2]), (arg5[2]));
3364 var x38: u64 = undefined;
3365 cmovznzU64(&x38, x3, (arg4[3]), (arg5[3]));
3366 var x39: u64 = undefined;
3367 cmovznzU64(&x39, x3, (arg4[4]), (arg5[4]));
3368 var x40: u64 = undefined;
3369 cmovznzU64(&x40, x3, (arg4[5]), (arg5[5]));
3370 var x41: u64 = undefined;
3371 var x42: u1 = undefined;
3372 addcarryxU64(&x41, &x42, 0x0, x35, x35);
3373 var x43: u64 = undefined;
3374 var x44: u1 = undefined;
3375 addcarryxU64(&x43, &x44, x42, x36, x36);
3376 var x45: u64 = undefined;
3377 var x46: u1 = undefined;
3378 addcarryxU64(&x45, &x46, x44, x37, x37);
3379 var x47: u64 = undefined;
3380 var x48: u1 = undefined;
3381 addcarryxU64(&x47, &x48, x46, x38, x38);
3382 var x49: u64 = undefined;
3383 var x50: u1 = undefined;
3384 addcarryxU64(&x49, &x50, x48, x39, x39);
3385 var x51: u64 = undefined;
3386 var x52: u1 = undefined;
3387 addcarryxU64(&x51, &x52, x50, x40, x40);
3388 var x53: u64 = undefined;
3389 var x54: u1 = undefined;
3390 subborrowxU64(&x53, &x54, 0x0, x41, 0xecec196accc52973);
3391 var x55: u64 = undefined;
3392 var x56: u1 = undefined;
3393 subborrowxU64(&x55, &x56, x54, x43, 0x581a0db248b0a77a);
3394 var x57: u64 = undefined;
3395 var x58: u1 = undefined;
3396 subborrowxU64(&x57, &x58, x56, x45, 0xc7634d81f4372ddf);
3397 var x59: u64 = undefined;
3398 var x60: u1 = undefined;
3399 subborrowxU64(&x59, &x60, x58, x47, 0xffffffffffffffff);
3400 var x61: u64 = undefined;
3401 var x62: u1 = undefined;
3402 subborrowxU64(&x61, &x62, x60, x49, 0xffffffffffffffff);
3403 var x63: u64 = undefined;
3404 var x64: u1 = undefined;
3405 subborrowxU64(&x63, &x64, x62, x51, 0xffffffffffffffff);
3406 var x65: u64 = undefined;
3407 var x66: u1 = undefined;
3408 subborrowxU64(&x65, &x66, x64, @as(u64, x52), 0x0);
3409 const x67 = (arg4[5]);
3410 const x68 = (arg4[4]);
3411 const x69 = (arg4[3]);
3412 const x70 = (arg4[2]);
3413 const x71 = (arg4[1]);
3414 const x72 = (arg4[0]);
3415 var x73: u64 = undefined;
3416 var x74: u1 = undefined;
3417 subborrowxU64(&x73, &x74, 0x0, 0x0, x72);
3418 var x75: u64 = undefined;
3419 var x76: u1 = undefined;
3420 subborrowxU64(&x75, &x76, x74, 0x0, x71);
3421 var x77: u64 = undefined;
3422 var x78: u1 = undefined;
3423 subborrowxU64(&x77, &x78, x76, 0x0, x70);
3424 var x79: u64 = undefined;
3425 var x80: u1 = undefined;
3426 subborrowxU64(&x79, &x80, x78, 0x0, x69);
3427 var x81: u64 = undefined;
3428 var x82: u1 = undefined;
3429 subborrowxU64(&x81, &x82, x80, 0x0, x68);
3430 var x83: u64 = undefined;
3431 var x84: u1 = undefined;
3432 subborrowxU64(&x83, &x84, x82, 0x0, x67);
3433 var x85: u64 = undefined;
3434 cmovznzU64(&x85, x84, 0x0, 0xffffffffffffffff);
3435 var x86: u64 = undefined;
3436 var x87: u1 = undefined;
3437 addcarryxU64(&x86, &x87, 0x0, x73, (x85 & 0xecec196accc52973));
3438 var x88: u64 = undefined;
3439 var x89: u1 = undefined;
3440 addcarryxU64(&x88, &x89, x87, x75, (x85 & 0x581a0db248b0a77a));
3441 var x90: u64 = undefined;
3442 var x91: u1 = undefined;
3443 addcarryxU64(&x90, &x91, x89, x77, (x85 & 0xc7634d81f4372ddf));
3444 var x92: u64 = undefined;
3445 var x93: u1 = undefined;
3446 addcarryxU64(&x92, &x93, x91, x79, x85);
3447 var x94: u64 = undefined;
3448 var x95: u1 = undefined;
3449 addcarryxU64(&x94, &x95, x93, x81, x85);
3450 var x96: u64 = undefined;
3451 var x97: u1 = undefined;
3452 addcarryxU64(&x96, &x97, x95, x83, x85);
3453 var x98: u64 = undefined;
3454 cmovznzU64(&x98, x3, (arg5[0]), x86);
3455 var x99: u64 = undefined;
3456 cmovznzU64(&x99, x3, (arg5[1]), x88);
3457 var x100: u64 = undefined;
3458 cmovznzU64(&x100, x3, (arg5[2]), x90);
3459 var x101: u64 = undefined;
3460 cmovznzU64(&x101, x3, (arg5[3]), x92);
3461 var x102: u64 = undefined;
3462 cmovznzU64(&x102, x3, (arg5[4]), x94);
3463 var x103: u64 = undefined;
3464 cmovznzU64(&x103, x3, (arg5[5]), x96);
3465 const x104 = @truncate(u1, (x28 & 0x1));
3466 var x105: u64 = undefined;
3467 cmovznzU64(&x105, x104, 0x0, x7);
3468 var x106: u64 = undefined;
3469 cmovznzU64(&x106, x104, 0x0, x8);
3470 var x107: u64 = undefined;
3471 cmovznzU64(&x107, x104, 0x0, x9);
3472 var x108: u64 = undefined;
3473 cmovznzU64(&x108, x104, 0x0, x10);
3474 var x109: u64 = undefined;
3475 cmovznzU64(&x109, x104, 0x0, x11);
3476 var x110: u64 = undefined;
3477 cmovznzU64(&x110, x104, 0x0, x12);
3478 var x111: u64 = undefined;
3479 cmovznzU64(&x111, x104, 0x0, x13);
3480 var x112: u64 = undefined;
3481 var x113: u1 = undefined;
3482 addcarryxU64(&x112, &x113, 0x0, x28, x105);
3483 var x114: u64 = undefined;
3484 var x115: u1 = undefined;
3485 addcarryxU64(&x114, &x115, x113, x29, x106);
3486 var x116: u64 = undefined;
3487 var x117: u1 = undefined;
3488 addcarryxU64(&x116, &x117, x115, x30, x107);
3489 var x118: u64 = undefined;
3490 var x119: u1 = undefined;
3491 addcarryxU64(&x118, &x119, x117, x31, x108);
3492 var x120: u64 = undefined;
3493 var x121: u1 = undefined;
3494 addcarryxU64(&x120, &x121, x119, x32, x109);
3495 var x122: u64 = undefined;
3496 var x123: u1 = undefined;
3497 addcarryxU64(&x122, &x123, x121, x33, x110);
3498 var x124: u64 = undefined;
3499 var x125: u1 = undefined;
3500 addcarryxU64(&x124, &x125, x123, x34, x111);
3501 var x126: u64 = undefined;
3502 cmovznzU64(&x126, x104, 0x0, x35);
3503 var x127: u64 = undefined;
3504 cmovznzU64(&x127, x104, 0x0, x36);
3505 var x128: u64 = undefined;
3506 cmovznzU64(&x128, x104, 0x0, x37);
3507 var x129: u64 = undefined;
3508 cmovznzU64(&x129, x104, 0x0, x38);
3509 var x130: u64 = undefined;
3510 cmovznzU64(&x130, x104, 0x0, x39);
3511 var x131: u64 = undefined;
3512 cmovznzU64(&x131, x104, 0x0, x40);
3513 var x132: u64 = undefined;
3514 var x133: u1 = undefined;
3515 addcarryxU64(&x132, &x133, 0x0, x98, x126);
3516 var x134: u64 = undefined;
3517 var x135: u1 = undefined;
3518 addcarryxU64(&x134, &x135, x133, x99, x127);
3519 var x136: u64 = undefined;
3520 var x137: u1 = undefined;
3521 addcarryxU64(&x136, &x137, x135, x100, x128);
3522 var x138: u64 = undefined;
3523 var x139: u1 = undefined;
3524 addcarryxU64(&x138, &x139, x137, x101, x129);
3525 var x140: u64 = undefined;
3526 var x141: u1 = undefined;
3527 addcarryxU64(&x140, &x141, x139, x102, x130);
3528 var x142: u64 = undefined;
3529 var x143: u1 = undefined;
3530 addcarryxU64(&x142, &x143, x141, x103, x131);
3531 var x144: u64 = undefined;
3532 var x145: u1 = undefined;
3533 subborrowxU64(&x144, &x145, 0x0, x132, 0xecec196accc52973);
3534 var x146: u64 = undefined;
3535 var x147: u1 = undefined;
3536 subborrowxU64(&x146, &x147, x145, x134, 0x581a0db248b0a77a);
3537 var x148: u64 = undefined;
3538 var x149: u1 = undefined;
3539 subborrowxU64(&x148, &x149, x147, x136, 0xc7634d81f4372ddf);
3540 var x150: u64 = undefined;
3541 var x151: u1 = undefined;
3542 subborrowxU64(&x150, &x151, x149, x138, 0xffffffffffffffff);
3543 var x152: u64 = undefined;
3544 var x153: u1 = undefined;
3545 subborrowxU64(&x152, &x153, x151, x140, 0xffffffffffffffff);
3546 var x154: u64 = undefined;
3547 var x155: u1 = undefined;
3548 subborrowxU64(&x154, &x155, x153, x142, 0xffffffffffffffff);
3549 var x156: u64 = undefined;
3550 var x157: u1 = undefined;
3551 subborrowxU64(&x156, &x157, x155, @as(u64, x143), 0x0);
3552 var x158: u64 = undefined;
3553 var x159: u1 = undefined;
3554 addcarryxU64(&x158, &x159, 0x0, x6, 0x1);
3555 const x160 = ((x112 >> 1) | ((x114 << 63) & 0xffffffffffffffff));
3556 const x161 = ((x114 >> 1) | ((x116 << 63) & 0xffffffffffffffff));
3557 const x162 = ((x116 >> 1) | ((x118 << 63) & 0xffffffffffffffff));
3558 const x163 = ((x118 >> 1) | ((x120 << 63) & 0xffffffffffffffff));
3559 const x164 = ((x120 >> 1) | ((x122 << 63) & 0xffffffffffffffff));
3560 const x165 = ((x122 >> 1) | ((x124 << 63) & 0xffffffffffffffff));
3561 const x166 = ((x124 & 0x8000000000000000) | (x124 >> 1));
3562 var x167: u64 = undefined;
3563 cmovznzU64(&x167, x66, x53, x41);
3564 var x168: u64 = undefined;
3565 cmovznzU64(&x168, x66, x55, x43);
3566 var x169: u64 = undefined;
3567 cmovznzU64(&x169, x66, x57, x45);
3568 var x170: u64 = undefined;
3569 cmovznzU64(&x170, x66, x59, x47);
3570 var x171: u64 = undefined;
3571 cmovznzU64(&x171, x66, x61, x49);
3572 var x172: u64 = undefined;
3573 cmovznzU64(&x172, x66, x63, x51);
3574 var x173: u64 = undefined;
3575 cmovznzU64(&x173, x157, x144, x132);
3576 var x174: u64 = undefined;
3577 cmovznzU64(&x174, x157, x146, x134);
3578 var x175: u64 = undefined;
3579 cmovznzU64(&x175, x157, x148, x136);
3580 var x176: u64 = undefined;
3581 cmovznzU64(&x176, x157, x150, x138);
3582 var x177: u64 = undefined;
3583 cmovznzU64(&x177, x157, x152, x140);
3584 var x178: u64 = undefined;
3585 cmovznzU64(&x178, x157, x154, x142);
3586 out1.* = x158;
3587 out2[0] = x7;
3588 out2[1] = x8;
3589 out2[2] = x9;
3590 out2[3] = x10;
3591 out2[4] = x11;
3592 out2[5] = x12;
3593 out2[6] = x13;
3594 out3[0] = x160;
3595 out3[1] = x161;
3596 out3[2] = x162;
3597 out3[3] = x163;
3598 out3[4] = x164;
3599 out3[5] = x165;
3600 out3[6] = x166;
3601 out4[0] = x167;
3602 out4[1] = x168;
3603 out4[2] = x169;
3604 out4[3] = x170;
3605 out4[4] = x171;
3606 out4[5] = x172;
3607 out5[0] = x173;
3608 out5[1] = x174;
3609 out5[2] = x175;
3610 out5[3] = x176;
3611 out5[4] = x177;
3612 out5[5] = x178;
3613}
3614
3615/// The function divstepPrecomp returns the precomputed value for Bernstein-Yang-inversion (in montgomery form).
3616///
3617/// Postconditions:
3618/// 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⌋)
3619/// 0 ≤ eval out1 < m
3620///
3621/// Output Bounds:
3622/// out1: [[0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff], [0x0 ~> 0xffffffffffffffff]]
3623pub fn divstepPrecomp(out1: *[6]u64) void {
3624 @setRuntimeSafety(mode == .Debug);
3625
3626 out1[0] = 0x49589ae0e6045b6a;
3627 out1[1] = 0x3c9a5352870040ed;
3628 out1[2] = 0xdacb097e977dc242;
3629 out1[3] = 0xb5ab30a6d1ecbe36;
3630 out1[4] = 0x97d7a1081f959973;
3631 out1[5] = 0x2ba012f8d27192bc;
3632}
lib/std/crypto/pcurves/p384/scalar.zig created+202
...@@ -0,0 +1,202 @@
1const std = @import("std");
2const common = @import("../common.zig");
3const crypto = std.crypto;
4const debug = std.debug;
5const math = std.math;
6const mem = std.mem;
7
8const Field = common.Field;
9
10const NonCanonicalError = std.crypto.errors.NonCanonicalError;
11const NotSquareError = std.crypto.errors.NotSquareError;
12
13/// Number of bytes required to encode a scalar.
14pub const encoded_length = 48;
15
16/// A compressed scalar, in canonical form.
17pub const CompressedScalar = [encoded_length]u8;
18
19const Fe = Field(.{
20 .fiat = @import("p384_scalar_64.zig"),
21 .field_order = 39402006196394479212279040100143613805079739270465446667946905279627659399113263569398956308152294913554433653942643,
22 .field_bits = 384,
23 .saturated_bits = 384,
24 .encoded_length = encoded_length,
25});
26
27/// Reject a scalar whose encoding is not canonical.
28pub fn rejectNonCanonical(s: CompressedScalar, endian: std.builtin.Endian) NonCanonicalError!void {
29 return Fe.rejectNonCanonical(s, endian);
30}
31
32/// Reduce a 64-bytes scalar to the field size.
33pub fn reduce64(s: [64]u8, endian: std.builtin.Endian) CompressedScalar {
34 return ScalarDouble.fromBytes64(s, endian).toBytes(endian);
35}
36
37/// Return a*b (mod L)
38pub fn mul(a: CompressedScalar, b: CompressedScalar, endian: std.builtin.Endian) NonCanonicalError!CompressedScalar {
39 return (try Scalar.fromBytes(a, endian)).mul(try Scalar.fromBytes(b, endian)).toBytes(endian);
40}
41
42/// Return a*b+c (mod L)
43pub fn mulAdd(a: CompressedScalar, b: CompressedScalar, c: CompressedScalar, endian: std.builtin.Endian) NonCanonicalError!CompressedScalar {
44 return (try Scalar.fromBytes(a, endian)).mul(try Scalar.fromBytes(b, endian)).add(try Scalar.fromBytes(c, endian)).toBytes(endian);
45}
46
47/// Return a+b (mod L)
48pub fn add(a: CompressedScalar, b: CompressedScalar, endian: std.builtin.Endian) NonCanonicalError!CompressedScalar {
49 return (try Scalar.fromBytes(a, endian)).add(try Scalar.fromBytes(b, endian)).toBytes(endian);
50}
51
52/// Return -s (mod L)
53pub fn neg(s: CompressedScalar, endian: std.builtin.Endian) NonCanonicalError!CompressedScalar {
54 return (try Scalar.fromBytes(s, endian)).neg().toBytes(endian);
55}
56
57/// Return (a-b) (mod L)
58pub fn sub(a: CompressedScalar, b: CompressedScalar, endian: std.builtin.Endian) NonCanonicalError!CompressedScalar {
59 return (try Scalar.fromBytes(a, endian)).sub(try Scalar.fromBytes(b.endian)).toBytes(endian);
60}
61
62/// Return a random scalar
63pub fn random(endian: std.builtin.Endian) CompressedScalar {
64 return Scalar.random().toBytes(endian);
65}
66
67/// A scalar in unpacked representation.
68pub const Scalar = struct {
69 fe: Fe,
70
71 /// Zero.
72 pub const zero = Scalar{ .fe = Fe.zero };
73
74 /// One.
75 pub const one = Scalar{ .fe = Fe.one };
76
77 /// Unpack a serialized representation of a scalar.
78 pub fn fromBytes(s: CompressedScalar, endian: std.builtin.Endian) NonCanonicalError!Scalar {
79 return Scalar{ .fe = try Fe.fromBytes(s, endian) };
80 }
81
82 /// Reduce a 512 bit input to the field size.
83 pub fn fromBytes64(s: [64]u8, endian: std.builtin.Endian) Scalar {
84 const t = ScalarDouble.fromBytes(512, s, endian);
85 return t.reduce(512);
86 }
87
88 /// Pack a scalar into bytes.
89 pub fn toBytes(n: Scalar, endian: std.builtin.Endian) CompressedScalar {
90 return n.fe.toBytes(endian);
91 }
92
93 /// Return true if the scalar is zero..
94 pub fn isZero(n: Scalar) bool {
95 return n.fe.isZero();
96 }
97
98 /// Return true if a and b are equivalent.
99 pub fn equivalent(a: Scalar, b: Scalar) bool {
100 return a.fe.equivalent(b.fe);
101 }
102
103 /// Compute x+y (mod L)
104 pub fn add(x: Scalar, y: Scalar) Scalar {
105 return Scalar{ .fe = x.fe.add(y.fe) };
106 }
107
108 /// Compute x-y (mod L)
109 pub fn sub(x: Scalar, y: Scalar) Scalar {
110 return Scalar{ .fe = x.fe.sub(y.fe) };
111 }
112
113 /// Compute 2n (mod L)
114 pub fn dbl(n: Scalar) Scalar {
115 return Scalar{ .fe = n.fe.dbl() };
116 }
117
118 /// Compute x*y (mod L)
119 pub fn mul(x: Scalar, y: Scalar) Scalar {
120 return Scalar{ .fe = x.fe.mul(y.fe) };
121 }
122
123 /// Compute x^2 (mod L)
124 pub fn sq(n: Scalar) Scalar {
125 return Scalar{ .fe = n.fe.sq() };
126 }
127
128 /// Compute x^n (mod L)
129 pub fn pow(a: Scalar, comptime T: type, comptime n: T) Scalar {
130 return Scalar{ .fe = a.fe.pow(n) };
131 }
132
133 /// Compute -x (mod L)
134 pub fn neg(n: Scalar) Scalar {
135 return Scalar{ .fe = n.fe.neg() };
136 }
137
138 /// Compute x^-1 (mod L)
139 pub fn invert(n: Scalar) Scalar {
140 return Scalar{ .fe = n.fe.invert() };
141 }
142
143 /// Return true if n is a quadratic residue mod L.
144 pub fn isSquare(n: Scalar) Scalar {
145 return n.fe.isSquare();
146 }
147
148 /// Return the square root of L, or NotSquare if there isn't any solutions.
149 pub fn sqrt(n: Scalar) NotSquareError!Scalar {
150 return Scalar{ .fe = try n.fe.sqrt() };
151 }
152
153 /// Return a random scalar < L.
154 pub fn random() Scalar {
155 var s: [64]u8 = undefined;
156 while (true) {
157 crypto.random.bytes(&s);
158 const n = Scalar.fromBytes64(s, .Little);
159 if (!n.isZero()) {
160 return n;
161 }
162 }
163 }
164};
165
166const ScalarDouble = struct {
167 x1: Fe,
168 x2: Fe,
169
170 fn fromBytes(comptime bits: usize, s_: [bits / 8]u8, endian: std.builtin.Endian) ScalarDouble {
171 debug.assert(bits > 0 and bits <= 512 and bits >= Fe.saturated_bits and bits <= Fe.saturated_bits * 2);
172
173 var s = s_;
174 if (endian == .Big) {
175 for (s_) |x, i| s[s.len - 1 - i] = x;
176 }
177 var t = ScalarDouble{ .x1 = undefined, .x2 = Fe.zero };
178 {
179 var b = [_]u8{0} ** encoded_length;
180 const len = math.min(s.len, 32);
181 mem.copy(u8, b[0..len], s[0..len]);
182 t.x1 = Fe.fromBytes(b, .Little) catch unreachable;
183 }
184 if (s_.len >= 32) {
185 var b = [_]u8{0} ** encoded_length;
186 const len = math.min(s.len - 32, 32);
187 mem.copy(u8, b[0..len], s[32..][0..len]);
188 t.x2 = Fe.fromBytes(b, .Little) catch unreachable;
189 }
190 return t;
191 }
192
193 fn reduce(expanded: ScalarDouble, comptime bits: usize) Scalar {
194 debug.assert(bits > 0 and bits <= Fe.saturated_bits * 3 and bits <= 512);
195 var fe = expanded.x1;
196 if (bits >= 256) {
197 const st1 = Fe.fromInt(1 << 256) catch unreachable;
198 fe = fe.add(expanded.x2.mul(st1));
199 }
200 return Scalar{ .fe = fe };
201 }
202};
lib/std/crypto/pcurves/tests.zig deleted-126
...@@ -1,126 +0,0 @@
1const std = @import("std");
2const fmt = std.fmt;
3const testing = std.testing;
4
5const P256 = @import("p256.zig").P256;
6
7test "p256 ECDH key exchange" {
8 const dha = P256.scalar.random(.Little);
9 const dhb = P256.scalar.random(.Little);
10 const dhA = try P256.basePoint.mul(dha, .Little);
11 const dhB = try P256.basePoint.mul(dhb, .Little);
12 const shareda = try dhA.mul(dhb, .Little);
13 const sharedb = try dhB.mul(dha, .Little);
14 try testing.expect(shareda.equivalent(sharedb));
15}
16
17test "p256 point from affine coordinates" {
18 const xh = "6B17D1F2E12C4247F8BCE6E563A440F277037D812DEB33A0F4A13945D898C296";
19 const yh = "4FE342E2FE1A7F9B8EE7EB4A7C0F9E162BCE33576B315ECECBB6406837BF51F5";
20 var xs: [32]u8 = undefined;
21 _ = try fmt.hexToBytes(&xs, xh);
22 var ys: [32]u8 = undefined;
23 _ = try fmt.hexToBytes(&ys, yh);
24 var p = try P256.fromSerializedAffineCoordinates(xs, ys, .Big);
25 try testing.expect(p.equivalent(P256.basePoint));
26}
27
28test "p256 test vectors" {
29 const expected = [_][]const u8{
30 "0000000000000000000000000000000000000000000000000000000000000000",
31 "6b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c296",
32 "7cf27b188d034f7e8a52380304b51ac3c08969e277f21b35a60b48fc47669978",
33 "5ecbe4d1a6330a44c8f7ef951d4bf165e6c6b721efada985fb41661bc6e7fd6c",
34 "e2534a3532d08fbba02dde659ee62bd0031fe2db785596ef509302446b030852",
35 "51590b7a515140d2d784c85608668fdfef8c82fd1f5be52421554a0dc3d033ed",
36 "b01a172a76a4602c92d3242cb897dde3024c740debb215b4c6b0aae93c2291a9",
37 "8e533b6fa0bf7b4625bb30667c01fb607ef9f8b8a80fef5b300628703187b2a3",
38 "62d9779dbee9b0534042742d3ab54cadc1d238980fce97dbb4dd9dc1db6fb393",
39 "ea68d7b6fedf0b71878938d51d71f8729e0acb8c2c6df8b3d79e8a4b90949ee0",
40 };
41 var p = P256.identityElement;
42 for (expected) |xh| {
43 const x = p.affineCoordinates().x;
44 p = p.add(P256.basePoint);
45 var xs: [32]u8 = undefined;
46 _ = try fmt.hexToBytes(&xs, xh);
47 try testing.expectEqualSlices(u8, &x.toBytes(.Big), &xs);
48 }
49}
50
51test "p256 test vectors - doubling" {
52 const expected = [_][]const u8{
53 "6b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c296",
54 "7cf27b188d034f7e8a52380304b51ac3c08969e277f21b35a60b48fc47669978",
55 "e2534a3532d08fbba02dde659ee62bd0031fe2db785596ef509302446b030852",
56 "62d9779dbee9b0534042742d3ab54cadc1d238980fce97dbb4dd9dc1db6fb393",
57 };
58 var p = P256.basePoint;
59 for (expected) |xh| {
60 const x = p.affineCoordinates().x;
61 p = p.dbl();
62 var xs: [32]u8 = undefined;
63 _ = try fmt.hexToBytes(&xs, xh);
64 try testing.expectEqualSlices(u8, &x.toBytes(.Big), &xs);
65 }
66}
67
68test "p256 compressed sec1 encoding/decoding" {
69 const p = P256.random();
70 const s = p.toCompressedSec1();
71 const q = try P256.fromSec1(&s);
72 try testing.expect(p.equivalent(q));
73}
74
75test "p256 uncompressed sec1 encoding/decoding" {
76 const p = P256.random();
77 const s = p.toUncompressedSec1();
78 const q = try P256.fromSec1(&s);
79 try testing.expect(p.equivalent(q));
80}
81
82test "p256 public key is the neutral element" {
83 const n = P256.scalar.Scalar.zero.toBytes(.Little);
84 const p = P256.random();
85 try testing.expectError(error.IdentityElement, p.mul(n, .Little));
86}
87
88test "p256 public key is the neutral element (public verification)" {
89 const n = P256.scalar.Scalar.zero.toBytes(.Little);
90 const p = P256.random();
91 try testing.expectError(error.IdentityElement, p.mulPublic(n, .Little));
92}
93
94test "p256 field element non-canonical encoding" {
95 const s = [_]u8{0xff} ** 32;
96 try testing.expectError(error.NonCanonical, P256.Fe.fromBytes(s, .Little));
97}
98
99test "p256 neutral element decoding" {
100 try testing.expectError(error.InvalidEncoding, P256.fromAffineCoordinates(.{ .x = P256.Fe.zero, .y = P256.Fe.zero }));
101 const p = try P256.fromAffineCoordinates(.{ .x = P256.Fe.zero, .y = P256.Fe.one });
102 try testing.expectError(error.IdentityElement, p.rejectIdentity());
103}
104
105test "p256 double base multiplication" {
106 const p1 = P256.basePoint;
107 const p2 = P256.basePoint.dbl();
108 const s1 = [_]u8{0x01} ** 32;
109 const s2 = [_]u8{0x02} ** 32;
110 const pr1 = try P256.mulDoubleBasePublic(p1, s1, p2, s2, .Little);
111 const pr2 = (try p1.mul(s1, .Little)).add(try p2.mul(s2, .Little));
112 try testing.expect(pr1.equivalent(pr2));
113}
114
115test "p256 scalar inverse" {
116 const expected = "3b549196a13c898a6f6e84dfb3a22c40a8b9b17fb88e408ea674e451cd01d0a6";
117 var out: [32]u8 = undefined;
118 _ = try std.fmt.hexToBytes(&out, expected);
119
120 const scalar = try P256.scalar.Scalar.fromBytes(.{
121 0x94, 0xa1, 0xbb, 0xb1, 0x4b, 0x90, 0x6a, 0x61, 0xa2, 0x80, 0xf2, 0x45, 0xf9, 0xe9, 0x3c, 0x7f,
122 0x3b, 0x4a, 0x62, 0x47, 0x82, 0x4f, 0x5d, 0x33, 0xb9, 0x67, 0x07, 0x87, 0x64, 0x2a, 0x68, 0xde,
123 }, .Big);
124 const inverse = scalar.invert();
125 try std.testing.expectEqualSlices(u8, &out, &inverse.toBytes(.Big));
126}
lib/std/crypto/pcurves/tests/p256.zig created+126
...@@ -0,0 +1,126 @@
1const std = @import("std");
2const fmt = std.fmt;
3const testing = std.testing;
4
5const P256 = @import("../p256.zig").P256;
6
7test "p256 ECDH key exchange" {
8 const dha = P256.scalar.random(.Little);
9 const dhb = P256.scalar.random(.Little);
10 const dhA = try P256.basePoint.mul(dha, .Little);
11 const dhB = try P256.basePoint.mul(dhb, .Little);
12 const shareda = try dhA.mul(dhb, .Little);
13 const sharedb = try dhB.mul(dha, .Little);
14 try testing.expect(shareda.equivalent(sharedb));
15}
16
17test "p256 point from affine coordinates" {
18 const xh = "6B17D1F2E12C4247F8BCE6E563A440F277037D812DEB33A0F4A13945D898C296";
19 const yh = "4FE342E2FE1A7F9B8EE7EB4A7C0F9E162BCE33576B315ECECBB6406837BF51F5";
20 var xs: [32]u8 = undefined;
21 _ = try fmt.hexToBytes(&xs, xh);
22 var ys: [32]u8 = undefined;
23 _ = try fmt.hexToBytes(&ys, yh);
24 var p = try P256.fromSerializedAffineCoordinates(xs, ys, .Big);
25 try testing.expect(p.equivalent(P256.basePoint));
26}
27
28test "p256 test vectors" {
29 const expected = [_][]const u8{
30 "0000000000000000000000000000000000000000000000000000000000000000",
31 "6b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c296",
32 "7cf27b188d034f7e8a52380304b51ac3c08969e277f21b35a60b48fc47669978",
33 "5ecbe4d1a6330a44c8f7ef951d4bf165e6c6b721efada985fb41661bc6e7fd6c",
34 "e2534a3532d08fbba02dde659ee62bd0031fe2db785596ef509302446b030852",
35 "51590b7a515140d2d784c85608668fdfef8c82fd1f5be52421554a0dc3d033ed",
36 "b01a172a76a4602c92d3242cb897dde3024c740debb215b4c6b0aae93c2291a9",
37 "8e533b6fa0bf7b4625bb30667c01fb607ef9f8b8a80fef5b300628703187b2a3",
38 "62d9779dbee9b0534042742d3ab54cadc1d238980fce97dbb4dd9dc1db6fb393",
39 "ea68d7b6fedf0b71878938d51d71f8729e0acb8c2c6df8b3d79e8a4b90949ee0",
40 };
41 var p = P256.identityElement;
42 for (expected) |xh| {
43 const x = p.affineCoordinates().x;
44 p = p.add(P256.basePoint);
45 var xs: [32]u8 = undefined;
46 _ = try fmt.hexToBytes(&xs, xh);
47 try testing.expectEqualSlices(u8, &x.toBytes(.Big), &xs);
48 }
49}
50
51test "p256 test vectors - doubling" {
52 const expected = [_][]const u8{
53 "6b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c296",
54 "7cf27b188d034f7e8a52380304b51ac3c08969e277f21b35a60b48fc47669978",
55 "e2534a3532d08fbba02dde659ee62bd0031fe2db785596ef509302446b030852",
56 "62d9779dbee9b0534042742d3ab54cadc1d238980fce97dbb4dd9dc1db6fb393",
57 };
58 var p = P256.basePoint;
59 for (expected) |xh| {
60 const x = p.affineCoordinates().x;
61 p = p.dbl();
62 var xs: [32]u8 = undefined;
63 _ = try fmt.hexToBytes(&xs, xh);
64 try testing.expectEqualSlices(u8, &x.toBytes(.Big), &xs);
65 }
66}
67
68test "p256 compressed sec1 encoding/decoding" {
69 const p = P256.random();
70 const s = p.toCompressedSec1();
71 const q = try P256.fromSec1(&s);
72 try testing.expect(p.equivalent(q));
73}
74
75test "p256 uncompressed sec1 encoding/decoding" {
76 const p = P256.random();
77 const s = p.toUncompressedSec1();
78 const q = try P256.fromSec1(&s);
79 try testing.expect(p.equivalent(q));
80}
81
82test "p256 public key is the neutral element" {
83 const n = P256.scalar.Scalar.zero.toBytes(.Little);
84 const p = P256.random();
85 try testing.expectError(error.IdentityElement, p.mul(n, .Little));
86}
87
88test "p256 public key is the neutral element (public verification)" {
89 const n = P256.scalar.Scalar.zero.toBytes(.Little);
90 const p = P256.random();
91 try testing.expectError(error.IdentityElement, p.mulPublic(n, .Little));
92}
93
94test "p256 field element non-canonical encoding" {
95 const s = [_]u8{0xff} ** 32;
96 try testing.expectError(error.NonCanonical, P256.Fe.fromBytes(s, .Little));
97}
98
99test "p256 neutral element decoding" {
100 try testing.expectError(error.InvalidEncoding, P256.fromAffineCoordinates(.{ .x = P256.Fe.zero, .y = P256.Fe.zero }));
101 const p = try P256.fromAffineCoordinates(.{ .x = P256.Fe.zero, .y = P256.Fe.one });
102 try testing.expectError(error.IdentityElement, p.rejectIdentity());
103}
104
105test "p256 double base multiplication" {
106 const p1 = P256.basePoint;
107 const p2 = P256.basePoint.dbl();
108 const s1 = [_]u8{0x01} ** 32;
109 const s2 = [_]u8{0x02} ** 32;
110 const pr1 = try P256.mulDoubleBasePublic(p1, s1, p2, s2, .Little);
111 const pr2 = (try p1.mul(s1, .Little)).add(try p2.mul(s2, .Little));
112 try testing.expect(pr1.equivalent(pr2));
113}
114
115test "p256 scalar inverse" {
116 const expected = "3b549196a13c898a6f6e84dfb3a22c40a8b9b17fb88e408ea674e451cd01d0a6";
117 var out: [32]u8 = undefined;
118 _ = try std.fmt.hexToBytes(&out, expected);
119
120 const scalar = try P256.scalar.Scalar.fromBytes(.{
121 0x94, 0xa1, 0xbb, 0xb1, 0x4b, 0x90, 0x6a, 0x61, 0xa2, 0x80, 0xf2, 0x45, 0xf9, 0xe9, 0x3c, 0x7f,
122 0x3b, 0x4a, 0x62, 0x47, 0x82, 0x4f, 0x5d, 0x33, 0xb9, 0x67, 0x07, 0x87, 0x64, 0x2a, 0x68, 0xde,
123 }, .Big);
124 const inverse = scalar.invert();
125 try std.testing.expectEqualSlices(u8, &out, &inverse.toBytes(.Big));
126}
lib/std/crypto/pcurves/tests/p384.zig created+136
...@@ -0,0 +1,136 @@
1const std = @import("std");
2const fmt = std.fmt;
3const testing = std.testing;
4
5const P384 = @import("../p384.zig").P384;
6
7test "p384 ECDH key exchange" {
8 const dha = P384.scalar.random(.Little);
9 const dhb = P384.scalar.random(.Little);
10 const dhA = try P384.basePoint.mul(dha, .Little);
11 const dhB = try P384.basePoint.mul(dhb, .Little);
12 const shareda = try dhA.mul(dhb, .Little);
13 const sharedb = try dhB.mul(dha, .Little);
14 try testing.expect(shareda.equivalent(sharedb));
15}
16
17test "p384 point from affine coordinates" {
18 const xh = "aa87ca22be8b05378eb1c71ef320ad746e1d3b628ba79b9859f741e082542a385502f25dbf55296c3a545e3872760ab7";
19 const yh = "3617de4a96262c6f5d9e98bf9292dc29f8f41dbd289a147ce9da3113b5f0b8c00a60b1ce1d7e819d7a431d7c90ea0e5f";
20 var xs: [48]u8 = undefined;
21 _ = try fmt.hexToBytes(&xs, xh);
22 var ys: [48]u8 = undefined;
23 _ = try fmt.hexToBytes(&ys, yh);
24 var p = try P384.fromSerializedAffineCoordinates(xs, ys, .Big);
25 try testing.expect(p.equivalent(P384.basePoint));
26}
27
28test "p384 test vectors" {
29 const expected = [_][]const u8{
30 "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
31 "AA87CA22BE8B05378EB1C71EF320AD746E1D3B628BA79B9859F741E082542A385502F25DBF55296C3A545E3872760AB7",
32 "08D999057BA3D2D969260045C55B97F089025959A6F434D651D207D19FB96E9E4FE0E86EBE0E64F85B96A9C75295DF61",
33 "077A41D4606FFA1464793C7E5FDC7D98CB9D3910202DCD06BEA4F240D3566DA6B408BBAE5026580D02D7E5C70500C831",
34 "138251CD52AC9298C1C8AAD977321DEB97E709BD0B4CA0ACA55DC8AD51DCFC9D1589A1597E3A5120E1EFD631C63E1835",
35 "11DE24A2C251C777573CAC5EA025E467F208E51DBFF98FC54F6661CBE56583B037882F4A1CA297E60ABCDBC3836D84BC",
36 "627BE1ACD064D2B2226FE0D26F2D15D3C33EBCBB7F0F5DA51CBD41F26257383021317D7202FF30E50937F0854E35C5DF",
37 "283C1D7365CE4788F29F8EBF234EDFFEAD6FE997FBEA5FFA2D58CC9DFA7B1C508B05526F55B9EBB2040F05B48FB6D0E1",
38 "1692778EA596E0BE75114297A6FA383445BF227FBE58190A900C3C73256F11FB5A3258D6F403D5ECE6E9B269D822C87D",
39 "8F0A39A4049BCB3EF1BF29B8B025B78F2216F7291E6FD3BAC6CB1EE285FB6E21C388528BFEE2B9535C55E4461079118B",
40 "A669C5563BD67EEC678D29D6EF4FDE864F372D90B79B9E88931D5C29291238CCED8E85AB507BF91AA9CB2D13186658FB",
41 };
42 var p = P384.identityElement;
43 for (expected) |xh| {
44 const x = p.affineCoordinates().x;
45 p = p.add(P384.basePoint);
46 var xs: [48]u8 = undefined;
47 _ = try fmt.hexToBytes(&xs, xh);
48 try testing.expectEqualSlices(u8, &x.toBytes(.Big), &xs);
49 }
50}
51
52test "p384 test vectors - doubling" {
53 const expected = [_][]const u8{
54 "AA87CA22BE8B05378EB1C71EF320AD746E1D3B628BA79B9859F741E082542A385502F25DBF55296C3A545E3872760AB7",
55 "08D999057BA3D2D969260045C55B97F089025959A6F434D651D207D19FB96E9E4FE0E86EBE0E64F85B96A9C75295DF61",
56 "138251CD52AC9298C1C8AAD977321DEB97E709BD0B4CA0ACA55DC8AD51DCFC9D1589A1597E3A5120E1EFD631C63E1835",
57 "1692778EA596E0BE75114297A6FA383445BF227FBE58190A900C3C73256F11FB5A3258D6F403D5ECE6E9B269D822C87D",
58 };
59 var p = P384.basePoint;
60 for (expected) |xh| {
61 const x = p.affineCoordinates().x;
62 p = p.dbl();
63 var xs: [48]u8 = undefined;
64 _ = try fmt.hexToBytes(&xs, xh);
65 try testing.expectEqualSlices(u8, &x.toBytes(.Big), &xs);
66 }
67}
68
69test "p384 compressed sec1 encoding/decoding" {
70 const p = P384.random();
71 const s0 = p.toUncompressedSec1();
72 const s = p.toCompressedSec1();
73 try testing.expectEqualSlices(u8, s0[1..49], s[1..49]);
74 const q = try P384.fromSec1(&s);
75 try testing.expect(p.equivalent(q));
76}
77
78test "p384 uncompressed sec1 encoding/decoding" {
79 const p = P384.random();
80 const s = p.toUncompressedSec1();
81 const q = try P384.fromSec1(&s);
82 try testing.expect(p.equivalent(q));
83}
84
85test "p384 public key is the neutral element" {
86 const n = P384.scalar.Scalar.zero.toBytes(.Little);
87 const p = P384.random();
88 try testing.expectError(error.IdentityElement, p.mul(n, .Little));
89}
90
91test "p384 public key is the neutral element (public verification)" {
92 const n = P384.scalar.Scalar.zero.toBytes(.Little);
93 const p = P384.random();
94 try testing.expectError(error.IdentityElement, p.mulPublic(n, .Little));
95}
96
97test "p384 field element non-canonical encoding" {
98 const s = [_]u8{0xff} ** 48;
99 try testing.expectError(error.NonCanonical, P384.Fe.fromBytes(s, .Little));
100}
101
102test "p384 neutral element decoding" {
103 try testing.expectError(error.InvalidEncoding, P384.fromAffineCoordinates(.{ .x = P384.Fe.zero, .y = P384.Fe.zero }));
104 const p = try P384.fromAffineCoordinates(.{ .x = P384.Fe.zero, .y = P384.Fe.one });
105 try testing.expectError(error.IdentityElement, p.rejectIdentity());
106}
107
108test "p384 double base multiplication" {
109 const p1 = P384.basePoint;
110 const p2 = P384.basePoint.dbl();
111 const s1 = [_]u8{0x01} ** 48;
112 const s2 = [_]u8{0x02} ** 48;
113 const pr1 = try P384.mulDoubleBasePublic(p1, s1, p2, s2, .Little);
114 const pr2 = (try p1.mul(s1, .Little)).add(try p2.mul(s2, .Little));
115 try testing.expect(pr1.equivalent(pr2));
116}
117
118test "p384 scalar inverse" {
119 const expected = "a3cc705f33b5679a66e76ce66e68055c927c5dba531b2837b18fe86119511091b54d733f26b2e7a0f6fa2e7ea21ca806";
120 var out: [48]u8 = undefined;
121 _ = try std.fmt.hexToBytes(&out, expected);
122
123 const scalar = try P384.scalar.Scalar.fromBytes(.{
124 0x94, 0xa1, 0xbb, 0xb1, 0x4b, 0x90, 0x6a, 0x61, 0xa2, 0x80, 0xf2, 0x45, 0xf9, 0xe9, 0x3c, 0x7f,
125 0x3b, 0x4a, 0x62, 0x47, 0x82, 0x4f, 0x5d, 0x33, 0xb9, 0x67, 0x07, 0x87, 0x64, 0x2a, 0x68, 0xde,
126 0x38, 0x36, 0xe8, 0x0f, 0xa2, 0x84, 0x6b, 0x4e, 0xf3, 0x9a, 0x02, 0x31, 0x24, 0x41, 0x22, 0xca,
127 }, .Big);
128 const inverse = scalar.invert();
129 const inverse2 = inverse.invert();
130 try testing.expectEqualSlices(u8, &out, &inverse.toBytes(.Big));
131 try testing.expect(inverse2.equivalent(scalar));
132
133 const sq = scalar.sq();
134 const sqr = try sq.sqrt();
135 try testing.expect(sqr.equivalent(scalar));
136}