1 /* $OpenBSD: libcrux_mlkem768_sha3.h,v 1.2 2024/10/27 02:06:01 djm Exp $ */
2
3 /* Extracted from libcrux revision 84c5d87b3092c59294345aa269ceefe0eb97cc35 */
4
5 /*
6 * MIT License
7 *
8 * Copyright (c) 2024 Cryspen
9 *
10 * Permission is hereby granted, free of charge, to any person obtaining a copy
11 * of this software and associated documentation files (the "Software"), to deal
12 * in the Software without restriction, including without limitation the rights
13 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
14 * copies of the Software, and to permit persons to whom the Software is
15 * furnished to do so, subject to the following conditions:
16 *
17 * The above copyright notice and this permission notice shall be included in all
18 * copies or substantial portions of the Software.
19 *
20 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
21 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
22 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
23 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
24 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
25 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
26 * SOFTWARE.
27 */
28
29 #if !defined(__GNUC__) || (__GNUC__ < 2)
30 # define __attribute__(x)
31 #endif
32 #define KRML_MUSTINLINE inline
33 #define KRML_NOINLINE __attribute__((noinline, unused))
34 #define KRML_HOST_EPRINTF(...)
35 #define KRML_HOST_EXIT(x) fatal_f("internal error")
36
37 /* from libcrux/libcrux-ml-kem/cg/eurydice_glue.h */
38 /*
39 * SPDX-FileCopyrightText: 2024 Eurydice Contributors
40 * SPDX-FileCopyrightText: 2024 Cryspen Sarl <info@cryspen.com>
41 *
42 * SPDX-License-Identifier: MIT or Apache-2.0
43 */
44
45 #pragma once
46
47 #if defined(__cplusplus)
48 extern "C" {
49 #endif
50
51
52
53 // SLICES, ARRAYS, ETC.
54
55 // The MSVC C++ compiler does not support compound literals.
56 // This CLITERAL is used to turn `(type){...}` into `type{...}` when using a C++
57 // compiler.
58 #if defined(__cplusplus)
59 #define CLITERAL(type) type
60 #else
61 #define CLITERAL(type) (type)
62 #endif
63
64 // We represent a slice as a pair of an (untyped) pointer, along with the length
65 // of the slice, i.e. the number of elements in the slice (this is NOT the
66 // number of bytes). This design choice has two important consequences.
67 // - if you need to use `ptr`, you MUST cast it to a proper type *before*
68 // performing pointer
69 // arithmetic on it (remember that C desugars pointer arithmetic based on the
70 // type of the address)
71 // - if you need to use `len` for a C style function (e.g. memcpy, memcmp), you
72 // need to multiply it
73 // by sizeof t, where t is the type of the elements.
74 //
75 // Empty slices have `len == 0` and `ptr` always needs to be valid pointer that
76 // is not NULL (otherwise the construction in EURYDICE_SLICE computes `NULL +
77 // start`).
78 typedef struct {
79 void *ptr;
80 size_t len;
81 } Eurydice_slice;
82
83 // Helper macro to create a slice out of a pointer x, a start index in x
84 // (included), and an end index in x (excluded). The argument x must be suitably
85 // cast to something that can decay (see remark above about how pointer
86 // arithmetic works in C), meaning either pointer or array type.
87 #define EURYDICE_SLICE(x, start, end) \
88 (CLITERAL(Eurydice_slice){.ptr = (void *)(x + start), .len = end - start})
89 #define EURYDICE_SLICE_LEN(s, _) s.len
90 // This macro is a pain because in case the dereferenced element type is an
91 // array, you cannot simply write `t x` as it would yield `int[4] x` instead,
92 // which is NOT correct C syntax, so we add a dedicated phase in Eurydice that
93 // adds an extra argument to this macro at the last minute so that we have the
94 // correct type of *pointers* to elements.
95 #define Eurydice_slice_index(s, i, t, t_ptr_t) (((t_ptr_t)s.ptr)[i])
96 #define Eurydice_slice_subslice(s, r, t, _) \
97 EURYDICE_SLICE((t *)s.ptr, r.start, r.end)
98 // Variant for when the start and end indices are statically known (i.e., the
99 // range argument `r` is a literal).
100 #define Eurydice_slice_subslice2(s, start, end, t) \
101 EURYDICE_SLICE((t *)s.ptr, start, end)
102 #define Eurydice_slice_subslice_to(s, subslice_end_pos, t, _) \
103 EURYDICE_SLICE((t *)s.ptr, 0, subslice_end_pos)
104 #define Eurydice_slice_subslice_from(s, subslice_start_pos, t, _) \
105 EURYDICE_SLICE((t *)s.ptr, subslice_start_pos, s.len)
106 #define Eurydice_array_to_slice(end, x, t) \
107 EURYDICE_SLICE(x, 0, \
108 end) /* x is already at an array type, no need for cast */
109 #define Eurydice_array_to_subslice(_arraylen, x, r, t, _) \
110 EURYDICE_SLICE((t *)x, r.start, r.end)
111 // Same as above, variant for when start and end are statically known
112 #define Eurydice_array_to_subslice2(x, start, end, t) \
113 EURYDICE_SLICE((t *)x, start, end)
114 #define Eurydice_array_to_subslice_to(_size, x, r, t, _range_t) \
115 EURYDICE_SLICE((t *)x, 0, r)
116 #define Eurydice_array_to_subslice_from(size, x, r, t, _range_t) \
117 EURYDICE_SLICE((t *)x, r, size)
118 #define Eurydice_slice_len(s, t) EURYDICE_SLICE_LEN(s, t)
119 #define Eurydice_slice_copy(dst, src, t) \
120 memcpy(dst.ptr, src.ptr, dst.len * sizeof(t))
121 #define core_array___Array_T__N__23__as_slice(len_, ptr_, t, _ret_t) \
122 ((Eurydice_slice){.ptr = ptr_, .len = len_})
123
124 #define core_array___core__clone__Clone_for__Array_T__N___20__clone( \
125 len, src, dst, elem_type, _ret_t) \
126 (memcpy(dst, src, len * sizeof(elem_type)))
127 #define TryFromSliceError uint8_t
128
129 #define Eurydice_array_eq(sz, a1, a2, t, _) \
130 (memcmp(a1, a2, sz * sizeof(t)) == 0)
131 #define core_array_equality___core__cmp__PartialEq__Array_U__N___for__Array_T__N____eq( \
132 sz, a1, a2, t, _, _ret_t) \
133 Eurydice_array_eq(sz, a1, a2, t, _)
134 #define core_array_equality___core__cmp__PartialEq__0___Slice_U____for__Array_T__N___3__eq( \
135 sz, a1, a2, t, _, _ret_t) \
136 Eurydice_array_eq(sz, a1, ((a2)->ptr), t, _)
137
138 #define Eurydice_slice_split_at(slice, mid, element_type, ret_t) \
139 (CLITERAL(ret_t){ \
140 .fst = EURYDICE_SLICE((element_type *)slice.ptr, 0, mid), \
141 .snd = EURYDICE_SLICE((element_type *)slice.ptr, mid, slice.len)})
142 #define Eurydice_slice_split_at_mut(slice, mid, element_type, ret_t) \
143 (CLITERAL(ret_t){ \
144 .fst = {.ptr = slice.ptr, .len = mid}, \
145 .snd = {.ptr = (char *)slice.ptr + mid * sizeof(element_type), \
146 .len = slice.len - mid}})
147
148 // Conversion of slice to an array, rewritten (by Eurydice) to name the
149 // destination array, since arrays are not values in C.
150 // N.B.: see note in karamel/lib/Inlining.ml if you change this.
151 #define Eurydice_slice_to_array2(dst, src, _, t_arr) \
152 Eurydice_slice_to_array3(&(dst)->tag, (char *)&(dst)->val.case_Ok, src, \
153 sizeof(t_arr))
154
Eurydice_slice_to_array3(uint8_t * dst_tag,char * dst_ok,Eurydice_slice src,size_t sz)155 static inline void Eurydice_slice_to_array3(uint8_t *dst_tag, char *dst_ok,
156 Eurydice_slice src, size_t sz) {
157 *dst_tag = 0;
158 memcpy(dst_ok, src.ptr, sz);
159 }
160
161 // CORE STUFF (conversions, endianness, ...)
162
core_num__u64_9__to_le_bytes(uint64_t v,uint8_t buf[8])163 static inline void core_num__u64_9__to_le_bytes(uint64_t v, uint8_t buf[8]) {
164 v = htole64(v);
165 memcpy(buf, &v, sizeof(v));
166 }
core_num__u64_9__from_le_bytes(uint8_t buf[8])167 static inline uint64_t core_num__u64_9__from_le_bytes(uint8_t buf[8]) {
168 uint64_t v;
169 memcpy(&v, buf, sizeof(v));
170 return le64toh(v);
171 }
172
core_num__u32_8__from_le_bytes(uint8_t buf[4])173 static inline uint32_t core_num__u32_8__from_le_bytes(uint8_t buf[4]) {
174 uint32_t v;
175 memcpy(&v, buf, sizeof(v));
176 return le32toh(v);
177 }
178
core_num__u8_6__count_ones(uint8_t x0)179 static inline uint32_t core_num__u8_6__count_ones(uint8_t x0) {
180 #ifdef _MSC_VER
181 return __popcnt(x0);
182 #else
183 return __builtin_popcount(x0);
184 #endif
185 }
186
187 // unsigned overflow wraparound semantics in C
core_num__u16_7__wrapping_add(uint16_t x,uint16_t y)188 static inline uint16_t core_num__u16_7__wrapping_add(uint16_t x, uint16_t y) {
189 return x + y;
190 }
core_num__u8_6__wrapping_sub(uint8_t x,uint8_t y)191 static inline uint8_t core_num__u8_6__wrapping_sub(uint8_t x, uint8_t y) {
192 return x - y;
193 }
194
195 // ITERATORS
196
197 #define Eurydice_range_iter_next(iter_ptr, t, ret_t) \
198 (((iter_ptr)->start == (iter_ptr)->end) \
199 ? (CLITERAL(ret_t){.tag = None}) \
200 : (CLITERAL(ret_t){.tag = Some, .f0 = (iter_ptr)->start++}))
201
202 #define core_iter_range___core__iter__traits__iterator__Iterator_for_core__ops__range__Range_A___6__next \
203 Eurydice_range_iter_next
204
205 // See note in karamel/lib/Inlining.ml if you change this
206 #define Eurydice_into_iter(x, t, _ret_t) (x)
207 #define core_iter_traits_collect___core__iter__traits__collect__IntoIterator_for_I__1__into_iter \
208 Eurydice_into_iter
209
210 #if defined(__cplusplus)
211 }
212 #endif
213
214 /* from libcrux/libcrux-ml-kem/cg/libcrux_core.h */
215 /*
216 * SPDX-FileCopyrightText: 2024 Cryspen Sarl <info@cryspen.com>
217 *
218 * SPDX-License-Identifier: MIT or Apache-2.0
219 *
220 * This code was generated with the following revisions:
221 * Charon: 6b5e110342a771a3e1c739b10294b1778e4be8b4
222 * Eurydice: 31be7d65ca5d6acdacfb33652e478d24dd85c1cb
223 * Karamel: 3205d3365ea2790b02368f79fcee38e38d0b5908
224 * F*: a32b316e521fa4f239b610ec8f1d15e78d62cbe8-dirty
225 * Libcrux: 4ad532b206174114dd4140b718e7794a28fc59ee
226 */
227
228 #ifndef __libcrux_core_H
229 #define __libcrux_core_H
230
231 #if defined(__cplusplus)
232 extern "C" {
233 #endif
234
235
236 /**
237 A monomorphic instance of core.ops.range.Range
238 with types size_t
239
240 */
241 typedef struct core_ops_range_Range_b3_s {
242 size_t start;
243 size_t end;
244 } core_ops_range_Range_b3;
245
246 #define Ok 0
247 #define Err 1
248
249 typedef uint8_t Result_86_tags;
250
251 #define None 0
252 #define Some 1
253
254 typedef uint8_t Option_ef_tags;
255
256 /**
257 A monomorphic instance of core.option.Option
258 with types size_t
259
260 */
261 typedef struct Option_b3_s {
262 Option_ef_tags tag;
263 size_t f0;
264 } Option_b3;
265
266 static inline uint16_t core_num__u16_7__wrapping_add(uint16_t x0, uint16_t x1);
267
268 #define CORE_NUM__U32_8__BITS (32U)
269
270 static inline uint64_t core_num__u64_9__from_le_bytes(uint8_t x0[8U]);
271
272 static inline void core_num__u64_9__to_le_bytes(uint64_t x0, uint8_t x1[8U]);
273
274 static inline uint32_t core_num__u8_6__count_ones(uint8_t x0);
275
276 static inline uint8_t core_num__u8_6__wrapping_sub(uint8_t x0, uint8_t x1);
277
278 #define LIBCRUX_ML_KEM_CONSTANTS_SHARED_SECRET_SIZE ((size_t)32U)
279
280 #define LIBCRUX_ML_KEM_CONSTANTS_BITS_PER_COEFFICIENT ((size_t)12U)
281
282 #define LIBCRUX_ML_KEM_CONSTANTS_COEFFICIENTS_IN_RING_ELEMENT ((size_t)256U)
283
284 #define LIBCRUX_ML_KEM_CONSTANTS_BITS_PER_RING_ELEMENT \
285 (LIBCRUX_ML_KEM_CONSTANTS_COEFFICIENTS_IN_RING_ELEMENT * (size_t)12U)
286
287 #define LIBCRUX_ML_KEM_CONSTANTS_BYTES_PER_RING_ELEMENT \
288 (LIBCRUX_ML_KEM_CONSTANTS_BITS_PER_RING_ELEMENT / (size_t)8U)
289
290 #define LIBCRUX_ML_KEM_CONSTANTS_CPA_PKE_KEY_GENERATION_SEED_SIZE ((size_t)32U)
291
292 #define LIBCRUX_ML_KEM_CONSTANTS_H_DIGEST_SIZE ((size_t)32U)
293
294 typedef struct libcrux_ml_kem_utils_extraction_helper_Keypair768_s {
295 uint8_t fst[1152U];
296 uint8_t snd[1184U];
297 } libcrux_ml_kem_utils_extraction_helper_Keypair768;
298
299 /**
300 A monomorphic instance of core.result.Result
301 with types uint8_t[24size_t], core_array_TryFromSliceError
302
303 */
304 typedef struct Result_6f_s {
305 Result_86_tags tag;
306 union {
307 uint8_t case_Ok[24U];
308 TryFromSliceError case_Err;
309 } val;
310 } Result_6f;
311
312 /**
313 This function found in impl {core::result::Result<T, E>}
314 */
315 /**
316 A monomorphic instance of core.result.unwrap_41
317 with types uint8_t[24size_t], core_array_TryFromSliceError
318
319 */
unwrap_41_1c(Result_6f self,uint8_t ret[24U])320 static inline void unwrap_41_1c(Result_6f self, uint8_t ret[24U]) {
321 if (self.tag == Ok) {
322 uint8_t f0[24U];
323 memcpy(f0, self.val.case_Ok, (size_t)24U * sizeof(uint8_t));
324 memcpy(ret, f0, (size_t)24U * sizeof(uint8_t));
325 } else {
326 KRML_HOST_EPRINTF("KaRaMeL abort at %s:%d\n%s\n", __FILE__, __LINE__,
327 "unwrap not Ok");
328 KRML_HOST_EXIT(255U);
329 }
330 }
331
332 /**
333 A monomorphic instance of core.result.Result
334 with types uint8_t[20size_t], core_array_TryFromSliceError
335
336 */
337 typedef struct Result_7a_s {
338 Result_86_tags tag;
339 union {
340 uint8_t case_Ok[20U];
341 TryFromSliceError case_Err;
342 } val;
343 } Result_7a;
344
345 /**
346 This function found in impl {core::result::Result<T, E>}
347 */
348 /**
349 A monomorphic instance of core.result.unwrap_41
350 with types uint8_t[20size_t], core_array_TryFromSliceError
351
352 */
unwrap_41_34(Result_7a self,uint8_t ret[20U])353 static inline void unwrap_41_34(Result_7a self, uint8_t ret[20U]) {
354 if (self.tag == Ok) {
355 uint8_t f0[20U];
356 memcpy(f0, self.val.case_Ok, (size_t)20U * sizeof(uint8_t));
357 memcpy(ret, f0, (size_t)20U * sizeof(uint8_t));
358 } else {
359 KRML_HOST_EPRINTF("KaRaMeL abort at %s:%d\n%s\n", __FILE__, __LINE__,
360 "unwrap not Ok");
361 KRML_HOST_EXIT(255U);
362 }
363 }
364
365 /**
366 A monomorphic instance of core.result.Result
367 with types uint8_t[10size_t], core_array_TryFromSliceError
368
369 */
370 typedef struct Result_cd_s {
371 Result_86_tags tag;
372 union {
373 uint8_t case_Ok[10U];
374 TryFromSliceError case_Err;
375 } val;
376 } Result_cd;
377
378 /**
379 This function found in impl {core::result::Result<T, E>}
380 */
381 /**
382 A monomorphic instance of core.result.unwrap_41
383 with types uint8_t[10size_t], core_array_TryFromSliceError
384
385 */
unwrap_41_e8(Result_cd self,uint8_t ret[10U])386 static inline void unwrap_41_e8(Result_cd self, uint8_t ret[10U]) {
387 if (self.tag == Ok) {
388 uint8_t f0[10U];
389 memcpy(f0, self.val.case_Ok, (size_t)10U * sizeof(uint8_t));
390 memcpy(ret, f0, (size_t)10U * sizeof(uint8_t));
391 } else {
392 KRML_HOST_EPRINTF("KaRaMeL abort at %s:%d\n%s\n", __FILE__, __LINE__,
393 "unwrap not Ok");
394 KRML_HOST_EXIT(255U);
395 }
396 }
397
398 typedef struct Eurydice_slice_uint8_t_4size_t__x2_s {
399 Eurydice_slice fst[4U];
400 Eurydice_slice snd[4U];
401 } Eurydice_slice_uint8_t_4size_t__x2;
402
403 typedef struct libcrux_ml_kem_mlkem768_MlKem768Ciphertext_s {
404 uint8_t value[1088U];
405 } libcrux_ml_kem_mlkem768_MlKem768Ciphertext;
406
407 /**
408 A reference to the raw byte slice.
409 */
410 /**
411 This function found in impl {libcrux_ml_kem::types::MlKemCiphertext<SIZE>#6}
412 */
413 /**
414 A monomorphic instance of libcrux_ml_kem.types.as_slice_d4
415 with const generics
416 - SIZE= 1088
417 */
libcrux_ml_kem_types_as_slice_d4_1d(libcrux_ml_kem_mlkem768_MlKem768Ciphertext * self)418 static inline uint8_t *libcrux_ml_kem_types_as_slice_d4_1d(
419 libcrux_ml_kem_mlkem768_MlKem768Ciphertext *self) {
420 return self->value;
421 }
422
423 /**
424 A monomorphic instance of libcrux_ml_kem.types.MlKemPublicKey
425 with const generics
426 - $1184size_t
427 */
428 typedef struct libcrux_ml_kem_types_MlKemPublicKey_15_s {
429 uint8_t value[1184U];
430 } libcrux_ml_kem_types_MlKemPublicKey_15;
431
432 /**
433 This function found in impl {(core::convert::From<@Array<u8, SIZE>> for
434 libcrux_ml_kem::types::MlKemPublicKey<SIZE>)#14}
435 */
436 /**
437 A monomorphic instance of libcrux_ml_kem.types.from_b6
438 with const generics
439 - SIZE= 1184
440 */
441 static inline libcrux_ml_kem_types_MlKemPublicKey_15
libcrux_ml_kem_types_from_b6_da(uint8_t value[1184U])442 libcrux_ml_kem_types_from_b6_da(uint8_t value[1184U]) {
443 /* Passing arrays by value in Rust generates a copy in C */
444 uint8_t copy_of_value[1184U];
445 memcpy(copy_of_value, value, (size_t)1184U * sizeof(uint8_t));
446 libcrux_ml_kem_types_MlKemPublicKey_15 lit;
447 memcpy(lit.value, copy_of_value, (size_t)1184U * sizeof(uint8_t));
448 return lit;
449 }
450
451 /**
452 A monomorphic instance of libcrux_ml_kem.types.MlKemPrivateKey
453 with const generics
454 - $2400size_t
455 */
456 typedef struct libcrux_ml_kem_types_MlKemPrivateKey_55_s {
457 uint8_t value[2400U];
458 } libcrux_ml_kem_types_MlKemPrivateKey_55;
459
460 typedef struct libcrux_ml_kem_mlkem768_MlKem768KeyPair_s {
461 libcrux_ml_kem_types_MlKemPrivateKey_55 sk;
462 libcrux_ml_kem_types_MlKemPublicKey_15 pk;
463 } libcrux_ml_kem_mlkem768_MlKem768KeyPair;
464
465 /**
466 Create a new [`MlKemKeyPair`] from the secret and public key.
467 */
468 /**
469 This function found in impl
470 {libcrux_ml_kem::types::MlKemKeyPair<PRIVATE_KEY_SIZE, PUBLIC_KEY_SIZE>}
471 */
472 /**
473 A monomorphic instance of libcrux_ml_kem.types.from_17
474 with const generics
475 - PRIVATE_KEY_SIZE= 2400
476 - PUBLIC_KEY_SIZE= 1184
477 */
478 static inline libcrux_ml_kem_mlkem768_MlKem768KeyPair
libcrux_ml_kem_types_from_17_35(libcrux_ml_kem_types_MlKemPrivateKey_55 sk,libcrux_ml_kem_types_MlKemPublicKey_15 pk)479 libcrux_ml_kem_types_from_17_35(libcrux_ml_kem_types_MlKemPrivateKey_55 sk,
480 libcrux_ml_kem_types_MlKemPublicKey_15 pk) {
481 return (
482 CLITERAL(libcrux_ml_kem_mlkem768_MlKem768KeyPair){.sk = sk, .pk = pk});
483 }
484
485 /**
486 This function found in impl {(core::convert::From<@Array<u8, SIZE>> for
487 libcrux_ml_kem::types::MlKemPrivateKey<SIZE>)#8}
488 */
489 /**
490 A monomorphic instance of libcrux_ml_kem.types.from_05
491 with const generics
492 - SIZE= 2400
493 */
494 static inline libcrux_ml_kem_types_MlKemPrivateKey_55
libcrux_ml_kem_types_from_05_f2(uint8_t value[2400U])495 libcrux_ml_kem_types_from_05_f2(uint8_t value[2400U]) {
496 /* Passing arrays by value in Rust generates a copy in C */
497 uint8_t copy_of_value[2400U];
498 memcpy(copy_of_value, value, (size_t)2400U * sizeof(uint8_t));
499 libcrux_ml_kem_types_MlKemPrivateKey_55 lit;
500 memcpy(lit.value, copy_of_value, (size_t)2400U * sizeof(uint8_t));
501 return lit;
502 }
503
504 /**
505 A monomorphic instance of core.result.Result
506 with types uint8_t[32size_t], core_array_TryFromSliceError
507
508 */
509 typedef struct Result_00_s {
510 Result_86_tags tag;
511 union {
512 uint8_t case_Ok[32U];
513 TryFromSliceError case_Err;
514 } val;
515 } Result_00;
516
517 /**
518 This function found in impl {core::result::Result<T, E>}
519 */
520 /**
521 A monomorphic instance of core.result.unwrap_41
522 with types uint8_t[32size_t], core_array_TryFromSliceError
523
524 */
unwrap_41_83(Result_00 self,uint8_t ret[32U])525 static inline void unwrap_41_83(Result_00 self, uint8_t ret[32U]) {
526 if (self.tag == Ok) {
527 uint8_t f0[32U];
528 memcpy(f0, self.val.case_Ok, (size_t)32U * sizeof(uint8_t));
529 memcpy(ret, f0, (size_t)32U * sizeof(uint8_t));
530 } else {
531 KRML_HOST_EPRINTF("KaRaMeL abort at %s:%d\n%s\n", __FILE__, __LINE__,
532 "unwrap not Ok");
533 KRML_HOST_EXIT(255U);
534 }
535 }
536
537 /**
538 A monomorphic instance of K.
539 with types libcrux_ml_kem_types_MlKemCiphertext[[$1088size_t]],
540 uint8_t[32size_t]
541
542 */
543 typedef struct tuple_3c_s {
544 libcrux_ml_kem_mlkem768_MlKem768Ciphertext fst;
545 uint8_t snd[32U];
546 } tuple_3c;
547
548 /**
549 This function found in impl {(core::convert::From<@Array<u8, SIZE>> for
550 libcrux_ml_kem::types::MlKemCiphertext<SIZE>)#2}
551 */
552 /**
553 A monomorphic instance of libcrux_ml_kem.types.from_01
554 with const generics
555 - SIZE= 1088
556 */
557 static inline libcrux_ml_kem_mlkem768_MlKem768Ciphertext
libcrux_ml_kem_types_from_01_9f(uint8_t value[1088U])558 libcrux_ml_kem_types_from_01_9f(uint8_t value[1088U]) {
559 /* Passing arrays by value in Rust generates a copy in C */
560 uint8_t copy_of_value[1088U];
561 memcpy(copy_of_value, value, (size_t)1088U * sizeof(uint8_t));
562 libcrux_ml_kem_mlkem768_MlKem768Ciphertext lit;
563 memcpy(lit.value, copy_of_value, (size_t)1088U * sizeof(uint8_t));
564 return lit;
565 }
566
567 /**
568 A reference to the raw byte slice.
569 */
570 /**
571 This function found in impl {libcrux_ml_kem::types::MlKemPublicKey<SIZE>#18}
572 */
573 /**
574 A monomorphic instance of libcrux_ml_kem.types.as_slice_cb
575 with const generics
576 - SIZE= 1184
577 */
libcrux_ml_kem_types_as_slice_cb_50(libcrux_ml_kem_types_MlKemPublicKey_15 * self)578 static inline uint8_t *libcrux_ml_kem_types_as_slice_cb_50(
579 libcrux_ml_kem_types_MlKemPublicKey_15 *self) {
580 return self->value;
581 }
582
583 /**
584 Pad the `slice` with `0`s at the end.
585 */
586 /**
587 A monomorphic instance of libcrux_ml_kem.utils.into_padded_array
588 with const generics
589 - LEN= 33
590 */
libcrux_ml_kem_utils_into_padded_array_ea2(Eurydice_slice slice,uint8_t ret[33U])591 static KRML_MUSTINLINE void libcrux_ml_kem_utils_into_padded_array_ea2(
592 Eurydice_slice slice, uint8_t ret[33U]) {
593 uint8_t out[33U] = {0U};
594 uint8_t *uu____0 = out;
595 Eurydice_slice_copy(
596 Eurydice_array_to_subslice2(uu____0, (size_t)0U,
597 Eurydice_slice_len(slice, uint8_t), uint8_t),
598 slice, uint8_t);
599 memcpy(ret, out, (size_t)33U * sizeof(uint8_t));
600 }
601
602 /**
603 Pad the `slice` with `0`s at the end.
604 */
605 /**
606 A monomorphic instance of libcrux_ml_kem.utils.into_padded_array
607 with const generics
608 - LEN= 34
609 */
libcrux_ml_kem_utils_into_padded_array_ea1(Eurydice_slice slice,uint8_t ret[34U])610 static KRML_MUSTINLINE void libcrux_ml_kem_utils_into_padded_array_ea1(
611 Eurydice_slice slice, uint8_t ret[34U]) {
612 uint8_t out[34U] = {0U};
613 uint8_t *uu____0 = out;
614 Eurydice_slice_copy(
615 Eurydice_array_to_subslice2(uu____0, (size_t)0U,
616 Eurydice_slice_len(slice, uint8_t), uint8_t),
617 slice, uint8_t);
618 memcpy(ret, out, (size_t)34U * sizeof(uint8_t));
619 }
620
621 /**
622 This function found in impl {(core::convert::AsRef<@Slice<u8>> for
623 libcrux_ml_kem::types::MlKemCiphertext<SIZE>)#1}
624 */
625 /**
626 A monomorphic instance of libcrux_ml_kem.types.as_ref_00
627 with const generics
628 - SIZE= 1088
629 */
libcrux_ml_kem_types_as_ref_00_24(libcrux_ml_kem_mlkem768_MlKem768Ciphertext * self)630 static inline Eurydice_slice libcrux_ml_kem_types_as_ref_00_24(
631 libcrux_ml_kem_mlkem768_MlKem768Ciphertext *self) {
632 return Eurydice_array_to_slice((size_t)1088U, self->value, uint8_t);
633 }
634
635 /**
636 Pad the `slice` with `0`s at the end.
637 */
638 /**
639 A monomorphic instance of libcrux_ml_kem.utils.into_padded_array
640 with const generics
641 - LEN= 1120
642 */
libcrux_ml_kem_utils_into_padded_array_ea0(Eurydice_slice slice,uint8_t ret[1120U])643 static KRML_MUSTINLINE void libcrux_ml_kem_utils_into_padded_array_ea0(
644 Eurydice_slice slice, uint8_t ret[1120U]) {
645 uint8_t out[1120U] = {0U};
646 uint8_t *uu____0 = out;
647 Eurydice_slice_copy(
648 Eurydice_array_to_subslice2(uu____0, (size_t)0U,
649 Eurydice_slice_len(slice, uint8_t), uint8_t),
650 slice, uint8_t);
651 memcpy(ret, out, (size_t)1120U * sizeof(uint8_t));
652 }
653
654 /**
655 Pad the `slice` with `0`s at the end.
656 */
657 /**
658 A monomorphic instance of libcrux_ml_kem.utils.into_padded_array
659 with const generics
660 - LEN= 64
661 */
libcrux_ml_kem_utils_into_padded_array_ea(Eurydice_slice slice,uint8_t ret[64U])662 static KRML_MUSTINLINE void libcrux_ml_kem_utils_into_padded_array_ea(
663 Eurydice_slice slice, uint8_t ret[64U]) {
664 uint8_t out[64U] = {0U};
665 uint8_t *uu____0 = out;
666 Eurydice_slice_copy(
667 Eurydice_array_to_subslice2(uu____0, (size_t)0U,
668 Eurydice_slice_len(slice, uint8_t), uint8_t),
669 slice, uint8_t);
670 memcpy(ret, out, (size_t)64U * sizeof(uint8_t));
671 }
672
673 /**
674 A monomorphic instance of core.result.Result
675 with types int16_t[16size_t], core_array_TryFromSliceError
676
677 */
678 typedef struct Result_c0_s {
679 Result_86_tags tag;
680 union {
681 int16_t case_Ok[16U];
682 TryFromSliceError case_Err;
683 } val;
684 } Result_c0;
685
686 /**
687 This function found in impl {core::result::Result<T, E>}
688 */
689 /**
690 A monomorphic instance of core.result.unwrap_41
691 with types int16_t[16size_t], core_array_TryFromSliceError
692
693 */
unwrap_41_f9(Result_c0 self,int16_t ret[16U])694 static inline void unwrap_41_f9(Result_c0 self, int16_t ret[16U]) {
695 if (self.tag == Ok) {
696 int16_t f0[16U];
697 memcpy(f0, self.val.case_Ok, (size_t)16U * sizeof(int16_t));
698 memcpy(ret, f0, (size_t)16U * sizeof(int16_t));
699 } else {
700 KRML_HOST_EPRINTF("KaRaMeL abort at %s:%d\n%s\n", __FILE__, __LINE__,
701 "unwrap not Ok");
702 KRML_HOST_EXIT(255U);
703 }
704 }
705
706 /**
707 A monomorphic instance of core.result.Result
708 with types uint8_t[8size_t], core_array_TryFromSliceError
709
710 */
711 typedef struct Result_56_s {
712 Result_86_tags tag;
713 union {
714 uint8_t case_Ok[8U];
715 TryFromSliceError case_Err;
716 } val;
717 } Result_56;
718
719 /**
720 This function found in impl {core::result::Result<T, E>}
721 */
722 /**
723 A monomorphic instance of core.result.unwrap_41
724 with types uint8_t[8size_t], core_array_TryFromSliceError
725
726 */
unwrap_41_ac(Result_56 self,uint8_t ret[8U])727 static inline void unwrap_41_ac(Result_56 self, uint8_t ret[8U]) {
728 if (self.tag == Ok) {
729 uint8_t f0[8U];
730 memcpy(f0, self.val.case_Ok, (size_t)8U * sizeof(uint8_t));
731 memcpy(ret, f0, (size_t)8U * sizeof(uint8_t));
732 } else {
733 KRML_HOST_EPRINTF("KaRaMeL abort at %s:%d\n%s\n", __FILE__, __LINE__,
734 "unwrap not Ok");
735 KRML_HOST_EXIT(255U);
736 }
737 }
738
739 typedef struct Eurydice_slice_uint8_t_x2_s {
740 Eurydice_slice fst;
741 Eurydice_slice snd;
742 } Eurydice_slice_uint8_t_x2;
743
744 typedef struct Eurydice_slice_uint8_t_1size_t__x2_s {
745 Eurydice_slice fst[1U];
746 Eurydice_slice snd[1U];
747 } Eurydice_slice_uint8_t_1size_t__x2;
748
749 #if defined(__cplusplus)
750 }
751 #endif
752
753 #define __libcrux_core_H_DEFINED
754 #endif
755
756 /* from libcrux/libcrux-ml-kem/cg/libcrux_ct_ops.h */
757 /*
758 * SPDX-FileCopyrightText: 2024 Cryspen Sarl <info@cryspen.com>
759 *
760 * SPDX-License-Identifier: MIT or Apache-2.0
761 *
762 * This code was generated with the following revisions:
763 * Charon: 6b5e110342a771a3e1c739b10294b1778e4be8b4
764 * Eurydice: 31be7d65ca5d6acdacfb33652e478d24dd85c1cb
765 * Karamel: 3205d3365ea2790b02368f79fcee38e38d0b5908
766 * F*: a32b316e521fa4f239b610ec8f1d15e78d62cbe8-dirty
767 * Libcrux: 4ad532b206174114dd4140b718e7794a28fc59ee
768 */
769
770 #ifndef __libcrux_ct_ops_H
771 #define __libcrux_ct_ops_H
772
773 #if defined(__cplusplus)
774 extern "C" {
775 #endif
776
777
778 /**
779 Return 1 if `value` is not zero and 0 otherwise.
780 */
libcrux_ml_kem_constant_time_ops_inz(uint8_t value)781 static inline uint8_t libcrux_ml_kem_constant_time_ops_inz(uint8_t value) {
782 uint16_t value0 = (uint16_t)value;
783 uint16_t result = (((uint32_t)value0 |
784 (uint32_t)core_num__u16_7__wrapping_add(~value0, 1U)) &
785 0xFFFFU) >>
786 8U &
787 1U;
788 return (uint8_t)result;
789 }
790
791 static KRML_NOINLINE uint8_t
libcrux_ml_kem_constant_time_ops_is_non_zero(uint8_t value)792 libcrux_ml_kem_constant_time_ops_is_non_zero(uint8_t value) {
793 return libcrux_ml_kem_constant_time_ops_inz(value);
794 }
795
796 /**
797 Return 1 if the bytes of `lhs` and `rhs` do not exactly
798 match and 0 otherwise.
799 */
libcrux_ml_kem_constant_time_ops_compare(Eurydice_slice lhs,Eurydice_slice rhs)800 static inline uint8_t libcrux_ml_kem_constant_time_ops_compare(
801 Eurydice_slice lhs, Eurydice_slice rhs) {
802 uint8_t r = 0U;
803 for (size_t i = (size_t)0U; i < Eurydice_slice_len(lhs, uint8_t); i++) {
804 size_t i0 = i;
805 r = (uint32_t)r |
806 ((uint32_t)Eurydice_slice_index(lhs, i0, uint8_t, uint8_t *) ^
807 (uint32_t)Eurydice_slice_index(rhs, i0, uint8_t, uint8_t *));
808 }
809 return libcrux_ml_kem_constant_time_ops_is_non_zero(r);
810 }
811
812 static KRML_NOINLINE uint8_t
libcrux_ml_kem_constant_time_ops_compare_ciphertexts_in_constant_time(Eurydice_slice lhs,Eurydice_slice rhs)813 libcrux_ml_kem_constant_time_ops_compare_ciphertexts_in_constant_time(
814 Eurydice_slice lhs, Eurydice_slice rhs) {
815 return libcrux_ml_kem_constant_time_ops_compare(lhs, rhs);
816 }
817
818 /**
819 If `selector` is not zero, return the bytes in `rhs`; return the bytes in
820 `lhs` otherwise.
821 */
libcrux_ml_kem_constant_time_ops_select_ct(Eurydice_slice lhs,Eurydice_slice rhs,uint8_t selector,uint8_t ret[32U])822 static inline void libcrux_ml_kem_constant_time_ops_select_ct(
823 Eurydice_slice lhs, Eurydice_slice rhs, uint8_t selector,
824 uint8_t ret[32U]) {
825 uint8_t mask = core_num__u8_6__wrapping_sub(
826 libcrux_ml_kem_constant_time_ops_is_non_zero(selector), 1U);
827 uint8_t out[32U] = {0U};
828 for (size_t i = (size_t)0U; i < LIBCRUX_ML_KEM_CONSTANTS_SHARED_SECRET_SIZE;
829 i++) {
830 size_t i0 = i;
831 out[i0] = ((uint32_t)Eurydice_slice_index(lhs, i0, uint8_t, uint8_t *) &
832 (uint32_t)mask) |
833 ((uint32_t)Eurydice_slice_index(rhs, i0, uint8_t, uint8_t *) &
834 (uint32_t)~mask);
835 }
836 memcpy(ret, out, (size_t)32U * sizeof(uint8_t));
837 }
838
839 static KRML_NOINLINE void
libcrux_ml_kem_constant_time_ops_select_shared_secret_in_constant_time(Eurydice_slice lhs,Eurydice_slice rhs,uint8_t selector,uint8_t ret[32U])840 libcrux_ml_kem_constant_time_ops_select_shared_secret_in_constant_time(
841 Eurydice_slice lhs, Eurydice_slice rhs, uint8_t selector,
842 uint8_t ret[32U]) {
843 libcrux_ml_kem_constant_time_ops_select_ct(lhs, rhs, selector, ret);
844 }
845
846 static inline void
libcrux_ml_kem_constant_time_ops_compare_ciphertexts_select_shared_secret_in_constant_time(Eurydice_slice lhs_c,Eurydice_slice rhs_c,Eurydice_slice lhs_s,Eurydice_slice rhs_s,uint8_t ret[32U])847 libcrux_ml_kem_constant_time_ops_compare_ciphertexts_select_shared_secret_in_constant_time(
848 Eurydice_slice lhs_c, Eurydice_slice rhs_c, Eurydice_slice lhs_s,
849 Eurydice_slice rhs_s, uint8_t ret[32U]) {
850 uint8_t selector =
851 libcrux_ml_kem_constant_time_ops_compare_ciphertexts_in_constant_time(
852 lhs_c, rhs_c);
853 uint8_t ret0[32U];
854 libcrux_ml_kem_constant_time_ops_select_shared_secret_in_constant_time(
855 lhs_s, rhs_s, selector, ret0);
856 memcpy(ret, ret0, (size_t)32U * sizeof(uint8_t));
857 }
858
859 #if defined(__cplusplus)
860 }
861 #endif
862
863 #define __libcrux_ct_ops_H_DEFINED
864 #endif
865
866 /* from libcrux/libcrux-ml-kem/cg/libcrux_sha3_portable.h */
867 /*
868 * SPDX-FileCopyrightText: 2024 Cryspen Sarl <info@cryspen.com>
869 *
870 * SPDX-License-Identifier: MIT or Apache-2.0
871 *
872 * This code was generated with the following revisions:
873 * Charon: 6b5e110342a771a3e1c739b10294b1778e4be8b4
874 * Eurydice: 31be7d65ca5d6acdacfb33652e478d24dd85c1cb
875 * Karamel: 3205d3365ea2790b02368f79fcee38e38d0b5908
876 * F*: a32b316e521fa4f239b610ec8f1d15e78d62cbe8-dirty
877 * Libcrux: 4ad532b206174114dd4140b718e7794a28fc59ee
878 */
879
880 #ifndef __libcrux_sha3_portable_H
881 #define __libcrux_sha3_portable_H
882
883 #if defined(__cplusplus)
884 extern "C" {
885 #endif
886
887
888 static const uint64_t libcrux_sha3_generic_keccak_ROUNDCONSTANTS[24U] = {
889 1ULL,
890 32898ULL,
891 9223372036854808714ULL,
892 9223372039002292224ULL,
893 32907ULL,
894 2147483649ULL,
895 9223372039002292353ULL,
896 9223372036854808585ULL,
897 138ULL,
898 136ULL,
899 2147516425ULL,
900 2147483658ULL,
901 2147516555ULL,
902 9223372036854775947ULL,
903 9223372036854808713ULL,
904 9223372036854808579ULL,
905 9223372036854808578ULL,
906 9223372036854775936ULL,
907 32778ULL,
908 9223372039002259466ULL,
909 9223372039002292353ULL,
910 9223372036854808704ULL,
911 2147483649ULL,
912 9223372039002292232ULL};
913
914 /**
915 This function found in impl {(libcrux_sha3::traits::internal::KeccakItem<1:
916 usize> for u64)}
917 */
libcrux_sha3_portable_keccak_zero_5a(void)918 static KRML_MUSTINLINE uint64_t libcrux_sha3_portable_keccak_zero_5a(void) {
919 return 0ULL;
920 }
921
libcrux_sha3_portable_keccak__veor5q_u64(uint64_t a,uint64_t b,uint64_t c,uint64_t d,uint64_t e)922 static KRML_MUSTINLINE uint64_t libcrux_sha3_portable_keccak__veor5q_u64(
923 uint64_t a, uint64_t b, uint64_t c, uint64_t d, uint64_t e) {
924 uint64_t ab = a ^ b;
925 uint64_t cd = c ^ d;
926 uint64_t abcd = ab ^ cd;
927 return abcd ^ e;
928 }
929
930 /**
931 This function found in impl {(libcrux_sha3::traits::internal::KeccakItem<1:
932 usize> for u64)}
933 */
libcrux_sha3_portable_keccak_xor5_5a(uint64_t a,uint64_t b,uint64_t c,uint64_t d,uint64_t e)934 static KRML_MUSTINLINE uint64_t libcrux_sha3_portable_keccak_xor5_5a(
935 uint64_t a, uint64_t b, uint64_t c, uint64_t d, uint64_t e) {
936 return libcrux_sha3_portable_keccak__veor5q_u64(a, b, c, d, e);
937 }
938
939 /**
940 A monomorphic instance of libcrux_sha3.portable_keccak.rotate_left
941 with const generics
942 - LEFT= 1
943 - RIGHT= 63
944 */
945 static KRML_MUSTINLINE uint64_t
libcrux_sha3_portable_keccak_rotate_left_cb(uint64_t x)946 libcrux_sha3_portable_keccak_rotate_left_cb(uint64_t x) {
947 return x << (uint32_t)(int32_t)1 | x >> (uint32_t)(int32_t)63;
948 }
949
950 static KRML_MUSTINLINE uint64_t
libcrux_sha3_portable_keccak__vrax1q_u64(uint64_t a,uint64_t b)951 libcrux_sha3_portable_keccak__vrax1q_u64(uint64_t a, uint64_t b) {
952 uint64_t uu____0 = a;
953 return uu____0 ^ libcrux_sha3_portable_keccak_rotate_left_cb(b);
954 }
955
956 /**
957 This function found in impl {(libcrux_sha3::traits::internal::KeccakItem<1:
958 usize> for u64)}
959 */
960 static KRML_MUSTINLINE uint64_t
libcrux_sha3_portable_keccak_rotate_left1_and_xor_5a(uint64_t a,uint64_t b)961 libcrux_sha3_portable_keccak_rotate_left1_and_xor_5a(uint64_t a, uint64_t b) {
962 return libcrux_sha3_portable_keccak__vrax1q_u64(a, b);
963 }
964
965 static KRML_MUSTINLINE uint64_t
libcrux_sha3_portable_keccak__vbcaxq_u64(uint64_t a,uint64_t b,uint64_t c)966 libcrux_sha3_portable_keccak__vbcaxq_u64(uint64_t a, uint64_t b, uint64_t c) {
967 return a ^ (b & ~c);
968 }
969
970 /**
971 This function found in impl {(libcrux_sha3::traits::internal::KeccakItem<1:
972 usize> for u64)}
973 */
libcrux_sha3_portable_keccak_and_not_xor_5a(uint64_t a,uint64_t b,uint64_t c)974 static KRML_MUSTINLINE uint64_t libcrux_sha3_portable_keccak_and_not_xor_5a(
975 uint64_t a, uint64_t b, uint64_t c) {
976 return libcrux_sha3_portable_keccak__vbcaxq_u64(a, b, c);
977 }
978
979 static KRML_MUSTINLINE uint64_t
libcrux_sha3_portable_keccak__veorq_n_u64(uint64_t a,uint64_t c)980 libcrux_sha3_portable_keccak__veorq_n_u64(uint64_t a, uint64_t c) {
981 return a ^ c;
982 }
983
984 /**
985 This function found in impl {(libcrux_sha3::traits::internal::KeccakItem<1:
986 usize> for u64)}
987 */
988 static KRML_MUSTINLINE uint64_t
libcrux_sha3_portable_keccak_xor_constant_5a(uint64_t a,uint64_t c)989 libcrux_sha3_portable_keccak_xor_constant_5a(uint64_t a, uint64_t c) {
990 return libcrux_sha3_portable_keccak__veorq_n_u64(a, c);
991 }
992
993 /**
994 This function found in impl {(libcrux_sha3::traits::internal::KeccakItem<1:
995 usize> for u64)}
996 */
997 static KRML_MUSTINLINE uint64_t
libcrux_sha3_portable_keccak_xor_5a(uint64_t a,uint64_t b)998 libcrux_sha3_portable_keccak_xor_5a(uint64_t a, uint64_t b) {
999 return a ^ b;
1000 }
1001
libcrux_sha3_portable_keccak_slice_1(Eurydice_slice a[1U],size_t start,size_t len,Eurydice_slice ret[1U])1002 static KRML_MUSTINLINE void libcrux_sha3_portable_keccak_slice_1(
1003 Eurydice_slice a[1U], size_t start, size_t len, Eurydice_slice ret[1U]) {
1004 ret[0U] = Eurydice_slice_subslice2(a[0U], start, start + len, uint8_t);
1005 }
1006
1007 /**
1008 This function found in impl {(libcrux_sha3::traits::internal::KeccakItem<1:
1009 usize> for u64)}
1010 */
libcrux_sha3_portable_keccak_slice_n_5a(Eurydice_slice a[1U],size_t start,size_t len,Eurydice_slice ret[1U])1011 static KRML_MUSTINLINE void libcrux_sha3_portable_keccak_slice_n_5a(
1012 Eurydice_slice a[1U], size_t start, size_t len, Eurydice_slice ret[1U]) {
1013 /* Passing arrays by value in Rust generates a copy in C */
1014 Eurydice_slice copy_of_a[1U];
1015 memcpy(copy_of_a, a, (size_t)1U * sizeof(Eurydice_slice));
1016 Eurydice_slice ret0[1U];
1017 libcrux_sha3_portable_keccak_slice_1(copy_of_a, start, len, ret0);
1018 memcpy(ret, ret0, (size_t)1U * sizeof(Eurydice_slice));
1019 }
1020
1021 static KRML_MUSTINLINE Eurydice_slice_uint8_t_1size_t__x2
libcrux_sha3_portable_keccak_split_at_mut_1(Eurydice_slice out[1U],size_t mid)1022 libcrux_sha3_portable_keccak_split_at_mut_1(Eurydice_slice out[1U],
1023 size_t mid) {
1024 Eurydice_slice_uint8_t_x2 uu____0 = Eurydice_slice_split_at_mut(
1025 out[0U], mid, uint8_t, Eurydice_slice_uint8_t_x2);
1026 Eurydice_slice out00 = uu____0.fst;
1027 Eurydice_slice out01 = uu____0.snd;
1028 Eurydice_slice_uint8_t_1size_t__x2 lit;
1029 lit.fst[0U] = out00;
1030 lit.snd[0U] = out01;
1031 return lit;
1032 }
1033
1034 /**
1035 This function found in impl {(libcrux_sha3::traits::internal::KeccakItem<1:
1036 usize> for u64)}
1037 */
1038 static KRML_MUSTINLINE Eurydice_slice_uint8_t_1size_t__x2
libcrux_sha3_portable_keccak_split_at_mut_n_5a(Eurydice_slice a[1U],size_t mid)1039 libcrux_sha3_portable_keccak_split_at_mut_n_5a(Eurydice_slice a[1U],
1040 size_t mid) {
1041 return libcrux_sha3_portable_keccak_split_at_mut_1(a, mid);
1042 }
1043
1044 /**
1045 A monomorphic instance of libcrux_sha3.generic_keccak.KeccakState
1046 with types uint64_t
1047 with const generics
1048 - $1size_t
1049 */
1050 typedef struct libcrux_sha3_generic_keccak_KeccakState_48_s {
1051 uint64_t st[5U][5U];
1052 } libcrux_sha3_generic_keccak_KeccakState_48;
1053
1054 /**
1055 Create a new Shake128 x4 state.
1056 */
1057 /**
1058 This function found in impl {libcrux_sha3::generic_keccak::KeccakState<T,
1059 N>[TraitClause@0]#1}
1060 */
1061 /**
1062 A monomorphic instance of libcrux_sha3.generic_keccak.new_1e
1063 with types uint64_t
1064 with const generics
1065 - N= 1
1066 */
1067 static KRML_MUSTINLINE libcrux_sha3_generic_keccak_KeccakState_48
libcrux_sha3_generic_keccak_new_1e_f4(void)1068 libcrux_sha3_generic_keccak_new_1e_f4(void) {
1069 libcrux_sha3_generic_keccak_KeccakState_48 lit;
1070 lit.st[0U][0U] = libcrux_sha3_portable_keccak_zero_5a();
1071 lit.st[0U][1U] = libcrux_sha3_portable_keccak_zero_5a();
1072 lit.st[0U][2U] = libcrux_sha3_portable_keccak_zero_5a();
1073 lit.st[0U][3U] = libcrux_sha3_portable_keccak_zero_5a();
1074 lit.st[0U][4U] = libcrux_sha3_portable_keccak_zero_5a();
1075 lit.st[1U][0U] = libcrux_sha3_portable_keccak_zero_5a();
1076 lit.st[1U][1U] = libcrux_sha3_portable_keccak_zero_5a();
1077 lit.st[1U][2U] = libcrux_sha3_portable_keccak_zero_5a();
1078 lit.st[1U][3U] = libcrux_sha3_portable_keccak_zero_5a();
1079 lit.st[1U][4U] = libcrux_sha3_portable_keccak_zero_5a();
1080 lit.st[2U][0U] = libcrux_sha3_portable_keccak_zero_5a();
1081 lit.st[2U][1U] = libcrux_sha3_portable_keccak_zero_5a();
1082 lit.st[2U][2U] = libcrux_sha3_portable_keccak_zero_5a();
1083 lit.st[2U][3U] = libcrux_sha3_portable_keccak_zero_5a();
1084 lit.st[2U][4U] = libcrux_sha3_portable_keccak_zero_5a();
1085 lit.st[3U][0U] = libcrux_sha3_portable_keccak_zero_5a();
1086 lit.st[3U][1U] = libcrux_sha3_portable_keccak_zero_5a();
1087 lit.st[3U][2U] = libcrux_sha3_portable_keccak_zero_5a();
1088 lit.st[3U][3U] = libcrux_sha3_portable_keccak_zero_5a();
1089 lit.st[3U][4U] = libcrux_sha3_portable_keccak_zero_5a();
1090 lit.st[4U][0U] = libcrux_sha3_portable_keccak_zero_5a();
1091 lit.st[4U][1U] = libcrux_sha3_portable_keccak_zero_5a();
1092 lit.st[4U][2U] = libcrux_sha3_portable_keccak_zero_5a();
1093 lit.st[4U][3U] = libcrux_sha3_portable_keccak_zero_5a();
1094 lit.st[4U][4U] = libcrux_sha3_portable_keccak_zero_5a();
1095 return lit;
1096 }
1097
1098 /**
1099 A monomorphic instance of libcrux_sha3.portable_keccak.load_block
1100 with const generics
1101 - RATE= 72
1102 */
libcrux_sha3_portable_keccak_load_block_2c(uint64_t (* s)[5U],Eurydice_slice blocks[1U])1103 static KRML_MUSTINLINE void libcrux_sha3_portable_keccak_load_block_2c(
1104 uint64_t (*s)[5U], Eurydice_slice blocks[1U]) {
1105 for (size_t i = (size_t)0U; i < (size_t)72U / (size_t)8U; i++) {
1106 size_t i0 = i;
1107 uint8_t uu____0[8U];
1108 Result_56 dst;
1109 Eurydice_slice_to_array2(
1110 &dst,
1111 Eurydice_slice_subslice2(blocks[0U], (size_t)8U * i0,
1112 (size_t)8U * i0 + (size_t)8U, uint8_t),
1113 Eurydice_slice, uint8_t[8U]);
1114 unwrap_41_ac(dst, uu____0);
1115 size_t uu____1 = i0 / (size_t)5U;
1116 size_t uu____2 = i0 % (size_t)5U;
1117 s[uu____1][uu____2] =
1118 s[uu____1][uu____2] ^ core_num__u64_9__from_le_bytes(uu____0);
1119 }
1120 }
1121
1122 /**
1123 This function found in impl {(libcrux_sha3::traits::internal::KeccakItem<1:
1124 usize> for u64)}
1125 */
1126 /**
1127 A monomorphic instance of libcrux_sha3.portable_keccak.load_block_5a
1128 with const generics
1129 - RATE= 72
1130 */
libcrux_sha3_portable_keccak_load_block_5a_b8(uint64_t (* a)[5U],Eurydice_slice b[1U])1131 static KRML_MUSTINLINE void libcrux_sha3_portable_keccak_load_block_5a_b8(
1132 uint64_t (*a)[5U], Eurydice_slice b[1U]) {
1133 uint64_t(*uu____0)[5U] = a;
1134 /* Passing arrays by value in Rust generates a copy in C */
1135 Eurydice_slice copy_of_b[1U];
1136 memcpy(copy_of_b, b, (size_t)1U * sizeof(Eurydice_slice));
1137 libcrux_sha3_portable_keccak_load_block_2c(uu____0, copy_of_b);
1138 }
1139
1140 /**
1141 A monomorphic instance of libcrux_sha3.portable_keccak.rotate_left
1142 with const generics
1143 - LEFT= 36
1144 - RIGHT= 28
1145 */
1146 static KRML_MUSTINLINE uint64_t
libcrux_sha3_portable_keccak_rotate_left_cb0(uint64_t x)1147 libcrux_sha3_portable_keccak_rotate_left_cb0(uint64_t x) {
1148 return x << (uint32_t)(int32_t)36 | x >> (uint32_t)(int32_t)28;
1149 }
1150
1151 /**
1152 A monomorphic instance of libcrux_sha3.portable_keccak._vxarq_u64
1153 with const generics
1154 - LEFT= 36
1155 - RIGHT= 28
1156 */
1157 static KRML_MUSTINLINE uint64_t
libcrux_sha3_portable_keccak__vxarq_u64_42(uint64_t a,uint64_t b)1158 libcrux_sha3_portable_keccak__vxarq_u64_42(uint64_t a, uint64_t b) {
1159 uint64_t ab = a ^ b;
1160 return libcrux_sha3_portable_keccak_rotate_left_cb0(ab);
1161 }
1162
1163 /**
1164 This function found in impl {(libcrux_sha3::traits::internal::KeccakItem<1:
1165 usize> for u64)}
1166 */
1167 /**
1168 A monomorphic instance of libcrux_sha3.portable_keccak.xor_and_rotate_5a
1169 with const generics
1170 - LEFT= 36
1171 - RIGHT= 28
1172 */
1173 static KRML_MUSTINLINE uint64_t
libcrux_sha3_portable_keccak_xor_and_rotate_5a_bb(uint64_t a,uint64_t b)1174 libcrux_sha3_portable_keccak_xor_and_rotate_5a_bb(uint64_t a, uint64_t b) {
1175 return libcrux_sha3_portable_keccak__vxarq_u64_42(a, b);
1176 }
1177
1178 /**
1179 A monomorphic instance of libcrux_sha3.portable_keccak.rotate_left
1180 with const generics
1181 - LEFT= 3
1182 - RIGHT= 61
1183 */
1184 static KRML_MUSTINLINE uint64_t
libcrux_sha3_portable_keccak_rotate_left_cb1(uint64_t x)1185 libcrux_sha3_portable_keccak_rotate_left_cb1(uint64_t x) {
1186 return x << (uint32_t)(int32_t)3 | x >> (uint32_t)(int32_t)61;
1187 }
1188
1189 /**
1190 A monomorphic instance of libcrux_sha3.portable_keccak._vxarq_u64
1191 with const generics
1192 - LEFT= 3
1193 - RIGHT= 61
1194 */
1195 static KRML_MUSTINLINE uint64_t
libcrux_sha3_portable_keccak__vxarq_u64_420(uint64_t a,uint64_t b)1196 libcrux_sha3_portable_keccak__vxarq_u64_420(uint64_t a, uint64_t b) {
1197 uint64_t ab = a ^ b;
1198 return libcrux_sha3_portable_keccak_rotate_left_cb1(ab);
1199 }
1200
1201 /**
1202 This function found in impl {(libcrux_sha3::traits::internal::KeccakItem<1:
1203 usize> for u64)}
1204 */
1205 /**
1206 A monomorphic instance of libcrux_sha3.portable_keccak.xor_and_rotate_5a
1207 with const generics
1208 - LEFT= 3
1209 - RIGHT= 61
1210 */
1211 static KRML_MUSTINLINE uint64_t
libcrux_sha3_portable_keccak_xor_and_rotate_5a_bb0(uint64_t a,uint64_t b)1212 libcrux_sha3_portable_keccak_xor_and_rotate_5a_bb0(uint64_t a, uint64_t b) {
1213 return libcrux_sha3_portable_keccak__vxarq_u64_420(a, b);
1214 }
1215
1216 /**
1217 A monomorphic instance of libcrux_sha3.portable_keccak.rotate_left
1218 with const generics
1219 - LEFT= 41
1220 - RIGHT= 23
1221 */
1222 static KRML_MUSTINLINE uint64_t
libcrux_sha3_portable_keccak_rotate_left_cb2(uint64_t x)1223 libcrux_sha3_portable_keccak_rotate_left_cb2(uint64_t x) {
1224 return x << (uint32_t)(int32_t)41 | x >> (uint32_t)(int32_t)23;
1225 }
1226
1227 /**
1228 A monomorphic instance of libcrux_sha3.portable_keccak._vxarq_u64
1229 with const generics
1230 - LEFT= 41
1231 - RIGHT= 23
1232 */
1233 static KRML_MUSTINLINE uint64_t
libcrux_sha3_portable_keccak__vxarq_u64_421(uint64_t a,uint64_t b)1234 libcrux_sha3_portable_keccak__vxarq_u64_421(uint64_t a, uint64_t b) {
1235 uint64_t ab = a ^ b;
1236 return libcrux_sha3_portable_keccak_rotate_left_cb2(ab);
1237 }
1238
1239 /**
1240 This function found in impl {(libcrux_sha3::traits::internal::KeccakItem<1:
1241 usize> for u64)}
1242 */
1243 /**
1244 A monomorphic instance of libcrux_sha3.portable_keccak.xor_and_rotate_5a
1245 with const generics
1246 - LEFT= 41
1247 - RIGHT= 23
1248 */
1249 static KRML_MUSTINLINE uint64_t
libcrux_sha3_portable_keccak_xor_and_rotate_5a_bb1(uint64_t a,uint64_t b)1250 libcrux_sha3_portable_keccak_xor_and_rotate_5a_bb1(uint64_t a, uint64_t b) {
1251 return libcrux_sha3_portable_keccak__vxarq_u64_421(a, b);
1252 }
1253
1254 /**
1255 A monomorphic instance of libcrux_sha3.portable_keccak.rotate_left
1256 with const generics
1257 - LEFT= 18
1258 - RIGHT= 46
1259 */
1260 static KRML_MUSTINLINE uint64_t
libcrux_sha3_portable_keccak_rotate_left_cb3(uint64_t x)1261 libcrux_sha3_portable_keccak_rotate_left_cb3(uint64_t x) {
1262 return x << (uint32_t)(int32_t)18 | x >> (uint32_t)(int32_t)46;
1263 }
1264
1265 /**
1266 A monomorphic instance of libcrux_sha3.portable_keccak._vxarq_u64
1267 with const generics
1268 - LEFT= 18
1269 - RIGHT= 46
1270 */
1271 static KRML_MUSTINLINE uint64_t
libcrux_sha3_portable_keccak__vxarq_u64_422(uint64_t a,uint64_t b)1272 libcrux_sha3_portable_keccak__vxarq_u64_422(uint64_t a, uint64_t b) {
1273 uint64_t ab = a ^ b;
1274 return libcrux_sha3_portable_keccak_rotate_left_cb3(ab);
1275 }
1276
1277 /**
1278 This function found in impl {(libcrux_sha3::traits::internal::KeccakItem<1:
1279 usize> for u64)}
1280 */
1281 /**
1282 A monomorphic instance of libcrux_sha3.portable_keccak.xor_and_rotate_5a
1283 with const generics
1284 - LEFT= 18
1285 - RIGHT= 46
1286 */
1287 static KRML_MUSTINLINE uint64_t
libcrux_sha3_portable_keccak_xor_and_rotate_5a_bb2(uint64_t a,uint64_t b)1288 libcrux_sha3_portable_keccak_xor_and_rotate_5a_bb2(uint64_t a, uint64_t b) {
1289 return libcrux_sha3_portable_keccak__vxarq_u64_422(a, b);
1290 }
1291
1292 /**
1293 A monomorphic instance of libcrux_sha3.portable_keccak._vxarq_u64
1294 with const generics
1295 - LEFT= 1
1296 - RIGHT= 63
1297 */
1298 static KRML_MUSTINLINE uint64_t
libcrux_sha3_portable_keccak__vxarq_u64_423(uint64_t a,uint64_t b)1299 libcrux_sha3_portable_keccak__vxarq_u64_423(uint64_t a, uint64_t b) {
1300 uint64_t ab = a ^ b;
1301 return libcrux_sha3_portable_keccak_rotate_left_cb(ab);
1302 }
1303
1304 /**
1305 This function found in impl {(libcrux_sha3::traits::internal::KeccakItem<1:
1306 usize> for u64)}
1307 */
1308 /**
1309 A monomorphic instance of libcrux_sha3.portable_keccak.xor_and_rotate_5a
1310 with const generics
1311 - LEFT= 1
1312 - RIGHT= 63
1313 */
1314 static KRML_MUSTINLINE uint64_t
libcrux_sha3_portable_keccak_xor_and_rotate_5a_bb3(uint64_t a,uint64_t b)1315 libcrux_sha3_portable_keccak_xor_and_rotate_5a_bb3(uint64_t a, uint64_t b) {
1316 return libcrux_sha3_portable_keccak__vxarq_u64_423(a, b);
1317 }
1318
1319 /**
1320 A monomorphic instance of libcrux_sha3.portable_keccak.rotate_left
1321 with const generics
1322 - LEFT= 44
1323 - RIGHT= 20
1324 */
1325 static KRML_MUSTINLINE uint64_t
libcrux_sha3_portable_keccak_rotate_left_cb4(uint64_t x)1326 libcrux_sha3_portable_keccak_rotate_left_cb4(uint64_t x) {
1327 return x << (uint32_t)(int32_t)44 | x >> (uint32_t)(int32_t)20;
1328 }
1329
1330 /**
1331 A monomorphic instance of libcrux_sha3.portable_keccak._vxarq_u64
1332 with const generics
1333 - LEFT= 44
1334 - RIGHT= 20
1335 */
1336 static KRML_MUSTINLINE uint64_t
libcrux_sha3_portable_keccak__vxarq_u64_424(uint64_t a,uint64_t b)1337 libcrux_sha3_portable_keccak__vxarq_u64_424(uint64_t a, uint64_t b) {
1338 uint64_t ab = a ^ b;
1339 return libcrux_sha3_portable_keccak_rotate_left_cb4(ab);
1340 }
1341
1342 /**
1343 This function found in impl {(libcrux_sha3::traits::internal::KeccakItem<1:
1344 usize> for u64)}
1345 */
1346 /**
1347 A monomorphic instance of libcrux_sha3.portable_keccak.xor_and_rotate_5a
1348 with const generics
1349 - LEFT= 44
1350 - RIGHT= 20
1351 */
1352 static KRML_MUSTINLINE uint64_t
libcrux_sha3_portable_keccak_xor_and_rotate_5a_bb4(uint64_t a,uint64_t b)1353 libcrux_sha3_portable_keccak_xor_and_rotate_5a_bb4(uint64_t a, uint64_t b) {
1354 return libcrux_sha3_portable_keccak__vxarq_u64_424(a, b);
1355 }
1356
1357 /**
1358 A monomorphic instance of libcrux_sha3.portable_keccak.rotate_left
1359 with const generics
1360 - LEFT= 10
1361 - RIGHT= 54
1362 */
1363 static KRML_MUSTINLINE uint64_t
libcrux_sha3_portable_keccak_rotate_left_cb5(uint64_t x)1364 libcrux_sha3_portable_keccak_rotate_left_cb5(uint64_t x) {
1365 return x << (uint32_t)(int32_t)10 | x >> (uint32_t)(int32_t)54;
1366 }
1367
1368 /**
1369 A monomorphic instance of libcrux_sha3.portable_keccak._vxarq_u64
1370 with const generics
1371 - LEFT= 10
1372 - RIGHT= 54
1373 */
1374 static KRML_MUSTINLINE uint64_t
libcrux_sha3_portable_keccak__vxarq_u64_425(uint64_t a,uint64_t b)1375 libcrux_sha3_portable_keccak__vxarq_u64_425(uint64_t a, uint64_t b) {
1376 uint64_t ab = a ^ b;
1377 return libcrux_sha3_portable_keccak_rotate_left_cb5(ab);
1378 }
1379
1380 /**
1381 This function found in impl {(libcrux_sha3::traits::internal::KeccakItem<1:
1382 usize> for u64)}
1383 */
1384 /**
1385 A monomorphic instance of libcrux_sha3.portable_keccak.xor_and_rotate_5a
1386 with const generics
1387 - LEFT= 10
1388 - RIGHT= 54
1389 */
1390 static KRML_MUSTINLINE uint64_t
libcrux_sha3_portable_keccak_xor_and_rotate_5a_bb5(uint64_t a,uint64_t b)1391 libcrux_sha3_portable_keccak_xor_and_rotate_5a_bb5(uint64_t a, uint64_t b) {
1392 return libcrux_sha3_portable_keccak__vxarq_u64_425(a, b);
1393 }
1394
1395 /**
1396 A monomorphic instance of libcrux_sha3.portable_keccak.rotate_left
1397 with const generics
1398 - LEFT= 45
1399 - RIGHT= 19
1400 */
1401 static KRML_MUSTINLINE uint64_t
libcrux_sha3_portable_keccak_rotate_left_cb6(uint64_t x)1402 libcrux_sha3_portable_keccak_rotate_left_cb6(uint64_t x) {
1403 return x << (uint32_t)(int32_t)45 | x >> (uint32_t)(int32_t)19;
1404 }
1405
1406 /**
1407 A monomorphic instance of libcrux_sha3.portable_keccak._vxarq_u64
1408 with const generics
1409 - LEFT= 45
1410 - RIGHT= 19
1411 */
1412 static KRML_MUSTINLINE uint64_t
libcrux_sha3_portable_keccak__vxarq_u64_426(uint64_t a,uint64_t b)1413 libcrux_sha3_portable_keccak__vxarq_u64_426(uint64_t a, uint64_t b) {
1414 uint64_t ab = a ^ b;
1415 return libcrux_sha3_portable_keccak_rotate_left_cb6(ab);
1416 }
1417
1418 /**
1419 This function found in impl {(libcrux_sha3::traits::internal::KeccakItem<1:
1420 usize> for u64)}
1421 */
1422 /**
1423 A monomorphic instance of libcrux_sha3.portable_keccak.xor_and_rotate_5a
1424 with const generics
1425 - LEFT= 45
1426 - RIGHT= 19
1427 */
1428 static KRML_MUSTINLINE uint64_t
libcrux_sha3_portable_keccak_xor_and_rotate_5a_bb6(uint64_t a,uint64_t b)1429 libcrux_sha3_portable_keccak_xor_and_rotate_5a_bb6(uint64_t a, uint64_t b) {
1430 return libcrux_sha3_portable_keccak__vxarq_u64_426(a, b);
1431 }
1432
1433 /**
1434 A monomorphic instance of libcrux_sha3.portable_keccak.rotate_left
1435 with const generics
1436 - LEFT= 2
1437 - RIGHT= 62
1438 */
1439 static KRML_MUSTINLINE uint64_t
libcrux_sha3_portable_keccak_rotate_left_cb7(uint64_t x)1440 libcrux_sha3_portable_keccak_rotate_left_cb7(uint64_t x) {
1441 return x << (uint32_t)(int32_t)2 | x >> (uint32_t)(int32_t)62;
1442 }
1443
1444 /**
1445 A monomorphic instance of libcrux_sha3.portable_keccak._vxarq_u64
1446 with const generics
1447 - LEFT= 2
1448 - RIGHT= 62
1449 */
1450 static KRML_MUSTINLINE uint64_t
libcrux_sha3_portable_keccak__vxarq_u64_427(uint64_t a,uint64_t b)1451 libcrux_sha3_portable_keccak__vxarq_u64_427(uint64_t a, uint64_t b) {
1452 uint64_t ab = a ^ b;
1453 return libcrux_sha3_portable_keccak_rotate_left_cb7(ab);
1454 }
1455
1456 /**
1457 This function found in impl {(libcrux_sha3::traits::internal::KeccakItem<1:
1458 usize> for u64)}
1459 */
1460 /**
1461 A monomorphic instance of libcrux_sha3.portable_keccak.xor_and_rotate_5a
1462 with const generics
1463 - LEFT= 2
1464 - RIGHT= 62
1465 */
1466 static KRML_MUSTINLINE uint64_t
libcrux_sha3_portable_keccak_xor_and_rotate_5a_bb7(uint64_t a,uint64_t b)1467 libcrux_sha3_portable_keccak_xor_and_rotate_5a_bb7(uint64_t a, uint64_t b) {
1468 return libcrux_sha3_portable_keccak__vxarq_u64_427(a, b);
1469 }
1470
1471 /**
1472 A monomorphic instance of libcrux_sha3.portable_keccak.rotate_left
1473 with const generics
1474 - LEFT= 62
1475 - RIGHT= 2
1476 */
1477 static KRML_MUSTINLINE uint64_t
libcrux_sha3_portable_keccak_rotate_left_cb8(uint64_t x)1478 libcrux_sha3_portable_keccak_rotate_left_cb8(uint64_t x) {
1479 return x << (uint32_t)(int32_t)62 | x >> (uint32_t)(int32_t)2;
1480 }
1481
1482 /**
1483 A monomorphic instance of libcrux_sha3.portable_keccak._vxarq_u64
1484 with const generics
1485 - LEFT= 62
1486 - RIGHT= 2
1487 */
1488 static KRML_MUSTINLINE uint64_t
libcrux_sha3_portable_keccak__vxarq_u64_428(uint64_t a,uint64_t b)1489 libcrux_sha3_portable_keccak__vxarq_u64_428(uint64_t a, uint64_t b) {
1490 uint64_t ab = a ^ b;
1491 return libcrux_sha3_portable_keccak_rotate_left_cb8(ab);
1492 }
1493
1494 /**
1495 This function found in impl {(libcrux_sha3::traits::internal::KeccakItem<1:
1496 usize> for u64)}
1497 */
1498 /**
1499 A monomorphic instance of libcrux_sha3.portable_keccak.xor_and_rotate_5a
1500 with const generics
1501 - LEFT= 62
1502 - RIGHT= 2
1503 */
1504 static KRML_MUSTINLINE uint64_t
libcrux_sha3_portable_keccak_xor_and_rotate_5a_bb8(uint64_t a,uint64_t b)1505 libcrux_sha3_portable_keccak_xor_and_rotate_5a_bb8(uint64_t a, uint64_t b) {
1506 return libcrux_sha3_portable_keccak__vxarq_u64_428(a, b);
1507 }
1508
1509 /**
1510 A monomorphic instance of libcrux_sha3.portable_keccak.rotate_left
1511 with const generics
1512 - LEFT= 6
1513 - RIGHT= 58
1514 */
1515 static KRML_MUSTINLINE uint64_t
libcrux_sha3_portable_keccak_rotate_left_cb9(uint64_t x)1516 libcrux_sha3_portable_keccak_rotate_left_cb9(uint64_t x) {
1517 return x << (uint32_t)(int32_t)6 | x >> (uint32_t)(int32_t)58;
1518 }
1519
1520 /**
1521 A monomorphic instance of libcrux_sha3.portable_keccak._vxarq_u64
1522 with const generics
1523 - LEFT= 6
1524 - RIGHT= 58
1525 */
1526 static KRML_MUSTINLINE uint64_t
libcrux_sha3_portable_keccak__vxarq_u64_429(uint64_t a,uint64_t b)1527 libcrux_sha3_portable_keccak__vxarq_u64_429(uint64_t a, uint64_t b) {
1528 uint64_t ab = a ^ b;
1529 return libcrux_sha3_portable_keccak_rotate_left_cb9(ab);
1530 }
1531
1532 /**
1533 This function found in impl {(libcrux_sha3::traits::internal::KeccakItem<1:
1534 usize> for u64)}
1535 */
1536 /**
1537 A monomorphic instance of libcrux_sha3.portable_keccak.xor_and_rotate_5a
1538 with const generics
1539 - LEFT= 6
1540 - RIGHT= 58
1541 */
1542 static KRML_MUSTINLINE uint64_t
libcrux_sha3_portable_keccak_xor_and_rotate_5a_bb9(uint64_t a,uint64_t b)1543 libcrux_sha3_portable_keccak_xor_and_rotate_5a_bb9(uint64_t a, uint64_t b) {
1544 return libcrux_sha3_portable_keccak__vxarq_u64_429(a, b);
1545 }
1546
1547 /**
1548 A monomorphic instance of libcrux_sha3.portable_keccak.rotate_left
1549 with const generics
1550 - LEFT= 43
1551 - RIGHT= 21
1552 */
1553 static KRML_MUSTINLINE uint64_t
libcrux_sha3_portable_keccak_rotate_left_cb10(uint64_t x)1554 libcrux_sha3_portable_keccak_rotate_left_cb10(uint64_t x) {
1555 return x << (uint32_t)(int32_t)43 | x >> (uint32_t)(int32_t)21;
1556 }
1557
1558 /**
1559 A monomorphic instance of libcrux_sha3.portable_keccak._vxarq_u64
1560 with const generics
1561 - LEFT= 43
1562 - RIGHT= 21
1563 */
1564 static KRML_MUSTINLINE uint64_t
libcrux_sha3_portable_keccak__vxarq_u64_4210(uint64_t a,uint64_t b)1565 libcrux_sha3_portable_keccak__vxarq_u64_4210(uint64_t a, uint64_t b) {
1566 uint64_t ab = a ^ b;
1567 return libcrux_sha3_portable_keccak_rotate_left_cb10(ab);
1568 }
1569
1570 /**
1571 This function found in impl {(libcrux_sha3::traits::internal::KeccakItem<1:
1572 usize> for u64)}
1573 */
1574 /**
1575 A monomorphic instance of libcrux_sha3.portable_keccak.xor_and_rotate_5a
1576 with const generics
1577 - LEFT= 43
1578 - RIGHT= 21
1579 */
1580 static KRML_MUSTINLINE uint64_t
libcrux_sha3_portable_keccak_xor_and_rotate_5a_bb10(uint64_t a,uint64_t b)1581 libcrux_sha3_portable_keccak_xor_and_rotate_5a_bb10(uint64_t a, uint64_t b) {
1582 return libcrux_sha3_portable_keccak__vxarq_u64_4210(a, b);
1583 }
1584
1585 /**
1586 A monomorphic instance of libcrux_sha3.portable_keccak.rotate_left
1587 with const generics
1588 - LEFT= 15
1589 - RIGHT= 49
1590 */
1591 static KRML_MUSTINLINE uint64_t
libcrux_sha3_portable_keccak_rotate_left_cb11(uint64_t x)1592 libcrux_sha3_portable_keccak_rotate_left_cb11(uint64_t x) {
1593 return x << (uint32_t)(int32_t)15 | x >> (uint32_t)(int32_t)49;
1594 }
1595
1596 /**
1597 A monomorphic instance of libcrux_sha3.portable_keccak._vxarq_u64
1598 with const generics
1599 - LEFT= 15
1600 - RIGHT= 49
1601 */
1602 static KRML_MUSTINLINE uint64_t
libcrux_sha3_portable_keccak__vxarq_u64_4211(uint64_t a,uint64_t b)1603 libcrux_sha3_portable_keccak__vxarq_u64_4211(uint64_t a, uint64_t b) {
1604 uint64_t ab = a ^ b;
1605 return libcrux_sha3_portable_keccak_rotate_left_cb11(ab);
1606 }
1607
1608 /**
1609 This function found in impl {(libcrux_sha3::traits::internal::KeccakItem<1:
1610 usize> for u64)}
1611 */
1612 /**
1613 A monomorphic instance of libcrux_sha3.portable_keccak.xor_and_rotate_5a
1614 with const generics
1615 - LEFT= 15
1616 - RIGHT= 49
1617 */
1618 static KRML_MUSTINLINE uint64_t
libcrux_sha3_portable_keccak_xor_and_rotate_5a_bb11(uint64_t a,uint64_t b)1619 libcrux_sha3_portable_keccak_xor_and_rotate_5a_bb11(uint64_t a, uint64_t b) {
1620 return libcrux_sha3_portable_keccak__vxarq_u64_4211(a, b);
1621 }
1622
1623 /**
1624 A monomorphic instance of libcrux_sha3.portable_keccak.rotate_left
1625 with const generics
1626 - LEFT= 61
1627 - RIGHT= 3
1628 */
1629 static KRML_MUSTINLINE uint64_t
libcrux_sha3_portable_keccak_rotate_left_cb12(uint64_t x)1630 libcrux_sha3_portable_keccak_rotate_left_cb12(uint64_t x) {
1631 return x << (uint32_t)(int32_t)61 | x >> (uint32_t)(int32_t)3;
1632 }
1633
1634 /**
1635 A monomorphic instance of libcrux_sha3.portable_keccak._vxarq_u64
1636 with const generics
1637 - LEFT= 61
1638 - RIGHT= 3
1639 */
1640 static KRML_MUSTINLINE uint64_t
libcrux_sha3_portable_keccak__vxarq_u64_4212(uint64_t a,uint64_t b)1641 libcrux_sha3_portable_keccak__vxarq_u64_4212(uint64_t a, uint64_t b) {
1642 uint64_t ab = a ^ b;
1643 return libcrux_sha3_portable_keccak_rotate_left_cb12(ab);
1644 }
1645
1646 /**
1647 This function found in impl {(libcrux_sha3::traits::internal::KeccakItem<1:
1648 usize> for u64)}
1649 */
1650 /**
1651 A monomorphic instance of libcrux_sha3.portable_keccak.xor_and_rotate_5a
1652 with const generics
1653 - LEFT= 61
1654 - RIGHT= 3
1655 */
1656 static KRML_MUSTINLINE uint64_t
libcrux_sha3_portable_keccak_xor_and_rotate_5a_bb12(uint64_t a,uint64_t b)1657 libcrux_sha3_portable_keccak_xor_and_rotate_5a_bb12(uint64_t a, uint64_t b) {
1658 return libcrux_sha3_portable_keccak__vxarq_u64_4212(a, b);
1659 }
1660
1661 /**
1662 A monomorphic instance of libcrux_sha3.portable_keccak.rotate_left
1663 with const generics
1664 - LEFT= 28
1665 - RIGHT= 36
1666 */
1667 static KRML_MUSTINLINE uint64_t
libcrux_sha3_portable_keccak_rotate_left_cb13(uint64_t x)1668 libcrux_sha3_portable_keccak_rotate_left_cb13(uint64_t x) {
1669 return x << (uint32_t)(int32_t)28 | x >> (uint32_t)(int32_t)36;
1670 }
1671
1672 /**
1673 A monomorphic instance of libcrux_sha3.portable_keccak._vxarq_u64
1674 with const generics
1675 - LEFT= 28
1676 - RIGHT= 36
1677 */
1678 static KRML_MUSTINLINE uint64_t
libcrux_sha3_portable_keccak__vxarq_u64_4213(uint64_t a,uint64_t b)1679 libcrux_sha3_portable_keccak__vxarq_u64_4213(uint64_t a, uint64_t b) {
1680 uint64_t ab = a ^ b;
1681 return libcrux_sha3_portable_keccak_rotate_left_cb13(ab);
1682 }
1683
1684 /**
1685 This function found in impl {(libcrux_sha3::traits::internal::KeccakItem<1:
1686 usize> for u64)}
1687 */
1688 /**
1689 A monomorphic instance of libcrux_sha3.portable_keccak.xor_and_rotate_5a
1690 with const generics
1691 - LEFT= 28
1692 - RIGHT= 36
1693 */
1694 static KRML_MUSTINLINE uint64_t
libcrux_sha3_portable_keccak_xor_and_rotate_5a_bb13(uint64_t a,uint64_t b)1695 libcrux_sha3_portable_keccak_xor_and_rotate_5a_bb13(uint64_t a, uint64_t b) {
1696 return libcrux_sha3_portable_keccak__vxarq_u64_4213(a, b);
1697 }
1698
1699 /**
1700 A monomorphic instance of libcrux_sha3.portable_keccak.rotate_left
1701 with const generics
1702 - LEFT= 55
1703 - RIGHT= 9
1704 */
1705 static KRML_MUSTINLINE uint64_t
libcrux_sha3_portable_keccak_rotate_left_cb14(uint64_t x)1706 libcrux_sha3_portable_keccak_rotate_left_cb14(uint64_t x) {
1707 return x << (uint32_t)(int32_t)55 | x >> (uint32_t)(int32_t)9;
1708 }
1709
1710 /**
1711 A monomorphic instance of libcrux_sha3.portable_keccak._vxarq_u64
1712 with const generics
1713 - LEFT= 55
1714 - RIGHT= 9
1715 */
1716 static KRML_MUSTINLINE uint64_t
libcrux_sha3_portable_keccak__vxarq_u64_4214(uint64_t a,uint64_t b)1717 libcrux_sha3_portable_keccak__vxarq_u64_4214(uint64_t a, uint64_t b) {
1718 uint64_t ab = a ^ b;
1719 return libcrux_sha3_portable_keccak_rotate_left_cb14(ab);
1720 }
1721
1722 /**
1723 This function found in impl {(libcrux_sha3::traits::internal::KeccakItem<1:
1724 usize> for u64)}
1725 */
1726 /**
1727 A monomorphic instance of libcrux_sha3.portable_keccak.xor_and_rotate_5a
1728 with const generics
1729 - LEFT= 55
1730 - RIGHT= 9
1731 */
1732 static KRML_MUSTINLINE uint64_t
libcrux_sha3_portable_keccak_xor_and_rotate_5a_bb14(uint64_t a,uint64_t b)1733 libcrux_sha3_portable_keccak_xor_and_rotate_5a_bb14(uint64_t a, uint64_t b) {
1734 return libcrux_sha3_portable_keccak__vxarq_u64_4214(a, b);
1735 }
1736
1737 /**
1738 A monomorphic instance of libcrux_sha3.portable_keccak.rotate_left
1739 with const generics
1740 - LEFT= 25
1741 - RIGHT= 39
1742 */
1743 static KRML_MUSTINLINE uint64_t
libcrux_sha3_portable_keccak_rotate_left_cb15(uint64_t x)1744 libcrux_sha3_portable_keccak_rotate_left_cb15(uint64_t x) {
1745 return x << (uint32_t)(int32_t)25 | x >> (uint32_t)(int32_t)39;
1746 }
1747
1748 /**
1749 A monomorphic instance of libcrux_sha3.portable_keccak._vxarq_u64
1750 with const generics
1751 - LEFT= 25
1752 - RIGHT= 39
1753 */
1754 static KRML_MUSTINLINE uint64_t
libcrux_sha3_portable_keccak__vxarq_u64_4215(uint64_t a,uint64_t b)1755 libcrux_sha3_portable_keccak__vxarq_u64_4215(uint64_t a, uint64_t b) {
1756 uint64_t ab = a ^ b;
1757 return libcrux_sha3_portable_keccak_rotate_left_cb15(ab);
1758 }
1759
1760 /**
1761 This function found in impl {(libcrux_sha3::traits::internal::KeccakItem<1:
1762 usize> for u64)}
1763 */
1764 /**
1765 A monomorphic instance of libcrux_sha3.portable_keccak.xor_and_rotate_5a
1766 with const generics
1767 - LEFT= 25
1768 - RIGHT= 39
1769 */
1770 static KRML_MUSTINLINE uint64_t
libcrux_sha3_portable_keccak_xor_and_rotate_5a_bb15(uint64_t a,uint64_t b)1771 libcrux_sha3_portable_keccak_xor_and_rotate_5a_bb15(uint64_t a, uint64_t b) {
1772 return libcrux_sha3_portable_keccak__vxarq_u64_4215(a, b);
1773 }
1774
1775 /**
1776 A monomorphic instance of libcrux_sha3.portable_keccak.rotate_left
1777 with const generics
1778 - LEFT= 21
1779 - RIGHT= 43
1780 */
1781 static KRML_MUSTINLINE uint64_t
libcrux_sha3_portable_keccak_rotate_left_cb16(uint64_t x)1782 libcrux_sha3_portable_keccak_rotate_left_cb16(uint64_t x) {
1783 return x << (uint32_t)(int32_t)21 | x >> (uint32_t)(int32_t)43;
1784 }
1785
1786 /**
1787 A monomorphic instance of libcrux_sha3.portable_keccak._vxarq_u64
1788 with const generics
1789 - LEFT= 21
1790 - RIGHT= 43
1791 */
1792 static KRML_MUSTINLINE uint64_t
libcrux_sha3_portable_keccak__vxarq_u64_4216(uint64_t a,uint64_t b)1793 libcrux_sha3_portable_keccak__vxarq_u64_4216(uint64_t a, uint64_t b) {
1794 uint64_t ab = a ^ b;
1795 return libcrux_sha3_portable_keccak_rotate_left_cb16(ab);
1796 }
1797
1798 /**
1799 This function found in impl {(libcrux_sha3::traits::internal::KeccakItem<1:
1800 usize> for u64)}
1801 */
1802 /**
1803 A monomorphic instance of libcrux_sha3.portable_keccak.xor_and_rotate_5a
1804 with const generics
1805 - LEFT= 21
1806 - RIGHT= 43
1807 */
1808 static KRML_MUSTINLINE uint64_t
libcrux_sha3_portable_keccak_xor_and_rotate_5a_bb16(uint64_t a,uint64_t b)1809 libcrux_sha3_portable_keccak_xor_and_rotate_5a_bb16(uint64_t a, uint64_t b) {
1810 return libcrux_sha3_portable_keccak__vxarq_u64_4216(a, b);
1811 }
1812
1813 /**
1814 A monomorphic instance of libcrux_sha3.portable_keccak.rotate_left
1815 with const generics
1816 - LEFT= 56
1817 - RIGHT= 8
1818 */
1819 static KRML_MUSTINLINE uint64_t
libcrux_sha3_portable_keccak_rotate_left_cb17(uint64_t x)1820 libcrux_sha3_portable_keccak_rotate_left_cb17(uint64_t x) {
1821 return x << (uint32_t)(int32_t)56 | x >> (uint32_t)(int32_t)8;
1822 }
1823
1824 /**
1825 A monomorphic instance of libcrux_sha3.portable_keccak._vxarq_u64
1826 with const generics
1827 - LEFT= 56
1828 - RIGHT= 8
1829 */
1830 static KRML_MUSTINLINE uint64_t
libcrux_sha3_portable_keccak__vxarq_u64_4217(uint64_t a,uint64_t b)1831 libcrux_sha3_portable_keccak__vxarq_u64_4217(uint64_t a, uint64_t b) {
1832 uint64_t ab = a ^ b;
1833 return libcrux_sha3_portable_keccak_rotate_left_cb17(ab);
1834 }
1835
1836 /**
1837 This function found in impl {(libcrux_sha3::traits::internal::KeccakItem<1:
1838 usize> for u64)}
1839 */
1840 /**
1841 A monomorphic instance of libcrux_sha3.portable_keccak.xor_and_rotate_5a
1842 with const generics
1843 - LEFT= 56
1844 - RIGHT= 8
1845 */
1846 static KRML_MUSTINLINE uint64_t
libcrux_sha3_portable_keccak_xor_and_rotate_5a_bb17(uint64_t a,uint64_t b)1847 libcrux_sha3_portable_keccak_xor_and_rotate_5a_bb17(uint64_t a, uint64_t b) {
1848 return libcrux_sha3_portable_keccak__vxarq_u64_4217(a, b);
1849 }
1850
1851 /**
1852 A monomorphic instance of libcrux_sha3.portable_keccak.rotate_left
1853 with const generics
1854 - LEFT= 27
1855 - RIGHT= 37
1856 */
1857 static KRML_MUSTINLINE uint64_t
libcrux_sha3_portable_keccak_rotate_left_cb18(uint64_t x)1858 libcrux_sha3_portable_keccak_rotate_left_cb18(uint64_t x) {
1859 return x << (uint32_t)(int32_t)27 | x >> (uint32_t)(int32_t)37;
1860 }
1861
1862 /**
1863 A monomorphic instance of libcrux_sha3.portable_keccak._vxarq_u64
1864 with const generics
1865 - LEFT= 27
1866 - RIGHT= 37
1867 */
1868 static KRML_MUSTINLINE uint64_t
libcrux_sha3_portable_keccak__vxarq_u64_4218(uint64_t a,uint64_t b)1869 libcrux_sha3_portable_keccak__vxarq_u64_4218(uint64_t a, uint64_t b) {
1870 uint64_t ab = a ^ b;
1871 return libcrux_sha3_portable_keccak_rotate_left_cb18(ab);
1872 }
1873
1874 /**
1875 This function found in impl {(libcrux_sha3::traits::internal::KeccakItem<1:
1876 usize> for u64)}
1877 */
1878 /**
1879 A monomorphic instance of libcrux_sha3.portable_keccak.xor_and_rotate_5a
1880 with const generics
1881 - LEFT= 27
1882 - RIGHT= 37
1883 */
1884 static KRML_MUSTINLINE uint64_t
libcrux_sha3_portable_keccak_xor_and_rotate_5a_bb18(uint64_t a,uint64_t b)1885 libcrux_sha3_portable_keccak_xor_and_rotate_5a_bb18(uint64_t a, uint64_t b) {
1886 return libcrux_sha3_portable_keccak__vxarq_u64_4218(a, b);
1887 }
1888
1889 /**
1890 A monomorphic instance of libcrux_sha3.portable_keccak.rotate_left
1891 with const generics
1892 - LEFT= 20
1893 - RIGHT= 44
1894 */
1895 static KRML_MUSTINLINE uint64_t
libcrux_sha3_portable_keccak_rotate_left_cb19(uint64_t x)1896 libcrux_sha3_portable_keccak_rotate_left_cb19(uint64_t x) {
1897 return x << (uint32_t)(int32_t)20 | x >> (uint32_t)(int32_t)44;
1898 }
1899
1900 /**
1901 A monomorphic instance of libcrux_sha3.portable_keccak._vxarq_u64
1902 with const generics
1903 - LEFT= 20
1904 - RIGHT= 44
1905 */
1906 static KRML_MUSTINLINE uint64_t
libcrux_sha3_portable_keccak__vxarq_u64_4219(uint64_t a,uint64_t b)1907 libcrux_sha3_portable_keccak__vxarq_u64_4219(uint64_t a, uint64_t b) {
1908 uint64_t ab = a ^ b;
1909 return libcrux_sha3_portable_keccak_rotate_left_cb19(ab);
1910 }
1911
1912 /**
1913 This function found in impl {(libcrux_sha3::traits::internal::KeccakItem<1:
1914 usize> for u64)}
1915 */
1916 /**
1917 A monomorphic instance of libcrux_sha3.portable_keccak.xor_and_rotate_5a
1918 with const generics
1919 - LEFT= 20
1920 - RIGHT= 44
1921 */
1922 static KRML_MUSTINLINE uint64_t
libcrux_sha3_portable_keccak_xor_and_rotate_5a_bb19(uint64_t a,uint64_t b)1923 libcrux_sha3_portable_keccak_xor_and_rotate_5a_bb19(uint64_t a, uint64_t b) {
1924 return libcrux_sha3_portable_keccak__vxarq_u64_4219(a, b);
1925 }
1926
1927 /**
1928 A monomorphic instance of libcrux_sha3.portable_keccak.rotate_left
1929 with const generics
1930 - LEFT= 39
1931 - RIGHT= 25
1932 */
1933 static KRML_MUSTINLINE uint64_t
libcrux_sha3_portable_keccak_rotate_left_cb20(uint64_t x)1934 libcrux_sha3_portable_keccak_rotate_left_cb20(uint64_t x) {
1935 return x << (uint32_t)(int32_t)39 | x >> (uint32_t)(int32_t)25;
1936 }
1937
1938 /**
1939 A monomorphic instance of libcrux_sha3.portable_keccak._vxarq_u64
1940 with const generics
1941 - LEFT= 39
1942 - RIGHT= 25
1943 */
1944 static KRML_MUSTINLINE uint64_t
libcrux_sha3_portable_keccak__vxarq_u64_4220(uint64_t a,uint64_t b)1945 libcrux_sha3_portable_keccak__vxarq_u64_4220(uint64_t a, uint64_t b) {
1946 uint64_t ab = a ^ b;
1947 return libcrux_sha3_portable_keccak_rotate_left_cb20(ab);
1948 }
1949
1950 /**
1951 This function found in impl {(libcrux_sha3::traits::internal::KeccakItem<1:
1952 usize> for u64)}
1953 */
1954 /**
1955 A monomorphic instance of libcrux_sha3.portable_keccak.xor_and_rotate_5a
1956 with const generics
1957 - LEFT= 39
1958 - RIGHT= 25
1959 */
1960 static KRML_MUSTINLINE uint64_t
libcrux_sha3_portable_keccak_xor_and_rotate_5a_bb20(uint64_t a,uint64_t b)1961 libcrux_sha3_portable_keccak_xor_and_rotate_5a_bb20(uint64_t a, uint64_t b) {
1962 return libcrux_sha3_portable_keccak__vxarq_u64_4220(a, b);
1963 }
1964
1965 /**
1966 A monomorphic instance of libcrux_sha3.portable_keccak.rotate_left
1967 with const generics
1968 - LEFT= 8
1969 - RIGHT= 56
1970 */
1971 static KRML_MUSTINLINE uint64_t
libcrux_sha3_portable_keccak_rotate_left_cb21(uint64_t x)1972 libcrux_sha3_portable_keccak_rotate_left_cb21(uint64_t x) {
1973 return x << (uint32_t)(int32_t)8 | x >> (uint32_t)(int32_t)56;
1974 }
1975
1976 /**
1977 A monomorphic instance of libcrux_sha3.portable_keccak._vxarq_u64
1978 with const generics
1979 - LEFT= 8
1980 - RIGHT= 56
1981 */
1982 static KRML_MUSTINLINE uint64_t
libcrux_sha3_portable_keccak__vxarq_u64_4221(uint64_t a,uint64_t b)1983 libcrux_sha3_portable_keccak__vxarq_u64_4221(uint64_t a, uint64_t b) {
1984 uint64_t ab = a ^ b;
1985 return libcrux_sha3_portable_keccak_rotate_left_cb21(ab);
1986 }
1987
1988 /**
1989 This function found in impl {(libcrux_sha3::traits::internal::KeccakItem<1:
1990 usize> for u64)}
1991 */
1992 /**
1993 A monomorphic instance of libcrux_sha3.portable_keccak.xor_and_rotate_5a
1994 with const generics
1995 - LEFT= 8
1996 - RIGHT= 56
1997 */
1998 static KRML_MUSTINLINE uint64_t
libcrux_sha3_portable_keccak_xor_and_rotate_5a_bb21(uint64_t a,uint64_t b)1999 libcrux_sha3_portable_keccak_xor_and_rotate_5a_bb21(uint64_t a, uint64_t b) {
2000 return libcrux_sha3_portable_keccak__vxarq_u64_4221(a, b);
2001 }
2002
2003 /**
2004 A monomorphic instance of libcrux_sha3.portable_keccak.rotate_left
2005 with const generics
2006 - LEFT= 14
2007 - RIGHT= 50
2008 */
2009 static KRML_MUSTINLINE uint64_t
libcrux_sha3_portable_keccak_rotate_left_cb22(uint64_t x)2010 libcrux_sha3_portable_keccak_rotate_left_cb22(uint64_t x) {
2011 return x << (uint32_t)(int32_t)14 | x >> (uint32_t)(int32_t)50;
2012 }
2013
2014 /**
2015 A monomorphic instance of libcrux_sha3.portable_keccak._vxarq_u64
2016 with const generics
2017 - LEFT= 14
2018 - RIGHT= 50
2019 */
2020 static KRML_MUSTINLINE uint64_t
libcrux_sha3_portable_keccak__vxarq_u64_4222(uint64_t a,uint64_t b)2021 libcrux_sha3_portable_keccak__vxarq_u64_4222(uint64_t a, uint64_t b) {
2022 uint64_t ab = a ^ b;
2023 return libcrux_sha3_portable_keccak_rotate_left_cb22(ab);
2024 }
2025
2026 /**
2027 This function found in impl {(libcrux_sha3::traits::internal::KeccakItem<1:
2028 usize> for u64)}
2029 */
2030 /**
2031 A monomorphic instance of libcrux_sha3.portable_keccak.xor_and_rotate_5a
2032 with const generics
2033 - LEFT= 14
2034 - RIGHT= 50
2035 */
2036 static KRML_MUSTINLINE uint64_t
libcrux_sha3_portable_keccak_xor_and_rotate_5a_bb22(uint64_t a,uint64_t b)2037 libcrux_sha3_portable_keccak_xor_and_rotate_5a_bb22(uint64_t a, uint64_t b) {
2038 return libcrux_sha3_portable_keccak__vxarq_u64_4222(a, b);
2039 }
2040
2041 /**
2042 A monomorphic instance of libcrux_sha3.generic_keccak.theta_rho
2043 with types uint64_t
2044 with const generics
2045 - N= 1
2046 */
libcrux_sha3_generic_keccak_theta_rho_16(libcrux_sha3_generic_keccak_KeccakState_48 * s)2047 static KRML_MUSTINLINE void libcrux_sha3_generic_keccak_theta_rho_16(
2048 libcrux_sha3_generic_keccak_KeccakState_48 *s) {
2049 uint64_t c[5U] = {
2050 libcrux_sha3_portable_keccak_xor5_5a(s->st[0U][0U], s->st[1U][0U],
2051 s->st[2U][0U], s->st[3U][0U],
2052 s->st[4U][0U]),
2053 libcrux_sha3_portable_keccak_xor5_5a(s->st[0U][1U], s->st[1U][1U],
2054 s->st[2U][1U], s->st[3U][1U],
2055 s->st[4U][1U]),
2056 libcrux_sha3_portable_keccak_xor5_5a(s->st[0U][2U], s->st[1U][2U],
2057 s->st[2U][2U], s->st[3U][2U],
2058 s->st[4U][2U]),
2059 libcrux_sha3_portable_keccak_xor5_5a(s->st[0U][3U], s->st[1U][3U],
2060 s->st[2U][3U], s->st[3U][3U],
2061 s->st[4U][3U]),
2062 libcrux_sha3_portable_keccak_xor5_5a(s->st[0U][4U], s->st[1U][4U],
2063 s->st[2U][4U], s->st[3U][4U],
2064 s->st[4U][4U])};
2065 uint64_t uu____0 = libcrux_sha3_portable_keccak_rotate_left1_and_xor_5a(
2066 c[((size_t)0U + (size_t)4U) % (size_t)5U],
2067 c[((size_t)0U + (size_t)1U) % (size_t)5U]);
2068 uint64_t uu____1 = libcrux_sha3_portable_keccak_rotate_left1_and_xor_5a(
2069 c[((size_t)1U + (size_t)4U) % (size_t)5U],
2070 c[((size_t)1U + (size_t)1U) % (size_t)5U]);
2071 uint64_t uu____2 = libcrux_sha3_portable_keccak_rotate_left1_and_xor_5a(
2072 c[((size_t)2U + (size_t)4U) % (size_t)5U],
2073 c[((size_t)2U + (size_t)1U) % (size_t)5U]);
2074 uint64_t uu____3 = libcrux_sha3_portable_keccak_rotate_left1_and_xor_5a(
2075 c[((size_t)3U + (size_t)4U) % (size_t)5U],
2076 c[((size_t)3U + (size_t)1U) % (size_t)5U]);
2077 uint64_t t[5U] = {uu____0, uu____1, uu____2, uu____3,
2078 libcrux_sha3_portable_keccak_rotate_left1_and_xor_5a(
2079 c[((size_t)4U + (size_t)4U) % (size_t)5U],
2080 c[((size_t)4U + (size_t)1U) % (size_t)5U])};
2081 s->st[0U][0U] = libcrux_sha3_portable_keccak_xor_5a(s->st[0U][0U], t[0U]);
2082 s->st[1U][0U] =
2083 libcrux_sha3_portable_keccak_xor_and_rotate_5a_bb(s->st[1U][0U], t[0U]);
2084 s->st[2U][0U] =
2085 libcrux_sha3_portable_keccak_xor_and_rotate_5a_bb0(s->st[2U][0U], t[0U]);
2086 s->st[3U][0U] =
2087 libcrux_sha3_portable_keccak_xor_and_rotate_5a_bb1(s->st[3U][0U], t[0U]);
2088 s->st[4U][0U] =
2089 libcrux_sha3_portable_keccak_xor_and_rotate_5a_bb2(s->st[4U][0U], t[0U]);
2090 s->st[0U][1U] =
2091 libcrux_sha3_portable_keccak_xor_and_rotate_5a_bb3(s->st[0U][1U], t[1U]);
2092 s->st[1U][1U] =
2093 libcrux_sha3_portable_keccak_xor_and_rotate_5a_bb4(s->st[1U][1U], t[1U]);
2094 s->st[2U][1U] =
2095 libcrux_sha3_portable_keccak_xor_and_rotate_5a_bb5(s->st[2U][1U], t[1U]);
2096 s->st[3U][1U] =
2097 libcrux_sha3_portable_keccak_xor_and_rotate_5a_bb6(s->st[3U][1U], t[1U]);
2098 s->st[4U][1U] =
2099 libcrux_sha3_portable_keccak_xor_and_rotate_5a_bb7(s->st[4U][1U], t[1U]);
2100 s->st[0U][2U] =
2101 libcrux_sha3_portable_keccak_xor_and_rotate_5a_bb8(s->st[0U][2U], t[2U]);
2102 s->st[1U][2U] =
2103 libcrux_sha3_portable_keccak_xor_and_rotate_5a_bb9(s->st[1U][2U], t[2U]);
2104 s->st[2U][2U] =
2105 libcrux_sha3_portable_keccak_xor_and_rotate_5a_bb10(s->st[2U][2U], t[2U]);
2106 s->st[3U][2U] =
2107 libcrux_sha3_portable_keccak_xor_and_rotate_5a_bb11(s->st[3U][2U], t[2U]);
2108 s->st[4U][2U] =
2109 libcrux_sha3_portable_keccak_xor_and_rotate_5a_bb12(s->st[4U][2U], t[2U]);
2110 s->st[0U][3U] =
2111 libcrux_sha3_portable_keccak_xor_and_rotate_5a_bb13(s->st[0U][3U], t[3U]);
2112 s->st[1U][3U] =
2113 libcrux_sha3_portable_keccak_xor_and_rotate_5a_bb14(s->st[1U][3U], t[3U]);
2114 s->st[2U][3U] =
2115 libcrux_sha3_portable_keccak_xor_and_rotate_5a_bb15(s->st[2U][3U], t[3U]);
2116 s->st[3U][3U] =
2117 libcrux_sha3_portable_keccak_xor_and_rotate_5a_bb16(s->st[3U][3U], t[3U]);
2118 s->st[4U][3U] =
2119 libcrux_sha3_portable_keccak_xor_and_rotate_5a_bb17(s->st[4U][3U], t[3U]);
2120 s->st[0U][4U] =
2121 libcrux_sha3_portable_keccak_xor_and_rotate_5a_bb18(s->st[0U][4U], t[4U]);
2122 s->st[1U][4U] =
2123 libcrux_sha3_portable_keccak_xor_and_rotate_5a_bb19(s->st[1U][4U], t[4U]);
2124 s->st[2U][4U] =
2125 libcrux_sha3_portable_keccak_xor_and_rotate_5a_bb20(s->st[2U][4U], t[4U]);
2126 s->st[3U][4U] =
2127 libcrux_sha3_portable_keccak_xor_and_rotate_5a_bb21(s->st[3U][4U], t[4U]);
2128 uint64_t uu____27 =
2129 libcrux_sha3_portable_keccak_xor_and_rotate_5a_bb22(s->st[4U][4U], t[4U]);
2130 s->st[4U][4U] = uu____27;
2131 }
2132
2133 /**
2134 A monomorphic instance of libcrux_sha3.generic_keccak.pi
2135 with types uint64_t
2136 with const generics
2137 - N= 1
2138 */
libcrux_sha3_generic_keccak_pi_1d(libcrux_sha3_generic_keccak_KeccakState_48 * s)2139 static KRML_MUSTINLINE void libcrux_sha3_generic_keccak_pi_1d(
2140 libcrux_sha3_generic_keccak_KeccakState_48 *s) {
2141 uint64_t old[5U][5U];
2142 memcpy(old, s->st, (size_t)5U * sizeof(uint64_t[5U]));
2143 s->st[0U][1U] = old[1U][1U];
2144 s->st[0U][2U] = old[2U][2U];
2145 s->st[0U][3U] = old[3U][3U];
2146 s->st[0U][4U] = old[4U][4U];
2147 s->st[1U][0U] = old[0U][3U];
2148 s->st[1U][1U] = old[1U][4U];
2149 s->st[1U][2U] = old[2U][0U];
2150 s->st[1U][3U] = old[3U][1U];
2151 s->st[1U][4U] = old[4U][2U];
2152 s->st[2U][0U] = old[0U][1U];
2153 s->st[2U][1U] = old[1U][2U];
2154 s->st[2U][2U] = old[2U][3U];
2155 s->st[2U][3U] = old[3U][4U];
2156 s->st[2U][4U] = old[4U][0U];
2157 s->st[3U][0U] = old[0U][4U];
2158 s->st[3U][1U] = old[1U][0U];
2159 s->st[3U][2U] = old[2U][1U];
2160 s->st[3U][3U] = old[3U][2U];
2161 s->st[3U][4U] = old[4U][3U];
2162 s->st[4U][0U] = old[0U][2U];
2163 s->st[4U][1U] = old[1U][3U];
2164 s->st[4U][2U] = old[2U][4U];
2165 s->st[4U][3U] = old[3U][0U];
2166 s->st[4U][4U] = old[4U][1U];
2167 }
2168
2169 /**
2170 A monomorphic instance of libcrux_sha3.generic_keccak.chi
2171 with types uint64_t
2172 with const generics
2173 - N= 1
2174 */
libcrux_sha3_generic_keccak_chi_12(libcrux_sha3_generic_keccak_KeccakState_48 * s)2175 static KRML_MUSTINLINE void libcrux_sha3_generic_keccak_chi_12(
2176 libcrux_sha3_generic_keccak_KeccakState_48 *s) {
2177 uint64_t old[5U][5U];
2178 memcpy(old, s->st, (size_t)5U * sizeof(uint64_t[5U]));
2179 for (size_t i0 = (size_t)0U; i0 < (size_t)5U; i0++) {
2180 size_t i1 = i0;
2181 for (size_t i = (size_t)0U; i < (size_t)5U; i++) {
2182 size_t j = i;
2183 s->st[i1][j] = libcrux_sha3_portable_keccak_and_not_xor_5a(
2184 s->st[i1][j], old[i1][(j + (size_t)2U) % (size_t)5U],
2185 old[i1][(j + (size_t)1U) % (size_t)5U]);
2186 }
2187 }
2188 }
2189
2190 /**
2191 A monomorphic instance of libcrux_sha3.generic_keccak.iota
2192 with types uint64_t
2193 with const generics
2194 - N= 1
2195 */
libcrux_sha3_generic_keccak_iota_62(libcrux_sha3_generic_keccak_KeccakState_48 * s,size_t i)2196 static KRML_MUSTINLINE void libcrux_sha3_generic_keccak_iota_62(
2197 libcrux_sha3_generic_keccak_KeccakState_48 *s, size_t i) {
2198 s->st[0U][0U] = libcrux_sha3_portable_keccak_xor_constant_5a(
2199 s->st[0U][0U], libcrux_sha3_generic_keccak_ROUNDCONSTANTS[i]);
2200 }
2201
2202 /**
2203 A monomorphic instance of libcrux_sha3.generic_keccak.keccakf1600
2204 with types uint64_t
2205 with const generics
2206 - N= 1
2207 */
libcrux_sha3_generic_keccak_keccakf1600_21(libcrux_sha3_generic_keccak_KeccakState_48 * s)2208 static KRML_MUSTINLINE void libcrux_sha3_generic_keccak_keccakf1600_21(
2209 libcrux_sha3_generic_keccak_KeccakState_48 *s) {
2210 for (size_t i = (size_t)0U; i < (size_t)24U; i++) {
2211 size_t i0 = i;
2212 libcrux_sha3_generic_keccak_theta_rho_16(s);
2213 libcrux_sha3_generic_keccak_pi_1d(s);
2214 libcrux_sha3_generic_keccak_chi_12(s);
2215 libcrux_sha3_generic_keccak_iota_62(s, i0);
2216 }
2217 }
2218
2219 /**
2220 A monomorphic instance of libcrux_sha3.generic_keccak.absorb_block
2221 with types uint64_t
2222 with const generics
2223 - N= 1
2224 - RATE= 72
2225 */
libcrux_sha3_generic_keccak_absorb_block_df(libcrux_sha3_generic_keccak_KeccakState_48 * s,Eurydice_slice blocks[1U])2226 static KRML_MUSTINLINE void libcrux_sha3_generic_keccak_absorb_block_df(
2227 libcrux_sha3_generic_keccak_KeccakState_48 *s, Eurydice_slice blocks[1U]) {
2228 uint64_t(*uu____0)[5U] = s->st;
2229 Eurydice_slice uu____1[1U];
2230 memcpy(uu____1, blocks, (size_t)1U * sizeof(Eurydice_slice));
2231 libcrux_sha3_portable_keccak_load_block_5a_b8(uu____0, uu____1);
2232 libcrux_sha3_generic_keccak_keccakf1600_21(s);
2233 }
2234
2235 /**
2236 A monomorphic instance of libcrux_sha3.portable_keccak.load_block_full
2237 with const generics
2238 - RATE= 72
2239 */
libcrux_sha3_portable_keccak_load_block_full_df(uint64_t (* s)[5U],uint8_t blocks[1U][200U])2240 static KRML_MUSTINLINE void libcrux_sha3_portable_keccak_load_block_full_df(
2241 uint64_t (*s)[5U], uint8_t blocks[1U][200U]) {
2242 Eurydice_slice buf[1U] = {
2243 Eurydice_array_to_slice((size_t)200U, blocks[0U], uint8_t)};
2244 libcrux_sha3_portable_keccak_load_block_2c(s, buf);
2245 }
2246
2247 /**
2248 This function found in impl {(libcrux_sha3::traits::internal::KeccakItem<1:
2249 usize> for u64)}
2250 */
2251 /**
2252 A monomorphic instance of libcrux_sha3.portable_keccak.load_block_full_5a
2253 with const generics
2254 - RATE= 72
2255 */
libcrux_sha3_portable_keccak_load_block_full_5a_d2(uint64_t (* a)[5U],uint8_t b[1U][200U])2256 static KRML_MUSTINLINE void libcrux_sha3_portable_keccak_load_block_full_5a_d2(
2257 uint64_t (*a)[5U], uint8_t b[1U][200U]) {
2258 uint64_t(*uu____0)[5U] = a;
2259 /* Passing arrays by value in Rust generates a copy in C */
2260 uint8_t copy_of_b[1U][200U];
2261 memcpy(copy_of_b, b, (size_t)1U * sizeof(uint8_t[200U]));
2262 libcrux_sha3_portable_keccak_load_block_full_df(uu____0, copy_of_b);
2263 }
2264
2265 /**
2266 A monomorphic instance of libcrux_sha3.generic_keccak.absorb_final
2267 with types uint64_t
2268 with const generics
2269 - N= 1
2270 - RATE= 72
2271 - DELIM= 6
2272 */
libcrux_sha3_generic_keccak_absorb_final_c7(libcrux_sha3_generic_keccak_KeccakState_48 * s,Eurydice_slice last[1U])2273 static KRML_MUSTINLINE void libcrux_sha3_generic_keccak_absorb_final_c7(
2274 libcrux_sha3_generic_keccak_KeccakState_48 *s, Eurydice_slice last[1U]) {
2275 size_t last_len = Eurydice_slice_len(last[0U], uint8_t);
2276 uint8_t blocks[1U][200U] = {{0U}};
2277 for (size_t i = (size_t)0U; i < (size_t)1U; i++) {
2278 size_t i0 = i;
2279 if (last_len > (size_t)0U) {
2280 Eurydice_slice uu____0 = Eurydice_array_to_subslice2(
2281 blocks[i0], (size_t)0U, last_len, uint8_t);
2282 Eurydice_slice_copy(uu____0, last[i0], uint8_t);
2283 }
2284 blocks[i0][last_len] = 6U;
2285 size_t uu____1 = i0;
2286 size_t uu____2 = (size_t)72U - (size_t)1U;
2287 blocks[uu____1][uu____2] = (uint32_t)blocks[uu____1][uu____2] | 128U;
2288 }
2289 uint64_t(*uu____3)[5U] = s->st;
2290 uint8_t uu____4[1U][200U];
2291 memcpy(uu____4, blocks, (size_t)1U * sizeof(uint8_t[200U]));
2292 libcrux_sha3_portable_keccak_load_block_full_5a_d2(uu____3, uu____4);
2293 libcrux_sha3_generic_keccak_keccakf1600_21(s);
2294 }
2295
2296 /**
2297 A monomorphic instance of libcrux_sha3.portable_keccak.store_block
2298 with const generics
2299 - RATE= 72
2300 */
libcrux_sha3_portable_keccak_store_block_58(uint64_t (* s)[5U],Eurydice_slice out[1U])2301 static KRML_MUSTINLINE void libcrux_sha3_portable_keccak_store_block_58(
2302 uint64_t (*s)[5U], Eurydice_slice out[1U]) {
2303 for (size_t i = (size_t)0U; i < (size_t)72U / (size_t)8U; i++) {
2304 size_t i0 = i;
2305 Eurydice_slice uu____0 = Eurydice_slice_subslice2(
2306 out[0U], (size_t)8U * i0, (size_t)8U * i0 + (size_t)8U, uint8_t);
2307 uint8_t ret[8U];
2308 core_num__u64_9__to_le_bytes(s[i0 / (size_t)5U][i0 % (size_t)5U], ret);
2309 Eurydice_slice_copy(
2310 uu____0, Eurydice_array_to_slice((size_t)8U, ret, uint8_t), uint8_t);
2311 }
2312 }
2313
2314 /**
2315 A monomorphic instance of libcrux_sha3.portable_keccak.store_block_full
2316 with const generics
2317 - RATE= 72
2318 */
libcrux_sha3_portable_keccak_store_block_full_2d(uint64_t (* s)[5U],uint8_t ret[1U][200U])2319 static KRML_MUSTINLINE void libcrux_sha3_portable_keccak_store_block_full_2d(
2320 uint64_t (*s)[5U], uint8_t ret[1U][200U]) {
2321 uint8_t out[200U] = {0U};
2322 Eurydice_slice buf[1U] = {
2323 Eurydice_array_to_slice((size_t)200U, out, uint8_t)};
2324 libcrux_sha3_portable_keccak_store_block_58(s, buf);
2325 /* Passing arrays by value in Rust generates a copy in C */
2326 uint8_t copy_of_out[200U];
2327 memcpy(copy_of_out, out, (size_t)200U * sizeof(uint8_t));
2328 memcpy(ret[0U], copy_of_out, (size_t)200U * sizeof(uint8_t));
2329 }
2330
2331 /**
2332 This function found in impl {(libcrux_sha3::traits::internal::KeccakItem<1:
2333 usize> for u64)}
2334 */
2335 /**
2336 A monomorphic instance of libcrux_sha3.portable_keccak.store_block_full_5a
2337 with const generics
2338 - RATE= 72
2339 */
libcrux_sha3_portable_keccak_store_block_full_5a_29(uint64_t (* a)[5U],uint8_t ret[1U][200U])2340 static KRML_MUSTINLINE void libcrux_sha3_portable_keccak_store_block_full_5a_29(
2341 uint64_t (*a)[5U], uint8_t ret[1U][200U]) {
2342 libcrux_sha3_portable_keccak_store_block_full_2d(a, ret);
2343 }
2344
2345 /**
2346 A monomorphic instance of libcrux_sha3.generic_keccak.squeeze_first_and_last
2347 with types uint64_t
2348 with const generics
2349 - N= 1
2350 - RATE= 72
2351 */
2352 static KRML_MUSTINLINE void
libcrux_sha3_generic_keccak_squeeze_first_and_last_c5(libcrux_sha3_generic_keccak_KeccakState_48 * s,Eurydice_slice out[1U])2353 libcrux_sha3_generic_keccak_squeeze_first_and_last_c5(
2354 libcrux_sha3_generic_keccak_KeccakState_48 *s, Eurydice_slice out[1U]) {
2355 uint8_t b[1U][200U];
2356 libcrux_sha3_portable_keccak_store_block_full_5a_29(s->st, b);
2357 for (size_t i = (size_t)0U; i < (size_t)1U; i++) {
2358 size_t i0 = i;
2359 Eurydice_slice uu____0 = out[i0];
2360 uint8_t *uu____1 = b[i0];
2361 core_ops_range_Range_b3 lit;
2362 lit.start = (size_t)0U;
2363 lit.end = Eurydice_slice_len(out[i0], uint8_t);
2364 Eurydice_slice_copy(
2365 uu____0,
2366 Eurydice_array_to_subslice((size_t)200U, uu____1, lit, uint8_t,
2367 core_ops_range_Range_b3),
2368 uint8_t);
2369 }
2370 }
2371
2372 /**
2373 This function found in impl {(libcrux_sha3::traits::internal::KeccakItem<1:
2374 usize> for u64)}
2375 */
2376 /**
2377 A monomorphic instance of libcrux_sha3.portable_keccak.store_block_5a
2378 with const generics
2379 - RATE= 72
2380 */
libcrux_sha3_portable_keccak_store_block_5a_59(uint64_t (* a)[5U],Eurydice_slice b[1U])2381 static KRML_MUSTINLINE void libcrux_sha3_portable_keccak_store_block_5a_59(
2382 uint64_t (*a)[5U], Eurydice_slice b[1U]) {
2383 libcrux_sha3_portable_keccak_store_block_58(a, b);
2384 }
2385
2386 /**
2387 A monomorphic instance of libcrux_sha3.generic_keccak.squeeze_first_block
2388 with types uint64_t
2389 with const generics
2390 - N= 1
2391 - RATE= 72
2392 */
libcrux_sha3_generic_keccak_squeeze_first_block_84(libcrux_sha3_generic_keccak_KeccakState_48 * s,Eurydice_slice out[1U])2393 static KRML_MUSTINLINE void libcrux_sha3_generic_keccak_squeeze_first_block_84(
2394 libcrux_sha3_generic_keccak_KeccakState_48 *s, Eurydice_slice out[1U]) {
2395 libcrux_sha3_portable_keccak_store_block_5a_59(s->st, out);
2396 }
2397
2398 /**
2399 A monomorphic instance of libcrux_sha3.generic_keccak.squeeze_next_block
2400 with types uint64_t
2401 with const generics
2402 - N= 1
2403 - RATE= 72
2404 */
libcrux_sha3_generic_keccak_squeeze_next_block_fc(libcrux_sha3_generic_keccak_KeccakState_48 * s,Eurydice_slice out[1U])2405 static KRML_MUSTINLINE void libcrux_sha3_generic_keccak_squeeze_next_block_fc(
2406 libcrux_sha3_generic_keccak_KeccakState_48 *s, Eurydice_slice out[1U]) {
2407 libcrux_sha3_generic_keccak_keccakf1600_21(s);
2408 libcrux_sha3_portable_keccak_store_block_5a_59(s->st, out);
2409 }
2410
2411 /**
2412 A monomorphic instance of libcrux_sha3.generic_keccak.squeeze_last
2413 with types uint64_t
2414 with const generics
2415 - N= 1
2416 - RATE= 72
2417 */
libcrux_sha3_generic_keccak_squeeze_last_cf(libcrux_sha3_generic_keccak_KeccakState_48 s,Eurydice_slice out[1U])2418 static KRML_MUSTINLINE void libcrux_sha3_generic_keccak_squeeze_last_cf(
2419 libcrux_sha3_generic_keccak_KeccakState_48 s, Eurydice_slice out[1U]) {
2420 libcrux_sha3_generic_keccak_keccakf1600_21(&s);
2421 uint8_t b[1U][200U];
2422 libcrux_sha3_portable_keccak_store_block_full_5a_29(s.st, b);
2423 for (size_t i = (size_t)0U; i < (size_t)1U; i++) {
2424 size_t i0 = i;
2425 Eurydice_slice uu____0 = out[i0];
2426 uint8_t *uu____1 = b[i0];
2427 core_ops_range_Range_b3 lit;
2428 lit.start = (size_t)0U;
2429 lit.end = Eurydice_slice_len(out[i0], uint8_t);
2430 Eurydice_slice_copy(
2431 uu____0,
2432 Eurydice_array_to_subslice((size_t)200U, uu____1, lit, uint8_t,
2433 core_ops_range_Range_b3),
2434 uint8_t);
2435 }
2436 }
2437
2438 /**
2439 A monomorphic instance of libcrux_sha3.generic_keccak.keccak
2440 with types uint64_t
2441 with const generics
2442 - N= 1
2443 - RATE= 72
2444 - DELIM= 6
2445 */
libcrux_sha3_generic_keccak_keccak_e9(Eurydice_slice data[1U],Eurydice_slice out[1U])2446 static KRML_MUSTINLINE void libcrux_sha3_generic_keccak_keccak_e9(
2447 Eurydice_slice data[1U], Eurydice_slice out[1U]) {
2448 libcrux_sha3_generic_keccak_KeccakState_48 s =
2449 libcrux_sha3_generic_keccak_new_1e_f4();
2450 for (size_t i = (size_t)0U;
2451 i < Eurydice_slice_len(data[0U], uint8_t) / (size_t)72U; i++) {
2452 size_t i0 = i;
2453 libcrux_sha3_generic_keccak_KeccakState_48 *uu____0 = &s;
2454 /* Passing arrays by value in Rust generates a copy in C */
2455 Eurydice_slice copy_of_data[1U];
2456 memcpy(copy_of_data, data, (size_t)1U * sizeof(Eurydice_slice));
2457 Eurydice_slice ret[1U];
2458 libcrux_sha3_portable_keccak_slice_n_5a(copy_of_data, i0 * (size_t)72U,
2459 (size_t)72U, ret);
2460 libcrux_sha3_generic_keccak_absorb_block_df(uu____0, ret);
2461 }
2462 size_t rem = Eurydice_slice_len(data[0U], uint8_t) % (size_t)72U;
2463 libcrux_sha3_generic_keccak_KeccakState_48 *uu____2 = &s;
2464 /* Passing arrays by value in Rust generates a copy in C */
2465 Eurydice_slice copy_of_data[1U];
2466 memcpy(copy_of_data, data, (size_t)1U * sizeof(Eurydice_slice));
2467 Eurydice_slice ret[1U];
2468 libcrux_sha3_portable_keccak_slice_n_5a(
2469 copy_of_data, Eurydice_slice_len(data[0U], uint8_t) - rem, rem, ret);
2470 libcrux_sha3_generic_keccak_absorb_final_c7(uu____2, ret);
2471 size_t outlen = Eurydice_slice_len(out[0U], uint8_t);
2472 size_t blocks = outlen / (size_t)72U;
2473 size_t last = outlen - outlen % (size_t)72U;
2474 if (blocks == (size_t)0U) {
2475 libcrux_sha3_generic_keccak_squeeze_first_and_last_c5(&s, out);
2476 } else {
2477 Eurydice_slice_uint8_t_1size_t__x2 uu____4 =
2478 libcrux_sha3_portable_keccak_split_at_mut_n_5a(out, (size_t)72U);
2479 Eurydice_slice o0[1U];
2480 memcpy(o0, uu____4.fst, (size_t)1U * sizeof(Eurydice_slice));
2481 Eurydice_slice o1[1U];
2482 memcpy(o1, uu____4.snd, (size_t)1U * sizeof(Eurydice_slice));
2483 libcrux_sha3_generic_keccak_squeeze_first_block_84(&s, o0);
2484 core_ops_range_Range_b3 iter =
2485 core_iter_traits_collect___core__iter__traits__collect__IntoIterator_for_I__1__into_iter(
2486 (CLITERAL(core_ops_range_Range_b3){.start = (size_t)1U,
2487 .end = blocks}),
2488 core_ops_range_Range_b3, core_ops_range_Range_b3);
2489 while (true) {
2490 if (core_iter_range___core__iter__traits__iterator__Iterator_for_core__ops__range__Range_A___6__next(
2491 &iter, size_t, Option_b3)
2492 .tag == None) {
2493 break;
2494 } else {
2495 Eurydice_slice_uint8_t_1size_t__x2 uu____5 =
2496 libcrux_sha3_portable_keccak_split_at_mut_n_5a(o1, (size_t)72U);
2497 Eurydice_slice o[1U];
2498 memcpy(o, uu____5.fst, (size_t)1U * sizeof(Eurydice_slice));
2499 Eurydice_slice orest[1U];
2500 memcpy(orest, uu____5.snd, (size_t)1U * sizeof(Eurydice_slice));
2501 libcrux_sha3_generic_keccak_squeeze_next_block_fc(&s, o);
2502 memcpy(o1, orest, (size_t)1U * sizeof(Eurydice_slice));
2503 }
2504 }
2505 if (last < outlen) {
2506 libcrux_sha3_generic_keccak_squeeze_last_cf(s, o1);
2507 }
2508 }
2509 }
2510
2511 /**
2512 A monomorphic instance of libcrux_sha3.portable.keccakx1
2513 with const generics
2514 - RATE= 72
2515 - DELIM= 6
2516 */
libcrux_sha3_portable_keccakx1_ce(Eurydice_slice data[1U],Eurydice_slice out[1U])2517 static KRML_MUSTINLINE void libcrux_sha3_portable_keccakx1_ce(
2518 Eurydice_slice data[1U], Eurydice_slice out[1U]) {
2519 /* Passing arrays by value in Rust generates a copy in C */
2520 Eurydice_slice copy_of_data[1U];
2521 memcpy(copy_of_data, data, (size_t)1U * sizeof(Eurydice_slice));
2522 libcrux_sha3_generic_keccak_keccak_e9(copy_of_data, out);
2523 }
2524
2525 /**
2526 A portable SHA3 512 implementation.
2527 */
libcrux_sha3_portable_sha512(Eurydice_slice digest,Eurydice_slice data)2528 static KRML_MUSTINLINE void libcrux_sha3_portable_sha512(Eurydice_slice digest,
2529 Eurydice_slice data) {
2530 Eurydice_slice buf0[1U] = {data};
2531 Eurydice_slice buf[1U] = {digest};
2532 libcrux_sha3_portable_keccakx1_ce(buf0, buf);
2533 }
2534
2535 /**
2536 A monomorphic instance of libcrux_sha3.portable_keccak.load_block
2537 with const generics
2538 - RATE= 136
2539 */
libcrux_sha3_portable_keccak_load_block_2c0(uint64_t (* s)[5U],Eurydice_slice blocks[1U])2540 static KRML_MUSTINLINE void libcrux_sha3_portable_keccak_load_block_2c0(
2541 uint64_t (*s)[5U], Eurydice_slice blocks[1U]) {
2542 for (size_t i = (size_t)0U; i < (size_t)136U / (size_t)8U; i++) {
2543 size_t i0 = i;
2544 uint8_t uu____0[8U];
2545 Result_56 dst;
2546 Eurydice_slice_to_array2(
2547 &dst,
2548 Eurydice_slice_subslice2(blocks[0U], (size_t)8U * i0,
2549 (size_t)8U * i0 + (size_t)8U, uint8_t),
2550 Eurydice_slice, uint8_t[8U]);
2551 unwrap_41_ac(dst, uu____0);
2552 size_t uu____1 = i0 / (size_t)5U;
2553 size_t uu____2 = i0 % (size_t)5U;
2554 s[uu____1][uu____2] =
2555 s[uu____1][uu____2] ^ core_num__u64_9__from_le_bytes(uu____0);
2556 }
2557 }
2558
2559 /**
2560 This function found in impl {(libcrux_sha3::traits::internal::KeccakItem<1:
2561 usize> for u64)}
2562 */
2563 /**
2564 A monomorphic instance of libcrux_sha3.portable_keccak.load_block_5a
2565 with const generics
2566 - RATE= 136
2567 */
libcrux_sha3_portable_keccak_load_block_5a_b80(uint64_t (* a)[5U],Eurydice_slice b[1U])2568 static KRML_MUSTINLINE void libcrux_sha3_portable_keccak_load_block_5a_b80(
2569 uint64_t (*a)[5U], Eurydice_slice b[1U]) {
2570 uint64_t(*uu____0)[5U] = a;
2571 /* Passing arrays by value in Rust generates a copy in C */
2572 Eurydice_slice copy_of_b[1U];
2573 memcpy(copy_of_b, b, (size_t)1U * sizeof(Eurydice_slice));
2574 libcrux_sha3_portable_keccak_load_block_2c0(uu____0, copy_of_b);
2575 }
2576
2577 /**
2578 A monomorphic instance of libcrux_sha3.generic_keccak.absorb_block
2579 with types uint64_t
2580 with const generics
2581 - N= 1
2582 - RATE= 136
2583 */
libcrux_sha3_generic_keccak_absorb_block_df0(libcrux_sha3_generic_keccak_KeccakState_48 * s,Eurydice_slice blocks[1U])2584 static KRML_MUSTINLINE void libcrux_sha3_generic_keccak_absorb_block_df0(
2585 libcrux_sha3_generic_keccak_KeccakState_48 *s, Eurydice_slice blocks[1U]) {
2586 uint64_t(*uu____0)[5U] = s->st;
2587 Eurydice_slice uu____1[1U];
2588 memcpy(uu____1, blocks, (size_t)1U * sizeof(Eurydice_slice));
2589 libcrux_sha3_portable_keccak_load_block_5a_b80(uu____0, uu____1);
2590 libcrux_sha3_generic_keccak_keccakf1600_21(s);
2591 }
2592
2593 /**
2594 A monomorphic instance of libcrux_sha3.portable_keccak.load_block_full
2595 with const generics
2596 - RATE= 136
2597 */
libcrux_sha3_portable_keccak_load_block_full_df0(uint64_t (* s)[5U],uint8_t blocks[1U][200U])2598 static KRML_MUSTINLINE void libcrux_sha3_portable_keccak_load_block_full_df0(
2599 uint64_t (*s)[5U], uint8_t blocks[1U][200U]) {
2600 Eurydice_slice buf[1U] = {
2601 Eurydice_array_to_slice((size_t)200U, blocks[0U], uint8_t)};
2602 libcrux_sha3_portable_keccak_load_block_2c0(s, buf);
2603 }
2604
2605 /**
2606 This function found in impl {(libcrux_sha3::traits::internal::KeccakItem<1:
2607 usize> for u64)}
2608 */
2609 /**
2610 A monomorphic instance of libcrux_sha3.portable_keccak.load_block_full_5a
2611 with const generics
2612 - RATE= 136
2613 */
libcrux_sha3_portable_keccak_load_block_full_5a_d20(uint64_t (* a)[5U],uint8_t b[1U][200U])2614 static KRML_MUSTINLINE void libcrux_sha3_portable_keccak_load_block_full_5a_d20(
2615 uint64_t (*a)[5U], uint8_t b[1U][200U]) {
2616 uint64_t(*uu____0)[5U] = a;
2617 /* Passing arrays by value in Rust generates a copy in C */
2618 uint8_t copy_of_b[1U][200U];
2619 memcpy(copy_of_b, b, (size_t)1U * sizeof(uint8_t[200U]));
2620 libcrux_sha3_portable_keccak_load_block_full_df0(uu____0, copy_of_b);
2621 }
2622
2623 /**
2624 A monomorphic instance of libcrux_sha3.generic_keccak.absorb_final
2625 with types uint64_t
2626 with const generics
2627 - N= 1
2628 - RATE= 136
2629 - DELIM= 6
2630 */
libcrux_sha3_generic_keccak_absorb_final_c70(libcrux_sha3_generic_keccak_KeccakState_48 * s,Eurydice_slice last[1U])2631 static KRML_MUSTINLINE void libcrux_sha3_generic_keccak_absorb_final_c70(
2632 libcrux_sha3_generic_keccak_KeccakState_48 *s, Eurydice_slice last[1U]) {
2633 size_t last_len = Eurydice_slice_len(last[0U], uint8_t);
2634 uint8_t blocks[1U][200U] = {{0U}};
2635 for (size_t i = (size_t)0U; i < (size_t)1U; i++) {
2636 size_t i0 = i;
2637 if (last_len > (size_t)0U) {
2638 Eurydice_slice uu____0 = Eurydice_array_to_subslice2(
2639 blocks[i0], (size_t)0U, last_len, uint8_t);
2640 Eurydice_slice_copy(uu____0, last[i0], uint8_t);
2641 }
2642 blocks[i0][last_len] = 6U;
2643 size_t uu____1 = i0;
2644 size_t uu____2 = (size_t)136U - (size_t)1U;
2645 blocks[uu____1][uu____2] = (uint32_t)blocks[uu____1][uu____2] | 128U;
2646 }
2647 uint64_t(*uu____3)[5U] = s->st;
2648 uint8_t uu____4[1U][200U];
2649 memcpy(uu____4, blocks, (size_t)1U * sizeof(uint8_t[200U]));
2650 libcrux_sha3_portable_keccak_load_block_full_5a_d20(uu____3, uu____4);
2651 libcrux_sha3_generic_keccak_keccakf1600_21(s);
2652 }
2653
2654 /**
2655 A monomorphic instance of libcrux_sha3.portable_keccak.store_block
2656 with const generics
2657 - RATE= 136
2658 */
libcrux_sha3_portable_keccak_store_block_580(uint64_t (* s)[5U],Eurydice_slice out[1U])2659 static KRML_MUSTINLINE void libcrux_sha3_portable_keccak_store_block_580(
2660 uint64_t (*s)[5U], Eurydice_slice out[1U]) {
2661 for (size_t i = (size_t)0U; i < (size_t)136U / (size_t)8U; i++) {
2662 size_t i0 = i;
2663 Eurydice_slice uu____0 = Eurydice_slice_subslice2(
2664 out[0U], (size_t)8U * i0, (size_t)8U * i0 + (size_t)8U, uint8_t);
2665 uint8_t ret[8U];
2666 core_num__u64_9__to_le_bytes(s[i0 / (size_t)5U][i0 % (size_t)5U], ret);
2667 Eurydice_slice_copy(
2668 uu____0, Eurydice_array_to_slice((size_t)8U, ret, uint8_t), uint8_t);
2669 }
2670 }
2671
2672 /**
2673 A monomorphic instance of libcrux_sha3.portable_keccak.store_block_full
2674 with const generics
2675 - RATE= 136
2676 */
libcrux_sha3_portable_keccak_store_block_full_2d0(uint64_t (* s)[5U],uint8_t ret[1U][200U])2677 static KRML_MUSTINLINE void libcrux_sha3_portable_keccak_store_block_full_2d0(
2678 uint64_t (*s)[5U], uint8_t ret[1U][200U]) {
2679 uint8_t out[200U] = {0U};
2680 Eurydice_slice buf[1U] = {
2681 Eurydice_array_to_slice((size_t)200U, out, uint8_t)};
2682 libcrux_sha3_portable_keccak_store_block_580(s, buf);
2683 /* Passing arrays by value in Rust generates a copy in C */
2684 uint8_t copy_of_out[200U];
2685 memcpy(copy_of_out, out, (size_t)200U * sizeof(uint8_t));
2686 memcpy(ret[0U], copy_of_out, (size_t)200U * sizeof(uint8_t));
2687 }
2688
2689 /**
2690 This function found in impl {(libcrux_sha3::traits::internal::KeccakItem<1:
2691 usize> for u64)}
2692 */
2693 /**
2694 A monomorphic instance of libcrux_sha3.portable_keccak.store_block_full_5a
2695 with const generics
2696 - RATE= 136
2697 */
2698 static KRML_MUSTINLINE void
libcrux_sha3_portable_keccak_store_block_full_5a_290(uint64_t (* a)[5U],uint8_t ret[1U][200U])2699 libcrux_sha3_portable_keccak_store_block_full_5a_290(uint64_t (*a)[5U],
2700 uint8_t ret[1U][200U]) {
2701 libcrux_sha3_portable_keccak_store_block_full_2d0(a, ret);
2702 }
2703
2704 /**
2705 A monomorphic instance of libcrux_sha3.generic_keccak.squeeze_first_and_last
2706 with types uint64_t
2707 with const generics
2708 - N= 1
2709 - RATE= 136
2710 */
2711 static KRML_MUSTINLINE void
libcrux_sha3_generic_keccak_squeeze_first_and_last_c50(libcrux_sha3_generic_keccak_KeccakState_48 * s,Eurydice_slice out[1U])2712 libcrux_sha3_generic_keccak_squeeze_first_and_last_c50(
2713 libcrux_sha3_generic_keccak_KeccakState_48 *s, Eurydice_slice out[1U]) {
2714 uint8_t b[1U][200U];
2715 libcrux_sha3_portable_keccak_store_block_full_5a_290(s->st, b);
2716 for (size_t i = (size_t)0U; i < (size_t)1U; i++) {
2717 size_t i0 = i;
2718 Eurydice_slice uu____0 = out[i0];
2719 uint8_t *uu____1 = b[i0];
2720 core_ops_range_Range_b3 lit;
2721 lit.start = (size_t)0U;
2722 lit.end = Eurydice_slice_len(out[i0], uint8_t);
2723 Eurydice_slice_copy(
2724 uu____0,
2725 Eurydice_array_to_subslice((size_t)200U, uu____1, lit, uint8_t,
2726 core_ops_range_Range_b3),
2727 uint8_t);
2728 }
2729 }
2730
2731 /**
2732 This function found in impl {(libcrux_sha3::traits::internal::KeccakItem<1:
2733 usize> for u64)}
2734 */
2735 /**
2736 A monomorphic instance of libcrux_sha3.portable_keccak.store_block_5a
2737 with const generics
2738 - RATE= 136
2739 */
libcrux_sha3_portable_keccak_store_block_5a_590(uint64_t (* a)[5U],Eurydice_slice b[1U])2740 static KRML_MUSTINLINE void libcrux_sha3_portable_keccak_store_block_5a_590(
2741 uint64_t (*a)[5U], Eurydice_slice b[1U]) {
2742 libcrux_sha3_portable_keccak_store_block_580(a, b);
2743 }
2744
2745 /**
2746 A monomorphic instance of libcrux_sha3.generic_keccak.squeeze_first_block
2747 with types uint64_t
2748 with const generics
2749 - N= 1
2750 - RATE= 136
2751 */
libcrux_sha3_generic_keccak_squeeze_first_block_840(libcrux_sha3_generic_keccak_KeccakState_48 * s,Eurydice_slice out[1U])2752 static KRML_MUSTINLINE void libcrux_sha3_generic_keccak_squeeze_first_block_840(
2753 libcrux_sha3_generic_keccak_KeccakState_48 *s, Eurydice_slice out[1U]) {
2754 libcrux_sha3_portable_keccak_store_block_5a_590(s->st, out);
2755 }
2756
2757 /**
2758 A monomorphic instance of libcrux_sha3.generic_keccak.squeeze_next_block
2759 with types uint64_t
2760 with const generics
2761 - N= 1
2762 - RATE= 136
2763 */
libcrux_sha3_generic_keccak_squeeze_next_block_fc0(libcrux_sha3_generic_keccak_KeccakState_48 * s,Eurydice_slice out[1U])2764 static KRML_MUSTINLINE void libcrux_sha3_generic_keccak_squeeze_next_block_fc0(
2765 libcrux_sha3_generic_keccak_KeccakState_48 *s, Eurydice_slice out[1U]) {
2766 libcrux_sha3_generic_keccak_keccakf1600_21(s);
2767 libcrux_sha3_portable_keccak_store_block_5a_590(s->st, out);
2768 }
2769
2770 /**
2771 A monomorphic instance of libcrux_sha3.generic_keccak.squeeze_last
2772 with types uint64_t
2773 with const generics
2774 - N= 1
2775 - RATE= 136
2776 */
libcrux_sha3_generic_keccak_squeeze_last_cf0(libcrux_sha3_generic_keccak_KeccakState_48 s,Eurydice_slice out[1U])2777 static KRML_MUSTINLINE void libcrux_sha3_generic_keccak_squeeze_last_cf0(
2778 libcrux_sha3_generic_keccak_KeccakState_48 s, Eurydice_slice out[1U]) {
2779 libcrux_sha3_generic_keccak_keccakf1600_21(&s);
2780 uint8_t b[1U][200U];
2781 libcrux_sha3_portable_keccak_store_block_full_5a_290(s.st, b);
2782 for (size_t i = (size_t)0U; i < (size_t)1U; i++) {
2783 size_t i0 = i;
2784 Eurydice_slice uu____0 = out[i0];
2785 uint8_t *uu____1 = b[i0];
2786 core_ops_range_Range_b3 lit;
2787 lit.start = (size_t)0U;
2788 lit.end = Eurydice_slice_len(out[i0], uint8_t);
2789 Eurydice_slice_copy(
2790 uu____0,
2791 Eurydice_array_to_subslice((size_t)200U, uu____1, lit, uint8_t,
2792 core_ops_range_Range_b3),
2793 uint8_t);
2794 }
2795 }
2796
2797 /**
2798 A monomorphic instance of libcrux_sha3.generic_keccak.keccak
2799 with types uint64_t
2800 with const generics
2801 - N= 1
2802 - RATE= 136
2803 - DELIM= 6
2804 */
libcrux_sha3_generic_keccak_keccak_e90(Eurydice_slice data[1U],Eurydice_slice out[1U])2805 static KRML_MUSTINLINE void libcrux_sha3_generic_keccak_keccak_e90(
2806 Eurydice_slice data[1U], Eurydice_slice out[1U]) {
2807 libcrux_sha3_generic_keccak_KeccakState_48 s =
2808 libcrux_sha3_generic_keccak_new_1e_f4();
2809 for (size_t i = (size_t)0U;
2810 i < Eurydice_slice_len(data[0U], uint8_t) / (size_t)136U; i++) {
2811 size_t i0 = i;
2812 libcrux_sha3_generic_keccak_KeccakState_48 *uu____0 = &s;
2813 /* Passing arrays by value in Rust generates a copy in C */
2814 Eurydice_slice copy_of_data[1U];
2815 memcpy(copy_of_data, data, (size_t)1U * sizeof(Eurydice_slice));
2816 Eurydice_slice ret[1U];
2817 libcrux_sha3_portable_keccak_slice_n_5a(copy_of_data, i0 * (size_t)136U,
2818 (size_t)136U, ret);
2819 libcrux_sha3_generic_keccak_absorb_block_df0(uu____0, ret);
2820 }
2821 size_t rem = Eurydice_slice_len(data[0U], uint8_t) % (size_t)136U;
2822 libcrux_sha3_generic_keccak_KeccakState_48 *uu____2 = &s;
2823 /* Passing arrays by value in Rust generates a copy in C */
2824 Eurydice_slice copy_of_data[1U];
2825 memcpy(copy_of_data, data, (size_t)1U * sizeof(Eurydice_slice));
2826 Eurydice_slice ret[1U];
2827 libcrux_sha3_portable_keccak_slice_n_5a(
2828 copy_of_data, Eurydice_slice_len(data[0U], uint8_t) - rem, rem, ret);
2829 libcrux_sha3_generic_keccak_absorb_final_c70(uu____2, ret);
2830 size_t outlen = Eurydice_slice_len(out[0U], uint8_t);
2831 size_t blocks = outlen / (size_t)136U;
2832 size_t last = outlen - outlen % (size_t)136U;
2833 if (blocks == (size_t)0U) {
2834 libcrux_sha3_generic_keccak_squeeze_first_and_last_c50(&s, out);
2835 } else {
2836 Eurydice_slice_uint8_t_1size_t__x2 uu____4 =
2837 libcrux_sha3_portable_keccak_split_at_mut_n_5a(out, (size_t)136U);
2838 Eurydice_slice o0[1U];
2839 memcpy(o0, uu____4.fst, (size_t)1U * sizeof(Eurydice_slice));
2840 Eurydice_slice o1[1U];
2841 memcpy(o1, uu____4.snd, (size_t)1U * sizeof(Eurydice_slice));
2842 libcrux_sha3_generic_keccak_squeeze_first_block_840(&s, o0);
2843 core_ops_range_Range_b3 iter =
2844 core_iter_traits_collect___core__iter__traits__collect__IntoIterator_for_I__1__into_iter(
2845 (CLITERAL(core_ops_range_Range_b3){.start = (size_t)1U,
2846 .end = blocks}),
2847 core_ops_range_Range_b3, core_ops_range_Range_b3);
2848 while (true) {
2849 if (core_iter_range___core__iter__traits__iterator__Iterator_for_core__ops__range__Range_A___6__next(
2850 &iter, size_t, Option_b3)
2851 .tag == None) {
2852 break;
2853 } else {
2854 Eurydice_slice_uint8_t_1size_t__x2 uu____5 =
2855 libcrux_sha3_portable_keccak_split_at_mut_n_5a(o1, (size_t)136U);
2856 Eurydice_slice o[1U];
2857 memcpy(o, uu____5.fst, (size_t)1U * sizeof(Eurydice_slice));
2858 Eurydice_slice orest[1U];
2859 memcpy(orest, uu____5.snd, (size_t)1U * sizeof(Eurydice_slice));
2860 libcrux_sha3_generic_keccak_squeeze_next_block_fc0(&s, o);
2861 memcpy(o1, orest, (size_t)1U * sizeof(Eurydice_slice));
2862 }
2863 }
2864 if (last < outlen) {
2865 libcrux_sha3_generic_keccak_squeeze_last_cf0(s, o1);
2866 }
2867 }
2868 }
2869
2870 /**
2871 A monomorphic instance of libcrux_sha3.portable.keccakx1
2872 with const generics
2873 - RATE= 136
2874 - DELIM= 6
2875 */
libcrux_sha3_portable_keccakx1_ce0(Eurydice_slice data[1U],Eurydice_slice out[1U])2876 static KRML_MUSTINLINE void libcrux_sha3_portable_keccakx1_ce0(
2877 Eurydice_slice data[1U], Eurydice_slice out[1U]) {
2878 /* Passing arrays by value in Rust generates a copy in C */
2879 Eurydice_slice copy_of_data[1U];
2880 memcpy(copy_of_data, data, (size_t)1U * sizeof(Eurydice_slice));
2881 libcrux_sha3_generic_keccak_keccak_e90(copy_of_data, out);
2882 }
2883
2884 /**
2885 A portable SHA3 256 implementation.
2886 */
libcrux_sha3_portable_sha256(Eurydice_slice digest,Eurydice_slice data)2887 static KRML_MUSTINLINE void libcrux_sha3_portable_sha256(Eurydice_slice digest,
2888 Eurydice_slice data) {
2889 Eurydice_slice buf0[1U] = {data};
2890 Eurydice_slice buf[1U] = {digest};
2891 libcrux_sha3_portable_keccakx1_ce0(buf0, buf);
2892 }
2893
2894 /**
2895 A monomorphic instance of libcrux_sha3.generic_keccak.absorb_final
2896 with types uint64_t
2897 with const generics
2898 - N= 1
2899 - RATE= 136
2900 - DELIM= 31
2901 */
libcrux_sha3_generic_keccak_absorb_final_c71(libcrux_sha3_generic_keccak_KeccakState_48 * s,Eurydice_slice last[1U])2902 static KRML_MUSTINLINE void libcrux_sha3_generic_keccak_absorb_final_c71(
2903 libcrux_sha3_generic_keccak_KeccakState_48 *s, Eurydice_slice last[1U]) {
2904 size_t last_len = Eurydice_slice_len(last[0U], uint8_t);
2905 uint8_t blocks[1U][200U] = {{0U}};
2906 for (size_t i = (size_t)0U; i < (size_t)1U; i++) {
2907 size_t i0 = i;
2908 if (last_len > (size_t)0U) {
2909 Eurydice_slice uu____0 = Eurydice_array_to_subslice2(
2910 blocks[i0], (size_t)0U, last_len, uint8_t);
2911 Eurydice_slice_copy(uu____0, last[i0], uint8_t);
2912 }
2913 blocks[i0][last_len] = 31U;
2914 size_t uu____1 = i0;
2915 size_t uu____2 = (size_t)136U - (size_t)1U;
2916 blocks[uu____1][uu____2] = (uint32_t)blocks[uu____1][uu____2] | 128U;
2917 }
2918 uint64_t(*uu____3)[5U] = s->st;
2919 uint8_t uu____4[1U][200U];
2920 memcpy(uu____4, blocks, (size_t)1U * sizeof(uint8_t[200U]));
2921 libcrux_sha3_portable_keccak_load_block_full_5a_d20(uu____3, uu____4);
2922 libcrux_sha3_generic_keccak_keccakf1600_21(s);
2923 }
2924
2925 /**
2926 A monomorphic instance of libcrux_sha3.generic_keccak.keccak
2927 with types uint64_t
2928 with const generics
2929 - N= 1
2930 - RATE= 136
2931 - DELIM= 31
2932 */
libcrux_sha3_generic_keccak_keccak_e91(Eurydice_slice data[1U],Eurydice_slice out[1U])2933 static KRML_MUSTINLINE void libcrux_sha3_generic_keccak_keccak_e91(
2934 Eurydice_slice data[1U], Eurydice_slice out[1U]) {
2935 libcrux_sha3_generic_keccak_KeccakState_48 s =
2936 libcrux_sha3_generic_keccak_new_1e_f4();
2937 for (size_t i = (size_t)0U;
2938 i < Eurydice_slice_len(data[0U], uint8_t) / (size_t)136U; i++) {
2939 size_t i0 = i;
2940 libcrux_sha3_generic_keccak_KeccakState_48 *uu____0 = &s;
2941 /* Passing arrays by value in Rust generates a copy in C */
2942 Eurydice_slice copy_of_data[1U];
2943 memcpy(copy_of_data, data, (size_t)1U * sizeof(Eurydice_slice));
2944 Eurydice_slice ret[1U];
2945 libcrux_sha3_portable_keccak_slice_n_5a(copy_of_data, i0 * (size_t)136U,
2946 (size_t)136U, ret);
2947 libcrux_sha3_generic_keccak_absorb_block_df0(uu____0, ret);
2948 }
2949 size_t rem = Eurydice_slice_len(data[0U], uint8_t) % (size_t)136U;
2950 libcrux_sha3_generic_keccak_KeccakState_48 *uu____2 = &s;
2951 /* Passing arrays by value in Rust generates a copy in C */
2952 Eurydice_slice copy_of_data[1U];
2953 memcpy(copy_of_data, data, (size_t)1U * sizeof(Eurydice_slice));
2954 Eurydice_slice ret[1U];
2955 libcrux_sha3_portable_keccak_slice_n_5a(
2956 copy_of_data, Eurydice_slice_len(data[0U], uint8_t) - rem, rem, ret);
2957 libcrux_sha3_generic_keccak_absorb_final_c71(uu____2, ret);
2958 size_t outlen = Eurydice_slice_len(out[0U], uint8_t);
2959 size_t blocks = outlen / (size_t)136U;
2960 size_t last = outlen - outlen % (size_t)136U;
2961 if (blocks == (size_t)0U) {
2962 libcrux_sha3_generic_keccak_squeeze_first_and_last_c50(&s, out);
2963 } else {
2964 Eurydice_slice_uint8_t_1size_t__x2 uu____4 =
2965 libcrux_sha3_portable_keccak_split_at_mut_n_5a(out, (size_t)136U);
2966 Eurydice_slice o0[1U];
2967 memcpy(o0, uu____4.fst, (size_t)1U * sizeof(Eurydice_slice));
2968 Eurydice_slice o1[1U];
2969 memcpy(o1, uu____4.snd, (size_t)1U * sizeof(Eurydice_slice));
2970 libcrux_sha3_generic_keccak_squeeze_first_block_840(&s, o0);
2971 core_ops_range_Range_b3 iter =
2972 core_iter_traits_collect___core__iter__traits__collect__IntoIterator_for_I__1__into_iter(
2973 (CLITERAL(core_ops_range_Range_b3){.start = (size_t)1U,
2974 .end = blocks}),
2975 core_ops_range_Range_b3, core_ops_range_Range_b3);
2976 while (true) {
2977 if (core_iter_range___core__iter__traits__iterator__Iterator_for_core__ops__range__Range_A___6__next(
2978 &iter, size_t, Option_b3)
2979 .tag == None) {
2980 break;
2981 } else {
2982 Eurydice_slice_uint8_t_1size_t__x2 uu____5 =
2983 libcrux_sha3_portable_keccak_split_at_mut_n_5a(o1, (size_t)136U);
2984 Eurydice_slice o[1U];
2985 memcpy(o, uu____5.fst, (size_t)1U * sizeof(Eurydice_slice));
2986 Eurydice_slice orest[1U];
2987 memcpy(orest, uu____5.snd, (size_t)1U * sizeof(Eurydice_slice));
2988 libcrux_sha3_generic_keccak_squeeze_next_block_fc0(&s, o);
2989 memcpy(o1, orest, (size_t)1U * sizeof(Eurydice_slice));
2990 }
2991 }
2992 if (last < outlen) {
2993 libcrux_sha3_generic_keccak_squeeze_last_cf0(s, o1);
2994 }
2995 }
2996 }
2997
2998 /**
2999 A monomorphic instance of libcrux_sha3.portable.keccakx1
3000 with const generics
3001 - RATE= 136
3002 - DELIM= 31
3003 */
libcrux_sha3_portable_keccakx1_ce1(Eurydice_slice data[1U],Eurydice_slice out[1U])3004 static KRML_MUSTINLINE void libcrux_sha3_portable_keccakx1_ce1(
3005 Eurydice_slice data[1U], Eurydice_slice out[1U]) {
3006 /* Passing arrays by value in Rust generates a copy in C */
3007 Eurydice_slice copy_of_data[1U];
3008 memcpy(copy_of_data, data, (size_t)1U * sizeof(Eurydice_slice));
3009 libcrux_sha3_generic_keccak_keccak_e91(copy_of_data, out);
3010 }
3011
3012 /**
3013 A portable SHAKE256 implementation.
3014 */
libcrux_sha3_portable_shake256(Eurydice_slice digest,Eurydice_slice data)3015 static KRML_MUSTINLINE void libcrux_sha3_portable_shake256(
3016 Eurydice_slice digest, Eurydice_slice data) {
3017 Eurydice_slice buf0[1U] = {data};
3018 Eurydice_slice buf[1U] = {digest};
3019 libcrux_sha3_portable_keccakx1_ce1(buf0, buf);
3020 }
3021
3022 typedef libcrux_sha3_generic_keccak_KeccakState_48
3023 libcrux_sha3_portable_KeccakState;
3024
3025 /**
3026 Create a new SHAKE-128 state object.
3027 */
3028 static KRML_MUSTINLINE libcrux_sha3_generic_keccak_KeccakState_48
libcrux_sha3_portable_incremental_shake128_init(void)3029 libcrux_sha3_portable_incremental_shake128_init(void) {
3030 return libcrux_sha3_generic_keccak_new_1e_f4();
3031 }
3032
3033 /**
3034 A monomorphic instance of libcrux_sha3.portable_keccak.load_block
3035 with const generics
3036 - RATE= 168
3037 */
libcrux_sha3_portable_keccak_load_block_2c1(uint64_t (* s)[5U],Eurydice_slice blocks[1U])3038 static KRML_MUSTINLINE void libcrux_sha3_portable_keccak_load_block_2c1(
3039 uint64_t (*s)[5U], Eurydice_slice blocks[1U]) {
3040 for (size_t i = (size_t)0U; i < (size_t)168U / (size_t)8U; i++) {
3041 size_t i0 = i;
3042 uint8_t uu____0[8U];
3043 Result_56 dst;
3044 Eurydice_slice_to_array2(
3045 &dst,
3046 Eurydice_slice_subslice2(blocks[0U], (size_t)8U * i0,
3047 (size_t)8U * i0 + (size_t)8U, uint8_t),
3048 Eurydice_slice, uint8_t[8U]);
3049 unwrap_41_ac(dst, uu____0);
3050 size_t uu____1 = i0 / (size_t)5U;
3051 size_t uu____2 = i0 % (size_t)5U;
3052 s[uu____1][uu____2] =
3053 s[uu____1][uu____2] ^ core_num__u64_9__from_le_bytes(uu____0);
3054 }
3055 }
3056
3057 /**
3058 A monomorphic instance of libcrux_sha3.portable_keccak.load_block_full
3059 with const generics
3060 - RATE= 168
3061 */
libcrux_sha3_portable_keccak_load_block_full_df1(uint64_t (* s)[5U],uint8_t blocks[1U][200U])3062 static KRML_MUSTINLINE void libcrux_sha3_portable_keccak_load_block_full_df1(
3063 uint64_t (*s)[5U], uint8_t blocks[1U][200U]) {
3064 Eurydice_slice buf[1U] = {
3065 Eurydice_array_to_slice((size_t)200U, blocks[0U], uint8_t)};
3066 libcrux_sha3_portable_keccak_load_block_2c1(s, buf);
3067 }
3068
3069 /**
3070 This function found in impl {(libcrux_sha3::traits::internal::KeccakItem<1:
3071 usize> for u64)}
3072 */
3073 /**
3074 A monomorphic instance of libcrux_sha3.portable_keccak.load_block_full_5a
3075 with const generics
3076 - RATE= 168
3077 */
libcrux_sha3_portable_keccak_load_block_full_5a_d21(uint64_t (* a)[5U],uint8_t b[1U][200U])3078 static KRML_MUSTINLINE void libcrux_sha3_portable_keccak_load_block_full_5a_d21(
3079 uint64_t (*a)[5U], uint8_t b[1U][200U]) {
3080 uint64_t(*uu____0)[5U] = a;
3081 /* Passing arrays by value in Rust generates a copy in C */
3082 uint8_t copy_of_b[1U][200U];
3083 memcpy(copy_of_b, b, (size_t)1U * sizeof(uint8_t[200U]));
3084 libcrux_sha3_portable_keccak_load_block_full_df1(uu____0, copy_of_b);
3085 }
3086
3087 /**
3088 A monomorphic instance of libcrux_sha3.generic_keccak.absorb_final
3089 with types uint64_t
3090 with const generics
3091 - N= 1
3092 - RATE= 168
3093 - DELIM= 31
3094 */
libcrux_sha3_generic_keccak_absorb_final_c72(libcrux_sha3_generic_keccak_KeccakState_48 * s,Eurydice_slice last[1U])3095 static KRML_MUSTINLINE void libcrux_sha3_generic_keccak_absorb_final_c72(
3096 libcrux_sha3_generic_keccak_KeccakState_48 *s, Eurydice_slice last[1U]) {
3097 size_t last_len = Eurydice_slice_len(last[0U], uint8_t);
3098 uint8_t blocks[1U][200U] = {{0U}};
3099 for (size_t i = (size_t)0U; i < (size_t)1U; i++) {
3100 size_t i0 = i;
3101 if (last_len > (size_t)0U) {
3102 Eurydice_slice uu____0 = Eurydice_array_to_subslice2(
3103 blocks[i0], (size_t)0U, last_len, uint8_t);
3104 Eurydice_slice_copy(uu____0, last[i0], uint8_t);
3105 }
3106 blocks[i0][last_len] = 31U;
3107 size_t uu____1 = i0;
3108 size_t uu____2 = (size_t)168U - (size_t)1U;
3109 blocks[uu____1][uu____2] = (uint32_t)blocks[uu____1][uu____2] | 128U;
3110 }
3111 uint64_t(*uu____3)[5U] = s->st;
3112 uint8_t uu____4[1U][200U];
3113 memcpy(uu____4, blocks, (size_t)1U * sizeof(uint8_t[200U]));
3114 libcrux_sha3_portable_keccak_load_block_full_5a_d21(uu____3, uu____4);
3115 libcrux_sha3_generic_keccak_keccakf1600_21(s);
3116 }
3117
3118 /**
3119 Absorb
3120 */
3121 static KRML_MUSTINLINE void
libcrux_sha3_portable_incremental_shake128_absorb_final(libcrux_sha3_generic_keccak_KeccakState_48 * s,Eurydice_slice data0)3122 libcrux_sha3_portable_incremental_shake128_absorb_final(
3123 libcrux_sha3_generic_keccak_KeccakState_48 *s, Eurydice_slice data0) {
3124 Eurydice_slice buf[1U] = {data0};
3125 libcrux_sha3_generic_keccak_absorb_final_c72(s, buf);
3126 }
3127
3128 /**
3129 A monomorphic instance of libcrux_sha3.portable_keccak.store_block
3130 with const generics
3131 - RATE= 168
3132 */
libcrux_sha3_portable_keccak_store_block_581(uint64_t (* s)[5U],Eurydice_slice out[1U])3133 static KRML_MUSTINLINE void libcrux_sha3_portable_keccak_store_block_581(
3134 uint64_t (*s)[5U], Eurydice_slice out[1U]) {
3135 for (size_t i = (size_t)0U; i < (size_t)168U / (size_t)8U; i++) {
3136 size_t i0 = i;
3137 Eurydice_slice uu____0 = Eurydice_slice_subslice2(
3138 out[0U], (size_t)8U * i0, (size_t)8U * i0 + (size_t)8U, uint8_t);
3139 uint8_t ret[8U];
3140 core_num__u64_9__to_le_bytes(s[i0 / (size_t)5U][i0 % (size_t)5U], ret);
3141 Eurydice_slice_copy(
3142 uu____0, Eurydice_array_to_slice((size_t)8U, ret, uint8_t), uint8_t);
3143 }
3144 }
3145
3146 /**
3147 This function found in impl {(libcrux_sha3::traits::internal::KeccakItem<1:
3148 usize> for u64)}
3149 */
3150 /**
3151 A monomorphic instance of libcrux_sha3.portable_keccak.store_block_5a
3152 with const generics
3153 - RATE= 168
3154 */
libcrux_sha3_portable_keccak_store_block_5a_591(uint64_t (* a)[5U],Eurydice_slice b[1U])3155 static KRML_MUSTINLINE void libcrux_sha3_portable_keccak_store_block_5a_591(
3156 uint64_t (*a)[5U], Eurydice_slice b[1U]) {
3157 libcrux_sha3_portable_keccak_store_block_581(a, b);
3158 }
3159
3160 /**
3161 A monomorphic instance of libcrux_sha3.generic_keccak.squeeze_next_block
3162 with types uint64_t
3163 with const generics
3164 - N= 1
3165 - RATE= 168
3166 */
libcrux_sha3_generic_keccak_squeeze_next_block_fc1(libcrux_sha3_generic_keccak_KeccakState_48 * s,Eurydice_slice out[1U])3167 static KRML_MUSTINLINE void libcrux_sha3_generic_keccak_squeeze_next_block_fc1(
3168 libcrux_sha3_generic_keccak_KeccakState_48 *s, Eurydice_slice out[1U]) {
3169 libcrux_sha3_generic_keccak_keccakf1600_21(s);
3170 libcrux_sha3_portable_keccak_store_block_5a_591(s->st, out);
3171 }
3172
3173 /**
3174 Squeeze another block
3175 */
3176 static KRML_MUSTINLINE void
libcrux_sha3_portable_incremental_shake128_squeeze_next_block(libcrux_sha3_generic_keccak_KeccakState_48 * s,Eurydice_slice out0)3177 libcrux_sha3_portable_incremental_shake128_squeeze_next_block(
3178 libcrux_sha3_generic_keccak_KeccakState_48 *s, Eurydice_slice out0) {
3179 Eurydice_slice buf[1U] = {out0};
3180 libcrux_sha3_generic_keccak_squeeze_next_block_fc1(s, buf);
3181 }
3182
3183 /**
3184 A monomorphic instance of libcrux_sha3.generic_keccak.squeeze_first_block
3185 with types uint64_t
3186 with const generics
3187 - N= 1
3188 - RATE= 168
3189 */
libcrux_sha3_generic_keccak_squeeze_first_block_841(libcrux_sha3_generic_keccak_KeccakState_48 * s,Eurydice_slice out[1U])3190 static KRML_MUSTINLINE void libcrux_sha3_generic_keccak_squeeze_first_block_841(
3191 libcrux_sha3_generic_keccak_KeccakState_48 *s, Eurydice_slice out[1U]) {
3192 libcrux_sha3_portable_keccak_store_block_5a_591(s->st, out);
3193 }
3194
3195 /**
3196 A monomorphic instance of libcrux_sha3.generic_keccak.squeeze_first_three_blocks
3197 with types uint64_t
3198 with const generics
3199 - N= 1
3200 - RATE= 168
3201 */
3202 static KRML_MUSTINLINE void
libcrux_sha3_generic_keccak_squeeze_first_three_blocks_cc(libcrux_sha3_generic_keccak_KeccakState_48 * s,Eurydice_slice out[1U])3203 libcrux_sha3_generic_keccak_squeeze_first_three_blocks_cc(
3204 libcrux_sha3_generic_keccak_KeccakState_48 *s, Eurydice_slice out[1U]) {
3205 Eurydice_slice_uint8_t_1size_t__x2 uu____0 =
3206 libcrux_sha3_portable_keccak_split_at_mut_n_5a(out, (size_t)168U);
3207 Eurydice_slice o0[1U];
3208 memcpy(o0, uu____0.fst, (size_t)1U * sizeof(Eurydice_slice));
3209 Eurydice_slice o10[1U];
3210 memcpy(o10, uu____0.snd, (size_t)1U * sizeof(Eurydice_slice));
3211 libcrux_sha3_generic_keccak_squeeze_first_block_841(s, o0);
3212 Eurydice_slice_uint8_t_1size_t__x2 uu____1 =
3213 libcrux_sha3_portable_keccak_split_at_mut_n_5a(o10, (size_t)168U);
3214 Eurydice_slice o1[1U];
3215 memcpy(o1, uu____1.fst, (size_t)1U * sizeof(Eurydice_slice));
3216 Eurydice_slice o2[1U];
3217 memcpy(o2, uu____1.snd, (size_t)1U * sizeof(Eurydice_slice));
3218 libcrux_sha3_generic_keccak_squeeze_next_block_fc1(s, o1);
3219 libcrux_sha3_generic_keccak_squeeze_next_block_fc1(s, o2);
3220 }
3221
3222 /**
3223 Squeeze three blocks
3224 */
3225 static KRML_MUSTINLINE void
libcrux_sha3_portable_incremental_shake128_squeeze_first_three_blocks(libcrux_sha3_generic_keccak_KeccakState_48 * s,Eurydice_slice out0)3226 libcrux_sha3_portable_incremental_shake128_squeeze_first_three_blocks(
3227 libcrux_sha3_generic_keccak_KeccakState_48 *s, Eurydice_slice out0) {
3228 Eurydice_slice buf[1U] = {out0};
3229 libcrux_sha3_generic_keccak_squeeze_first_three_blocks_cc(s, buf);
3230 }
3231
3232 #define libcrux_sha3_Sha224 0
3233 #define libcrux_sha3_Sha256 1
3234 #define libcrux_sha3_Sha384 2
3235 #define libcrux_sha3_Sha512 3
3236
3237 typedef uint8_t libcrux_sha3_Algorithm;
3238
3239 /**
3240 Returns the output size of a digest.
3241 */
libcrux_sha3_digest_size(libcrux_sha3_Algorithm mode)3242 static inline size_t libcrux_sha3_digest_size(libcrux_sha3_Algorithm mode) {
3243 size_t uu____0;
3244 switch (mode) {
3245 case libcrux_sha3_Sha224: {
3246 uu____0 = (size_t)28U;
3247 break;
3248 }
3249 case libcrux_sha3_Sha256: {
3250 uu____0 = (size_t)32U;
3251 break;
3252 }
3253 case libcrux_sha3_Sha384: {
3254 uu____0 = (size_t)48U;
3255 break;
3256 }
3257 case libcrux_sha3_Sha512: {
3258 uu____0 = (size_t)64U;
3259 break;
3260 }
3261 default: {
3262 KRML_HOST_EPRINTF("KaRaMeL incomplete match at %s:%d\n", __FILE__,
3263 __LINE__);
3264 KRML_HOST_EXIT(253U);
3265 }
3266 }
3267 return uu____0;
3268 }
3269
3270 /**
3271 A monomorphic instance of libcrux_sha3.portable_keccak.load_block
3272 with const generics
3273 - RATE= 144
3274 */
libcrux_sha3_portable_keccak_load_block_2c2(uint64_t (* s)[5U],Eurydice_slice blocks[1U])3275 static KRML_MUSTINLINE void libcrux_sha3_portable_keccak_load_block_2c2(
3276 uint64_t (*s)[5U], Eurydice_slice blocks[1U]) {
3277 for (size_t i = (size_t)0U; i < (size_t)144U / (size_t)8U; i++) {
3278 size_t i0 = i;
3279 uint8_t uu____0[8U];
3280 Result_56 dst;
3281 Eurydice_slice_to_array2(
3282 &dst,
3283 Eurydice_slice_subslice2(blocks[0U], (size_t)8U * i0,
3284 (size_t)8U * i0 + (size_t)8U, uint8_t),
3285 Eurydice_slice, uint8_t[8U]);
3286 unwrap_41_ac(dst, uu____0);
3287 size_t uu____1 = i0 / (size_t)5U;
3288 size_t uu____2 = i0 % (size_t)5U;
3289 s[uu____1][uu____2] =
3290 s[uu____1][uu____2] ^ core_num__u64_9__from_le_bytes(uu____0);
3291 }
3292 }
3293
3294 /**
3295 This function found in impl {(libcrux_sha3::traits::internal::KeccakItem<1:
3296 usize> for u64)}
3297 */
3298 /**
3299 A monomorphic instance of libcrux_sha3.portable_keccak.load_block_5a
3300 with const generics
3301 - RATE= 144
3302 */
libcrux_sha3_portable_keccak_load_block_5a_b81(uint64_t (* a)[5U],Eurydice_slice b[1U])3303 static KRML_MUSTINLINE void libcrux_sha3_portable_keccak_load_block_5a_b81(
3304 uint64_t (*a)[5U], Eurydice_slice b[1U]) {
3305 uint64_t(*uu____0)[5U] = a;
3306 /* Passing arrays by value in Rust generates a copy in C */
3307 Eurydice_slice copy_of_b[1U];
3308 memcpy(copy_of_b, b, (size_t)1U * sizeof(Eurydice_slice));
3309 libcrux_sha3_portable_keccak_load_block_2c2(uu____0, copy_of_b);
3310 }
3311
3312 /**
3313 A monomorphic instance of libcrux_sha3.generic_keccak.absorb_block
3314 with types uint64_t
3315 with const generics
3316 - N= 1
3317 - RATE= 144
3318 */
libcrux_sha3_generic_keccak_absorb_block_df1(libcrux_sha3_generic_keccak_KeccakState_48 * s,Eurydice_slice blocks[1U])3319 static KRML_MUSTINLINE void libcrux_sha3_generic_keccak_absorb_block_df1(
3320 libcrux_sha3_generic_keccak_KeccakState_48 *s, Eurydice_slice blocks[1U]) {
3321 uint64_t(*uu____0)[5U] = s->st;
3322 Eurydice_slice uu____1[1U];
3323 memcpy(uu____1, blocks, (size_t)1U * sizeof(Eurydice_slice));
3324 libcrux_sha3_portable_keccak_load_block_5a_b81(uu____0, uu____1);
3325 libcrux_sha3_generic_keccak_keccakf1600_21(s);
3326 }
3327
3328 /**
3329 A monomorphic instance of libcrux_sha3.portable_keccak.load_block_full
3330 with const generics
3331 - RATE= 144
3332 */
libcrux_sha3_portable_keccak_load_block_full_df2(uint64_t (* s)[5U],uint8_t blocks[1U][200U])3333 static KRML_MUSTINLINE void libcrux_sha3_portable_keccak_load_block_full_df2(
3334 uint64_t (*s)[5U], uint8_t blocks[1U][200U]) {
3335 Eurydice_slice buf[1U] = {
3336 Eurydice_array_to_slice((size_t)200U, blocks[0U], uint8_t)};
3337 libcrux_sha3_portable_keccak_load_block_2c2(s, buf);
3338 }
3339
3340 /**
3341 This function found in impl {(libcrux_sha3::traits::internal::KeccakItem<1:
3342 usize> for u64)}
3343 */
3344 /**
3345 A monomorphic instance of libcrux_sha3.portable_keccak.load_block_full_5a
3346 with const generics
3347 - RATE= 144
3348 */
libcrux_sha3_portable_keccak_load_block_full_5a_d22(uint64_t (* a)[5U],uint8_t b[1U][200U])3349 static KRML_MUSTINLINE void libcrux_sha3_portable_keccak_load_block_full_5a_d22(
3350 uint64_t (*a)[5U], uint8_t b[1U][200U]) {
3351 uint64_t(*uu____0)[5U] = a;
3352 /* Passing arrays by value in Rust generates a copy in C */
3353 uint8_t copy_of_b[1U][200U];
3354 memcpy(copy_of_b, b, (size_t)1U * sizeof(uint8_t[200U]));
3355 libcrux_sha3_portable_keccak_load_block_full_df2(uu____0, copy_of_b);
3356 }
3357
3358 /**
3359 A monomorphic instance of libcrux_sha3.generic_keccak.absorb_final
3360 with types uint64_t
3361 with const generics
3362 - N= 1
3363 - RATE= 144
3364 - DELIM= 6
3365 */
libcrux_sha3_generic_keccak_absorb_final_c73(libcrux_sha3_generic_keccak_KeccakState_48 * s,Eurydice_slice last[1U])3366 static KRML_MUSTINLINE void libcrux_sha3_generic_keccak_absorb_final_c73(
3367 libcrux_sha3_generic_keccak_KeccakState_48 *s, Eurydice_slice last[1U]) {
3368 size_t last_len = Eurydice_slice_len(last[0U], uint8_t);
3369 uint8_t blocks[1U][200U] = {{0U}};
3370 for (size_t i = (size_t)0U; i < (size_t)1U; i++) {
3371 size_t i0 = i;
3372 if (last_len > (size_t)0U) {
3373 Eurydice_slice uu____0 = Eurydice_array_to_subslice2(
3374 blocks[i0], (size_t)0U, last_len, uint8_t);
3375 Eurydice_slice_copy(uu____0, last[i0], uint8_t);
3376 }
3377 blocks[i0][last_len] = 6U;
3378 size_t uu____1 = i0;
3379 size_t uu____2 = (size_t)144U - (size_t)1U;
3380 blocks[uu____1][uu____2] = (uint32_t)blocks[uu____1][uu____2] | 128U;
3381 }
3382 uint64_t(*uu____3)[5U] = s->st;
3383 uint8_t uu____4[1U][200U];
3384 memcpy(uu____4, blocks, (size_t)1U * sizeof(uint8_t[200U]));
3385 libcrux_sha3_portable_keccak_load_block_full_5a_d22(uu____3, uu____4);
3386 libcrux_sha3_generic_keccak_keccakf1600_21(s);
3387 }
3388
3389 /**
3390 A monomorphic instance of libcrux_sha3.portable_keccak.store_block
3391 with const generics
3392 - RATE= 144
3393 */
libcrux_sha3_portable_keccak_store_block_582(uint64_t (* s)[5U],Eurydice_slice out[1U])3394 static KRML_MUSTINLINE void libcrux_sha3_portable_keccak_store_block_582(
3395 uint64_t (*s)[5U], Eurydice_slice out[1U]) {
3396 for (size_t i = (size_t)0U; i < (size_t)144U / (size_t)8U; i++) {
3397 size_t i0 = i;
3398 Eurydice_slice uu____0 = Eurydice_slice_subslice2(
3399 out[0U], (size_t)8U * i0, (size_t)8U * i0 + (size_t)8U, uint8_t);
3400 uint8_t ret[8U];
3401 core_num__u64_9__to_le_bytes(s[i0 / (size_t)5U][i0 % (size_t)5U], ret);
3402 Eurydice_slice_copy(
3403 uu____0, Eurydice_array_to_slice((size_t)8U, ret, uint8_t), uint8_t);
3404 }
3405 }
3406
3407 /**
3408 A monomorphic instance of libcrux_sha3.portable_keccak.store_block_full
3409 with const generics
3410 - RATE= 144
3411 */
libcrux_sha3_portable_keccak_store_block_full_2d1(uint64_t (* s)[5U],uint8_t ret[1U][200U])3412 static KRML_MUSTINLINE void libcrux_sha3_portable_keccak_store_block_full_2d1(
3413 uint64_t (*s)[5U], uint8_t ret[1U][200U]) {
3414 uint8_t out[200U] = {0U};
3415 Eurydice_slice buf[1U] = {
3416 Eurydice_array_to_slice((size_t)200U, out, uint8_t)};
3417 libcrux_sha3_portable_keccak_store_block_582(s, buf);
3418 /* Passing arrays by value in Rust generates a copy in C */
3419 uint8_t copy_of_out[200U];
3420 memcpy(copy_of_out, out, (size_t)200U * sizeof(uint8_t));
3421 memcpy(ret[0U], copy_of_out, (size_t)200U * sizeof(uint8_t));
3422 }
3423
3424 /**
3425 This function found in impl {(libcrux_sha3::traits::internal::KeccakItem<1:
3426 usize> for u64)}
3427 */
3428 /**
3429 A monomorphic instance of libcrux_sha3.portable_keccak.store_block_full_5a
3430 with const generics
3431 - RATE= 144
3432 */
3433 static KRML_MUSTINLINE void
libcrux_sha3_portable_keccak_store_block_full_5a_291(uint64_t (* a)[5U],uint8_t ret[1U][200U])3434 libcrux_sha3_portable_keccak_store_block_full_5a_291(uint64_t (*a)[5U],
3435 uint8_t ret[1U][200U]) {
3436 libcrux_sha3_portable_keccak_store_block_full_2d1(a, ret);
3437 }
3438
3439 /**
3440 A monomorphic instance of libcrux_sha3.generic_keccak.squeeze_first_and_last
3441 with types uint64_t
3442 with const generics
3443 - N= 1
3444 - RATE= 144
3445 */
3446 static KRML_MUSTINLINE void
libcrux_sha3_generic_keccak_squeeze_first_and_last_c51(libcrux_sha3_generic_keccak_KeccakState_48 * s,Eurydice_slice out[1U])3447 libcrux_sha3_generic_keccak_squeeze_first_and_last_c51(
3448 libcrux_sha3_generic_keccak_KeccakState_48 *s, Eurydice_slice out[1U]) {
3449 uint8_t b[1U][200U];
3450 libcrux_sha3_portable_keccak_store_block_full_5a_291(s->st, b);
3451 for (size_t i = (size_t)0U; i < (size_t)1U; i++) {
3452 size_t i0 = i;
3453 Eurydice_slice uu____0 = out[i0];
3454 uint8_t *uu____1 = b[i0];
3455 core_ops_range_Range_b3 lit;
3456 lit.start = (size_t)0U;
3457 lit.end = Eurydice_slice_len(out[i0], uint8_t);
3458 Eurydice_slice_copy(
3459 uu____0,
3460 Eurydice_array_to_subslice((size_t)200U, uu____1, lit, uint8_t,
3461 core_ops_range_Range_b3),
3462 uint8_t);
3463 }
3464 }
3465
3466 /**
3467 This function found in impl {(libcrux_sha3::traits::internal::KeccakItem<1:
3468 usize> for u64)}
3469 */
3470 /**
3471 A monomorphic instance of libcrux_sha3.portable_keccak.store_block_5a
3472 with const generics
3473 - RATE= 144
3474 */
libcrux_sha3_portable_keccak_store_block_5a_592(uint64_t (* a)[5U],Eurydice_slice b[1U])3475 static KRML_MUSTINLINE void libcrux_sha3_portable_keccak_store_block_5a_592(
3476 uint64_t (*a)[5U], Eurydice_slice b[1U]) {
3477 libcrux_sha3_portable_keccak_store_block_582(a, b);
3478 }
3479
3480 /**
3481 A monomorphic instance of libcrux_sha3.generic_keccak.squeeze_first_block
3482 with types uint64_t
3483 with const generics
3484 - N= 1
3485 - RATE= 144
3486 */
libcrux_sha3_generic_keccak_squeeze_first_block_842(libcrux_sha3_generic_keccak_KeccakState_48 * s,Eurydice_slice out[1U])3487 static KRML_MUSTINLINE void libcrux_sha3_generic_keccak_squeeze_first_block_842(
3488 libcrux_sha3_generic_keccak_KeccakState_48 *s, Eurydice_slice out[1U]) {
3489 libcrux_sha3_portable_keccak_store_block_5a_592(s->st, out);
3490 }
3491
3492 /**
3493 A monomorphic instance of libcrux_sha3.generic_keccak.squeeze_next_block
3494 with types uint64_t
3495 with const generics
3496 - N= 1
3497 - RATE= 144
3498 */
libcrux_sha3_generic_keccak_squeeze_next_block_fc2(libcrux_sha3_generic_keccak_KeccakState_48 * s,Eurydice_slice out[1U])3499 static KRML_MUSTINLINE void libcrux_sha3_generic_keccak_squeeze_next_block_fc2(
3500 libcrux_sha3_generic_keccak_KeccakState_48 *s, Eurydice_slice out[1U]) {
3501 libcrux_sha3_generic_keccak_keccakf1600_21(s);
3502 libcrux_sha3_portable_keccak_store_block_5a_592(s->st, out);
3503 }
3504
3505 /**
3506 A monomorphic instance of libcrux_sha3.generic_keccak.squeeze_last
3507 with types uint64_t
3508 with const generics
3509 - N= 1
3510 - RATE= 144
3511 */
libcrux_sha3_generic_keccak_squeeze_last_cf1(libcrux_sha3_generic_keccak_KeccakState_48 s,Eurydice_slice out[1U])3512 static KRML_MUSTINLINE void libcrux_sha3_generic_keccak_squeeze_last_cf1(
3513 libcrux_sha3_generic_keccak_KeccakState_48 s, Eurydice_slice out[1U]) {
3514 libcrux_sha3_generic_keccak_keccakf1600_21(&s);
3515 uint8_t b[1U][200U];
3516 libcrux_sha3_portable_keccak_store_block_full_5a_291(s.st, b);
3517 for (size_t i = (size_t)0U; i < (size_t)1U; i++) {
3518 size_t i0 = i;
3519 Eurydice_slice uu____0 = out[i0];
3520 uint8_t *uu____1 = b[i0];
3521 core_ops_range_Range_b3 lit;
3522 lit.start = (size_t)0U;
3523 lit.end = Eurydice_slice_len(out[i0], uint8_t);
3524 Eurydice_slice_copy(
3525 uu____0,
3526 Eurydice_array_to_subslice((size_t)200U, uu____1, lit, uint8_t,
3527 core_ops_range_Range_b3),
3528 uint8_t);
3529 }
3530 }
3531
3532 /**
3533 A monomorphic instance of libcrux_sha3.generic_keccak.keccak
3534 with types uint64_t
3535 with const generics
3536 - N= 1
3537 - RATE= 144
3538 - DELIM= 6
3539 */
libcrux_sha3_generic_keccak_keccak_e92(Eurydice_slice data[1U],Eurydice_slice out[1U])3540 static KRML_MUSTINLINE void libcrux_sha3_generic_keccak_keccak_e92(
3541 Eurydice_slice data[1U], Eurydice_slice out[1U]) {
3542 libcrux_sha3_generic_keccak_KeccakState_48 s =
3543 libcrux_sha3_generic_keccak_new_1e_f4();
3544 for (size_t i = (size_t)0U;
3545 i < Eurydice_slice_len(data[0U], uint8_t) / (size_t)144U; i++) {
3546 size_t i0 = i;
3547 libcrux_sha3_generic_keccak_KeccakState_48 *uu____0 = &s;
3548 /* Passing arrays by value in Rust generates a copy in C */
3549 Eurydice_slice copy_of_data[1U];
3550 memcpy(copy_of_data, data, (size_t)1U * sizeof(Eurydice_slice));
3551 Eurydice_slice ret[1U];
3552 libcrux_sha3_portable_keccak_slice_n_5a(copy_of_data, i0 * (size_t)144U,
3553 (size_t)144U, ret);
3554 libcrux_sha3_generic_keccak_absorb_block_df1(uu____0, ret);
3555 }
3556 size_t rem = Eurydice_slice_len(data[0U], uint8_t) % (size_t)144U;
3557 libcrux_sha3_generic_keccak_KeccakState_48 *uu____2 = &s;
3558 /* Passing arrays by value in Rust generates a copy in C */
3559 Eurydice_slice copy_of_data[1U];
3560 memcpy(copy_of_data, data, (size_t)1U * sizeof(Eurydice_slice));
3561 Eurydice_slice ret[1U];
3562 libcrux_sha3_portable_keccak_slice_n_5a(
3563 copy_of_data, Eurydice_slice_len(data[0U], uint8_t) - rem, rem, ret);
3564 libcrux_sha3_generic_keccak_absorb_final_c73(uu____2, ret);
3565 size_t outlen = Eurydice_slice_len(out[0U], uint8_t);
3566 size_t blocks = outlen / (size_t)144U;
3567 size_t last = outlen - outlen % (size_t)144U;
3568 if (blocks == (size_t)0U) {
3569 libcrux_sha3_generic_keccak_squeeze_first_and_last_c51(&s, out);
3570 } else {
3571 Eurydice_slice_uint8_t_1size_t__x2 uu____4 =
3572 libcrux_sha3_portable_keccak_split_at_mut_n_5a(out, (size_t)144U);
3573 Eurydice_slice o0[1U];
3574 memcpy(o0, uu____4.fst, (size_t)1U * sizeof(Eurydice_slice));
3575 Eurydice_slice o1[1U];
3576 memcpy(o1, uu____4.snd, (size_t)1U * sizeof(Eurydice_slice));
3577 libcrux_sha3_generic_keccak_squeeze_first_block_842(&s, o0);
3578 core_ops_range_Range_b3 iter =
3579 core_iter_traits_collect___core__iter__traits__collect__IntoIterator_for_I__1__into_iter(
3580 (CLITERAL(core_ops_range_Range_b3){.start = (size_t)1U,
3581 .end = blocks}),
3582 core_ops_range_Range_b3, core_ops_range_Range_b3);
3583 while (true) {
3584 if (core_iter_range___core__iter__traits__iterator__Iterator_for_core__ops__range__Range_A___6__next(
3585 &iter, size_t, Option_b3)
3586 .tag == None) {
3587 break;
3588 } else {
3589 Eurydice_slice_uint8_t_1size_t__x2 uu____5 =
3590 libcrux_sha3_portable_keccak_split_at_mut_n_5a(o1, (size_t)144U);
3591 Eurydice_slice o[1U];
3592 memcpy(o, uu____5.fst, (size_t)1U * sizeof(Eurydice_slice));
3593 Eurydice_slice orest[1U];
3594 memcpy(orest, uu____5.snd, (size_t)1U * sizeof(Eurydice_slice));
3595 libcrux_sha3_generic_keccak_squeeze_next_block_fc2(&s, o);
3596 memcpy(o1, orest, (size_t)1U * sizeof(Eurydice_slice));
3597 }
3598 }
3599 if (last < outlen) {
3600 libcrux_sha3_generic_keccak_squeeze_last_cf1(s, o1);
3601 }
3602 }
3603 }
3604
3605 /**
3606 A monomorphic instance of libcrux_sha3.portable.keccakx1
3607 with const generics
3608 - RATE= 144
3609 - DELIM= 6
3610 */
libcrux_sha3_portable_keccakx1_ce2(Eurydice_slice data[1U],Eurydice_slice out[1U])3611 static KRML_MUSTINLINE void libcrux_sha3_portable_keccakx1_ce2(
3612 Eurydice_slice data[1U], Eurydice_slice out[1U]) {
3613 /* Passing arrays by value in Rust generates a copy in C */
3614 Eurydice_slice copy_of_data[1U];
3615 memcpy(copy_of_data, data, (size_t)1U * sizeof(Eurydice_slice));
3616 libcrux_sha3_generic_keccak_keccak_e92(copy_of_data, out);
3617 }
3618
3619 /**
3620 A portable SHA3 224 implementation.
3621 */
libcrux_sha3_portable_sha224(Eurydice_slice digest,Eurydice_slice data)3622 static KRML_MUSTINLINE void libcrux_sha3_portable_sha224(Eurydice_slice digest,
3623 Eurydice_slice data) {
3624 Eurydice_slice buf0[1U] = {data};
3625 Eurydice_slice buf[1U] = {digest};
3626 libcrux_sha3_portable_keccakx1_ce2(buf0, buf);
3627 }
3628
3629 /**
3630 A monomorphic instance of libcrux_sha3.portable_keccak.load_block
3631 with const generics
3632 - RATE= 104
3633 */
libcrux_sha3_portable_keccak_load_block_2c3(uint64_t (* s)[5U],Eurydice_slice blocks[1U])3634 static KRML_MUSTINLINE void libcrux_sha3_portable_keccak_load_block_2c3(
3635 uint64_t (*s)[5U], Eurydice_slice blocks[1U]) {
3636 for (size_t i = (size_t)0U; i < (size_t)104U / (size_t)8U; i++) {
3637 size_t i0 = i;
3638 uint8_t uu____0[8U];
3639 Result_56 dst;
3640 Eurydice_slice_to_array2(
3641 &dst,
3642 Eurydice_slice_subslice2(blocks[0U], (size_t)8U * i0,
3643 (size_t)8U * i0 + (size_t)8U, uint8_t),
3644 Eurydice_slice, uint8_t[8U]);
3645 unwrap_41_ac(dst, uu____0);
3646 size_t uu____1 = i0 / (size_t)5U;
3647 size_t uu____2 = i0 % (size_t)5U;
3648 s[uu____1][uu____2] =
3649 s[uu____1][uu____2] ^ core_num__u64_9__from_le_bytes(uu____0);
3650 }
3651 }
3652
3653 /**
3654 This function found in impl {(libcrux_sha3::traits::internal::KeccakItem<1:
3655 usize> for u64)}
3656 */
3657 /**
3658 A monomorphic instance of libcrux_sha3.portable_keccak.load_block_5a
3659 with const generics
3660 - RATE= 104
3661 */
libcrux_sha3_portable_keccak_load_block_5a_b82(uint64_t (* a)[5U],Eurydice_slice b[1U])3662 static KRML_MUSTINLINE void libcrux_sha3_portable_keccak_load_block_5a_b82(
3663 uint64_t (*a)[5U], Eurydice_slice b[1U]) {
3664 uint64_t(*uu____0)[5U] = a;
3665 /* Passing arrays by value in Rust generates a copy in C */
3666 Eurydice_slice copy_of_b[1U];
3667 memcpy(copy_of_b, b, (size_t)1U * sizeof(Eurydice_slice));
3668 libcrux_sha3_portable_keccak_load_block_2c3(uu____0, copy_of_b);
3669 }
3670
3671 /**
3672 A monomorphic instance of libcrux_sha3.generic_keccak.absorb_block
3673 with types uint64_t
3674 with const generics
3675 - N= 1
3676 - RATE= 104
3677 */
libcrux_sha3_generic_keccak_absorb_block_df2(libcrux_sha3_generic_keccak_KeccakState_48 * s,Eurydice_slice blocks[1U])3678 static KRML_MUSTINLINE void libcrux_sha3_generic_keccak_absorb_block_df2(
3679 libcrux_sha3_generic_keccak_KeccakState_48 *s, Eurydice_slice blocks[1U]) {
3680 uint64_t(*uu____0)[5U] = s->st;
3681 Eurydice_slice uu____1[1U];
3682 memcpy(uu____1, blocks, (size_t)1U * sizeof(Eurydice_slice));
3683 libcrux_sha3_portable_keccak_load_block_5a_b82(uu____0, uu____1);
3684 libcrux_sha3_generic_keccak_keccakf1600_21(s);
3685 }
3686
3687 /**
3688 A monomorphic instance of libcrux_sha3.portable_keccak.load_block_full
3689 with const generics
3690 - RATE= 104
3691 */
libcrux_sha3_portable_keccak_load_block_full_df3(uint64_t (* s)[5U],uint8_t blocks[1U][200U])3692 static KRML_MUSTINLINE void libcrux_sha3_portable_keccak_load_block_full_df3(
3693 uint64_t (*s)[5U], uint8_t blocks[1U][200U]) {
3694 Eurydice_slice buf[1U] = {
3695 Eurydice_array_to_slice((size_t)200U, blocks[0U], uint8_t)};
3696 libcrux_sha3_portable_keccak_load_block_2c3(s, buf);
3697 }
3698
3699 /**
3700 This function found in impl {(libcrux_sha3::traits::internal::KeccakItem<1:
3701 usize> for u64)}
3702 */
3703 /**
3704 A monomorphic instance of libcrux_sha3.portable_keccak.load_block_full_5a
3705 with const generics
3706 - RATE= 104
3707 */
libcrux_sha3_portable_keccak_load_block_full_5a_d23(uint64_t (* a)[5U],uint8_t b[1U][200U])3708 static KRML_MUSTINLINE void libcrux_sha3_portable_keccak_load_block_full_5a_d23(
3709 uint64_t (*a)[5U], uint8_t b[1U][200U]) {
3710 uint64_t(*uu____0)[5U] = a;
3711 /* Passing arrays by value in Rust generates a copy in C */
3712 uint8_t copy_of_b[1U][200U];
3713 memcpy(copy_of_b, b, (size_t)1U * sizeof(uint8_t[200U]));
3714 libcrux_sha3_portable_keccak_load_block_full_df3(uu____0, copy_of_b);
3715 }
3716
3717 /**
3718 A monomorphic instance of libcrux_sha3.generic_keccak.absorb_final
3719 with types uint64_t
3720 with const generics
3721 - N= 1
3722 - RATE= 104
3723 - DELIM= 6
3724 */
libcrux_sha3_generic_keccak_absorb_final_c74(libcrux_sha3_generic_keccak_KeccakState_48 * s,Eurydice_slice last[1U])3725 static KRML_MUSTINLINE void libcrux_sha3_generic_keccak_absorb_final_c74(
3726 libcrux_sha3_generic_keccak_KeccakState_48 *s, Eurydice_slice last[1U]) {
3727 size_t last_len = Eurydice_slice_len(last[0U], uint8_t);
3728 uint8_t blocks[1U][200U] = {{0U}};
3729 for (size_t i = (size_t)0U; i < (size_t)1U; i++) {
3730 size_t i0 = i;
3731 if (last_len > (size_t)0U) {
3732 Eurydice_slice uu____0 = Eurydice_array_to_subslice2(
3733 blocks[i0], (size_t)0U, last_len, uint8_t);
3734 Eurydice_slice_copy(uu____0, last[i0], uint8_t);
3735 }
3736 blocks[i0][last_len] = 6U;
3737 size_t uu____1 = i0;
3738 size_t uu____2 = (size_t)104U - (size_t)1U;
3739 blocks[uu____1][uu____2] = (uint32_t)blocks[uu____1][uu____2] | 128U;
3740 }
3741 uint64_t(*uu____3)[5U] = s->st;
3742 uint8_t uu____4[1U][200U];
3743 memcpy(uu____4, blocks, (size_t)1U * sizeof(uint8_t[200U]));
3744 libcrux_sha3_portable_keccak_load_block_full_5a_d23(uu____3, uu____4);
3745 libcrux_sha3_generic_keccak_keccakf1600_21(s);
3746 }
3747
3748 /**
3749 A monomorphic instance of libcrux_sha3.portable_keccak.store_block
3750 with const generics
3751 - RATE= 104
3752 */
libcrux_sha3_portable_keccak_store_block_583(uint64_t (* s)[5U],Eurydice_slice out[1U])3753 static KRML_MUSTINLINE void libcrux_sha3_portable_keccak_store_block_583(
3754 uint64_t (*s)[5U], Eurydice_slice out[1U]) {
3755 for (size_t i = (size_t)0U; i < (size_t)104U / (size_t)8U; i++) {
3756 size_t i0 = i;
3757 Eurydice_slice uu____0 = Eurydice_slice_subslice2(
3758 out[0U], (size_t)8U * i0, (size_t)8U * i0 + (size_t)8U, uint8_t);
3759 uint8_t ret[8U];
3760 core_num__u64_9__to_le_bytes(s[i0 / (size_t)5U][i0 % (size_t)5U], ret);
3761 Eurydice_slice_copy(
3762 uu____0, Eurydice_array_to_slice((size_t)8U, ret, uint8_t), uint8_t);
3763 }
3764 }
3765
3766 /**
3767 A monomorphic instance of libcrux_sha3.portable_keccak.store_block_full
3768 with const generics
3769 - RATE= 104
3770 */
libcrux_sha3_portable_keccak_store_block_full_2d2(uint64_t (* s)[5U],uint8_t ret[1U][200U])3771 static KRML_MUSTINLINE void libcrux_sha3_portable_keccak_store_block_full_2d2(
3772 uint64_t (*s)[5U], uint8_t ret[1U][200U]) {
3773 uint8_t out[200U] = {0U};
3774 Eurydice_slice buf[1U] = {
3775 Eurydice_array_to_slice((size_t)200U, out, uint8_t)};
3776 libcrux_sha3_portable_keccak_store_block_583(s, buf);
3777 /* Passing arrays by value in Rust generates a copy in C */
3778 uint8_t copy_of_out[200U];
3779 memcpy(copy_of_out, out, (size_t)200U * sizeof(uint8_t));
3780 memcpy(ret[0U], copy_of_out, (size_t)200U * sizeof(uint8_t));
3781 }
3782
3783 /**
3784 This function found in impl {(libcrux_sha3::traits::internal::KeccakItem<1:
3785 usize> for u64)}
3786 */
3787 /**
3788 A monomorphic instance of libcrux_sha3.portable_keccak.store_block_full_5a
3789 with const generics
3790 - RATE= 104
3791 */
3792 static KRML_MUSTINLINE void
libcrux_sha3_portable_keccak_store_block_full_5a_292(uint64_t (* a)[5U],uint8_t ret[1U][200U])3793 libcrux_sha3_portable_keccak_store_block_full_5a_292(uint64_t (*a)[5U],
3794 uint8_t ret[1U][200U]) {
3795 libcrux_sha3_portable_keccak_store_block_full_2d2(a, ret);
3796 }
3797
3798 /**
3799 A monomorphic instance of libcrux_sha3.generic_keccak.squeeze_first_and_last
3800 with types uint64_t
3801 with const generics
3802 - N= 1
3803 - RATE= 104
3804 */
3805 static KRML_MUSTINLINE void
libcrux_sha3_generic_keccak_squeeze_first_and_last_c52(libcrux_sha3_generic_keccak_KeccakState_48 * s,Eurydice_slice out[1U])3806 libcrux_sha3_generic_keccak_squeeze_first_and_last_c52(
3807 libcrux_sha3_generic_keccak_KeccakState_48 *s, Eurydice_slice out[1U]) {
3808 uint8_t b[1U][200U];
3809 libcrux_sha3_portable_keccak_store_block_full_5a_292(s->st, b);
3810 for (size_t i = (size_t)0U; i < (size_t)1U; i++) {
3811 size_t i0 = i;
3812 Eurydice_slice uu____0 = out[i0];
3813 uint8_t *uu____1 = b[i0];
3814 core_ops_range_Range_b3 lit;
3815 lit.start = (size_t)0U;
3816 lit.end = Eurydice_slice_len(out[i0], uint8_t);
3817 Eurydice_slice_copy(
3818 uu____0,
3819 Eurydice_array_to_subslice((size_t)200U, uu____1, lit, uint8_t,
3820 core_ops_range_Range_b3),
3821 uint8_t);
3822 }
3823 }
3824
3825 /**
3826 This function found in impl {(libcrux_sha3::traits::internal::KeccakItem<1:
3827 usize> for u64)}
3828 */
3829 /**
3830 A monomorphic instance of libcrux_sha3.portable_keccak.store_block_5a
3831 with const generics
3832 - RATE= 104
3833 */
libcrux_sha3_portable_keccak_store_block_5a_593(uint64_t (* a)[5U],Eurydice_slice b[1U])3834 static KRML_MUSTINLINE void libcrux_sha3_portable_keccak_store_block_5a_593(
3835 uint64_t (*a)[5U], Eurydice_slice b[1U]) {
3836 libcrux_sha3_portable_keccak_store_block_583(a, b);
3837 }
3838
3839 /**
3840 A monomorphic instance of libcrux_sha3.generic_keccak.squeeze_first_block
3841 with types uint64_t
3842 with const generics
3843 - N= 1
3844 - RATE= 104
3845 */
libcrux_sha3_generic_keccak_squeeze_first_block_843(libcrux_sha3_generic_keccak_KeccakState_48 * s,Eurydice_slice out[1U])3846 static KRML_MUSTINLINE void libcrux_sha3_generic_keccak_squeeze_first_block_843(
3847 libcrux_sha3_generic_keccak_KeccakState_48 *s, Eurydice_slice out[1U]) {
3848 libcrux_sha3_portable_keccak_store_block_5a_593(s->st, out);
3849 }
3850
3851 /**
3852 A monomorphic instance of libcrux_sha3.generic_keccak.squeeze_next_block
3853 with types uint64_t
3854 with const generics
3855 - N= 1
3856 - RATE= 104
3857 */
libcrux_sha3_generic_keccak_squeeze_next_block_fc3(libcrux_sha3_generic_keccak_KeccakState_48 * s,Eurydice_slice out[1U])3858 static KRML_MUSTINLINE void libcrux_sha3_generic_keccak_squeeze_next_block_fc3(
3859 libcrux_sha3_generic_keccak_KeccakState_48 *s, Eurydice_slice out[1U]) {
3860 libcrux_sha3_generic_keccak_keccakf1600_21(s);
3861 libcrux_sha3_portable_keccak_store_block_5a_593(s->st, out);
3862 }
3863
3864 /**
3865 A monomorphic instance of libcrux_sha3.generic_keccak.squeeze_last
3866 with types uint64_t
3867 with const generics
3868 - N= 1
3869 - RATE= 104
3870 */
libcrux_sha3_generic_keccak_squeeze_last_cf2(libcrux_sha3_generic_keccak_KeccakState_48 s,Eurydice_slice out[1U])3871 static KRML_MUSTINLINE void libcrux_sha3_generic_keccak_squeeze_last_cf2(
3872 libcrux_sha3_generic_keccak_KeccakState_48 s, Eurydice_slice out[1U]) {
3873 libcrux_sha3_generic_keccak_keccakf1600_21(&s);
3874 uint8_t b[1U][200U];
3875 libcrux_sha3_portable_keccak_store_block_full_5a_292(s.st, b);
3876 for (size_t i = (size_t)0U; i < (size_t)1U; i++) {
3877 size_t i0 = i;
3878 Eurydice_slice uu____0 = out[i0];
3879 uint8_t *uu____1 = b[i0];
3880 core_ops_range_Range_b3 lit;
3881 lit.start = (size_t)0U;
3882 lit.end = Eurydice_slice_len(out[i0], uint8_t);
3883 Eurydice_slice_copy(
3884 uu____0,
3885 Eurydice_array_to_subslice((size_t)200U, uu____1, lit, uint8_t,
3886 core_ops_range_Range_b3),
3887 uint8_t);
3888 }
3889 }
3890
3891 /**
3892 A monomorphic instance of libcrux_sha3.generic_keccak.keccak
3893 with types uint64_t
3894 with const generics
3895 - N= 1
3896 - RATE= 104
3897 - DELIM= 6
3898 */
libcrux_sha3_generic_keccak_keccak_e93(Eurydice_slice data[1U],Eurydice_slice out[1U])3899 static KRML_MUSTINLINE void libcrux_sha3_generic_keccak_keccak_e93(
3900 Eurydice_slice data[1U], Eurydice_slice out[1U]) {
3901 libcrux_sha3_generic_keccak_KeccakState_48 s =
3902 libcrux_sha3_generic_keccak_new_1e_f4();
3903 for (size_t i = (size_t)0U;
3904 i < Eurydice_slice_len(data[0U], uint8_t) / (size_t)104U; i++) {
3905 size_t i0 = i;
3906 libcrux_sha3_generic_keccak_KeccakState_48 *uu____0 = &s;
3907 /* Passing arrays by value in Rust generates a copy in C */
3908 Eurydice_slice copy_of_data[1U];
3909 memcpy(copy_of_data, data, (size_t)1U * sizeof(Eurydice_slice));
3910 Eurydice_slice ret[1U];
3911 libcrux_sha3_portable_keccak_slice_n_5a(copy_of_data, i0 * (size_t)104U,
3912 (size_t)104U, ret);
3913 libcrux_sha3_generic_keccak_absorb_block_df2(uu____0, ret);
3914 }
3915 size_t rem = Eurydice_slice_len(data[0U], uint8_t) % (size_t)104U;
3916 libcrux_sha3_generic_keccak_KeccakState_48 *uu____2 = &s;
3917 /* Passing arrays by value in Rust generates a copy in C */
3918 Eurydice_slice copy_of_data[1U];
3919 memcpy(copy_of_data, data, (size_t)1U * sizeof(Eurydice_slice));
3920 Eurydice_slice ret[1U];
3921 libcrux_sha3_portable_keccak_slice_n_5a(
3922 copy_of_data, Eurydice_slice_len(data[0U], uint8_t) - rem, rem, ret);
3923 libcrux_sha3_generic_keccak_absorb_final_c74(uu____2, ret);
3924 size_t outlen = Eurydice_slice_len(out[0U], uint8_t);
3925 size_t blocks = outlen / (size_t)104U;
3926 size_t last = outlen - outlen % (size_t)104U;
3927 if (blocks == (size_t)0U) {
3928 libcrux_sha3_generic_keccak_squeeze_first_and_last_c52(&s, out);
3929 } else {
3930 Eurydice_slice_uint8_t_1size_t__x2 uu____4 =
3931 libcrux_sha3_portable_keccak_split_at_mut_n_5a(out, (size_t)104U);
3932 Eurydice_slice o0[1U];
3933 memcpy(o0, uu____4.fst, (size_t)1U * sizeof(Eurydice_slice));
3934 Eurydice_slice o1[1U];
3935 memcpy(o1, uu____4.snd, (size_t)1U * sizeof(Eurydice_slice));
3936 libcrux_sha3_generic_keccak_squeeze_first_block_843(&s, o0);
3937 core_ops_range_Range_b3 iter =
3938 core_iter_traits_collect___core__iter__traits__collect__IntoIterator_for_I__1__into_iter(
3939 (CLITERAL(core_ops_range_Range_b3){.start = (size_t)1U,
3940 .end = blocks}),
3941 core_ops_range_Range_b3, core_ops_range_Range_b3);
3942 while (true) {
3943 if (core_iter_range___core__iter__traits__iterator__Iterator_for_core__ops__range__Range_A___6__next(
3944 &iter, size_t, Option_b3)
3945 .tag == None) {
3946 break;
3947 } else {
3948 Eurydice_slice_uint8_t_1size_t__x2 uu____5 =
3949 libcrux_sha3_portable_keccak_split_at_mut_n_5a(o1, (size_t)104U);
3950 Eurydice_slice o[1U];
3951 memcpy(o, uu____5.fst, (size_t)1U * sizeof(Eurydice_slice));
3952 Eurydice_slice orest[1U];
3953 memcpy(orest, uu____5.snd, (size_t)1U * sizeof(Eurydice_slice));
3954 libcrux_sha3_generic_keccak_squeeze_next_block_fc3(&s, o);
3955 memcpy(o1, orest, (size_t)1U * sizeof(Eurydice_slice));
3956 }
3957 }
3958 if (last < outlen) {
3959 libcrux_sha3_generic_keccak_squeeze_last_cf2(s, o1);
3960 }
3961 }
3962 }
3963
3964 /**
3965 A monomorphic instance of libcrux_sha3.portable.keccakx1
3966 with const generics
3967 - RATE= 104
3968 - DELIM= 6
3969 */
libcrux_sha3_portable_keccakx1_ce3(Eurydice_slice data[1U],Eurydice_slice out[1U])3970 static KRML_MUSTINLINE void libcrux_sha3_portable_keccakx1_ce3(
3971 Eurydice_slice data[1U], Eurydice_slice out[1U]) {
3972 /* Passing arrays by value in Rust generates a copy in C */
3973 Eurydice_slice copy_of_data[1U];
3974 memcpy(copy_of_data, data, (size_t)1U * sizeof(Eurydice_slice));
3975 libcrux_sha3_generic_keccak_keccak_e93(copy_of_data, out);
3976 }
3977
3978 /**
3979 A portable SHA3 384 implementation.
3980 */
libcrux_sha3_portable_sha384(Eurydice_slice digest,Eurydice_slice data)3981 static KRML_MUSTINLINE void libcrux_sha3_portable_sha384(Eurydice_slice digest,
3982 Eurydice_slice data) {
3983 Eurydice_slice buf0[1U] = {data};
3984 Eurydice_slice buf[1U] = {digest};
3985 libcrux_sha3_portable_keccakx1_ce3(buf0, buf);
3986 }
3987
3988 /**
3989 SHA3 224
3990
3991 Preconditions:
3992 - `digest.len() == 28`
3993 */
libcrux_sha3_sha224_ema(Eurydice_slice digest,Eurydice_slice payload)3994 static KRML_MUSTINLINE void libcrux_sha3_sha224_ema(Eurydice_slice digest,
3995 Eurydice_slice payload) {
3996 libcrux_sha3_portable_sha224(digest, payload);
3997 }
3998
3999 /**
4000 SHA3 224
4001 */
libcrux_sha3_sha224(Eurydice_slice data,uint8_t ret[28U])4002 static KRML_MUSTINLINE void libcrux_sha3_sha224(Eurydice_slice data,
4003 uint8_t ret[28U]) {
4004 uint8_t out[28U] = {0U};
4005 libcrux_sha3_sha224_ema(Eurydice_array_to_slice((size_t)28U, out, uint8_t),
4006 data);
4007 memcpy(ret, out, (size_t)28U * sizeof(uint8_t));
4008 }
4009
4010 /**
4011 SHA3 256
4012 */
libcrux_sha3_sha256_ema(Eurydice_slice digest,Eurydice_slice payload)4013 static KRML_MUSTINLINE void libcrux_sha3_sha256_ema(Eurydice_slice digest,
4014 Eurydice_slice payload) {
4015 libcrux_sha3_portable_sha256(digest, payload);
4016 }
4017
4018 /**
4019 SHA3 256
4020 */
libcrux_sha3_sha256(Eurydice_slice data,uint8_t ret[32U])4021 static KRML_MUSTINLINE void libcrux_sha3_sha256(Eurydice_slice data,
4022 uint8_t ret[32U]) {
4023 uint8_t out[32U] = {0U};
4024 libcrux_sha3_sha256_ema(Eurydice_array_to_slice((size_t)32U, out, uint8_t),
4025 data);
4026 memcpy(ret, out, (size_t)32U * sizeof(uint8_t));
4027 }
4028
4029 /**
4030 SHA3 384
4031 */
libcrux_sha3_sha384_ema(Eurydice_slice digest,Eurydice_slice payload)4032 static KRML_MUSTINLINE void libcrux_sha3_sha384_ema(Eurydice_slice digest,
4033 Eurydice_slice payload) {
4034 libcrux_sha3_portable_sha384(digest, payload);
4035 }
4036
4037 /**
4038 SHA3 384
4039 */
libcrux_sha3_sha384(Eurydice_slice data,uint8_t ret[48U])4040 static KRML_MUSTINLINE void libcrux_sha3_sha384(Eurydice_slice data,
4041 uint8_t ret[48U]) {
4042 uint8_t out[48U] = {0U};
4043 libcrux_sha3_sha384_ema(Eurydice_array_to_slice((size_t)48U, out, uint8_t),
4044 data);
4045 memcpy(ret, out, (size_t)48U * sizeof(uint8_t));
4046 }
4047
4048 /**
4049 SHA3 512
4050 */
libcrux_sha3_sha512_ema(Eurydice_slice digest,Eurydice_slice payload)4051 static KRML_MUSTINLINE void libcrux_sha3_sha512_ema(Eurydice_slice digest,
4052 Eurydice_slice payload) {
4053 libcrux_sha3_portable_sha512(digest, payload);
4054 }
4055
4056 /**
4057 SHA3 512
4058 */
libcrux_sha3_sha512(Eurydice_slice data,uint8_t ret[64U])4059 static KRML_MUSTINLINE void libcrux_sha3_sha512(Eurydice_slice data,
4060 uint8_t ret[64U]) {
4061 uint8_t out[64U] = {0U};
4062 libcrux_sha3_sha512_ema(Eurydice_array_to_slice((size_t)64U, out, uint8_t),
4063 data);
4064 memcpy(ret, out, (size_t)64U * sizeof(uint8_t));
4065 }
4066
4067 /**
4068 This function found in impl {(libcrux_sha3::traits::internal::KeccakItem<1:
4069 usize> for u64)}
4070 */
4071 /**
4072 A monomorphic instance of libcrux_sha3.portable_keccak.load_block_5a
4073 with const generics
4074 - RATE= 168
4075 */
libcrux_sha3_portable_keccak_load_block_5a_b83(uint64_t (* a)[5U],Eurydice_slice b[1U])4076 static KRML_MUSTINLINE void libcrux_sha3_portable_keccak_load_block_5a_b83(
4077 uint64_t (*a)[5U], Eurydice_slice b[1U]) {
4078 uint64_t(*uu____0)[5U] = a;
4079 /* Passing arrays by value in Rust generates a copy in C */
4080 Eurydice_slice copy_of_b[1U];
4081 memcpy(copy_of_b, b, (size_t)1U * sizeof(Eurydice_slice));
4082 libcrux_sha3_portable_keccak_load_block_2c1(uu____0, copy_of_b);
4083 }
4084
4085 /**
4086 A monomorphic instance of libcrux_sha3.generic_keccak.absorb_block
4087 with types uint64_t
4088 with const generics
4089 - N= 1
4090 - RATE= 168
4091 */
libcrux_sha3_generic_keccak_absorb_block_df3(libcrux_sha3_generic_keccak_KeccakState_48 * s,Eurydice_slice blocks[1U])4092 static KRML_MUSTINLINE void libcrux_sha3_generic_keccak_absorb_block_df3(
4093 libcrux_sha3_generic_keccak_KeccakState_48 *s, Eurydice_slice blocks[1U]) {
4094 uint64_t(*uu____0)[5U] = s->st;
4095 Eurydice_slice uu____1[1U];
4096 memcpy(uu____1, blocks, (size_t)1U * sizeof(Eurydice_slice));
4097 libcrux_sha3_portable_keccak_load_block_5a_b83(uu____0, uu____1);
4098 libcrux_sha3_generic_keccak_keccakf1600_21(s);
4099 }
4100
4101 /**
4102 A monomorphic instance of libcrux_sha3.portable_keccak.store_block_full
4103 with const generics
4104 - RATE= 168
4105 */
libcrux_sha3_portable_keccak_store_block_full_2d3(uint64_t (* s)[5U],uint8_t ret[1U][200U])4106 static KRML_MUSTINLINE void libcrux_sha3_portable_keccak_store_block_full_2d3(
4107 uint64_t (*s)[5U], uint8_t ret[1U][200U]) {
4108 uint8_t out[200U] = {0U};
4109 Eurydice_slice buf[1U] = {
4110 Eurydice_array_to_slice((size_t)200U, out, uint8_t)};
4111 libcrux_sha3_portable_keccak_store_block_581(s, buf);
4112 /* Passing arrays by value in Rust generates a copy in C */
4113 uint8_t copy_of_out[200U];
4114 memcpy(copy_of_out, out, (size_t)200U * sizeof(uint8_t));
4115 memcpy(ret[0U], copy_of_out, (size_t)200U * sizeof(uint8_t));
4116 }
4117
4118 /**
4119 This function found in impl {(libcrux_sha3::traits::internal::KeccakItem<1:
4120 usize> for u64)}
4121 */
4122 /**
4123 A monomorphic instance of libcrux_sha3.portable_keccak.store_block_full_5a
4124 with const generics
4125 - RATE= 168
4126 */
4127 static KRML_MUSTINLINE void
libcrux_sha3_portable_keccak_store_block_full_5a_293(uint64_t (* a)[5U],uint8_t ret[1U][200U])4128 libcrux_sha3_portable_keccak_store_block_full_5a_293(uint64_t (*a)[5U],
4129 uint8_t ret[1U][200U]) {
4130 libcrux_sha3_portable_keccak_store_block_full_2d3(a, ret);
4131 }
4132
4133 /**
4134 A monomorphic instance of libcrux_sha3.generic_keccak.squeeze_first_and_last
4135 with types uint64_t
4136 with const generics
4137 - N= 1
4138 - RATE= 168
4139 */
4140 static KRML_MUSTINLINE void
libcrux_sha3_generic_keccak_squeeze_first_and_last_c53(libcrux_sha3_generic_keccak_KeccakState_48 * s,Eurydice_slice out[1U])4141 libcrux_sha3_generic_keccak_squeeze_first_and_last_c53(
4142 libcrux_sha3_generic_keccak_KeccakState_48 *s, Eurydice_slice out[1U]) {
4143 uint8_t b[1U][200U];
4144 libcrux_sha3_portable_keccak_store_block_full_5a_293(s->st, b);
4145 for (size_t i = (size_t)0U; i < (size_t)1U; i++) {
4146 size_t i0 = i;
4147 Eurydice_slice uu____0 = out[i0];
4148 uint8_t *uu____1 = b[i0];
4149 core_ops_range_Range_b3 lit;
4150 lit.start = (size_t)0U;
4151 lit.end = Eurydice_slice_len(out[i0], uint8_t);
4152 Eurydice_slice_copy(
4153 uu____0,
4154 Eurydice_array_to_subslice((size_t)200U, uu____1, lit, uint8_t,
4155 core_ops_range_Range_b3),
4156 uint8_t);
4157 }
4158 }
4159
4160 /**
4161 A monomorphic instance of libcrux_sha3.generic_keccak.squeeze_last
4162 with types uint64_t
4163 with const generics
4164 - N= 1
4165 - RATE= 168
4166 */
libcrux_sha3_generic_keccak_squeeze_last_cf3(libcrux_sha3_generic_keccak_KeccakState_48 s,Eurydice_slice out[1U])4167 static KRML_MUSTINLINE void libcrux_sha3_generic_keccak_squeeze_last_cf3(
4168 libcrux_sha3_generic_keccak_KeccakState_48 s, Eurydice_slice out[1U]) {
4169 libcrux_sha3_generic_keccak_keccakf1600_21(&s);
4170 uint8_t b[1U][200U];
4171 libcrux_sha3_portable_keccak_store_block_full_5a_293(s.st, b);
4172 for (size_t i = (size_t)0U; i < (size_t)1U; i++) {
4173 size_t i0 = i;
4174 Eurydice_slice uu____0 = out[i0];
4175 uint8_t *uu____1 = b[i0];
4176 core_ops_range_Range_b3 lit;
4177 lit.start = (size_t)0U;
4178 lit.end = Eurydice_slice_len(out[i0], uint8_t);
4179 Eurydice_slice_copy(
4180 uu____0,
4181 Eurydice_array_to_subslice((size_t)200U, uu____1, lit, uint8_t,
4182 core_ops_range_Range_b3),
4183 uint8_t);
4184 }
4185 }
4186
4187 /**
4188 A monomorphic instance of libcrux_sha3.generic_keccak.keccak
4189 with types uint64_t
4190 with const generics
4191 - N= 1
4192 - RATE= 168
4193 - DELIM= 31
4194 */
libcrux_sha3_generic_keccak_keccak_e94(Eurydice_slice data[1U],Eurydice_slice out[1U])4195 static KRML_MUSTINLINE void libcrux_sha3_generic_keccak_keccak_e94(
4196 Eurydice_slice data[1U], Eurydice_slice out[1U]) {
4197 libcrux_sha3_generic_keccak_KeccakState_48 s =
4198 libcrux_sha3_generic_keccak_new_1e_f4();
4199 for (size_t i = (size_t)0U;
4200 i < Eurydice_slice_len(data[0U], uint8_t) / (size_t)168U; i++) {
4201 size_t i0 = i;
4202 libcrux_sha3_generic_keccak_KeccakState_48 *uu____0 = &s;
4203 /* Passing arrays by value in Rust generates a copy in C */
4204 Eurydice_slice copy_of_data[1U];
4205 memcpy(copy_of_data, data, (size_t)1U * sizeof(Eurydice_slice));
4206 Eurydice_slice ret[1U];
4207 libcrux_sha3_portable_keccak_slice_n_5a(copy_of_data, i0 * (size_t)168U,
4208 (size_t)168U, ret);
4209 libcrux_sha3_generic_keccak_absorb_block_df3(uu____0, ret);
4210 }
4211 size_t rem = Eurydice_slice_len(data[0U], uint8_t) % (size_t)168U;
4212 libcrux_sha3_generic_keccak_KeccakState_48 *uu____2 = &s;
4213 /* Passing arrays by value in Rust generates a copy in C */
4214 Eurydice_slice copy_of_data[1U];
4215 memcpy(copy_of_data, data, (size_t)1U * sizeof(Eurydice_slice));
4216 Eurydice_slice ret[1U];
4217 libcrux_sha3_portable_keccak_slice_n_5a(
4218 copy_of_data, Eurydice_slice_len(data[0U], uint8_t) - rem, rem, ret);
4219 libcrux_sha3_generic_keccak_absorb_final_c72(uu____2, ret);
4220 size_t outlen = Eurydice_slice_len(out[0U], uint8_t);
4221 size_t blocks = outlen / (size_t)168U;
4222 size_t last = outlen - outlen % (size_t)168U;
4223 if (blocks == (size_t)0U) {
4224 libcrux_sha3_generic_keccak_squeeze_first_and_last_c53(&s, out);
4225 } else {
4226 Eurydice_slice_uint8_t_1size_t__x2 uu____4 =
4227 libcrux_sha3_portable_keccak_split_at_mut_n_5a(out, (size_t)168U);
4228 Eurydice_slice o0[1U];
4229 memcpy(o0, uu____4.fst, (size_t)1U * sizeof(Eurydice_slice));
4230 Eurydice_slice o1[1U];
4231 memcpy(o1, uu____4.snd, (size_t)1U * sizeof(Eurydice_slice));
4232 libcrux_sha3_generic_keccak_squeeze_first_block_841(&s, o0);
4233 core_ops_range_Range_b3 iter =
4234 core_iter_traits_collect___core__iter__traits__collect__IntoIterator_for_I__1__into_iter(
4235 (CLITERAL(core_ops_range_Range_b3){.start = (size_t)1U,
4236 .end = blocks}),
4237 core_ops_range_Range_b3, core_ops_range_Range_b3);
4238 while (true) {
4239 if (core_iter_range___core__iter__traits__iterator__Iterator_for_core__ops__range__Range_A___6__next(
4240 &iter, size_t, Option_b3)
4241 .tag == None) {
4242 break;
4243 } else {
4244 Eurydice_slice_uint8_t_1size_t__x2 uu____5 =
4245 libcrux_sha3_portable_keccak_split_at_mut_n_5a(o1, (size_t)168U);
4246 Eurydice_slice o[1U];
4247 memcpy(o, uu____5.fst, (size_t)1U * sizeof(Eurydice_slice));
4248 Eurydice_slice orest[1U];
4249 memcpy(orest, uu____5.snd, (size_t)1U * sizeof(Eurydice_slice));
4250 libcrux_sha3_generic_keccak_squeeze_next_block_fc1(&s, o);
4251 memcpy(o1, orest, (size_t)1U * sizeof(Eurydice_slice));
4252 }
4253 }
4254 if (last < outlen) {
4255 libcrux_sha3_generic_keccak_squeeze_last_cf3(s, o1);
4256 }
4257 }
4258 }
4259
4260 /**
4261 A monomorphic instance of libcrux_sha3.portable.keccakx1
4262 with const generics
4263 - RATE= 168
4264 - DELIM= 31
4265 */
libcrux_sha3_portable_keccakx1_ce4(Eurydice_slice data[1U],Eurydice_slice out[1U])4266 static KRML_MUSTINLINE void libcrux_sha3_portable_keccakx1_ce4(
4267 Eurydice_slice data[1U], Eurydice_slice out[1U]) {
4268 /* Passing arrays by value in Rust generates a copy in C */
4269 Eurydice_slice copy_of_data[1U];
4270 memcpy(copy_of_data, data, (size_t)1U * sizeof(Eurydice_slice));
4271 libcrux_sha3_generic_keccak_keccak_e94(copy_of_data, out);
4272 }
4273
4274 /**
4275 A portable SHAKE128 implementation.
4276 */
libcrux_sha3_portable_shake128(Eurydice_slice digest,Eurydice_slice data)4277 static KRML_MUSTINLINE void libcrux_sha3_portable_shake128(
4278 Eurydice_slice digest, Eurydice_slice data) {
4279 Eurydice_slice buf0[1U] = {data};
4280 Eurydice_slice buf[1U] = {digest};
4281 libcrux_sha3_portable_keccakx1_ce4(buf0, buf);
4282 }
4283
4284 /**
4285 SHAKE 128
4286
4287 Writes `out.len()` bytes.
4288 */
libcrux_sha3_shake128_ema(Eurydice_slice out,Eurydice_slice data)4289 static KRML_MUSTINLINE void libcrux_sha3_shake128_ema(Eurydice_slice out,
4290 Eurydice_slice data) {
4291 libcrux_sha3_portable_shake128(out, data);
4292 }
4293
4294 /**
4295 SHAKE 256
4296
4297 Writes `out.len()` bytes.
4298 */
libcrux_sha3_shake256_ema(Eurydice_slice out,Eurydice_slice data)4299 static KRML_MUSTINLINE void libcrux_sha3_shake256_ema(Eurydice_slice out,
4300 Eurydice_slice data) {
4301 libcrux_sha3_portable_shake256(out, data);
4302 }
4303
4304 static const size_t libcrux_sha3_generic_keccak__PI[24U] = {
4305 (size_t)6U, (size_t)12U, (size_t)18U, (size_t)24U, (size_t)3U,
4306 (size_t)9U, (size_t)10U, (size_t)16U, (size_t)22U, (size_t)1U,
4307 (size_t)7U, (size_t)13U, (size_t)19U, (size_t)20U, (size_t)4U,
4308 (size_t)5U, (size_t)11U, (size_t)17U, (size_t)23U, (size_t)2U,
4309 (size_t)8U, (size_t)14U, (size_t)15U, (size_t)21U};
4310
4311 static const size_t libcrux_sha3_generic_keccak__ROTC[24U] = {
4312 (size_t)1U, (size_t)62U, (size_t)28U, (size_t)27U, (size_t)36U,
4313 (size_t)44U, (size_t)6U, (size_t)55U, (size_t)20U, (size_t)3U,
4314 (size_t)10U, (size_t)43U, (size_t)25U, (size_t)39U, (size_t)41U,
4315 (size_t)45U, (size_t)15U, (size_t)21U, (size_t)8U, (size_t)18U,
4316 (size_t)2U, (size_t)61U, (size_t)56U, (size_t)14U};
4317
4318 /**
4319 A portable SHA3 224 implementation.
4320 */
libcrux_sha3_neon_sha224(Eurydice_slice digest,Eurydice_slice data)4321 static KRML_MUSTINLINE void libcrux_sha3_neon_sha224(Eurydice_slice digest,
4322 Eurydice_slice data) {
4323 KRML_HOST_EPRINTF("KaRaMeL abort at %s:%d\n%s\n", __FILE__, __LINE__,
4324 "panic!");
4325 KRML_HOST_EXIT(255U);
4326 }
4327
4328 /**
4329 A portable SHA3 256 implementation.
4330 */
libcrux_sha3_neon_sha256(Eurydice_slice digest,Eurydice_slice data)4331 static KRML_MUSTINLINE void libcrux_sha3_neon_sha256(Eurydice_slice digest,
4332 Eurydice_slice data) {
4333 KRML_HOST_EPRINTF("KaRaMeL abort at %s:%d\n%s\n", __FILE__, __LINE__,
4334 "panic!");
4335 KRML_HOST_EXIT(255U);
4336 }
4337
4338 /**
4339 A portable SHA3 384 implementation.
4340 */
libcrux_sha3_neon_sha384(Eurydice_slice digest,Eurydice_slice data)4341 static KRML_MUSTINLINE void libcrux_sha3_neon_sha384(Eurydice_slice digest,
4342 Eurydice_slice data) {
4343 KRML_HOST_EPRINTF("KaRaMeL abort at %s:%d\n%s\n", __FILE__, __LINE__,
4344 "panic!");
4345 KRML_HOST_EXIT(255U);
4346 }
4347
4348 /**
4349 A portable SHA3 512 implementation.
4350 */
libcrux_sha3_neon_sha512(Eurydice_slice digest,Eurydice_slice data)4351 static KRML_MUSTINLINE void libcrux_sha3_neon_sha512(Eurydice_slice digest,
4352 Eurydice_slice data) {
4353 KRML_HOST_EPRINTF("KaRaMeL abort at %s:%d\n%s\n", __FILE__, __LINE__,
4354 "panic!");
4355 KRML_HOST_EXIT(255U);
4356 }
4357
4358 /**
4359 Run SHAKE256 on both inputs in parallel.
4360
4361 Writes the two results into `out0` and `out1`
4362 */
libcrux_sha3_neon_x2_shake256(Eurydice_slice input0,Eurydice_slice input1,Eurydice_slice out0,Eurydice_slice out1)4363 static KRML_MUSTINLINE void libcrux_sha3_neon_x2_shake256(Eurydice_slice input0,
4364 Eurydice_slice input1,
4365 Eurydice_slice out0,
4366 Eurydice_slice out1) {
4367 KRML_HOST_EPRINTF("KaRaMeL abort at %s:%d\n%s\n", __FILE__, __LINE__,
4368 "panic!");
4369 KRML_HOST_EXIT(255U);
4370 }
4371
4372 typedef struct libcrux_sha3_neon_x2_incremental_KeccakState_s {
4373 libcrux_sha3_generic_keccak_KeccakState_48 state[2U];
4374 } libcrux_sha3_neon_x2_incremental_KeccakState;
4375
4376 /**
4377 Initialise the `KeccakState2`.
4378 */
4379 static KRML_MUSTINLINE libcrux_sha3_neon_x2_incremental_KeccakState
libcrux_sha3_neon_x2_incremental_shake128_init(void)4380 libcrux_sha3_neon_x2_incremental_shake128_init(void) {
4381 KRML_HOST_EPRINTF("KaRaMeL abort at %s:%d\n%s\n", __FILE__, __LINE__,
4382 "panic!");
4383 KRML_HOST_EXIT(255U);
4384 }
4385
4386 /**
4387 Shake128 absorb `data0` and `data1` in the [`KeccakState`] `s`.
4388 */
4389 static KRML_MUSTINLINE void
libcrux_sha3_neon_x2_incremental_shake128_absorb_final(libcrux_sha3_neon_x2_incremental_KeccakState * s,Eurydice_slice data0,Eurydice_slice data1)4390 libcrux_sha3_neon_x2_incremental_shake128_absorb_final(
4391 libcrux_sha3_neon_x2_incremental_KeccakState *s, Eurydice_slice data0,
4392 Eurydice_slice data1) {
4393 KRML_HOST_EPRINTF("KaRaMeL abort at %s:%d\n%s\n", __FILE__, __LINE__,
4394 "panic!");
4395 KRML_HOST_EXIT(255U);
4396 }
4397
4398 /**
4399 Squeeze 2 times the first three blocks in parallel in the
4400 [`KeccakState`] and return the output in `out0` and `out1`.
4401 */
4402 static KRML_MUSTINLINE void
libcrux_sha3_neon_x2_incremental_shake128_squeeze_first_three_blocks(libcrux_sha3_neon_x2_incremental_KeccakState * s,Eurydice_slice out0,Eurydice_slice out1)4403 libcrux_sha3_neon_x2_incremental_shake128_squeeze_first_three_blocks(
4404 libcrux_sha3_neon_x2_incremental_KeccakState *s, Eurydice_slice out0,
4405 Eurydice_slice out1) {
4406 KRML_HOST_EPRINTF("KaRaMeL abort at %s:%d\n%s\n", __FILE__, __LINE__,
4407 "panic!");
4408 KRML_HOST_EXIT(255U);
4409 }
4410
4411 /**
4412 Squeeze 2 times the next block in parallel in the
4413 [`KeccakState`] and return the output in `out0` and `out1`.
4414 */
4415 static KRML_MUSTINLINE void
libcrux_sha3_neon_x2_incremental_shake128_squeeze_next_block(libcrux_sha3_neon_x2_incremental_KeccakState * s,Eurydice_slice out0,Eurydice_slice out1)4416 libcrux_sha3_neon_x2_incremental_shake128_squeeze_next_block(
4417 libcrux_sha3_neon_x2_incremental_KeccakState *s, Eurydice_slice out0,
4418 Eurydice_slice out1) {
4419 KRML_HOST_EPRINTF("KaRaMeL abort at %s:%d\n%s\n", __FILE__, __LINE__,
4420 "panic!");
4421 KRML_HOST_EXIT(255U);
4422 }
4423
4424 /**
4425 A monomorphic instance of libcrux_sha3.generic_keccak.squeeze_first_five_blocks
4426 with types uint64_t
4427 with const generics
4428 - N= 1
4429 - RATE= 168
4430 */
4431 static KRML_MUSTINLINE void
libcrux_sha3_generic_keccak_squeeze_first_five_blocks_4f(libcrux_sha3_generic_keccak_KeccakState_48 * s,Eurydice_slice out[1U])4432 libcrux_sha3_generic_keccak_squeeze_first_five_blocks_4f(
4433 libcrux_sha3_generic_keccak_KeccakState_48 *s, Eurydice_slice out[1U]) {
4434 Eurydice_slice_uint8_t_1size_t__x2 uu____0 =
4435 libcrux_sha3_portable_keccak_split_at_mut_n_5a(out, (size_t)168U);
4436 Eurydice_slice o0[1U];
4437 memcpy(o0, uu____0.fst, (size_t)1U * sizeof(Eurydice_slice));
4438 Eurydice_slice o10[1U];
4439 memcpy(o10, uu____0.snd, (size_t)1U * sizeof(Eurydice_slice));
4440 libcrux_sha3_generic_keccak_squeeze_first_block_841(s, o0);
4441 Eurydice_slice_uint8_t_1size_t__x2 uu____1 =
4442 libcrux_sha3_portable_keccak_split_at_mut_n_5a(o10, (size_t)168U);
4443 Eurydice_slice o1[1U];
4444 memcpy(o1, uu____1.fst, (size_t)1U * sizeof(Eurydice_slice));
4445 Eurydice_slice o20[1U];
4446 memcpy(o20, uu____1.snd, (size_t)1U * sizeof(Eurydice_slice));
4447 libcrux_sha3_generic_keccak_squeeze_next_block_fc1(s, o1);
4448 Eurydice_slice_uint8_t_1size_t__x2 uu____2 =
4449 libcrux_sha3_portable_keccak_split_at_mut_n_5a(o20, (size_t)168U);
4450 Eurydice_slice o2[1U];
4451 memcpy(o2, uu____2.fst, (size_t)1U * sizeof(Eurydice_slice));
4452 Eurydice_slice o30[1U];
4453 memcpy(o30, uu____2.snd, (size_t)1U * sizeof(Eurydice_slice));
4454 libcrux_sha3_generic_keccak_squeeze_next_block_fc1(s, o2);
4455 Eurydice_slice_uint8_t_1size_t__x2 uu____3 =
4456 libcrux_sha3_portable_keccak_split_at_mut_n_5a(o30, (size_t)168U);
4457 Eurydice_slice o3[1U];
4458 memcpy(o3, uu____3.fst, (size_t)1U * sizeof(Eurydice_slice));
4459 Eurydice_slice o4[1U];
4460 memcpy(o4, uu____3.snd, (size_t)1U * sizeof(Eurydice_slice));
4461 libcrux_sha3_generic_keccak_squeeze_next_block_fc1(s, o3);
4462 libcrux_sha3_generic_keccak_squeeze_next_block_fc1(s, o4);
4463 }
4464
4465 /**
4466 Squeeze five blocks
4467 */
4468 static KRML_MUSTINLINE void
libcrux_sha3_portable_incremental_shake128_squeeze_first_five_blocks(libcrux_sha3_generic_keccak_KeccakState_48 * s,Eurydice_slice out0)4469 libcrux_sha3_portable_incremental_shake128_squeeze_first_five_blocks(
4470 libcrux_sha3_generic_keccak_KeccakState_48 *s, Eurydice_slice out0) {
4471 Eurydice_slice buf[1U] = {out0};
4472 libcrux_sha3_generic_keccak_squeeze_first_five_blocks_4f(s, buf);
4473 }
4474
4475 /**
4476 Absorb some data for SHAKE-256 for the last time
4477 */
4478 static KRML_MUSTINLINE void
libcrux_sha3_portable_incremental_shake256_absorb_final(libcrux_sha3_generic_keccak_KeccakState_48 * s,Eurydice_slice data)4479 libcrux_sha3_portable_incremental_shake256_absorb_final(
4480 libcrux_sha3_generic_keccak_KeccakState_48 *s, Eurydice_slice data) {
4481 Eurydice_slice buf[1U] = {data};
4482 libcrux_sha3_generic_keccak_absorb_final_c71(s, buf);
4483 }
4484
4485 /**
4486 Create a new SHAKE-256 state object.
4487 */
4488 static KRML_MUSTINLINE libcrux_sha3_generic_keccak_KeccakState_48
libcrux_sha3_portable_incremental_shake256_init(void)4489 libcrux_sha3_portable_incremental_shake256_init(void) {
4490 return libcrux_sha3_generic_keccak_new_1e_f4();
4491 }
4492
4493 /**
4494 Squeeze the first SHAKE-256 block
4495 */
4496 static KRML_MUSTINLINE void
libcrux_sha3_portable_incremental_shake256_squeeze_first_block(libcrux_sha3_generic_keccak_KeccakState_48 * s,Eurydice_slice out)4497 libcrux_sha3_portable_incremental_shake256_squeeze_first_block(
4498 libcrux_sha3_generic_keccak_KeccakState_48 *s, Eurydice_slice out) {
4499 Eurydice_slice buf[1U] = {out};
4500 libcrux_sha3_generic_keccak_squeeze_first_block_840(s, buf);
4501 }
4502
4503 /**
4504 Squeeze the next SHAKE-256 block
4505 */
4506 static KRML_MUSTINLINE void
libcrux_sha3_portable_incremental_shake256_squeeze_next_block(libcrux_sha3_generic_keccak_KeccakState_48 * s,Eurydice_slice out)4507 libcrux_sha3_portable_incremental_shake256_squeeze_next_block(
4508 libcrux_sha3_generic_keccak_KeccakState_48 *s, Eurydice_slice out) {
4509 Eurydice_slice buf[1U] = {out};
4510 libcrux_sha3_generic_keccak_squeeze_next_block_fc0(s, buf);
4511 }
4512
4513 /**
4514 A monomorphic instance of libcrux_sha3.generic_keccak.KeccakXofState
4515 with types uint64_t
4516 with const generics
4517 - $1size_t
4518 - $136size_t
4519 */
4520 typedef struct libcrux_sha3_generic_keccak_KeccakXofState_4f_s {
4521 libcrux_sha3_generic_keccak_KeccakState_48 inner;
4522 uint8_t buf[1U][136U];
4523 size_t buf_len;
4524 bool sponge;
4525 } libcrux_sha3_generic_keccak_KeccakXofState_4f;
4526
4527 typedef libcrux_sha3_generic_keccak_KeccakXofState_4f
4528 libcrux_sha3_portable_incremental_Shake256Absorb;
4529
4530 /**
4531 Consume the internal buffer and the required amount of the input to pad to
4532 `RATE`.
4533
4534 Returns the `consumed` bytes from `inputs` if there's enough buffered
4535 content to consume, and `0` otherwise.
4536 If `consumed > 0` is returned, `self.buf` contains a full block to be
4537 loaded.
4538 */
4539 /**
4540 This function found in impl {libcrux_sha3::generic_keccak::KeccakXofState<STATE,
4541 PARALLEL_LANES, RATE>[TraitClause@0]#2}
4542 */
4543 /**
4544 A monomorphic instance of libcrux_sha3.generic_keccak.fill_buffer_9d
4545 with types uint64_t
4546 with const generics
4547 - PARALLEL_LANES= 1
4548 - RATE= 136
4549 */
libcrux_sha3_generic_keccak_fill_buffer_9d_b0(libcrux_sha3_generic_keccak_KeccakXofState_4f * self,Eurydice_slice inputs[1U])4550 static inline size_t libcrux_sha3_generic_keccak_fill_buffer_9d_b0(
4551 libcrux_sha3_generic_keccak_KeccakXofState_4f *self,
4552 Eurydice_slice inputs[1U]) {
4553 size_t input_len = Eurydice_slice_len(inputs[0U], uint8_t);
4554 size_t consumed = (size_t)0U;
4555 if (self->buf_len > (size_t)0U) {
4556 if (self->buf_len + input_len >= (size_t)136U) {
4557 consumed = (size_t)136U - self->buf_len;
4558 for (size_t i = (size_t)0U; i < (size_t)1U; i++) {
4559 size_t i0 = i;
4560 Eurydice_slice uu____0 = Eurydice_array_to_subslice_from(
4561 (size_t)136U, self->buf[i0], self->buf_len, uint8_t, size_t);
4562 Eurydice_slice_copy(
4563 uu____0,
4564 Eurydice_slice_subslice_to(inputs[i0], consumed, uint8_t, size_t),
4565 uint8_t);
4566 }
4567 self->buf_len = self->buf_len + consumed;
4568 }
4569 }
4570 return consumed;
4571 }
4572
4573 /**
4574 This function found in impl {libcrux_sha3::generic_keccak::KeccakXofState<STATE,
4575 PARALLEL_LANES, RATE>[TraitClause@0]#2}
4576 */
4577 /**
4578 A monomorphic instance of libcrux_sha3.generic_keccak.absorb_full_9d
4579 with types uint64_t
4580 with const generics
4581 - PARALLEL_LANES= 1
4582 - RATE= 136
4583 */
libcrux_sha3_generic_keccak_absorb_full_9d_f8(libcrux_sha3_generic_keccak_KeccakXofState_4f * self,Eurydice_slice inputs[1U])4584 static inline size_t libcrux_sha3_generic_keccak_absorb_full_9d_f8(
4585 libcrux_sha3_generic_keccak_KeccakXofState_4f *self,
4586 Eurydice_slice inputs[1U]) {
4587 libcrux_sha3_generic_keccak_KeccakXofState_4f *uu____0 = self;
4588 /* Passing arrays by value in Rust generates a copy in C */
4589 Eurydice_slice copy_of_inputs0[1U];
4590 memcpy(copy_of_inputs0, inputs, (size_t)1U * sizeof(Eurydice_slice));
4591 size_t input_consumed =
4592 libcrux_sha3_generic_keccak_fill_buffer_9d_b0(uu____0, copy_of_inputs0);
4593 if (input_consumed > (size_t)0U) {
4594 Eurydice_slice borrowed[1U];
4595 for (size_t i = (size_t)0U; i < (size_t)1U; i++) {
4596 uint8_t buf[136U] = {0U};
4597 borrowed[i] = core_array___Array_T__N__23__as_slice(
4598 (size_t)136U, buf, uint8_t, Eurydice_slice);
4599 }
4600 for (size_t i = (size_t)0U; i < (size_t)1U; i++) {
4601 size_t i0 = i;
4602 borrowed[i0] =
4603 Eurydice_array_to_slice((size_t)136U, self->buf[i0], uint8_t);
4604 }
4605 uint64_t(*uu____2)[5U] = self->inner.st;
4606 Eurydice_slice uu____3[1U];
4607 memcpy(uu____3, borrowed, (size_t)1U * sizeof(Eurydice_slice));
4608 libcrux_sha3_portable_keccak_load_block_5a_b80(uu____2, uu____3);
4609 libcrux_sha3_generic_keccak_keccakf1600_21(&self->inner);
4610 self->buf_len = (size_t)0U;
4611 }
4612 size_t input_to_consume =
4613 Eurydice_slice_len(inputs[0U], uint8_t) - input_consumed;
4614 size_t num_blocks = input_to_consume / (size_t)136U;
4615 size_t remainder = input_to_consume % (size_t)136U;
4616 for (size_t i = (size_t)0U; i < num_blocks; i++) {
4617 size_t i0 = i;
4618 uint64_t(*uu____4)[5U] = self->inner.st;
4619 /* Passing arrays by value in Rust generates a copy in C */
4620 Eurydice_slice copy_of_inputs[1U];
4621 memcpy(copy_of_inputs, inputs, (size_t)1U * sizeof(Eurydice_slice));
4622 Eurydice_slice ret[1U];
4623 libcrux_sha3_portable_keccak_slice_n_5a(
4624 copy_of_inputs, input_consumed + i0 * (size_t)136U, (size_t)136U, ret);
4625 libcrux_sha3_portable_keccak_load_block_5a_b80(uu____4, ret);
4626 libcrux_sha3_generic_keccak_keccakf1600_21(&self->inner);
4627 }
4628 return remainder;
4629 }
4630
4631 /**
4632 Absorb
4633
4634 This function takes any number of bytes to absorb and buffers if it's not
4635 enough. The function assumes that all input slices in `blocks` have the same
4636 length.
4637
4638 Only a multiple of `RATE` blocks are absorbed.
4639 For the remaining bytes [`absorb_final`] needs to be called.
4640
4641 This works best with relatively small `inputs`.
4642 */
4643 /**
4644 This function found in impl {libcrux_sha3::generic_keccak::KeccakXofState<STATE,
4645 PARALLEL_LANES, RATE>[TraitClause@0]#2}
4646 */
4647 /**
4648 A monomorphic instance of libcrux_sha3.generic_keccak.absorb_9d
4649 with types uint64_t
4650 with const generics
4651 - PARALLEL_LANES= 1
4652 - RATE= 136
4653 */
libcrux_sha3_generic_keccak_absorb_9d_7b(libcrux_sha3_generic_keccak_KeccakXofState_4f * self,Eurydice_slice inputs[1U])4654 static KRML_MUSTINLINE void libcrux_sha3_generic_keccak_absorb_9d_7b(
4655 libcrux_sha3_generic_keccak_KeccakXofState_4f *self,
4656 Eurydice_slice inputs[1U]) {
4657 libcrux_sha3_generic_keccak_KeccakXofState_4f *uu____0 = self;
4658 /* Passing arrays by value in Rust generates a copy in C */
4659 Eurydice_slice copy_of_inputs[1U];
4660 memcpy(copy_of_inputs, inputs, (size_t)1U * sizeof(Eurydice_slice));
4661 size_t input_remainder_len =
4662 libcrux_sha3_generic_keccak_absorb_full_9d_f8(uu____0, copy_of_inputs);
4663 if (input_remainder_len > (size_t)0U) {
4664 size_t input_len = Eurydice_slice_len(inputs[0U], uint8_t);
4665 for (size_t i = (size_t)0U; i < (size_t)1U; i++) {
4666 size_t i0 = i;
4667 Eurydice_slice uu____2 = Eurydice_array_to_subslice2(
4668 self->buf[i0], self->buf_len, self->buf_len + input_remainder_len,
4669 uint8_t);
4670 Eurydice_slice_copy(
4671 uu____2,
4672 Eurydice_slice_subslice_from(
4673 inputs[i0], input_len - input_remainder_len, uint8_t, size_t),
4674 uint8_t);
4675 }
4676 self->buf_len = self->buf_len + input_remainder_len;
4677 }
4678 }
4679
4680 /**
4681 Shake256 absorb
4682 */
4683 /**
4684 This function found in impl
4685 {(libcrux_sha3::portable::incremental::XofAbsorb<136: usize> for
4686 libcrux_sha3::portable::incremental::Shake256Absorb)#2}
4687 */
libcrux_sha3_portable_incremental_absorb_7d(libcrux_sha3_generic_keccak_KeccakXofState_4f * self,Eurydice_slice input)4688 static inline void libcrux_sha3_portable_incremental_absorb_7d(
4689 libcrux_sha3_generic_keccak_KeccakXofState_4f *self, Eurydice_slice input) {
4690 Eurydice_slice buf[1U] = {input};
4691 libcrux_sha3_generic_keccak_absorb_9d_7b(self, buf);
4692 }
4693
4694 typedef libcrux_sha3_generic_keccak_KeccakXofState_4f
4695 libcrux_sha3_portable_incremental_Shake256Squeeze;
4696
4697 /**
4698 Absorb a final block.
4699
4700 The `inputs` block may be empty. Everything in the `inputs` block beyond
4701 `RATE` bytes is ignored.
4702 */
4703 /**
4704 This function found in impl {libcrux_sha3::generic_keccak::KeccakXofState<STATE,
4705 PARALLEL_LANES, RATE>[TraitClause@0]#2}
4706 */
4707 /**
4708 A monomorphic instance of libcrux_sha3.generic_keccak.absorb_final_9d
4709 with types uint64_t
4710 with const generics
4711 - PARALLEL_LANES= 1
4712 - RATE= 136
4713 - DELIMITER= 31
4714 */
libcrux_sha3_generic_keccak_absorb_final_9d_25(libcrux_sha3_generic_keccak_KeccakXofState_4f * self,Eurydice_slice inputs[1U])4715 static KRML_MUSTINLINE void libcrux_sha3_generic_keccak_absorb_final_9d_25(
4716 libcrux_sha3_generic_keccak_KeccakXofState_4f *self,
4717 Eurydice_slice inputs[1U]) {
4718 libcrux_sha3_generic_keccak_KeccakXofState_4f *uu____0 = self;
4719 /* Passing arrays by value in Rust generates a copy in C */
4720 Eurydice_slice copy_of_inputs[1U];
4721 memcpy(copy_of_inputs, inputs, (size_t)1U * sizeof(Eurydice_slice));
4722 size_t input_remainder_len =
4723 libcrux_sha3_generic_keccak_absorb_full_9d_f8(uu____0, copy_of_inputs);
4724 size_t input_len = Eurydice_slice_len(inputs[0U], uint8_t);
4725 uint8_t blocks[1U][200U] = {{0U}};
4726 for (size_t i = (size_t)0U; i < (size_t)1U; i++) {
4727 size_t i0 = i;
4728 if (self->buf_len > (size_t)0U) {
4729 Eurydice_slice uu____2 = Eurydice_array_to_subslice2(
4730 blocks[i0], (size_t)0U, self->buf_len, uint8_t);
4731 Eurydice_slice_copy(uu____2,
4732 Eurydice_array_to_subslice2(self->buf[i0], (size_t)0U,
4733 self->buf_len, uint8_t),
4734 uint8_t);
4735 }
4736 if (input_remainder_len > (size_t)0U) {
4737 Eurydice_slice uu____3 = Eurydice_array_to_subslice2(
4738 blocks[i0], self->buf_len, self->buf_len + input_remainder_len,
4739 uint8_t);
4740 Eurydice_slice_copy(
4741 uu____3,
4742 Eurydice_slice_subslice_from(
4743 inputs[i0], input_len - input_remainder_len, uint8_t, size_t),
4744 uint8_t);
4745 }
4746 blocks[i0][self->buf_len + input_remainder_len] = 31U;
4747 size_t uu____4 = i0;
4748 size_t uu____5 = (size_t)136U - (size_t)1U;
4749 blocks[uu____4][uu____5] = (uint32_t)blocks[uu____4][uu____5] | 128U;
4750 }
4751 uint64_t(*uu____6)[5U] = self->inner.st;
4752 uint8_t uu____7[1U][200U];
4753 memcpy(uu____7, blocks, (size_t)1U * sizeof(uint8_t[200U]));
4754 libcrux_sha3_portable_keccak_load_block_full_5a_d20(uu____6, uu____7);
4755 libcrux_sha3_generic_keccak_keccakf1600_21(&self->inner);
4756 }
4757
4758 /**
4759 Shake256 absorb final
4760 */
4761 /**
4762 This function found in impl
4763 {(libcrux_sha3::portable::incremental::XofAbsorb<136: usize> for
4764 libcrux_sha3::portable::incremental::Shake256Absorb)#2}
4765 */
4766 static inline libcrux_sha3_generic_keccak_KeccakXofState_4f
libcrux_sha3_portable_incremental_absorb_final_7d(libcrux_sha3_generic_keccak_KeccakXofState_4f self,Eurydice_slice input)4767 libcrux_sha3_portable_incremental_absorb_final_7d(
4768 libcrux_sha3_generic_keccak_KeccakXofState_4f self, Eurydice_slice input) {
4769 Eurydice_slice buf[1U] = {input};
4770 libcrux_sha3_generic_keccak_absorb_final_9d_25(&self, buf);
4771 return self;
4772 }
4773
4774 /**
4775 An all zero block
4776 */
4777 /**
4778 This function found in impl {libcrux_sha3::generic_keccak::KeccakXofState<STATE,
4779 PARALLEL_LANES, RATE>[TraitClause@0]#2}
4780 */
4781 /**
4782 A monomorphic instance of libcrux_sha3.generic_keccak.zero_block_9d
4783 with types uint64_t
4784 with const generics
4785 - PARALLEL_LANES= 1
4786 - RATE= 136
4787 */
libcrux_sha3_generic_keccak_zero_block_9d_e6(uint8_t ret[136U])4788 static inline void libcrux_sha3_generic_keccak_zero_block_9d_e6(
4789 uint8_t ret[136U]) {
4790 ret[0U] = 0U;
4791 ret[1U] = 0U;
4792 ret[2U] = 0U;
4793 ret[3U] = 0U;
4794 ret[4U] = 0U;
4795 ret[5U] = 0U;
4796 ret[6U] = 0U;
4797 ret[7U] = 0U;
4798 ret[8U] = 0U;
4799 ret[9U] = 0U;
4800 ret[10U] = 0U;
4801 ret[11U] = 0U;
4802 ret[12U] = 0U;
4803 ret[13U] = 0U;
4804 ret[14U] = 0U;
4805 ret[15U] = 0U;
4806 ret[16U] = 0U;
4807 ret[17U] = 0U;
4808 ret[18U] = 0U;
4809 ret[19U] = 0U;
4810 ret[20U] = 0U;
4811 ret[21U] = 0U;
4812 ret[22U] = 0U;
4813 ret[23U] = 0U;
4814 ret[24U] = 0U;
4815 ret[25U] = 0U;
4816 ret[26U] = 0U;
4817 ret[27U] = 0U;
4818 ret[28U] = 0U;
4819 ret[29U] = 0U;
4820 ret[30U] = 0U;
4821 ret[31U] = 0U;
4822 ret[32U] = 0U;
4823 ret[33U] = 0U;
4824 ret[34U] = 0U;
4825 ret[35U] = 0U;
4826 ret[36U] = 0U;
4827 ret[37U] = 0U;
4828 ret[38U] = 0U;
4829 ret[39U] = 0U;
4830 ret[40U] = 0U;
4831 ret[41U] = 0U;
4832 ret[42U] = 0U;
4833 ret[43U] = 0U;
4834 ret[44U] = 0U;
4835 ret[45U] = 0U;
4836 ret[46U] = 0U;
4837 ret[47U] = 0U;
4838 ret[48U] = 0U;
4839 ret[49U] = 0U;
4840 ret[50U] = 0U;
4841 ret[51U] = 0U;
4842 ret[52U] = 0U;
4843 ret[53U] = 0U;
4844 ret[54U] = 0U;
4845 ret[55U] = 0U;
4846 ret[56U] = 0U;
4847 ret[57U] = 0U;
4848 ret[58U] = 0U;
4849 ret[59U] = 0U;
4850 ret[60U] = 0U;
4851 ret[61U] = 0U;
4852 ret[62U] = 0U;
4853 ret[63U] = 0U;
4854 ret[64U] = 0U;
4855 ret[65U] = 0U;
4856 ret[66U] = 0U;
4857 ret[67U] = 0U;
4858 ret[68U] = 0U;
4859 ret[69U] = 0U;
4860 ret[70U] = 0U;
4861 ret[71U] = 0U;
4862 ret[72U] = 0U;
4863 ret[73U] = 0U;
4864 ret[74U] = 0U;
4865 ret[75U] = 0U;
4866 ret[76U] = 0U;
4867 ret[77U] = 0U;
4868 ret[78U] = 0U;
4869 ret[79U] = 0U;
4870 ret[80U] = 0U;
4871 ret[81U] = 0U;
4872 ret[82U] = 0U;
4873 ret[83U] = 0U;
4874 ret[84U] = 0U;
4875 ret[85U] = 0U;
4876 ret[86U] = 0U;
4877 ret[87U] = 0U;
4878 ret[88U] = 0U;
4879 ret[89U] = 0U;
4880 ret[90U] = 0U;
4881 ret[91U] = 0U;
4882 ret[92U] = 0U;
4883 ret[93U] = 0U;
4884 ret[94U] = 0U;
4885 ret[95U] = 0U;
4886 ret[96U] = 0U;
4887 ret[97U] = 0U;
4888 ret[98U] = 0U;
4889 ret[99U] = 0U;
4890 ret[100U] = 0U;
4891 ret[101U] = 0U;
4892 ret[102U] = 0U;
4893 ret[103U] = 0U;
4894 ret[104U] = 0U;
4895 ret[105U] = 0U;
4896 ret[106U] = 0U;
4897 ret[107U] = 0U;
4898 ret[108U] = 0U;
4899 ret[109U] = 0U;
4900 ret[110U] = 0U;
4901 ret[111U] = 0U;
4902 ret[112U] = 0U;
4903 ret[113U] = 0U;
4904 ret[114U] = 0U;
4905 ret[115U] = 0U;
4906 ret[116U] = 0U;
4907 ret[117U] = 0U;
4908 ret[118U] = 0U;
4909 ret[119U] = 0U;
4910 ret[120U] = 0U;
4911 ret[121U] = 0U;
4912 ret[122U] = 0U;
4913 ret[123U] = 0U;
4914 ret[124U] = 0U;
4915 ret[125U] = 0U;
4916 ret[126U] = 0U;
4917 ret[127U] = 0U;
4918 ret[128U] = 0U;
4919 ret[129U] = 0U;
4920 ret[130U] = 0U;
4921 ret[131U] = 0U;
4922 ret[132U] = 0U;
4923 ret[133U] = 0U;
4924 ret[134U] = 0U;
4925 ret[135U] = 0U;
4926 }
4927
4928 /**
4929 Generate a new keccak xof state.
4930 */
4931 /**
4932 This function found in impl {libcrux_sha3::generic_keccak::KeccakXofState<STATE,
4933 PARALLEL_LANES, RATE>[TraitClause@0]#2}
4934 */
4935 /**
4936 A monomorphic instance of libcrux_sha3.generic_keccak.new_9d
4937 with types uint64_t
4938 with const generics
4939 - PARALLEL_LANES= 1
4940 - RATE= 136
4941 */
4942 static inline libcrux_sha3_generic_keccak_KeccakXofState_4f
libcrux_sha3_generic_keccak_new_9d_7e(void)4943 libcrux_sha3_generic_keccak_new_9d_7e(void) {
4944 libcrux_sha3_generic_keccak_KeccakXofState_4f lit;
4945 lit.inner = libcrux_sha3_generic_keccak_new_1e_f4();
4946 uint8_t ret[136U];
4947 libcrux_sha3_generic_keccak_zero_block_9d_e6(ret);
4948 memcpy(lit.buf[0U], ret, (size_t)136U * sizeof(uint8_t));
4949 lit.buf_len = (size_t)0U;
4950 lit.sponge = false;
4951 return lit;
4952 }
4953
4954 /**
4955 Shake256 new state
4956 */
4957 /**
4958 This function found in impl
4959 {(libcrux_sha3::portable::incremental::XofAbsorb<136: usize> for
4960 libcrux_sha3::portable::incremental::Shake256Absorb)#2}
4961 */
4962 static inline libcrux_sha3_generic_keccak_KeccakXofState_4f
libcrux_sha3_portable_incremental_new_7d(void)4963 libcrux_sha3_portable_incremental_new_7d(void) {
4964 return libcrux_sha3_generic_keccak_new_9d_7e();
4965 }
4966
4967 /**
4968 A monomorphic instance of libcrux_sha3.generic_keccak.KeccakXofState
4969 with types uint64_t
4970 with const generics
4971 - $1size_t
4972 - $168size_t
4973 */
4974 typedef struct libcrux_sha3_generic_keccak_KeccakXofState_78_s {
4975 libcrux_sha3_generic_keccak_KeccakState_48 inner;
4976 uint8_t buf[1U][168U];
4977 size_t buf_len;
4978 bool sponge;
4979 } libcrux_sha3_generic_keccak_KeccakXofState_78;
4980
4981 typedef libcrux_sha3_generic_keccak_KeccakXofState_78
4982 libcrux_sha3_portable_incremental_Shake128Absorb;
4983
4984 /**
4985 Consume the internal buffer and the required amount of the input to pad to
4986 `RATE`.
4987
4988 Returns the `consumed` bytes from `inputs` if there's enough buffered
4989 content to consume, and `0` otherwise.
4990 If `consumed > 0` is returned, `self.buf` contains a full block to be
4991 loaded.
4992 */
4993 /**
4994 This function found in impl {libcrux_sha3::generic_keccak::KeccakXofState<STATE,
4995 PARALLEL_LANES, RATE>[TraitClause@0]#2}
4996 */
4997 /**
4998 A monomorphic instance of libcrux_sha3.generic_keccak.fill_buffer_9d
4999 with types uint64_t
5000 with const generics
5001 - PARALLEL_LANES= 1
5002 - RATE= 168
5003 */
libcrux_sha3_generic_keccak_fill_buffer_9d_b00(libcrux_sha3_generic_keccak_KeccakXofState_78 * self,Eurydice_slice inputs[1U])5004 static inline size_t libcrux_sha3_generic_keccak_fill_buffer_9d_b00(
5005 libcrux_sha3_generic_keccak_KeccakXofState_78 *self,
5006 Eurydice_slice inputs[1U]) {
5007 size_t input_len = Eurydice_slice_len(inputs[0U], uint8_t);
5008 size_t consumed = (size_t)0U;
5009 if (self->buf_len > (size_t)0U) {
5010 if (self->buf_len + input_len >= (size_t)168U) {
5011 consumed = (size_t)168U - self->buf_len;
5012 for (size_t i = (size_t)0U; i < (size_t)1U; i++) {
5013 size_t i0 = i;
5014 Eurydice_slice uu____0 = Eurydice_array_to_subslice_from(
5015 (size_t)168U, self->buf[i0], self->buf_len, uint8_t, size_t);
5016 Eurydice_slice_copy(
5017 uu____0,
5018 Eurydice_slice_subslice_to(inputs[i0], consumed, uint8_t, size_t),
5019 uint8_t);
5020 }
5021 self->buf_len = self->buf_len + consumed;
5022 }
5023 }
5024 return consumed;
5025 }
5026
5027 /**
5028 This function found in impl {libcrux_sha3::generic_keccak::KeccakXofState<STATE,
5029 PARALLEL_LANES, RATE>[TraitClause@0]#2}
5030 */
5031 /**
5032 A monomorphic instance of libcrux_sha3.generic_keccak.absorb_full_9d
5033 with types uint64_t
5034 with const generics
5035 - PARALLEL_LANES= 1
5036 - RATE= 168
5037 */
libcrux_sha3_generic_keccak_absorb_full_9d_f80(libcrux_sha3_generic_keccak_KeccakXofState_78 * self,Eurydice_slice inputs[1U])5038 static inline size_t libcrux_sha3_generic_keccak_absorb_full_9d_f80(
5039 libcrux_sha3_generic_keccak_KeccakXofState_78 *self,
5040 Eurydice_slice inputs[1U]) {
5041 libcrux_sha3_generic_keccak_KeccakXofState_78 *uu____0 = self;
5042 /* Passing arrays by value in Rust generates a copy in C */
5043 Eurydice_slice copy_of_inputs0[1U];
5044 memcpy(copy_of_inputs0, inputs, (size_t)1U * sizeof(Eurydice_slice));
5045 size_t input_consumed =
5046 libcrux_sha3_generic_keccak_fill_buffer_9d_b00(uu____0, copy_of_inputs0);
5047 if (input_consumed > (size_t)0U) {
5048 Eurydice_slice borrowed[1U];
5049 for (size_t i = (size_t)0U; i < (size_t)1U; i++) {
5050 uint8_t buf[168U] = {0U};
5051 borrowed[i] = core_array___Array_T__N__23__as_slice(
5052 (size_t)168U, buf, uint8_t, Eurydice_slice);
5053 }
5054 for (size_t i = (size_t)0U; i < (size_t)1U; i++) {
5055 size_t i0 = i;
5056 borrowed[i0] =
5057 Eurydice_array_to_slice((size_t)168U, self->buf[i0], uint8_t);
5058 }
5059 uint64_t(*uu____2)[5U] = self->inner.st;
5060 Eurydice_slice uu____3[1U];
5061 memcpy(uu____3, borrowed, (size_t)1U * sizeof(Eurydice_slice));
5062 libcrux_sha3_portable_keccak_load_block_5a_b83(uu____2, uu____3);
5063 libcrux_sha3_generic_keccak_keccakf1600_21(&self->inner);
5064 self->buf_len = (size_t)0U;
5065 }
5066 size_t input_to_consume =
5067 Eurydice_slice_len(inputs[0U], uint8_t) - input_consumed;
5068 size_t num_blocks = input_to_consume / (size_t)168U;
5069 size_t remainder = input_to_consume % (size_t)168U;
5070 for (size_t i = (size_t)0U; i < num_blocks; i++) {
5071 size_t i0 = i;
5072 uint64_t(*uu____4)[5U] = self->inner.st;
5073 /* Passing arrays by value in Rust generates a copy in C */
5074 Eurydice_slice copy_of_inputs[1U];
5075 memcpy(copy_of_inputs, inputs, (size_t)1U * sizeof(Eurydice_slice));
5076 Eurydice_slice ret[1U];
5077 libcrux_sha3_portable_keccak_slice_n_5a(
5078 copy_of_inputs, input_consumed + i0 * (size_t)168U, (size_t)168U, ret);
5079 libcrux_sha3_portable_keccak_load_block_5a_b83(uu____4, ret);
5080 libcrux_sha3_generic_keccak_keccakf1600_21(&self->inner);
5081 }
5082 return remainder;
5083 }
5084
5085 /**
5086 Absorb
5087
5088 This function takes any number of bytes to absorb and buffers if it's not
5089 enough. The function assumes that all input slices in `blocks` have the same
5090 length.
5091
5092 Only a multiple of `RATE` blocks are absorbed.
5093 For the remaining bytes [`absorb_final`] needs to be called.
5094
5095 This works best with relatively small `inputs`.
5096 */
5097 /**
5098 This function found in impl {libcrux_sha3::generic_keccak::KeccakXofState<STATE,
5099 PARALLEL_LANES, RATE>[TraitClause@0]#2}
5100 */
5101 /**
5102 A monomorphic instance of libcrux_sha3.generic_keccak.absorb_9d
5103 with types uint64_t
5104 with const generics
5105 - PARALLEL_LANES= 1
5106 - RATE= 168
5107 */
libcrux_sha3_generic_keccak_absorb_9d_7b0(libcrux_sha3_generic_keccak_KeccakXofState_78 * self,Eurydice_slice inputs[1U])5108 static KRML_MUSTINLINE void libcrux_sha3_generic_keccak_absorb_9d_7b0(
5109 libcrux_sha3_generic_keccak_KeccakXofState_78 *self,
5110 Eurydice_slice inputs[1U]) {
5111 libcrux_sha3_generic_keccak_KeccakXofState_78 *uu____0 = self;
5112 /* Passing arrays by value in Rust generates a copy in C */
5113 Eurydice_slice copy_of_inputs[1U];
5114 memcpy(copy_of_inputs, inputs, (size_t)1U * sizeof(Eurydice_slice));
5115 size_t input_remainder_len =
5116 libcrux_sha3_generic_keccak_absorb_full_9d_f80(uu____0, copy_of_inputs);
5117 if (input_remainder_len > (size_t)0U) {
5118 size_t input_len = Eurydice_slice_len(inputs[0U], uint8_t);
5119 for (size_t i = (size_t)0U; i < (size_t)1U; i++) {
5120 size_t i0 = i;
5121 Eurydice_slice uu____2 = Eurydice_array_to_subslice2(
5122 self->buf[i0], self->buf_len, self->buf_len + input_remainder_len,
5123 uint8_t);
5124 Eurydice_slice_copy(
5125 uu____2,
5126 Eurydice_slice_subslice_from(
5127 inputs[i0], input_len - input_remainder_len, uint8_t, size_t),
5128 uint8_t);
5129 }
5130 self->buf_len = self->buf_len + input_remainder_len;
5131 }
5132 }
5133
5134 /**
5135 This function found in impl
5136 {(libcrux_sha3::portable::incremental::XofAbsorb<168: usize> for
5137 libcrux_sha3::portable::incremental::Shake128Absorb)}
5138 */
libcrux_sha3_portable_incremental_absorb_1c(libcrux_sha3_generic_keccak_KeccakXofState_78 * self,Eurydice_slice input)5139 static inline void libcrux_sha3_portable_incremental_absorb_1c(
5140 libcrux_sha3_generic_keccak_KeccakXofState_78 *self, Eurydice_slice input) {
5141 Eurydice_slice buf[1U] = {input};
5142 libcrux_sha3_generic_keccak_absorb_9d_7b0(self, buf);
5143 }
5144
5145 typedef libcrux_sha3_generic_keccak_KeccakXofState_78
5146 libcrux_sha3_portable_incremental_Shake128Squeeze;
5147
5148 /**
5149 Absorb a final block.
5150
5151 The `inputs` block may be empty. Everything in the `inputs` block beyond
5152 `RATE` bytes is ignored.
5153 */
5154 /**
5155 This function found in impl {libcrux_sha3::generic_keccak::KeccakXofState<STATE,
5156 PARALLEL_LANES, RATE>[TraitClause@0]#2}
5157 */
5158 /**
5159 A monomorphic instance of libcrux_sha3.generic_keccak.absorb_final_9d
5160 with types uint64_t
5161 with const generics
5162 - PARALLEL_LANES= 1
5163 - RATE= 168
5164 - DELIMITER= 31
5165 */
libcrux_sha3_generic_keccak_absorb_final_9d_250(libcrux_sha3_generic_keccak_KeccakXofState_78 * self,Eurydice_slice inputs[1U])5166 static KRML_MUSTINLINE void libcrux_sha3_generic_keccak_absorb_final_9d_250(
5167 libcrux_sha3_generic_keccak_KeccakXofState_78 *self,
5168 Eurydice_slice inputs[1U]) {
5169 libcrux_sha3_generic_keccak_KeccakXofState_78 *uu____0 = self;
5170 /* Passing arrays by value in Rust generates a copy in C */
5171 Eurydice_slice copy_of_inputs[1U];
5172 memcpy(copy_of_inputs, inputs, (size_t)1U * sizeof(Eurydice_slice));
5173 size_t input_remainder_len =
5174 libcrux_sha3_generic_keccak_absorb_full_9d_f80(uu____0, copy_of_inputs);
5175 size_t input_len = Eurydice_slice_len(inputs[0U], uint8_t);
5176 uint8_t blocks[1U][200U] = {{0U}};
5177 for (size_t i = (size_t)0U; i < (size_t)1U; i++) {
5178 size_t i0 = i;
5179 if (self->buf_len > (size_t)0U) {
5180 Eurydice_slice uu____2 = Eurydice_array_to_subslice2(
5181 blocks[i0], (size_t)0U, self->buf_len, uint8_t);
5182 Eurydice_slice_copy(uu____2,
5183 Eurydice_array_to_subslice2(self->buf[i0], (size_t)0U,
5184 self->buf_len, uint8_t),
5185 uint8_t);
5186 }
5187 if (input_remainder_len > (size_t)0U) {
5188 Eurydice_slice uu____3 = Eurydice_array_to_subslice2(
5189 blocks[i0], self->buf_len, self->buf_len + input_remainder_len,
5190 uint8_t);
5191 Eurydice_slice_copy(
5192 uu____3,
5193 Eurydice_slice_subslice_from(
5194 inputs[i0], input_len - input_remainder_len, uint8_t, size_t),
5195 uint8_t);
5196 }
5197 blocks[i0][self->buf_len + input_remainder_len] = 31U;
5198 size_t uu____4 = i0;
5199 size_t uu____5 = (size_t)168U - (size_t)1U;
5200 blocks[uu____4][uu____5] = (uint32_t)blocks[uu____4][uu____5] | 128U;
5201 }
5202 uint64_t(*uu____6)[5U] = self->inner.st;
5203 uint8_t uu____7[1U][200U];
5204 memcpy(uu____7, blocks, (size_t)1U * sizeof(uint8_t[200U]));
5205 libcrux_sha3_portable_keccak_load_block_full_5a_d21(uu____6, uu____7);
5206 libcrux_sha3_generic_keccak_keccakf1600_21(&self->inner);
5207 }
5208
5209 /**
5210 This function found in impl
5211 {(libcrux_sha3::portable::incremental::XofAbsorb<168: usize> for
5212 libcrux_sha3::portable::incremental::Shake128Absorb)}
5213 */
5214 static inline libcrux_sha3_generic_keccak_KeccakXofState_78
libcrux_sha3_portable_incremental_absorb_final_1c(libcrux_sha3_generic_keccak_KeccakXofState_78 self,Eurydice_slice input)5215 libcrux_sha3_portable_incremental_absorb_final_1c(
5216 libcrux_sha3_generic_keccak_KeccakXofState_78 self, Eurydice_slice input) {
5217 Eurydice_slice buf[1U] = {input};
5218 libcrux_sha3_generic_keccak_absorb_final_9d_250(&self, buf);
5219 return self;
5220 }
5221
5222 /**
5223 An all zero block
5224 */
5225 /**
5226 This function found in impl {libcrux_sha3::generic_keccak::KeccakXofState<STATE,
5227 PARALLEL_LANES, RATE>[TraitClause@0]#2}
5228 */
5229 /**
5230 A monomorphic instance of libcrux_sha3.generic_keccak.zero_block_9d
5231 with types uint64_t
5232 with const generics
5233 - PARALLEL_LANES= 1
5234 - RATE= 168
5235 */
libcrux_sha3_generic_keccak_zero_block_9d_e60(uint8_t ret[168U])5236 static inline void libcrux_sha3_generic_keccak_zero_block_9d_e60(
5237 uint8_t ret[168U]) {
5238 ret[0U] = 0U;
5239 ret[1U] = 0U;
5240 ret[2U] = 0U;
5241 ret[3U] = 0U;
5242 ret[4U] = 0U;
5243 ret[5U] = 0U;
5244 ret[6U] = 0U;
5245 ret[7U] = 0U;
5246 ret[8U] = 0U;
5247 ret[9U] = 0U;
5248 ret[10U] = 0U;
5249 ret[11U] = 0U;
5250 ret[12U] = 0U;
5251 ret[13U] = 0U;
5252 ret[14U] = 0U;
5253 ret[15U] = 0U;
5254 ret[16U] = 0U;
5255 ret[17U] = 0U;
5256 ret[18U] = 0U;
5257 ret[19U] = 0U;
5258 ret[20U] = 0U;
5259 ret[21U] = 0U;
5260 ret[22U] = 0U;
5261 ret[23U] = 0U;
5262 ret[24U] = 0U;
5263 ret[25U] = 0U;
5264 ret[26U] = 0U;
5265 ret[27U] = 0U;
5266 ret[28U] = 0U;
5267 ret[29U] = 0U;
5268 ret[30U] = 0U;
5269 ret[31U] = 0U;
5270 ret[32U] = 0U;
5271 ret[33U] = 0U;
5272 ret[34U] = 0U;
5273 ret[35U] = 0U;
5274 ret[36U] = 0U;
5275 ret[37U] = 0U;
5276 ret[38U] = 0U;
5277 ret[39U] = 0U;
5278 ret[40U] = 0U;
5279 ret[41U] = 0U;
5280 ret[42U] = 0U;
5281 ret[43U] = 0U;
5282 ret[44U] = 0U;
5283 ret[45U] = 0U;
5284 ret[46U] = 0U;
5285 ret[47U] = 0U;
5286 ret[48U] = 0U;
5287 ret[49U] = 0U;
5288 ret[50U] = 0U;
5289 ret[51U] = 0U;
5290 ret[52U] = 0U;
5291 ret[53U] = 0U;
5292 ret[54U] = 0U;
5293 ret[55U] = 0U;
5294 ret[56U] = 0U;
5295 ret[57U] = 0U;
5296 ret[58U] = 0U;
5297 ret[59U] = 0U;
5298 ret[60U] = 0U;
5299 ret[61U] = 0U;
5300 ret[62U] = 0U;
5301 ret[63U] = 0U;
5302 ret[64U] = 0U;
5303 ret[65U] = 0U;
5304 ret[66U] = 0U;
5305 ret[67U] = 0U;
5306 ret[68U] = 0U;
5307 ret[69U] = 0U;
5308 ret[70U] = 0U;
5309 ret[71U] = 0U;
5310 ret[72U] = 0U;
5311 ret[73U] = 0U;
5312 ret[74U] = 0U;
5313 ret[75U] = 0U;
5314 ret[76U] = 0U;
5315 ret[77U] = 0U;
5316 ret[78U] = 0U;
5317 ret[79U] = 0U;
5318 ret[80U] = 0U;
5319 ret[81U] = 0U;
5320 ret[82U] = 0U;
5321 ret[83U] = 0U;
5322 ret[84U] = 0U;
5323 ret[85U] = 0U;
5324 ret[86U] = 0U;
5325 ret[87U] = 0U;
5326 ret[88U] = 0U;
5327 ret[89U] = 0U;
5328 ret[90U] = 0U;
5329 ret[91U] = 0U;
5330 ret[92U] = 0U;
5331 ret[93U] = 0U;
5332 ret[94U] = 0U;
5333 ret[95U] = 0U;
5334 ret[96U] = 0U;
5335 ret[97U] = 0U;
5336 ret[98U] = 0U;
5337 ret[99U] = 0U;
5338 ret[100U] = 0U;
5339 ret[101U] = 0U;
5340 ret[102U] = 0U;
5341 ret[103U] = 0U;
5342 ret[104U] = 0U;
5343 ret[105U] = 0U;
5344 ret[106U] = 0U;
5345 ret[107U] = 0U;
5346 ret[108U] = 0U;
5347 ret[109U] = 0U;
5348 ret[110U] = 0U;
5349 ret[111U] = 0U;
5350 ret[112U] = 0U;
5351 ret[113U] = 0U;
5352 ret[114U] = 0U;
5353 ret[115U] = 0U;
5354 ret[116U] = 0U;
5355 ret[117U] = 0U;
5356 ret[118U] = 0U;
5357 ret[119U] = 0U;
5358 ret[120U] = 0U;
5359 ret[121U] = 0U;
5360 ret[122U] = 0U;
5361 ret[123U] = 0U;
5362 ret[124U] = 0U;
5363 ret[125U] = 0U;
5364 ret[126U] = 0U;
5365 ret[127U] = 0U;
5366 ret[128U] = 0U;
5367 ret[129U] = 0U;
5368 ret[130U] = 0U;
5369 ret[131U] = 0U;
5370 ret[132U] = 0U;
5371 ret[133U] = 0U;
5372 ret[134U] = 0U;
5373 ret[135U] = 0U;
5374 ret[136U] = 0U;
5375 ret[137U] = 0U;
5376 ret[138U] = 0U;
5377 ret[139U] = 0U;
5378 ret[140U] = 0U;
5379 ret[141U] = 0U;
5380 ret[142U] = 0U;
5381 ret[143U] = 0U;
5382 ret[144U] = 0U;
5383 ret[145U] = 0U;
5384 ret[146U] = 0U;
5385 ret[147U] = 0U;
5386 ret[148U] = 0U;
5387 ret[149U] = 0U;
5388 ret[150U] = 0U;
5389 ret[151U] = 0U;
5390 ret[152U] = 0U;
5391 ret[153U] = 0U;
5392 ret[154U] = 0U;
5393 ret[155U] = 0U;
5394 ret[156U] = 0U;
5395 ret[157U] = 0U;
5396 ret[158U] = 0U;
5397 ret[159U] = 0U;
5398 ret[160U] = 0U;
5399 ret[161U] = 0U;
5400 ret[162U] = 0U;
5401 ret[163U] = 0U;
5402 ret[164U] = 0U;
5403 ret[165U] = 0U;
5404 ret[166U] = 0U;
5405 ret[167U] = 0U;
5406 }
5407
5408 /**
5409 Generate a new keccak xof state.
5410 */
5411 /**
5412 This function found in impl {libcrux_sha3::generic_keccak::KeccakXofState<STATE,
5413 PARALLEL_LANES, RATE>[TraitClause@0]#2}
5414 */
5415 /**
5416 A monomorphic instance of libcrux_sha3.generic_keccak.new_9d
5417 with types uint64_t
5418 with const generics
5419 - PARALLEL_LANES= 1
5420 - RATE= 168
5421 */
5422 static inline libcrux_sha3_generic_keccak_KeccakXofState_78
libcrux_sha3_generic_keccak_new_9d_7e0(void)5423 libcrux_sha3_generic_keccak_new_9d_7e0(void) {
5424 libcrux_sha3_generic_keccak_KeccakXofState_78 lit;
5425 lit.inner = libcrux_sha3_generic_keccak_new_1e_f4();
5426 uint8_t ret[168U];
5427 libcrux_sha3_generic_keccak_zero_block_9d_e60(ret);
5428 memcpy(lit.buf[0U], ret, (size_t)168U * sizeof(uint8_t));
5429 lit.buf_len = (size_t)0U;
5430 lit.sponge = false;
5431 return lit;
5432 }
5433
5434 /**
5435 This function found in impl
5436 {(libcrux_sha3::portable::incremental::XofAbsorb<168: usize> for
5437 libcrux_sha3::portable::incremental::Shake128Absorb)}
5438 */
5439 static inline libcrux_sha3_generic_keccak_KeccakXofState_78
libcrux_sha3_portable_incremental_new_1c(void)5440 libcrux_sha3_portable_incremental_new_1c(void) {
5441 return libcrux_sha3_generic_keccak_new_9d_7e0();
5442 }
5443
5444 /**
5445 `out` has the exact size we want here. It must be less than or equal to `RATE`.
5446 */
5447 /**
5448 This function found in impl {(libcrux_sha3::traits::internal::KeccakItem<1:
5449 usize> for u64)}
5450 */
5451 /**
5452 A monomorphic instance of libcrux_sha3.portable_keccak.store_5a
5453 with const generics
5454 - RATE= 136
5455 */
libcrux_sha3_portable_keccak_store_5a_1c(uint64_t (* state)[5U],Eurydice_slice out[1U])5456 static KRML_MUSTINLINE void libcrux_sha3_portable_keccak_store_5a_1c(
5457 uint64_t (*state)[5U], Eurydice_slice out[1U]) {
5458 size_t num_full_blocks = Eurydice_slice_len(out[0U], uint8_t) / (size_t)8U;
5459 size_t last_block_len = Eurydice_slice_len(out[0U], uint8_t) % (size_t)8U;
5460 for (size_t i = (size_t)0U; i < num_full_blocks; i++) {
5461 size_t i0 = i;
5462 Eurydice_slice uu____0 = Eurydice_slice_subslice2(
5463 out[0U], i0 * (size_t)8U, i0 * (size_t)8U + (size_t)8U, uint8_t);
5464 uint8_t ret[8U];
5465 core_num__u64_9__to_le_bytes(state[i0 / (size_t)5U][i0 % (size_t)5U], ret);
5466 Eurydice_slice_copy(
5467 uu____0, Eurydice_array_to_slice((size_t)8U, ret, uint8_t), uint8_t);
5468 }
5469 if (last_block_len != (size_t)0U) {
5470 Eurydice_slice uu____1 = Eurydice_slice_subslice2(
5471 out[0U], num_full_blocks * (size_t)8U,
5472 num_full_blocks * (size_t)8U + last_block_len, uint8_t);
5473 uint8_t ret[8U];
5474 core_num__u64_9__to_le_bytes(
5475 state[num_full_blocks / (size_t)5U][num_full_blocks % (size_t)5U], ret);
5476 Eurydice_slice_copy(
5477 uu____1,
5478 Eurydice_array_to_subslice2(ret, (size_t)0U, last_block_len, uint8_t),
5479 uint8_t);
5480 }
5481 }
5482
5483 /**
5484 Squeeze `N` x `LEN` bytes.
5485 */
5486 /**
5487 This function found in impl {libcrux_sha3::generic_keccak::KeccakXofState<STATE,
5488 PARALLEL_LANES, RATE>[TraitClause@0]#2}
5489 */
5490 /**
5491 A monomorphic instance of libcrux_sha3.generic_keccak.squeeze_9d
5492 with types uint64_t
5493 with const generics
5494 - PARALLEL_LANES= 1
5495 - RATE= 136
5496 */
libcrux_sha3_generic_keccak_squeeze_9d_96(libcrux_sha3_generic_keccak_KeccakXofState_4f * self,Eurydice_slice out[1U])5497 static KRML_MUSTINLINE void libcrux_sha3_generic_keccak_squeeze_9d_96(
5498 libcrux_sha3_generic_keccak_KeccakXofState_4f *self,
5499 Eurydice_slice out[1U]) {
5500 if (self->sponge) {
5501 libcrux_sha3_generic_keccak_keccakf1600_21(&self->inner);
5502 }
5503 size_t out_len = Eurydice_slice_len(out[0U], uint8_t);
5504 size_t blocks = out_len / (size_t)136U;
5505 size_t last = out_len - out_len % (size_t)136U;
5506 size_t mid;
5507 if ((size_t)136U >= out_len) {
5508 mid = out_len;
5509 } else {
5510 mid = (size_t)136U;
5511 }
5512 Eurydice_slice_uint8_t_1size_t__x2 uu____0 =
5513 libcrux_sha3_portable_keccak_split_at_mut_n_5a(out, mid);
5514 Eurydice_slice out00[1U];
5515 memcpy(out00, uu____0.fst, (size_t)1U * sizeof(Eurydice_slice));
5516 Eurydice_slice out_rest[1U];
5517 memcpy(out_rest, uu____0.snd, (size_t)1U * sizeof(Eurydice_slice));
5518 libcrux_sha3_portable_keccak_store_5a_1c(self->inner.st, out00);
5519 core_ops_range_Range_b3 iter =
5520 core_iter_traits_collect___core__iter__traits__collect__IntoIterator_for_I__1__into_iter(
5521 (CLITERAL(core_ops_range_Range_b3){.start = (size_t)1U,
5522 .end = blocks}),
5523 core_ops_range_Range_b3, core_ops_range_Range_b3);
5524 while (true) {
5525 if (core_iter_range___core__iter__traits__iterator__Iterator_for_core__ops__range__Range_A___6__next(
5526 &iter, size_t, Option_b3)
5527 .tag == None) {
5528 break;
5529 } else {
5530 Eurydice_slice_uint8_t_1size_t__x2 uu____1 =
5531 libcrux_sha3_portable_keccak_split_at_mut_n_5a(out_rest,
5532 (size_t)136U);
5533 Eurydice_slice out0[1U];
5534 memcpy(out0, uu____1.fst, (size_t)1U * sizeof(Eurydice_slice));
5535 Eurydice_slice tmp[1U];
5536 memcpy(tmp, uu____1.snd, (size_t)1U * sizeof(Eurydice_slice));
5537 libcrux_sha3_generic_keccak_keccakf1600_21(&self->inner);
5538 libcrux_sha3_portable_keccak_store_5a_1c(self->inner.st, out0);
5539 memcpy(out_rest, tmp, (size_t)1U * sizeof(Eurydice_slice));
5540 }
5541 }
5542 if (last < out_len) {
5543 libcrux_sha3_generic_keccak_keccakf1600_21(&self->inner);
5544 libcrux_sha3_portable_keccak_store_5a_1c(self->inner.st, out_rest);
5545 }
5546 self->sponge = true;
5547 }
5548
5549 /**
5550 Shake256 squeeze
5551 */
5552 /**
5553 This function found in impl
5554 {(libcrux_sha3::portable::incremental::XofSqueeze<136: usize> for
5555 libcrux_sha3::portable::incremental::Shake256Squeeze)#3}
5556 */
libcrux_sha3_portable_incremental_squeeze_8a(libcrux_sha3_generic_keccak_KeccakXofState_4f * self,Eurydice_slice out)5557 static inline void libcrux_sha3_portable_incremental_squeeze_8a(
5558 libcrux_sha3_generic_keccak_KeccakXofState_4f *self, Eurydice_slice out) {
5559 Eurydice_slice buf[1U] = {out};
5560 libcrux_sha3_generic_keccak_squeeze_9d_96(self, buf);
5561 }
5562
5563 /**
5564 `out` has the exact size we want here. It must be less than or equal to `RATE`.
5565 */
5566 /**
5567 This function found in impl {(libcrux_sha3::traits::internal::KeccakItem<1:
5568 usize> for u64)}
5569 */
5570 /**
5571 A monomorphic instance of libcrux_sha3.portable_keccak.store_5a
5572 with const generics
5573 - RATE= 168
5574 */
libcrux_sha3_portable_keccak_store_5a_1c0(uint64_t (* state)[5U],Eurydice_slice out[1U])5575 static KRML_MUSTINLINE void libcrux_sha3_portable_keccak_store_5a_1c0(
5576 uint64_t (*state)[5U], Eurydice_slice out[1U]) {
5577 size_t num_full_blocks = Eurydice_slice_len(out[0U], uint8_t) / (size_t)8U;
5578 size_t last_block_len = Eurydice_slice_len(out[0U], uint8_t) % (size_t)8U;
5579 for (size_t i = (size_t)0U; i < num_full_blocks; i++) {
5580 size_t i0 = i;
5581 Eurydice_slice uu____0 = Eurydice_slice_subslice2(
5582 out[0U], i0 * (size_t)8U, i0 * (size_t)8U + (size_t)8U, uint8_t);
5583 uint8_t ret[8U];
5584 core_num__u64_9__to_le_bytes(state[i0 / (size_t)5U][i0 % (size_t)5U], ret);
5585 Eurydice_slice_copy(
5586 uu____0, Eurydice_array_to_slice((size_t)8U, ret, uint8_t), uint8_t);
5587 }
5588 if (last_block_len != (size_t)0U) {
5589 Eurydice_slice uu____1 = Eurydice_slice_subslice2(
5590 out[0U], num_full_blocks * (size_t)8U,
5591 num_full_blocks * (size_t)8U + last_block_len, uint8_t);
5592 uint8_t ret[8U];
5593 core_num__u64_9__to_le_bytes(
5594 state[num_full_blocks / (size_t)5U][num_full_blocks % (size_t)5U], ret);
5595 Eurydice_slice_copy(
5596 uu____1,
5597 Eurydice_array_to_subslice2(ret, (size_t)0U, last_block_len, uint8_t),
5598 uint8_t);
5599 }
5600 }
5601
5602 /**
5603 Squeeze `N` x `LEN` bytes.
5604 */
5605 /**
5606 This function found in impl {libcrux_sha3::generic_keccak::KeccakXofState<STATE,
5607 PARALLEL_LANES, RATE>[TraitClause@0]#2}
5608 */
5609 /**
5610 A monomorphic instance of libcrux_sha3.generic_keccak.squeeze_9d
5611 with types uint64_t
5612 with const generics
5613 - PARALLEL_LANES= 1
5614 - RATE= 168
5615 */
libcrux_sha3_generic_keccak_squeeze_9d_960(libcrux_sha3_generic_keccak_KeccakXofState_78 * self,Eurydice_slice out[1U])5616 static KRML_MUSTINLINE void libcrux_sha3_generic_keccak_squeeze_9d_960(
5617 libcrux_sha3_generic_keccak_KeccakXofState_78 *self,
5618 Eurydice_slice out[1U]) {
5619 if (self->sponge) {
5620 libcrux_sha3_generic_keccak_keccakf1600_21(&self->inner);
5621 }
5622 size_t out_len = Eurydice_slice_len(out[0U], uint8_t);
5623 size_t blocks = out_len / (size_t)168U;
5624 size_t last = out_len - out_len % (size_t)168U;
5625 size_t mid;
5626 if ((size_t)168U >= out_len) {
5627 mid = out_len;
5628 } else {
5629 mid = (size_t)168U;
5630 }
5631 Eurydice_slice_uint8_t_1size_t__x2 uu____0 =
5632 libcrux_sha3_portable_keccak_split_at_mut_n_5a(out, mid);
5633 Eurydice_slice out00[1U];
5634 memcpy(out00, uu____0.fst, (size_t)1U * sizeof(Eurydice_slice));
5635 Eurydice_slice out_rest[1U];
5636 memcpy(out_rest, uu____0.snd, (size_t)1U * sizeof(Eurydice_slice));
5637 libcrux_sha3_portable_keccak_store_5a_1c0(self->inner.st, out00);
5638 core_ops_range_Range_b3 iter =
5639 core_iter_traits_collect___core__iter__traits__collect__IntoIterator_for_I__1__into_iter(
5640 (CLITERAL(core_ops_range_Range_b3){.start = (size_t)1U,
5641 .end = blocks}),
5642 core_ops_range_Range_b3, core_ops_range_Range_b3);
5643 while (true) {
5644 if (core_iter_range___core__iter__traits__iterator__Iterator_for_core__ops__range__Range_A___6__next(
5645 &iter, size_t, Option_b3)
5646 .tag == None) {
5647 break;
5648 } else {
5649 Eurydice_slice_uint8_t_1size_t__x2 uu____1 =
5650 libcrux_sha3_portable_keccak_split_at_mut_n_5a(out_rest,
5651 (size_t)168U);
5652 Eurydice_slice out0[1U];
5653 memcpy(out0, uu____1.fst, (size_t)1U * sizeof(Eurydice_slice));
5654 Eurydice_slice tmp[1U];
5655 memcpy(tmp, uu____1.snd, (size_t)1U * sizeof(Eurydice_slice));
5656 libcrux_sha3_generic_keccak_keccakf1600_21(&self->inner);
5657 libcrux_sha3_portable_keccak_store_5a_1c0(self->inner.st, out0);
5658 memcpy(out_rest, tmp, (size_t)1U * sizeof(Eurydice_slice));
5659 }
5660 }
5661 if (last < out_len) {
5662 libcrux_sha3_generic_keccak_keccakf1600_21(&self->inner);
5663 libcrux_sha3_portable_keccak_store_5a_1c0(self->inner.st, out_rest);
5664 }
5665 self->sponge = true;
5666 }
5667
5668 /**
5669 Shake128 squeeze
5670 */
5671 /**
5672 This function found in impl
5673 {(libcrux_sha3::portable::incremental::XofSqueeze<168: usize> for
5674 libcrux_sha3::portable::incremental::Shake128Squeeze)#1}
5675 */
libcrux_sha3_portable_incremental_squeeze_10(libcrux_sha3_generic_keccak_KeccakXofState_78 * self,Eurydice_slice out)5676 static inline void libcrux_sha3_portable_incremental_squeeze_10(
5677 libcrux_sha3_generic_keccak_KeccakXofState_78 *self, Eurydice_slice out) {
5678 Eurydice_slice buf[1U] = {out};
5679 libcrux_sha3_generic_keccak_squeeze_9d_960(self, buf);
5680 }
5681
5682 /**
5683 This function found in impl {(core::clone::Clone for
5684 libcrux_sha3::portable::KeccakState)}
5685 */
5686 static inline libcrux_sha3_generic_keccak_KeccakState_48
libcrux_sha3_portable_clone_3d(libcrux_sha3_generic_keccak_KeccakState_48 * self)5687 libcrux_sha3_portable_clone_3d(
5688 libcrux_sha3_generic_keccak_KeccakState_48 *self) {
5689 return self[0U];
5690 }
5691
5692 /**
5693 This function found in impl {(core::convert::From<libcrux_sha3::Algorithm> for
5694 u32)#1}
5695 */
libcrux_sha3_from_eb(libcrux_sha3_Algorithm v)5696 static inline uint32_t libcrux_sha3_from_eb(libcrux_sha3_Algorithm v) {
5697 uint32_t uu____0;
5698 switch (v) {
5699 case libcrux_sha3_Sha224: {
5700 uu____0 = 1U;
5701 break;
5702 }
5703 case libcrux_sha3_Sha256: {
5704 uu____0 = 2U;
5705 break;
5706 }
5707 case libcrux_sha3_Sha384: {
5708 uu____0 = 3U;
5709 break;
5710 }
5711 case libcrux_sha3_Sha512: {
5712 uu____0 = 4U;
5713 break;
5714 }
5715 default: {
5716 KRML_HOST_EPRINTF("KaRaMeL incomplete match at %s:%d\n", __FILE__,
5717 __LINE__);
5718 KRML_HOST_EXIT(253U);
5719 }
5720 }
5721 return uu____0;
5722 }
5723
5724 /**
5725 This function found in impl {(core::convert::From<u32> for
5726 libcrux_sha3::Algorithm)}
5727 */
libcrux_sha3_from_2d(uint32_t v)5728 static inline libcrux_sha3_Algorithm libcrux_sha3_from_2d(uint32_t v) {
5729 libcrux_sha3_Algorithm uu____0;
5730 switch (v) {
5731 case 1U: {
5732 uu____0 = libcrux_sha3_Sha224;
5733 break;
5734 }
5735 case 2U: {
5736 uu____0 = libcrux_sha3_Sha256;
5737 break;
5738 }
5739 case 3U: {
5740 uu____0 = libcrux_sha3_Sha384;
5741 break;
5742 }
5743 case 4U: {
5744 uu____0 = libcrux_sha3_Sha512;
5745 break;
5746 }
5747 default: {
5748 KRML_HOST_EPRINTF("KaRaMeL abort at %s:%d\n%s\n", __FILE__, __LINE__,
5749 "panic!");
5750 KRML_HOST_EXIT(255U);
5751 }
5752 }
5753 return uu____0;
5754 }
5755
5756 typedef uint8_t libcrux_sha3_Sha3_512Digest[64U];
5757
5758 typedef uint8_t libcrux_sha3_Sha3_384Digest[48U];
5759
5760 typedef uint8_t libcrux_sha3_Sha3_256Digest[32U];
5761
5762 typedef uint8_t libcrux_sha3_Sha3_224Digest[28U];
5763
5764 #if defined(__cplusplus)
5765 }
5766 #endif
5767
5768 #define __libcrux_sha3_portable_H_DEFINED
5769 #endif
5770
5771 /* from libcrux/libcrux-ml-kem/cg/libcrux_mlkem768_portable.h */
5772 /*
5773 * SPDX-FileCopyrightText: 2024 Cryspen Sarl <info@cryspen.com>
5774 *
5775 * SPDX-License-Identifier: MIT or Apache-2.0
5776 *
5777 * This code was generated with the following revisions:
5778 * Charon: 6b5e110342a771a3e1c739b10294b1778e4be8b4
5779 * Eurydice: 31be7d65ca5d6acdacfb33652e478d24dd85c1cb
5780 * Karamel: 3205d3365ea2790b02368f79fcee38e38d0b5908
5781 * F*: a32b316e521fa4f239b610ec8f1d15e78d62cbe8-dirty
5782 * Libcrux: 4ad532b206174114dd4140b718e7794a28fc59ee
5783 */
5784
5785 #ifndef __libcrux_mlkem768_portable_H
5786 #define __libcrux_mlkem768_portable_H
5787
5788 #if defined(__cplusplus)
5789 extern "C" {
5790 #endif
5791
5792
5793 #define LIBCRUX_ML_KEM_HASH_FUNCTIONS_BLOCK_SIZE ((size_t)168U)
5794
5795 #define LIBCRUX_ML_KEM_HASH_FUNCTIONS_THREE_BLOCKS \
5796 (LIBCRUX_ML_KEM_HASH_FUNCTIONS_BLOCK_SIZE * (size_t)3U)
5797
libcrux_ml_kem_hash_functions_portable_G(Eurydice_slice input,uint8_t ret[64U])5798 static KRML_MUSTINLINE void libcrux_ml_kem_hash_functions_portable_G(
5799 Eurydice_slice input, uint8_t ret[64U]) {
5800 uint8_t digest[64U] = {0U};
5801 libcrux_sha3_portable_sha512(
5802 Eurydice_array_to_slice((size_t)64U, digest, uint8_t), input);
5803 memcpy(ret, digest, (size_t)64U * sizeof(uint8_t));
5804 }
5805
libcrux_ml_kem_hash_functions_portable_H(Eurydice_slice input,uint8_t ret[32U])5806 static KRML_MUSTINLINE void libcrux_ml_kem_hash_functions_portable_H(
5807 Eurydice_slice input, uint8_t ret[32U]) {
5808 uint8_t digest[32U] = {0U};
5809 libcrux_sha3_portable_sha256(
5810 Eurydice_array_to_slice((size_t)32U, digest, uint8_t), input);
5811 memcpy(ret, digest, (size_t)32U * sizeof(uint8_t));
5812 }
5813
5814 #define LIBCRUX_ML_KEM_IND_CCA_ENCAPS_SEED_SIZE \
5815 (LIBCRUX_ML_KEM_CONSTANTS_SHARED_SECRET_SIZE)
5816
5817 #define LIBCRUX_ML_KEM_IND_CCA_KEY_GENERATION_SEED_SIZE \
5818 (LIBCRUX_ML_KEM_CONSTANTS_CPA_PKE_KEY_GENERATION_SEED_SIZE + \
5819 LIBCRUX_ML_KEM_CONSTANTS_SHARED_SECRET_SIZE)
5820
5821 typedef uint8_t libcrux_ml_kem_ind_cca_MlKemSharedSecret[32U];
5822
5823 static const int16_t libcrux_ml_kem_polynomial_ZETAS_TIMES_MONTGOMERY_R[128U] =
5824 {(int16_t)-1044, (int16_t)-758, (int16_t)-359, (int16_t)-1517,
5825 (int16_t)1493, (int16_t)1422, (int16_t)287, (int16_t)202,
5826 (int16_t)-171, (int16_t)622, (int16_t)1577, (int16_t)182,
5827 (int16_t)962, (int16_t)-1202, (int16_t)-1474, (int16_t)1468,
5828 (int16_t)573, (int16_t)-1325, (int16_t)264, (int16_t)383,
5829 (int16_t)-829, (int16_t)1458, (int16_t)-1602, (int16_t)-130,
5830 (int16_t)-681, (int16_t)1017, (int16_t)732, (int16_t)608,
5831 (int16_t)-1542, (int16_t)411, (int16_t)-205, (int16_t)-1571,
5832 (int16_t)1223, (int16_t)652, (int16_t)-552, (int16_t)1015,
5833 (int16_t)-1293, (int16_t)1491, (int16_t)-282, (int16_t)-1544,
5834 (int16_t)516, (int16_t)-8, (int16_t)-320, (int16_t)-666,
5835 (int16_t)-1618, (int16_t)-1162, (int16_t)126, (int16_t)1469,
5836 (int16_t)-853, (int16_t)-90, (int16_t)-271, (int16_t)830,
5837 (int16_t)107, (int16_t)-1421, (int16_t)-247, (int16_t)-951,
5838 (int16_t)-398, (int16_t)961, (int16_t)-1508, (int16_t)-725,
5839 (int16_t)448, (int16_t)-1065, (int16_t)677, (int16_t)-1275,
5840 (int16_t)-1103, (int16_t)430, (int16_t)555, (int16_t)843,
5841 (int16_t)-1251, (int16_t)871, (int16_t)1550, (int16_t)105,
5842 (int16_t)422, (int16_t)587, (int16_t)177, (int16_t)-235,
5843 (int16_t)-291, (int16_t)-460, (int16_t)1574, (int16_t)1653,
5844 (int16_t)-246, (int16_t)778, (int16_t)1159, (int16_t)-147,
5845 (int16_t)-777, (int16_t)1483, (int16_t)-602, (int16_t)1119,
5846 (int16_t)-1590, (int16_t)644, (int16_t)-872, (int16_t)349,
5847 (int16_t)418, (int16_t)329, (int16_t)-156, (int16_t)-75,
5848 (int16_t)817, (int16_t)1097, (int16_t)603, (int16_t)610,
5849 (int16_t)1322, (int16_t)-1285, (int16_t)-1465, (int16_t)384,
5850 (int16_t)-1215, (int16_t)-136, (int16_t)1218, (int16_t)-1335,
5851 (int16_t)-874, (int16_t)220, (int16_t)-1187, (int16_t)-1659,
5852 (int16_t)-1185, (int16_t)-1530, (int16_t)-1278, (int16_t)794,
5853 (int16_t)-1510, (int16_t)-854, (int16_t)-870, (int16_t)478,
5854 (int16_t)-108, (int16_t)-308, (int16_t)996, (int16_t)991,
5855 (int16_t)958, (int16_t)-1460, (int16_t)1522, (int16_t)1628};
5856
5857 #define LIBCRUX_ML_KEM_VECTOR_TRAITS_FIELD_ELEMENTS_IN_VECTOR ((size_t)16U)
5858
5859 #define LIBCRUX_ML_KEM_POLYNOMIAL_VECTORS_IN_RING_ELEMENT \
5860 (LIBCRUX_ML_KEM_CONSTANTS_COEFFICIENTS_IN_RING_ELEMENT / \
5861 LIBCRUX_ML_KEM_VECTOR_TRAITS_FIELD_ELEMENTS_IN_VECTOR)
5862
5863 #define LIBCRUX_ML_KEM_VECTOR_TRAITS_FIELD_MODULUS ((int16_t)3329)
5864
5865 #define LIBCRUX_ML_KEM_VECTOR_TRAITS_MONTGOMERY_R_SQUARED_MOD_FIELD_MODULUS \
5866 ((int16_t)1353)
5867
5868 #define LIBCRUX_ML_KEM_VECTOR_TRAITS_INVERSE_OF_MODULUS_MOD_MONTGOMERY_R \
5869 (62209U)
5870
5871 typedef struct libcrux_ml_kem_vector_portable_vector_type_PortableVector_s {
5872 int16_t elements[16U];
5873 } libcrux_ml_kem_vector_portable_vector_type_PortableVector;
5874
5875 static KRML_MUSTINLINE libcrux_ml_kem_vector_portable_vector_type_PortableVector
libcrux_ml_kem_vector_portable_vector_type_from_i16_array(Eurydice_slice array)5876 libcrux_ml_kem_vector_portable_vector_type_from_i16_array(
5877 Eurydice_slice array) {
5878 libcrux_ml_kem_vector_portable_vector_type_PortableVector lit;
5879 int16_t ret[16U];
5880 Result_c0 dst;
5881 Eurydice_slice_to_array2(
5882 &dst, Eurydice_slice_subslice2(array, (size_t)0U, (size_t)16U, int16_t),
5883 Eurydice_slice, int16_t[16U]);
5884 unwrap_41_f9(dst, ret);
5885 memcpy(lit.elements, ret, (size_t)16U * sizeof(int16_t));
5886 return lit;
5887 }
5888
5889 /**
5890 This function found in impl {(libcrux_ml_kem::vector::traits::Operations for
5891 libcrux_ml_kem::vector::portable::vector_type::PortableVector)}
5892 */
5893 static inline libcrux_ml_kem_vector_portable_vector_type_PortableVector
libcrux_ml_kem_vector_portable_from_i16_array_0d(Eurydice_slice array)5894 libcrux_ml_kem_vector_portable_from_i16_array_0d(Eurydice_slice array) {
5895 return libcrux_ml_kem_vector_portable_vector_type_from_i16_array(array);
5896 }
5897
5898 typedef struct uint8_t_x11_s {
5899 uint8_t fst;
5900 uint8_t snd;
5901 uint8_t thd;
5902 uint8_t f3;
5903 uint8_t f4;
5904 uint8_t f5;
5905 uint8_t f6;
5906 uint8_t f7;
5907 uint8_t f8;
5908 uint8_t f9;
5909 uint8_t f10;
5910 } uint8_t_x11;
5911
5912 static KRML_MUSTINLINE uint8_t_x11
libcrux_ml_kem_vector_portable_serialize_serialize_11_int(Eurydice_slice v)5913 libcrux_ml_kem_vector_portable_serialize_serialize_11_int(Eurydice_slice v) {
5914 uint8_t r0 = (uint8_t)Eurydice_slice_index(v, (size_t)0U, int16_t, int16_t *);
5915 uint8_t r1 = (uint32_t)(uint8_t)(Eurydice_slice_index(v, (size_t)1U, int16_t,
5916 int16_t *) &
5917 (int16_t)31)
5918 << 3U |
5919 (uint32_t)(uint8_t)(Eurydice_slice_index(v, (size_t)0U, int16_t,
5920 int16_t *) >>
5921 8U);
5922 uint8_t r2 = (uint32_t)(uint8_t)(Eurydice_slice_index(v, (size_t)2U, int16_t,
5923 int16_t *) &
5924 (int16_t)3)
5925 << 6U |
5926 (uint32_t)(uint8_t)(Eurydice_slice_index(v, (size_t)1U, int16_t,
5927 int16_t *) >>
5928 5U);
5929 uint8_t r3 =
5930 (uint8_t)(Eurydice_slice_index(v, (size_t)2U, int16_t, int16_t *) >> 2U &
5931 (int16_t)255);
5932 uint8_t r4 = (uint32_t)(uint8_t)(Eurydice_slice_index(v, (size_t)3U, int16_t,
5933 int16_t *) &
5934 (int16_t)127)
5935 << 1U |
5936 (uint32_t)(uint8_t)(Eurydice_slice_index(v, (size_t)2U, int16_t,
5937 int16_t *) >>
5938 10U);
5939 uint8_t r5 = (uint32_t)(uint8_t)(Eurydice_slice_index(v, (size_t)4U, int16_t,
5940 int16_t *) &
5941 (int16_t)15)
5942 << 4U |
5943 (uint32_t)(uint8_t)(Eurydice_slice_index(v, (size_t)3U, int16_t,
5944 int16_t *) >>
5945 7U);
5946 uint8_t r6 = (uint32_t)(uint8_t)(Eurydice_slice_index(v, (size_t)5U, int16_t,
5947 int16_t *) &
5948 (int16_t)1)
5949 << 7U |
5950 (uint32_t)(uint8_t)(Eurydice_slice_index(v, (size_t)4U, int16_t,
5951 int16_t *) >>
5952 4U);
5953 uint8_t r7 =
5954 (uint8_t)(Eurydice_slice_index(v, (size_t)5U, int16_t, int16_t *) >> 1U &
5955 (int16_t)255);
5956 uint8_t r8 = (uint32_t)(uint8_t)(Eurydice_slice_index(v, (size_t)6U, int16_t,
5957 int16_t *) &
5958 (int16_t)63)
5959 << 2U |
5960 (uint32_t)(uint8_t)(Eurydice_slice_index(v, (size_t)5U, int16_t,
5961 int16_t *) >>
5962 9U);
5963 uint8_t r9 = (uint32_t)(uint8_t)(Eurydice_slice_index(v, (size_t)7U, int16_t,
5964 int16_t *) &
5965 (int16_t)7)
5966 << 5U |
5967 (uint32_t)(uint8_t)(Eurydice_slice_index(v, (size_t)6U, int16_t,
5968 int16_t *) >>
5969 6U);
5970 uint8_t r10 =
5971 (uint8_t)(Eurydice_slice_index(v, (size_t)7U, int16_t, int16_t *) >> 3U);
5972 return (CLITERAL(uint8_t_x11){.fst = r0,
5973 .snd = r1,
5974 .thd = r2,
5975 .f3 = r3,
5976 .f4 = r4,
5977 .f5 = r5,
5978 .f6 = r6,
5979 .f7 = r7,
5980 .f8 = r8,
5981 .f9 = r9,
5982 .f10 = r10});
5983 }
5984
5985 static KRML_MUSTINLINE void
libcrux_ml_kem_vector_portable_serialize_serialize_11(libcrux_ml_kem_vector_portable_vector_type_PortableVector v,uint8_t ret[22U])5986 libcrux_ml_kem_vector_portable_serialize_serialize_11(
5987 libcrux_ml_kem_vector_portable_vector_type_PortableVector v,
5988 uint8_t ret[22U]) {
5989 uint8_t_x11 r0_10 = libcrux_ml_kem_vector_portable_serialize_serialize_11_int(
5990 Eurydice_array_to_subslice2(v.elements, (size_t)0U, (size_t)8U, int16_t));
5991 uint8_t_x11 r11_21 =
5992 libcrux_ml_kem_vector_portable_serialize_serialize_11_int(
5993 Eurydice_array_to_subslice2(v.elements, (size_t)8U, (size_t)16U,
5994 int16_t));
5995 uint8_t result[22U] = {0U};
5996 result[0U] = r0_10.fst;
5997 result[1U] = r0_10.snd;
5998 result[2U] = r0_10.thd;
5999 result[3U] = r0_10.f3;
6000 result[4U] = r0_10.f4;
6001 result[5U] = r0_10.f5;
6002 result[6U] = r0_10.f6;
6003 result[7U] = r0_10.f7;
6004 result[8U] = r0_10.f8;
6005 result[9U] = r0_10.f9;
6006 result[10U] = r0_10.f10;
6007 result[11U] = r11_21.fst;
6008 result[12U] = r11_21.snd;
6009 result[13U] = r11_21.thd;
6010 result[14U] = r11_21.f3;
6011 result[15U] = r11_21.f4;
6012 result[16U] = r11_21.f5;
6013 result[17U] = r11_21.f6;
6014 result[18U] = r11_21.f7;
6015 result[19U] = r11_21.f8;
6016 result[20U] = r11_21.f9;
6017 result[21U] = r11_21.f10;
6018 memcpy(ret, result, (size_t)22U * sizeof(uint8_t));
6019 }
6020
6021 /**
6022 This function found in impl {(libcrux_ml_kem::vector::traits::Operations for
6023 libcrux_ml_kem::vector::portable::vector_type::PortableVector)}
6024 */
libcrux_ml_kem_vector_portable_serialize_11_0d(libcrux_ml_kem_vector_portable_vector_type_PortableVector a,uint8_t ret[22U])6025 static inline void libcrux_ml_kem_vector_portable_serialize_11_0d(
6026 libcrux_ml_kem_vector_portable_vector_type_PortableVector a,
6027 uint8_t ret[22U]) {
6028 libcrux_ml_kem_vector_portable_serialize_serialize_11(a, ret);
6029 }
6030
6031 typedef struct int16_t_x8_s {
6032 int16_t fst;
6033 int16_t snd;
6034 int16_t thd;
6035 int16_t f3;
6036 int16_t f4;
6037 int16_t f5;
6038 int16_t f6;
6039 int16_t f7;
6040 } int16_t_x8;
6041
6042 static KRML_MUSTINLINE int16_t_x8
libcrux_ml_kem_vector_portable_serialize_deserialize_11_int(Eurydice_slice bytes)6043 libcrux_ml_kem_vector_portable_serialize_deserialize_11_int(
6044 Eurydice_slice bytes) {
6045 int16_t r0 =
6046 ((int16_t)Eurydice_slice_index(bytes, (size_t)1U, uint8_t, uint8_t *) &
6047 (int16_t)7)
6048 << 8U |
6049 (int16_t)Eurydice_slice_index(bytes, (size_t)0U, uint8_t, uint8_t *);
6050 int16_t r1 =
6051 ((int16_t)Eurydice_slice_index(bytes, (size_t)2U, uint8_t, uint8_t *) &
6052 (int16_t)63)
6053 << 5U |
6054 (int16_t)Eurydice_slice_index(bytes, (size_t)1U, uint8_t, uint8_t *) >>
6055 3U;
6056 int16_t r2 =
6057 (((int16_t)Eurydice_slice_index(bytes, (size_t)4U, uint8_t, uint8_t *) &
6058 (int16_t)1)
6059 << 10U |
6060 (int16_t)Eurydice_slice_index(bytes, (size_t)3U, uint8_t, uint8_t *)
6061 << 2U) |
6062 (int16_t)Eurydice_slice_index(bytes, (size_t)2U, uint8_t, uint8_t *) >>
6063 6U;
6064 int16_t r3 =
6065 ((int16_t)Eurydice_slice_index(bytes, (size_t)5U, uint8_t, uint8_t *) &
6066 (int16_t)15)
6067 << 7U |
6068 (int16_t)Eurydice_slice_index(bytes, (size_t)4U, uint8_t, uint8_t *) >>
6069 1U;
6070 int16_t r4 =
6071 ((int16_t)Eurydice_slice_index(bytes, (size_t)6U, uint8_t, uint8_t *) &
6072 (int16_t)127)
6073 << 4U |
6074 (int16_t)Eurydice_slice_index(bytes, (size_t)5U, uint8_t, uint8_t *) >>
6075 4U;
6076 int16_t r5 =
6077 (((int16_t)Eurydice_slice_index(bytes, (size_t)8U, uint8_t, uint8_t *) &
6078 (int16_t)3)
6079 << 9U |
6080 (int16_t)Eurydice_slice_index(bytes, (size_t)7U, uint8_t, uint8_t *)
6081 << 1U) |
6082 (int16_t)Eurydice_slice_index(bytes, (size_t)6U, uint8_t, uint8_t *) >>
6083 7U;
6084 int16_t r6 =
6085 ((int16_t)Eurydice_slice_index(bytes, (size_t)9U, uint8_t, uint8_t *) &
6086 (int16_t)31)
6087 << 6U |
6088 (int16_t)Eurydice_slice_index(bytes, (size_t)8U, uint8_t, uint8_t *) >>
6089 2U;
6090 int16_t r7 =
6091 (int16_t)Eurydice_slice_index(bytes, (size_t)10U, uint8_t, uint8_t *)
6092 << 3U |
6093 (int16_t)Eurydice_slice_index(bytes, (size_t)9U, uint8_t, uint8_t *) >>
6094 5U;
6095 return (CLITERAL(int16_t_x8){.fst = r0,
6096 .snd = r1,
6097 .thd = r2,
6098 .f3 = r3,
6099 .f4 = r4,
6100 .f5 = r5,
6101 .f6 = r6,
6102 .f7 = r7});
6103 }
6104
6105 static KRML_MUSTINLINE libcrux_ml_kem_vector_portable_vector_type_PortableVector
libcrux_ml_kem_vector_portable_vector_type_zero(void)6106 libcrux_ml_kem_vector_portable_vector_type_zero(void) {
6107 libcrux_ml_kem_vector_portable_vector_type_PortableVector lit;
6108 lit.elements[0U] = (int16_t)0;
6109 lit.elements[1U] = (int16_t)0;
6110 lit.elements[2U] = (int16_t)0;
6111 lit.elements[3U] = (int16_t)0;
6112 lit.elements[4U] = (int16_t)0;
6113 lit.elements[5U] = (int16_t)0;
6114 lit.elements[6U] = (int16_t)0;
6115 lit.elements[7U] = (int16_t)0;
6116 lit.elements[8U] = (int16_t)0;
6117 lit.elements[9U] = (int16_t)0;
6118 lit.elements[10U] = (int16_t)0;
6119 lit.elements[11U] = (int16_t)0;
6120 lit.elements[12U] = (int16_t)0;
6121 lit.elements[13U] = (int16_t)0;
6122 lit.elements[14U] = (int16_t)0;
6123 lit.elements[15U] = (int16_t)0;
6124 return lit;
6125 }
6126
6127 static KRML_MUSTINLINE libcrux_ml_kem_vector_portable_vector_type_PortableVector
libcrux_ml_kem_vector_portable_serialize_deserialize_11(Eurydice_slice bytes)6128 libcrux_ml_kem_vector_portable_serialize_deserialize_11(Eurydice_slice bytes) {
6129 int16_t_x8 v0_7 = libcrux_ml_kem_vector_portable_serialize_deserialize_11_int(
6130 Eurydice_slice_subslice2(bytes, (size_t)0U, (size_t)11U, uint8_t));
6131 int16_t_x8 v8_15 =
6132 libcrux_ml_kem_vector_portable_serialize_deserialize_11_int(
6133 Eurydice_slice_subslice2(bytes, (size_t)11U, (size_t)22U, uint8_t));
6134 libcrux_ml_kem_vector_portable_vector_type_PortableVector v =
6135 libcrux_ml_kem_vector_portable_vector_type_zero();
6136 v.elements[0U] = v0_7.fst;
6137 v.elements[1U] = v0_7.snd;
6138 v.elements[2U] = v0_7.thd;
6139 v.elements[3U] = v0_7.f3;
6140 v.elements[4U] = v0_7.f4;
6141 v.elements[5U] = v0_7.f5;
6142 v.elements[6U] = v0_7.f6;
6143 v.elements[7U] = v0_7.f7;
6144 v.elements[8U] = v8_15.fst;
6145 v.elements[9U] = v8_15.snd;
6146 v.elements[10U] = v8_15.thd;
6147 v.elements[11U] = v8_15.f3;
6148 v.elements[12U] = v8_15.f4;
6149 v.elements[13U] = v8_15.f5;
6150 v.elements[14U] = v8_15.f6;
6151 v.elements[15U] = v8_15.f7;
6152 return v;
6153 }
6154
6155 /**
6156 This function found in impl {(libcrux_ml_kem::vector::traits::Operations for
6157 libcrux_ml_kem::vector::portable::vector_type::PortableVector)}
6158 */
6159 static inline libcrux_ml_kem_vector_portable_vector_type_PortableVector
libcrux_ml_kem_vector_portable_deserialize_11_0d(Eurydice_slice a)6160 libcrux_ml_kem_vector_portable_deserialize_11_0d(Eurydice_slice a) {
6161 return libcrux_ml_kem_vector_portable_serialize_deserialize_11(a);
6162 }
6163
6164 static KRML_MUSTINLINE void
libcrux_ml_kem_vector_portable_vector_type_to_i16_array(libcrux_ml_kem_vector_portable_vector_type_PortableVector x,int16_t ret[16U])6165 libcrux_ml_kem_vector_portable_vector_type_to_i16_array(
6166 libcrux_ml_kem_vector_portable_vector_type_PortableVector x,
6167 int16_t ret[16U]) {
6168 memcpy(ret, x.elements, (size_t)16U * sizeof(int16_t));
6169 }
6170
6171 /**
6172 This function found in impl {(libcrux_ml_kem::vector::traits::Operations for
6173 libcrux_ml_kem::vector::portable::vector_type::PortableVector)}
6174 */
libcrux_ml_kem_vector_portable_to_i16_array_0d(libcrux_ml_kem_vector_portable_vector_type_PortableVector x,int16_t ret[16U])6175 static inline void libcrux_ml_kem_vector_portable_to_i16_array_0d(
6176 libcrux_ml_kem_vector_portable_vector_type_PortableVector x,
6177 int16_t ret[16U]) {
6178 libcrux_ml_kem_vector_portable_vector_type_to_i16_array(x, ret);
6179 }
6180
6181 static const uint8_t
6182 libcrux_ml_kem_vector_rej_sample_table_REJECTION_SAMPLE_SHUFFLE_TABLE
6183 [256U][16U] = {{255U, 255U, 255U, 255U, 255U, 255U, 255U, 255U, 255U,
6184 255U, 255U, 255U, 255U, 255U, 255U, 255U},
6185 {0U, 1U, 255U, 255U, 255U, 255U, 255U, 255U, 255U, 255U,
6186 255U, 255U, 255U, 255U, 255U, 255U},
6187 {2U, 3U, 255U, 255U, 255U, 255U, 255U, 255U, 255U, 255U,
6188 255U, 255U, 255U, 255U, 255U, 255U},
6189 {0U, 1U, 2U, 3U, 255U, 255U, 255U, 255U, 255U, 255U,
6190 255U, 255U, 255U, 255U, 255U, 255U},
6191 {4U, 5U, 255U, 255U, 255U, 255U, 255U, 255U, 255U, 255U,
6192 255U, 255U, 255U, 255U, 255U, 255U},
6193 {0U, 1U, 4U, 5U, 255U, 255U, 255U, 255U, 255U, 255U,
6194 255U, 255U, 255U, 255U, 255U, 255U},
6195 {2U, 3U, 4U, 5U, 255U, 255U, 255U, 255U, 255U, 255U,
6196 255U, 255U, 255U, 255U, 255U, 255U},
6197 {0U, 1U, 2U, 3U, 4U, 5U, 255U, 255U, 255U, 255U, 255U,
6198 255U, 255U, 255U, 255U, 255U},
6199 {6U, 7U, 255U, 255U, 255U, 255U, 255U, 255U, 255U, 255U,
6200 255U, 255U, 255U, 255U, 255U, 255U},
6201 {0U, 1U, 6U, 7U, 255U, 255U, 255U, 255U, 255U, 255U,
6202 255U, 255U, 255U, 255U, 255U, 255U},
6203 {2U, 3U, 6U, 7U, 255U, 255U, 255U, 255U, 255U, 255U,
6204 255U, 255U, 255U, 255U, 255U, 255U},
6205 {0U, 1U, 2U, 3U, 6U, 7U, 255U, 255U, 255U, 255U, 255U,
6206 255U, 255U, 255U, 255U, 255U},
6207 {4U, 5U, 6U, 7U, 255U, 255U, 255U, 255U, 255U, 255U,
6208 255U, 255U, 255U, 255U, 255U, 255U},
6209 {0U, 1U, 4U, 5U, 6U, 7U, 255U, 255U, 255U, 255U, 255U,
6210 255U, 255U, 255U, 255U, 255U},
6211 {2U, 3U, 4U, 5U, 6U, 7U, 255U, 255U, 255U, 255U, 255U,
6212 255U, 255U, 255U, 255U, 255U},
6213 {0U, 1U, 2U, 3U, 4U, 5U, 6U, 7U, 255U, 255U, 255U, 255U,
6214 255U, 255U, 255U, 255U},
6215 {8U, 9U, 255U, 255U, 255U, 255U, 255U, 255U, 255U, 255U,
6216 255U, 255U, 255U, 255U, 255U, 255U},
6217 {0U, 1U, 8U, 9U, 255U, 255U, 255U, 255U, 255U, 255U,
6218 255U, 255U, 255U, 255U, 255U, 255U},
6219 {2U, 3U, 8U, 9U, 255U, 255U, 255U, 255U, 255U, 255U,
6220 255U, 255U, 255U, 255U, 255U, 255U},
6221 {0U, 1U, 2U, 3U, 8U, 9U, 255U, 255U, 255U, 255U, 255U,
6222 255U, 255U, 255U, 255U, 255U},
6223 {4U, 5U, 8U, 9U, 255U, 255U, 255U, 255U, 255U, 255U,
6224 255U, 255U, 255U, 255U, 255U, 255U},
6225 {0U, 1U, 4U, 5U, 8U, 9U, 255U, 255U, 255U, 255U, 255U,
6226 255U, 255U, 255U, 255U, 255U},
6227 {2U, 3U, 4U, 5U, 8U, 9U, 255U, 255U, 255U, 255U, 255U,
6228 255U, 255U, 255U, 255U, 255U},
6229 {0U, 1U, 2U, 3U, 4U, 5U, 8U, 9U, 255U, 255U, 255U, 255U,
6230 255U, 255U, 255U, 255U},
6231 {6U, 7U, 8U, 9U, 255U, 255U, 255U, 255U, 255U, 255U,
6232 255U, 255U, 255U, 255U, 255U, 255U},
6233 {0U, 1U, 6U, 7U, 8U, 9U, 255U, 255U, 255U, 255U, 255U,
6234 255U, 255U, 255U, 255U, 255U},
6235 {2U, 3U, 6U, 7U, 8U, 9U, 255U, 255U, 255U, 255U, 255U,
6236 255U, 255U, 255U, 255U, 255U},
6237 {0U, 1U, 2U, 3U, 6U, 7U, 8U, 9U, 255U, 255U, 255U, 255U,
6238 255U, 255U, 255U, 255U},
6239 {4U, 5U, 6U, 7U, 8U, 9U, 255U, 255U, 255U, 255U, 255U,
6240 255U, 255U, 255U, 255U, 255U},
6241 {0U, 1U, 4U, 5U, 6U, 7U, 8U, 9U, 255U, 255U, 255U, 255U,
6242 255U, 255U, 255U, 255U},
6243 {2U, 3U, 4U, 5U, 6U, 7U, 8U, 9U, 255U, 255U, 255U, 255U,
6244 255U, 255U, 255U, 255U},
6245 {0U, 1U, 2U, 3U, 4U, 5U, 6U, 7U, 8U, 9U, 255U, 255U,
6246 255U, 255U, 255U, 255U},
6247 {10U, 11U, 255U, 255U, 255U, 255U, 255U, 255U, 255U,
6248 255U, 255U, 255U, 255U, 255U, 255U, 255U},
6249 {0U, 1U, 10U, 11U, 255U, 255U, 255U, 255U, 255U, 255U,
6250 255U, 255U, 255U, 255U, 255U, 255U},
6251 {2U, 3U, 10U, 11U, 255U, 255U, 255U, 255U, 255U, 255U,
6252 255U, 255U, 255U, 255U, 255U, 255U},
6253 {0U, 1U, 2U, 3U, 10U, 11U, 255U, 255U, 255U, 255U, 255U,
6254 255U, 255U, 255U, 255U, 255U},
6255 {4U, 5U, 10U, 11U, 255U, 255U, 255U, 255U, 255U, 255U,
6256 255U, 255U, 255U, 255U, 255U, 255U},
6257 {0U, 1U, 4U, 5U, 10U, 11U, 255U, 255U, 255U, 255U, 255U,
6258 255U, 255U, 255U, 255U, 255U},
6259 {2U, 3U, 4U, 5U, 10U, 11U, 255U, 255U, 255U, 255U, 255U,
6260 255U, 255U, 255U, 255U, 255U},
6261 {0U, 1U, 2U, 3U, 4U, 5U, 10U, 11U, 255U, 255U, 255U,
6262 255U, 255U, 255U, 255U, 255U},
6263 {6U, 7U, 10U, 11U, 255U, 255U, 255U, 255U, 255U, 255U,
6264 255U, 255U, 255U, 255U, 255U, 255U},
6265 {0U, 1U, 6U, 7U, 10U, 11U, 255U, 255U, 255U, 255U, 255U,
6266 255U, 255U, 255U, 255U, 255U},
6267 {2U, 3U, 6U, 7U, 10U, 11U, 255U, 255U, 255U, 255U, 255U,
6268 255U, 255U, 255U, 255U, 255U},
6269 {0U, 1U, 2U, 3U, 6U, 7U, 10U, 11U, 255U, 255U, 255U,
6270 255U, 255U, 255U, 255U, 255U},
6271 {4U, 5U, 6U, 7U, 10U, 11U, 255U, 255U, 255U, 255U, 255U,
6272 255U, 255U, 255U, 255U, 255U},
6273 {0U, 1U, 4U, 5U, 6U, 7U, 10U, 11U, 255U, 255U, 255U,
6274 255U, 255U, 255U, 255U, 255U},
6275 {2U, 3U, 4U, 5U, 6U, 7U, 10U, 11U, 255U, 255U, 255U,
6276 255U, 255U, 255U, 255U, 255U},
6277 {0U, 1U, 2U, 3U, 4U, 5U, 6U, 7U, 10U, 11U, 255U, 255U,
6278 255U, 255U, 255U, 255U},
6279 {8U, 9U, 10U, 11U, 255U, 255U, 255U, 255U, 255U, 255U,
6280 255U, 255U, 255U, 255U, 255U, 255U},
6281 {0U, 1U, 8U, 9U, 10U, 11U, 255U, 255U, 255U, 255U, 255U,
6282 255U, 255U, 255U, 255U, 255U},
6283 {2U, 3U, 8U, 9U, 10U, 11U, 255U, 255U, 255U, 255U, 255U,
6284 255U, 255U, 255U, 255U, 255U},
6285 {0U, 1U, 2U, 3U, 8U, 9U, 10U, 11U, 255U, 255U, 255U,
6286 255U, 255U, 255U, 255U, 255U},
6287 {4U, 5U, 8U, 9U, 10U, 11U, 255U, 255U, 255U, 255U, 255U,
6288 255U, 255U, 255U, 255U, 255U},
6289 {0U, 1U, 4U, 5U, 8U, 9U, 10U, 11U, 255U, 255U, 255U,
6290 255U, 255U, 255U, 255U, 255U},
6291 {2U, 3U, 4U, 5U, 8U, 9U, 10U, 11U, 255U, 255U, 255U,
6292 255U, 255U, 255U, 255U, 255U},
6293 {0U, 1U, 2U, 3U, 4U, 5U, 8U, 9U, 10U, 11U, 255U, 255U,
6294 255U, 255U, 255U, 255U},
6295 {6U, 7U, 8U, 9U, 10U, 11U, 255U, 255U, 255U, 255U, 255U,
6296 255U, 255U, 255U, 255U, 255U},
6297 {0U, 1U, 6U, 7U, 8U, 9U, 10U, 11U, 255U, 255U, 255U,
6298 255U, 255U, 255U, 255U, 255U},
6299 {2U, 3U, 6U, 7U, 8U, 9U, 10U, 11U, 255U, 255U, 255U,
6300 255U, 255U, 255U, 255U, 255U},
6301 {0U, 1U, 2U, 3U, 6U, 7U, 8U, 9U, 10U, 11U, 255U, 255U,
6302 255U, 255U, 255U, 255U},
6303 {4U, 5U, 6U, 7U, 8U, 9U, 10U, 11U, 255U, 255U, 255U,
6304 255U, 255U, 255U, 255U, 255U},
6305 {0U, 1U, 4U, 5U, 6U, 7U, 8U, 9U, 10U, 11U, 255U, 255U,
6306 255U, 255U, 255U, 255U},
6307 {2U, 3U, 4U, 5U, 6U, 7U, 8U, 9U, 10U, 11U, 255U, 255U,
6308 255U, 255U, 255U, 255U},
6309 {0U, 1U, 2U, 3U, 4U, 5U, 6U, 7U, 8U, 9U, 10U, 11U, 255U,
6310 255U, 255U, 255U},
6311 {12U, 13U, 255U, 255U, 255U, 255U, 255U, 255U, 255U,
6312 255U, 255U, 255U, 255U, 255U, 255U, 255U},
6313 {0U, 1U, 12U, 13U, 255U, 255U, 255U, 255U, 255U, 255U,
6314 255U, 255U, 255U, 255U, 255U, 255U},
6315 {2U, 3U, 12U, 13U, 255U, 255U, 255U, 255U, 255U, 255U,
6316 255U, 255U, 255U, 255U, 255U, 255U},
6317 {0U, 1U, 2U, 3U, 12U, 13U, 255U, 255U, 255U, 255U, 255U,
6318 255U, 255U, 255U, 255U, 255U},
6319 {4U, 5U, 12U, 13U, 255U, 255U, 255U, 255U, 255U, 255U,
6320 255U, 255U, 255U, 255U, 255U, 255U},
6321 {0U, 1U, 4U, 5U, 12U, 13U, 255U, 255U, 255U, 255U, 255U,
6322 255U, 255U, 255U, 255U, 255U},
6323 {2U, 3U, 4U, 5U, 12U, 13U, 255U, 255U, 255U, 255U, 255U,
6324 255U, 255U, 255U, 255U, 255U},
6325 {0U, 1U, 2U, 3U, 4U, 5U, 12U, 13U, 255U, 255U, 255U,
6326 255U, 255U, 255U, 255U, 255U},
6327 {6U, 7U, 12U, 13U, 255U, 255U, 255U, 255U, 255U, 255U,
6328 255U, 255U, 255U, 255U, 255U, 255U},
6329 {0U, 1U, 6U, 7U, 12U, 13U, 255U, 255U, 255U, 255U, 255U,
6330 255U, 255U, 255U, 255U, 255U},
6331 {2U, 3U, 6U, 7U, 12U, 13U, 255U, 255U, 255U, 255U, 255U,
6332 255U, 255U, 255U, 255U, 255U},
6333 {0U, 1U, 2U, 3U, 6U, 7U, 12U, 13U, 255U, 255U, 255U,
6334 255U, 255U, 255U, 255U, 255U},
6335 {4U, 5U, 6U, 7U, 12U, 13U, 255U, 255U, 255U, 255U, 255U,
6336 255U, 255U, 255U, 255U, 255U},
6337 {0U, 1U, 4U, 5U, 6U, 7U, 12U, 13U, 255U, 255U, 255U,
6338 255U, 255U, 255U, 255U, 255U},
6339 {2U, 3U, 4U, 5U, 6U, 7U, 12U, 13U, 255U, 255U, 255U,
6340 255U, 255U, 255U, 255U, 255U},
6341 {0U, 1U, 2U, 3U, 4U, 5U, 6U, 7U, 12U, 13U, 255U, 255U,
6342 255U, 255U, 255U, 255U},
6343 {8U, 9U, 12U, 13U, 255U, 255U, 255U, 255U, 255U, 255U,
6344 255U, 255U, 255U, 255U, 255U, 255U},
6345 {0U, 1U, 8U, 9U, 12U, 13U, 255U, 255U, 255U, 255U, 255U,
6346 255U, 255U, 255U, 255U, 255U},
6347 {2U, 3U, 8U, 9U, 12U, 13U, 255U, 255U, 255U, 255U, 255U,
6348 255U, 255U, 255U, 255U, 255U},
6349 {0U, 1U, 2U, 3U, 8U, 9U, 12U, 13U, 255U, 255U, 255U,
6350 255U, 255U, 255U, 255U, 255U},
6351 {4U, 5U, 8U, 9U, 12U, 13U, 255U, 255U, 255U, 255U, 255U,
6352 255U, 255U, 255U, 255U, 255U},
6353 {0U, 1U, 4U, 5U, 8U, 9U, 12U, 13U, 255U, 255U, 255U,
6354 255U, 255U, 255U, 255U, 255U},
6355 {2U, 3U, 4U, 5U, 8U, 9U, 12U, 13U, 255U, 255U, 255U,
6356 255U, 255U, 255U, 255U, 255U},
6357 {0U, 1U, 2U, 3U, 4U, 5U, 8U, 9U, 12U, 13U, 255U, 255U,
6358 255U, 255U, 255U, 255U},
6359 {6U, 7U, 8U, 9U, 12U, 13U, 255U, 255U, 255U, 255U, 255U,
6360 255U, 255U, 255U, 255U, 255U},
6361 {0U, 1U, 6U, 7U, 8U, 9U, 12U, 13U, 255U, 255U, 255U,
6362 255U, 255U, 255U, 255U, 255U},
6363 {2U, 3U, 6U, 7U, 8U, 9U, 12U, 13U, 255U, 255U, 255U,
6364 255U, 255U, 255U, 255U, 255U},
6365 {0U, 1U, 2U, 3U, 6U, 7U, 8U, 9U, 12U, 13U, 255U, 255U,
6366 255U, 255U, 255U, 255U},
6367 {4U, 5U, 6U, 7U, 8U, 9U, 12U, 13U, 255U, 255U, 255U,
6368 255U, 255U, 255U, 255U, 255U},
6369 {0U, 1U, 4U, 5U, 6U, 7U, 8U, 9U, 12U, 13U, 255U, 255U,
6370 255U, 255U, 255U, 255U},
6371 {2U, 3U, 4U, 5U, 6U, 7U, 8U, 9U, 12U, 13U, 255U, 255U,
6372 255U, 255U, 255U, 255U},
6373 {0U, 1U, 2U, 3U, 4U, 5U, 6U, 7U, 8U, 9U, 12U, 13U, 255U,
6374 255U, 255U, 255U},
6375 {10U, 11U, 12U, 13U, 255U, 255U, 255U, 255U, 255U, 255U,
6376 255U, 255U, 255U, 255U, 255U, 255U},
6377 {0U, 1U, 10U, 11U, 12U, 13U, 255U, 255U, 255U, 255U,
6378 255U, 255U, 255U, 255U, 255U, 255U},
6379 {2U, 3U, 10U, 11U, 12U, 13U, 255U, 255U, 255U, 255U,
6380 255U, 255U, 255U, 255U, 255U, 255U},
6381 {0U, 1U, 2U, 3U, 10U, 11U, 12U, 13U, 255U, 255U, 255U,
6382 255U, 255U, 255U, 255U, 255U},
6383 {4U, 5U, 10U, 11U, 12U, 13U, 255U, 255U, 255U, 255U,
6384 255U, 255U, 255U, 255U, 255U, 255U},
6385 {0U, 1U, 4U, 5U, 10U, 11U, 12U, 13U, 255U, 255U, 255U,
6386 255U, 255U, 255U, 255U, 255U},
6387 {2U, 3U, 4U, 5U, 10U, 11U, 12U, 13U, 255U, 255U, 255U,
6388 255U, 255U, 255U, 255U, 255U},
6389 {0U, 1U, 2U, 3U, 4U, 5U, 10U, 11U, 12U, 13U, 255U, 255U,
6390 255U, 255U, 255U, 255U},
6391 {6U, 7U, 10U, 11U, 12U, 13U, 255U, 255U, 255U, 255U,
6392 255U, 255U, 255U, 255U, 255U, 255U},
6393 {0U, 1U, 6U, 7U, 10U, 11U, 12U, 13U, 255U, 255U, 255U,
6394 255U, 255U, 255U, 255U, 255U},
6395 {2U, 3U, 6U, 7U, 10U, 11U, 12U, 13U, 255U, 255U, 255U,
6396 255U, 255U, 255U, 255U, 255U},
6397 {0U, 1U, 2U, 3U, 6U, 7U, 10U, 11U, 12U, 13U, 255U, 255U,
6398 255U, 255U, 255U, 255U},
6399 {4U, 5U, 6U, 7U, 10U, 11U, 12U, 13U, 255U, 255U, 255U,
6400 255U, 255U, 255U, 255U, 255U},
6401 {0U, 1U, 4U, 5U, 6U, 7U, 10U, 11U, 12U, 13U, 255U, 255U,
6402 255U, 255U, 255U, 255U},
6403 {2U, 3U, 4U, 5U, 6U, 7U, 10U, 11U, 12U, 13U, 255U, 255U,
6404 255U, 255U, 255U, 255U},
6405 {0U, 1U, 2U, 3U, 4U, 5U, 6U, 7U, 10U, 11U, 12U, 13U,
6406 255U, 255U, 255U, 255U},
6407 {8U, 9U, 10U, 11U, 12U, 13U, 255U, 255U, 255U, 255U,
6408 255U, 255U, 255U, 255U, 255U, 255U},
6409 {0U, 1U, 8U, 9U, 10U, 11U, 12U, 13U, 255U, 255U, 255U,
6410 255U, 255U, 255U, 255U, 255U},
6411 {2U, 3U, 8U, 9U, 10U, 11U, 12U, 13U, 255U, 255U, 255U,
6412 255U, 255U, 255U, 255U, 255U},
6413 {0U, 1U, 2U, 3U, 8U, 9U, 10U, 11U, 12U, 13U, 255U, 255U,
6414 255U, 255U, 255U, 255U},
6415 {4U, 5U, 8U, 9U, 10U, 11U, 12U, 13U, 255U, 255U, 255U,
6416 255U, 255U, 255U, 255U, 255U},
6417 {0U, 1U, 4U, 5U, 8U, 9U, 10U, 11U, 12U, 13U, 255U, 255U,
6418 255U, 255U, 255U, 255U},
6419 {2U, 3U, 4U, 5U, 8U, 9U, 10U, 11U, 12U, 13U, 255U, 255U,
6420 255U, 255U, 255U, 255U},
6421 {0U, 1U, 2U, 3U, 4U, 5U, 8U, 9U, 10U, 11U, 12U, 13U,
6422 255U, 255U, 255U, 255U},
6423 {6U, 7U, 8U, 9U, 10U, 11U, 12U, 13U, 255U, 255U, 255U,
6424 255U, 255U, 255U, 255U, 255U},
6425 {0U, 1U, 6U, 7U, 8U, 9U, 10U, 11U, 12U, 13U, 255U, 255U,
6426 255U, 255U, 255U, 255U},
6427 {2U, 3U, 6U, 7U, 8U, 9U, 10U, 11U, 12U, 13U, 255U, 255U,
6428 255U, 255U, 255U, 255U},
6429 {0U, 1U, 2U, 3U, 6U, 7U, 8U, 9U, 10U, 11U, 12U, 13U,
6430 255U, 255U, 255U, 255U},
6431 {4U, 5U, 6U, 7U, 8U, 9U, 10U, 11U, 12U, 13U, 255U, 255U,
6432 255U, 255U, 255U, 255U},
6433 {0U, 1U, 4U, 5U, 6U, 7U, 8U, 9U, 10U, 11U, 12U, 13U,
6434 255U, 255U, 255U, 255U},
6435 {2U, 3U, 4U, 5U, 6U, 7U, 8U, 9U, 10U, 11U, 12U, 13U,
6436 255U, 255U, 255U, 255U},
6437 {0U, 1U, 2U, 3U, 4U, 5U, 6U, 7U, 8U, 9U, 10U, 11U, 12U,
6438 13U, 255U, 255U},
6439 {14U, 15U, 255U, 255U, 255U, 255U, 255U, 255U, 255U,
6440 255U, 255U, 255U, 255U, 255U, 255U, 255U},
6441 {0U, 1U, 14U, 15U, 255U, 255U, 255U, 255U, 255U, 255U,
6442 255U, 255U, 255U, 255U, 255U, 255U},
6443 {2U, 3U, 14U, 15U, 255U, 255U, 255U, 255U, 255U, 255U,
6444 255U, 255U, 255U, 255U, 255U, 255U},
6445 {0U, 1U, 2U, 3U, 14U, 15U, 255U, 255U, 255U, 255U, 255U,
6446 255U, 255U, 255U, 255U, 255U},
6447 {4U, 5U, 14U, 15U, 255U, 255U, 255U, 255U, 255U, 255U,
6448 255U, 255U, 255U, 255U, 255U, 255U},
6449 {0U, 1U, 4U, 5U, 14U, 15U, 255U, 255U, 255U, 255U, 255U,
6450 255U, 255U, 255U, 255U, 255U},
6451 {2U, 3U, 4U, 5U, 14U, 15U, 255U, 255U, 255U, 255U, 255U,
6452 255U, 255U, 255U, 255U, 255U},
6453 {0U, 1U, 2U, 3U, 4U, 5U, 14U, 15U, 255U, 255U, 255U,
6454 255U, 255U, 255U, 255U, 255U},
6455 {6U, 7U, 14U, 15U, 255U, 255U, 255U, 255U, 255U, 255U,
6456 255U, 255U, 255U, 255U, 255U, 255U},
6457 {0U, 1U, 6U, 7U, 14U, 15U, 255U, 255U, 255U, 255U, 255U,
6458 255U, 255U, 255U, 255U, 255U},
6459 {2U, 3U, 6U, 7U, 14U, 15U, 255U, 255U, 255U, 255U, 255U,
6460 255U, 255U, 255U, 255U, 255U},
6461 {0U, 1U, 2U, 3U, 6U, 7U, 14U, 15U, 255U, 255U, 255U,
6462 255U, 255U, 255U, 255U, 255U},
6463 {4U, 5U, 6U, 7U, 14U, 15U, 255U, 255U, 255U, 255U, 255U,
6464 255U, 255U, 255U, 255U, 255U},
6465 {0U, 1U, 4U, 5U, 6U, 7U, 14U, 15U, 255U, 255U, 255U,
6466 255U, 255U, 255U, 255U, 255U},
6467 {2U, 3U, 4U, 5U, 6U, 7U, 14U, 15U, 255U, 255U, 255U,
6468 255U, 255U, 255U, 255U, 255U},
6469 {0U, 1U, 2U, 3U, 4U, 5U, 6U, 7U, 14U, 15U, 255U, 255U,
6470 255U, 255U, 255U, 255U},
6471 {8U, 9U, 14U, 15U, 255U, 255U, 255U, 255U, 255U, 255U,
6472 255U, 255U, 255U, 255U, 255U, 255U},
6473 {0U, 1U, 8U, 9U, 14U, 15U, 255U, 255U, 255U, 255U, 255U,
6474 255U, 255U, 255U, 255U, 255U},
6475 {2U, 3U, 8U, 9U, 14U, 15U, 255U, 255U, 255U, 255U, 255U,
6476 255U, 255U, 255U, 255U, 255U},
6477 {0U, 1U, 2U, 3U, 8U, 9U, 14U, 15U, 255U, 255U, 255U,
6478 255U, 255U, 255U, 255U, 255U},
6479 {4U, 5U, 8U, 9U, 14U, 15U, 255U, 255U, 255U, 255U, 255U,
6480 255U, 255U, 255U, 255U, 255U},
6481 {0U, 1U, 4U, 5U, 8U, 9U, 14U, 15U, 255U, 255U, 255U,
6482 255U, 255U, 255U, 255U, 255U},
6483 {2U, 3U, 4U, 5U, 8U, 9U, 14U, 15U, 255U, 255U, 255U,
6484 255U, 255U, 255U, 255U, 255U},
6485 {0U, 1U, 2U, 3U, 4U, 5U, 8U, 9U, 14U, 15U, 255U, 255U,
6486 255U, 255U, 255U, 255U},
6487 {6U, 7U, 8U, 9U, 14U, 15U, 255U, 255U, 255U, 255U, 255U,
6488 255U, 255U, 255U, 255U, 255U},
6489 {0U, 1U, 6U, 7U, 8U, 9U, 14U, 15U, 255U, 255U, 255U,
6490 255U, 255U, 255U, 255U, 255U},
6491 {2U, 3U, 6U, 7U, 8U, 9U, 14U, 15U, 255U, 255U, 255U,
6492 255U, 255U, 255U, 255U, 255U},
6493 {0U, 1U, 2U, 3U, 6U, 7U, 8U, 9U, 14U, 15U, 255U, 255U,
6494 255U, 255U, 255U, 255U},
6495 {4U, 5U, 6U, 7U, 8U, 9U, 14U, 15U, 255U, 255U, 255U,
6496 255U, 255U, 255U, 255U, 255U},
6497 {0U, 1U, 4U, 5U, 6U, 7U, 8U, 9U, 14U, 15U, 255U, 255U,
6498 255U, 255U, 255U, 255U},
6499 {2U, 3U, 4U, 5U, 6U, 7U, 8U, 9U, 14U, 15U, 255U, 255U,
6500 255U, 255U, 255U, 255U},
6501 {0U, 1U, 2U, 3U, 4U, 5U, 6U, 7U, 8U, 9U, 14U, 15U, 255U,
6502 255U, 255U, 255U},
6503 {10U, 11U, 14U, 15U, 255U, 255U, 255U, 255U, 255U, 255U,
6504 255U, 255U, 255U, 255U, 255U, 255U},
6505 {0U, 1U, 10U, 11U, 14U, 15U, 255U, 255U, 255U, 255U,
6506 255U, 255U, 255U, 255U, 255U, 255U},
6507 {2U, 3U, 10U, 11U, 14U, 15U, 255U, 255U, 255U, 255U,
6508 255U, 255U, 255U, 255U, 255U, 255U},
6509 {0U, 1U, 2U, 3U, 10U, 11U, 14U, 15U, 255U, 255U, 255U,
6510 255U, 255U, 255U, 255U, 255U},
6511 {4U, 5U, 10U, 11U, 14U, 15U, 255U, 255U, 255U, 255U,
6512 255U, 255U, 255U, 255U, 255U, 255U},
6513 {0U, 1U, 4U, 5U, 10U, 11U, 14U, 15U, 255U, 255U, 255U,
6514 255U, 255U, 255U, 255U, 255U},
6515 {2U, 3U, 4U, 5U, 10U, 11U, 14U, 15U, 255U, 255U, 255U,
6516 255U, 255U, 255U, 255U, 255U},
6517 {0U, 1U, 2U, 3U, 4U, 5U, 10U, 11U, 14U, 15U, 255U, 255U,
6518 255U, 255U, 255U, 255U},
6519 {6U, 7U, 10U, 11U, 14U, 15U, 255U, 255U, 255U, 255U,
6520 255U, 255U, 255U, 255U, 255U, 255U},
6521 {0U, 1U, 6U, 7U, 10U, 11U, 14U, 15U, 255U, 255U, 255U,
6522 255U, 255U, 255U, 255U, 255U},
6523 {2U, 3U, 6U, 7U, 10U, 11U, 14U, 15U, 255U, 255U, 255U,
6524 255U, 255U, 255U, 255U, 255U},
6525 {0U, 1U, 2U, 3U, 6U, 7U, 10U, 11U, 14U, 15U, 255U, 255U,
6526 255U, 255U, 255U, 255U},
6527 {4U, 5U, 6U, 7U, 10U, 11U, 14U, 15U, 255U, 255U, 255U,
6528 255U, 255U, 255U, 255U, 255U},
6529 {0U, 1U, 4U, 5U, 6U, 7U, 10U, 11U, 14U, 15U, 255U, 255U,
6530 255U, 255U, 255U, 255U},
6531 {2U, 3U, 4U, 5U, 6U, 7U, 10U, 11U, 14U, 15U, 255U, 255U,
6532 255U, 255U, 255U, 255U},
6533 {0U, 1U, 2U, 3U, 4U, 5U, 6U, 7U, 10U, 11U, 14U, 15U,
6534 255U, 255U, 255U, 255U},
6535 {8U, 9U, 10U, 11U, 14U, 15U, 255U, 255U, 255U, 255U,
6536 255U, 255U, 255U, 255U, 255U, 255U},
6537 {0U, 1U, 8U, 9U, 10U, 11U, 14U, 15U, 255U, 255U, 255U,
6538 255U, 255U, 255U, 255U, 255U},
6539 {2U, 3U, 8U, 9U, 10U, 11U, 14U, 15U, 255U, 255U, 255U,
6540 255U, 255U, 255U, 255U, 255U},
6541 {0U, 1U, 2U, 3U, 8U, 9U, 10U, 11U, 14U, 15U, 255U, 255U,
6542 255U, 255U, 255U, 255U},
6543 {4U, 5U, 8U, 9U, 10U, 11U, 14U, 15U, 255U, 255U, 255U,
6544 255U, 255U, 255U, 255U, 255U},
6545 {0U, 1U, 4U, 5U, 8U, 9U, 10U, 11U, 14U, 15U, 255U, 255U,
6546 255U, 255U, 255U, 255U},
6547 {2U, 3U, 4U, 5U, 8U, 9U, 10U, 11U, 14U, 15U, 255U, 255U,
6548 255U, 255U, 255U, 255U},
6549 {0U, 1U, 2U, 3U, 4U, 5U, 8U, 9U, 10U, 11U, 14U, 15U,
6550 255U, 255U, 255U, 255U},
6551 {6U, 7U, 8U, 9U, 10U, 11U, 14U, 15U, 255U, 255U, 255U,
6552 255U, 255U, 255U, 255U, 255U},
6553 {0U, 1U, 6U, 7U, 8U, 9U, 10U, 11U, 14U, 15U, 255U, 255U,
6554 255U, 255U, 255U, 255U},
6555 {2U, 3U, 6U, 7U, 8U, 9U, 10U, 11U, 14U, 15U, 255U, 255U,
6556 255U, 255U, 255U, 255U},
6557 {0U, 1U, 2U, 3U, 6U, 7U, 8U, 9U, 10U, 11U, 14U, 15U,
6558 255U, 255U, 255U, 255U},
6559 {4U, 5U, 6U, 7U, 8U, 9U, 10U, 11U, 14U, 15U, 255U, 255U,
6560 255U, 255U, 255U, 255U},
6561 {0U, 1U, 4U, 5U, 6U, 7U, 8U, 9U, 10U, 11U, 14U, 15U,
6562 255U, 255U, 255U, 255U},
6563 {2U, 3U, 4U, 5U, 6U, 7U, 8U, 9U, 10U, 11U, 14U, 15U,
6564 255U, 255U, 255U, 255U},
6565 {0U, 1U, 2U, 3U, 4U, 5U, 6U, 7U, 8U, 9U, 10U, 11U, 14U,
6566 15U, 255U, 255U},
6567 {12U, 13U, 14U, 15U, 255U, 255U, 255U, 255U, 255U, 255U,
6568 255U, 255U, 255U, 255U, 255U, 255U},
6569 {0U, 1U, 12U, 13U, 14U, 15U, 255U, 255U, 255U, 255U,
6570 255U, 255U, 255U, 255U, 255U, 255U},
6571 {2U, 3U, 12U, 13U, 14U, 15U, 255U, 255U, 255U, 255U,
6572 255U, 255U, 255U, 255U, 255U, 255U},
6573 {0U, 1U, 2U, 3U, 12U, 13U, 14U, 15U, 255U, 255U, 255U,
6574 255U, 255U, 255U, 255U, 255U},
6575 {4U, 5U, 12U, 13U, 14U, 15U, 255U, 255U, 255U, 255U,
6576 255U, 255U, 255U, 255U, 255U, 255U},
6577 {0U, 1U, 4U, 5U, 12U, 13U, 14U, 15U, 255U, 255U, 255U,
6578 255U, 255U, 255U, 255U, 255U},
6579 {2U, 3U, 4U, 5U, 12U, 13U, 14U, 15U, 255U, 255U, 255U,
6580 255U, 255U, 255U, 255U, 255U},
6581 {0U, 1U, 2U, 3U, 4U, 5U, 12U, 13U, 14U, 15U, 255U, 255U,
6582 255U, 255U, 255U, 255U},
6583 {6U, 7U, 12U, 13U, 14U, 15U, 255U, 255U, 255U, 255U,
6584 255U, 255U, 255U, 255U, 255U, 255U},
6585 {0U, 1U, 6U, 7U, 12U, 13U, 14U, 15U, 255U, 255U, 255U,
6586 255U, 255U, 255U, 255U, 255U},
6587 {2U, 3U, 6U, 7U, 12U, 13U, 14U, 15U, 255U, 255U, 255U,
6588 255U, 255U, 255U, 255U, 255U},
6589 {0U, 1U, 2U, 3U, 6U, 7U, 12U, 13U, 14U, 15U, 255U, 255U,
6590 255U, 255U, 255U, 255U},
6591 {4U, 5U, 6U, 7U, 12U, 13U, 14U, 15U, 255U, 255U, 255U,
6592 255U, 255U, 255U, 255U, 255U},
6593 {0U, 1U, 4U, 5U, 6U, 7U, 12U, 13U, 14U, 15U, 255U, 255U,
6594 255U, 255U, 255U, 255U},
6595 {2U, 3U, 4U, 5U, 6U, 7U, 12U, 13U, 14U, 15U, 255U, 255U,
6596 255U, 255U, 255U, 255U},
6597 {0U, 1U, 2U, 3U, 4U, 5U, 6U, 7U, 12U, 13U, 14U, 15U,
6598 255U, 255U, 255U, 255U},
6599 {8U, 9U, 12U, 13U, 14U, 15U, 255U, 255U, 255U, 255U,
6600 255U, 255U, 255U, 255U, 255U, 255U},
6601 {0U, 1U, 8U, 9U, 12U, 13U, 14U, 15U, 255U, 255U, 255U,
6602 255U, 255U, 255U, 255U, 255U},
6603 {2U, 3U, 8U, 9U, 12U, 13U, 14U, 15U, 255U, 255U, 255U,
6604 255U, 255U, 255U, 255U, 255U},
6605 {0U, 1U, 2U, 3U, 8U, 9U, 12U, 13U, 14U, 15U, 255U, 255U,
6606 255U, 255U, 255U, 255U},
6607 {4U, 5U, 8U, 9U, 12U, 13U, 14U, 15U, 255U, 255U, 255U,
6608 255U, 255U, 255U, 255U, 255U},
6609 {0U, 1U, 4U, 5U, 8U, 9U, 12U, 13U, 14U, 15U, 255U, 255U,
6610 255U, 255U, 255U, 255U},
6611 {2U, 3U, 4U, 5U, 8U, 9U, 12U, 13U, 14U, 15U, 255U, 255U,
6612 255U, 255U, 255U, 255U},
6613 {0U, 1U, 2U, 3U, 4U, 5U, 8U, 9U, 12U, 13U, 14U, 15U,
6614 255U, 255U, 255U, 255U},
6615 {6U, 7U, 8U, 9U, 12U, 13U, 14U, 15U, 255U, 255U, 255U,
6616 255U, 255U, 255U, 255U, 255U},
6617 {0U, 1U, 6U, 7U, 8U, 9U, 12U, 13U, 14U, 15U, 255U, 255U,
6618 255U, 255U, 255U, 255U},
6619 {2U, 3U, 6U, 7U, 8U, 9U, 12U, 13U, 14U, 15U, 255U, 255U,
6620 255U, 255U, 255U, 255U},
6621 {0U, 1U, 2U, 3U, 6U, 7U, 8U, 9U, 12U, 13U, 14U, 15U,
6622 255U, 255U, 255U, 255U},
6623 {4U, 5U, 6U, 7U, 8U, 9U, 12U, 13U, 14U, 15U, 255U, 255U,
6624 255U, 255U, 255U, 255U},
6625 {0U, 1U, 4U, 5U, 6U, 7U, 8U, 9U, 12U, 13U, 14U, 15U,
6626 255U, 255U, 255U, 255U},
6627 {2U, 3U, 4U, 5U, 6U, 7U, 8U, 9U, 12U, 13U, 14U, 15U,
6628 255U, 255U, 255U, 255U},
6629 {0U, 1U, 2U, 3U, 4U, 5U, 6U, 7U, 8U, 9U, 12U, 13U, 14U,
6630 15U, 255U, 255U},
6631 {10U, 11U, 12U, 13U, 14U, 15U, 255U, 255U, 255U, 255U,
6632 255U, 255U, 255U, 255U, 255U, 255U},
6633 {0U, 1U, 10U, 11U, 12U, 13U, 14U, 15U, 255U, 255U, 255U,
6634 255U, 255U, 255U, 255U, 255U},
6635 {2U, 3U, 10U, 11U, 12U, 13U, 14U, 15U, 255U, 255U, 255U,
6636 255U, 255U, 255U, 255U, 255U},
6637 {0U, 1U, 2U, 3U, 10U, 11U, 12U, 13U, 14U, 15U, 255U,
6638 255U, 255U, 255U, 255U, 255U},
6639 {4U, 5U, 10U, 11U, 12U, 13U, 14U, 15U, 255U, 255U, 255U,
6640 255U, 255U, 255U, 255U, 255U},
6641 {0U, 1U, 4U, 5U, 10U, 11U, 12U, 13U, 14U, 15U, 255U,
6642 255U, 255U, 255U, 255U, 255U},
6643 {2U, 3U, 4U, 5U, 10U, 11U, 12U, 13U, 14U, 15U, 255U,
6644 255U, 255U, 255U, 255U, 255U},
6645 {0U, 1U, 2U, 3U, 4U, 5U, 10U, 11U, 12U, 13U, 14U, 15U,
6646 255U, 255U, 255U, 255U},
6647 {6U, 7U, 10U, 11U, 12U, 13U, 14U, 15U, 255U, 255U, 255U,
6648 255U, 255U, 255U, 255U, 255U},
6649 {0U, 1U, 6U, 7U, 10U, 11U, 12U, 13U, 14U, 15U, 255U,
6650 255U, 255U, 255U, 255U, 255U},
6651 {2U, 3U, 6U, 7U, 10U, 11U, 12U, 13U, 14U, 15U, 255U,
6652 255U, 255U, 255U, 255U, 255U},
6653 {0U, 1U, 2U, 3U, 6U, 7U, 10U, 11U, 12U, 13U, 14U, 15U,
6654 255U, 255U, 255U, 255U},
6655 {4U, 5U, 6U, 7U, 10U, 11U, 12U, 13U, 14U, 15U, 255U,
6656 255U, 255U, 255U, 255U, 255U},
6657 {0U, 1U, 4U, 5U, 6U, 7U, 10U, 11U, 12U, 13U, 14U, 15U,
6658 255U, 255U, 255U, 255U},
6659 {2U, 3U, 4U, 5U, 6U, 7U, 10U, 11U, 12U, 13U, 14U, 15U,
6660 255U, 255U, 255U, 255U},
6661 {0U, 1U, 2U, 3U, 4U, 5U, 6U, 7U, 10U, 11U, 12U, 13U, 14U,
6662 15U, 255U, 255U},
6663 {8U, 9U, 10U, 11U, 12U, 13U, 14U, 15U, 255U, 255U, 255U,
6664 255U, 255U, 255U, 255U, 255U},
6665 {0U, 1U, 8U, 9U, 10U, 11U, 12U, 13U, 14U, 15U, 255U,
6666 255U, 255U, 255U, 255U, 255U},
6667 {2U, 3U, 8U, 9U, 10U, 11U, 12U, 13U, 14U, 15U, 255U,
6668 255U, 255U, 255U, 255U, 255U},
6669 {0U, 1U, 2U, 3U, 8U, 9U, 10U, 11U, 12U, 13U, 14U, 15U,
6670 255U, 255U, 255U, 255U},
6671 {4U, 5U, 8U, 9U, 10U, 11U, 12U, 13U, 14U, 15U, 255U,
6672 255U, 255U, 255U, 255U, 255U},
6673 {0U, 1U, 4U, 5U, 8U, 9U, 10U, 11U, 12U, 13U, 14U, 15U,
6674 255U, 255U, 255U, 255U},
6675 {2U, 3U, 4U, 5U, 8U, 9U, 10U, 11U, 12U, 13U, 14U, 15U,
6676 255U, 255U, 255U, 255U},
6677 {0U, 1U, 2U, 3U, 4U, 5U, 8U, 9U, 10U, 11U, 12U, 13U, 14U,
6678 15U, 255U, 255U},
6679 {6U, 7U, 8U, 9U, 10U, 11U, 12U, 13U, 14U, 15U, 255U,
6680 255U, 255U, 255U, 255U, 255U},
6681 {0U, 1U, 6U, 7U, 8U, 9U, 10U, 11U, 12U, 13U, 14U, 15U,
6682 255U, 255U, 255U, 255U},
6683 {2U, 3U, 6U, 7U, 8U, 9U, 10U, 11U, 12U, 13U, 14U, 15U,
6684 255U, 255U, 255U, 255U},
6685 {0U, 1U, 2U, 3U, 6U, 7U, 8U, 9U, 10U, 11U, 12U, 13U, 14U,
6686 15U, 255U, 255U},
6687 {4U, 5U, 6U, 7U, 8U, 9U, 10U, 11U, 12U, 13U, 14U, 15U,
6688 255U, 255U, 255U, 255U},
6689 {0U, 1U, 4U, 5U, 6U, 7U, 8U, 9U, 10U, 11U, 12U, 13U, 14U,
6690 15U, 255U, 255U},
6691 {2U, 3U, 4U, 5U, 6U, 7U, 8U, 9U, 10U, 11U, 12U, 13U, 14U,
6692 15U, 255U, 255U},
6693 {0U, 1U, 2U, 3U, 4U, 5U, 6U, 7U, 8U, 9U, 10U, 11U, 12U,
6694 13U, 14U, 15U}};
6695
6696 /**
6697 This function found in impl {(libcrux_ml_kem::vector::traits::Operations for
6698 libcrux_ml_kem::vector::portable::vector_type::PortableVector)}
6699 */
6700 static inline libcrux_ml_kem_vector_portable_vector_type_PortableVector
libcrux_ml_kem_vector_portable_ZERO_0d(void)6701 libcrux_ml_kem_vector_portable_ZERO_0d(void) {
6702 return libcrux_ml_kem_vector_portable_vector_type_zero();
6703 }
6704
6705 static KRML_MUSTINLINE libcrux_ml_kem_vector_portable_vector_type_PortableVector
libcrux_ml_kem_vector_portable_arithmetic_add(libcrux_ml_kem_vector_portable_vector_type_PortableVector lhs,libcrux_ml_kem_vector_portable_vector_type_PortableVector * rhs)6706 libcrux_ml_kem_vector_portable_arithmetic_add(
6707 libcrux_ml_kem_vector_portable_vector_type_PortableVector lhs,
6708 libcrux_ml_kem_vector_portable_vector_type_PortableVector *rhs) {
6709 for (size_t i = (size_t)0U;
6710 i < LIBCRUX_ML_KEM_VECTOR_TRAITS_FIELD_ELEMENTS_IN_VECTOR; i++) {
6711 size_t i0 = i;
6712 size_t uu____0 = i0;
6713 lhs.elements[uu____0] = lhs.elements[uu____0] + rhs->elements[i0];
6714 }
6715 return lhs;
6716 }
6717
6718 /**
6719 This function found in impl {(libcrux_ml_kem::vector::traits::Operations for
6720 libcrux_ml_kem::vector::portable::vector_type::PortableVector)}
6721 */
6722 static inline libcrux_ml_kem_vector_portable_vector_type_PortableVector
libcrux_ml_kem_vector_portable_add_0d(libcrux_ml_kem_vector_portable_vector_type_PortableVector lhs,libcrux_ml_kem_vector_portable_vector_type_PortableVector * rhs)6723 libcrux_ml_kem_vector_portable_add_0d(
6724 libcrux_ml_kem_vector_portable_vector_type_PortableVector lhs,
6725 libcrux_ml_kem_vector_portable_vector_type_PortableVector *rhs) {
6726 return libcrux_ml_kem_vector_portable_arithmetic_add(lhs, rhs);
6727 }
6728
6729 static KRML_MUSTINLINE libcrux_ml_kem_vector_portable_vector_type_PortableVector
libcrux_ml_kem_vector_portable_arithmetic_sub(libcrux_ml_kem_vector_portable_vector_type_PortableVector lhs,libcrux_ml_kem_vector_portable_vector_type_PortableVector * rhs)6730 libcrux_ml_kem_vector_portable_arithmetic_sub(
6731 libcrux_ml_kem_vector_portable_vector_type_PortableVector lhs,
6732 libcrux_ml_kem_vector_portable_vector_type_PortableVector *rhs) {
6733 for (size_t i = (size_t)0U;
6734 i < LIBCRUX_ML_KEM_VECTOR_TRAITS_FIELD_ELEMENTS_IN_VECTOR; i++) {
6735 size_t i0 = i;
6736 size_t uu____0 = i0;
6737 lhs.elements[uu____0] = lhs.elements[uu____0] - rhs->elements[i0];
6738 }
6739 return lhs;
6740 }
6741
6742 /**
6743 This function found in impl {(libcrux_ml_kem::vector::traits::Operations for
6744 libcrux_ml_kem::vector::portable::vector_type::PortableVector)}
6745 */
6746 static inline libcrux_ml_kem_vector_portable_vector_type_PortableVector
libcrux_ml_kem_vector_portable_sub_0d(libcrux_ml_kem_vector_portable_vector_type_PortableVector lhs,libcrux_ml_kem_vector_portable_vector_type_PortableVector * rhs)6747 libcrux_ml_kem_vector_portable_sub_0d(
6748 libcrux_ml_kem_vector_portable_vector_type_PortableVector lhs,
6749 libcrux_ml_kem_vector_portable_vector_type_PortableVector *rhs) {
6750 return libcrux_ml_kem_vector_portable_arithmetic_sub(lhs, rhs);
6751 }
6752
6753 static KRML_MUSTINLINE libcrux_ml_kem_vector_portable_vector_type_PortableVector
libcrux_ml_kem_vector_portable_arithmetic_multiply_by_constant(libcrux_ml_kem_vector_portable_vector_type_PortableVector v,int16_t c)6754 libcrux_ml_kem_vector_portable_arithmetic_multiply_by_constant(
6755 libcrux_ml_kem_vector_portable_vector_type_PortableVector v, int16_t c) {
6756 for (size_t i = (size_t)0U;
6757 i < LIBCRUX_ML_KEM_VECTOR_TRAITS_FIELD_ELEMENTS_IN_VECTOR; i++) {
6758 size_t i0 = i;
6759 size_t uu____0 = i0;
6760 v.elements[uu____0] = v.elements[uu____0] * c;
6761 }
6762 return v;
6763 }
6764
6765 /**
6766 This function found in impl {(libcrux_ml_kem::vector::traits::Operations for
6767 libcrux_ml_kem::vector::portable::vector_type::PortableVector)}
6768 */
6769 static inline libcrux_ml_kem_vector_portable_vector_type_PortableVector
libcrux_ml_kem_vector_portable_multiply_by_constant_0d(libcrux_ml_kem_vector_portable_vector_type_PortableVector v,int16_t c)6770 libcrux_ml_kem_vector_portable_multiply_by_constant_0d(
6771 libcrux_ml_kem_vector_portable_vector_type_PortableVector v, int16_t c) {
6772 return libcrux_ml_kem_vector_portable_arithmetic_multiply_by_constant(v, c);
6773 }
6774
6775 static KRML_MUSTINLINE libcrux_ml_kem_vector_portable_vector_type_PortableVector
libcrux_ml_kem_vector_portable_arithmetic_bitwise_and_with_constant(libcrux_ml_kem_vector_portable_vector_type_PortableVector v,int16_t c)6776 libcrux_ml_kem_vector_portable_arithmetic_bitwise_and_with_constant(
6777 libcrux_ml_kem_vector_portable_vector_type_PortableVector v, int16_t c) {
6778 for (size_t i = (size_t)0U;
6779 i < LIBCRUX_ML_KEM_VECTOR_TRAITS_FIELD_ELEMENTS_IN_VECTOR; i++) {
6780 size_t i0 = i;
6781 size_t uu____0 = i0;
6782 v.elements[uu____0] = v.elements[uu____0] & c;
6783 }
6784 return v;
6785 }
6786
6787 /**
6788 This function found in impl {(libcrux_ml_kem::vector::traits::Operations for
6789 libcrux_ml_kem::vector::portable::vector_type::PortableVector)}
6790 */
6791 static inline libcrux_ml_kem_vector_portable_vector_type_PortableVector
libcrux_ml_kem_vector_portable_bitwise_and_with_constant_0d(libcrux_ml_kem_vector_portable_vector_type_PortableVector v,int16_t c)6792 libcrux_ml_kem_vector_portable_bitwise_and_with_constant_0d(
6793 libcrux_ml_kem_vector_portable_vector_type_PortableVector v, int16_t c) {
6794 return libcrux_ml_kem_vector_portable_arithmetic_bitwise_and_with_constant(v,
6795 c);
6796 }
6797
6798 static KRML_MUSTINLINE libcrux_ml_kem_vector_portable_vector_type_PortableVector
libcrux_ml_kem_vector_portable_arithmetic_cond_subtract_3329(libcrux_ml_kem_vector_portable_vector_type_PortableVector v)6799 libcrux_ml_kem_vector_portable_arithmetic_cond_subtract_3329(
6800 libcrux_ml_kem_vector_portable_vector_type_PortableVector v) {
6801 core_ops_range_Range_b3 iter =
6802 core_iter_traits_collect___core__iter__traits__collect__IntoIterator_for_I__1__into_iter(
6803 (CLITERAL(core_ops_range_Range_b3){
6804 .start = (size_t)0U,
6805 .end = LIBCRUX_ML_KEM_VECTOR_TRAITS_FIELD_ELEMENTS_IN_VECTOR}),
6806 core_ops_range_Range_b3, core_ops_range_Range_b3);
6807 while (true) {
6808 Option_b3 uu____0 =
6809 core_iter_range___core__iter__traits__iterator__Iterator_for_core__ops__range__Range_A___6__next(
6810 &iter, size_t, Option_b3);
6811 if (!(uu____0.tag == None)) {
6812 size_t i = uu____0.f0;
6813 if (v.elements[i] >= (int16_t)3329) {
6814 size_t uu____1 = i;
6815 v.elements[uu____1] = v.elements[uu____1] - (int16_t)3329;
6816 }
6817 continue;
6818 }
6819 return v;
6820 }
6821 }
6822
6823 /**
6824 This function found in impl {(libcrux_ml_kem::vector::traits::Operations for
6825 libcrux_ml_kem::vector::portable::vector_type::PortableVector)}
6826 */
6827 static inline libcrux_ml_kem_vector_portable_vector_type_PortableVector
libcrux_ml_kem_vector_portable_cond_subtract_3329_0d(libcrux_ml_kem_vector_portable_vector_type_PortableVector v)6828 libcrux_ml_kem_vector_portable_cond_subtract_3329_0d(
6829 libcrux_ml_kem_vector_portable_vector_type_PortableVector v) {
6830 return libcrux_ml_kem_vector_portable_arithmetic_cond_subtract_3329(v);
6831 }
6832
6833 #define LIBCRUX_ML_KEM_VECTOR_PORTABLE_ARITHMETIC_BARRETT_MULTIPLIER \
6834 ((int32_t)20159)
6835
6836 #define LIBCRUX_ML_KEM_VECTOR_PORTABLE_ARITHMETIC_BARRETT_SHIFT ((int32_t)26)
6837
6838 #define LIBCRUX_ML_KEM_VECTOR_PORTABLE_ARITHMETIC_BARRETT_R \
6839 ((int32_t)1 << (uint32_t) \
6840 LIBCRUX_ML_KEM_VECTOR_PORTABLE_ARITHMETIC_BARRETT_SHIFT)
6841
6842 /**
6843 Signed Barrett Reduction
6844
6845 Given an input `value`, `barrett_reduce` outputs a representative `result`
6846 such that:
6847
6848 - result ≡ value (mod FIELD_MODULUS)
6849 - the absolute value of `result` is bound as follows:
6850
6851 `|result| ≤ FIELD_MODULUS / 2 · (|value|/BARRETT_R + 1)
6852
6853 In particular, if `|value| < BARRETT_R`, then `|result| < FIELD_MODULUS`.
6854 */
6855 static inline int16_t
libcrux_ml_kem_vector_portable_arithmetic_barrett_reduce_element(int16_t value)6856 libcrux_ml_kem_vector_portable_arithmetic_barrett_reduce_element(
6857 int16_t value) {
6858 int32_t t = (int32_t)value *
6859 LIBCRUX_ML_KEM_VECTOR_PORTABLE_ARITHMETIC_BARRETT_MULTIPLIER +
6860 (LIBCRUX_ML_KEM_VECTOR_PORTABLE_ARITHMETIC_BARRETT_R >> 1U);
6861 int16_t quotient =
6862 (int16_t)(t >>
6863 (uint32_t)
6864 LIBCRUX_ML_KEM_VECTOR_PORTABLE_ARITHMETIC_BARRETT_SHIFT);
6865 return value - quotient * LIBCRUX_ML_KEM_VECTOR_TRAITS_FIELD_MODULUS;
6866 }
6867
6868 static KRML_MUSTINLINE libcrux_ml_kem_vector_portable_vector_type_PortableVector
libcrux_ml_kem_vector_portable_arithmetic_barrett_reduce(libcrux_ml_kem_vector_portable_vector_type_PortableVector v)6869 libcrux_ml_kem_vector_portable_arithmetic_barrett_reduce(
6870 libcrux_ml_kem_vector_portable_vector_type_PortableVector v) {
6871 for (size_t i = (size_t)0U;
6872 i < LIBCRUX_ML_KEM_VECTOR_TRAITS_FIELD_ELEMENTS_IN_VECTOR; i++) {
6873 size_t i0 = i;
6874 v.elements[i0] =
6875 libcrux_ml_kem_vector_portable_arithmetic_barrett_reduce_element(
6876 v.elements[i0]);
6877 }
6878 return v;
6879 }
6880
6881 /**
6882 This function found in impl {(libcrux_ml_kem::vector::traits::Operations for
6883 libcrux_ml_kem::vector::portable::vector_type::PortableVector)}
6884 */
6885 static inline libcrux_ml_kem_vector_portable_vector_type_PortableVector
libcrux_ml_kem_vector_portable_barrett_reduce_0d(libcrux_ml_kem_vector_portable_vector_type_PortableVector v)6886 libcrux_ml_kem_vector_portable_barrett_reduce_0d(
6887 libcrux_ml_kem_vector_portable_vector_type_PortableVector v) {
6888 return libcrux_ml_kem_vector_portable_arithmetic_barrett_reduce(v);
6889 }
6890
6891 #define LIBCRUX_ML_KEM_VECTOR_PORTABLE_ARITHMETIC_MONTGOMERY_SHIFT (16U)
6892
6893 #define LIBCRUX_ML_KEM_VECTOR_PORTABLE_ARITHMETIC_MONTGOMERY_R \
6894 ((int32_t)1 << (uint32_t) \
6895 LIBCRUX_ML_KEM_VECTOR_PORTABLE_ARITHMETIC_MONTGOMERY_SHIFT)
6896
6897 /**
6898 Signed Montgomery Reduction
6899
6900 Given an input `value`, `montgomery_reduce` outputs a representative `o`
6901 such that:
6902
6903 - o ≡ value · MONTGOMERY_R^(-1) (mod FIELD_MODULUS)
6904 - the absolute value of `o` is bound as follows:
6905
6906 `|result| ≤ (|value| / MONTGOMERY_R) + (FIELD_MODULUS / 2)
6907
6908 In particular, if `|value| ≤ FIELD_MODULUS * MONTGOMERY_R`, then `|o| < (3 ·
6909 FIELD_MODULUS) / 2`.
6910 */
6911 static inline int16_t
libcrux_ml_kem_vector_portable_arithmetic_montgomery_reduce_element(int32_t value)6912 libcrux_ml_kem_vector_portable_arithmetic_montgomery_reduce_element(
6913 int32_t value) {
6914 int32_t k =
6915 (int32_t)(int16_t)value *
6916 (int32_t)LIBCRUX_ML_KEM_VECTOR_TRAITS_INVERSE_OF_MODULUS_MOD_MONTGOMERY_R;
6917 int32_t k_times_modulus =
6918 (int32_t)(int16_t)k * (int32_t)LIBCRUX_ML_KEM_VECTOR_TRAITS_FIELD_MODULUS;
6919 int16_t c =
6920 (int16_t)(k_times_modulus >>
6921 (uint32_t)
6922 LIBCRUX_ML_KEM_VECTOR_PORTABLE_ARITHMETIC_MONTGOMERY_SHIFT);
6923 int16_t value_high =
6924 (int16_t)(value >>
6925 (uint32_t)
6926 LIBCRUX_ML_KEM_VECTOR_PORTABLE_ARITHMETIC_MONTGOMERY_SHIFT);
6927 return value_high - c;
6928 }
6929
6930 /**
6931 If `fe` is some field element 'x' of the Kyber field and `fer` is congruent to
6932 `y · MONTGOMERY_R`, this procedure outputs a value that is congruent to
6933 `x · y`, as follows:
6934
6935 `fe · fer ≡ x · y · MONTGOMERY_R (mod FIELD_MODULUS)`
6936
6937 `montgomery_reduce` takes the value `x · y · MONTGOMERY_R` and outputs a
6938 representative `x · y · MONTGOMERY_R * MONTGOMERY_R^{-1} ≡ x · y (mod
6939 FIELD_MODULUS)`.
6940 */
6941 static KRML_MUSTINLINE int16_t
libcrux_ml_kem_vector_portable_arithmetic_montgomery_multiply_fe_by_fer(int16_t fe,int16_t fer)6942 libcrux_ml_kem_vector_portable_arithmetic_montgomery_multiply_fe_by_fer(
6943 int16_t fe, int16_t fer) {
6944 return libcrux_ml_kem_vector_portable_arithmetic_montgomery_reduce_element(
6945 (int32_t)fe * (int32_t)fer);
6946 }
6947
6948 static KRML_MUSTINLINE libcrux_ml_kem_vector_portable_vector_type_PortableVector
libcrux_ml_kem_vector_portable_arithmetic_montgomery_multiply_by_constant(libcrux_ml_kem_vector_portable_vector_type_PortableVector v,int16_t c)6949 libcrux_ml_kem_vector_portable_arithmetic_montgomery_multiply_by_constant(
6950 libcrux_ml_kem_vector_portable_vector_type_PortableVector v, int16_t c) {
6951 for (size_t i = (size_t)0U;
6952 i < LIBCRUX_ML_KEM_VECTOR_TRAITS_FIELD_ELEMENTS_IN_VECTOR; i++) {
6953 size_t i0 = i;
6954 v.elements[i0] =
6955 libcrux_ml_kem_vector_portable_arithmetic_montgomery_multiply_fe_by_fer(
6956 v.elements[i0], c);
6957 }
6958 return v;
6959 }
6960
6961 /**
6962 This function found in impl {(libcrux_ml_kem::vector::traits::Operations for
6963 libcrux_ml_kem::vector::portable::vector_type::PortableVector)}
6964 */
6965 static inline libcrux_ml_kem_vector_portable_vector_type_PortableVector
libcrux_ml_kem_vector_portable_montgomery_multiply_by_constant_0d(libcrux_ml_kem_vector_portable_vector_type_PortableVector v,int16_t r)6966 libcrux_ml_kem_vector_portable_montgomery_multiply_by_constant_0d(
6967 libcrux_ml_kem_vector_portable_vector_type_PortableVector v, int16_t r) {
6968 return libcrux_ml_kem_vector_portable_arithmetic_montgomery_multiply_by_constant(
6969 v, r);
6970 }
6971
6972 /**
6973 The `compress_*` functions implement the `Compress` function specified in the
6974 NIST FIPS 203 standard (Page 18, Expression 4.5), which is defined as:
6975
6976 ```plaintext
6977 Compress_d: ℤq -> ℤ_{2ᵈ}
6978 Compress_d(x) = ⌈(2ᵈ/q)·x⌋
6979 ```
6980
6981 Since `⌈x⌋ = ⌊x + 1/2⌋` we have:
6982
6983 ```plaintext
6984 Compress_d(x) = ⌊(2ᵈ/q)·x + 1/2⌋
6985 = ⌊(2^{d+1}·x + q) / 2q⌋
6986 ```
6987
6988 For further information about the function implementations, consult the
6989 `implementation_notes.pdf` document in this directory.
6990
6991 The NIST FIPS 203 standard can be found at
6992 <https://csrc.nist.gov/pubs/fips/203/ipd>.
6993 */
6994 static inline uint8_t
libcrux_ml_kem_vector_portable_compress_compress_message_coefficient(uint16_t fe)6995 libcrux_ml_kem_vector_portable_compress_compress_message_coefficient(
6996 uint16_t fe) {
6997 int16_t shifted = (int16_t)1664 - (int16_t)fe;
6998 int16_t mask = shifted >> 15U;
6999 int16_t shifted_to_positive = mask ^ shifted;
7000 int16_t shifted_positive_in_range = shifted_to_positive - (int16_t)832;
7001 return (uint8_t)(shifted_positive_in_range >> 15U & (int16_t)1);
7002 }
7003
7004 static KRML_MUSTINLINE libcrux_ml_kem_vector_portable_vector_type_PortableVector
libcrux_ml_kem_vector_portable_compress_compress_1(libcrux_ml_kem_vector_portable_vector_type_PortableVector v)7005 libcrux_ml_kem_vector_portable_compress_compress_1(
7006 libcrux_ml_kem_vector_portable_vector_type_PortableVector v) {
7007 for (size_t i = (size_t)0U;
7008 i < LIBCRUX_ML_KEM_VECTOR_TRAITS_FIELD_ELEMENTS_IN_VECTOR; i++) {
7009 size_t i0 = i;
7010 v.elements[i0] = (int16_t)
7011 libcrux_ml_kem_vector_portable_compress_compress_message_coefficient(
7012 (uint16_t)v.elements[i0]);
7013 }
7014 return v;
7015 }
7016
7017 /**
7018 This function found in impl {(libcrux_ml_kem::vector::traits::Operations for
7019 libcrux_ml_kem::vector::portable::vector_type::PortableVector)}
7020 */
7021 static inline libcrux_ml_kem_vector_portable_vector_type_PortableVector
libcrux_ml_kem_vector_portable_compress_1_0d(libcrux_ml_kem_vector_portable_vector_type_PortableVector v)7022 libcrux_ml_kem_vector_portable_compress_1_0d(
7023 libcrux_ml_kem_vector_portable_vector_type_PortableVector v) {
7024 return libcrux_ml_kem_vector_portable_compress_compress_1(v);
7025 }
7026
7027 static KRML_MUSTINLINE uint32_t
libcrux_ml_kem_vector_portable_arithmetic_get_n_least_significant_bits(uint8_t n,uint32_t value)7028 libcrux_ml_kem_vector_portable_arithmetic_get_n_least_significant_bits(
7029 uint8_t n, uint32_t value) {
7030 return value & ((1U << (uint32_t)n) - 1U);
7031 }
7032
7033 static inline int16_t
libcrux_ml_kem_vector_portable_compress_compress_ciphertext_coefficient(uint8_t coefficient_bits,uint16_t fe)7034 libcrux_ml_kem_vector_portable_compress_compress_ciphertext_coefficient(
7035 uint8_t coefficient_bits, uint16_t fe) {
7036 uint64_t compressed = (uint64_t)fe << (uint32_t)coefficient_bits;
7037 compressed = compressed + 1664ULL;
7038 compressed = compressed * 10321340ULL;
7039 compressed = compressed >> 35U;
7040 return (int16_t)
7041 libcrux_ml_kem_vector_portable_arithmetic_get_n_least_significant_bits(
7042 coefficient_bits, (uint32_t)compressed);
7043 }
7044
libcrux_ml_kem_vector_portable_ntt_ntt_step(libcrux_ml_kem_vector_portable_vector_type_PortableVector * v,int16_t zeta,size_t i,size_t j)7045 static KRML_MUSTINLINE void libcrux_ml_kem_vector_portable_ntt_ntt_step(
7046 libcrux_ml_kem_vector_portable_vector_type_PortableVector *v, int16_t zeta,
7047 size_t i, size_t j) {
7048 int16_t t =
7049 libcrux_ml_kem_vector_portable_arithmetic_montgomery_multiply_fe_by_fer(
7050 v->elements[j], zeta);
7051 v->elements[j] = v->elements[i] - t;
7052 v->elements[i] = v->elements[i] + t;
7053 }
7054
7055 static KRML_MUSTINLINE libcrux_ml_kem_vector_portable_vector_type_PortableVector
libcrux_ml_kem_vector_portable_ntt_ntt_layer_1_step(libcrux_ml_kem_vector_portable_vector_type_PortableVector v,int16_t zeta0,int16_t zeta1,int16_t zeta2,int16_t zeta3)7056 libcrux_ml_kem_vector_portable_ntt_ntt_layer_1_step(
7057 libcrux_ml_kem_vector_portable_vector_type_PortableVector v, int16_t zeta0,
7058 int16_t zeta1, int16_t zeta2, int16_t zeta3) {
7059 libcrux_ml_kem_vector_portable_ntt_ntt_step(&v, zeta0, (size_t)0U,
7060 (size_t)2U);
7061 libcrux_ml_kem_vector_portable_ntt_ntt_step(&v, zeta0, (size_t)1U,
7062 (size_t)3U);
7063 libcrux_ml_kem_vector_portable_ntt_ntt_step(&v, zeta1, (size_t)4U,
7064 (size_t)6U);
7065 libcrux_ml_kem_vector_portable_ntt_ntt_step(&v, zeta1, (size_t)5U,
7066 (size_t)7U);
7067 libcrux_ml_kem_vector_portable_ntt_ntt_step(&v, zeta2, (size_t)8U,
7068 (size_t)10U);
7069 libcrux_ml_kem_vector_portable_ntt_ntt_step(&v, zeta2, (size_t)9U,
7070 (size_t)11U);
7071 libcrux_ml_kem_vector_portable_ntt_ntt_step(&v, zeta3, (size_t)12U,
7072 (size_t)14U);
7073 libcrux_ml_kem_vector_portable_ntt_ntt_step(&v, zeta3, (size_t)13U,
7074 (size_t)15U);
7075 return v;
7076 }
7077
7078 /**
7079 This function found in impl {(libcrux_ml_kem::vector::traits::Operations for
7080 libcrux_ml_kem::vector::portable::vector_type::PortableVector)}
7081 */
7082 static inline libcrux_ml_kem_vector_portable_vector_type_PortableVector
libcrux_ml_kem_vector_portable_ntt_layer_1_step_0d(libcrux_ml_kem_vector_portable_vector_type_PortableVector a,int16_t zeta0,int16_t zeta1,int16_t zeta2,int16_t zeta3)7083 libcrux_ml_kem_vector_portable_ntt_layer_1_step_0d(
7084 libcrux_ml_kem_vector_portable_vector_type_PortableVector a, int16_t zeta0,
7085 int16_t zeta1, int16_t zeta2, int16_t zeta3) {
7086 return libcrux_ml_kem_vector_portable_ntt_ntt_layer_1_step(a, zeta0, zeta1,
7087 zeta2, zeta3);
7088 }
7089
7090 static KRML_MUSTINLINE libcrux_ml_kem_vector_portable_vector_type_PortableVector
libcrux_ml_kem_vector_portable_ntt_ntt_layer_2_step(libcrux_ml_kem_vector_portable_vector_type_PortableVector v,int16_t zeta0,int16_t zeta1)7091 libcrux_ml_kem_vector_portable_ntt_ntt_layer_2_step(
7092 libcrux_ml_kem_vector_portable_vector_type_PortableVector v, int16_t zeta0,
7093 int16_t zeta1) {
7094 libcrux_ml_kem_vector_portable_ntt_ntt_step(&v, zeta0, (size_t)0U,
7095 (size_t)4U);
7096 libcrux_ml_kem_vector_portable_ntt_ntt_step(&v, zeta0, (size_t)1U,
7097 (size_t)5U);
7098 libcrux_ml_kem_vector_portable_ntt_ntt_step(&v, zeta0, (size_t)2U,
7099 (size_t)6U);
7100 libcrux_ml_kem_vector_portable_ntt_ntt_step(&v, zeta0, (size_t)3U,
7101 (size_t)7U);
7102 libcrux_ml_kem_vector_portable_ntt_ntt_step(&v, zeta1, (size_t)8U,
7103 (size_t)12U);
7104 libcrux_ml_kem_vector_portable_ntt_ntt_step(&v, zeta1, (size_t)9U,
7105 (size_t)13U);
7106 libcrux_ml_kem_vector_portable_ntt_ntt_step(&v, zeta1, (size_t)10U,
7107 (size_t)14U);
7108 libcrux_ml_kem_vector_portable_ntt_ntt_step(&v, zeta1, (size_t)11U,
7109 (size_t)15U);
7110 return v;
7111 }
7112
7113 /**
7114 This function found in impl {(libcrux_ml_kem::vector::traits::Operations for
7115 libcrux_ml_kem::vector::portable::vector_type::PortableVector)}
7116 */
7117 static inline libcrux_ml_kem_vector_portable_vector_type_PortableVector
libcrux_ml_kem_vector_portable_ntt_layer_2_step_0d(libcrux_ml_kem_vector_portable_vector_type_PortableVector a,int16_t zeta0,int16_t zeta1)7118 libcrux_ml_kem_vector_portable_ntt_layer_2_step_0d(
7119 libcrux_ml_kem_vector_portable_vector_type_PortableVector a, int16_t zeta0,
7120 int16_t zeta1) {
7121 return libcrux_ml_kem_vector_portable_ntt_ntt_layer_2_step(a, zeta0, zeta1);
7122 }
7123
7124 static KRML_MUSTINLINE libcrux_ml_kem_vector_portable_vector_type_PortableVector
libcrux_ml_kem_vector_portable_ntt_ntt_layer_3_step(libcrux_ml_kem_vector_portable_vector_type_PortableVector v,int16_t zeta)7125 libcrux_ml_kem_vector_portable_ntt_ntt_layer_3_step(
7126 libcrux_ml_kem_vector_portable_vector_type_PortableVector v, int16_t zeta) {
7127 libcrux_ml_kem_vector_portable_ntt_ntt_step(&v, zeta, (size_t)0U, (size_t)8U);
7128 libcrux_ml_kem_vector_portable_ntt_ntt_step(&v, zeta, (size_t)1U, (size_t)9U);
7129 libcrux_ml_kem_vector_portable_ntt_ntt_step(&v, zeta, (size_t)2U,
7130 (size_t)10U);
7131 libcrux_ml_kem_vector_portable_ntt_ntt_step(&v, zeta, (size_t)3U,
7132 (size_t)11U);
7133 libcrux_ml_kem_vector_portable_ntt_ntt_step(&v, zeta, (size_t)4U,
7134 (size_t)12U);
7135 libcrux_ml_kem_vector_portable_ntt_ntt_step(&v, zeta, (size_t)5U,
7136 (size_t)13U);
7137 libcrux_ml_kem_vector_portable_ntt_ntt_step(&v, zeta, (size_t)6U,
7138 (size_t)14U);
7139 libcrux_ml_kem_vector_portable_ntt_ntt_step(&v, zeta, (size_t)7U,
7140 (size_t)15U);
7141 return v;
7142 }
7143
7144 /**
7145 This function found in impl {(libcrux_ml_kem::vector::traits::Operations for
7146 libcrux_ml_kem::vector::portable::vector_type::PortableVector)}
7147 */
7148 static inline libcrux_ml_kem_vector_portable_vector_type_PortableVector
libcrux_ml_kem_vector_portable_ntt_layer_3_step_0d(libcrux_ml_kem_vector_portable_vector_type_PortableVector a,int16_t zeta)7149 libcrux_ml_kem_vector_portable_ntt_layer_3_step_0d(
7150 libcrux_ml_kem_vector_portable_vector_type_PortableVector a, int16_t zeta) {
7151 return libcrux_ml_kem_vector_portable_ntt_ntt_layer_3_step(a, zeta);
7152 }
7153
libcrux_ml_kem_vector_portable_ntt_inv_ntt_step(libcrux_ml_kem_vector_portable_vector_type_PortableVector * v,int16_t zeta,size_t i,size_t j)7154 static KRML_MUSTINLINE void libcrux_ml_kem_vector_portable_ntt_inv_ntt_step(
7155 libcrux_ml_kem_vector_portable_vector_type_PortableVector *v, int16_t zeta,
7156 size_t i, size_t j) {
7157 int16_t a_minus_b = v->elements[j] - v->elements[i];
7158 v->elements[i] =
7159 libcrux_ml_kem_vector_portable_arithmetic_barrett_reduce_element(
7160 v->elements[i] + v->elements[j]);
7161 v->elements[j] =
7162 libcrux_ml_kem_vector_portable_arithmetic_montgomery_multiply_fe_by_fer(
7163 a_minus_b, zeta);
7164 }
7165
7166 static KRML_MUSTINLINE libcrux_ml_kem_vector_portable_vector_type_PortableVector
libcrux_ml_kem_vector_portable_ntt_inv_ntt_layer_1_step(libcrux_ml_kem_vector_portable_vector_type_PortableVector v,int16_t zeta0,int16_t zeta1,int16_t zeta2,int16_t zeta3)7167 libcrux_ml_kem_vector_portable_ntt_inv_ntt_layer_1_step(
7168 libcrux_ml_kem_vector_portable_vector_type_PortableVector v, int16_t zeta0,
7169 int16_t zeta1, int16_t zeta2, int16_t zeta3) {
7170 libcrux_ml_kem_vector_portable_ntt_inv_ntt_step(&v, zeta0, (size_t)0U,
7171 (size_t)2U);
7172 libcrux_ml_kem_vector_portable_ntt_inv_ntt_step(&v, zeta0, (size_t)1U,
7173 (size_t)3U);
7174 libcrux_ml_kem_vector_portable_ntt_inv_ntt_step(&v, zeta1, (size_t)4U,
7175 (size_t)6U);
7176 libcrux_ml_kem_vector_portable_ntt_inv_ntt_step(&v, zeta1, (size_t)5U,
7177 (size_t)7U);
7178 libcrux_ml_kem_vector_portable_ntt_inv_ntt_step(&v, zeta2, (size_t)8U,
7179 (size_t)10U);
7180 libcrux_ml_kem_vector_portable_ntt_inv_ntt_step(&v, zeta2, (size_t)9U,
7181 (size_t)11U);
7182 libcrux_ml_kem_vector_portable_ntt_inv_ntt_step(&v, zeta3, (size_t)12U,
7183 (size_t)14U);
7184 libcrux_ml_kem_vector_portable_ntt_inv_ntt_step(&v, zeta3, (size_t)13U,
7185 (size_t)15U);
7186 return v;
7187 }
7188
7189 /**
7190 This function found in impl {(libcrux_ml_kem::vector::traits::Operations for
7191 libcrux_ml_kem::vector::portable::vector_type::PortableVector)}
7192 */
7193 static inline libcrux_ml_kem_vector_portable_vector_type_PortableVector
libcrux_ml_kem_vector_portable_inv_ntt_layer_1_step_0d(libcrux_ml_kem_vector_portable_vector_type_PortableVector a,int16_t zeta0,int16_t zeta1,int16_t zeta2,int16_t zeta3)7194 libcrux_ml_kem_vector_portable_inv_ntt_layer_1_step_0d(
7195 libcrux_ml_kem_vector_portable_vector_type_PortableVector a, int16_t zeta0,
7196 int16_t zeta1, int16_t zeta2, int16_t zeta3) {
7197 return libcrux_ml_kem_vector_portable_ntt_inv_ntt_layer_1_step(
7198 a, zeta0, zeta1, zeta2, zeta3);
7199 }
7200
7201 static KRML_MUSTINLINE libcrux_ml_kem_vector_portable_vector_type_PortableVector
libcrux_ml_kem_vector_portable_ntt_inv_ntt_layer_2_step(libcrux_ml_kem_vector_portable_vector_type_PortableVector v,int16_t zeta0,int16_t zeta1)7202 libcrux_ml_kem_vector_portable_ntt_inv_ntt_layer_2_step(
7203 libcrux_ml_kem_vector_portable_vector_type_PortableVector v, int16_t zeta0,
7204 int16_t zeta1) {
7205 libcrux_ml_kem_vector_portable_ntt_inv_ntt_step(&v, zeta0, (size_t)0U,
7206 (size_t)4U);
7207 libcrux_ml_kem_vector_portable_ntt_inv_ntt_step(&v, zeta0, (size_t)1U,
7208 (size_t)5U);
7209 libcrux_ml_kem_vector_portable_ntt_inv_ntt_step(&v, zeta0, (size_t)2U,
7210 (size_t)6U);
7211 libcrux_ml_kem_vector_portable_ntt_inv_ntt_step(&v, zeta0, (size_t)3U,
7212 (size_t)7U);
7213 libcrux_ml_kem_vector_portable_ntt_inv_ntt_step(&v, zeta1, (size_t)8U,
7214 (size_t)12U);
7215 libcrux_ml_kem_vector_portable_ntt_inv_ntt_step(&v, zeta1, (size_t)9U,
7216 (size_t)13U);
7217 libcrux_ml_kem_vector_portable_ntt_inv_ntt_step(&v, zeta1, (size_t)10U,
7218 (size_t)14U);
7219 libcrux_ml_kem_vector_portable_ntt_inv_ntt_step(&v, zeta1, (size_t)11U,
7220 (size_t)15U);
7221 return v;
7222 }
7223
7224 /**
7225 This function found in impl {(libcrux_ml_kem::vector::traits::Operations for
7226 libcrux_ml_kem::vector::portable::vector_type::PortableVector)}
7227 */
7228 static inline libcrux_ml_kem_vector_portable_vector_type_PortableVector
libcrux_ml_kem_vector_portable_inv_ntt_layer_2_step_0d(libcrux_ml_kem_vector_portable_vector_type_PortableVector a,int16_t zeta0,int16_t zeta1)7229 libcrux_ml_kem_vector_portable_inv_ntt_layer_2_step_0d(
7230 libcrux_ml_kem_vector_portable_vector_type_PortableVector a, int16_t zeta0,
7231 int16_t zeta1) {
7232 return libcrux_ml_kem_vector_portable_ntt_inv_ntt_layer_2_step(a, zeta0,
7233 zeta1);
7234 }
7235
7236 static KRML_MUSTINLINE libcrux_ml_kem_vector_portable_vector_type_PortableVector
libcrux_ml_kem_vector_portable_ntt_inv_ntt_layer_3_step(libcrux_ml_kem_vector_portable_vector_type_PortableVector v,int16_t zeta)7237 libcrux_ml_kem_vector_portable_ntt_inv_ntt_layer_3_step(
7238 libcrux_ml_kem_vector_portable_vector_type_PortableVector v, int16_t zeta) {
7239 libcrux_ml_kem_vector_portable_ntt_inv_ntt_step(&v, zeta, (size_t)0U,
7240 (size_t)8U);
7241 libcrux_ml_kem_vector_portable_ntt_inv_ntt_step(&v, zeta, (size_t)1U,
7242 (size_t)9U);
7243 libcrux_ml_kem_vector_portable_ntt_inv_ntt_step(&v, zeta, (size_t)2U,
7244 (size_t)10U);
7245 libcrux_ml_kem_vector_portable_ntt_inv_ntt_step(&v, zeta, (size_t)3U,
7246 (size_t)11U);
7247 libcrux_ml_kem_vector_portable_ntt_inv_ntt_step(&v, zeta, (size_t)4U,
7248 (size_t)12U);
7249 libcrux_ml_kem_vector_portable_ntt_inv_ntt_step(&v, zeta, (size_t)5U,
7250 (size_t)13U);
7251 libcrux_ml_kem_vector_portable_ntt_inv_ntt_step(&v, zeta, (size_t)6U,
7252 (size_t)14U);
7253 libcrux_ml_kem_vector_portable_ntt_inv_ntt_step(&v, zeta, (size_t)7U,
7254 (size_t)15U);
7255 return v;
7256 }
7257
7258 /**
7259 This function found in impl {(libcrux_ml_kem::vector::traits::Operations for
7260 libcrux_ml_kem::vector::portable::vector_type::PortableVector)}
7261 */
7262 static inline libcrux_ml_kem_vector_portable_vector_type_PortableVector
libcrux_ml_kem_vector_portable_inv_ntt_layer_3_step_0d(libcrux_ml_kem_vector_portable_vector_type_PortableVector a,int16_t zeta)7263 libcrux_ml_kem_vector_portable_inv_ntt_layer_3_step_0d(
7264 libcrux_ml_kem_vector_portable_vector_type_PortableVector a, int16_t zeta) {
7265 return libcrux_ml_kem_vector_portable_ntt_inv_ntt_layer_3_step(a, zeta);
7266 }
7267
7268 /**
7269 Compute the product of two Kyber binomials with respect to the
7270 modulus `X² - zeta`.
7271
7272 This function almost implements <strong>Algorithm 11</strong> of the
7273 NIST FIPS 203 standard, which is reproduced below:
7274
7275 ```plaintext
7276 Input: a₀, a₁, b₀, b₁ ∈ ℤq.
7277 Input: γ ∈ ℤq.
7278 Output: c₀, c₁ ∈ ℤq.
7279
7280 c₀ ← a₀·b₀ + a₁·b₁·γ
7281 c₁ ← a₀·b₁ + a₁·b₀
7282 return c₀, c₁
7283 ```
7284 We say "almost" because the coefficients output by this function are in
7285 the Montgomery domain (unlike in the specification).
7286
7287 The NIST FIPS 203 standard can be found at
7288 <https://csrc.nist.gov/pubs/fips/203/ipd>.
7289 */
7290 static KRML_MUSTINLINE void
libcrux_ml_kem_vector_portable_ntt_ntt_multiply_binomials(libcrux_ml_kem_vector_portable_vector_type_PortableVector * a,libcrux_ml_kem_vector_portable_vector_type_PortableVector * b,int16_t zeta,size_t i,size_t j,libcrux_ml_kem_vector_portable_vector_type_PortableVector * out)7291 libcrux_ml_kem_vector_portable_ntt_ntt_multiply_binomials(
7292 libcrux_ml_kem_vector_portable_vector_type_PortableVector *a,
7293 libcrux_ml_kem_vector_portable_vector_type_PortableVector *b, int16_t zeta,
7294 size_t i, size_t j,
7295 libcrux_ml_kem_vector_portable_vector_type_PortableVector *out) {
7296 int16_t o0 = libcrux_ml_kem_vector_portable_arithmetic_montgomery_reduce_element(
7297 (int32_t)a->elements[i] * (int32_t)b->elements[i] +
7298 (int32_t)
7299 libcrux_ml_kem_vector_portable_arithmetic_montgomery_reduce_element(
7300 (int32_t)a->elements[j] * (int32_t)b->elements[j]) *
7301 (int32_t)zeta);
7302 int16_t o1 =
7303 libcrux_ml_kem_vector_portable_arithmetic_montgomery_reduce_element(
7304 (int32_t)a->elements[i] * (int32_t)b->elements[j] +
7305 (int32_t)a->elements[j] * (int32_t)b->elements[i]);
7306 out->elements[i] = o0;
7307 out->elements[j] = o1;
7308 }
7309
7310 static KRML_MUSTINLINE libcrux_ml_kem_vector_portable_vector_type_PortableVector
libcrux_ml_kem_vector_portable_ntt_ntt_multiply(libcrux_ml_kem_vector_portable_vector_type_PortableVector * lhs,libcrux_ml_kem_vector_portable_vector_type_PortableVector * rhs,int16_t zeta0,int16_t zeta1,int16_t zeta2,int16_t zeta3)7311 libcrux_ml_kem_vector_portable_ntt_ntt_multiply(
7312 libcrux_ml_kem_vector_portable_vector_type_PortableVector *lhs,
7313 libcrux_ml_kem_vector_portable_vector_type_PortableVector *rhs,
7314 int16_t zeta0, int16_t zeta1, int16_t zeta2, int16_t zeta3) {
7315 libcrux_ml_kem_vector_portable_vector_type_PortableVector out =
7316 libcrux_ml_kem_vector_portable_vector_type_zero();
7317 libcrux_ml_kem_vector_portable_ntt_ntt_multiply_binomials(
7318 lhs, rhs, zeta0, (size_t)0U, (size_t)1U, &out);
7319 libcrux_ml_kem_vector_portable_ntt_ntt_multiply_binomials(
7320 lhs, rhs, -zeta0, (size_t)2U, (size_t)3U, &out);
7321 libcrux_ml_kem_vector_portable_ntt_ntt_multiply_binomials(
7322 lhs, rhs, zeta1, (size_t)4U, (size_t)5U, &out);
7323 libcrux_ml_kem_vector_portable_ntt_ntt_multiply_binomials(
7324 lhs, rhs, -zeta1, (size_t)6U, (size_t)7U, &out);
7325 libcrux_ml_kem_vector_portable_ntt_ntt_multiply_binomials(
7326 lhs, rhs, zeta2, (size_t)8U, (size_t)9U, &out);
7327 libcrux_ml_kem_vector_portable_ntt_ntt_multiply_binomials(
7328 lhs, rhs, -zeta2, (size_t)10U, (size_t)11U, &out);
7329 libcrux_ml_kem_vector_portable_ntt_ntt_multiply_binomials(
7330 lhs, rhs, zeta3, (size_t)12U, (size_t)13U, &out);
7331 libcrux_ml_kem_vector_portable_ntt_ntt_multiply_binomials(
7332 lhs, rhs, -zeta3, (size_t)14U, (size_t)15U, &out);
7333 return out;
7334 }
7335
7336 /**
7337 This function found in impl {(libcrux_ml_kem::vector::traits::Operations for
7338 libcrux_ml_kem::vector::portable::vector_type::PortableVector)}
7339 */
7340 static inline libcrux_ml_kem_vector_portable_vector_type_PortableVector
libcrux_ml_kem_vector_portable_ntt_multiply_0d(libcrux_ml_kem_vector_portable_vector_type_PortableVector * lhs,libcrux_ml_kem_vector_portable_vector_type_PortableVector * rhs,int16_t zeta0,int16_t zeta1,int16_t zeta2,int16_t zeta3)7341 libcrux_ml_kem_vector_portable_ntt_multiply_0d(
7342 libcrux_ml_kem_vector_portable_vector_type_PortableVector *lhs,
7343 libcrux_ml_kem_vector_portable_vector_type_PortableVector *rhs,
7344 int16_t zeta0, int16_t zeta1, int16_t zeta2, int16_t zeta3) {
7345 return libcrux_ml_kem_vector_portable_ntt_ntt_multiply(lhs, rhs, zeta0, zeta1,
7346 zeta2, zeta3);
7347 }
7348
7349 static KRML_MUSTINLINE void
libcrux_ml_kem_vector_portable_serialize_serialize_1(libcrux_ml_kem_vector_portable_vector_type_PortableVector v,uint8_t ret[2U])7350 libcrux_ml_kem_vector_portable_serialize_serialize_1(
7351 libcrux_ml_kem_vector_portable_vector_type_PortableVector v,
7352 uint8_t ret[2U]) {
7353 uint8_t result[2U] = {0U};
7354 for (size_t i = (size_t)0U; i < (size_t)8U; i++) {
7355 size_t i0 = i;
7356 size_t uu____0 = (size_t)0U;
7357 result[uu____0] = (uint32_t)result[uu____0] |
7358 (uint32_t)(uint8_t)v.elements[i0] << (uint32_t)i0;
7359 }
7360 for (size_t i = (size_t)8U; i < (size_t)16U; i++) {
7361 size_t i0 = i;
7362 size_t uu____1 = (size_t)1U;
7363 result[uu____1] =
7364 (uint32_t)result[uu____1] | (uint32_t)(uint8_t)v.elements[i0]
7365 << (uint32_t)(i0 - (size_t)8U);
7366 }
7367 memcpy(ret, result, (size_t)2U * sizeof(uint8_t));
7368 }
7369
7370 /**
7371 This function found in impl {(libcrux_ml_kem::vector::traits::Operations for
7372 libcrux_ml_kem::vector::portable::vector_type::PortableVector)}
7373 */
libcrux_ml_kem_vector_portable_serialize_1_0d(libcrux_ml_kem_vector_portable_vector_type_PortableVector a,uint8_t ret[2U])7374 static inline void libcrux_ml_kem_vector_portable_serialize_1_0d(
7375 libcrux_ml_kem_vector_portable_vector_type_PortableVector a,
7376 uint8_t ret[2U]) {
7377 libcrux_ml_kem_vector_portable_serialize_serialize_1(a, ret);
7378 }
7379
7380 static KRML_MUSTINLINE libcrux_ml_kem_vector_portable_vector_type_PortableVector
libcrux_ml_kem_vector_portable_serialize_deserialize_1(Eurydice_slice v)7381 libcrux_ml_kem_vector_portable_serialize_deserialize_1(Eurydice_slice v) {
7382 libcrux_ml_kem_vector_portable_vector_type_PortableVector result =
7383 libcrux_ml_kem_vector_portable_vector_type_zero();
7384 for (size_t i = (size_t)0U; i < (size_t)8U; i++) {
7385 size_t i0 = i;
7386 result.elements[i0] = (int16_t)((uint32_t)Eurydice_slice_index(
7387 v, (size_t)0U, uint8_t, uint8_t *) >>
7388 (uint32_t)i0 &
7389 1U);
7390 }
7391 for (size_t i = (size_t)8U;
7392 i < LIBCRUX_ML_KEM_VECTOR_TRAITS_FIELD_ELEMENTS_IN_VECTOR; i++) {
7393 size_t i0 = i;
7394 result.elements[i0] = (int16_t)((uint32_t)Eurydice_slice_index(
7395 v, (size_t)1U, uint8_t, uint8_t *) >>
7396 (uint32_t)(i0 - (size_t)8U) &
7397 1U);
7398 }
7399 return result;
7400 }
7401
7402 /**
7403 This function found in impl {(libcrux_ml_kem::vector::traits::Operations for
7404 libcrux_ml_kem::vector::portable::vector_type::PortableVector)}
7405 */
7406 static inline libcrux_ml_kem_vector_portable_vector_type_PortableVector
libcrux_ml_kem_vector_portable_deserialize_1_0d(Eurydice_slice a)7407 libcrux_ml_kem_vector_portable_deserialize_1_0d(Eurydice_slice a) {
7408 return libcrux_ml_kem_vector_portable_serialize_deserialize_1(a);
7409 }
7410
7411 typedef struct uint8_t_x4_s {
7412 uint8_t fst;
7413 uint8_t snd;
7414 uint8_t thd;
7415 uint8_t f3;
7416 } uint8_t_x4;
7417
7418 static KRML_MUSTINLINE uint8_t_x4
libcrux_ml_kem_vector_portable_serialize_serialize_4_int(Eurydice_slice v)7419 libcrux_ml_kem_vector_portable_serialize_serialize_4_int(Eurydice_slice v) {
7420 uint8_t result0 =
7421 (uint32_t)(uint8_t)Eurydice_slice_index(v, (size_t)1U, int16_t, int16_t *)
7422 << 4U |
7423 (uint32_t)(uint8_t)Eurydice_slice_index(v, (size_t)0U, int16_t,
7424 int16_t *);
7425 uint8_t result1 =
7426 (uint32_t)(uint8_t)Eurydice_slice_index(v, (size_t)3U, int16_t, int16_t *)
7427 << 4U |
7428 (uint32_t)(uint8_t)Eurydice_slice_index(v, (size_t)2U, int16_t,
7429 int16_t *);
7430 uint8_t result2 =
7431 (uint32_t)(uint8_t)Eurydice_slice_index(v, (size_t)5U, int16_t, int16_t *)
7432 << 4U |
7433 (uint32_t)(uint8_t)Eurydice_slice_index(v, (size_t)4U, int16_t,
7434 int16_t *);
7435 uint8_t result3 =
7436 (uint32_t)(uint8_t)Eurydice_slice_index(v, (size_t)7U, int16_t, int16_t *)
7437 << 4U |
7438 (uint32_t)(uint8_t)Eurydice_slice_index(v, (size_t)6U, int16_t,
7439 int16_t *);
7440 return (CLITERAL(uint8_t_x4){
7441 .fst = result0, .snd = result1, .thd = result2, .f3 = result3});
7442 }
7443
7444 static KRML_MUSTINLINE void
libcrux_ml_kem_vector_portable_serialize_serialize_4(libcrux_ml_kem_vector_portable_vector_type_PortableVector v,uint8_t ret[8U])7445 libcrux_ml_kem_vector_portable_serialize_serialize_4(
7446 libcrux_ml_kem_vector_portable_vector_type_PortableVector v,
7447 uint8_t ret[8U]) {
7448 uint8_t_x4 result0_3 =
7449 libcrux_ml_kem_vector_portable_serialize_serialize_4_int(
7450 Eurydice_array_to_subslice2(v.elements, (size_t)0U, (size_t)8U,
7451 int16_t));
7452 uint8_t_x4 result4_7 =
7453 libcrux_ml_kem_vector_portable_serialize_serialize_4_int(
7454 Eurydice_array_to_subslice2(v.elements, (size_t)8U, (size_t)16U,
7455 int16_t));
7456 uint8_t result[8U] = {0U};
7457 result[0U] = result0_3.fst;
7458 result[1U] = result0_3.snd;
7459 result[2U] = result0_3.thd;
7460 result[3U] = result0_3.f3;
7461 result[4U] = result4_7.fst;
7462 result[5U] = result4_7.snd;
7463 result[6U] = result4_7.thd;
7464 result[7U] = result4_7.f3;
7465 memcpy(ret, result, (size_t)8U * sizeof(uint8_t));
7466 }
7467
7468 /**
7469 This function found in impl {(libcrux_ml_kem::vector::traits::Operations for
7470 libcrux_ml_kem::vector::portable::vector_type::PortableVector)}
7471 */
libcrux_ml_kem_vector_portable_serialize_4_0d(libcrux_ml_kem_vector_portable_vector_type_PortableVector a,uint8_t ret[8U])7472 static inline void libcrux_ml_kem_vector_portable_serialize_4_0d(
7473 libcrux_ml_kem_vector_portable_vector_type_PortableVector a,
7474 uint8_t ret[8U]) {
7475 libcrux_ml_kem_vector_portable_serialize_serialize_4(a, ret);
7476 }
7477
7478 static KRML_MUSTINLINE int16_t_x8
libcrux_ml_kem_vector_portable_serialize_deserialize_4_int(Eurydice_slice bytes)7479 libcrux_ml_kem_vector_portable_serialize_deserialize_4_int(
7480 Eurydice_slice bytes) {
7481 int16_t v0 = (int16_t)((uint32_t)Eurydice_slice_index(bytes, (size_t)0U,
7482 uint8_t, uint8_t *) &
7483 15U);
7484 int16_t v1 = (int16_t)((uint32_t)Eurydice_slice_index(bytes, (size_t)0U,
7485 uint8_t, uint8_t *) >>
7486 4U &
7487 15U);
7488 int16_t v2 = (int16_t)((uint32_t)Eurydice_slice_index(bytes, (size_t)1U,
7489 uint8_t, uint8_t *) &
7490 15U);
7491 int16_t v3 = (int16_t)((uint32_t)Eurydice_slice_index(bytes, (size_t)1U,
7492 uint8_t, uint8_t *) >>
7493 4U &
7494 15U);
7495 int16_t v4 = (int16_t)((uint32_t)Eurydice_slice_index(bytes, (size_t)2U,
7496 uint8_t, uint8_t *) &
7497 15U);
7498 int16_t v5 = (int16_t)((uint32_t)Eurydice_slice_index(bytes, (size_t)2U,
7499 uint8_t, uint8_t *) >>
7500 4U &
7501 15U);
7502 int16_t v6 = (int16_t)((uint32_t)Eurydice_slice_index(bytes, (size_t)3U,
7503 uint8_t, uint8_t *) &
7504 15U);
7505 int16_t v7 = (int16_t)((uint32_t)Eurydice_slice_index(bytes, (size_t)3U,
7506 uint8_t, uint8_t *) >>
7507 4U &
7508 15U);
7509 return (CLITERAL(int16_t_x8){.fst = v0,
7510 .snd = v1,
7511 .thd = v2,
7512 .f3 = v3,
7513 .f4 = v4,
7514 .f5 = v5,
7515 .f6 = v6,
7516 .f7 = v7});
7517 }
7518
7519 static KRML_MUSTINLINE libcrux_ml_kem_vector_portable_vector_type_PortableVector
libcrux_ml_kem_vector_portable_serialize_deserialize_4(Eurydice_slice bytes)7520 libcrux_ml_kem_vector_portable_serialize_deserialize_4(Eurydice_slice bytes) {
7521 int16_t_x8 v0_7 = libcrux_ml_kem_vector_portable_serialize_deserialize_4_int(
7522 Eurydice_slice_subslice2(bytes, (size_t)0U, (size_t)4U, uint8_t));
7523 int16_t_x8 v8_15 = libcrux_ml_kem_vector_portable_serialize_deserialize_4_int(
7524 Eurydice_slice_subslice2(bytes, (size_t)4U, (size_t)8U, uint8_t));
7525 libcrux_ml_kem_vector_portable_vector_type_PortableVector v =
7526 libcrux_ml_kem_vector_portable_vector_type_zero();
7527 v.elements[0U] = v0_7.fst;
7528 v.elements[1U] = v0_7.snd;
7529 v.elements[2U] = v0_7.thd;
7530 v.elements[3U] = v0_7.f3;
7531 v.elements[4U] = v0_7.f4;
7532 v.elements[5U] = v0_7.f5;
7533 v.elements[6U] = v0_7.f6;
7534 v.elements[7U] = v0_7.f7;
7535 v.elements[8U] = v8_15.fst;
7536 v.elements[9U] = v8_15.snd;
7537 v.elements[10U] = v8_15.thd;
7538 v.elements[11U] = v8_15.f3;
7539 v.elements[12U] = v8_15.f4;
7540 v.elements[13U] = v8_15.f5;
7541 v.elements[14U] = v8_15.f6;
7542 v.elements[15U] = v8_15.f7;
7543 return v;
7544 }
7545
7546 /**
7547 This function found in impl {(libcrux_ml_kem::vector::traits::Operations for
7548 libcrux_ml_kem::vector::portable::vector_type::PortableVector)}
7549 */
7550 static inline libcrux_ml_kem_vector_portable_vector_type_PortableVector
libcrux_ml_kem_vector_portable_deserialize_4_0d(Eurydice_slice a)7551 libcrux_ml_kem_vector_portable_deserialize_4_0d(Eurydice_slice a) {
7552 return libcrux_ml_kem_vector_portable_serialize_deserialize_4(a);
7553 }
7554
7555 typedef struct uint8_t_x5_s {
7556 uint8_t fst;
7557 uint8_t snd;
7558 uint8_t thd;
7559 uint8_t f3;
7560 uint8_t f4;
7561 } uint8_t_x5;
7562
7563 static KRML_MUSTINLINE uint8_t_x5
libcrux_ml_kem_vector_portable_serialize_serialize_5_int(Eurydice_slice v)7564 libcrux_ml_kem_vector_portable_serialize_serialize_5_int(Eurydice_slice v) {
7565 uint8_t r0 =
7566 (uint8_t)(Eurydice_slice_index(v, (size_t)0U, int16_t, int16_t *) |
7567 Eurydice_slice_index(v, (size_t)1U, int16_t, int16_t *) << 5U);
7568 uint8_t r1 =
7569 (uint8_t)((Eurydice_slice_index(v, (size_t)1U, int16_t, int16_t *) >> 3U |
7570 Eurydice_slice_index(v, (size_t)2U, int16_t, int16_t *)
7571 << 2U) |
7572 Eurydice_slice_index(v, (size_t)3U, int16_t, int16_t *) << 7U);
7573 uint8_t r2 =
7574 (uint8_t)(Eurydice_slice_index(v, (size_t)3U, int16_t, int16_t *) >> 1U |
7575 Eurydice_slice_index(v, (size_t)4U, int16_t, int16_t *) << 4U);
7576 uint8_t r3 =
7577 (uint8_t)((Eurydice_slice_index(v, (size_t)4U, int16_t, int16_t *) >> 4U |
7578 Eurydice_slice_index(v, (size_t)5U, int16_t, int16_t *)
7579 << 1U) |
7580 Eurydice_slice_index(v, (size_t)6U, int16_t, int16_t *) << 6U);
7581 uint8_t r4 =
7582 (uint8_t)(Eurydice_slice_index(v, (size_t)6U, int16_t, int16_t *) >> 2U |
7583 Eurydice_slice_index(v, (size_t)7U, int16_t, int16_t *) << 3U);
7584 return (CLITERAL(uint8_t_x5){
7585 .fst = r0, .snd = r1, .thd = r2, .f3 = r3, .f4 = r4});
7586 }
7587
7588 static KRML_MUSTINLINE void
libcrux_ml_kem_vector_portable_serialize_serialize_5(libcrux_ml_kem_vector_portable_vector_type_PortableVector v,uint8_t ret[10U])7589 libcrux_ml_kem_vector_portable_serialize_serialize_5(
7590 libcrux_ml_kem_vector_portable_vector_type_PortableVector v,
7591 uint8_t ret[10U]) {
7592 uint8_t_x5 r0_4 = libcrux_ml_kem_vector_portable_serialize_serialize_5_int(
7593 Eurydice_array_to_subslice2(v.elements, (size_t)0U, (size_t)8U, int16_t));
7594 uint8_t_x5 r5_9 = libcrux_ml_kem_vector_portable_serialize_serialize_5_int(
7595 Eurydice_array_to_subslice2(v.elements, (size_t)8U, (size_t)16U,
7596 int16_t));
7597 uint8_t result[10U] = {0U};
7598 result[0U] = r0_4.fst;
7599 result[1U] = r0_4.snd;
7600 result[2U] = r0_4.thd;
7601 result[3U] = r0_4.f3;
7602 result[4U] = r0_4.f4;
7603 result[5U] = r5_9.fst;
7604 result[6U] = r5_9.snd;
7605 result[7U] = r5_9.thd;
7606 result[8U] = r5_9.f3;
7607 result[9U] = r5_9.f4;
7608 memcpy(ret, result, (size_t)10U * sizeof(uint8_t));
7609 }
7610
7611 /**
7612 This function found in impl {(libcrux_ml_kem::vector::traits::Operations for
7613 libcrux_ml_kem::vector::portable::vector_type::PortableVector)}
7614 */
libcrux_ml_kem_vector_portable_serialize_5_0d(libcrux_ml_kem_vector_portable_vector_type_PortableVector a,uint8_t ret[10U])7615 static inline void libcrux_ml_kem_vector_portable_serialize_5_0d(
7616 libcrux_ml_kem_vector_portable_vector_type_PortableVector a,
7617 uint8_t ret[10U]) {
7618 libcrux_ml_kem_vector_portable_serialize_serialize_5(a, ret);
7619 }
7620
7621 static KRML_MUSTINLINE int16_t_x8
libcrux_ml_kem_vector_portable_serialize_deserialize_5_int(Eurydice_slice bytes)7622 libcrux_ml_kem_vector_portable_serialize_deserialize_5_int(
7623 Eurydice_slice bytes) {
7624 int16_t v0 = (int16_t)((uint32_t)Eurydice_slice_index(bytes, (size_t)0U,
7625 uint8_t, uint8_t *) &
7626 31U);
7627 int16_t v1 = (int16_t)(((uint32_t)Eurydice_slice_index(bytes, (size_t)1U,
7628 uint8_t, uint8_t *) &
7629 3U) << 3U |
7630 (uint32_t)Eurydice_slice_index(bytes, (size_t)0U,
7631 uint8_t, uint8_t *) >>
7632 5U);
7633 int16_t v2 = (int16_t)((uint32_t)Eurydice_slice_index(bytes, (size_t)1U,
7634 uint8_t, uint8_t *) >>
7635 2U &
7636 31U);
7637 int16_t v3 = (int16_t)(((uint32_t)Eurydice_slice_index(bytes, (size_t)2U,
7638 uint8_t, uint8_t *) &
7639 15U)
7640 << 1U |
7641 (uint32_t)Eurydice_slice_index(bytes, (size_t)1U,
7642 uint8_t, uint8_t *) >>
7643 7U);
7644 int16_t v4 = (int16_t)(((uint32_t)Eurydice_slice_index(bytes, (size_t)3U,
7645 uint8_t, uint8_t *) &
7646 1U) << 4U |
7647 (uint32_t)Eurydice_slice_index(bytes, (size_t)2U,
7648 uint8_t, uint8_t *) >>
7649 4U);
7650 int16_t v5 = (int16_t)((uint32_t)Eurydice_slice_index(bytes, (size_t)3U,
7651 uint8_t, uint8_t *) >>
7652 1U &
7653 31U);
7654 int16_t v6 = (int16_t)(((uint32_t)Eurydice_slice_index(bytes, (size_t)4U,
7655 uint8_t, uint8_t *) &
7656 7U) << 2U |
7657 (uint32_t)Eurydice_slice_index(bytes, (size_t)3U,
7658 uint8_t, uint8_t *) >>
7659 6U);
7660 int16_t v7 = (int16_t)((uint32_t)Eurydice_slice_index(bytes, (size_t)4U,
7661 uint8_t, uint8_t *) >>
7662 3U);
7663 return (CLITERAL(int16_t_x8){.fst = v0,
7664 .snd = v1,
7665 .thd = v2,
7666 .f3 = v3,
7667 .f4 = v4,
7668 .f5 = v5,
7669 .f6 = v6,
7670 .f7 = v7});
7671 }
7672
7673 static KRML_MUSTINLINE libcrux_ml_kem_vector_portable_vector_type_PortableVector
libcrux_ml_kem_vector_portable_serialize_deserialize_5(Eurydice_slice bytes)7674 libcrux_ml_kem_vector_portable_serialize_deserialize_5(Eurydice_slice bytes) {
7675 int16_t_x8 v0_7 = libcrux_ml_kem_vector_portable_serialize_deserialize_5_int(
7676 Eurydice_slice_subslice2(bytes, (size_t)0U, (size_t)5U, uint8_t));
7677 int16_t_x8 v8_15 = libcrux_ml_kem_vector_portable_serialize_deserialize_5_int(
7678 Eurydice_slice_subslice2(bytes, (size_t)5U, (size_t)10U, uint8_t));
7679 libcrux_ml_kem_vector_portable_vector_type_PortableVector v =
7680 libcrux_ml_kem_vector_portable_vector_type_zero();
7681 v.elements[0U] = v0_7.fst;
7682 v.elements[1U] = v0_7.snd;
7683 v.elements[2U] = v0_7.thd;
7684 v.elements[3U] = v0_7.f3;
7685 v.elements[4U] = v0_7.f4;
7686 v.elements[5U] = v0_7.f5;
7687 v.elements[6U] = v0_7.f6;
7688 v.elements[7U] = v0_7.f7;
7689 v.elements[8U] = v8_15.fst;
7690 v.elements[9U] = v8_15.snd;
7691 v.elements[10U] = v8_15.thd;
7692 v.elements[11U] = v8_15.f3;
7693 v.elements[12U] = v8_15.f4;
7694 v.elements[13U] = v8_15.f5;
7695 v.elements[14U] = v8_15.f6;
7696 v.elements[15U] = v8_15.f7;
7697 return v;
7698 }
7699
7700 /**
7701 This function found in impl {(libcrux_ml_kem::vector::traits::Operations for
7702 libcrux_ml_kem::vector::portable::vector_type::PortableVector)}
7703 */
7704 static inline libcrux_ml_kem_vector_portable_vector_type_PortableVector
libcrux_ml_kem_vector_portable_deserialize_5_0d(Eurydice_slice a)7705 libcrux_ml_kem_vector_portable_deserialize_5_0d(Eurydice_slice a) {
7706 return libcrux_ml_kem_vector_portable_serialize_deserialize_5(a);
7707 }
7708
7709 static KRML_MUSTINLINE uint8_t_x5
libcrux_ml_kem_vector_portable_serialize_serialize_10_int(Eurydice_slice v)7710 libcrux_ml_kem_vector_portable_serialize_serialize_10_int(Eurydice_slice v) {
7711 uint8_t r0 =
7712 (uint8_t)(Eurydice_slice_index(v, (size_t)0U, int16_t, int16_t *) &
7713 (int16_t)255);
7714 uint8_t r1 = (uint32_t)(uint8_t)(Eurydice_slice_index(v, (size_t)1U, int16_t,
7715 int16_t *) &
7716 (int16_t)63)
7717 << 2U |
7718 (uint32_t)(uint8_t)(Eurydice_slice_index(v, (size_t)0U, int16_t,
7719 int16_t *) >>
7720 8U &
7721 (int16_t)3);
7722 uint8_t r2 = (uint32_t)(uint8_t)(Eurydice_slice_index(v, (size_t)2U, int16_t,
7723 int16_t *) &
7724 (int16_t)15)
7725 << 4U |
7726 (uint32_t)(uint8_t)(Eurydice_slice_index(v, (size_t)1U, int16_t,
7727 int16_t *) >>
7728 6U &
7729 (int16_t)15);
7730 uint8_t r3 = (uint32_t)(uint8_t)(Eurydice_slice_index(v, (size_t)3U, int16_t,
7731 int16_t *) &
7732 (int16_t)3)
7733 << 6U |
7734 (uint32_t)(uint8_t)(Eurydice_slice_index(v, (size_t)2U, int16_t,
7735 int16_t *) >>
7736 4U &
7737 (int16_t)63);
7738 uint8_t r4 =
7739 (uint8_t)(Eurydice_slice_index(v, (size_t)3U, int16_t, int16_t *) >> 2U &
7740 (int16_t)255);
7741 return (CLITERAL(uint8_t_x5){
7742 .fst = r0, .snd = r1, .thd = r2, .f3 = r3, .f4 = r4});
7743 }
7744
7745 static KRML_MUSTINLINE void
libcrux_ml_kem_vector_portable_serialize_serialize_10(libcrux_ml_kem_vector_portable_vector_type_PortableVector v,uint8_t ret[20U])7746 libcrux_ml_kem_vector_portable_serialize_serialize_10(
7747 libcrux_ml_kem_vector_portable_vector_type_PortableVector v,
7748 uint8_t ret[20U]) {
7749 uint8_t_x5 r0_4 = libcrux_ml_kem_vector_portable_serialize_serialize_10_int(
7750 Eurydice_array_to_subslice2(v.elements, (size_t)0U, (size_t)4U, int16_t));
7751 uint8_t_x5 r5_9 = libcrux_ml_kem_vector_portable_serialize_serialize_10_int(
7752 Eurydice_array_to_subslice2(v.elements, (size_t)4U, (size_t)8U, int16_t));
7753 uint8_t_x5 r10_14 = libcrux_ml_kem_vector_portable_serialize_serialize_10_int(
7754 Eurydice_array_to_subslice2(v.elements, (size_t)8U, (size_t)12U,
7755 int16_t));
7756 uint8_t_x5 r15_19 = libcrux_ml_kem_vector_portable_serialize_serialize_10_int(
7757 Eurydice_array_to_subslice2(v.elements, (size_t)12U, (size_t)16U,
7758 int16_t));
7759 uint8_t result[20U] = {0U};
7760 result[0U] = r0_4.fst;
7761 result[1U] = r0_4.snd;
7762 result[2U] = r0_4.thd;
7763 result[3U] = r0_4.f3;
7764 result[4U] = r0_4.f4;
7765 result[5U] = r5_9.fst;
7766 result[6U] = r5_9.snd;
7767 result[7U] = r5_9.thd;
7768 result[8U] = r5_9.f3;
7769 result[9U] = r5_9.f4;
7770 result[10U] = r10_14.fst;
7771 result[11U] = r10_14.snd;
7772 result[12U] = r10_14.thd;
7773 result[13U] = r10_14.f3;
7774 result[14U] = r10_14.f4;
7775 result[15U] = r15_19.fst;
7776 result[16U] = r15_19.snd;
7777 result[17U] = r15_19.thd;
7778 result[18U] = r15_19.f3;
7779 result[19U] = r15_19.f4;
7780 memcpy(ret, result, (size_t)20U * sizeof(uint8_t));
7781 }
7782
7783 /**
7784 This function found in impl {(libcrux_ml_kem::vector::traits::Operations for
7785 libcrux_ml_kem::vector::portable::vector_type::PortableVector)}
7786 */
libcrux_ml_kem_vector_portable_serialize_10_0d(libcrux_ml_kem_vector_portable_vector_type_PortableVector a,uint8_t ret[20U])7787 static inline void libcrux_ml_kem_vector_portable_serialize_10_0d(
7788 libcrux_ml_kem_vector_portable_vector_type_PortableVector a,
7789 uint8_t ret[20U]) {
7790 libcrux_ml_kem_vector_portable_serialize_serialize_10(a, ret);
7791 }
7792
7793 static KRML_MUSTINLINE int16_t_x8
libcrux_ml_kem_vector_portable_serialize_deserialize_10_int(Eurydice_slice bytes)7794 libcrux_ml_kem_vector_portable_serialize_deserialize_10_int(
7795 Eurydice_slice bytes) {
7796 int16_t r0 =
7797 ((int16_t)Eurydice_slice_index(bytes, (size_t)1U, uint8_t, uint8_t *) &
7798 (int16_t)3)
7799 << 8U |
7800 ((int16_t)Eurydice_slice_index(bytes, (size_t)0U, uint8_t, uint8_t *) &
7801 (int16_t)255);
7802 int16_t r1 =
7803 ((int16_t)Eurydice_slice_index(bytes, (size_t)2U, uint8_t, uint8_t *) &
7804 (int16_t)15)
7805 << 6U |
7806 (int16_t)Eurydice_slice_index(bytes, (size_t)1U, uint8_t, uint8_t *) >>
7807 2U;
7808 int16_t r2 =
7809 ((int16_t)Eurydice_slice_index(bytes, (size_t)3U, uint8_t, uint8_t *) &
7810 (int16_t)63)
7811 << 4U |
7812 (int16_t)Eurydice_slice_index(bytes, (size_t)2U, uint8_t, uint8_t *) >>
7813 4U;
7814 int16_t r3 =
7815 (int16_t)Eurydice_slice_index(bytes, (size_t)4U, uint8_t, uint8_t *)
7816 << 2U |
7817 (int16_t)Eurydice_slice_index(bytes, (size_t)3U, uint8_t, uint8_t *) >>
7818 6U;
7819 int16_t r4 =
7820 ((int16_t)Eurydice_slice_index(bytes, (size_t)6U, uint8_t, uint8_t *) &
7821 (int16_t)3)
7822 << 8U |
7823 ((int16_t)Eurydice_slice_index(bytes, (size_t)5U, uint8_t, uint8_t *) &
7824 (int16_t)255);
7825 int16_t r5 =
7826 ((int16_t)Eurydice_slice_index(bytes, (size_t)7U, uint8_t, uint8_t *) &
7827 (int16_t)15)
7828 << 6U |
7829 (int16_t)Eurydice_slice_index(bytes, (size_t)6U, uint8_t, uint8_t *) >>
7830 2U;
7831 int16_t r6 =
7832 ((int16_t)Eurydice_slice_index(bytes, (size_t)8U, uint8_t, uint8_t *) &
7833 (int16_t)63)
7834 << 4U |
7835 (int16_t)Eurydice_slice_index(bytes, (size_t)7U, uint8_t, uint8_t *) >>
7836 4U;
7837 int16_t r7 =
7838 (int16_t)Eurydice_slice_index(bytes, (size_t)9U, uint8_t, uint8_t *)
7839 << 2U |
7840 (int16_t)Eurydice_slice_index(bytes, (size_t)8U, uint8_t, uint8_t *) >>
7841 6U;
7842 return (CLITERAL(int16_t_x8){.fst = r0,
7843 .snd = r1,
7844 .thd = r2,
7845 .f3 = r3,
7846 .f4 = r4,
7847 .f5 = r5,
7848 .f6 = r6,
7849 .f7 = r7});
7850 }
7851
7852 static KRML_MUSTINLINE libcrux_ml_kem_vector_portable_vector_type_PortableVector
libcrux_ml_kem_vector_portable_serialize_deserialize_10(Eurydice_slice bytes)7853 libcrux_ml_kem_vector_portable_serialize_deserialize_10(Eurydice_slice bytes) {
7854 int16_t_x8 v0_7 = libcrux_ml_kem_vector_portable_serialize_deserialize_10_int(
7855 Eurydice_slice_subslice2(bytes, (size_t)0U, (size_t)10U, uint8_t));
7856 int16_t_x8 v8_15 =
7857 libcrux_ml_kem_vector_portable_serialize_deserialize_10_int(
7858 Eurydice_slice_subslice2(bytes, (size_t)10U, (size_t)20U, uint8_t));
7859 libcrux_ml_kem_vector_portable_vector_type_PortableVector v =
7860 libcrux_ml_kem_vector_portable_vector_type_zero();
7861 v.elements[0U] = v0_7.fst;
7862 v.elements[1U] = v0_7.snd;
7863 v.elements[2U] = v0_7.thd;
7864 v.elements[3U] = v0_7.f3;
7865 v.elements[4U] = v0_7.f4;
7866 v.elements[5U] = v0_7.f5;
7867 v.elements[6U] = v0_7.f6;
7868 v.elements[7U] = v0_7.f7;
7869 v.elements[8U] = v8_15.fst;
7870 v.elements[9U] = v8_15.snd;
7871 v.elements[10U] = v8_15.thd;
7872 v.elements[11U] = v8_15.f3;
7873 v.elements[12U] = v8_15.f4;
7874 v.elements[13U] = v8_15.f5;
7875 v.elements[14U] = v8_15.f6;
7876 v.elements[15U] = v8_15.f7;
7877 return v;
7878 }
7879
7880 /**
7881 This function found in impl {(libcrux_ml_kem::vector::traits::Operations for
7882 libcrux_ml_kem::vector::portable::vector_type::PortableVector)}
7883 */
7884 static inline libcrux_ml_kem_vector_portable_vector_type_PortableVector
libcrux_ml_kem_vector_portable_deserialize_10_0d(Eurydice_slice a)7885 libcrux_ml_kem_vector_portable_deserialize_10_0d(Eurydice_slice a) {
7886 return libcrux_ml_kem_vector_portable_serialize_deserialize_10(a);
7887 }
7888
7889 typedef struct uint8_t_x3_s {
7890 uint8_t fst;
7891 uint8_t snd;
7892 uint8_t thd;
7893 } uint8_t_x3;
7894
7895 static KRML_MUSTINLINE uint8_t_x3
libcrux_ml_kem_vector_portable_serialize_serialize_12_int(Eurydice_slice v)7896 libcrux_ml_kem_vector_portable_serialize_serialize_12_int(Eurydice_slice v) {
7897 uint8_t r0 =
7898 (uint8_t)(Eurydice_slice_index(v, (size_t)0U, int16_t, int16_t *) &
7899 (int16_t)255);
7900 uint8_t r1 =
7901 (uint8_t)(Eurydice_slice_index(v, (size_t)0U, int16_t, int16_t *) >> 8U |
7902 (Eurydice_slice_index(v, (size_t)1U, int16_t, int16_t *) &
7903 (int16_t)15)
7904 << 4U);
7905 uint8_t r2 =
7906 (uint8_t)(Eurydice_slice_index(v, (size_t)1U, int16_t, int16_t *) >> 4U &
7907 (int16_t)255);
7908 return (CLITERAL(uint8_t_x3){.fst = r0, .snd = r1, .thd = r2});
7909 }
7910
7911 static KRML_MUSTINLINE void
libcrux_ml_kem_vector_portable_serialize_serialize_12(libcrux_ml_kem_vector_portable_vector_type_PortableVector v,uint8_t ret[24U])7912 libcrux_ml_kem_vector_portable_serialize_serialize_12(
7913 libcrux_ml_kem_vector_portable_vector_type_PortableVector v,
7914 uint8_t ret[24U]) {
7915 uint8_t_x3 r0_2 = libcrux_ml_kem_vector_portable_serialize_serialize_12_int(
7916 Eurydice_array_to_subslice2(v.elements, (size_t)0U, (size_t)2U, int16_t));
7917 uint8_t_x3 r3_5 = libcrux_ml_kem_vector_portable_serialize_serialize_12_int(
7918 Eurydice_array_to_subslice2(v.elements, (size_t)2U, (size_t)4U, int16_t));
7919 uint8_t_x3 r6_8 = libcrux_ml_kem_vector_portable_serialize_serialize_12_int(
7920 Eurydice_array_to_subslice2(v.elements, (size_t)4U, (size_t)6U, int16_t));
7921 uint8_t_x3 r9_11 = libcrux_ml_kem_vector_portable_serialize_serialize_12_int(
7922 Eurydice_array_to_subslice2(v.elements, (size_t)6U, (size_t)8U, int16_t));
7923 uint8_t_x3 r12_14 = libcrux_ml_kem_vector_portable_serialize_serialize_12_int(
7924 Eurydice_array_to_subslice2(v.elements, (size_t)8U, (size_t)10U,
7925 int16_t));
7926 uint8_t_x3 r15_17 = libcrux_ml_kem_vector_portable_serialize_serialize_12_int(
7927 Eurydice_array_to_subslice2(v.elements, (size_t)10U, (size_t)12U,
7928 int16_t));
7929 uint8_t_x3 r18_20 = libcrux_ml_kem_vector_portable_serialize_serialize_12_int(
7930 Eurydice_array_to_subslice2(v.elements, (size_t)12U, (size_t)14U,
7931 int16_t));
7932 uint8_t_x3 r21_23 = libcrux_ml_kem_vector_portable_serialize_serialize_12_int(
7933 Eurydice_array_to_subslice2(v.elements, (size_t)14U, (size_t)16U,
7934 int16_t));
7935 uint8_t result[24U] = {0U};
7936 result[0U] = r0_2.fst;
7937 result[1U] = r0_2.snd;
7938 result[2U] = r0_2.thd;
7939 result[3U] = r3_5.fst;
7940 result[4U] = r3_5.snd;
7941 result[5U] = r3_5.thd;
7942 result[6U] = r6_8.fst;
7943 result[7U] = r6_8.snd;
7944 result[8U] = r6_8.thd;
7945 result[9U] = r9_11.fst;
7946 result[10U] = r9_11.snd;
7947 result[11U] = r9_11.thd;
7948 result[12U] = r12_14.fst;
7949 result[13U] = r12_14.snd;
7950 result[14U] = r12_14.thd;
7951 result[15U] = r15_17.fst;
7952 result[16U] = r15_17.snd;
7953 result[17U] = r15_17.thd;
7954 result[18U] = r18_20.fst;
7955 result[19U] = r18_20.snd;
7956 result[20U] = r18_20.thd;
7957 result[21U] = r21_23.fst;
7958 result[22U] = r21_23.snd;
7959 result[23U] = r21_23.thd;
7960 memcpy(ret, result, (size_t)24U * sizeof(uint8_t));
7961 }
7962
7963 /**
7964 This function found in impl {(libcrux_ml_kem::vector::traits::Operations for
7965 libcrux_ml_kem::vector::portable::vector_type::PortableVector)}
7966 */
libcrux_ml_kem_vector_portable_serialize_12_0d(libcrux_ml_kem_vector_portable_vector_type_PortableVector a,uint8_t ret[24U])7967 static inline void libcrux_ml_kem_vector_portable_serialize_12_0d(
7968 libcrux_ml_kem_vector_portable_vector_type_PortableVector a,
7969 uint8_t ret[24U]) {
7970 libcrux_ml_kem_vector_portable_serialize_serialize_12(a, ret);
7971 }
7972
7973 typedef struct int16_t_x2_s {
7974 int16_t fst;
7975 int16_t snd;
7976 } int16_t_x2;
7977
7978 static KRML_MUSTINLINE int16_t_x2
libcrux_ml_kem_vector_portable_serialize_deserialize_12_int(Eurydice_slice bytes)7979 libcrux_ml_kem_vector_portable_serialize_deserialize_12_int(
7980 Eurydice_slice bytes) {
7981 int16_t byte0 =
7982 (int16_t)Eurydice_slice_index(bytes, (size_t)0U, uint8_t, uint8_t *);
7983 int16_t byte1 =
7984 (int16_t)Eurydice_slice_index(bytes, (size_t)1U, uint8_t, uint8_t *);
7985 int16_t byte2 =
7986 (int16_t)Eurydice_slice_index(bytes, (size_t)2U, uint8_t, uint8_t *);
7987 int16_t r0 = (byte1 & (int16_t)15) << 8U | (byte0 & (int16_t)255);
7988 int16_t r1 = byte2 << 4U | (byte1 >> 4U & (int16_t)15);
7989 return (CLITERAL(int16_t_x2){.fst = r0, .snd = r1});
7990 }
7991
7992 static KRML_MUSTINLINE libcrux_ml_kem_vector_portable_vector_type_PortableVector
libcrux_ml_kem_vector_portable_serialize_deserialize_12(Eurydice_slice bytes)7993 libcrux_ml_kem_vector_portable_serialize_deserialize_12(Eurydice_slice bytes) {
7994 int16_t_x2 v0_1 = libcrux_ml_kem_vector_portable_serialize_deserialize_12_int(
7995 Eurydice_slice_subslice2(bytes, (size_t)0U, (size_t)3U, uint8_t));
7996 int16_t_x2 v2_3 = libcrux_ml_kem_vector_portable_serialize_deserialize_12_int(
7997 Eurydice_slice_subslice2(bytes, (size_t)3U, (size_t)6U, uint8_t));
7998 int16_t_x2 v4_5 = libcrux_ml_kem_vector_portable_serialize_deserialize_12_int(
7999 Eurydice_slice_subslice2(bytes, (size_t)6U, (size_t)9U, uint8_t));
8000 int16_t_x2 v6_7 = libcrux_ml_kem_vector_portable_serialize_deserialize_12_int(
8001 Eurydice_slice_subslice2(bytes, (size_t)9U, (size_t)12U, uint8_t));
8002 int16_t_x2 v8_9 = libcrux_ml_kem_vector_portable_serialize_deserialize_12_int(
8003 Eurydice_slice_subslice2(bytes, (size_t)12U, (size_t)15U, uint8_t));
8004 int16_t_x2 v10_11 =
8005 libcrux_ml_kem_vector_portable_serialize_deserialize_12_int(
8006 Eurydice_slice_subslice2(bytes, (size_t)15U, (size_t)18U, uint8_t));
8007 int16_t_x2 v12_13 =
8008 libcrux_ml_kem_vector_portable_serialize_deserialize_12_int(
8009 Eurydice_slice_subslice2(bytes, (size_t)18U, (size_t)21U, uint8_t));
8010 int16_t_x2 v14_15 =
8011 libcrux_ml_kem_vector_portable_serialize_deserialize_12_int(
8012 Eurydice_slice_subslice2(bytes, (size_t)21U, (size_t)24U, uint8_t));
8013 libcrux_ml_kem_vector_portable_vector_type_PortableVector re =
8014 libcrux_ml_kem_vector_portable_vector_type_zero();
8015 re.elements[0U] = v0_1.fst;
8016 re.elements[1U] = v0_1.snd;
8017 re.elements[2U] = v2_3.fst;
8018 re.elements[3U] = v2_3.snd;
8019 re.elements[4U] = v4_5.fst;
8020 re.elements[5U] = v4_5.snd;
8021 re.elements[6U] = v6_7.fst;
8022 re.elements[7U] = v6_7.snd;
8023 re.elements[8U] = v8_9.fst;
8024 re.elements[9U] = v8_9.snd;
8025 re.elements[10U] = v10_11.fst;
8026 re.elements[11U] = v10_11.snd;
8027 re.elements[12U] = v12_13.fst;
8028 re.elements[13U] = v12_13.snd;
8029 re.elements[14U] = v14_15.fst;
8030 re.elements[15U] = v14_15.snd;
8031 return re;
8032 }
8033
8034 /**
8035 This function found in impl {(libcrux_ml_kem::vector::traits::Operations for
8036 libcrux_ml_kem::vector::portable::vector_type::PortableVector)}
8037 */
8038 static inline libcrux_ml_kem_vector_portable_vector_type_PortableVector
libcrux_ml_kem_vector_portable_deserialize_12_0d(Eurydice_slice a)8039 libcrux_ml_kem_vector_portable_deserialize_12_0d(Eurydice_slice a) {
8040 return libcrux_ml_kem_vector_portable_serialize_deserialize_12(a);
8041 }
8042
8043 static KRML_MUSTINLINE size_t
libcrux_ml_kem_vector_portable_sampling_rej_sample(Eurydice_slice a,Eurydice_slice result)8044 libcrux_ml_kem_vector_portable_sampling_rej_sample(Eurydice_slice a,
8045 Eurydice_slice result) {
8046 size_t sampled = (size_t)0U;
8047 for (size_t i = (size_t)0U; i < Eurydice_slice_len(a, uint8_t) / (size_t)3U;
8048 i++) {
8049 size_t i0 = i;
8050 int16_t b1 = (int16_t)Eurydice_slice_index(a, i0 * (size_t)3U + (size_t)0U,
8051 uint8_t, uint8_t *);
8052 int16_t b2 = (int16_t)Eurydice_slice_index(a, i0 * (size_t)3U + (size_t)1U,
8053 uint8_t, uint8_t *);
8054 int16_t b3 = (int16_t)Eurydice_slice_index(a, i0 * (size_t)3U + (size_t)2U,
8055 uint8_t, uint8_t *);
8056 int16_t d1 = (b2 & (int16_t)15) << 8U | b1;
8057 int16_t d2 = b3 << 4U | b2 >> 4U;
8058 bool uu____0;
8059 int16_t uu____1;
8060 bool uu____2;
8061 size_t uu____3;
8062 int16_t uu____4;
8063 size_t uu____5;
8064 int16_t uu____6;
8065 if (d1 < LIBCRUX_ML_KEM_VECTOR_TRAITS_FIELD_MODULUS) {
8066 if (sampled < (size_t)16U) {
8067 Eurydice_slice_index(result, sampled, int16_t, int16_t *) = d1;
8068 sampled++;
8069 uu____1 = d2;
8070 uu____6 = LIBCRUX_ML_KEM_VECTOR_TRAITS_FIELD_MODULUS;
8071 uu____0 = uu____1 < uu____6;
8072 if (uu____0) {
8073 uu____3 = sampled;
8074 uu____2 = uu____3 < (size_t)16U;
8075 if (uu____2) {
8076 uu____4 = d2;
8077 uu____5 = sampled;
8078 Eurydice_slice_index(result, uu____5, int16_t, int16_t *) = uu____4;
8079 sampled++;
8080 continue;
8081 }
8082 }
8083 continue;
8084 }
8085 }
8086 uu____1 = d2;
8087 uu____6 = LIBCRUX_ML_KEM_VECTOR_TRAITS_FIELD_MODULUS;
8088 uu____0 = uu____1 < uu____6;
8089 if (uu____0) {
8090 uu____3 = sampled;
8091 uu____2 = uu____3 < (size_t)16U;
8092 if (uu____2) {
8093 uu____4 = d2;
8094 uu____5 = sampled;
8095 Eurydice_slice_index(result, uu____5, int16_t, int16_t *) = uu____4;
8096 sampled++;
8097 continue;
8098 }
8099 }
8100 }
8101 return sampled;
8102 }
8103
8104 /**
8105 This function found in impl {(libcrux_ml_kem::vector::traits::Operations for
8106 libcrux_ml_kem::vector::portable::vector_type::PortableVector)}
8107 */
libcrux_ml_kem_vector_portable_rej_sample_0d(Eurydice_slice a,Eurydice_slice out)8108 static inline size_t libcrux_ml_kem_vector_portable_rej_sample_0d(
8109 Eurydice_slice a, Eurydice_slice out) {
8110 return libcrux_ml_kem_vector_portable_sampling_rej_sample(a, out);
8111 }
8112
8113 #define LIBCRUX_ML_KEM_MLKEM768_VECTOR_U_COMPRESSION_FACTOR_768 ((size_t)10U)
8114
8115 #define LIBCRUX_ML_KEM_MLKEM768_C1_BLOCK_SIZE_768 \
8116 (LIBCRUX_ML_KEM_CONSTANTS_COEFFICIENTS_IN_RING_ELEMENT * \
8117 LIBCRUX_ML_KEM_MLKEM768_VECTOR_U_COMPRESSION_FACTOR_768 / (size_t)8U)
8118
8119 #define LIBCRUX_ML_KEM_MLKEM768_RANK_768 ((size_t)3U)
8120
8121 #define LIBCRUX_ML_KEM_MLKEM768_C1_SIZE_768 \
8122 (LIBCRUX_ML_KEM_MLKEM768_C1_BLOCK_SIZE_768 * LIBCRUX_ML_KEM_MLKEM768_RANK_768)
8123
8124 #define LIBCRUX_ML_KEM_MLKEM768_VECTOR_V_COMPRESSION_FACTOR_768 ((size_t)4U)
8125
8126 #define LIBCRUX_ML_KEM_MLKEM768_C2_SIZE_768 \
8127 (LIBCRUX_ML_KEM_CONSTANTS_COEFFICIENTS_IN_RING_ELEMENT * \
8128 LIBCRUX_ML_KEM_MLKEM768_VECTOR_V_COMPRESSION_FACTOR_768 / (size_t)8U)
8129
8130 #define LIBCRUX_ML_KEM_MLKEM768_CPA_PKE_CIPHERTEXT_SIZE_768 \
8131 (LIBCRUX_ML_KEM_MLKEM768_C1_SIZE_768 + LIBCRUX_ML_KEM_MLKEM768_C2_SIZE_768)
8132
8133 #define LIBCRUX_ML_KEM_MLKEM768_T_AS_NTT_ENCODED_SIZE_768 \
8134 (LIBCRUX_ML_KEM_MLKEM768_RANK_768 * \
8135 LIBCRUX_ML_KEM_CONSTANTS_COEFFICIENTS_IN_RING_ELEMENT * \
8136 LIBCRUX_ML_KEM_CONSTANTS_BITS_PER_COEFFICIENT / (size_t)8U)
8137
8138 #define LIBCRUX_ML_KEM_MLKEM768_CPA_PKE_PUBLIC_KEY_SIZE_768 \
8139 (LIBCRUX_ML_KEM_MLKEM768_T_AS_NTT_ENCODED_SIZE_768 + (size_t)32U)
8140
8141 #define LIBCRUX_ML_KEM_MLKEM768_CPA_PKE_SECRET_KEY_SIZE_768 \
8142 (LIBCRUX_ML_KEM_MLKEM768_RANK_768 * \
8143 LIBCRUX_ML_KEM_CONSTANTS_COEFFICIENTS_IN_RING_ELEMENT * \
8144 LIBCRUX_ML_KEM_CONSTANTS_BITS_PER_COEFFICIENT / (size_t)8U)
8145
8146 #define LIBCRUX_ML_KEM_MLKEM768_ETA1 ((size_t)2U)
8147
8148 #define LIBCRUX_ML_KEM_MLKEM768_ETA1_RANDOMNESS_SIZE \
8149 (LIBCRUX_ML_KEM_MLKEM768_ETA1 * (size_t)64U)
8150
8151 #define LIBCRUX_ML_KEM_MLKEM768_ETA2 ((size_t)2U)
8152
8153 #define LIBCRUX_ML_KEM_MLKEM768_ETA2_RANDOMNESS_SIZE \
8154 (LIBCRUX_ML_KEM_MLKEM768_ETA2 * (size_t)64U)
8155
8156 #define LIBCRUX_ML_KEM_MLKEM768_IMPLICIT_REJECTION_HASH_INPUT_SIZE \
8157 (LIBCRUX_ML_KEM_CONSTANTS_SHARED_SECRET_SIZE + \
8158 LIBCRUX_ML_KEM_MLKEM768_CPA_PKE_CIPHERTEXT_SIZE_768)
8159
8160 typedef libcrux_ml_kem_types_MlKemPrivateKey_55
8161 libcrux_ml_kem_mlkem768_MlKem768PrivateKey;
8162
8163 typedef libcrux_ml_kem_types_MlKemPublicKey_15
8164 libcrux_ml_kem_mlkem768_MlKem768PublicKey;
8165
8166 #define LIBCRUX_ML_KEM_MLKEM768_RANKED_BYTES_PER_RING_ELEMENT_768 \
8167 (LIBCRUX_ML_KEM_MLKEM768_RANK_768 * \
8168 LIBCRUX_ML_KEM_CONSTANTS_BITS_PER_RING_ELEMENT / (size_t)8U)
8169
8170 #define LIBCRUX_ML_KEM_MLKEM768_SECRET_KEY_SIZE_768 \
8171 (LIBCRUX_ML_KEM_MLKEM768_CPA_PKE_SECRET_KEY_SIZE_768 + \
8172 LIBCRUX_ML_KEM_MLKEM768_CPA_PKE_PUBLIC_KEY_SIZE_768 + \
8173 LIBCRUX_ML_KEM_CONSTANTS_H_DIGEST_SIZE + \
8174 LIBCRUX_ML_KEM_CONSTANTS_SHARED_SECRET_SIZE)
8175
8176 /**
8177 A monomorphic instance of libcrux_ml_kem.polynomial.PolynomialRingElement
8178 with types libcrux_ml_kem_vector_portable_vector_type_PortableVector
8179
8180 */
8181 typedef struct libcrux_ml_kem_polynomial_PolynomialRingElement_f0_s {
8182 libcrux_ml_kem_vector_portable_vector_type_PortableVector coefficients[16U];
8183 } libcrux_ml_kem_polynomial_PolynomialRingElement_f0;
8184
8185 /**
8186 This function found in impl
8187 {libcrux_ml_kem::polynomial::PolynomialRingElement<Vector>[TraitClause@0]}
8188 */
8189 /**
8190 A monomorphic instance of libcrux_ml_kem.polynomial.ZERO_89
8191 with types libcrux_ml_kem_vector_portable_vector_type_PortableVector
8192 with const generics
8193
8194 */
8195 static inline libcrux_ml_kem_polynomial_PolynomialRingElement_f0
libcrux_ml_kem_polynomial_ZERO_89_ea(void)8196 libcrux_ml_kem_polynomial_ZERO_89_ea(void) {
8197 libcrux_ml_kem_polynomial_PolynomialRingElement_f0 lit;
8198 lit.coefficients[0U] = libcrux_ml_kem_vector_portable_ZERO_0d();
8199 lit.coefficients[1U] = libcrux_ml_kem_vector_portable_ZERO_0d();
8200 lit.coefficients[2U] = libcrux_ml_kem_vector_portable_ZERO_0d();
8201 lit.coefficients[3U] = libcrux_ml_kem_vector_portable_ZERO_0d();
8202 lit.coefficients[4U] = libcrux_ml_kem_vector_portable_ZERO_0d();
8203 lit.coefficients[5U] = libcrux_ml_kem_vector_portable_ZERO_0d();
8204 lit.coefficients[6U] = libcrux_ml_kem_vector_portable_ZERO_0d();
8205 lit.coefficients[7U] = libcrux_ml_kem_vector_portable_ZERO_0d();
8206 lit.coefficients[8U] = libcrux_ml_kem_vector_portable_ZERO_0d();
8207 lit.coefficients[9U] = libcrux_ml_kem_vector_portable_ZERO_0d();
8208 lit.coefficients[10U] = libcrux_ml_kem_vector_portable_ZERO_0d();
8209 lit.coefficients[11U] = libcrux_ml_kem_vector_portable_ZERO_0d();
8210 lit.coefficients[12U] = libcrux_ml_kem_vector_portable_ZERO_0d();
8211 lit.coefficients[13U] = libcrux_ml_kem_vector_portable_ZERO_0d();
8212 lit.coefficients[14U] = libcrux_ml_kem_vector_portable_ZERO_0d();
8213 lit.coefficients[15U] = libcrux_ml_kem_vector_portable_ZERO_0d();
8214 return lit;
8215 }
8216
8217 /**
8218 A monomorphic instance of libcrux_ml_kem.ind_cpa.deserialize_secret_key.closure
8219 with types libcrux_ml_kem_vector_portable_vector_type_PortableVector
8220 with const generics
8221 - K= 3
8222 */
8223 static inline libcrux_ml_kem_polynomial_PolynomialRingElement_f0
libcrux_ml_kem_ind_cpa_deserialize_secret_key_closure_6b(size_t _)8224 libcrux_ml_kem_ind_cpa_deserialize_secret_key_closure_6b(size_t _) {
8225 return libcrux_ml_kem_polynomial_ZERO_89_ea();
8226 }
8227
8228 /**
8229 A monomorphic instance of
8230 libcrux_ml_kem.serialize.deserialize_to_uncompressed_ring_element with types
8231 libcrux_ml_kem_vector_portable_vector_type_PortableVector with const generics
8232
8233 */
8234 static KRML_MUSTINLINE libcrux_ml_kem_polynomial_PolynomialRingElement_f0
libcrux_ml_kem_serialize_deserialize_to_uncompressed_ring_element_af(Eurydice_slice serialized)8235 libcrux_ml_kem_serialize_deserialize_to_uncompressed_ring_element_af(
8236 Eurydice_slice serialized) {
8237 libcrux_ml_kem_polynomial_PolynomialRingElement_f0 re =
8238 libcrux_ml_kem_polynomial_ZERO_89_ea();
8239 for (size_t i = (size_t)0U;
8240 i < Eurydice_slice_len(serialized, uint8_t) / (size_t)24U; i++) {
8241 size_t i0 = i;
8242 Eurydice_slice bytes = Eurydice_slice_subslice2(
8243 serialized, i0 * (size_t)24U, i0 * (size_t)24U + (size_t)24U, uint8_t);
8244 libcrux_ml_kem_vector_portable_vector_type_PortableVector uu____0 =
8245 libcrux_ml_kem_vector_portable_deserialize_12_0d(bytes);
8246 re.coefficients[i0] = uu____0;
8247 }
8248 return re;
8249 }
8250
8251 /**
8252 Call [`deserialize_to_uncompressed_ring_element`] for each ring element.
8253 */
8254 /**
8255 A monomorphic instance of libcrux_ml_kem.ind_cpa.deserialize_secret_key
8256 with types libcrux_ml_kem_vector_portable_vector_type_PortableVector
8257 with const generics
8258 - K= 3
8259 */
libcrux_ml_kem_ind_cpa_deserialize_secret_key_24(Eurydice_slice secret_key,libcrux_ml_kem_polynomial_PolynomialRingElement_f0 ret[3U])8260 static KRML_MUSTINLINE void libcrux_ml_kem_ind_cpa_deserialize_secret_key_24(
8261 Eurydice_slice secret_key,
8262 libcrux_ml_kem_polynomial_PolynomialRingElement_f0 ret[3U]) {
8263 libcrux_ml_kem_polynomial_PolynomialRingElement_f0 secret_as_ntt[3U];
8264 for (size_t i = (size_t)0U; i < (size_t)3U; i++) {
8265 secret_as_ntt[i] = libcrux_ml_kem_polynomial_ZERO_89_ea();
8266 }
8267 for (size_t i = (size_t)0U;
8268 i < Eurydice_slice_len(secret_key, uint8_t) /
8269 LIBCRUX_ML_KEM_CONSTANTS_BYTES_PER_RING_ELEMENT;
8270 i++) {
8271 size_t i0 = i;
8272 Eurydice_slice secret_bytes = Eurydice_slice_subslice2(
8273 secret_key, i0 * LIBCRUX_ML_KEM_CONSTANTS_BYTES_PER_RING_ELEMENT,
8274 i0 * LIBCRUX_ML_KEM_CONSTANTS_BYTES_PER_RING_ELEMENT +
8275 LIBCRUX_ML_KEM_CONSTANTS_BYTES_PER_RING_ELEMENT,
8276 uint8_t);
8277 libcrux_ml_kem_polynomial_PolynomialRingElement_f0 uu____0 =
8278 libcrux_ml_kem_serialize_deserialize_to_uncompressed_ring_element_af(
8279 secret_bytes);
8280 secret_as_ntt[i0] = uu____0;
8281 }
8282 memcpy(
8283 ret, secret_as_ntt,
8284 (size_t)3U * sizeof(libcrux_ml_kem_polynomial_PolynomialRingElement_f0));
8285 }
8286
8287 /**
8288 A monomorphic instance of
8289 libcrux_ml_kem.ind_cpa.unpacked.IndCpaPrivateKeyUnpacked with types
8290 libcrux_ml_kem_vector_portable_vector_type_PortableVector with const generics
8291 - $3size_t
8292 */
8293 typedef struct libcrux_ml_kem_ind_cpa_unpacked_IndCpaPrivateKeyUnpacked_f8_s {
8294 libcrux_ml_kem_polynomial_PolynomialRingElement_f0 secret_as_ntt[3U];
8295 } libcrux_ml_kem_ind_cpa_unpacked_IndCpaPrivateKeyUnpacked_f8;
8296
8297 /**
8298 A monomorphic instance of
8299 libcrux_ml_kem.ind_cpa.deserialize_then_decompress_u.closure with types
8300 libcrux_ml_kem_vector_portable_vector_type_PortableVector with const generics
8301 - K= 3
8302 - CIPHERTEXT_SIZE= 1088
8303 - U_COMPRESSION_FACTOR= 10
8304 */
8305 static inline libcrux_ml_kem_polynomial_PolynomialRingElement_f0
libcrux_ml_kem_ind_cpa_deserialize_then_decompress_u_closure_7c(size_t _)8306 libcrux_ml_kem_ind_cpa_deserialize_then_decompress_u_closure_7c(size_t _) {
8307 return libcrux_ml_kem_polynomial_ZERO_89_ea();
8308 }
8309
8310 /**
8311 A monomorphic instance of
8312 libcrux_ml_kem.vector.portable.compress.decompress_ciphertext_coefficient with
8313 const generics
8314 - COEFFICIENT_BITS= 10
8315 */
8316 static KRML_MUSTINLINE libcrux_ml_kem_vector_portable_vector_type_PortableVector
libcrux_ml_kem_vector_portable_compress_decompress_ciphertext_coefficient_6b(libcrux_ml_kem_vector_portable_vector_type_PortableVector v)8317 libcrux_ml_kem_vector_portable_compress_decompress_ciphertext_coefficient_6b(
8318 libcrux_ml_kem_vector_portable_vector_type_PortableVector v) {
8319 for (size_t i = (size_t)0U;
8320 i < LIBCRUX_ML_KEM_VECTOR_TRAITS_FIELD_ELEMENTS_IN_VECTOR; i++) {
8321 size_t i0 = i;
8322 int32_t decompressed = (int32_t)v.elements[i0] *
8323 (int32_t)LIBCRUX_ML_KEM_VECTOR_TRAITS_FIELD_MODULUS;
8324 decompressed = (decompressed << 1U) + ((int32_t)1 << (uint32_t)(int32_t)10);
8325 decompressed = decompressed >> (uint32_t)((int32_t)10 + (int32_t)1);
8326 v.elements[i0] = (int16_t)decompressed;
8327 }
8328 return v;
8329 }
8330
8331 /**
8332 This function found in impl {(libcrux_ml_kem::vector::traits::Operations for
8333 libcrux_ml_kem::vector::portable::vector_type::PortableVector)}
8334 */
8335 /**
8336 A monomorphic instance of
8337 libcrux_ml_kem.vector.portable.decompress_ciphertext_coefficient_0d with const
8338 generics
8339 - COEFFICIENT_BITS= 10
8340 */
8341 static inline libcrux_ml_kem_vector_portable_vector_type_PortableVector
libcrux_ml_kem_vector_portable_decompress_ciphertext_coefficient_0d_5a(libcrux_ml_kem_vector_portable_vector_type_PortableVector v)8342 libcrux_ml_kem_vector_portable_decompress_ciphertext_coefficient_0d_5a(
8343 libcrux_ml_kem_vector_portable_vector_type_PortableVector v) {
8344 return libcrux_ml_kem_vector_portable_compress_decompress_ciphertext_coefficient_6b(
8345 v);
8346 }
8347
8348 /**
8349 A monomorphic instance of
8350 libcrux_ml_kem.serialize.deserialize_then_decompress_10 with types
8351 libcrux_ml_kem_vector_portable_vector_type_PortableVector with const generics
8352
8353 */
8354 static KRML_MUSTINLINE libcrux_ml_kem_polynomial_PolynomialRingElement_f0
libcrux_ml_kem_serialize_deserialize_then_decompress_10_2c(Eurydice_slice serialized)8355 libcrux_ml_kem_serialize_deserialize_then_decompress_10_2c(
8356 Eurydice_slice serialized) {
8357 libcrux_ml_kem_polynomial_PolynomialRingElement_f0 re =
8358 libcrux_ml_kem_polynomial_ZERO_89_ea();
8359 for (size_t i = (size_t)0U;
8360 i < Eurydice_slice_len(serialized, uint8_t) / (size_t)20U; i++) {
8361 size_t i0 = i;
8362 Eurydice_slice bytes = Eurydice_slice_subslice2(
8363 serialized, i0 * (size_t)20U, i0 * (size_t)20U + (size_t)20U, uint8_t);
8364 libcrux_ml_kem_vector_portable_vector_type_PortableVector coefficient =
8365 libcrux_ml_kem_vector_portable_deserialize_10_0d(bytes);
8366 libcrux_ml_kem_vector_portable_vector_type_PortableVector uu____0 =
8367 libcrux_ml_kem_vector_portable_decompress_ciphertext_coefficient_0d_5a(
8368 coefficient);
8369 re.coefficients[i0] = uu____0;
8370 }
8371 return re;
8372 }
8373
8374 /**
8375 A monomorphic instance of
8376 libcrux_ml_kem.vector.portable.compress.decompress_ciphertext_coefficient with
8377 const generics
8378 - COEFFICIENT_BITS= 11
8379 */
8380 static KRML_MUSTINLINE libcrux_ml_kem_vector_portable_vector_type_PortableVector
libcrux_ml_kem_vector_portable_compress_decompress_ciphertext_coefficient_6b0(libcrux_ml_kem_vector_portable_vector_type_PortableVector v)8381 libcrux_ml_kem_vector_portable_compress_decompress_ciphertext_coefficient_6b0(
8382 libcrux_ml_kem_vector_portable_vector_type_PortableVector v) {
8383 for (size_t i = (size_t)0U;
8384 i < LIBCRUX_ML_KEM_VECTOR_TRAITS_FIELD_ELEMENTS_IN_VECTOR; i++) {
8385 size_t i0 = i;
8386 int32_t decompressed = (int32_t)v.elements[i0] *
8387 (int32_t)LIBCRUX_ML_KEM_VECTOR_TRAITS_FIELD_MODULUS;
8388 decompressed = (decompressed << 1U) + ((int32_t)1 << (uint32_t)(int32_t)11);
8389 decompressed = decompressed >> (uint32_t)((int32_t)11 + (int32_t)1);
8390 v.elements[i0] = (int16_t)decompressed;
8391 }
8392 return v;
8393 }
8394
8395 /**
8396 This function found in impl {(libcrux_ml_kem::vector::traits::Operations for
8397 libcrux_ml_kem::vector::portable::vector_type::PortableVector)}
8398 */
8399 /**
8400 A monomorphic instance of
8401 libcrux_ml_kem.vector.portable.decompress_ciphertext_coefficient_0d with const
8402 generics
8403 - COEFFICIENT_BITS= 11
8404 */
8405 static inline libcrux_ml_kem_vector_portable_vector_type_PortableVector
libcrux_ml_kem_vector_portable_decompress_ciphertext_coefficient_0d_5a0(libcrux_ml_kem_vector_portable_vector_type_PortableVector v)8406 libcrux_ml_kem_vector_portable_decompress_ciphertext_coefficient_0d_5a0(
8407 libcrux_ml_kem_vector_portable_vector_type_PortableVector v) {
8408 return libcrux_ml_kem_vector_portable_compress_decompress_ciphertext_coefficient_6b0(
8409 v);
8410 }
8411
8412 /**
8413 A monomorphic instance of
8414 libcrux_ml_kem.serialize.deserialize_then_decompress_11 with types
8415 libcrux_ml_kem_vector_portable_vector_type_PortableVector with const generics
8416
8417 */
8418 static KRML_MUSTINLINE libcrux_ml_kem_polynomial_PolynomialRingElement_f0
libcrux_ml_kem_serialize_deserialize_then_decompress_11_8d(Eurydice_slice serialized)8419 libcrux_ml_kem_serialize_deserialize_then_decompress_11_8d(
8420 Eurydice_slice serialized) {
8421 libcrux_ml_kem_polynomial_PolynomialRingElement_f0 re =
8422 libcrux_ml_kem_polynomial_ZERO_89_ea();
8423 for (size_t i = (size_t)0U;
8424 i < Eurydice_slice_len(serialized, uint8_t) / (size_t)22U; i++) {
8425 size_t i0 = i;
8426 Eurydice_slice bytes = Eurydice_slice_subslice2(
8427 serialized, i0 * (size_t)22U, i0 * (size_t)22U + (size_t)22U, uint8_t);
8428 libcrux_ml_kem_vector_portable_vector_type_PortableVector coefficient =
8429 libcrux_ml_kem_vector_portable_deserialize_11_0d(bytes);
8430 libcrux_ml_kem_vector_portable_vector_type_PortableVector uu____0 =
8431 libcrux_ml_kem_vector_portable_decompress_ciphertext_coefficient_0d_5a0(
8432 coefficient);
8433 re.coefficients[i0] = uu____0;
8434 }
8435 return re;
8436 }
8437
8438 /**
8439 A monomorphic instance of
8440 libcrux_ml_kem.serialize.deserialize_then_decompress_ring_element_u with types
8441 libcrux_ml_kem_vector_portable_vector_type_PortableVector with const generics
8442 - COMPRESSION_FACTOR= 10
8443 */
8444 static KRML_MUSTINLINE libcrux_ml_kem_polynomial_PolynomialRingElement_f0
libcrux_ml_kem_serialize_deserialize_then_decompress_ring_element_u_34(Eurydice_slice serialized)8445 libcrux_ml_kem_serialize_deserialize_then_decompress_ring_element_u_34(
8446 Eurydice_slice serialized) {
8447 return libcrux_ml_kem_serialize_deserialize_then_decompress_10_2c(serialized);
8448 }
8449
8450 typedef struct libcrux_ml_kem_vector_portable_vector_type_PortableVector_x2_s {
8451 libcrux_ml_kem_vector_portable_vector_type_PortableVector fst;
8452 libcrux_ml_kem_vector_portable_vector_type_PortableVector snd;
8453 } libcrux_ml_kem_vector_portable_vector_type_PortableVector_x2;
8454
8455 /**
8456 A monomorphic instance of libcrux_ml_kem.vector.traits.montgomery_multiply_fe
8457 with types libcrux_ml_kem_vector_portable_vector_type_PortableVector
8458 with const generics
8459
8460 */
8461 static inline libcrux_ml_kem_vector_portable_vector_type_PortableVector
libcrux_ml_kem_vector_traits_montgomery_multiply_fe_67(libcrux_ml_kem_vector_portable_vector_type_PortableVector v,int16_t fer)8462 libcrux_ml_kem_vector_traits_montgomery_multiply_fe_67(
8463 libcrux_ml_kem_vector_portable_vector_type_PortableVector v, int16_t fer) {
8464 return libcrux_ml_kem_vector_portable_montgomery_multiply_by_constant_0d(v,
8465 fer);
8466 }
8467
8468 /**
8469 A monomorphic instance of libcrux_ml_kem.ntt.ntt_layer_int_vec_step
8470 with types libcrux_ml_kem_vector_portable_vector_type_PortableVector
8471 with const generics
8472
8473 */
8474 static KRML_MUSTINLINE
8475 libcrux_ml_kem_vector_portable_vector_type_PortableVector_x2
libcrux_ml_kem_ntt_ntt_layer_int_vec_step_0c(libcrux_ml_kem_vector_portable_vector_type_PortableVector a,libcrux_ml_kem_vector_portable_vector_type_PortableVector b,int16_t zeta_r)8476 libcrux_ml_kem_ntt_ntt_layer_int_vec_step_0c(
8477 libcrux_ml_kem_vector_portable_vector_type_PortableVector a,
8478 libcrux_ml_kem_vector_portable_vector_type_PortableVector b,
8479 int16_t zeta_r) {
8480 libcrux_ml_kem_vector_portable_vector_type_PortableVector t =
8481 libcrux_ml_kem_vector_traits_montgomery_multiply_fe_67(b, zeta_r);
8482 b = libcrux_ml_kem_vector_portable_sub_0d(a, &t);
8483 a = libcrux_ml_kem_vector_portable_add_0d(a, &t);
8484 return (
8485 CLITERAL(libcrux_ml_kem_vector_portable_vector_type_PortableVector_x2){
8486 .fst = a, .snd = b});
8487 }
8488
8489 /**
8490 A monomorphic instance of libcrux_ml_kem.ntt.ntt_at_layer_4_plus
8491 with types libcrux_ml_kem_vector_portable_vector_type_PortableVector
8492 with const generics
8493
8494 */
libcrux_ml_kem_ntt_ntt_at_layer_4_plus_51(size_t * zeta_i,libcrux_ml_kem_polynomial_PolynomialRingElement_f0 * re,size_t layer,size_t _initial_coefficient_bound)8495 static KRML_MUSTINLINE void libcrux_ml_kem_ntt_ntt_at_layer_4_plus_51(
8496 size_t *zeta_i, libcrux_ml_kem_polynomial_PolynomialRingElement_f0 *re,
8497 size_t layer, size_t _initial_coefficient_bound) {
8498 size_t step = (size_t)1U << (uint32_t)layer;
8499 for (size_t i0 = (size_t)0U; i0 < (size_t)128U >> (uint32_t)layer; i0++) {
8500 size_t round = i0;
8501 zeta_i[0U] = zeta_i[0U] + (size_t)1U;
8502 size_t offset = round * step * (size_t)2U;
8503 size_t offset_vec = offset / (size_t)16U;
8504 size_t step_vec = step / (size_t)16U;
8505 for (size_t i = offset_vec; i < offset_vec + step_vec; i++) {
8506 size_t j = i;
8507 libcrux_ml_kem_vector_portable_vector_type_PortableVector_x2 uu____0 =
8508 libcrux_ml_kem_ntt_ntt_layer_int_vec_step_0c(
8509 re->coefficients[j], re->coefficients[j + step_vec],
8510 libcrux_ml_kem_polynomial_ZETAS_TIMES_MONTGOMERY_R[zeta_i[0U]]);
8511 libcrux_ml_kem_vector_portable_vector_type_PortableVector x = uu____0.fst;
8512 libcrux_ml_kem_vector_portable_vector_type_PortableVector y = uu____0.snd;
8513 re->coefficients[j] = x;
8514 re->coefficients[j + step_vec] = y;
8515 }
8516 }
8517 }
8518
8519 /**
8520 A monomorphic instance of libcrux_ml_kem.ntt.ntt_at_layer_3
8521 with types libcrux_ml_kem_vector_portable_vector_type_PortableVector
8522 with const generics
8523
8524 */
libcrux_ml_kem_ntt_ntt_at_layer_3_fd(size_t * zeta_i,libcrux_ml_kem_polynomial_PolynomialRingElement_f0 * re,size_t _layer,size_t _initial_coefficient_bound)8525 static KRML_MUSTINLINE void libcrux_ml_kem_ntt_ntt_at_layer_3_fd(
8526 size_t *zeta_i, libcrux_ml_kem_polynomial_PolynomialRingElement_f0 *re,
8527 size_t _layer, size_t _initial_coefficient_bound) {
8528 for (size_t i = (size_t)0U; i < (size_t)16U; i++) {
8529 size_t round = i;
8530 zeta_i[0U] = zeta_i[0U] + (size_t)1U;
8531 libcrux_ml_kem_vector_portable_vector_type_PortableVector uu____0 =
8532 libcrux_ml_kem_vector_portable_ntt_layer_3_step_0d(
8533 re->coefficients[round],
8534 libcrux_ml_kem_polynomial_ZETAS_TIMES_MONTGOMERY_R[zeta_i[0U]]);
8535 re->coefficients[round] = uu____0;
8536 }
8537 }
8538
8539 /**
8540 A monomorphic instance of libcrux_ml_kem.ntt.ntt_at_layer_2
8541 with types libcrux_ml_kem_vector_portable_vector_type_PortableVector
8542 with const generics
8543
8544 */
libcrux_ml_kem_ntt_ntt_at_layer_2_ad(size_t * zeta_i,libcrux_ml_kem_polynomial_PolynomialRingElement_f0 * re,size_t _layer,size_t _initial_coefficient_bound)8545 static KRML_MUSTINLINE void libcrux_ml_kem_ntt_ntt_at_layer_2_ad(
8546 size_t *zeta_i, libcrux_ml_kem_polynomial_PolynomialRingElement_f0 *re,
8547 size_t _layer, size_t _initial_coefficient_bound) {
8548 for (size_t i = (size_t)0U; i < (size_t)16U; i++) {
8549 size_t round = i;
8550 zeta_i[0U] = zeta_i[0U] + (size_t)1U;
8551 re->coefficients[round] =
8552 libcrux_ml_kem_vector_portable_ntt_layer_2_step_0d(
8553 re->coefficients[round],
8554 libcrux_ml_kem_polynomial_ZETAS_TIMES_MONTGOMERY_R[zeta_i[0U]],
8555 libcrux_ml_kem_polynomial_ZETAS_TIMES_MONTGOMERY_R[zeta_i[0U] +
8556 (size_t)1U]);
8557 zeta_i[0U] = zeta_i[0U] + (size_t)1U;
8558 }
8559 }
8560
8561 /**
8562 A monomorphic instance of libcrux_ml_kem.ntt.ntt_at_layer_1
8563 with types libcrux_ml_kem_vector_portable_vector_type_PortableVector
8564 with const generics
8565
8566 */
libcrux_ml_kem_ntt_ntt_at_layer_1_a2(size_t * zeta_i,libcrux_ml_kem_polynomial_PolynomialRingElement_f0 * re,size_t _layer,size_t _initial_coefficient_bound)8567 static KRML_MUSTINLINE void libcrux_ml_kem_ntt_ntt_at_layer_1_a2(
8568 size_t *zeta_i, libcrux_ml_kem_polynomial_PolynomialRingElement_f0 *re,
8569 size_t _layer, size_t _initial_coefficient_bound) {
8570 for (size_t i = (size_t)0U; i < (size_t)16U; i++) {
8571 size_t round = i;
8572 zeta_i[0U] = zeta_i[0U] + (size_t)1U;
8573 re->coefficients[round] =
8574 libcrux_ml_kem_vector_portable_ntt_layer_1_step_0d(
8575 re->coefficients[round],
8576 libcrux_ml_kem_polynomial_ZETAS_TIMES_MONTGOMERY_R[zeta_i[0U]],
8577 libcrux_ml_kem_polynomial_ZETAS_TIMES_MONTGOMERY_R[zeta_i[0U] +
8578 (size_t)1U],
8579 libcrux_ml_kem_polynomial_ZETAS_TIMES_MONTGOMERY_R[zeta_i[0U] +
8580 (size_t)2U],
8581 libcrux_ml_kem_polynomial_ZETAS_TIMES_MONTGOMERY_R[zeta_i[0U] +
8582 (size_t)3U]);
8583 zeta_i[0U] = zeta_i[0U] + (size_t)3U;
8584 }
8585 }
8586
8587 /**
8588 This function found in impl
8589 {libcrux_ml_kem::polynomial::PolynomialRingElement<Vector>[TraitClause@0]}
8590 */
8591 /**
8592 A monomorphic instance of libcrux_ml_kem.polynomial.poly_barrett_reduce_89
8593 with types libcrux_ml_kem_vector_portable_vector_type_PortableVector
8594 with const generics
8595
8596 */
libcrux_ml_kem_polynomial_poly_barrett_reduce_89_8b(libcrux_ml_kem_polynomial_PolynomialRingElement_f0 * self)8597 static KRML_MUSTINLINE void libcrux_ml_kem_polynomial_poly_barrett_reduce_89_8b(
8598 libcrux_ml_kem_polynomial_PolynomialRingElement_f0 *self) {
8599 for (size_t i = (size_t)0U;
8600 i < LIBCRUX_ML_KEM_POLYNOMIAL_VECTORS_IN_RING_ELEMENT; i++) {
8601 size_t i0 = i;
8602 libcrux_ml_kem_vector_portable_vector_type_PortableVector uu____0 =
8603 libcrux_ml_kem_vector_portable_barrett_reduce_0d(
8604 self->coefficients[i0]);
8605 self->coefficients[i0] = uu____0;
8606 }
8607 }
8608
8609 /**
8610 A monomorphic instance of libcrux_ml_kem.ntt.ntt_vector_u
8611 with types libcrux_ml_kem_vector_portable_vector_type_PortableVector
8612 with const generics
8613 - VECTOR_U_COMPRESSION_FACTOR= 10
8614 */
libcrux_ml_kem_ntt_ntt_vector_u_9f(libcrux_ml_kem_polynomial_PolynomialRingElement_f0 * re)8615 static KRML_MUSTINLINE void libcrux_ml_kem_ntt_ntt_vector_u_9f(
8616 libcrux_ml_kem_polynomial_PolynomialRingElement_f0 *re) {
8617 size_t zeta_i = (size_t)0U;
8618 libcrux_ml_kem_ntt_ntt_at_layer_4_plus_51(&zeta_i, re, (size_t)7U,
8619 (size_t)3328U);
8620 libcrux_ml_kem_ntt_ntt_at_layer_4_plus_51(&zeta_i, re, (size_t)6U,
8621 (size_t)3328U);
8622 libcrux_ml_kem_ntt_ntt_at_layer_4_plus_51(&zeta_i, re, (size_t)5U,
8623 (size_t)3328U);
8624 libcrux_ml_kem_ntt_ntt_at_layer_4_plus_51(&zeta_i, re, (size_t)4U,
8625 (size_t)3328U);
8626 libcrux_ml_kem_ntt_ntt_at_layer_3_fd(&zeta_i, re, (size_t)3U, (size_t)3328U);
8627 libcrux_ml_kem_ntt_ntt_at_layer_2_ad(&zeta_i, re, (size_t)2U, (size_t)3328U);
8628 libcrux_ml_kem_ntt_ntt_at_layer_1_a2(&zeta_i, re, (size_t)1U, (size_t)3328U);
8629 libcrux_ml_kem_polynomial_poly_barrett_reduce_89_8b(re);
8630 }
8631
8632 /**
8633 Call [`deserialize_then_decompress_ring_element_u`] on each ring element
8634 in the `ciphertext`.
8635 */
8636 /**
8637 A monomorphic instance of libcrux_ml_kem.ind_cpa.deserialize_then_decompress_u
8638 with types libcrux_ml_kem_vector_portable_vector_type_PortableVector
8639 with const generics
8640 - K= 3
8641 - CIPHERTEXT_SIZE= 1088
8642 - U_COMPRESSION_FACTOR= 10
8643 */
8644 static KRML_MUSTINLINE void
libcrux_ml_kem_ind_cpa_deserialize_then_decompress_u_f4(uint8_t * ciphertext,libcrux_ml_kem_polynomial_PolynomialRingElement_f0 ret[3U])8645 libcrux_ml_kem_ind_cpa_deserialize_then_decompress_u_f4(
8646 uint8_t *ciphertext,
8647 libcrux_ml_kem_polynomial_PolynomialRingElement_f0 ret[3U]) {
8648 libcrux_ml_kem_polynomial_PolynomialRingElement_f0 u_as_ntt[3U];
8649 for (size_t i = (size_t)0U; i < (size_t)3U; i++) {
8650 u_as_ntt[i] = libcrux_ml_kem_polynomial_ZERO_89_ea();
8651 }
8652 for (size_t i = (size_t)0U;
8653 i < Eurydice_slice_len(
8654 Eurydice_array_to_slice((size_t)1088U, ciphertext, uint8_t),
8655 uint8_t) /
8656 (LIBCRUX_ML_KEM_CONSTANTS_COEFFICIENTS_IN_RING_ELEMENT *
8657 (size_t)10U / (size_t)8U);
8658 i++) {
8659 size_t i0 = i;
8660 Eurydice_slice u_bytes = Eurydice_array_to_subslice2(
8661 ciphertext,
8662 i0 * (LIBCRUX_ML_KEM_CONSTANTS_COEFFICIENTS_IN_RING_ELEMENT *
8663 (size_t)10U / (size_t)8U),
8664 i0 * (LIBCRUX_ML_KEM_CONSTANTS_COEFFICIENTS_IN_RING_ELEMENT *
8665 (size_t)10U / (size_t)8U) +
8666 LIBCRUX_ML_KEM_CONSTANTS_COEFFICIENTS_IN_RING_ELEMENT *
8667 (size_t)10U / (size_t)8U,
8668 uint8_t);
8669 u_as_ntt[i0] =
8670 libcrux_ml_kem_serialize_deserialize_then_decompress_ring_element_u_34(
8671 u_bytes);
8672 libcrux_ml_kem_ntt_ntt_vector_u_9f(&u_as_ntt[i0]);
8673 }
8674 memcpy(
8675 ret, u_as_ntt,
8676 (size_t)3U * sizeof(libcrux_ml_kem_polynomial_PolynomialRingElement_f0));
8677 }
8678
8679 /**
8680 A monomorphic instance of
8681 libcrux_ml_kem.vector.portable.compress.decompress_ciphertext_coefficient with
8682 const generics
8683 - COEFFICIENT_BITS= 4
8684 */
8685 static KRML_MUSTINLINE libcrux_ml_kem_vector_portable_vector_type_PortableVector
libcrux_ml_kem_vector_portable_compress_decompress_ciphertext_coefficient_6b1(libcrux_ml_kem_vector_portable_vector_type_PortableVector v)8686 libcrux_ml_kem_vector_portable_compress_decompress_ciphertext_coefficient_6b1(
8687 libcrux_ml_kem_vector_portable_vector_type_PortableVector v) {
8688 for (size_t i = (size_t)0U;
8689 i < LIBCRUX_ML_KEM_VECTOR_TRAITS_FIELD_ELEMENTS_IN_VECTOR; i++) {
8690 size_t i0 = i;
8691 int32_t decompressed = (int32_t)v.elements[i0] *
8692 (int32_t)LIBCRUX_ML_KEM_VECTOR_TRAITS_FIELD_MODULUS;
8693 decompressed = (decompressed << 1U) + ((int32_t)1 << (uint32_t)(int32_t)4);
8694 decompressed = decompressed >> (uint32_t)((int32_t)4 + (int32_t)1);
8695 v.elements[i0] = (int16_t)decompressed;
8696 }
8697 return v;
8698 }
8699
8700 /**
8701 This function found in impl {(libcrux_ml_kem::vector::traits::Operations for
8702 libcrux_ml_kem::vector::portable::vector_type::PortableVector)}
8703 */
8704 /**
8705 A monomorphic instance of
8706 libcrux_ml_kem.vector.portable.decompress_ciphertext_coefficient_0d with const
8707 generics
8708 - COEFFICIENT_BITS= 4
8709 */
8710 static inline libcrux_ml_kem_vector_portable_vector_type_PortableVector
libcrux_ml_kem_vector_portable_decompress_ciphertext_coefficient_0d_5a1(libcrux_ml_kem_vector_portable_vector_type_PortableVector v)8711 libcrux_ml_kem_vector_portable_decompress_ciphertext_coefficient_0d_5a1(
8712 libcrux_ml_kem_vector_portable_vector_type_PortableVector v) {
8713 return libcrux_ml_kem_vector_portable_compress_decompress_ciphertext_coefficient_6b1(
8714 v);
8715 }
8716
8717 /**
8718 A monomorphic instance of libcrux_ml_kem.serialize.deserialize_then_decompress_4
8719 with types libcrux_ml_kem_vector_portable_vector_type_PortableVector
8720 with const generics
8721
8722 */
8723 static KRML_MUSTINLINE libcrux_ml_kem_polynomial_PolynomialRingElement_f0
libcrux_ml_kem_serialize_deserialize_then_decompress_4_41(Eurydice_slice serialized)8724 libcrux_ml_kem_serialize_deserialize_then_decompress_4_41(
8725 Eurydice_slice serialized) {
8726 libcrux_ml_kem_polynomial_PolynomialRingElement_f0 re =
8727 libcrux_ml_kem_polynomial_ZERO_89_ea();
8728 for (size_t i = (size_t)0U;
8729 i < Eurydice_slice_len(serialized, uint8_t) / (size_t)8U; i++) {
8730 size_t i0 = i;
8731 Eurydice_slice bytes = Eurydice_slice_subslice2(
8732 serialized, i0 * (size_t)8U, i0 * (size_t)8U + (size_t)8U, uint8_t);
8733 libcrux_ml_kem_vector_portable_vector_type_PortableVector coefficient =
8734 libcrux_ml_kem_vector_portable_deserialize_4_0d(bytes);
8735 libcrux_ml_kem_vector_portable_vector_type_PortableVector uu____0 =
8736 libcrux_ml_kem_vector_portable_decompress_ciphertext_coefficient_0d_5a1(
8737 coefficient);
8738 re.coefficients[i0] = uu____0;
8739 }
8740 return re;
8741 }
8742
8743 /**
8744 A monomorphic instance of
8745 libcrux_ml_kem.vector.portable.compress.decompress_ciphertext_coefficient with
8746 const generics
8747 - COEFFICIENT_BITS= 5
8748 */
8749 static KRML_MUSTINLINE libcrux_ml_kem_vector_portable_vector_type_PortableVector
libcrux_ml_kem_vector_portable_compress_decompress_ciphertext_coefficient_6b2(libcrux_ml_kem_vector_portable_vector_type_PortableVector v)8750 libcrux_ml_kem_vector_portable_compress_decompress_ciphertext_coefficient_6b2(
8751 libcrux_ml_kem_vector_portable_vector_type_PortableVector v) {
8752 for (size_t i = (size_t)0U;
8753 i < LIBCRUX_ML_KEM_VECTOR_TRAITS_FIELD_ELEMENTS_IN_VECTOR; i++) {
8754 size_t i0 = i;
8755 int32_t decompressed = (int32_t)v.elements[i0] *
8756 (int32_t)LIBCRUX_ML_KEM_VECTOR_TRAITS_FIELD_MODULUS;
8757 decompressed = (decompressed << 1U) + ((int32_t)1 << (uint32_t)(int32_t)5);
8758 decompressed = decompressed >> (uint32_t)((int32_t)5 + (int32_t)1);
8759 v.elements[i0] = (int16_t)decompressed;
8760 }
8761 return v;
8762 }
8763
8764 /**
8765 This function found in impl {(libcrux_ml_kem::vector::traits::Operations for
8766 libcrux_ml_kem::vector::portable::vector_type::PortableVector)}
8767 */
8768 /**
8769 A monomorphic instance of
8770 libcrux_ml_kem.vector.portable.decompress_ciphertext_coefficient_0d with const
8771 generics
8772 - COEFFICIENT_BITS= 5
8773 */
8774 static inline libcrux_ml_kem_vector_portable_vector_type_PortableVector
libcrux_ml_kem_vector_portable_decompress_ciphertext_coefficient_0d_5a2(libcrux_ml_kem_vector_portable_vector_type_PortableVector v)8775 libcrux_ml_kem_vector_portable_decompress_ciphertext_coefficient_0d_5a2(
8776 libcrux_ml_kem_vector_portable_vector_type_PortableVector v) {
8777 return libcrux_ml_kem_vector_portable_compress_decompress_ciphertext_coefficient_6b2(
8778 v);
8779 }
8780
8781 /**
8782 A monomorphic instance of libcrux_ml_kem.serialize.deserialize_then_decompress_5
8783 with types libcrux_ml_kem_vector_portable_vector_type_PortableVector
8784 with const generics
8785
8786 */
8787 static KRML_MUSTINLINE libcrux_ml_kem_polynomial_PolynomialRingElement_f0
libcrux_ml_kem_serialize_deserialize_then_decompress_5_4e(Eurydice_slice serialized)8788 libcrux_ml_kem_serialize_deserialize_then_decompress_5_4e(
8789 Eurydice_slice serialized) {
8790 libcrux_ml_kem_polynomial_PolynomialRingElement_f0 re =
8791 libcrux_ml_kem_polynomial_ZERO_89_ea();
8792 for (size_t i = (size_t)0U;
8793 i < Eurydice_slice_len(serialized, uint8_t) / (size_t)10U; i++) {
8794 size_t i0 = i;
8795 Eurydice_slice bytes = Eurydice_slice_subslice2(
8796 serialized, i0 * (size_t)10U, i0 * (size_t)10U + (size_t)10U, uint8_t);
8797 re.coefficients[i0] =
8798 libcrux_ml_kem_vector_portable_deserialize_5_0d(bytes);
8799 libcrux_ml_kem_vector_portable_vector_type_PortableVector uu____1 =
8800 libcrux_ml_kem_vector_portable_decompress_ciphertext_coefficient_0d_5a2(
8801 re.coefficients[i0]);
8802 re.coefficients[i0] = uu____1;
8803 }
8804 return re;
8805 }
8806
8807 /**
8808 A monomorphic instance of
8809 libcrux_ml_kem.serialize.deserialize_then_decompress_ring_element_v with types
8810 libcrux_ml_kem_vector_portable_vector_type_PortableVector with const generics
8811 - COMPRESSION_FACTOR= 4
8812 */
8813 static KRML_MUSTINLINE libcrux_ml_kem_polynomial_PolynomialRingElement_f0
libcrux_ml_kem_serialize_deserialize_then_decompress_ring_element_v_56(Eurydice_slice serialized)8814 libcrux_ml_kem_serialize_deserialize_then_decompress_ring_element_v_56(
8815 Eurydice_slice serialized) {
8816 return libcrux_ml_kem_serialize_deserialize_then_decompress_4_41(serialized);
8817 }
8818
8819 /**
8820 Given two `KyberPolynomialRingElement`s in their NTT representations,
8821 compute their product. Given two polynomials in the NTT domain `f^` and `ĵ`,
8822 the `iᵗʰ` coefficient of the product `k̂` is determined by the calculation:
8823
8824 ```plaintext
8825 ĥ[2·i] + ĥ[2·i + 1]X = (f^[2·i] + f^[2·i + 1]X)·(ĝ[2·i] + ĝ[2·i + 1]X) mod (X²
8826 - ζ^(2·BitRev₇(i) + 1))
8827 ```
8828
8829 This function almost implements <strong>Algorithm 10</strong> of the
8830 NIST FIPS 203 standard, which is reproduced below:
8831
8832 ```plaintext
8833 Input: Two arrays fˆ ∈ ℤ₂₅₆ and ĝ ∈ ℤ₂₅₆.
8834 Output: An array ĥ ∈ ℤq.
8835
8836 for(i ← 0; i < 128; i++)
8837 (ĥ[2i], ĥ[2i+1]) ← BaseCaseMultiply(fˆ[2i], fˆ[2i+1], ĝ[2i], ĝ[2i+1],
8838 ζ^(2·BitRev₇(i) + 1)) end for return ĥ
8839 ```
8840 We say "almost" because the coefficients of the ring element output by
8841 this function are in the Montgomery domain.
8842
8843 The NIST FIPS 203 standard can be found at
8844 <https://csrc.nist.gov/pubs/fips/203/ipd>.
8845 */
8846 /**
8847 This function found in impl
8848 {libcrux_ml_kem::polynomial::PolynomialRingElement<Vector>[TraitClause@0]}
8849 */
8850 /**
8851 A monomorphic instance of libcrux_ml_kem.polynomial.ntt_multiply_89
8852 with types libcrux_ml_kem_vector_portable_vector_type_PortableVector
8853 with const generics
8854
8855 */
8856 static KRML_MUSTINLINE libcrux_ml_kem_polynomial_PolynomialRingElement_f0
libcrux_ml_kem_polynomial_ntt_multiply_89_2a(libcrux_ml_kem_polynomial_PolynomialRingElement_f0 * self,libcrux_ml_kem_polynomial_PolynomialRingElement_f0 * rhs)8857 libcrux_ml_kem_polynomial_ntt_multiply_89_2a(
8858 libcrux_ml_kem_polynomial_PolynomialRingElement_f0 *self,
8859 libcrux_ml_kem_polynomial_PolynomialRingElement_f0 *rhs) {
8860 libcrux_ml_kem_polynomial_PolynomialRingElement_f0 out =
8861 libcrux_ml_kem_polynomial_ZERO_89_ea();
8862 for (size_t i = (size_t)0U;
8863 i < LIBCRUX_ML_KEM_POLYNOMIAL_VECTORS_IN_RING_ELEMENT; i++) {
8864 size_t i0 = i;
8865 libcrux_ml_kem_vector_portable_vector_type_PortableVector uu____0 =
8866 libcrux_ml_kem_vector_portable_ntt_multiply_0d(
8867 &self->coefficients[i0], &rhs->coefficients[i0],
8868 libcrux_ml_kem_polynomial_ZETAS_TIMES_MONTGOMERY_R[(size_t)64U +
8869 (size_t)4U * i0],
8870 libcrux_ml_kem_polynomial_ZETAS_TIMES_MONTGOMERY_R[(size_t)64U +
8871 (size_t)4U * i0 +
8872 (size_t)1U],
8873 libcrux_ml_kem_polynomial_ZETAS_TIMES_MONTGOMERY_R[(size_t)64U +
8874 (size_t)4U * i0 +
8875 (size_t)2U],
8876 libcrux_ml_kem_polynomial_ZETAS_TIMES_MONTGOMERY_R[(size_t)64U +
8877 (size_t)4U * i0 +
8878 (size_t)3U]);
8879 out.coefficients[i0] = uu____0;
8880 }
8881 return out;
8882 }
8883
8884 /**
8885 Given two polynomial ring elements `lhs` and `rhs`, compute the pointwise
8886 sum of their constituent coefficients.
8887 */
8888 /**
8889 This function found in impl
8890 {libcrux_ml_kem::polynomial::PolynomialRingElement<Vector>[TraitClause@0]}
8891 */
8892 /**
8893 A monomorphic instance of libcrux_ml_kem.polynomial.add_to_ring_element_89
8894 with types libcrux_ml_kem_vector_portable_vector_type_PortableVector
8895 with const generics
8896 - K= 3
8897 */
libcrux_ml_kem_polynomial_add_to_ring_element_89_84(libcrux_ml_kem_polynomial_PolynomialRingElement_f0 * self,libcrux_ml_kem_polynomial_PolynomialRingElement_f0 * rhs)8898 static KRML_MUSTINLINE void libcrux_ml_kem_polynomial_add_to_ring_element_89_84(
8899 libcrux_ml_kem_polynomial_PolynomialRingElement_f0 *self,
8900 libcrux_ml_kem_polynomial_PolynomialRingElement_f0 *rhs) {
8901 for (size_t i = (size_t)0U;
8902 i < Eurydice_slice_len(
8903 Eurydice_array_to_slice(
8904 (size_t)16U, self->coefficients,
8905 libcrux_ml_kem_vector_portable_vector_type_PortableVector),
8906 libcrux_ml_kem_vector_portable_vector_type_PortableVector);
8907 i++) {
8908 size_t i0 = i;
8909 libcrux_ml_kem_vector_portable_vector_type_PortableVector uu____0 =
8910 libcrux_ml_kem_vector_portable_add_0d(self->coefficients[i0],
8911 &rhs->coefficients[i0]);
8912 self->coefficients[i0] = uu____0;
8913 }
8914 }
8915
8916 /**
8917 A monomorphic instance of libcrux_ml_kem.invert_ntt.invert_ntt_at_layer_1
8918 with types libcrux_ml_kem_vector_portable_vector_type_PortableVector
8919 with const generics
8920
8921 */
libcrux_ml_kem_invert_ntt_invert_ntt_at_layer_1_83(size_t * zeta_i,libcrux_ml_kem_polynomial_PolynomialRingElement_f0 * re,size_t _layer)8922 static KRML_MUSTINLINE void libcrux_ml_kem_invert_ntt_invert_ntt_at_layer_1_83(
8923 size_t *zeta_i, libcrux_ml_kem_polynomial_PolynomialRingElement_f0 *re,
8924 size_t _layer) {
8925 for (size_t i = (size_t)0U; i < (size_t)16U; i++) {
8926 size_t round = i;
8927 zeta_i[0U] = zeta_i[0U] - (size_t)1U;
8928 re->coefficients[round] =
8929 libcrux_ml_kem_vector_portable_inv_ntt_layer_1_step_0d(
8930 re->coefficients[round],
8931 libcrux_ml_kem_polynomial_ZETAS_TIMES_MONTGOMERY_R[zeta_i[0U]],
8932 libcrux_ml_kem_polynomial_ZETAS_TIMES_MONTGOMERY_R[zeta_i[0U] -
8933 (size_t)1U],
8934 libcrux_ml_kem_polynomial_ZETAS_TIMES_MONTGOMERY_R[zeta_i[0U] -
8935 (size_t)2U],
8936 libcrux_ml_kem_polynomial_ZETAS_TIMES_MONTGOMERY_R[zeta_i[0U] -
8937 (size_t)3U]);
8938 zeta_i[0U] = zeta_i[0U] - (size_t)3U;
8939 }
8940 }
8941
8942 /**
8943 A monomorphic instance of libcrux_ml_kem.invert_ntt.invert_ntt_at_layer_2
8944 with types libcrux_ml_kem_vector_portable_vector_type_PortableVector
8945 with const generics
8946
8947 */
libcrux_ml_kem_invert_ntt_invert_ntt_at_layer_2_c3(size_t * zeta_i,libcrux_ml_kem_polynomial_PolynomialRingElement_f0 * re,size_t _layer)8948 static KRML_MUSTINLINE void libcrux_ml_kem_invert_ntt_invert_ntt_at_layer_2_c3(
8949 size_t *zeta_i, libcrux_ml_kem_polynomial_PolynomialRingElement_f0 *re,
8950 size_t _layer) {
8951 for (size_t i = (size_t)0U; i < (size_t)16U; i++) {
8952 size_t round = i;
8953 zeta_i[0U] = zeta_i[0U] - (size_t)1U;
8954 re->coefficients[round] =
8955 libcrux_ml_kem_vector_portable_inv_ntt_layer_2_step_0d(
8956 re->coefficients[round],
8957 libcrux_ml_kem_polynomial_ZETAS_TIMES_MONTGOMERY_R[zeta_i[0U]],
8958 libcrux_ml_kem_polynomial_ZETAS_TIMES_MONTGOMERY_R[zeta_i[0U] -
8959 (size_t)1U]);
8960 zeta_i[0U] = zeta_i[0U] - (size_t)1U;
8961 }
8962 }
8963
8964 /**
8965 A monomorphic instance of libcrux_ml_kem.invert_ntt.invert_ntt_at_layer_3
8966 with types libcrux_ml_kem_vector_portable_vector_type_PortableVector
8967 with const generics
8968
8969 */
libcrux_ml_kem_invert_ntt_invert_ntt_at_layer_3_68(size_t * zeta_i,libcrux_ml_kem_polynomial_PolynomialRingElement_f0 * re,size_t _layer)8970 static KRML_MUSTINLINE void libcrux_ml_kem_invert_ntt_invert_ntt_at_layer_3_68(
8971 size_t *zeta_i, libcrux_ml_kem_polynomial_PolynomialRingElement_f0 *re,
8972 size_t _layer) {
8973 for (size_t i = (size_t)0U; i < (size_t)16U; i++) {
8974 size_t round = i;
8975 zeta_i[0U] = zeta_i[0U] - (size_t)1U;
8976 libcrux_ml_kem_vector_portable_vector_type_PortableVector uu____0 =
8977 libcrux_ml_kem_vector_portable_inv_ntt_layer_3_step_0d(
8978 re->coefficients[round],
8979 libcrux_ml_kem_polynomial_ZETAS_TIMES_MONTGOMERY_R[zeta_i[0U]]);
8980 re->coefficients[round] = uu____0;
8981 }
8982 }
8983
8984 /**
8985 A monomorphic instance of
8986 libcrux_ml_kem.invert_ntt.inv_ntt_layer_int_vec_step_reduce with types
8987 libcrux_ml_kem_vector_portable_vector_type_PortableVector with const generics
8988
8989 */
8990 static KRML_MUSTINLINE
8991 libcrux_ml_kem_vector_portable_vector_type_PortableVector_x2
libcrux_ml_kem_invert_ntt_inv_ntt_layer_int_vec_step_reduce_65(libcrux_ml_kem_vector_portable_vector_type_PortableVector a,libcrux_ml_kem_vector_portable_vector_type_PortableVector b,int16_t zeta_r)8992 libcrux_ml_kem_invert_ntt_inv_ntt_layer_int_vec_step_reduce_65(
8993 libcrux_ml_kem_vector_portable_vector_type_PortableVector a,
8994 libcrux_ml_kem_vector_portable_vector_type_PortableVector b,
8995 int16_t zeta_r) {
8996 libcrux_ml_kem_vector_portable_vector_type_PortableVector a_minus_b =
8997 libcrux_ml_kem_vector_portable_sub_0d(b, &a);
8998 a = libcrux_ml_kem_vector_portable_barrett_reduce_0d(
8999 libcrux_ml_kem_vector_portable_add_0d(a, &b));
9000 b = libcrux_ml_kem_vector_traits_montgomery_multiply_fe_67(a_minus_b, zeta_r);
9001 return (
9002 CLITERAL(libcrux_ml_kem_vector_portable_vector_type_PortableVector_x2){
9003 .fst = a, .snd = b});
9004 }
9005
9006 /**
9007 A monomorphic instance of libcrux_ml_kem.invert_ntt.invert_ntt_at_layer_4_plus
9008 with types libcrux_ml_kem_vector_portable_vector_type_PortableVector
9009 with const generics
9010
9011 */
9012 static KRML_MUSTINLINE void
libcrux_ml_kem_invert_ntt_invert_ntt_at_layer_4_plus_6e(size_t * zeta_i,libcrux_ml_kem_polynomial_PolynomialRingElement_f0 * re,size_t layer)9013 libcrux_ml_kem_invert_ntt_invert_ntt_at_layer_4_plus_6e(
9014 size_t *zeta_i, libcrux_ml_kem_polynomial_PolynomialRingElement_f0 *re,
9015 size_t layer) {
9016 size_t step = (size_t)1U << (uint32_t)layer;
9017 for (size_t i0 = (size_t)0U; i0 < (size_t)128U >> (uint32_t)layer; i0++) {
9018 size_t round = i0;
9019 zeta_i[0U] = zeta_i[0U] - (size_t)1U;
9020 size_t offset = round * step * (size_t)2U;
9021 size_t offset_vec =
9022 offset / LIBCRUX_ML_KEM_VECTOR_TRAITS_FIELD_ELEMENTS_IN_VECTOR;
9023 size_t step_vec =
9024 step / LIBCRUX_ML_KEM_VECTOR_TRAITS_FIELD_ELEMENTS_IN_VECTOR;
9025 for (size_t i = offset_vec; i < offset_vec + step_vec; i++) {
9026 size_t j = i;
9027 libcrux_ml_kem_vector_portable_vector_type_PortableVector_x2 uu____0 =
9028 libcrux_ml_kem_invert_ntt_inv_ntt_layer_int_vec_step_reduce_65(
9029 re->coefficients[j], re->coefficients[j + step_vec],
9030 libcrux_ml_kem_polynomial_ZETAS_TIMES_MONTGOMERY_R[zeta_i[0U]]);
9031 libcrux_ml_kem_vector_portable_vector_type_PortableVector x = uu____0.fst;
9032 libcrux_ml_kem_vector_portable_vector_type_PortableVector y = uu____0.snd;
9033 re->coefficients[j] = x;
9034 re->coefficients[j + step_vec] = y;
9035 }
9036 }
9037 }
9038
9039 /**
9040 A monomorphic instance of libcrux_ml_kem.invert_ntt.invert_ntt_montgomery
9041 with types libcrux_ml_kem_vector_portable_vector_type_PortableVector
9042 with const generics
9043 - K= 3
9044 */
libcrux_ml_kem_invert_ntt_invert_ntt_montgomery_f6(libcrux_ml_kem_polynomial_PolynomialRingElement_f0 * re)9045 static KRML_MUSTINLINE void libcrux_ml_kem_invert_ntt_invert_ntt_montgomery_f6(
9046 libcrux_ml_kem_polynomial_PolynomialRingElement_f0 *re) {
9047 size_t zeta_i =
9048 LIBCRUX_ML_KEM_CONSTANTS_COEFFICIENTS_IN_RING_ELEMENT / (size_t)2U;
9049 libcrux_ml_kem_invert_ntt_invert_ntt_at_layer_1_83(&zeta_i, re, (size_t)1U);
9050 libcrux_ml_kem_invert_ntt_invert_ntt_at_layer_2_c3(&zeta_i, re, (size_t)2U);
9051 libcrux_ml_kem_invert_ntt_invert_ntt_at_layer_3_68(&zeta_i, re, (size_t)3U);
9052 libcrux_ml_kem_invert_ntt_invert_ntt_at_layer_4_plus_6e(&zeta_i, re,
9053 (size_t)4U);
9054 libcrux_ml_kem_invert_ntt_invert_ntt_at_layer_4_plus_6e(&zeta_i, re,
9055 (size_t)5U);
9056 libcrux_ml_kem_invert_ntt_invert_ntt_at_layer_4_plus_6e(&zeta_i, re,
9057 (size_t)6U);
9058 libcrux_ml_kem_invert_ntt_invert_ntt_at_layer_4_plus_6e(&zeta_i, re,
9059 (size_t)7U);
9060 libcrux_ml_kem_polynomial_poly_barrett_reduce_89_8b(re);
9061 }
9062
9063 /**
9064 This function found in impl
9065 {libcrux_ml_kem::polynomial::PolynomialRingElement<Vector>[TraitClause@0]}
9066 */
9067 /**
9068 A monomorphic instance of libcrux_ml_kem.polynomial.subtract_reduce_89
9069 with types libcrux_ml_kem_vector_portable_vector_type_PortableVector
9070 with const generics
9071
9072 */
9073 static KRML_MUSTINLINE libcrux_ml_kem_polynomial_PolynomialRingElement_f0
libcrux_ml_kem_polynomial_subtract_reduce_89_d4(libcrux_ml_kem_polynomial_PolynomialRingElement_f0 * self,libcrux_ml_kem_polynomial_PolynomialRingElement_f0 b)9074 libcrux_ml_kem_polynomial_subtract_reduce_89_d4(
9075 libcrux_ml_kem_polynomial_PolynomialRingElement_f0 *self,
9076 libcrux_ml_kem_polynomial_PolynomialRingElement_f0 b) {
9077 for (size_t i = (size_t)0U;
9078 i < LIBCRUX_ML_KEM_POLYNOMIAL_VECTORS_IN_RING_ELEMENT; i++) {
9079 size_t i0 = i;
9080 libcrux_ml_kem_vector_portable_vector_type_PortableVector
9081 coefficient_normal_form =
9082 libcrux_ml_kem_vector_portable_montgomery_multiply_by_constant_0d(
9083 b.coefficients[i0], (int16_t)1441);
9084 libcrux_ml_kem_vector_portable_vector_type_PortableVector uu____0 =
9085 libcrux_ml_kem_vector_portable_barrett_reduce_0d(
9086 libcrux_ml_kem_vector_portable_sub_0d(self->coefficients[i0],
9087 &coefficient_normal_form));
9088 b.coefficients[i0] = uu____0;
9089 }
9090 return b;
9091 }
9092
9093 /**
9094 The following functions compute various expressions involving
9095 vectors and matrices. The computation of these expressions has been
9096 abstracted away into these functions in order to save on loop iterations.
9097 Compute v − InverseNTT(sᵀ ◦ NTT(u))
9098 */
9099 /**
9100 A monomorphic instance of libcrux_ml_kem.matrix.compute_message
9101 with types libcrux_ml_kem_vector_portable_vector_type_PortableVector
9102 with const generics
9103 - K= 3
9104 */
9105 static KRML_MUSTINLINE libcrux_ml_kem_polynomial_PolynomialRingElement_f0
libcrux_ml_kem_matrix_compute_message_b3(libcrux_ml_kem_polynomial_PolynomialRingElement_f0 * v,libcrux_ml_kem_polynomial_PolynomialRingElement_f0 * secret_as_ntt,libcrux_ml_kem_polynomial_PolynomialRingElement_f0 * u_as_ntt)9106 libcrux_ml_kem_matrix_compute_message_b3(
9107 libcrux_ml_kem_polynomial_PolynomialRingElement_f0 *v,
9108 libcrux_ml_kem_polynomial_PolynomialRingElement_f0 *secret_as_ntt,
9109 libcrux_ml_kem_polynomial_PolynomialRingElement_f0 *u_as_ntt) {
9110 libcrux_ml_kem_polynomial_PolynomialRingElement_f0 result =
9111 libcrux_ml_kem_polynomial_ZERO_89_ea();
9112 for (size_t i = (size_t)0U; i < (size_t)3U; i++) {
9113 size_t i0 = i;
9114 libcrux_ml_kem_polynomial_PolynomialRingElement_f0 product =
9115 libcrux_ml_kem_polynomial_ntt_multiply_89_2a(&secret_as_ntt[i0],
9116 &u_as_ntt[i0]);
9117 libcrux_ml_kem_polynomial_add_to_ring_element_89_84(&result, &product);
9118 }
9119 libcrux_ml_kem_invert_ntt_invert_ntt_montgomery_f6(&result);
9120 result = libcrux_ml_kem_polynomial_subtract_reduce_89_d4(v, result);
9121 return result;
9122 }
9123
9124 /**
9125 A monomorphic instance of libcrux_ml_kem.vector.portable.arithmetic.shift_right
9126 with const generics
9127 - SHIFT_BY= 15
9128 */
9129 static KRML_MUSTINLINE libcrux_ml_kem_vector_portable_vector_type_PortableVector
libcrux_ml_kem_vector_portable_arithmetic_shift_right_94(libcrux_ml_kem_vector_portable_vector_type_PortableVector v)9130 libcrux_ml_kem_vector_portable_arithmetic_shift_right_94(
9131 libcrux_ml_kem_vector_portable_vector_type_PortableVector v) {
9132 for (size_t i = (size_t)0U;
9133 i < LIBCRUX_ML_KEM_VECTOR_TRAITS_FIELD_ELEMENTS_IN_VECTOR; i++) {
9134 size_t i0 = i;
9135 v.elements[i0] = v.elements[i0] >> (uint32_t)(int32_t)15;
9136 }
9137 return v;
9138 }
9139
9140 /**
9141 This function found in impl {(libcrux_ml_kem::vector::traits::Operations for
9142 libcrux_ml_kem::vector::portable::vector_type::PortableVector)}
9143 */
9144 /**
9145 A monomorphic instance of libcrux_ml_kem.vector.portable.shift_right_0d
9146 with const generics
9147 - SHIFT_BY= 15
9148 */
9149 static inline libcrux_ml_kem_vector_portable_vector_type_PortableVector
libcrux_ml_kem_vector_portable_shift_right_0d_19(libcrux_ml_kem_vector_portable_vector_type_PortableVector v)9150 libcrux_ml_kem_vector_portable_shift_right_0d_19(
9151 libcrux_ml_kem_vector_portable_vector_type_PortableVector v) {
9152 return libcrux_ml_kem_vector_portable_arithmetic_shift_right_94(v);
9153 }
9154
9155 /**
9156 A monomorphic instance of
9157 libcrux_ml_kem.vector.traits.to_unsigned_representative with types
9158 libcrux_ml_kem_vector_portable_vector_type_PortableVector with const generics
9159
9160 */
9161 static inline libcrux_ml_kem_vector_portable_vector_type_PortableVector
libcrux_ml_kem_vector_traits_to_unsigned_representative_db(libcrux_ml_kem_vector_portable_vector_type_PortableVector a)9162 libcrux_ml_kem_vector_traits_to_unsigned_representative_db(
9163 libcrux_ml_kem_vector_portable_vector_type_PortableVector a) {
9164 libcrux_ml_kem_vector_portable_vector_type_PortableVector t =
9165 libcrux_ml_kem_vector_portable_shift_right_0d_19(a);
9166 libcrux_ml_kem_vector_portable_vector_type_PortableVector fm =
9167 libcrux_ml_kem_vector_portable_bitwise_and_with_constant_0d(
9168 t, LIBCRUX_ML_KEM_VECTOR_TRAITS_FIELD_MODULUS);
9169 return libcrux_ml_kem_vector_portable_add_0d(a, &fm);
9170 }
9171
9172 /**
9173 A monomorphic instance of
9174 libcrux_ml_kem.serialize.compress_then_serialize_message with types
9175 libcrux_ml_kem_vector_portable_vector_type_PortableVector with const generics
9176
9177 */
9178 static KRML_MUSTINLINE void
libcrux_ml_kem_serialize_compress_then_serialize_message_aa(libcrux_ml_kem_polynomial_PolynomialRingElement_f0 re,uint8_t ret[32U])9179 libcrux_ml_kem_serialize_compress_then_serialize_message_aa(
9180 libcrux_ml_kem_polynomial_PolynomialRingElement_f0 re, uint8_t ret[32U]) {
9181 uint8_t serialized[32U] = {0U};
9182 for (size_t i = (size_t)0U; i < (size_t)16U; i++) {
9183 size_t i0 = i;
9184 libcrux_ml_kem_vector_portable_vector_type_PortableVector coefficient =
9185 libcrux_ml_kem_vector_traits_to_unsigned_representative_db(
9186 re.coefficients[i0]);
9187 libcrux_ml_kem_vector_portable_vector_type_PortableVector
9188 coefficient_compressed =
9189 libcrux_ml_kem_vector_portable_compress_1_0d(coefficient);
9190 uint8_t bytes[2U];
9191 libcrux_ml_kem_vector_portable_serialize_1_0d(coefficient_compressed,
9192 bytes);
9193 Eurydice_slice uu____0 = Eurydice_array_to_subslice2(
9194 serialized, (size_t)2U * i0, (size_t)2U * i0 + (size_t)2U, uint8_t);
9195 Eurydice_slice_copy(
9196 uu____0, Eurydice_array_to_slice((size_t)2U, bytes, uint8_t), uint8_t);
9197 }
9198 memcpy(ret, serialized, (size_t)32U * sizeof(uint8_t));
9199 }
9200
9201 /**
9202 This function implements <strong>Algorithm 14</strong> of the
9203 NIST FIPS 203 specification; this is the Kyber CPA-PKE decryption algorithm.
9204
9205 Algorithm 14 is reproduced below:
9206
9207 ```plaintext
9208 Input: decryption key dkₚₖₑ ∈ ^{384k}.
9209 Input: ciphertext c ∈ ^{32(dᵤk + dᵥ)}.
9210 Output: message m ∈ ^{32}.
9211
9212 c₁ ← c[0 : 32dᵤk]
9213 c₂ ← c[32dᵤk : 32(dᵤk + dᵥ)]
9214 u ← Decompress_{dᵤ}(ByteDecode_{dᵤ}(c₁))
9215 v ← Decompress_{dᵥ}(ByteDecode_{dᵥ}(c₂))
9216 ŝ ← ByteDecode₁₂(dkₚₖₑ)
9217 w ← v - NTT-¹(ŝᵀ ◦ NTT(u))
9218 m ← ByteEncode₁(Compress₁(w))
9219 return m
9220 ```
9221
9222 The NIST FIPS 203 standard can be found at
9223 <https://csrc.nist.gov/pubs/fips/203/ipd>.
9224 */
9225 /**
9226 A monomorphic instance of libcrux_ml_kem.ind_cpa.decrypt_unpacked
9227 with types libcrux_ml_kem_vector_portable_vector_type_PortableVector
9228 with const generics
9229 - K= 3
9230 - CIPHERTEXT_SIZE= 1088
9231 - VECTOR_U_ENCODED_SIZE= 960
9232 - U_COMPRESSION_FACTOR= 10
9233 - V_COMPRESSION_FACTOR= 4
9234 */
libcrux_ml_kem_ind_cpa_decrypt_unpacked_6d(libcrux_ml_kem_ind_cpa_unpacked_IndCpaPrivateKeyUnpacked_f8 * secret_key,uint8_t * ciphertext,uint8_t ret[32U])9235 static inline void libcrux_ml_kem_ind_cpa_decrypt_unpacked_6d(
9236 libcrux_ml_kem_ind_cpa_unpacked_IndCpaPrivateKeyUnpacked_f8 *secret_key,
9237 uint8_t *ciphertext, uint8_t ret[32U]) {
9238 libcrux_ml_kem_polynomial_PolynomialRingElement_f0 u_as_ntt[3U];
9239 libcrux_ml_kem_ind_cpa_deserialize_then_decompress_u_f4(ciphertext, u_as_ntt);
9240 libcrux_ml_kem_polynomial_PolynomialRingElement_f0 v =
9241 libcrux_ml_kem_serialize_deserialize_then_decompress_ring_element_v_56(
9242 Eurydice_array_to_subslice_from((size_t)1088U, ciphertext,
9243 (size_t)960U, uint8_t, size_t));
9244 libcrux_ml_kem_polynomial_PolynomialRingElement_f0 message =
9245 libcrux_ml_kem_matrix_compute_message_b3(&v, secret_key->secret_as_ntt,
9246 u_as_ntt);
9247 uint8_t ret0[32U];
9248 libcrux_ml_kem_serialize_compress_then_serialize_message_aa(message, ret0);
9249 memcpy(ret, ret0, (size_t)32U * sizeof(uint8_t));
9250 }
9251
9252 /**
9253 A monomorphic instance of libcrux_ml_kem.ind_cpa.decrypt
9254 with types libcrux_ml_kem_vector_portable_vector_type_PortableVector
9255 with const generics
9256 - K= 3
9257 - CIPHERTEXT_SIZE= 1088
9258 - VECTOR_U_ENCODED_SIZE= 960
9259 - U_COMPRESSION_FACTOR= 10
9260 - V_COMPRESSION_FACTOR= 4
9261 */
libcrux_ml_kem_ind_cpa_decrypt_43(Eurydice_slice secret_key,uint8_t * ciphertext,uint8_t ret[32U])9262 static inline void libcrux_ml_kem_ind_cpa_decrypt_43(Eurydice_slice secret_key,
9263 uint8_t *ciphertext,
9264 uint8_t ret[32U]) {
9265 libcrux_ml_kem_polynomial_PolynomialRingElement_f0 secret_as_ntt[3U];
9266 libcrux_ml_kem_ind_cpa_deserialize_secret_key_24(secret_key, secret_as_ntt);
9267 /* Passing arrays by value in Rust generates a copy in C */
9268 libcrux_ml_kem_polynomial_PolynomialRingElement_f0 copy_of_secret_as_ntt[3U];
9269 memcpy(
9270 copy_of_secret_as_ntt, secret_as_ntt,
9271 (size_t)3U * sizeof(libcrux_ml_kem_polynomial_PolynomialRingElement_f0));
9272 libcrux_ml_kem_ind_cpa_unpacked_IndCpaPrivateKeyUnpacked_f8
9273 secret_key_unpacked;
9274 memcpy(
9275 secret_key_unpacked.secret_as_ntt, copy_of_secret_as_ntt,
9276 (size_t)3U * sizeof(libcrux_ml_kem_polynomial_PolynomialRingElement_f0));
9277 uint8_t ret0[32U];
9278 libcrux_ml_kem_ind_cpa_decrypt_unpacked_6d(&secret_key_unpacked, ciphertext,
9279 ret0);
9280 memcpy(ret, ret0, (size_t)32U * sizeof(uint8_t));
9281 }
9282
9283 /**
9284 This function found in impl {(libcrux_ml_kem::hash_functions::Hash<K> for
9285 libcrux_ml_kem::hash_functions::portable::PortableHash<K>)}
9286 */
9287 /**
9288 A monomorphic instance of libcrux_ml_kem.hash_functions.portable.G_f1
9289 with const generics
9290 - K= 3
9291 */
libcrux_ml_kem_hash_functions_portable_G_f1_e4(Eurydice_slice input,uint8_t ret[64U])9292 static KRML_MUSTINLINE void libcrux_ml_kem_hash_functions_portable_G_f1_e4(
9293 Eurydice_slice input, uint8_t ret[64U]) {
9294 libcrux_ml_kem_hash_functions_portable_G(input, ret);
9295 }
9296
9297 /**
9298 A monomorphic instance of libcrux_ml_kem.hash_functions.portable.PRF
9299 with const generics
9300 - LEN= 32
9301 */
libcrux_ml_kem_hash_functions_portable_PRF_2b(Eurydice_slice input,uint8_t ret[32U])9302 static KRML_MUSTINLINE void libcrux_ml_kem_hash_functions_portable_PRF_2b(
9303 Eurydice_slice input, uint8_t ret[32U]) {
9304 uint8_t digest[32U] = {0U};
9305 libcrux_sha3_portable_shake256(
9306 Eurydice_array_to_slice((size_t)32U, digest, uint8_t), input);
9307 memcpy(ret, digest, (size_t)32U * sizeof(uint8_t));
9308 }
9309
9310 /**
9311 This function found in impl {(libcrux_ml_kem::hash_functions::Hash<K> for
9312 libcrux_ml_kem::hash_functions::portable::PortableHash<K>)}
9313 */
9314 /**
9315 A monomorphic instance of libcrux_ml_kem.hash_functions.portable.PRF_f1
9316 with const generics
9317 - K= 3
9318 - LEN= 32
9319 */
libcrux_ml_kem_hash_functions_portable_PRF_f1_ee(Eurydice_slice input,uint8_t ret[32U])9320 static KRML_MUSTINLINE void libcrux_ml_kem_hash_functions_portable_PRF_f1_ee(
9321 Eurydice_slice input, uint8_t ret[32U]) {
9322 libcrux_ml_kem_hash_functions_portable_PRF_2b(input, ret);
9323 }
9324
9325 /**
9326 A monomorphic instance of
9327 libcrux_ml_kem.serialize.deserialize_ring_elements_reduced.closure with types
9328 libcrux_ml_kem_vector_portable_vector_type_PortableVector with const generics
9329 - PUBLIC_KEY_SIZE= 1152
9330 - K= 3
9331 */
9332 static inline libcrux_ml_kem_polynomial_PolynomialRingElement_f0
libcrux_ml_kem_serialize_deserialize_ring_elements_reduced_closure_cd(size_t _i)9333 libcrux_ml_kem_serialize_deserialize_ring_elements_reduced_closure_cd(
9334 size_t _i) {
9335 return libcrux_ml_kem_polynomial_ZERO_89_ea();
9336 }
9337
9338 /**
9339 Only use with public values.
9340
9341 This MUST NOT be used with secret inputs, like its caller
9342 `deserialize_ring_elements_reduced`.
9343 */
9344 /**
9345 A monomorphic instance of
9346 libcrux_ml_kem.serialize.deserialize_to_reduced_ring_element with types
9347 libcrux_ml_kem_vector_portable_vector_type_PortableVector with const generics
9348
9349 */
9350 static KRML_MUSTINLINE libcrux_ml_kem_polynomial_PolynomialRingElement_f0
libcrux_ml_kem_serialize_deserialize_to_reduced_ring_element_4c(Eurydice_slice serialized)9351 libcrux_ml_kem_serialize_deserialize_to_reduced_ring_element_4c(
9352 Eurydice_slice serialized) {
9353 libcrux_ml_kem_polynomial_PolynomialRingElement_f0 re =
9354 libcrux_ml_kem_polynomial_ZERO_89_ea();
9355 for (size_t i = (size_t)0U;
9356 i < Eurydice_slice_len(serialized, uint8_t) / (size_t)24U; i++) {
9357 size_t i0 = i;
9358 Eurydice_slice bytes = Eurydice_slice_subslice2(
9359 serialized, i0 * (size_t)24U, i0 * (size_t)24U + (size_t)24U, uint8_t);
9360 libcrux_ml_kem_vector_portable_vector_type_PortableVector coefficient =
9361 libcrux_ml_kem_vector_portable_deserialize_12_0d(bytes);
9362 libcrux_ml_kem_vector_portable_vector_type_PortableVector uu____0 =
9363 libcrux_ml_kem_vector_portable_cond_subtract_3329_0d(coefficient);
9364 re.coefficients[i0] = uu____0;
9365 }
9366 return re;
9367 }
9368
9369 /**
9370 This function deserializes ring elements and reduces the result by the field
9371 modulus.
9372
9373 This function MUST NOT be used on secret inputs.
9374 */
9375 /**
9376 A monomorphic instance of
9377 libcrux_ml_kem.serialize.deserialize_ring_elements_reduced with types
9378 libcrux_ml_kem_vector_portable_vector_type_PortableVector with const generics
9379 - PUBLIC_KEY_SIZE= 1152
9380 - K= 3
9381 */
9382 static KRML_MUSTINLINE void
libcrux_ml_kem_serialize_deserialize_ring_elements_reduced_33(Eurydice_slice public_key,libcrux_ml_kem_polynomial_PolynomialRingElement_f0 ret[3U])9383 libcrux_ml_kem_serialize_deserialize_ring_elements_reduced_33(
9384 Eurydice_slice public_key,
9385 libcrux_ml_kem_polynomial_PolynomialRingElement_f0 ret[3U]) {
9386 libcrux_ml_kem_polynomial_PolynomialRingElement_f0 deserialized_pk[3U];
9387 for (size_t i = (size_t)0U; i < (size_t)3U; i++) {
9388 deserialized_pk[i] = libcrux_ml_kem_polynomial_ZERO_89_ea();
9389 }
9390 for (size_t i = (size_t)0U;
9391 i < Eurydice_slice_len(public_key, uint8_t) /
9392 LIBCRUX_ML_KEM_CONSTANTS_BYTES_PER_RING_ELEMENT;
9393 i++) {
9394 size_t i0 = i;
9395 Eurydice_slice ring_element = Eurydice_slice_subslice2(
9396 public_key, i0 * LIBCRUX_ML_KEM_CONSTANTS_BYTES_PER_RING_ELEMENT,
9397 i0 * LIBCRUX_ML_KEM_CONSTANTS_BYTES_PER_RING_ELEMENT +
9398 LIBCRUX_ML_KEM_CONSTANTS_BYTES_PER_RING_ELEMENT,
9399 uint8_t);
9400 libcrux_ml_kem_polynomial_PolynomialRingElement_f0 uu____0 =
9401 libcrux_ml_kem_serialize_deserialize_to_reduced_ring_element_4c(
9402 ring_element);
9403 deserialized_pk[i0] = uu____0;
9404 }
9405 memcpy(
9406 ret, deserialized_pk,
9407 (size_t)3U * sizeof(libcrux_ml_kem_polynomial_PolynomialRingElement_f0));
9408 }
9409
9410 /**
9411 A monomorphic instance of libcrux_ml_kem.matrix.sample_matrix_A.closure.closure
9412 with types libcrux_ml_kem_vector_portable_vector_type_PortableVector,
9413 libcrux_ml_kem_hash_functions_portable_PortableHash[[$3size_t]] with const
9414 generics
9415 - K= 3
9416 */
9417 static inline libcrux_ml_kem_polynomial_PolynomialRingElement_f0
libcrux_ml_kem_matrix_sample_matrix_A_closure_closure_78(size_t _j)9418 libcrux_ml_kem_matrix_sample_matrix_A_closure_closure_78(size_t _j) {
9419 return libcrux_ml_kem_polynomial_ZERO_89_ea();
9420 }
9421
9422 /**
9423 A monomorphic instance of libcrux_ml_kem.matrix.sample_matrix_A.closure
9424 with types libcrux_ml_kem_vector_portable_vector_type_PortableVector,
9425 libcrux_ml_kem_hash_functions_portable_PortableHash[[$3size_t]] with const
9426 generics
9427 - K= 3
9428 */
libcrux_ml_kem_matrix_sample_matrix_A_closure_4b(size_t _i,libcrux_ml_kem_polynomial_PolynomialRingElement_f0 ret[3U])9429 static inline void libcrux_ml_kem_matrix_sample_matrix_A_closure_4b(
9430 size_t _i, libcrux_ml_kem_polynomial_PolynomialRingElement_f0 ret[3U]) {
9431 for (size_t i = (size_t)0U; i < (size_t)3U; i++) {
9432 ret[i] = libcrux_ml_kem_polynomial_ZERO_89_ea();
9433 }
9434 }
9435
9436 /**
9437 A monomorphic instance of libcrux_ml_kem.hash_functions.portable.PortableHash
9438 with const generics
9439 - $3size_t
9440 */
9441 typedef struct libcrux_ml_kem_hash_functions_portable_PortableHash_58_s {
9442 libcrux_sha3_generic_keccak_KeccakState_48 shake128_state[3U];
9443 } libcrux_ml_kem_hash_functions_portable_PortableHash_58;
9444
9445 /**
9446 A monomorphic instance of
9447 libcrux_ml_kem.hash_functions.portable.shake128_init_absorb with const generics
9448 - K= 3
9449 */
9450 static KRML_MUSTINLINE libcrux_ml_kem_hash_functions_portable_PortableHash_58
libcrux_ml_kem_hash_functions_portable_shake128_init_absorb_b7(uint8_t input[3U][34U])9451 libcrux_ml_kem_hash_functions_portable_shake128_init_absorb_b7(
9452 uint8_t input[3U][34U]) {
9453 libcrux_sha3_generic_keccak_KeccakState_48 shake128_state[3U];
9454 for (size_t i = (size_t)0U; i < (size_t)3U; i++) {
9455 shake128_state[i] = libcrux_sha3_portable_incremental_shake128_init();
9456 }
9457 for (size_t i = (size_t)0U; i < (size_t)3U; i++) {
9458 size_t i0 = i;
9459 libcrux_sha3_portable_incremental_shake128_absorb_final(
9460 &shake128_state[i0],
9461 Eurydice_array_to_slice((size_t)34U, input[i0], uint8_t));
9462 }
9463 /* Passing arrays by value in Rust generates a copy in C */
9464 libcrux_sha3_generic_keccak_KeccakState_48 copy_of_shake128_state[3U];
9465 memcpy(copy_of_shake128_state, shake128_state,
9466 (size_t)3U * sizeof(libcrux_sha3_generic_keccak_KeccakState_48));
9467 libcrux_ml_kem_hash_functions_portable_PortableHash_58 lit;
9468 memcpy(lit.shake128_state, copy_of_shake128_state,
9469 (size_t)3U * sizeof(libcrux_sha3_generic_keccak_KeccakState_48));
9470 return lit;
9471 }
9472
9473 /**
9474 This function found in impl {(libcrux_ml_kem::hash_functions::Hash<K> for
9475 libcrux_ml_kem::hash_functions::portable::PortableHash<K>)}
9476 */
9477 /**
9478 A monomorphic instance of
9479 libcrux_ml_kem.hash_functions.portable.shake128_init_absorb_f1 with const
9480 generics
9481 - K= 3
9482 */
9483 static KRML_MUSTINLINE libcrux_ml_kem_hash_functions_portable_PortableHash_58
libcrux_ml_kem_hash_functions_portable_shake128_init_absorb_f1_8c(uint8_t input[3U][34U])9484 libcrux_ml_kem_hash_functions_portable_shake128_init_absorb_f1_8c(
9485 uint8_t input[3U][34U]) {
9486 /* Passing arrays by value in Rust generates a copy in C */
9487 uint8_t copy_of_input[3U][34U];
9488 memcpy(copy_of_input, input, (size_t)3U * sizeof(uint8_t[34U]));
9489 return libcrux_ml_kem_hash_functions_portable_shake128_init_absorb_b7(
9490 copy_of_input);
9491 }
9492
9493 /**
9494 A monomorphic instance of
9495 libcrux_ml_kem.hash_functions.portable.shake128_squeeze_three_blocks with const
9496 generics
9497 - K= 3
9498 */
9499 static KRML_MUSTINLINE void
libcrux_ml_kem_hash_functions_portable_shake128_squeeze_three_blocks_ca(libcrux_ml_kem_hash_functions_portable_PortableHash_58 * st,uint8_t ret[3U][504U])9500 libcrux_ml_kem_hash_functions_portable_shake128_squeeze_three_blocks_ca(
9501 libcrux_ml_kem_hash_functions_portable_PortableHash_58 *st,
9502 uint8_t ret[3U][504U]) {
9503 uint8_t out[3U][504U] = {{0U}};
9504 for (size_t i = (size_t)0U; i < (size_t)3U; i++) {
9505 size_t i0 = i;
9506 libcrux_sha3_portable_incremental_shake128_squeeze_first_three_blocks(
9507 &st->shake128_state[i0],
9508 Eurydice_array_to_slice((size_t)504U, out[i0], uint8_t));
9509 }
9510 memcpy(ret, out, (size_t)3U * sizeof(uint8_t[504U]));
9511 }
9512
9513 /**
9514 This function found in impl {(libcrux_ml_kem::hash_functions::Hash<K> for
9515 libcrux_ml_kem::hash_functions::portable::PortableHash<K>)}
9516 */
9517 /**
9518 A monomorphic instance of
9519 libcrux_ml_kem.hash_functions.portable.shake128_squeeze_three_blocks_f1 with
9520 const generics
9521 - K= 3
9522 */
9523 static KRML_MUSTINLINE void
libcrux_ml_kem_hash_functions_portable_shake128_squeeze_three_blocks_f1_69(libcrux_ml_kem_hash_functions_portable_PortableHash_58 * self,uint8_t ret[3U][504U])9524 libcrux_ml_kem_hash_functions_portable_shake128_squeeze_three_blocks_f1_69(
9525 libcrux_ml_kem_hash_functions_portable_PortableHash_58 *self,
9526 uint8_t ret[3U][504U]) {
9527 libcrux_ml_kem_hash_functions_portable_shake128_squeeze_three_blocks_ca(self,
9528 ret);
9529 }
9530
9531 /**
9532 If `bytes` contains a set of uniformly random bytes, this function
9533 uniformly samples a ring element `â` that is treated as being the NTT
9534 representation of the corresponding polynomial `a`.
9535
9536 Since rejection sampling is used, it is possible the supplied bytes are
9537 not enough to sample the element, in which case an `Err` is returned and the
9538 caller must try again with a fresh set of bytes.
9539
9540 This function <strong>partially</strong> implements <strong>Algorithm
9541 6</strong> of the NIST FIPS 203 standard, We say "partially" because this
9542 implementation only accepts a finite set of bytes as input and returns an error
9543 if the set is not enough; Algorithm 6 of the FIPS 203 standard on the other
9544 hand samples from an infinite stream of bytes until the ring element is filled.
9545 Algorithm 6 is reproduced below:
9546
9547 ```plaintext
9548 Input: byte stream B ∈ *.
9549 Output: array â ∈ ℤ₂₅₆.
9550
9551 i ← 0
9552 j ← 0
9553 while j < 256 do
9554 d₁ ← B[i] + 256·(B[i+1] mod 16)
9555 d₂ ← ⌊B[i+1]/16⌋ + 16·B[i+2]
9556 if d₁ < q then
9557 â[j] ← d₁
9558 j ← j + 1
9559 end if
9560 if d₂ < q and j < 256 then
9561 â[j] ← d₂
9562 j ← j + 1
9563 end if
9564 i ← i + 3
9565 end while
9566 return â
9567 ```
9568
9569 The NIST FIPS 203 standard can be found at
9570 <https://csrc.nist.gov/pubs/fips/203/ipd>.
9571 */
9572 /**
9573 A monomorphic instance of
9574 libcrux_ml_kem.sampling.sample_from_uniform_distribution_next with types
9575 libcrux_ml_kem_vector_portable_vector_type_PortableVector with const generics
9576 - K= 3
9577 - N= 504
9578 */
9579 static KRML_MUSTINLINE bool
libcrux_ml_kem_sampling_sample_from_uniform_distribution_next_db(uint8_t randomness[3U][504U],size_t * sampled_coefficients,int16_t (* out)[272U])9580 libcrux_ml_kem_sampling_sample_from_uniform_distribution_next_db(
9581 uint8_t randomness[3U][504U], size_t *sampled_coefficients,
9582 int16_t (*out)[272U]) {
9583 for (size_t i0 = (size_t)0U; i0 < (size_t)3U; i0++) {
9584 size_t i1 = i0;
9585 for (size_t i = (size_t)0U; i < (size_t)504U / (size_t)24U; i++) {
9586 size_t r = i;
9587 if (sampled_coefficients[i1] <
9588 LIBCRUX_ML_KEM_CONSTANTS_COEFFICIENTS_IN_RING_ELEMENT) {
9589 Eurydice_slice uu____0 =
9590 Eurydice_array_to_subslice2(randomness[i1], r * (size_t)24U,
9591 r * (size_t)24U + (size_t)24U, uint8_t);
9592 size_t sampled = libcrux_ml_kem_vector_portable_rej_sample_0d(
9593 uu____0, Eurydice_array_to_subslice2(
9594 out[i1], sampled_coefficients[i1],
9595 sampled_coefficients[i1] + (size_t)16U, int16_t));
9596 size_t uu____1 = i1;
9597 sampled_coefficients[uu____1] = sampled_coefficients[uu____1] + sampled;
9598 }
9599 }
9600 }
9601 bool done = true;
9602 for (size_t i = (size_t)0U; i < (size_t)3U; i++) {
9603 size_t i0 = i;
9604 if (sampled_coefficients[i0] >=
9605 LIBCRUX_ML_KEM_CONSTANTS_COEFFICIENTS_IN_RING_ELEMENT) {
9606 sampled_coefficients[i0] =
9607 LIBCRUX_ML_KEM_CONSTANTS_COEFFICIENTS_IN_RING_ELEMENT;
9608 } else {
9609 done = false;
9610 }
9611 }
9612 return done;
9613 }
9614
9615 /**
9616 A monomorphic instance of
9617 libcrux_ml_kem.hash_functions.portable.shake128_squeeze_block with const
9618 generics
9619 - K= 3
9620 */
9621 static KRML_MUSTINLINE void
libcrux_ml_kem_hash_functions_portable_shake128_squeeze_block_dd(libcrux_ml_kem_hash_functions_portable_PortableHash_58 * st,uint8_t ret[3U][168U])9622 libcrux_ml_kem_hash_functions_portable_shake128_squeeze_block_dd(
9623 libcrux_ml_kem_hash_functions_portable_PortableHash_58 *st,
9624 uint8_t ret[3U][168U]) {
9625 uint8_t out[3U][168U] = {{0U}};
9626 for (size_t i = (size_t)0U; i < (size_t)3U; i++) {
9627 size_t i0 = i;
9628 libcrux_sha3_portable_incremental_shake128_squeeze_next_block(
9629 &st->shake128_state[i0],
9630 Eurydice_array_to_slice((size_t)168U, out[i0], uint8_t));
9631 }
9632 memcpy(ret, out, (size_t)3U * sizeof(uint8_t[168U]));
9633 }
9634
9635 /**
9636 This function found in impl {(libcrux_ml_kem::hash_functions::Hash<K> for
9637 libcrux_ml_kem::hash_functions::portable::PortableHash<K>)}
9638 */
9639 /**
9640 A monomorphic instance of
9641 libcrux_ml_kem.hash_functions.portable.shake128_squeeze_block_f1 with const
9642 generics
9643 - K= 3
9644 */
9645 static KRML_MUSTINLINE void
libcrux_ml_kem_hash_functions_portable_shake128_squeeze_block_f1_60(libcrux_ml_kem_hash_functions_portable_PortableHash_58 * self,uint8_t ret[3U][168U])9646 libcrux_ml_kem_hash_functions_portable_shake128_squeeze_block_f1_60(
9647 libcrux_ml_kem_hash_functions_portable_PortableHash_58 *self,
9648 uint8_t ret[3U][168U]) {
9649 libcrux_ml_kem_hash_functions_portable_shake128_squeeze_block_dd(self, ret);
9650 }
9651
9652 /**
9653 If `bytes` contains a set of uniformly random bytes, this function
9654 uniformly samples a ring element `â` that is treated as being the NTT
9655 representation of the corresponding polynomial `a`.
9656
9657 Since rejection sampling is used, it is possible the supplied bytes are
9658 not enough to sample the element, in which case an `Err` is returned and the
9659 caller must try again with a fresh set of bytes.
9660
9661 This function <strong>partially</strong> implements <strong>Algorithm
9662 6</strong> of the NIST FIPS 203 standard, We say "partially" because this
9663 implementation only accepts a finite set of bytes as input and returns an error
9664 if the set is not enough; Algorithm 6 of the FIPS 203 standard on the other
9665 hand samples from an infinite stream of bytes until the ring element is filled.
9666 Algorithm 6 is reproduced below:
9667
9668 ```plaintext
9669 Input: byte stream B ∈ *.
9670 Output: array â ∈ ℤ₂₅₆.
9671
9672 i ← 0
9673 j ← 0
9674 while j < 256 do
9675 d₁ ← B[i] + 256·(B[i+1] mod 16)
9676 d₂ ← ⌊B[i+1]/16⌋ + 16·B[i+2]
9677 if d₁ < q then
9678 â[j] ← d₁
9679 j ← j + 1
9680 end if
9681 if d₂ < q and j < 256 then
9682 â[j] ← d₂
9683 j ← j + 1
9684 end if
9685 i ← i + 3
9686 end while
9687 return â
9688 ```
9689
9690 The NIST FIPS 203 standard can be found at
9691 <https://csrc.nist.gov/pubs/fips/203/ipd>.
9692 */
9693 /**
9694 A monomorphic instance of
9695 libcrux_ml_kem.sampling.sample_from_uniform_distribution_next with types
9696 libcrux_ml_kem_vector_portable_vector_type_PortableVector with const generics
9697 - K= 3
9698 - N= 168
9699 */
9700 static KRML_MUSTINLINE bool
libcrux_ml_kem_sampling_sample_from_uniform_distribution_next_db0(uint8_t randomness[3U][168U],size_t * sampled_coefficients,int16_t (* out)[272U])9701 libcrux_ml_kem_sampling_sample_from_uniform_distribution_next_db0(
9702 uint8_t randomness[3U][168U], size_t *sampled_coefficients,
9703 int16_t (*out)[272U]) {
9704 for (size_t i0 = (size_t)0U; i0 < (size_t)3U; i0++) {
9705 size_t i1 = i0;
9706 for (size_t i = (size_t)0U; i < (size_t)168U / (size_t)24U; i++) {
9707 size_t r = i;
9708 if (sampled_coefficients[i1] <
9709 LIBCRUX_ML_KEM_CONSTANTS_COEFFICIENTS_IN_RING_ELEMENT) {
9710 Eurydice_slice uu____0 =
9711 Eurydice_array_to_subslice2(randomness[i1], r * (size_t)24U,
9712 r * (size_t)24U + (size_t)24U, uint8_t);
9713 size_t sampled = libcrux_ml_kem_vector_portable_rej_sample_0d(
9714 uu____0, Eurydice_array_to_subslice2(
9715 out[i1], sampled_coefficients[i1],
9716 sampled_coefficients[i1] + (size_t)16U, int16_t));
9717 size_t uu____1 = i1;
9718 sampled_coefficients[uu____1] = sampled_coefficients[uu____1] + sampled;
9719 }
9720 }
9721 }
9722 bool done = true;
9723 for (size_t i = (size_t)0U; i < (size_t)3U; i++) {
9724 size_t i0 = i;
9725 if (sampled_coefficients[i0] >=
9726 LIBCRUX_ML_KEM_CONSTANTS_COEFFICIENTS_IN_RING_ELEMENT) {
9727 sampled_coefficients[i0] =
9728 LIBCRUX_ML_KEM_CONSTANTS_COEFFICIENTS_IN_RING_ELEMENT;
9729 } else {
9730 done = false;
9731 }
9732 }
9733 return done;
9734 }
9735
9736 /**
9737 This function found in impl
9738 {libcrux_ml_kem::polynomial::PolynomialRingElement<Vector>[TraitClause@0]}
9739 */
9740 /**
9741 A monomorphic instance of libcrux_ml_kem.polynomial.from_i16_array_89
9742 with types libcrux_ml_kem_vector_portable_vector_type_PortableVector
9743 with const generics
9744
9745 */
9746 static KRML_MUSTINLINE libcrux_ml_kem_polynomial_PolynomialRingElement_f0
libcrux_ml_kem_polynomial_from_i16_array_89_c1(Eurydice_slice a)9747 libcrux_ml_kem_polynomial_from_i16_array_89_c1(Eurydice_slice a) {
9748 libcrux_ml_kem_polynomial_PolynomialRingElement_f0 result =
9749 libcrux_ml_kem_polynomial_ZERO_89_ea();
9750 for (size_t i = (size_t)0U;
9751 i < LIBCRUX_ML_KEM_POLYNOMIAL_VECTORS_IN_RING_ELEMENT; i++) {
9752 size_t i0 = i;
9753 libcrux_ml_kem_vector_portable_vector_type_PortableVector uu____0 =
9754 libcrux_ml_kem_vector_portable_from_i16_array_0d(
9755 Eurydice_slice_subslice2(a, i0 * (size_t)16U,
9756 (i0 + (size_t)1U) * (size_t)16U, int16_t));
9757 result.coefficients[i0] = uu____0;
9758 }
9759 return result;
9760 }
9761
9762 /**
9763 A monomorphic instance of libcrux_ml_kem.sampling.sample_from_xof.closure
9764 with types libcrux_ml_kem_vector_portable_vector_type_PortableVector,
9765 libcrux_ml_kem_hash_functions_portable_PortableHash[[$3size_t]] with const
9766 generics
9767 - K= 3
9768 */
9769 static inline libcrux_ml_kem_polynomial_PolynomialRingElement_f0
libcrux_ml_kem_sampling_sample_from_xof_closure_04(int16_t s[272U])9770 libcrux_ml_kem_sampling_sample_from_xof_closure_04(int16_t s[272U]) {
9771 return libcrux_ml_kem_polynomial_from_i16_array_89_c1(
9772 Eurydice_array_to_subslice2(s, (size_t)0U, (size_t)256U, int16_t));
9773 }
9774
9775 /**
9776 A monomorphic instance of libcrux_ml_kem.sampling.sample_from_xof
9777 with types libcrux_ml_kem_vector_portable_vector_type_PortableVector,
9778 libcrux_ml_kem_hash_functions_portable_PortableHash[[$3size_t]] with const
9779 generics
9780 - K= 3
9781 */
libcrux_ml_kem_sampling_sample_from_xof_3f(uint8_t seeds[3U][34U],libcrux_ml_kem_polynomial_PolynomialRingElement_f0 ret[3U])9782 static KRML_MUSTINLINE void libcrux_ml_kem_sampling_sample_from_xof_3f(
9783 uint8_t seeds[3U][34U],
9784 libcrux_ml_kem_polynomial_PolynomialRingElement_f0 ret[3U]) {
9785 size_t sampled_coefficients[3U] = {0U};
9786 int16_t out[3U][272U] = {{0U}};
9787 /* Passing arrays by value in Rust generates a copy in C */
9788 uint8_t copy_of_seeds[3U][34U];
9789 memcpy(copy_of_seeds, seeds, (size_t)3U * sizeof(uint8_t[34U]));
9790 libcrux_ml_kem_hash_functions_portable_PortableHash_58 xof_state =
9791 libcrux_ml_kem_hash_functions_portable_shake128_init_absorb_f1_8c(
9792 copy_of_seeds);
9793 uint8_t randomness0[3U][504U];
9794 libcrux_ml_kem_hash_functions_portable_shake128_squeeze_three_blocks_f1_69(
9795 &xof_state, randomness0);
9796 /* Passing arrays by value in Rust generates a copy in C */
9797 uint8_t copy_of_randomness0[3U][504U];
9798 memcpy(copy_of_randomness0, randomness0, (size_t)3U * sizeof(uint8_t[504U]));
9799 bool done = libcrux_ml_kem_sampling_sample_from_uniform_distribution_next_db(
9800 copy_of_randomness0, sampled_coefficients, out);
9801 while (true) {
9802 if (done) {
9803 break;
9804 } else {
9805 uint8_t randomness[3U][168U];
9806 libcrux_ml_kem_hash_functions_portable_shake128_squeeze_block_f1_60(
9807 &xof_state, randomness);
9808 /* Passing arrays by value in Rust generates a copy in C */
9809 uint8_t copy_of_randomness[3U][168U];
9810 memcpy(copy_of_randomness, randomness,
9811 (size_t)3U * sizeof(uint8_t[168U]));
9812 done = libcrux_ml_kem_sampling_sample_from_uniform_distribution_next_db0(
9813 copy_of_randomness, sampled_coefficients, out);
9814 }
9815 }
9816 /* Passing arrays by value in Rust generates a copy in C */
9817 int16_t copy_of_out[3U][272U];
9818 memcpy(copy_of_out, out, (size_t)3U * sizeof(int16_t[272U]));
9819 libcrux_ml_kem_polynomial_PolynomialRingElement_f0 ret0[3U];
9820 for (size_t i = (size_t)0U; i < (size_t)3U; i++) {
9821 ret0[i] =
9822 libcrux_ml_kem_sampling_sample_from_xof_closure_04(copy_of_out[i]);
9823 }
9824 memcpy(
9825 ret, ret0,
9826 (size_t)3U * sizeof(libcrux_ml_kem_polynomial_PolynomialRingElement_f0));
9827 }
9828
9829 /**
9830 A monomorphic instance of libcrux_ml_kem.matrix.sample_matrix_A
9831 with types libcrux_ml_kem_vector_portable_vector_type_PortableVector,
9832 libcrux_ml_kem_hash_functions_portable_PortableHash[[$3size_t]] with const
9833 generics
9834 - K= 3
9835 */
libcrux_ml_kem_matrix_sample_matrix_A_38(uint8_t seed[34U],bool transpose,libcrux_ml_kem_polynomial_PolynomialRingElement_f0 ret[3U][3U])9836 static KRML_MUSTINLINE void libcrux_ml_kem_matrix_sample_matrix_A_38(
9837 uint8_t seed[34U], bool transpose,
9838 libcrux_ml_kem_polynomial_PolynomialRingElement_f0 ret[3U][3U]) {
9839 libcrux_ml_kem_polynomial_PolynomialRingElement_f0 A_transpose[3U][3U];
9840 for (size_t i = (size_t)0U; i < (size_t)3U; i++) {
9841 libcrux_ml_kem_matrix_sample_matrix_A_closure_4b(i, A_transpose[i]);
9842 }
9843 for (size_t i0 = (size_t)0U; i0 < (size_t)3U; i0++) {
9844 size_t i1 = i0;
9845 /* Passing arrays by value in Rust generates a copy in C */
9846 uint8_t copy_of_seed[34U];
9847 memcpy(copy_of_seed, seed, (size_t)34U * sizeof(uint8_t));
9848 uint8_t seeds[3U][34U];
9849 for (size_t i = (size_t)0U; i < (size_t)3U; i++) {
9850 memcpy(seeds[i], copy_of_seed, (size_t)34U * sizeof(uint8_t));
9851 }
9852 for (size_t i = (size_t)0U; i < (size_t)3U; i++) {
9853 size_t j = i;
9854 seeds[j][32U] = (uint8_t)i1;
9855 seeds[j][33U] = (uint8_t)j;
9856 }
9857 /* Passing arrays by value in Rust generates a copy in C */
9858 uint8_t copy_of_seeds[3U][34U];
9859 memcpy(copy_of_seeds, seeds, (size_t)3U * sizeof(uint8_t[34U]));
9860 libcrux_ml_kem_polynomial_PolynomialRingElement_f0 sampled[3U];
9861 libcrux_ml_kem_sampling_sample_from_xof_3f(copy_of_seeds, sampled);
9862 for (size_t i = (size_t)0U;
9863 i < Eurydice_slice_len(
9864 Eurydice_array_to_slice(
9865 (size_t)3U, sampled,
9866 libcrux_ml_kem_polynomial_PolynomialRingElement_f0),
9867 libcrux_ml_kem_polynomial_PolynomialRingElement_f0);
9868 i++) {
9869 size_t j = i;
9870 libcrux_ml_kem_polynomial_PolynomialRingElement_f0 sample = sampled[j];
9871 if (transpose) {
9872 A_transpose[j][i1] = sample;
9873 } else {
9874 A_transpose[i1][j] = sample;
9875 }
9876 }
9877 }
9878 memcpy(ret, A_transpose,
9879 (size_t)3U *
9880 sizeof(libcrux_ml_kem_polynomial_PolynomialRingElement_f0[3U]));
9881 }
9882
9883 /**
9884 A monomorphic instance of K.
9885 with types libcrux_ml_kem_polynomial_PolynomialRingElement
9886 libcrux_ml_kem_vector_portable_vector_type_PortableVector[3size_t], uint8_t
9887
9888 */
9889 typedef struct tuple_b0_s {
9890 libcrux_ml_kem_polynomial_PolynomialRingElement_f0 fst[3U];
9891 uint8_t snd;
9892 } tuple_b0;
9893
9894 /**
9895 A monomorphic instance of
9896 libcrux_ml_kem.ind_cpa.sample_vector_cbd_then_ntt.closure with types
9897 libcrux_ml_kem_vector_portable_vector_type_PortableVector,
9898 libcrux_ml_kem_hash_functions_portable_PortableHash[[$3size_t]] with const
9899 generics
9900 - K= 3
9901 - ETA= 2
9902 - ETA_RANDOMNESS_SIZE= 128
9903 */
9904 static inline libcrux_ml_kem_polynomial_PolynomialRingElement_f0
libcrux_ml_kem_ind_cpa_sample_vector_cbd_then_ntt_closure_f7(size_t _i)9905 libcrux_ml_kem_ind_cpa_sample_vector_cbd_then_ntt_closure_f7(size_t _i) {
9906 return libcrux_ml_kem_polynomial_ZERO_89_ea();
9907 }
9908
9909 /**
9910 A monomorphic instance of libcrux_ml_kem.hash_functions.portable.PRFxN
9911 with const generics
9912 - K= 3
9913 - LEN= 128
9914 */
libcrux_ml_kem_hash_functions_portable_PRFxN_c5(uint8_t (* input)[33U],uint8_t ret[3U][128U])9915 static KRML_MUSTINLINE void libcrux_ml_kem_hash_functions_portable_PRFxN_c5(
9916 uint8_t (*input)[33U], uint8_t ret[3U][128U]) {
9917 uint8_t out[3U][128U] = {{0U}};
9918 for (size_t i = (size_t)0U; i < (size_t)3U; i++) {
9919 size_t i0 = i;
9920 libcrux_sha3_portable_shake256(
9921 Eurydice_array_to_slice((size_t)128U, out[i0], uint8_t),
9922 Eurydice_array_to_slice((size_t)33U, input[i0], uint8_t));
9923 }
9924 memcpy(ret, out, (size_t)3U * sizeof(uint8_t[128U]));
9925 }
9926
9927 /**
9928 This function found in impl {(libcrux_ml_kem::hash_functions::Hash<K> for
9929 libcrux_ml_kem::hash_functions::portable::PortableHash<K>)}
9930 */
9931 /**
9932 A monomorphic instance of libcrux_ml_kem.hash_functions.portable.PRFxN_f1
9933 with const generics
9934 - K= 3
9935 - LEN= 128
9936 */
libcrux_ml_kem_hash_functions_portable_PRFxN_f1_93(uint8_t (* input)[33U],uint8_t ret[3U][128U])9937 static KRML_MUSTINLINE void libcrux_ml_kem_hash_functions_portable_PRFxN_f1_93(
9938 uint8_t (*input)[33U], uint8_t ret[3U][128U]) {
9939 libcrux_ml_kem_hash_functions_portable_PRFxN_c5(input, ret);
9940 }
9941
9942 /**
9943 Given a series of uniformly random bytes in `randomness`, for some number
9944 `eta`, the `sample_from_binomial_distribution_{eta}` functions sample a ring
9945 element from a binomial distribution centered at 0 that uses two sets of `eta`
9946 coin flips. If, for example, `eta = ETA`, each ring coefficient is a value `v`
9947 such such that `v ∈ {-ETA, -ETA + 1, ..., 0, ..., ETA + 1, ETA}` and:
9948
9949 ```plaintext
9950 - If v < 0, Pr[v] = Pr[-v]
9951 - If v >= 0, Pr[v] = BINOMIAL_COEFFICIENT(2 * ETA; ETA - v) / 2 ^ (2 * ETA)
9952 ```
9953
9954 The values `v < 0` are mapped to the appropriate `KyberFieldElement`.
9955
9956 The expected value is:
9957
9958 ```plaintext
9959 E[X] = (-ETA)Pr[-ETA] + (-(ETA - 1))Pr[-(ETA - 1)] + ... + (ETA - 1)Pr[ETA - 1]
9960 + (ETA)Pr[ETA] = 0 since Pr[-v] = Pr[v] when v < 0.
9961 ```
9962
9963 And the variance is:
9964
9965 ```plaintext
9966 Var(X) = E[(X - E[X])^2]
9967 = E[X^2]
9968 = sum_(v=-ETA to ETA)v^2 * (BINOMIAL_COEFFICIENT(2 * ETA; ETA - v) /
9969 2^(2 * ETA)) = ETA / 2
9970 ```
9971
9972 This function implements <strong>Algorithm 7</strong> of the NIST FIPS 203
9973 standard, which is reproduced below:
9974
9975 ```plaintext
9976 Input: byte array B ∈ ^{64η}.
9977 Output: array f ∈ ℤ₂₅₆.
9978
9979 b ← BytesToBits(B)
9980 for (i ← 0; i < 256; i++)
9981 x ← ∑(j=0 to η - 1) b[2iη + j]
9982 y ← ∑(j=0 to η - 1) b[2iη + η + j]
9983 f[i] ← x−y mod q
9984 end for
9985 return f
9986 ```
9987
9988 The NIST FIPS 203 standard can be found at
9989 <https://csrc.nist.gov/pubs/fips/203/ipd>.
9990 */
9991 /**
9992 A monomorphic instance of
9993 libcrux_ml_kem.sampling.sample_from_binomial_distribution_2 with types
9994 libcrux_ml_kem_vector_portable_vector_type_PortableVector with const generics
9995
9996 */
9997 static KRML_MUSTINLINE libcrux_ml_kem_polynomial_PolynomialRingElement_f0
libcrux_ml_kem_sampling_sample_from_binomial_distribution_2_85(Eurydice_slice randomness)9998 libcrux_ml_kem_sampling_sample_from_binomial_distribution_2_85(
9999 Eurydice_slice randomness) {
10000 int16_t sampled_i16s[256U] = {0U};
10001 for (size_t i0 = (size_t)0U;
10002 i0 < Eurydice_slice_len(randomness, uint8_t) / (size_t)4U; i0++) {
10003 size_t chunk_number = i0;
10004 Eurydice_slice byte_chunk = Eurydice_slice_subslice2(
10005 randomness, chunk_number * (size_t)4U,
10006 chunk_number * (size_t)4U + (size_t)4U, uint8_t);
10007 uint32_t random_bits_as_u32 =
10008 (((uint32_t)Eurydice_slice_index(byte_chunk, (size_t)0U, uint8_t,
10009 uint8_t *) |
10010 (uint32_t)Eurydice_slice_index(byte_chunk, (size_t)1U, uint8_t,
10011 uint8_t *)
10012 << 8U) |
10013 (uint32_t)Eurydice_slice_index(byte_chunk, (size_t)2U, uint8_t,
10014 uint8_t *)
10015 << 16U) |
10016 (uint32_t)Eurydice_slice_index(byte_chunk, (size_t)3U, uint8_t,
10017 uint8_t *)
10018 << 24U;
10019 uint32_t even_bits = random_bits_as_u32 & 1431655765U;
10020 uint32_t odd_bits = random_bits_as_u32 >> 1U & 1431655765U;
10021 uint32_t coin_toss_outcomes = even_bits + odd_bits;
10022 for (uint32_t i = 0U; i < CORE_NUM__U32_8__BITS / 4U; i++) {
10023 uint32_t outcome_set = i;
10024 uint32_t outcome_set0 = outcome_set * 4U;
10025 int16_t outcome_1 =
10026 (int16_t)(coin_toss_outcomes >> (uint32_t)outcome_set0 & 3U);
10027 int16_t outcome_2 =
10028 (int16_t)(coin_toss_outcomes >> (uint32_t)(outcome_set0 + 2U) & 3U);
10029 size_t offset = (size_t)(outcome_set0 >> 2U);
10030 sampled_i16s[(size_t)8U * chunk_number + offset] = outcome_1 - outcome_2;
10031 }
10032 }
10033 return libcrux_ml_kem_polynomial_from_i16_array_89_c1(
10034 Eurydice_array_to_slice((size_t)256U, sampled_i16s, int16_t));
10035 }
10036
10037 /**
10038 A monomorphic instance of
10039 libcrux_ml_kem.sampling.sample_from_binomial_distribution_3 with types
10040 libcrux_ml_kem_vector_portable_vector_type_PortableVector with const generics
10041
10042 */
10043 static KRML_MUSTINLINE libcrux_ml_kem_polynomial_PolynomialRingElement_f0
libcrux_ml_kem_sampling_sample_from_binomial_distribution_3_eb(Eurydice_slice randomness)10044 libcrux_ml_kem_sampling_sample_from_binomial_distribution_3_eb(
10045 Eurydice_slice randomness) {
10046 int16_t sampled_i16s[256U] = {0U};
10047 for (size_t i0 = (size_t)0U;
10048 i0 < Eurydice_slice_len(randomness, uint8_t) / (size_t)3U; i0++) {
10049 size_t chunk_number = i0;
10050 Eurydice_slice byte_chunk = Eurydice_slice_subslice2(
10051 randomness, chunk_number * (size_t)3U,
10052 chunk_number * (size_t)3U + (size_t)3U, uint8_t);
10053 uint32_t random_bits_as_u24 =
10054 ((uint32_t)Eurydice_slice_index(byte_chunk, (size_t)0U, uint8_t,
10055 uint8_t *) |
10056 (uint32_t)Eurydice_slice_index(byte_chunk, (size_t)1U, uint8_t,
10057 uint8_t *)
10058 << 8U) |
10059 (uint32_t)Eurydice_slice_index(byte_chunk, (size_t)2U, uint8_t,
10060 uint8_t *)
10061 << 16U;
10062 uint32_t first_bits = random_bits_as_u24 & 2396745U;
10063 uint32_t second_bits = random_bits_as_u24 >> 1U & 2396745U;
10064 uint32_t third_bits = random_bits_as_u24 >> 2U & 2396745U;
10065 uint32_t coin_toss_outcomes = first_bits + second_bits + third_bits;
10066 for (int32_t i = (int32_t)0; i < (int32_t)24 / (int32_t)6; i++) {
10067 int32_t outcome_set = i;
10068 int32_t outcome_set0 = outcome_set * (int32_t)6;
10069 int16_t outcome_1 =
10070 (int16_t)(coin_toss_outcomes >> (uint32_t)outcome_set0 & 7U);
10071 int16_t outcome_2 = (int16_t)(coin_toss_outcomes >>
10072 (uint32_t)(outcome_set0 + (int32_t)3) &
10073 7U);
10074 size_t offset = (size_t)(outcome_set0 / (int32_t)6);
10075 sampled_i16s[(size_t)4U * chunk_number + offset] = outcome_1 - outcome_2;
10076 }
10077 }
10078 return libcrux_ml_kem_polynomial_from_i16_array_89_c1(
10079 Eurydice_array_to_slice((size_t)256U, sampled_i16s, int16_t));
10080 }
10081
10082 /**
10083 A monomorphic instance of
10084 libcrux_ml_kem.sampling.sample_from_binomial_distribution with types
10085 libcrux_ml_kem_vector_portable_vector_type_PortableVector with const generics
10086 - ETA= 2
10087 */
10088 static KRML_MUSTINLINE libcrux_ml_kem_polynomial_PolynomialRingElement_f0
libcrux_ml_kem_sampling_sample_from_binomial_distribution_c6(Eurydice_slice randomness)10089 libcrux_ml_kem_sampling_sample_from_binomial_distribution_c6(
10090 Eurydice_slice randomness) {
10091 return libcrux_ml_kem_sampling_sample_from_binomial_distribution_2_85(
10092 randomness);
10093 }
10094
10095 /**
10096 A monomorphic instance of libcrux_ml_kem.ntt.ntt_at_layer_7
10097 with types libcrux_ml_kem_vector_portable_vector_type_PortableVector
10098 with const generics
10099
10100 */
libcrux_ml_kem_ntt_ntt_at_layer_7_f4(libcrux_ml_kem_polynomial_PolynomialRingElement_f0 * re)10101 static KRML_MUSTINLINE void libcrux_ml_kem_ntt_ntt_at_layer_7_f4(
10102 libcrux_ml_kem_polynomial_PolynomialRingElement_f0 *re) {
10103 size_t step = LIBCRUX_ML_KEM_POLYNOMIAL_VECTORS_IN_RING_ELEMENT / (size_t)2U;
10104 for (size_t i = (size_t)0U; i < step; i++) {
10105 size_t j = i;
10106 libcrux_ml_kem_vector_portable_vector_type_PortableVector t =
10107 libcrux_ml_kem_vector_portable_multiply_by_constant_0d(
10108 re->coefficients[j + step], (int16_t)-1600);
10109 re->coefficients[j + step] =
10110 libcrux_ml_kem_vector_portable_sub_0d(re->coefficients[j], &t);
10111 libcrux_ml_kem_vector_portable_vector_type_PortableVector uu____1 =
10112 libcrux_ml_kem_vector_portable_add_0d(re->coefficients[j], &t);
10113 re->coefficients[j] = uu____1;
10114 }
10115 }
10116
10117 /**
10118 A monomorphic instance of libcrux_ml_kem.ntt.ntt_binomially_sampled_ring_element
10119 with types libcrux_ml_kem_vector_portable_vector_type_PortableVector
10120 with const generics
10121
10122 */
10123 static KRML_MUSTINLINE void
libcrux_ml_kem_ntt_ntt_binomially_sampled_ring_element_0f(libcrux_ml_kem_polynomial_PolynomialRingElement_f0 * re)10124 libcrux_ml_kem_ntt_ntt_binomially_sampled_ring_element_0f(
10125 libcrux_ml_kem_polynomial_PolynomialRingElement_f0 *re) {
10126 libcrux_ml_kem_ntt_ntt_at_layer_7_f4(re);
10127 size_t zeta_i = (size_t)1U;
10128 libcrux_ml_kem_ntt_ntt_at_layer_4_plus_51(&zeta_i, re, (size_t)6U,
10129 (size_t)3U);
10130 libcrux_ml_kem_ntt_ntt_at_layer_4_plus_51(&zeta_i, re, (size_t)5U,
10131 (size_t)3U);
10132 libcrux_ml_kem_ntt_ntt_at_layer_4_plus_51(&zeta_i, re, (size_t)4U,
10133 (size_t)3U);
10134 libcrux_ml_kem_ntt_ntt_at_layer_3_fd(&zeta_i, re, (size_t)3U, (size_t)3U);
10135 libcrux_ml_kem_ntt_ntt_at_layer_2_ad(&zeta_i, re, (size_t)2U, (size_t)3U);
10136 libcrux_ml_kem_ntt_ntt_at_layer_1_a2(&zeta_i, re, (size_t)1U, (size_t)3U);
10137 libcrux_ml_kem_polynomial_poly_barrett_reduce_89_8b(re);
10138 }
10139
10140 /**
10141 Sample a vector of ring elements from a centered binomial distribution and
10142 convert them into their NTT representations.
10143 */
10144 /**
10145 A monomorphic instance of libcrux_ml_kem.ind_cpa.sample_vector_cbd_then_ntt
10146 with types libcrux_ml_kem_vector_portable_vector_type_PortableVector,
10147 libcrux_ml_kem_hash_functions_portable_PortableHash[[$3size_t]] with const
10148 generics
10149 - K= 3
10150 - ETA= 2
10151 - ETA_RANDOMNESS_SIZE= 128
10152 */
10153 static KRML_MUSTINLINE tuple_b0
libcrux_ml_kem_ind_cpa_sample_vector_cbd_then_ntt_fc(uint8_t prf_input[33U],uint8_t domain_separator)10154 libcrux_ml_kem_ind_cpa_sample_vector_cbd_then_ntt_fc(uint8_t prf_input[33U],
10155 uint8_t domain_separator) {
10156 libcrux_ml_kem_polynomial_PolynomialRingElement_f0 re_as_ntt[3U];
10157 for (size_t i = (size_t)0U; i < (size_t)3U; i++) {
10158 re_as_ntt[i] = libcrux_ml_kem_polynomial_ZERO_89_ea();
10159 }
10160 /* Passing arrays by value in Rust generates a copy in C */
10161 uint8_t copy_of_prf_input[33U];
10162 memcpy(copy_of_prf_input, prf_input, (size_t)33U * sizeof(uint8_t));
10163 uint8_t prf_inputs[3U][33U];
10164 for (size_t i = (size_t)0U; i < (size_t)3U; i++) {
10165 memcpy(prf_inputs[i], copy_of_prf_input, (size_t)33U * sizeof(uint8_t));
10166 }
10167 for (size_t i = (size_t)0U; i < (size_t)3U; i++) {
10168 size_t i0 = i;
10169 prf_inputs[i0][32U] = domain_separator;
10170 domain_separator = (uint32_t)domain_separator + 1U;
10171 }
10172 uint8_t prf_outputs[3U][128U];
10173 libcrux_ml_kem_hash_functions_portable_PRFxN_f1_93(prf_inputs, prf_outputs);
10174 for (size_t i = (size_t)0U; i < (size_t)3U; i++) {
10175 size_t i0 = i;
10176 re_as_ntt[i0] =
10177 libcrux_ml_kem_sampling_sample_from_binomial_distribution_c6(
10178 Eurydice_array_to_slice((size_t)128U, prf_outputs[i0], uint8_t));
10179 libcrux_ml_kem_ntt_ntt_binomially_sampled_ring_element_0f(&re_as_ntt[i0]);
10180 }
10181 /* Passing arrays by value in Rust generates a copy in C */
10182 libcrux_ml_kem_polynomial_PolynomialRingElement_f0 copy_of_re_as_ntt[3U];
10183 memcpy(
10184 copy_of_re_as_ntt, re_as_ntt,
10185 (size_t)3U * sizeof(libcrux_ml_kem_polynomial_PolynomialRingElement_f0));
10186 tuple_b0 lit;
10187 memcpy(
10188 lit.fst, copy_of_re_as_ntt,
10189 (size_t)3U * sizeof(libcrux_ml_kem_polynomial_PolynomialRingElement_f0));
10190 lit.snd = domain_separator;
10191 return lit;
10192 }
10193
10194 /**
10195 A monomorphic instance of libcrux_ml_kem.ind_cpa.sample_ring_element_cbd.closure
10196 with types libcrux_ml_kem_vector_portable_vector_type_PortableVector,
10197 libcrux_ml_kem_hash_functions_portable_PortableHash[[$3size_t]] with const
10198 generics
10199 - K= 3
10200 - ETA2_RANDOMNESS_SIZE= 128
10201 - ETA2= 2
10202 */
10203 static inline libcrux_ml_kem_polynomial_PolynomialRingElement_f0
libcrux_ml_kem_ind_cpa_sample_ring_element_cbd_closure_77(size_t _i)10204 libcrux_ml_kem_ind_cpa_sample_ring_element_cbd_closure_77(size_t _i) {
10205 return libcrux_ml_kem_polynomial_ZERO_89_ea();
10206 }
10207
10208 /**
10209 Sample a vector of ring elements from a centered binomial distribution.
10210 */
10211 /**
10212 A monomorphic instance of libcrux_ml_kem.ind_cpa.sample_ring_element_cbd
10213 with types libcrux_ml_kem_vector_portable_vector_type_PortableVector,
10214 libcrux_ml_kem_hash_functions_portable_PortableHash[[$3size_t]] with const
10215 generics
10216 - K= 3
10217 - ETA2_RANDOMNESS_SIZE= 128
10218 - ETA2= 2
10219 */
10220 static KRML_MUSTINLINE tuple_b0
libcrux_ml_kem_ind_cpa_sample_ring_element_cbd_ac(uint8_t prf_input[33U],uint8_t domain_separator)10221 libcrux_ml_kem_ind_cpa_sample_ring_element_cbd_ac(uint8_t prf_input[33U],
10222 uint8_t domain_separator) {
10223 libcrux_ml_kem_polynomial_PolynomialRingElement_f0 error_1[3U];
10224 for (size_t i = (size_t)0U; i < (size_t)3U; i++) {
10225 error_1[i] = libcrux_ml_kem_polynomial_ZERO_89_ea();
10226 }
10227 /* Passing arrays by value in Rust generates a copy in C */
10228 uint8_t copy_of_prf_input[33U];
10229 memcpy(copy_of_prf_input, prf_input, (size_t)33U * sizeof(uint8_t));
10230 uint8_t prf_inputs[3U][33U];
10231 for (size_t i = (size_t)0U; i < (size_t)3U; i++) {
10232 memcpy(prf_inputs[i], copy_of_prf_input, (size_t)33U * sizeof(uint8_t));
10233 }
10234 for (size_t i = (size_t)0U; i < (size_t)3U; i++) {
10235 size_t i0 = i;
10236 prf_inputs[i0][32U] = domain_separator;
10237 domain_separator = (uint32_t)domain_separator + 1U;
10238 }
10239 uint8_t prf_outputs[3U][128U];
10240 libcrux_ml_kem_hash_functions_portable_PRFxN_f1_93(prf_inputs, prf_outputs);
10241 for (size_t i = (size_t)0U; i < (size_t)3U; i++) {
10242 size_t i0 = i;
10243 libcrux_ml_kem_polynomial_PolynomialRingElement_f0 uu____1 =
10244 libcrux_ml_kem_sampling_sample_from_binomial_distribution_c6(
10245 Eurydice_array_to_slice((size_t)128U, prf_outputs[i0], uint8_t));
10246 error_1[i0] = uu____1;
10247 }
10248 /* Passing arrays by value in Rust generates a copy in C */
10249 libcrux_ml_kem_polynomial_PolynomialRingElement_f0 copy_of_error_1[3U];
10250 memcpy(
10251 copy_of_error_1, error_1,
10252 (size_t)3U * sizeof(libcrux_ml_kem_polynomial_PolynomialRingElement_f0));
10253 tuple_b0 lit;
10254 memcpy(
10255 lit.fst, copy_of_error_1,
10256 (size_t)3U * sizeof(libcrux_ml_kem_polynomial_PolynomialRingElement_f0));
10257 lit.snd = domain_separator;
10258 return lit;
10259 }
10260
10261 /**
10262 A monomorphic instance of libcrux_ml_kem.hash_functions.portable.PRF
10263 with const generics
10264 - LEN= 128
10265 */
libcrux_ml_kem_hash_functions_portable_PRF_2b0(Eurydice_slice input,uint8_t ret[128U])10266 static KRML_MUSTINLINE void libcrux_ml_kem_hash_functions_portable_PRF_2b0(
10267 Eurydice_slice input, uint8_t ret[128U]) {
10268 uint8_t digest[128U] = {0U};
10269 libcrux_sha3_portable_shake256(
10270 Eurydice_array_to_slice((size_t)128U, digest, uint8_t), input);
10271 memcpy(ret, digest, (size_t)128U * sizeof(uint8_t));
10272 }
10273
10274 /**
10275 This function found in impl {(libcrux_ml_kem::hash_functions::Hash<K> for
10276 libcrux_ml_kem::hash_functions::portable::PortableHash<K>)}
10277 */
10278 /**
10279 A monomorphic instance of libcrux_ml_kem.hash_functions.portable.PRF_f1
10280 with const generics
10281 - K= 3
10282 - LEN= 128
10283 */
libcrux_ml_kem_hash_functions_portable_PRF_f1_ee0(Eurydice_slice input,uint8_t ret[128U])10284 static KRML_MUSTINLINE void libcrux_ml_kem_hash_functions_portable_PRF_f1_ee0(
10285 Eurydice_slice input, uint8_t ret[128U]) {
10286 libcrux_ml_kem_hash_functions_portable_PRF_2b0(input, ret);
10287 }
10288
10289 /**
10290 A monomorphic instance of libcrux_ml_kem.matrix.compute_vector_u.closure
10291 with types libcrux_ml_kem_vector_portable_vector_type_PortableVector
10292 with const generics
10293 - K= 3
10294 */
10295 static inline libcrux_ml_kem_polynomial_PolynomialRingElement_f0
libcrux_ml_kem_matrix_compute_vector_u_closure_d6(size_t _i)10296 libcrux_ml_kem_matrix_compute_vector_u_closure_d6(size_t _i) {
10297 return libcrux_ml_kem_polynomial_ZERO_89_ea();
10298 }
10299
10300 /**
10301 This function found in impl
10302 {libcrux_ml_kem::polynomial::PolynomialRingElement<Vector>[TraitClause@0]}
10303 */
10304 /**
10305 A monomorphic instance of libcrux_ml_kem.polynomial.add_error_reduce_89
10306 with types libcrux_ml_kem_vector_portable_vector_type_PortableVector
10307 with const generics
10308
10309 */
libcrux_ml_kem_polynomial_add_error_reduce_89_38(libcrux_ml_kem_polynomial_PolynomialRingElement_f0 * self,libcrux_ml_kem_polynomial_PolynomialRingElement_f0 * error)10310 static KRML_MUSTINLINE void libcrux_ml_kem_polynomial_add_error_reduce_89_38(
10311 libcrux_ml_kem_polynomial_PolynomialRingElement_f0 *self,
10312 libcrux_ml_kem_polynomial_PolynomialRingElement_f0 *error) {
10313 for (size_t i = (size_t)0U;
10314 i < LIBCRUX_ML_KEM_POLYNOMIAL_VECTORS_IN_RING_ELEMENT; i++) {
10315 size_t j = i;
10316 libcrux_ml_kem_vector_portable_vector_type_PortableVector
10317 coefficient_normal_form =
10318 libcrux_ml_kem_vector_portable_montgomery_multiply_by_constant_0d(
10319 self->coefficients[j], (int16_t)1441);
10320 libcrux_ml_kem_vector_portable_vector_type_PortableVector uu____0 =
10321 libcrux_ml_kem_vector_portable_barrett_reduce_0d(
10322 libcrux_ml_kem_vector_portable_add_0d(coefficient_normal_form,
10323 &error->coefficients[j]));
10324 self->coefficients[j] = uu____0;
10325 }
10326 }
10327
10328 /**
10329 Compute u := InvertNTT(Aᵀ ◦ r̂) + e₁
10330 */
10331 /**
10332 A monomorphic instance of libcrux_ml_kem.matrix.compute_vector_u
10333 with types libcrux_ml_kem_vector_portable_vector_type_PortableVector
10334 with const generics
10335 - K= 3
10336 */
libcrux_ml_kem_matrix_compute_vector_u_59(libcrux_ml_kem_polynomial_PolynomialRingElement_f0 (* a_as_ntt)[3U],libcrux_ml_kem_polynomial_PolynomialRingElement_f0 * r_as_ntt,libcrux_ml_kem_polynomial_PolynomialRingElement_f0 * error_1,libcrux_ml_kem_polynomial_PolynomialRingElement_f0 ret[3U])10337 static KRML_MUSTINLINE void libcrux_ml_kem_matrix_compute_vector_u_59(
10338 libcrux_ml_kem_polynomial_PolynomialRingElement_f0 (*a_as_ntt)[3U],
10339 libcrux_ml_kem_polynomial_PolynomialRingElement_f0 *r_as_ntt,
10340 libcrux_ml_kem_polynomial_PolynomialRingElement_f0 *error_1,
10341 libcrux_ml_kem_polynomial_PolynomialRingElement_f0 ret[3U]) {
10342 libcrux_ml_kem_polynomial_PolynomialRingElement_f0 result[3U];
10343 for (size_t i = (size_t)0U; i < (size_t)3U; i++) {
10344 result[i] = libcrux_ml_kem_polynomial_ZERO_89_ea();
10345 }
10346 for (size_t i0 = (size_t)0U;
10347 i0 < Eurydice_slice_len(
10348 Eurydice_array_to_slice(
10349 (size_t)3U, a_as_ntt,
10350 libcrux_ml_kem_polynomial_PolynomialRingElement_f0[3U]),
10351 libcrux_ml_kem_polynomial_PolynomialRingElement_f0[3U]);
10352 i0++) {
10353 size_t i1 = i0;
10354 libcrux_ml_kem_polynomial_PolynomialRingElement_f0 *row = a_as_ntt[i1];
10355 for (size_t i = (size_t)0U;
10356 i < Eurydice_slice_len(
10357 Eurydice_array_to_slice(
10358 (size_t)3U, row,
10359 libcrux_ml_kem_polynomial_PolynomialRingElement_f0),
10360 libcrux_ml_kem_polynomial_PolynomialRingElement_f0);
10361 i++) {
10362 size_t j = i;
10363 libcrux_ml_kem_polynomial_PolynomialRingElement_f0 *a_element = &row[j];
10364 libcrux_ml_kem_polynomial_PolynomialRingElement_f0 product =
10365 libcrux_ml_kem_polynomial_ntt_multiply_89_2a(a_element, &r_as_ntt[j]);
10366 libcrux_ml_kem_polynomial_add_to_ring_element_89_84(&result[i1],
10367 &product);
10368 }
10369 libcrux_ml_kem_invert_ntt_invert_ntt_montgomery_f6(&result[i1]);
10370 libcrux_ml_kem_polynomial_add_error_reduce_89_38(&result[i1], &error_1[i1]);
10371 }
10372 memcpy(
10373 ret, result,
10374 (size_t)3U * sizeof(libcrux_ml_kem_polynomial_PolynomialRingElement_f0));
10375 }
10376
10377 /**
10378 A monomorphic instance of libcrux_ml_kem.vector.traits.decompress_1
10379 with types libcrux_ml_kem_vector_portable_vector_type_PortableVector
10380 with const generics
10381
10382 */
10383 static inline libcrux_ml_kem_vector_portable_vector_type_PortableVector
libcrux_ml_kem_vector_traits_decompress_1_63(libcrux_ml_kem_vector_portable_vector_type_PortableVector v)10384 libcrux_ml_kem_vector_traits_decompress_1_63(
10385 libcrux_ml_kem_vector_portable_vector_type_PortableVector v) {
10386 libcrux_ml_kem_vector_portable_vector_type_PortableVector uu____0 =
10387 libcrux_ml_kem_vector_portable_ZERO_0d();
10388 return libcrux_ml_kem_vector_portable_bitwise_and_with_constant_0d(
10389 libcrux_ml_kem_vector_portable_sub_0d(uu____0, &v), (int16_t)1665);
10390 }
10391
10392 /**
10393 A monomorphic instance of
10394 libcrux_ml_kem.serialize.deserialize_then_decompress_message with types
10395 libcrux_ml_kem_vector_portable_vector_type_PortableVector with const generics
10396
10397 */
10398 static KRML_MUSTINLINE libcrux_ml_kem_polynomial_PolynomialRingElement_f0
libcrux_ml_kem_serialize_deserialize_then_decompress_message_0d(uint8_t serialized[32U])10399 libcrux_ml_kem_serialize_deserialize_then_decompress_message_0d(
10400 uint8_t serialized[32U]) {
10401 libcrux_ml_kem_polynomial_PolynomialRingElement_f0 re =
10402 libcrux_ml_kem_polynomial_ZERO_89_ea();
10403 for (size_t i = (size_t)0U; i < (size_t)16U; i++) {
10404 size_t i0 = i;
10405 libcrux_ml_kem_vector_portable_vector_type_PortableVector
10406 coefficient_compressed =
10407 libcrux_ml_kem_vector_portable_deserialize_1_0d(
10408 Eurydice_array_to_subslice2(serialized, (size_t)2U * i0,
10409 (size_t)2U * i0 + (size_t)2U,
10410 uint8_t));
10411 libcrux_ml_kem_vector_portable_vector_type_PortableVector uu____0 =
10412 libcrux_ml_kem_vector_traits_decompress_1_63(coefficient_compressed);
10413 re.coefficients[i0] = uu____0;
10414 }
10415 return re;
10416 }
10417
10418 /**
10419 This function found in impl
10420 {libcrux_ml_kem::polynomial::PolynomialRingElement<Vector>[TraitClause@0]}
10421 */
10422 /**
10423 A monomorphic instance of libcrux_ml_kem.polynomial.add_message_error_reduce_89
10424 with types libcrux_ml_kem_vector_portable_vector_type_PortableVector
10425 with const generics
10426
10427 */
10428 static KRML_MUSTINLINE libcrux_ml_kem_polynomial_PolynomialRingElement_f0
libcrux_ml_kem_polynomial_add_message_error_reduce_89_ea(libcrux_ml_kem_polynomial_PolynomialRingElement_f0 * self,libcrux_ml_kem_polynomial_PolynomialRingElement_f0 * message,libcrux_ml_kem_polynomial_PolynomialRingElement_f0 result)10429 libcrux_ml_kem_polynomial_add_message_error_reduce_89_ea(
10430 libcrux_ml_kem_polynomial_PolynomialRingElement_f0 *self,
10431 libcrux_ml_kem_polynomial_PolynomialRingElement_f0 *message,
10432 libcrux_ml_kem_polynomial_PolynomialRingElement_f0 result) {
10433 for (size_t i = (size_t)0U;
10434 i < LIBCRUX_ML_KEM_POLYNOMIAL_VECTORS_IN_RING_ELEMENT; i++) {
10435 size_t i0 = i;
10436 libcrux_ml_kem_vector_portable_vector_type_PortableVector
10437 coefficient_normal_form =
10438 libcrux_ml_kem_vector_portable_montgomery_multiply_by_constant_0d(
10439 result.coefficients[i0], (int16_t)1441);
10440 libcrux_ml_kem_vector_portable_vector_type_PortableVector tmp =
10441 libcrux_ml_kem_vector_portable_add_0d(self->coefficients[i0],
10442 &message->coefficients[i0]);
10443 libcrux_ml_kem_vector_portable_vector_type_PortableVector tmp0 =
10444 libcrux_ml_kem_vector_portable_add_0d(coefficient_normal_form, &tmp);
10445 libcrux_ml_kem_vector_portable_vector_type_PortableVector uu____0 =
10446 libcrux_ml_kem_vector_portable_barrett_reduce_0d(tmp0);
10447 result.coefficients[i0] = uu____0;
10448 }
10449 return result;
10450 }
10451
10452 /**
10453 Compute InverseNTT(tᵀ ◦ r̂) + e₂ + message
10454 */
10455 /**
10456 A monomorphic instance of libcrux_ml_kem.matrix.compute_ring_element_v
10457 with types libcrux_ml_kem_vector_portable_vector_type_PortableVector
10458 with const generics
10459 - K= 3
10460 */
10461 static KRML_MUSTINLINE libcrux_ml_kem_polynomial_PolynomialRingElement_f0
libcrux_ml_kem_matrix_compute_ring_element_v_54(libcrux_ml_kem_polynomial_PolynomialRingElement_f0 * t_as_ntt,libcrux_ml_kem_polynomial_PolynomialRingElement_f0 * r_as_ntt,libcrux_ml_kem_polynomial_PolynomialRingElement_f0 * error_2,libcrux_ml_kem_polynomial_PolynomialRingElement_f0 * message)10462 libcrux_ml_kem_matrix_compute_ring_element_v_54(
10463 libcrux_ml_kem_polynomial_PolynomialRingElement_f0 *t_as_ntt,
10464 libcrux_ml_kem_polynomial_PolynomialRingElement_f0 *r_as_ntt,
10465 libcrux_ml_kem_polynomial_PolynomialRingElement_f0 *error_2,
10466 libcrux_ml_kem_polynomial_PolynomialRingElement_f0 *message) {
10467 libcrux_ml_kem_polynomial_PolynomialRingElement_f0 result =
10468 libcrux_ml_kem_polynomial_ZERO_89_ea();
10469 for (size_t i = (size_t)0U; i < (size_t)3U; i++) {
10470 size_t i0 = i;
10471 libcrux_ml_kem_polynomial_PolynomialRingElement_f0 product =
10472 libcrux_ml_kem_polynomial_ntt_multiply_89_2a(&t_as_ntt[i0],
10473 &r_as_ntt[i0]);
10474 libcrux_ml_kem_polynomial_add_to_ring_element_89_84(&result, &product);
10475 }
10476 libcrux_ml_kem_invert_ntt_invert_ntt_montgomery_f6(&result);
10477 result = libcrux_ml_kem_polynomial_add_message_error_reduce_89_ea(
10478 error_2, message, result);
10479 return result;
10480 }
10481
10482 /**
10483 A monomorphic instance of libcrux_ml_kem.vector.portable.compress.compress
10484 with const generics
10485 - COEFFICIENT_BITS= 10
10486 */
10487 static KRML_MUSTINLINE libcrux_ml_kem_vector_portable_vector_type_PortableVector
libcrux_ml_kem_vector_portable_compress_compress_02(libcrux_ml_kem_vector_portable_vector_type_PortableVector v)10488 libcrux_ml_kem_vector_portable_compress_compress_02(
10489 libcrux_ml_kem_vector_portable_vector_type_PortableVector v) {
10490 for (size_t i = (size_t)0U;
10491 i < LIBCRUX_ML_KEM_VECTOR_TRAITS_FIELD_ELEMENTS_IN_VECTOR; i++) {
10492 size_t i0 = i;
10493 int16_t uu____0 =
10494 libcrux_ml_kem_vector_portable_compress_compress_ciphertext_coefficient(
10495 (uint8_t)(int32_t)10, (uint16_t)v.elements[i0]);
10496 v.elements[i0] = uu____0;
10497 }
10498 return v;
10499 }
10500
10501 /**
10502 This function found in impl {(libcrux_ml_kem::vector::traits::Operations for
10503 libcrux_ml_kem::vector::portable::vector_type::PortableVector)}
10504 */
10505 /**
10506 A monomorphic instance of libcrux_ml_kem.vector.portable.compress_0d
10507 with const generics
10508 - COEFFICIENT_BITS= 10
10509 */
10510 static inline libcrux_ml_kem_vector_portable_vector_type_PortableVector
libcrux_ml_kem_vector_portable_compress_0d_28(libcrux_ml_kem_vector_portable_vector_type_PortableVector v)10511 libcrux_ml_kem_vector_portable_compress_0d_28(
10512 libcrux_ml_kem_vector_portable_vector_type_PortableVector v) {
10513 return libcrux_ml_kem_vector_portable_compress_compress_02(v);
10514 }
10515
10516 /**
10517 A monomorphic instance of libcrux_ml_kem.serialize.compress_then_serialize_10
10518 with types libcrux_ml_kem_vector_portable_vector_type_PortableVector
10519 with const generics
10520 - OUT_LEN= 320
10521 */
10522 static KRML_MUSTINLINE void
libcrux_ml_kem_serialize_compress_then_serialize_10_fc(libcrux_ml_kem_polynomial_PolynomialRingElement_f0 * re,uint8_t ret[320U])10523 libcrux_ml_kem_serialize_compress_then_serialize_10_fc(
10524 libcrux_ml_kem_polynomial_PolynomialRingElement_f0 *re, uint8_t ret[320U]) {
10525 uint8_t serialized[320U] = {0U};
10526 for (size_t i = (size_t)0U;
10527 i < LIBCRUX_ML_KEM_POLYNOMIAL_VECTORS_IN_RING_ELEMENT; i++) {
10528 size_t i0 = i;
10529 libcrux_ml_kem_vector_portable_vector_type_PortableVector coefficient =
10530 libcrux_ml_kem_vector_portable_compress_0d_28(
10531 libcrux_ml_kem_vector_traits_to_unsigned_representative_db(
10532 re->coefficients[i0]));
10533 uint8_t bytes[20U];
10534 libcrux_ml_kem_vector_portable_serialize_10_0d(coefficient, bytes);
10535 Eurydice_slice uu____0 = Eurydice_array_to_subslice2(
10536 serialized, (size_t)20U * i0, (size_t)20U * i0 + (size_t)20U, uint8_t);
10537 Eurydice_slice_copy(
10538 uu____0, Eurydice_array_to_slice((size_t)20U, bytes, uint8_t), uint8_t);
10539 }
10540 memcpy(ret, serialized, (size_t)320U * sizeof(uint8_t));
10541 }
10542
10543 /**
10544 A monomorphic instance of libcrux_ml_kem.vector.portable.compress.compress
10545 with const generics
10546 - COEFFICIENT_BITS= 11
10547 */
10548 static KRML_MUSTINLINE libcrux_ml_kem_vector_portable_vector_type_PortableVector
libcrux_ml_kem_vector_portable_compress_compress_020(libcrux_ml_kem_vector_portable_vector_type_PortableVector v)10549 libcrux_ml_kem_vector_portable_compress_compress_020(
10550 libcrux_ml_kem_vector_portable_vector_type_PortableVector v) {
10551 for (size_t i = (size_t)0U;
10552 i < LIBCRUX_ML_KEM_VECTOR_TRAITS_FIELD_ELEMENTS_IN_VECTOR; i++) {
10553 size_t i0 = i;
10554 int16_t uu____0 =
10555 libcrux_ml_kem_vector_portable_compress_compress_ciphertext_coefficient(
10556 (uint8_t)(int32_t)11, (uint16_t)v.elements[i0]);
10557 v.elements[i0] = uu____0;
10558 }
10559 return v;
10560 }
10561
10562 /**
10563 This function found in impl {(libcrux_ml_kem::vector::traits::Operations for
10564 libcrux_ml_kem::vector::portable::vector_type::PortableVector)}
10565 */
10566 /**
10567 A monomorphic instance of libcrux_ml_kem.vector.portable.compress_0d
10568 with const generics
10569 - COEFFICIENT_BITS= 11
10570 */
10571 static inline libcrux_ml_kem_vector_portable_vector_type_PortableVector
libcrux_ml_kem_vector_portable_compress_0d_280(libcrux_ml_kem_vector_portable_vector_type_PortableVector v)10572 libcrux_ml_kem_vector_portable_compress_0d_280(
10573 libcrux_ml_kem_vector_portable_vector_type_PortableVector v) {
10574 return libcrux_ml_kem_vector_portable_compress_compress_020(v);
10575 }
10576
10577 /**
10578 A monomorphic instance of libcrux_ml_kem.serialize.compress_then_serialize_11
10579 with types libcrux_ml_kem_vector_portable_vector_type_PortableVector
10580 with const generics
10581 - OUT_LEN= 320
10582 */
10583 static KRML_MUSTINLINE void
libcrux_ml_kem_serialize_compress_then_serialize_11_e1(libcrux_ml_kem_polynomial_PolynomialRingElement_f0 * re,uint8_t ret[320U])10584 libcrux_ml_kem_serialize_compress_then_serialize_11_e1(
10585 libcrux_ml_kem_polynomial_PolynomialRingElement_f0 *re, uint8_t ret[320U]) {
10586 uint8_t serialized[320U] = {0U};
10587 for (size_t i = (size_t)0U;
10588 i < LIBCRUX_ML_KEM_POLYNOMIAL_VECTORS_IN_RING_ELEMENT; i++) {
10589 size_t i0 = i;
10590 libcrux_ml_kem_vector_portable_vector_type_PortableVector coefficient =
10591 libcrux_ml_kem_vector_portable_compress_0d_280(
10592 libcrux_ml_kem_vector_traits_to_unsigned_representative_db(
10593 re->coefficients[i0]));
10594 uint8_t bytes[22U];
10595 libcrux_ml_kem_vector_portable_serialize_11_0d(coefficient, bytes);
10596 Eurydice_slice uu____0 = Eurydice_array_to_subslice2(
10597 serialized, (size_t)22U * i0, (size_t)22U * i0 + (size_t)22U, uint8_t);
10598 Eurydice_slice_copy(
10599 uu____0, Eurydice_array_to_slice((size_t)22U, bytes, uint8_t), uint8_t);
10600 }
10601 memcpy(ret, serialized, (size_t)320U * sizeof(uint8_t));
10602 }
10603
10604 /**
10605 A monomorphic instance of
10606 libcrux_ml_kem.serialize.compress_then_serialize_ring_element_u with types
10607 libcrux_ml_kem_vector_portable_vector_type_PortableVector with const generics
10608 - COMPRESSION_FACTOR= 10
10609 - OUT_LEN= 320
10610 */
10611 static KRML_MUSTINLINE void
libcrux_ml_kem_serialize_compress_then_serialize_ring_element_u_5f(libcrux_ml_kem_polynomial_PolynomialRingElement_f0 * re,uint8_t ret[320U])10612 libcrux_ml_kem_serialize_compress_then_serialize_ring_element_u_5f(
10613 libcrux_ml_kem_polynomial_PolynomialRingElement_f0 *re, uint8_t ret[320U]) {
10614 uint8_t uu____0[320U];
10615 libcrux_ml_kem_serialize_compress_then_serialize_10_fc(re, uu____0);
10616 memcpy(ret, uu____0, (size_t)320U * sizeof(uint8_t));
10617 }
10618
10619 /**
10620 Call [`compress_then_serialize_ring_element_u`] on each ring element.
10621 */
10622 /**
10623 A monomorphic instance of libcrux_ml_kem.ind_cpa.compress_then_serialize_u
10624 with types libcrux_ml_kem_vector_portable_vector_type_PortableVector
10625 with const generics
10626 - K= 3
10627 - OUT_LEN= 960
10628 - COMPRESSION_FACTOR= 10
10629 - BLOCK_LEN= 320
10630 */
libcrux_ml_kem_ind_cpa_compress_then_serialize_u_a7(libcrux_ml_kem_polynomial_PolynomialRingElement_f0 input[3U],Eurydice_slice out)10631 static inline void libcrux_ml_kem_ind_cpa_compress_then_serialize_u_a7(
10632 libcrux_ml_kem_polynomial_PolynomialRingElement_f0 input[3U],
10633 Eurydice_slice out) {
10634 for (size_t i = (size_t)0U;
10635 i < Eurydice_slice_len(
10636 Eurydice_array_to_slice(
10637 (size_t)3U, input,
10638 libcrux_ml_kem_polynomial_PolynomialRingElement_f0),
10639 libcrux_ml_kem_polynomial_PolynomialRingElement_f0);
10640 i++) {
10641 size_t i0 = i;
10642 libcrux_ml_kem_polynomial_PolynomialRingElement_f0 re = input[i0];
10643 Eurydice_slice uu____0 = Eurydice_slice_subslice2(
10644 out, i0 * ((size_t)960U / (size_t)3U),
10645 (i0 + (size_t)1U) * ((size_t)960U / (size_t)3U), uint8_t);
10646 uint8_t ret[320U];
10647 libcrux_ml_kem_serialize_compress_then_serialize_ring_element_u_5f(&re,
10648 ret);
10649 Eurydice_slice_copy(
10650 uu____0, Eurydice_array_to_slice((size_t)320U, ret, uint8_t), uint8_t);
10651 }
10652 }
10653
10654 /**
10655 A monomorphic instance of libcrux_ml_kem.vector.portable.compress.compress
10656 with const generics
10657 - COEFFICIENT_BITS= 4
10658 */
10659 static KRML_MUSTINLINE libcrux_ml_kem_vector_portable_vector_type_PortableVector
libcrux_ml_kem_vector_portable_compress_compress_021(libcrux_ml_kem_vector_portable_vector_type_PortableVector v)10660 libcrux_ml_kem_vector_portable_compress_compress_021(
10661 libcrux_ml_kem_vector_portable_vector_type_PortableVector v) {
10662 for (size_t i = (size_t)0U;
10663 i < LIBCRUX_ML_KEM_VECTOR_TRAITS_FIELD_ELEMENTS_IN_VECTOR; i++) {
10664 size_t i0 = i;
10665 int16_t uu____0 =
10666 libcrux_ml_kem_vector_portable_compress_compress_ciphertext_coefficient(
10667 (uint8_t)(int32_t)4, (uint16_t)v.elements[i0]);
10668 v.elements[i0] = uu____0;
10669 }
10670 return v;
10671 }
10672
10673 /**
10674 This function found in impl {(libcrux_ml_kem::vector::traits::Operations for
10675 libcrux_ml_kem::vector::portable::vector_type::PortableVector)}
10676 */
10677 /**
10678 A monomorphic instance of libcrux_ml_kem.vector.portable.compress_0d
10679 with const generics
10680 - COEFFICIENT_BITS= 4
10681 */
10682 static inline libcrux_ml_kem_vector_portable_vector_type_PortableVector
libcrux_ml_kem_vector_portable_compress_0d_281(libcrux_ml_kem_vector_portable_vector_type_PortableVector v)10683 libcrux_ml_kem_vector_portable_compress_0d_281(
10684 libcrux_ml_kem_vector_portable_vector_type_PortableVector v) {
10685 return libcrux_ml_kem_vector_portable_compress_compress_021(v);
10686 }
10687
10688 /**
10689 A monomorphic instance of libcrux_ml_kem.serialize.compress_then_serialize_4
10690 with types libcrux_ml_kem_vector_portable_vector_type_PortableVector
10691 with const generics
10692
10693 */
10694 static KRML_MUSTINLINE void
libcrux_ml_kem_serialize_compress_then_serialize_4_9a(libcrux_ml_kem_polynomial_PolynomialRingElement_f0 re,Eurydice_slice serialized)10695 libcrux_ml_kem_serialize_compress_then_serialize_4_9a(
10696 libcrux_ml_kem_polynomial_PolynomialRingElement_f0 re,
10697 Eurydice_slice serialized) {
10698 for (size_t i = (size_t)0U;
10699 i < LIBCRUX_ML_KEM_POLYNOMIAL_VECTORS_IN_RING_ELEMENT; i++) {
10700 size_t i0 = i;
10701 libcrux_ml_kem_vector_portable_vector_type_PortableVector coefficient =
10702 libcrux_ml_kem_vector_portable_compress_0d_281(
10703 libcrux_ml_kem_vector_traits_to_unsigned_representative_db(
10704 re.coefficients[i0]));
10705 uint8_t bytes[8U];
10706 libcrux_ml_kem_vector_portable_serialize_4_0d(coefficient, bytes);
10707 Eurydice_slice_copy(
10708 Eurydice_slice_subslice2(serialized, (size_t)8U * i0,
10709 (size_t)8U * i0 + (size_t)8U, uint8_t),
10710 Eurydice_array_to_slice((size_t)8U, bytes, uint8_t), uint8_t);
10711 }
10712 }
10713
10714 /**
10715 A monomorphic instance of libcrux_ml_kem.vector.portable.compress.compress
10716 with const generics
10717 - COEFFICIENT_BITS= 5
10718 */
10719 static KRML_MUSTINLINE libcrux_ml_kem_vector_portable_vector_type_PortableVector
libcrux_ml_kem_vector_portable_compress_compress_022(libcrux_ml_kem_vector_portable_vector_type_PortableVector v)10720 libcrux_ml_kem_vector_portable_compress_compress_022(
10721 libcrux_ml_kem_vector_portable_vector_type_PortableVector v) {
10722 for (size_t i = (size_t)0U;
10723 i < LIBCRUX_ML_KEM_VECTOR_TRAITS_FIELD_ELEMENTS_IN_VECTOR; i++) {
10724 size_t i0 = i;
10725 int16_t uu____0 =
10726 libcrux_ml_kem_vector_portable_compress_compress_ciphertext_coefficient(
10727 (uint8_t)(int32_t)5, (uint16_t)v.elements[i0]);
10728 v.elements[i0] = uu____0;
10729 }
10730 return v;
10731 }
10732
10733 /**
10734 This function found in impl {(libcrux_ml_kem::vector::traits::Operations for
10735 libcrux_ml_kem::vector::portable::vector_type::PortableVector)}
10736 */
10737 /**
10738 A monomorphic instance of libcrux_ml_kem.vector.portable.compress_0d
10739 with const generics
10740 - COEFFICIENT_BITS= 5
10741 */
10742 static inline libcrux_ml_kem_vector_portable_vector_type_PortableVector
libcrux_ml_kem_vector_portable_compress_0d_282(libcrux_ml_kem_vector_portable_vector_type_PortableVector v)10743 libcrux_ml_kem_vector_portable_compress_0d_282(
10744 libcrux_ml_kem_vector_portable_vector_type_PortableVector v) {
10745 return libcrux_ml_kem_vector_portable_compress_compress_022(v);
10746 }
10747
10748 /**
10749 A monomorphic instance of libcrux_ml_kem.serialize.compress_then_serialize_5
10750 with types libcrux_ml_kem_vector_portable_vector_type_PortableVector
10751 with const generics
10752
10753 */
10754 static KRML_MUSTINLINE void
libcrux_ml_kem_serialize_compress_then_serialize_5_1f(libcrux_ml_kem_polynomial_PolynomialRingElement_f0 re,Eurydice_slice serialized)10755 libcrux_ml_kem_serialize_compress_then_serialize_5_1f(
10756 libcrux_ml_kem_polynomial_PolynomialRingElement_f0 re,
10757 Eurydice_slice serialized) {
10758 for (size_t i = (size_t)0U;
10759 i < LIBCRUX_ML_KEM_POLYNOMIAL_VECTORS_IN_RING_ELEMENT; i++) {
10760 size_t i0 = i;
10761 libcrux_ml_kem_vector_portable_vector_type_PortableVector coefficients =
10762 libcrux_ml_kem_vector_portable_compress_0d_282(
10763 libcrux_ml_kem_vector_traits_to_unsigned_representative_db(
10764 re.coefficients[i0]));
10765 uint8_t bytes[10U];
10766 libcrux_ml_kem_vector_portable_serialize_5_0d(coefficients, bytes);
10767 Eurydice_slice_copy(
10768 Eurydice_slice_subslice2(serialized, (size_t)10U * i0,
10769 (size_t)10U * i0 + (size_t)10U, uint8_t),
10770 Eurydice_array_to_slice((size_t)10U, bytes, uint8_t), uint8_t);
10771 }
10772 }
10773
10774 /**
10775 A monomorphic instance of
10776 libcrux_ml_kem.serialize.compress_then_serialize_ring_element_v with types
10777 libcrux_ml_kem_vector_portable_vector_type_PortableVector with const generics
10778 - COMPRESSION_FACTOR= 4
10779 - OUT_LEN= 128
10780 */
10781 static KRML_MUSTINLINE void
libcrux_ml_kem_serialize_compress_then_serialize_ring_element_v_4e(libcrux_ml_kem_polynomial_PolynomialRingElement_f0 re,Eurydice_slice out)10782 libcrux_ml_kem_serialize_compress_then_serialize_ring_element_v_4e(
10783 libcrux_ml_kem_polynomial_PolynomialRingElement_f0 re, Eurydice_slice out) {
10784 libcrux_ml_kem_serialize_compress_then_serialize_4_9a(re, out);
10785 }
10786
10787 /**
10788 A monomorphic instance of libcrux_ml_kem.ind_cpa.encrypt
10789 with types libcrux_ml_kem_vector_portable_vector_type_PortableVector,
10790 libcrux_ml_kem_hash_functions_portable_PortableHash[[$3size_t]] with const
10791 generics
10792 - K= 3
10793 - CIPHERTEXT_SIZE= 1088
10794 - T_AS_NTT_ENCODED_SIZE= 1152
10795 - C1_LEN= 960
10796 - C2_LEN= 128
10797 - U_COMPRESSION_FACTOR= 10
10798 - V_COMPRESSION_FACTOR= 4
10799 - BLOCK_LEN= 320
10800 - ETA1= 2
10801 - ETA1_RANDOMNESS_SIZE= 128
10802 - ETA2= 2
10803 - ETA2_RANDOMNESS_SIZE= 128
10804 */
libcrux_ml_kem_ind_cpa_encrypt_60(Eurydice_slice public_key,uint8_t message[32U],Eurydice_slice randomness,uint8_t ret[1088U])10805 static inline void libcrux_ml_kem_ind_cpa_encrypt_60(Eurydice_slice public_key,
10806 uint8_t message[32U],
10807 Eurydice_slice randomness,
10808 uint8_t ret[1088U]) {
10809 libcrux_ml_kem_polynomial_PolynomialRingElement_f0 t_as_ntt[3U];
10810 libcrux_ml_kem_serialize_deserialize_ring_elements_reduced_33(
10811 Eurydice_slice_subslice_to(public_key, (size_t)1152U, uint8_t, size_t),
10812 t_as_ntt);
10813 Eurydice_slice seed =
10814 Eurydice_slice_subslice_from(public_key, (size_t)1152U, uint8_t, size_t);
10815 libcrux_ml_kem_polynomial_PolynomialRingElement_f0 A[3U][3U];
10816 uint8_t ret0[34U];
10817 libcrux_ml_kem_utils_into_padded_array_ea1(seed, ret0);
10818 libcrux_ml_kem_matrix_sample_matrix_A_38(ret0, false, A);
10819 uint8_t prf_input[33U];
10820 libcrux_ml_kem_utils_into_padded_array_ea2(randomness, prf_input);
10821 /* Passing arrays by value in Rust generates a copy in C */
10822 uint8_t copy_of_prf_input0[33U];
10823 memcpy(copy_of_prf_input0, prf_input, (size_t)33U * sizeof(uint8_t));
10824 tuple_b0 uu____1 = libcrux_ml_kem_ind_cpa_sample_vector_cbd_then_ntt_fc(
10825 copy_of_prf_input0, 0U);
10826 libcrux_ml_kem_polynomial_PolynomialRingElement_f0 r_as_ntt[3U];
10827 memcpy(
10828 r_as_ntt, uu____1.fst,
10829 (size_t)3U * sizeof(libcrux_ml_kem_polynomial_PolynomialRingElement_f0));
10830 uint8_t domain_separator0 = uu____1.snd;
10831 /* Passing arrays by value in Rust generates a copy in C */
10832 uint8_t copy_of_prf_input[33U];
10833 memcpy(copy_of_prf_input, prf_input, (size_t)33U * sizeof(uint8_t));
10834 tuple_b0 uu____3 = libcrux_ml_kem_ind_cpa_sample_ring_element_cbd_ac(
10835 copy_of_prf_input, domain_separator0);
10836 libcrux_ml_kem_polynomial_PolynomialRingElement_f0 error_1[3U];
10837 memcpy(
10838 error_1, uu____3.fst,
10839 (size_t)3U * sizeof(libcrux_ml_kem_polynomial_PolynomialRingElement_f0));
10840 uint8_t domain_separator = uu____3.snd;
10841 prf_input[32U] = domain_separator;
10842 uint8_t prf_output[128U];
10843 libcrux_ml_kem_hash_functions_portable_PRF_f1_ee0(
10844 Eurydice_array_to_slice((size_t)33U, prf_input, uint8_t), prf_output);
10845 libcrux_ml_kem_polynomial_PolynomialRingElement_f0 error_2 =
10846 libcrux_ml_kem_sampling_sample_from_binomial_distribution_c6(
10847 Eurydice_array_to_slice((size_t)128U, prf_output, uint8_t));
10848 libcrux_ml_kem_polynomial_PolynomialRingElement_f0 u[3U];
10849 libcrux_ml_kem_matrix_compute_vector_u_59(A, r_as_ntt, error_1, u);
10850 /* Passing arrays by value in Rust generates a copy in C */
10851 uint8_t copy_of_message[32U];
10852 memcpy(copy_of_message, message, (size_t)32U * sizeof(uint8_t));
10853 libcrux_ml_kem_polynomial_PolynomialRingElement_f0 message_as_ring_element =
10854 libcrux_ml_kem_serialize_deserialize_then_decompress_message_0d(
10855 copy_of_message);
10856 libcrux_ml_kem_polynomial_PolynomialRingElement_f0 v =
10857 libcrux_ml_kem_matrix_compute_ring_element_v_54(
10858 t_as_ntt, r_as_ntt, &error_2, &message_as_ring_element);
10859 uint8_t ciphertext[1088U] = {0U};
10860 libcrux_ml_kem_polynomial_PolynomialRingElement_f0 uu____5[3U];
10861 memcpy(
10862 uu____5, u,
10863 (size_t)3U * sizeof(libcrux_ml_kem_polynomial_PolynomialRingElement_f0));
10864 libcrux_ml_kem_ind_cpa_compress_then_serialize_u_a7(
10865 uu____5, Eurydice_array_to_subslice2(ciphertext, (size_t)0U, (size_t)960U,
10866 uint8_t));
10867 libcrux_ml_kem_polynomial_PolynomialRingElement_f0 uu____6 = v;
10868 libcrux_ml_kem_serialize_compress_then_serialize_ring_element_v_4e(
10869 uu____6, Eurydice_array_to_subslice_from((size_t)1088U, ciphertext,
10870 (size_t)960U, uint8_t, size_t));
10871 memcpy(ret, ciphertext, (size_t)1088U * sizeof(uint8_t));
10872 }
10873
10874 /**
10875 This function found in impl {(libcrux_ml_kem::variant::Variant for
10876 libcrux_ml_kem::variant::MlKem)#1}
10877 */
10878 /**
10879 A monomorphic instance of libcrux_ml_kem.variant.kdf_d8
10880 with types libcrux_ml_kem_hash_functions_portable_PortableHash[[$3size_t]]
10881 with const generics
10882 - K= 3
10883 - CIPHERTEXT_SIZE= 1088
10884 */
libcrux_ml_kem_variant_kdf_d8_41(Eurydice_slice shared_secret,libcrux_ml_kem_mlkem768_MlKem768Ciphertext * _,uint8_t ret[32U])10885 static KRML_MUSTINLINE void libcrux_ml_kem_variant_kdf_d8_41(
10886 Eurydice_slice shared_secret, libcrux_ml_kem_mlkem768_MlKem768Ciphertext *_,
10887 uint8_t ret[32U]) {
10888 uint8_t out[32U] = {0U};
10889 Eurydice_slice_copy(Eurydice_array_to_slice((size_t)32U, out, uint8_t),
10890 shared_secret, uint8_t);
10891 memcpy(ret, out, (size_t)32U * sizeof(uint8_t));
10892 }
10893
10894 /**
10895 A monomorphic instance of libcrux_ml_kem.ind_cca.decapsulate
10896 with types libcrux_ml_kem_vector_portable_vector_type_PortableVector,
10897 libcrux_ml_kem_hash_functions_portable_PortableHash[[$3size_t]],
10898 libcrux_ml_kem_variant_MlKem with const generics
10899 - K= 3
10900 - SECRET_KEY_SIZE= 2400
10901 - CPA_SECRET_KEY_SIZE= 1152
10902 - PUBLIC_KEY_SIZE= 1184
10903 - CIPHERTEXT_SIZE= 1088
10904 - T_AS_NTT_ENCODED_SIZE= 1152
10905 - C1_SIZE= 960
10906 - C2_SIZE= 128
10907 - VECTOR_U_COMPRESSION_FACTOR= 10
10908 - VECTOR_V_COMPRESSION_FACTOR= 4
10909 - C1_BLOCK_SIZE= 320
10910 - ETA1= 2
10911 - ETA1_RANDOMNESS_SIZE= 128
10912 - ETA2= 2
10913 - ETA2_RANDOMNESS_SIZE= 128
10914 - IMPLICIT_REJECTION_HASH_INPUT_SIZE= 1120
10915 */
libcrux_ml_kem_ind_cca_decapsulate_70(libcrux_ml_kem_types_MlKemPrivateKey_55 * private_key,libcrux_ml_kem_mlkem768_MlKem768Ciphertext * ciphertext,uint8_t ret[32U])10916 static inline void libcrux_ml_kem_ind_cca_decapsulate_70(
10917 libcrux_ml_kem_types_MlKemPrivateKey_55 *private_key,
10918 libcrux_ml_kem_mlkem768_MlKem768Ciphertext *ciphertext, uint8_t ret[32U]) {
10919 Eurydice_slice_uint8_t_x2 uu____0 = Eurydice_slice_split_at(
10920 Eurydice_array_to_slice((size_t)2400U, private_key->value, uint8_t),
10921 (size_t)1152U, uint8_t, Eurydice_slice_uint8_t_x2);
10922 Eurydice_slice ind_cpa_secret_key = uu____0.fst;
10923 Eurydice_slice secret_key0 = uu____0.snd;
10924 Eurydice_slice_uint8_t_x2 uu____1 = Eurydice_slice_split_at(
10925 secret_key0, (size_t)1184U, uint8_t, Eurydice_slice_uint8_t_x2);
10926 Eurydice_slice ind_cpa_public_key = uu____1.fst;
10927 Eurydice_slice secret_key = uu____1.snd;
10928 Eurydice_slice_uint8_t_x2 uu____2 = Eurydice_slice_split_at(
10929 secret_key, LIBCRUX_ML_KEM_CONSTANTS_H_DIGEST_SIZE, uint8_t,
10930 Eurydice_slice_uint8_t_x2);
10931 Eurydice_slice ind_cpa_public_key_hash = uu____2.fst;
10932 Eurydice_slice implicit_rejection_value = uu____2.snd;
10933 uint8_t decrypted[32U];
10934 libcrux_ml_kem_ind_cpa_decrypt_43(ind_cpa_secret_key, ciphertext->value,
10935 decrypted);
10936 uint8_t to_hash0[64U];
10937 libcrux_ml_kem_utils_into_padded_array_ea(
10938 Eurydice_array_to_slice((size_t)32U, decrypted, uint8_t), to_hash0);
10939 Eurydice_slice_copy(
10940 Eurydice_array_to_subslice_from(
10941 (size_t)64U, to_hash0, LIBCRUX_ML_KEM_CONSTANTS_SHARED_SECRET_SIZE,
10942 uint8_t, size_t),
10943 ind_cpa_public_key_hash, uint8_t);
10944 uint8_t hashed[64U];
10945 libcrux_ml_kem_hash_functions_portable_G_f1_e4(
10946 Eurydice_array_to_slice((size_t)64U, to_hash0, uint8_t), hashed);
10947 Eurydice_slice_uint8_t_x2 uu____3 = Eurydice_slice_split_at(
10948 Eurydice_array_to_slice((size_t)64U, hashed, uint8_t),
10949 LIBCRUX_ML_KEM_CONSTANTS_SHARED_SECRET_SIZE, uint8_t,
10950 Eurydice_slice_uint8_t_x2);
10951 Eurydice_slice shared_secret0 = uu____3.fst;
10952 Eurydice_slice pseudorandomness = uu____3.snd;
10953 uint8_t to_hash[1120U];
10954 libcrux_ml_kem_utils_into_padded_array_ea0(implicit_rejection_value, to_hash);
10955 Eurydice_slice uu____4 = Eurydice_array_to_subslice_from(
10956 (size_t)1120U, to_hash, LIBCRUX_ML_KEM_CONSTANTS_SHARED_SECRET_SIZE,
10957 uint8_t, size_t);
10958 Eurydice_slice_copy(uu____4, libcrux_ml_kem_types_as_ref_00_24(ciphertext),
10959 uint8_t);
10960 uint8_t implicit_rejection_shared_secret0[32U];
10961 libcrux_ml_kem_hash_functions_portable_PRF_f1_ee(
10962 Eurydice_array_to_slice((size_t)1120U, to_hash, uint8_t),
10963 implicit_rejection_shared_secret0);
10964 Eurydice_slice uu____5 = ind_cpa_public_key;
10965 /* Passing arrays by value in Rust generates a copy in C */
10966 uint8_t copy_of_decrypted[32U];
10967 memcpy(copy_of_decrypted, decrypted, (size_t)32U * sizeof(uint8_t));
10968 uint8_t expected_ciphertext[1088U];
10969 libcrux_ml_kem_ind_cpa_encrypt_60(uu____5, copy_of_decrypted,
10970 pseudorandomness, expected_ciphertext);
10971 uint8_t implicit_rejection_shared_secret[32U];
10972 libcrux_ml_kem_variant_kdf_d8_41(
10973 Eurydice_array_to_slice((size_t)32U, implicit_rejection_shared_secret0,
10974 uint8_t),
10975 ciphertext, implicit_rejection_shared_secret);
10976 uint8_t shared_secret[32U];
10977 libcrux_ml_kem_variant_kdf_d8_41(shared_secret0, ciphertext, shared_secret);
10978 uint8_t ret0[32U];
10979 libcrux_ml_kem_constant_time_ops_compare_ciphertexts_select_shared_secret_in_constant_time(
10980 libcrux_ml_kem_types_as_ref_00_24(ciphertext),
10981 Eurydice_array_to_slice((size_t)1088U, expected_ciphertext, uint8_t),
10982 Eurydice_array_to_slice((size_t)32U, shared_secret, uint8_t),
10983 Eurydice_array_to_slice((size_t)32U, implicit_rejection_shared_secret,
10984 uint8_t),
10985 ret0);
10986 memcpy(ret, ret0, (size_t)32U * sizeof(uint8_t));
10987 }
10988
10989 /**
10990 Portable decapsulate
10991 */
10992 /**
10993 A monomorphic instance of
10994 libcrux_ml_kem.ind_cca.instantiations.portable.decapsulate with const generics
10995 - K= 3
10996 - SECRET_KEY_SIZE= 2400
10997 - CPA_SECRET_KEY_SIZE= 1152
10998 - PUBLIC_KEY_SIZE= 1184
10999 - CIPHERTEXT_SIZE= 1088
11000 - T_AS_NTT_ENCODED_SIZE= 1152
11001 - C1_SIZE= 960
11002 - C2_SIZE= 128
11003 - VECTOR_U_COMPRESSION_FACTOR= 10
11004 - VECTOR_V_COMPRESSION_FACTOR= 4
11005 - C1_BLOCK_SIZE= 320
11006 - ETA1= 2
11007 - ETA1_RANDOMNESS_SIZE= 128
11008 - ETA2= 2
11009 - ETA2_RANDOMNESS_SIZE= 128
11010 - IMPLICIT_REJECTION_HASH_INPUT_SIZE= 1120
11011 */
11012 static inline void
libcrux_ml_kem_ind_cca_instantiations_portable_decapsulate_2e(libcrux_ml_kem_types_MlKemPrivateKey_55 * private_key,libcrux_ml_kem_mlkem768_MlKem768Ciphertext * ciphertext,uint8_t ret[32U])11013 libcrux_ml_kem_ind_cca_instantiations_portable_decapsulate_2e(
11014 libcrux_ml_kem_types_MlKemPrivateKey_55 *private_key,
11015 libcrux_ml_kem_mlkem768_MlKem768Ciphertext *ciphertext, uint8_t ret[32U]) {
11016 libcrux_ml_kem_ind_cca_decapsulate_70(private_key, ciphertext, ret);
11017 }
11018
11019 /**
11020 Decapsulate ML-KEM 768
11021
11022 Generates an [`MlKemSharedSecret`].
11023 The input is a reference to an [`MlKem768PrivateKey`] and an
11024 [`MlKem768Ciphertext`].
11025 */
libcrux_ml_kem_mlkem768_portable_decapsulate(libcrux_ml_kem_types_MlKemPrivateKey_55 * private_key,libcrux_ml_kem_mlkem768_MlKem768Ciphertext * ciphertext,uint8_t ret[32U])11026 static inline void libcrux_ml_kem_mlkem768_portable_decapsulate(
11027 libcrux_ml_kem_types_MlKemPrivateKey_55 *private_key,
11028 libcrux_ml_kem_mlkem768_MlKem768Ciphertext *ciphertext, uint8_t ret[32U]) {
11029 libcrux_ml_kem_ind_cca_instantiations_portable_decapsulate_2e(
11030 private_key, ciphertext, ret);
11031 }
11032
11033 /**
11034 This function found in impl {(libcrux_ml_kem::variant::Variant for
11035 libcrux_ml_kem::variant::MlKem)#1}
11036 */
11037 /**
11038 A monomorphic instance of libcrux_ml_kem.variant.entropy_preprocess_d8
11039 with types libcrux_ml_kem_hash_functions_portable_PortableHash[[$3size_t]]
11040 with const generics
11041 - K= 3
11042 */
libcrux_ml_kem_variant_entropy_preprocess_d8_63(Eurydice_slice randomness,uint8_t ret[32U])11043 static KRML_MUSTINLINE void libcrux_ml_kem_variant_entropy_preprocess_d8_63(
11044 Eurydice_slice randomness, uint8_t ret[32U]) {
11045 uint8_t out[32U] = {0U};
11046 Eurydice_slice_copy(Eurydice_array_to_slice((size_t)32U, out, uint8_t),
11047 randomness, uint8_t);
11048 memcpy(ret, out, (size_t)32U * sizeof(uint8_t));
11049 }
11050
11051 /**
11052 This function found in impl {(libcrux_ml_kem::hash_functions::Hash<K> for
11053 libcrux_ml_kem::hash_functions::portable::PortableHash<K>)}
11054 */
11055 /**
11056 A monomorphic instance of libcrux_ml_kem.hash_functions.portable.H_f1
11057 with const generics
11058 - K= 3
11059 */
libcrux_ml_kem_hash_functions_portable_H_f1_1a(Eurydice_slice input,uint8_t ret[32U])11060 static KRML_MUSTINLINE void libcrux_ml_kem_hash_functions_portable_H_f1_1a(
11061 Eurydice_slice input, uint8_t ret[32U]) {
11062 libcrux_ml_kem_hash_functions_portable_H(input, ret);
11063 }
11064
11065 /**
11066 A monomorphic instance of libcrux_ml_kem.ind_cca.encapsulate
11067 with types libcrux_ml_kem_vector_portable_vector_type_PortableVector,
11068 libcrux_ml_kem_hash_functions_portable_PortableHash[[$3size_t]],
11069 libcrux_ml_kem_variant_MlKem with const generics
11070 - K= 3
11071 - CIPHERTEXT_SIZE= 1088
11072 - PUBLIC_KEY_SIZE= 1184
11073 - T_AS_NTT_ENCODED_SIZE= 1152
11074 - C1_SIZE= 960
11075 - C2_SIZE= 128
11076 - VECTOR_U_COMPRESSION_FACTOR= 10
11077 - VECTOR_V_COMPRESSION_FACTOR= 4
11078 - VECTOR_U_BLOCK_LEN= 320
11079 - ETA1= 2
11080 - ETA1_RANDOMNESS_SIZE= 128
11081 - ETA2= 2
11082 - ETA2_RANDOMNESS_SIZE= 128
11083 */
libcrux_ml_kem_ind_cca_encapsulate_cd(libcrux_ml_kem_types_MlKemPublicKey_15 * public_key,uint8_t randomness[32U])11084 static inline tuple_3c libcrux_ml_kem_ind_cca_encapsulate_cd(
11085 libcrux_ml_kem_types_MlKemPublicKey_15 *public_key,
11086 uint8_t randomness[32U]) {
11087 uint8_t randomness0[32U];
11088 libcrux_ml_kem_variant_entropy_preprocess_d8_63(
11089 Eurydice_array_to_slice((size_t)32U, randomness, uint8_t), randomness0);
11090 uint8_t to_hash[64U];
11091 libcrux_ml_kem_utils_into_padded_array_ea(
11092 Eurydice_array_to_slice((size_t)32U, randomness0, uint8_t), to_hash);
11093 Eurydice_slice uu____0 = Eurydice_array_to_subslice_from(
11094 (size_t)64U, to_hash, LIBCRUX_ML_KEM_CONSTANTS_H_DIGEST_SIZE, uint8_t,
11095 size_t);
11096 uint8_t ret[32U];
11097 libcrux_ml_kem_hash_functions_portable_H_f1_1a(
11098 Eurydice_array_to_slice((size_t)1184U,
11099 libcrux_ml_kem_types_as_slice_cb_50(public_key),
11100 uint8_t),
11101 ret);
11102 Eurydice_slice_copy(
11103 uu____0, Eurydice_array_to_slice((size_t)32U, ret, uint8_t), uint8_t);
11104 uint8_t hashed[64U];
11105 libcrux_ml_kem_hash_functions_portable_G_f1_e4(
11106 Eurydice_array_to_slice((size_t)64U, to_hash, uint8_t), hashed);
11107 Eurydice_slice_uint8_t_x2 uu____1 = Eurydice_slice_split_at(
11108 Eurydice_array_to_slice((size_t)64U, hashed, uint8_t),
11109 LIBCRUX_ML_KEM_CONSTANTS_SHARED_SECRET_SIZE, uint8_t,
11110 Eurydice_slice_uint8_t_x2);
11111 Eurydice_slice shared_secret = uu____1.fst;
11112 Eurydice_slice pseudorandomness = uu____1.snd;
11113 Eurydice_slice uu____2 = Eurydice_array_to_slice(
11114 (size_t)1184U, libcrux_ml_kem_types_as_slice_cb_50(public_key), uint8_t);
11115 /* Passing arrays by value in Rust generates a copy in C */
11116 uint8_t copy_of_randomness[32U];
11117 memcpy(copy_of_randomness, randomness0, (size_t)32U * sizeof(uint8_t));
11118 uint8_t ciphertext[1088U];
11119 libcrux_ml_kem_ind_cpa_encrypt_60(uu____2, copy_of_randomness,
11120 pseudorandomness, ciphertext);
11121 /* Passing arrays by value in Rust generates a copy in C */
11122 uint8_t copy_of_ciphertext[1088U];
11123 memcpy(copy_of_ciphertext, ciphertext, (size_t)1088U * sizeof(uint8_t));
11124 libcrux_ml_kem_mlkem768_MlKem768Ciphertext ciphertext0 =
11125 libcrux_ml_kem_types_from_01_9f(copy_of_ciphertext);
11126 uint8_t shared_secret_array[32U];
11127 libcrux_ml_kem_variant_kdf_d8_41(shared_secret, &ciphertext0,
11128 shared_secret_array);
11129 libcrux_ml_kem_mlkem768_MlKem768Ciphertext uu____5 = ciphertext0;
11130 /* Passing arrays by value in Rust generates a copy in C */
11131 uint8_t copy_of_shared_secret_array[32U];
11132 memcpy(copy_of_shared_secret_array, shared_secret_array,
11133 (size_t)32U * sizeof(uint8_t));
11134 tuple_3c lit;
11135 lit.fst = uu____5;
11136 memcpy(lit.snd, copy_of_shared_secret_array, (size_t)32U * sizeof(uint8_t));
11137 return lit;
11138 }
11139
11140 /**
11141 A monomorphic instance of
11142 libcrux_ml_kem.ind_cca.instantiations.portable.encapsulate with const generics
11143 - K= 3
11144 - CIPHERTEXT_SIZE= 1088
11145 - PUBLIC_KEY_SIZE= 1184
11146 - T_AS_NTT_ENCODED_SIZE= 1152
11147 - C1_SIZE= 960
11148 - C2_SIZE= 128
11149 - VECTOR_U_COMPRESSION_FACTOR= 10
11150 - VECTOR_V_COMPRESSION_FACTOR= 4
11151 - VECTOR_U_BLOCK_LEN= 320
11152 - ETA1= 2
11153 - ETA1_RANDOMNESS_SIZE= 128
11154 - ETA2= 2
11155 - ETA2_RANDOMNESS_SIZE= 128
11156 */
11157 static inline tuple_3c
libcrux_ml_kem_ind_cca_instantiations_portable_encapsulate_c6(libcrux_ml_kem_types_MlKemPublicKey_15 * public_key,uint8_t randomness[32U])11158 libcrux_ml_kem_ind_cca_instantiations_portable_encapsulate_c6(
11159 libcrux_ml_kem_types_MlKemPublicKey_15 *public_key,
11160 uint8_t randomness[32U]) {
11161 libcrux_ml_kem_types_MlKemPublicKey_15 *uu____0 = public_key;
11162 /* Passing arrays by value in Rust generates a copy in C */
11163 uint8_t copy_of_randomness[32U];
11164 memcpy(copy_of_randomness, randomness, (size_t)32U * sizeof(uint8_t));
11165 return libcrux_ml_kem_ind_cca_encapsulate_cd(uu____0, copy_of_randomness);
11166 }
11167
11168 /**
11169 Encapsulate ML-KEM 768
11170
11171 Generates an ([`MlKem768Ciphertext`], [`MlKemSharedSecret`]) tuple.
11172 The input is a reference to an [`MlKem768PublicKey`] and [`SHARED_SECRET_SIZE`]
11173 bytes of `randomness`.
11174 */
libcrux_ml_kem_mlkem768_portable_encapsulate(libcrux_ml_kem_types_MlKemPublicKey_15 * public_key,uint8_t randomness[32U])11175 static inline tuple_3c libcrux_ml_kem_mlkem768_portable_encapsulate(
11176 libcrux_ml_kem_types_MlKemPublicKey_15 *public_key,
11177 uint8_t randomness[32U]) {
11178 libcrux_ml_kem_types_MlKemPublicKey_15 *uu____0 = public_key;
11179 /* Passing arrays by value in Rust generates a copy in C */
11180 uint8_t copy_of_randomness[32U];
11181 memcpy(copy_of_randomness, randomness, (size_t)32U * sizeof(uint8_t));
11182 return libcrux_ml_kem_ind_cca_instantiations_portable_encapsulate_c6(
11183 uu____0, copy_of_randomness);
11184 }
11185
11186 /**
11187 This function found in impl {(libcrux_ml_kem::variant::Variant for
11188 libcrux_ml_kem::variant::MlKem)#1}
11189 */
11190 /**
11191 A monomorphic instance of libcrux_ml_kem.variant.cpa_keygen_seed_d8
11192 with types libcrux_ml_kem_hash_functions_portable_PortableHash[[$3size_t]]
11193 with const generics
11194 - K= 3
11195 */
libcrux_ml_kem_variant_cpa_keygen_seed_d8_0e(Eurydice_slice key_generation_seed,uint8_t ret[64U])11196 static KRML_MUSTINLINE void libcrux_ml_kem_variant_cpa_keygen_seed_d8_0e(
11197 Eurydice_slice key_generation_seed, uint8_t ret[64U]) {
11198 uint8_t seed[33U] = {0U};
11199 Eurydice_slice_copy(
11200 Eurydice_array_to_subslice2(
11201 seed, (size_t)0U,
11202 LIBCRUX_ML_KEM_CONSTANTS_CPA_PKE_KEY_GENERATION_SEED_SIZE, uint8_t),
11203 key_generation_seed, uint8_t);
11204 seed[LIBCRUX_ML_KEM_CONSTANTS_CPA_PKE_KEY_GENERATION_SEED_SIZE] =
11205 (uint8_t)(size_t)3U;
11206 uint8_t ret0[64U];
11207 libcrux_ml_kem_hash_functions_portable_G_f1_e4(
11208 Eurydice_array_to_slice((size_t)33U, seed, uint8_t), ret0);
11209 memcpy(ret, ret0, (size_t)64U * sizeof(uint8_t));
11210 }
11211
11212 /**
11213 A monomorphic instance of libcrux_ml_kem.matrix.compute_As_plus_e.closure
11214 with types libcrux_ml_kem_vector_portable_vector_type_PortableVector
11215 with const generics
11216 - K= 3
11217 */
11218 static inline libcrux_ml_kem_polynomial_PolynomialRingElement_f0
libcrux_ml_kem_matrix_compute_As_plus_e_closure_87(size_t _i)11219 libcrux_ml_kem_matrix_compute_As_plus_e_closure_87(size_t _i) {
11220 return libcrux_ml_kem_polynomial_ZERO_89_ea();
11221 }
11222
11223 /**
11224 A monomorphic instance of libcrux_ml_kem.vector.traits.to_standard_domain
11225 with types libcrux_ml_kem_vector_portable_vector_type_PortableVector
11226 with const generics
11227
11228 */
11229 static inline libcrux_ml_kem_vector_portable_vector_type_PortableVector
libcrux_ml_kem_vector_traits_to_standard_domain_59(libcrux_ml_kem_vector_portable_vector_type_PortableVector v)11230 libcrux_ml_kem_vector_traits_to_standard_domain_59(
11231 libcrux_ml_kem_vector_portable_vector_type_PortableVector v) {
11232 return libcrux_ml_kem_vector_portable_montgomery_multiply_by_constant_0d(
11233 v, LIBCRUX_ML_KEM_VECTOR_TRAITS_MONTGOMERY_R_SQUARED_MOD_FIELD_MODULUS);
11234 }
11235
11236 /**
11237 This function found in impl
11238 {libcrux_ml_kem::polynomial::PolynomialRingElement<Vector>[TraitClause@0]}
11239 */
11240 /**
11241 A monomorphic instance of libcrux_ml_kem.polynomial.add_standard_error_reduce_89
11242 with types libcrux_ml_kem_vector_portable_vector_type_PortableVector
11243 with const generics
11244
11245 */
11246 static KRML_MUSTINLINE void
libcrux_ml_kem_polynomial_add_standard_error_reduce_89_03(libcrux_ml_kem_polynomial_PolynomialRingElement_f0 * self,libcrux_ml_kem_polynomial_PolynomialRingElement_f0 * error)11247 libcrux_ml_kem_polynomial_add_standard_error_reduce_89_03(
11248 libcrux_ml_kem_polynomial_PolynomialRingElement_f0 *self,
11249 libcrux_ml_kem_polynomial_PolynomialRingElement_f0 *error) {
11250 for (size_t i = (size_t)0U;
11251 i < LIBCRUX_ML_KEM_POLYNOMIAL_VECTORS_IN_RING_ELEMENT; i++) {
11252 size_t j = i;
11253 libcrux_ml_kem_vector_portable_vector_type_PortableVector
11254 coefficient_normal_form =
11255 libcrux_ml_kem_vector_traits_to_standard_domain_59(
11256 self->coefficients[j]);
11257 libcrux_ml_kem_vector_portable_vector_type_PortableVector uu____0 =
11258 libcrux_ml_kem_vector_portable_barrett_reduce_0d(
11259 libcrux_ml_kem_vector_portable_add_0d(coefficient_normal_form,
11260 &error->coefficients[j]));
11261 self->coefficients[j] = uu____0;
11262 }
11263 }
11264
11265 /**
11266 Compute  ◦ ŝ + ê
11267 */
11268 /**
11269 A monomorphic instance of libcrux_ml_kem.matrix.compute_As_plus_e
11270 with types libcrux_ml_kem_vector_portable_vector_type_PortableVector
11271 with const generics
11272 - K= 3
11273 */
libcrux_ml_kem_matrix_compute_As_plus_e_60(libcrux_ml_kem_polynomial_PolynomialRingElement_f0 (* matrix_A)[3U],libcrux_ml_kem_polynomial_PolynomialRingElement_f0 * s_as_ntt,libcrux_ml_kem_polynomial_PolynomialRingElement_f0 * error_as_ntt,libcrux_ml_kem_polynomial_PolynomialRingElement_f0 ret[3U])11274 static KRML_MUSTINLINE void libcrux_ml_kem_matrix_compute_As_plus_e_60(
11275 libcrux_ml_kem_polynomial_PolynomialRingElement_f0 (*matrix_A)[3U],
11276 libcrux_ml_kem_polynomial_PolynomialRingElement_f0 *s_as_ntt,
11277 libcrux_ml_kem_polynomial_PolynomialRingElement_f0 *error_as_ntt,
11278 libcrux_ml_kem_polynomial_PolynomialRingElement_f0 ret[3U]) {
11279 libcrux_ml_kem_polynomial_PolynomialRingElement_f0 result[3U];
11280 for (size_t i = (size_t)0U; i < (size_t)3U; i++) {
11281 result[i] = libcrux_ml_kem_polynomial_ZERO_89_ea();
11282 }
11283 for (size_t i0 = (size_t)0U;
11284 i0 < Eurydice_slice_len(
11285 Eurydice_array_to_slice(
11286 (size_t)3U, matrix_A,
11287 libcrux_ml_kem_polynomial_PolynomialRingElement_f0[3U]),
11288 libcrux_ml_kem_polynomial_PolynomialRingElement_f0[3U]);
11289 i0++) {
11290 size_t i1 = i0;
11291 libcrux_ml_kem_polynomial_PolynomialRingElement_f0 *row = matrix_A[i1];
11292 for (size_t i = (size_t)0U;
11293 i < Eurydice_slice_len(
11294 Eurydice_array_to_slice(
11295 (size_t)3U, row,
11296 libcrux_ml_kem_polynomial_PolynomialRingElement_f0),
11297 libcrux_ml_kem_polynomial_PolynomialRingElement_f0);
11298 i++) {
11299 size_t j = i;
11300 libcrux_ml_kem_polynomial_PolynomialRingElement_f0 *matrix_element =
11301 &row[j];
11302 libcrux_ml_kem_polynomial_PolynomialRingElement_f0 product =
11303 libcrux_ml_kem_polynomial_ntt_multiply_89_2a(matrix_element,
11304 &s_as_ntt[j]);
11305 libcrux_ml_kem_polynomial_add_to_ring_element_89_84(&result[i1],
11306 &product);
11307 }
11308 libcrux_ml_kem_polynomial_add_standard_error_reduce_89_03(
11309 &result[i1], &error_as_ntt[i1]);
11310 }
11311 memcpy(
11312 ret, result,
11313 (size_t)3U * sizeof(libcrux_ml_kem_polynomial_PolynomialRingElement_f0));
11314 }
11315
11316 /**
11317 A monomorphic instance of
11318 libcrux_ml_kem.serialize.serialize_uncompressed_ring_element with types
11319 libcrux_ml_kem_vector_portable_vector_type_PortableVector with const generics
11320
11321 */
11322 static KRML_MUSTINLINE void
libcrux_ml_kem_serialize_serialize_uncompressed_ring_element_5b(libcrux_ml_kem_polynomial_PolynomialRingElement_f0 * re,uint8_t ret[384U])11323 libcrux_ml_kem_serialize_serialize_uncompressed_ring_element_5b(
11324 libcrux_ml_kem_polynomial_PolynomialRingElement_f0 *re, uint8_t ret[384U]) {
11325 uint8_t serialized[384U] = {0U};
11326 for (size_t i = (size_t)0U;
11327 i < LIBCRUX_ML_KEM_POLYNOMIAL_VECTORS_IN_RING_ELEMENT; i++) {
11328 size_t i0 = i;
11329 libcrux_ml_kem_vector_portable_vector_type_PortableVector coefficient =
11330 libcrux_ml_kem_vector_traits_to_unsigned_representative_db(
11331 re->coefficients[i0]);
11332 uint8_t bytes[24U];
11333 libcrux_ml_kem_vector_portable_serialize_12_0d(coefficient, bytes);
11334 Eurydice_slice uu____0 = Eurydice_array_to_subslice2(
11335 serialized, (size_t)24U * i0, (size_t)24U * i0 + (size_t)24U, uint8_t);
11336 Eurydice_slice_copy(
11337 uu____0, Eurydice_array_to_slice((size_t)24U, bytes, uint8_t), uint8_t);
11338 }
11339 memcpy(ret, serialized, (size_t)384U * sizeof(uint8_t));
11340 }
11341
11342 /**
11343 Call [`serialize_uncompressed_ring_element`] for each ring element.
11344 */
11345 /**
11346 A monomorphic instance of libcrux_ml_kem.ind_cpa.serialize_secret_key
11347 with types libcrux_ml_kem_vector_portable_vector_type_PortableVector
11348 with const generics
11349 - K= 3
11350 - OUT_LEN= 1152
11351 */
libcrux_ml_kem_ind_cpa_serialize_secret_key_b5(libcrux_ml_kem_polynomial_PolynomialRingElement_f0 * key,uint8_t ret[1152U])11352 static KRML_MUSTINLINE void libcrux_ml_kem_ind_cpa_serialize_secret_key_b5(
11353 libcrux_ml_kem_polynomial_PolynomialRingElement_f0 *key,
11354 uint8_t ret[1152U]) {
11355 uint8_t out[1152U] = {0U};
11356 for (size_t i = (size_t)0U;
11357 i < Eurydice_slice_len(
11358 Eurydice_array_to_slice(
11359 (size_t)3U, key,
11360 libcrux_ml_kem_polynomial_PolynomialRingElement_f0),
11361 libcrux_ml_kem_polynomial_PolynomialRingElement_f0);
11362 i++) {
11363 size_t i0 = i;
11364 libcrux_ml_kem_polynomial_PolynomialRingElement_f0 re = key[i0];
11365 Eurydice_slice uu____0 = Eurydice_array_to_subslice2(
11366 out, i0 * LIBCRUX_ML_KEM_CONSTANTS_BYTES_PER_RING_ELEMENT,
11367 (i0 + (size_t)1U) * LIBCRUX_ML_KEM_CONSTANTS_BYTES_PER_RING_ELEMENT,
11368 uint8_t);
11369 uint8_t ret0[384U];
11370 libcrux_ml_kem_serialize_serialize_uncompressed_ring_element_5b(&re, ret0);
11371 Eurydice_slice_copy(
11372 uu____0, Eurydice_array_to_slice((size_t)384U, ret0, uint8_t), uint8_t);
11373 }
11374 memcpy(ret, out, (size_t)1152U * sizeof(uint8_t));
11375 }
11376
11377 /**
11378 Concatenate `t` and `ρ` into the public key.
11379 */
11380 /**
11381 A monomorphic instance of libcrux_ml_kem.ind_cpa.serialize_public_key
11382 with types libcrux_ml_kem_vector_portable_vector_type_PortableVector
11383 with const generics
11384 - K= 3
11385 - RANKED_BYTES_PER_RING_ELEMENT= 1152
11386 - PUBLIC_KEY_SIZE= 1184
11387 */
libcrux_ml_kem_ind_cpa_serialize_public_key_79(libcrux_ml_kem_polynomial_PolynomialRingElement_f0 * t_as_ntt,Eurydice_slice seed_for_a,uint8_t ret[1184U])11388 static KRML_MUSTINLINE void libcrux_ml_kem_ind_cpa_serialize_public_key_79(
11389 libcrux_ml_kem_polynomial_PolynomialRingElement_f0 *t_as_ntt,
11390 Eurydice_slice seed_for_a, uint8_t ret[1184U]) {
11391 uint8_t public_key_serialized[1184U] = {0U};
11392 Eurydice_slice uu____0 = Eurydice_array_to_subslice2(
11393 public_key_serialized, (size_t)0U, (size_t)1152U, uint8_t);
11394 uint8_t ret0[1152U];
11395 libcrux_ml_kem_ind_cpa_serialize_secret_key_b5(t_as_ntt, ret0);
11396 Eurydice_slice_copy(
11397 uu____0, Eurydice_array_to_slice((size_t)1152U, ret0, uint8_t), uint8_t);
11398 Eurydice_slice_copy(
11399 Eurydice_array_to_subslice_from((size_t)1184U, public_key_serialized,
11400 (size_t)1152U, uint8_t, size_t),
11401 seed_for_a, uint8_t);
11402 memcpy(ret, public_key_serialized, (size_t)1184U * sizeof(uint8_t));
11403 }
11404
11405 /**
11406 A monomorphic instance of libcrux_ml_kem.ind_cpa.generate_keypair
11407 with types libcrux_ml_kem_vector_portable_vector_type_PortableVector,
11408 libcrux_ml_kem_hash_functions_portable_PortableHash[[$3size_t]],
11409 libcrux_ml_kem_variant_MlKem with const generics
11410 - K= 3
11411 - PRIVATE_KEY_SIZE= 1152
11412 - PUBLIC_KEY_SIZE= 1184
11413 - RANKED_BYTES_PER_RING_ELEMENT= 1152
11414 - ETA1= 2
11415 - ETA1_RANDOMNESS_SIZE= 128
11416 */
11417 static inline libcrux_ml_kem_utils_extraction_helper_Keypair768
libcrux_ml_kem_ind_cpa_generate_keypair_fc(Eurydice_slice key_generation_seed)11418 libcrux_ml_kem_ind_cpa_generate_keypair_fc(Eurydice_slice key_generation_seed) {
11419 uint8_t hashed[64U];
11420 libcrux_ml_kem_variant_cpa_keygen_seed_d8_0e(key_generation_seed, hashed);
11421 Eurydice_slice_uint8_t_x2 uu____0 = Eurydice_slice_split_at(
11422 Eurydice_array_to_slice((size_t)64U, hashed, uint8_t), (size_t)32U,
11423 uint8_t, Eurydice_slice_uint8_t_x2);
11424 Eurydice_slice seed_for_A0 = uu____0.fst;
11425 Eurydice_slice seed_for_secret_and_error = uu____0.snd;
11426 libcrux_ml_kem_polynomial_PolynomialRingElement_f0 A_transpose[3U][3U];
11427 uint8_t ret[34U];
11428 libcrux_ml_kem_utils_into_padded_array_ea1(seed_for_A0, ret);
11429 libcrux_ml_kem_matrix_sample_matrix_A_38(ret, true, A_transpose);
11430 uint8_t prf_input[33U];
11431 libcrux_ml_kem_utils_into_padded_array_ea2(seed_for_secret_and_error,
11432 prf_input);
11433 /* Passing arrays by value in Rust generates a copy in C */
11434 uint8_t copy_of_prf_input0[33U];
11435 memcpy(copy_of_prf_input0, prf_input, (size_t)33U * sizeof(uint8_t));
11436 tuple_b0 uu____2 = libcrux_ml_kem_ind_cpa_sample_vector_cbd_then_ntt_fc(
11437 copy_of_prf_input0, 0U);
11438 libcrux_ml_kem_polynomial_PolynomialRingElement_f0 secret_as_ntt[3U];
11439 memcpy(
11440 secret_as_ntt, uu____2.fst,
11441 (size_t)3U * sizeof(libcrux_ml_kem_polynomial_PolynomialRingElement_f0));
11442 uint8_t domain_separator = uu____2.snd;
11443 /* Passing arrays by value in Rust generates a copy in C */
11444 uint8_t copy_of_prf_input[33U];
11445 memcpy(copy_of_prf_input, prf_input, (size_t)33U * sizeof(uint8_t));
11446 libcrux_ml_kem_polynomial_PolynomialRingElement_f0 error_as_ntt[3U];
11447 memcpy(
11448 error_as_ntt,
11449 libcrux_ml_kem_ind_cpa_sample_vector_cbd_then_ntt_fc(copy_of_prf_input,
11450 domain_separator)
11451 .fst,
11452 (size_t)3U * sizeof(libcrux_ml_kem_polynomial_PolynomialRingElement_f0));
11453 libcrux_ml_kem_polynomial_PolynomialRingElement_f0 t_as_ntt[3U];
11454 libcrux_ml_kem_matrix_compute_As_plus_e_60(A_transpose, secret_as_ntt,
11455 error_as_ntt, t_as_ntt);
11456 uint8_t seed_for_A[32U];
11457 Result_00 dst;
11458 Eurydice_slice_to_array2(&dst, seed_for_A0, Eurydice_slice, uint8_t[32U]);
11459 unwrap_41_83(dst, seed_for_A);
11460 uint8_t public_key_serialized[1184U];
11461 libcrux_ml_kem_ind_cpa_serialize_public_key_79(
11462 t_as_ntt, Eurydice_array_to_slice((size_t)32U, seed_for_A, uint8_t),
11463 public_key_serialized);
11464 uint8_t secret_key_serialized[1152U];
11465 libcrux_ml_kem_ind_cpa_serialize_secret_key_b5(secret_as_ntt,
11466 secret_key_serialized);
11467 /* Passing arrays by value in Rust generates a copy in C */
11468 uint8_t copy_of_secret_key_serialized[1152U];
11469 memcpy(copy_of_secret_key_serialized, secret_key_serialized,
11470 (size_t)1152U * sizeof(uint8_t));
11471 /* Passing arrays by value in Rust generates a copy in C */
11472 uint8_t copy_of_public_key_serialized[1184U];
11473 memcpy(copy_of_public_key_serialized, public_key_serialized,
11474 (size_t)1184U * sizeof(uint8_t));
11475 libcrux_ml_kem_utils_extraction_helper_Keypair768 lit;
11476 memcpy(lit.fst, copy_of_secret_key_serialized,
11477 (size_t)1152U * sizeof(uint8_t));
11478 memcpy(lit.snd, copy_of_public_key_serialized,
11479 (size_t)1184U * sizeof(uint8_t));
11480 return lit;
11481 }
11482
11483 /**
11484 Serialize the secret key.
11485 */
11486 /**
11487 A monomorphic instance of libcrux_ml_kem.ind_cca.serialize_kem_secret_key
11488 with types libcrux_ml_kem_hash_functions_portable_PortableHash[[$3size_t]]
11489 with const generics
11490 - K= 3
11491 - SERIALIZED_KEY_LEN= 2400
11492 */
libcrux_ml_kem_ind_cca_serialize_kem_secret_key_48(Eurydice_slice private_key,Eurydice_slice public_key,Eurydice_slice implicit_rejection_value,uint8_t ret[2400U])11493 static KRML_MUSTINLINE void libcrux_ml_kem_ind_cca_serialize_kem_secret_key_48(
11494 Eurydice_slice private_key, Eurydice_slice public_key,
11495 Eurydice_slice implicit_rejection_value, uint8_t ret[2400U]) {
11496 uint8_t out[2400U] = {0U};
11497 size_t pointer = (size_t)0U;
11498 uint8_t *uu____0 = out;
11499 size_t uu____1 = pointer;
11500 size_t uu____2 = pointer;
11501 Eurydice_slice_copy(
11502 Eurydice_array_to_subslice2(
11503 uu____0, uu____1, uu____2 + Eurydice_slice_len(private_key, uint8_t),
11504 uint8_t),
11505 private_key, uint8_t);
11506 pointer = pointer + Eurydice_slice_len(private_key, uint8_t);
11507 uint8_t *uu____3 = out;
11508 size_t uu____4 = pointer;
11509 size_t uu____5 = pointer;
11510 Eurydice_slice_copy(
11511 Eurydice_array_to_subslice2(
11512 uu____3, uu____4, uu____5 + Eurydice_slice_len(public_key, uint8_t),
11513 uint8_t),
11514 public_key, uint8_t);
11515 pointer = pointer + Eurydice_slice_len(public_key, uint8_t);
11516 Eurydice_slice uu____6 = Eurydice_array_to_subslice2(
11517 out, pointer, pointer + LIBCRUX_ML_KEM_CONSTANTS_H_DIGEST_SIZE, uint8_t);
11518 uint8_t ret0[32U];
11519 libcrux_ml_kem_hash_functions_portable_H_f1_1a(public_key, ret0);
11520 Eurydice_slice_copy(
11521 uu____6, Eurydice_array_to_slice((size_t)32U, ret0, uint8_t), uint8_t);
11522 pointer = pointer + LIBCRUX_ML_KEM_CONSTANTS_H_DIGEST_SIZE;
11523 uint8_t *uu____7 = out;
11524 size_t uu____8 = pointer;
11525 size_t uu____9 = pointer;
11526 Eurydice_slice_copy(
11527 Eurydice_array_to_subslice2(
11528 uu____7, uu____8,
11529 uu____9 + Eurydice_slice_len(implicit_rejection_value, uint8_t),
11530 uint8_t),
11531 implicit_rejection_value, uint8_t);
11532 memcpy(ret, out, (size_t)2400U * sizeof(uint8_t));
11533 }
11534
11535 /**
11536 Packed API
11537
11538 Generate a key pair.
11539
11540 Depending on the `Vector` and `Hasher` used, this requires different hardware
11541 features
11542 */
11543 /**
11544 A monomorphic instance of libcrux_ml_kem.ind_cca.generate_keypair
11545 with types libcrux_ml_kem_vector_portable_vector_type_PortableVector,
11546 libcrux_ml_kem_hash_functions_portable_PortableHash[[$3size_t]],
11547 libcrux_ml_kem_variant_MlKem with const generics
11548 - K= 3
11549 - CPA_PRIVATE_KEY_SIZE= 1152
11550 - PRIVATE_KEY_SIZE= 2400
11551 - PUBLIC_KEY_SIZE= 1184
11552 - BYTES_PER_RING_ELEMENT= 1152
11553 - ETA1= 2
11554 - ETA1_RANDOMNESS_SIZE= 128
11555 */
11556 static inline libcrux_ml_kem_mlkem768_MlKem768KeyPair
libcrux_ml_kem_ind_cca_generate_keypair_8c(uint8_t randomness[64U])11557 libcrux_ml_kem_ind_cca_generate_keypair_8c(uint8_t randomness[64U]) {
11558 Eurydice_slice ind_cpa_keypair_randomness = Eurydice_array_to_subslice2(
11559 randomness, (size_t)0U,
11560 LIBCRUX_ML_KEM_CONSTANTS_CPA_PKE_KEY_GENERATION_SEED_SIZE, uint8_t);
11561 Eurydice_slice implicit_rejection_value = Eurydice_array_to_subslice_from(
11562 (size_t)64U, randomness,
11563 LIBCRUX_ML_KEM_CONSTANTS_CPA_PKE_KEY_GENERATION_SEED_SIZE, uint8_t,
11564 size_t);
11565 libcrux_ml_kem_utils_extraction_helper_Keypair768 uu____0 =
11566 libcrux_ml_kem_ind_cpa_generate_keypair_fc(ind_cpa_keypair_randomness);
11567 uint8_t ind_cpa_private_key[1152U];
11568 memcpy(ind_cpa_private_key, uu____0.fst, (size_t)1152U * sizeof(uint8_t));
11569 uint8_t public_key[1184U];
11570 memcpy(public_key, uu____0.snd, (size_t)1184U * sizeof(uint8_t));
11571 uint8_t secret_key_serialized[2400U];
11572 libcrux_ml_kem_ind_cca_serialize_kem_secret_key_48(
11573 Eurydice_array_to_slice((size_t)1152U, ind_cpa_private_key, uint8_t),
11574 Eurydice_array_to_slice((size_t)1184U, public_key, uint8_t),
11575 implicit_rejection_value, secret_key_serialized);
11576 /* Passing arrays by value in Rust generates a copy in C */
11577 uint8_t copy_of_secret_key_serialized[2400U];
11578 memcpy(copy_of_secret_key_serialized, secret_key_serialized,
11579 (size_t)2400U * sizeof(uint8_t));
11580 libcrux_ml_kem_types_MlKemPrivateKey_55 private_key =
11581 libcrux_ml_kem_types_from_05_f2(copy_of_secret_key_serialized);
11582 libcrux_ml_kem_types_MlKemPrivateKey_55 uu____2 = private_key;
11583 /* Passing arrays by value in Rust generates a copy in C */
11584 uint8_t copy_of_public_key[1184U];
11585 memcpy(copy_of_public_key, public_key, (size_t)1184U * sizeof(uint8_t));
11586 return libcrux_ml_kem_types_from_17_35(
11587 uu____2, libcrux_ml_kem_types_from_b6_da(copy_of_public_key));
11588 }
11589
11590 /**
11591 Portable generate key pair.
11592 */
11593 /**
11594 A monomorphic instance of
11595 libcrux_ml_kem.ind_cca.instantiations.portable.generate_keypair with const
11596 generics
11597 - K= 3
11598 - CPA_PRIVATE_KEY_SIZE= 1152
11599 - PRIVATE_KEY_SIZE= 2400
11600 - PUBLIC_KEY_SIZE= 1184
11601 - BYTES_PER_RING_ELEMENT= 1152
11602 - ETA1= 2
11603 - ETA1_RANDOMNESS_SIZE= 128
11604 */
11605 static inline libcrux_ml_kem_mlkem768_MlKem768KeyPair
libcrux_ml_kem_ind_cca_instantiations_portable_generate_keypair_d5(uint8_t randomness[64U])11606 libcrux_ml_kem_ind_cca_instantiations_portable_generate_keypair_d5(
11607 uint8_t randomness[64U]) {
11608 /* Passing arrays by value in Rust generates a copy in C */
11609 uint8_t copy_of_randomness[64U];
11610 memcpy(copy_of_randomness, randomness, (size_t)64U * sizeof(uint8_t));
11611 return libcrux_ml_kem_ind_cca_generate_keypair_8c(copy_of_randomness);
11612 }
11613
11614 /**
11615 Generate ML-KEM 768 Key Pair
11616 */
11617 static inline libcrux_ml_kem_mlkem768_MlKem768KeyPair
libcrux_ml_kem_mlkem768_portable_generate_key_pair(uint8_t randomness[64U])11618 libcrux_ml_kem_mlkem768_portable_generate_key_pair(uint8_t randomness[64U]) {
11619 /* Passing arrays by value in Rust generates a copy in C */
11620 uint8_t copy_of_randomness[64U];
11621 memcpy(copy_of_randomness, randomness, (size_t)64U * sizeof(uint8_t));
11622 return libcrux_ml_kem_ind_cca_instantiations_portable_generate_keypair_d5(
11623 copy_of_randomness);
11624 }
11625
11626 /**
11627 This function found in impl {(libcrux_ml_kem::variant::Variant for
11628 libcrux_ml_kem::variant::Kyber)}
11629 */
11630 /**
11631 A monomorphic instance of libcrux_ml_kem.variant.kdf_33
11632 with types libcrux_ml_kem_hash_functions_portable_PortableHash[[$3size_t]]
11633 with const generics
11634 - K= 3
11635 - CIPHERTEXT_SIZE= 1088
11636 */
libcrux_ml_kem_variant_kdf_33_f0(Eurydice_slice shared_secret,libcrux_ml_kem_mlkem768_MlKem768Ciphertext * ciphertext,uint8_t ret[32U])11637 static KRML_MUSTINLINE void libcrux_ml_kem_variant_kdf_33_f0(
11638 Eurydice_slice shared_secret,
11639 libcrux_ml_kem_mlkem768_MlKem768Ciphertext *ciphertext, uint8_t ret[32U]) {
11640 uint8_t kdf_input[64U];
11641 libcrux_ml_kem_utils_into_padded_array_ea(shared_secret, kdf_input);
11642 Eurydice_slice uu____0 = Eurydice_array_to_subslice_from(
11643 (size_t)64U, kdf_input, LIBCRUX_ML_KEM_CONSTANTS_H_DIGEST_SIZE, uint8_t,
11644 size_t);
11645 uint8_t ret0[32U];
11646 libcrux_ml_kem_hash_functions_portable_H_f1_1a(
11647 Eurydice_array_to_slice((size_t)1088U,
11648 libcrux_ml_kem_types_as_slice_d4_1d(ciphertext),
11649 uint8_t),
11650 ret0);
11651 Eurydice_slice_copy(
11652 uu____0, Eurydice_array_to_slice((size_t)32U, ret0, uint8_t), uint8_t);
11653 uint8_t ret1[32U];
11654 libcrux_ml_kem_hash_functions_portable_PRF_f1_ee(
11655 Eurydice_array_to_slice((size_t)64U, kdf_input, uint8_t), ret1);
11656 memcpy(ret, ret1, (size_t)32U * sizeof(uint8_t));
11657 }
11658
11659 /**
11660 A monomorphic instance of libcrux_ml_kem.ind_cca.decapsulate
11661 with types libcrux_ml_kem_vector_portable_vector_type_PortableVector,
11662 libcrux_ml_kem_hash_functions_portable_PortableHash[[$3size_t]],
11663 libcrux_ml_kem_variant_Kyber with const generics
11664 - K= 3
11665 - SECRET_KEY_SIZE= 2400
11666 - CPA_SECRET_KEY_SIZE= 1152
11667 - PUBLIC_KEY_SIZE= 1184
11668 - CIPHERTEXT_SIZE= 1088
11669 - T_AS_NTT_ENCODED_SIZE= 1152
11670 - C1_SIZE= 960
11671 - C2_SIZE= 128
11672 - VECTOR_U_COMPRESSION_FACTOR= 10
11673 - VECTOR_V_COMPRESSION_FACTOR= 4
11674 - C1_BLOCK_SIZE= 320
11675 - ETA1= 2
11676 - ETA1_RANDOMNESS_SIZE= 128
11677 - ETA2= 2
11678 - ETA2_RANDOMNESS_SIZE= 128
11679 - IMPLICIT_REJECTION_HASH_INPUT_SIZE= 1120
11680 */
libcrux_ml_kem_ind_cca_decapsulate_700(libcrux_ml_kem_types_MlKemPrivateKey_55 * private_key,libcrux_ml_kem_mlkem768_MlKem768Ciphertext * ciphertext,uint8_t ret[32U])11681 static inline void libcrux_ml_kem_ind_cca_decapsulate_700(
11682 libcrux_ml_kem_types_MlKemPrivateKey_55 *private_key,
11683 libcrux_ml_kem_mlkem768_MlKem768Ciphertext *ciphertext, uint8_t ret[32U]) {
11684 Eurydice_slice_uint8_t_x2 uu____0 = Eurydice_slice_split_at(
11685 Eurydice_array_to_slice((size_t)2400U, private_key->value, uint8_t),
11686 (size_t)1152U, uint8_t, Eurydice_slice_uint8_t_x2);
11687 Eurydice_slice ind_cpa_secret_key = uu____0.fst;
11688 Eurydice_slice secret_key0 = uu____0.snd;
11689 Eurydice_slice_uint8_t_x2 uu____1 = Eurydice_slice_split_at(
11690 secret_key0, (size_t)1184U, uint8_t, Eurydice_slice_uint8_t_x2);
11691 Eurydice_slice ind_cpa_public_key = uu____1.fst;
11692 Eurydice_slice secret_key = uu____1.snd;
11693 Eurydice_slice_uint8_t_x2 uu____2 = Eurydice_slice_split_at(
11694 secret_key, LIBCRUX_ML_KEM_CONSTANTS_H_DIGEST_SIZE, uint8_t,
11695 Eurydice_slice_uint8_t_x2);
11696 Eurydice_slice ind_cpa_public_key_hash = uu____2.fst;
11697 Eurydice_slice implicit_rejection_value = uu____2.snd;
11698 uint8_t decrypted[32U];
11699 libcrux_ml_kem_ind_cpa_decrypt_43(ind_cpa_secret_key, ciphertext->value,
11700 decrypted);
11701 uint8_t to_hash0[64U];
11702 libcrux_ml_kem_utils_into_padded_array_ea(
11703 Eurydice_array_to_slice((size_t)32U, decrypted, uint8_t), to_hash0);
11704 Eurydice_slice_copy(
11705 Eurydice_array_to_subslice_from(
11706 (size_t)64U, to_hash0, LIBCRUX_ML_KEM_CONSTANTS_SHARED_SECRET_SIZE,
11707 uint8_t, size_t),
11708 ind_cpa_public_key_hash, uint8_t);
11709 uint8_t hashed[64U];
11710 libcrux_ml_kem_hash_functions_portable_G_f1_e4(
11711 Eurydice_array_to_slice((size_t)64U, to_hash0, uint8_t), hashed);
11712 Eurydice_slice_uint8_t_x2 uu____3 = Eurydice_slice_split_at(
11713 Eurydice_array_to_slice((size_t)64U, hashed, uint8_t),
11714 LIBCRUX_ML_KEM_CONSTANTS_SHARED_SECRET_SIZE, uint8_t,
11715 Eurydice_slice_uint8_t_x2);
11716 Eurydice_slice shared_secret0 = uu____3.fst;
11717 Eurydice_slice pseudorandomness = uu____3.snd;
11718 uint8_t to_hash[1120U];
11719 libcrux_ml_kem_utils_into_padded_array_ea0(implicit_rejection_value, to_hash);
11720 Eurydice_slice uu____4 = Eurydice_array_to_subslice_from(
11721 (size_t)1120U, to_hash, LIBCRUX_ML_KEM_CONSTANTS_SHARED_SECRET_SIZE,
11722 uint8_t, size_t);
11723 Eurydice_slice_copy(uu____4, libcrux_ml_kem_types_as_ref_00_24(ciphertext),
11724 uint8_t);
11725 uint8_t implicit_rejection_shared_secret0[32U];
11726 libcrux_ml_kem_hash_functions_portable_PRF_f1_ee(
11727 Eurydice_array_to_slice((size_t)1120U, to_hash, uint8_t),
11728 implicit_rejection_shared_secret0);
11729 Eurydice_slice uu____5 = ind_cpa_public_key;
11730 /* Passing arrays by value in Rust generates a copy in C */
11731 uint8_t copy_of_decrypted[32U];
11732 memcpy(copy_of_decrypted, decrypted, (size_t)32U * sizeof(uint8_t));
11733 uint8_t expected_ciphertext[1088U];
11734 libcrux_ml_kem_ind_cpa_encrypt_60(uu____5, copy_of_decrypted,
11735 pseudorandomness, expected_ciphertext);
11736 uint8_t implicit_rejection_shared_secret[32U];
11737 libcrux_ml_kem_variant_kdf_33_f0(
11738 Eurydice_array_to_slice((size_t)32U, implicit_rejection_shared_secret0,
11739 uint8_t),
11740 ciphertext, implicit_rejection_shared_secret);
11741 uint8_t shared_secret[32U];
11742 libcrux_ml_kem_variant_kdf_33_f0(shared_secret0, ciphertext, shared_secret);
11743 uint8_t ret0[32U];
11744 libcrux_ml_kem_constant_time_ops_compare_ciphertexts_select_shared_secret_in_constant_time(
11745 libcrux_ml_kem_types_as_ref_00_24(ciphertext),
11746 Eurydice_array_to_slice((size_t)1088U, expected_ciphertext, uint8_t),
11747 Eurydice_array_to_slice((size_t)32U, shared_secret, uint8_t),
11748 Eurydice_array_to_slice((size_t)32U, implicit_rejection_shared_secret,
11749 uint8_t),
11750 ret0);
11751 memcpy(ret, ret0, (size_t)32U * sizeof(uint8_t));
11752 }
11753
11754 /**
11755 Portable decapsulate
11756 */
11757 /**
11758 A monomorphic instance of
11759 libcrux_ml_kem.ind_cca.instantiations.portable.kyber_decapsulate with const
11760 generics
11761 - K= 3
11762 - SECRET_KEY_SIZE= 2400
11763 - CPA_SECRET_KEY_SIZE= 1152
11764 - PUBLIC_KEY_SIZE= 1184
11765 - CIPHERTEXT_SIZE= 1088
11766 - T_AS_NTT_ENCODED_SIZE= 1152
11767 - C1_SIZE= 960
11768 - C2_SIZE= 128
11769 - VECTOR_U_COMPRESSION_FACTOR= 10
11770 - VECTOR_V_COMPRESSION_FACTOR= 4
11771 - C1_BLOCK_SIZE= 320
11772 - ETA1= 2
11773 - ETA1_RANDOMNESS_SIZE= 128
11774 - ETA2= 2
11775 - ETA2_RANDOMNESS_SIZE= 128
11776 - IMPLICIT_REJECTION_HASH_INPUT_SIZE= 1120
11777 */
11778 static inline void
libcrux_ml_kem_ind_cca_instantiations_portable_kyber_decapsulate_fc(libcrux_ml_kem_types_MlKemPrivateKey_55 * private_key,libcrux_ml_kem_mlkem768_MlKem768Ciphertext * ciphertext,uint8_t ret[32U])11779 libcrux_ml_kem_ind_cca_instantiations_portable_kyber_decapsulate_fc(
11780 libcrux_ml_kem_types_MlKemPrivateKey_55 *private_key,
11781 libcrux_ml_kem_mlkem768_MlKem768Ciphertext *ciphertext, uint8_t ret[32U]) {
11782 libcrux_ml_kem_ind_cca_decapsulate_700(private_key, ciphertext, ret);
11783 }
11784
11785 /**
11786 Decapsulate Kyber 768
11787
11788 Generates an [`MlKemSharedSecret`].
11789 The input is a reference to an [`MlKem768PrivateKey`] and an
11790 [`MlKem768Ciphertext`].
11791 */
libcrux_ml_kem_mlkem768_portable_kyber_decapsulate(libcrux_ml_kem_types_MlKemPrivateKey_55 * private_key,libcrux_ml_kem_mlkem768_MlKem768Ciphertext * ciphertext,uint8_t ret[32U])11792 static inline void libcrux_ml_kem_mlkem768_portable_kyber_decapsulate(
11793 libcrux_ml_kem_types_MlKemPrivateKey_55 *private_key,
11794 libcrux_ml_kem_mlkem768_MlKem768Ciphertext *ciphertext, uint8_t ret[32U]) {
11795 libcrux_ml_kem_ind_cca_instantiations_portable_kyber_decapsulate_fc(
11796 private_key, ciphertext, ret);
11797 }
11798
11799 /**
11800 This function found in impl {(libcrux_ml_kem::variant::Variant for
11801 libcrux_ml_kem::variant::Kyber)}
11802 */
11803 /**
11804 A monomorphic instance of libcrux_ml_kem.variant.entropy_preprocess_33
11805 with types libcrux_ml_kem_hash_functions_portable_PortableHash[[$3size_t]]
11806 with const generics
11807 - K= 3
11808 */
libcrux_ml_kem_variant_entropy_preprocess_33_8a(Eurydice_slice randomness,uint8_t ret[32U])11809 static KRML_MUSTINLINE void libcrux_ml_kem_variant_entropy_preprocess_33_8a(
11810 Eurydice_slice randomness, uint8_t ret[32U]) {
11811 libcrux_ml_kem_hash_functions_portable_H_f1_1a(randomness, ret);
11812 }
11813
11814 /**
11815 A monomorphic instance of libcrux_ml_kem.ind_cca.encapsulate
11816 with types libcrux_ml_kem_vector_portable_vector_type_PortableVector,
11817 libcrux_ml_kem_hash_functions_portable_PortableHash[[$3size_t]],
11818 libcrux_ml_kem_variant_Kyber with const generics
11819 - K= 3
11820 - CIPHERTEXT_SIZE= 1088
11821 - PUBLIC_KEY_SIZE= 1184
11822 - T_AS_NTT_ENCODED_SIZE= 1152
11823 - C1_SIZE= 960
11824 - C2_SIZE= 128
11825 - VECTOR_U_COMPRESSION_FACTOR= 10
11826 - VECTOR_V_COMPRESSION_FACTOR= 4
11827 - VECTOR_U_BLOCK_LEN= 320
11828 - ETA1= 2
11829 - ETA1_RANDOMNESS_SIZE= 128
11830 - ETA2= 2
11831 - ETA2_RANDOMNESS_SIZE= 128
11832 */
libcrux_ml_kem_ind_cca_encapsulate_cd0(libcrux_ml_kem_types_MlKemPublicKey_15 * public_key,uint8_t randomness[32U])11833 static inline tuple_3c libcrux_ml_kem_ind_cca_encapsulate_cd0(
11834 libcrux_ml_kem_types_MlKemPublicKey_15 *public_key,
11835 uint8_t randomness[32U]) {
11836 uint8_t randomness0[32U];
11837 libcrux_ml_kem_variant_entropy_preprocess_33_8a(
11838 Eurydice_array_to_slice((size_t)32U, randomness, uint8_t), randomness0);
11839 uint8_t to_hash[64U];
11840 libcrux_ml_kem_utils_into_padded_array_ea(
11841 Eurydice_array_to_slice((size_t)32U, randomness0, uint8_t), to_hash);
11842 Eurydice_slice uu____0 = Eurydice_array_to_subslice_from(
11843 (size_t)64U, to_hash, LIBCRUX_ML_KEM_CONSTANTS_H_DIGEST_SIZE, uint8_t,
11844 size_t);
11845 uint8_t ret[32U];
11846 libcrux_ml_kem_hash_functions_portable_H_f1_1a(
11847 Eurydice_array_to_slice((size_t)1184U,
11848 libcrux_ml_kem_types_as_slice_cb_50(public_key),
11849 uint8_t),
11850 ret);
11851 Eurydice_slice_copy(
11852 uu____0, Eurydice_array_to_slice((size_t)32U, ret, uint8_t), uint8_t);
11853 uint8_t hashed[64U];
11854 libcrux_ml_kem_hash_functions_portable_G_f1_e4(
11855 Eurydice_array_to_slice((size_t)64U, to_hash, uint8_t), hashed);
11856 Eurydice_slice_uint8_t_x2 uu____1 = Eurydice_slice_split_at(
11857 Eurydice_array_to_slice((size_t)64U, hashed, uint8_t),
11858 LIBCRUX_ML_KEM_CONSTANTS_SHARED_SECRET_SIZE, uint8_t,
11859 Eurydice_slice_uint8_t_x2);
11860 Eurydice_slice shared_secret = uu____1.fst;
11861 Eurydice_slice pseudorandomness = uu____1.snd;
11862 Eurydice_slice uu____2 = Eurydice_array_to_slice(
11863 (size_t)1184U, libcrux_ml_kem_types_as_slice_cb_50(public_key), uint8_t);
11864 /* Passing arrays by value in Rust generates a copy in C */
11865 uint8_t copy_of_randomness[32U];
11866 memcpy(copy_of_randomness, randomness0, (size_t)32U * sizeof(uint8_t));
11867 uint8_t ciphertext[1088U];
11868 libcrux_ml_kem_ind_cpa_encrypt_60(uu____2, copy_of_randomness,
11869 pseudorandomness, ciphertext);
11870 /* Passing arrays by value in Rust generates a copy in C */
11871 uint8_t copy_of_ciphertext[1088U];
11872 memcpy(copy_of_ciphertext, ciphertext, (size_t)1088U * sizeof(uint8_t));
11873 libcrux_ml_kem_mlkem768_MlKem768Ciphertext ciphertext0 =
11874 libcrux_ml_kem_types_from_01_9f(copy_of_ciphertext);
11875 uint8_t shared_secret_array[32U];
11876 libcrux_ml_kem_variant_kdf_33_f0(shared_secret, &ciphertext0,
11877 shared_secret_array);
11878 libcrux_ml_kem_mlkem768_MlKem768Ciphertext uu____5 = ciphertext0;
11879 /* Passing arrays by value in Rust generates a copy in C */
11880 uint8_t copy_of_shared_secret_array[32U];
11881 memcpy(copy_of_shared_secret_array, shared_secret_array,
11882 (size_t)32U * sizeof(uint8_t));
11883 tuple_3c lit;
11884 lit.fst = uu____5;
11885 memcpy(lit.snd, copy_of_shared_secret_array, (size_t)32U * sizeof(uint8_t));
11886 return lit;
11887 }
11888
11889 /**
11890 Portable encapsulate
11891 */
11892 /**
11893 A monomorphic instance of
11894 libcrux_ml_kem.ind_cca.instantiations.portable.kyber_encapsulate with const
11895 generics
11896 - K= 3
11897 - CIPHERTEXT_SIZE= 1088
11898 - PUBLIC_KEY_SIZE= 1184
11899 - T_AS_NTT_ENCODED_SIZE= 1152
11900 - C1_SIZE= 960
11901 - C2_SIZE= 128
11902 - VECTOR_U_COMPRESSION_FACTOR= 10
11903 - VECTOR_V_COMPRESSION_FACTOR= 4
11904 - VECTOR_U_BLOCK_LEN= 320
11905 - ETA1= 2
11906 - ETA1_RANDOMNESS_SIZE= 128
11907 - ETA2= 2
11908 - ETA2_RANDOMNESS_SIZE= 128
11909 */
11910 static inline tuple_3c
libcrux_ml_kem_ind_cca_instantiations_portable_kyber_encapsulate_7a(libcrux_ml_kem_types_MlKemPublicKey_15 * public_key,uint8_t randomness[32U])11911 libcrux_ml_kem_ind_cca_instantiations_portable_kyber_encapsulate_7a(
11912 libcrux_ml_kem_types_MlKemPublicKey_15 *public_key,
11913 uint8_t randomness[32U]) {
11914 libcrux_ml_kem_types_MlKemPublicKey_15 *uu____0 = public_key;
11915 /* Passing arrays by value in Rust generates a copy in C */
11916 uint8_t copy_of_randomness[32U];
11917 memcpy(copy_of_randomness, randomness, (size_t)32U * sizeof(uint8_t));
11918 return libcrux_ml_kem_ind_cca_encapsulate_cd0(uu____0, copy_of_randomness);
11919 }
11920
11921 /**
11922 Encapsulate Kyber 768
11923
11924 Generates an ([`MlKem768Ciphertext`], [`MlKemSharedSecret`]) tuple.
11925 The input is a reference to an [`MlKem768PublicKey`] and [`SHARED_SECRET_SIZE`]
11926 bytes of `randomness`.
11927 */
libcrux_ml_kem_mlkem768_portable_kyber_encapsulate(libcrux_ml_kem_types_MlKemPublicKey_15 * public_key,uint8_t randomness[32U])11928 static inline tuple_3c libcrux_ml_kem_mlkem768_portable_kyber_encapsulate(
11929 libcrux_ml_kem_types_MlKemPublicKey_15 *public_key,
11930 uint8_t randomness[32U]) {
11931 libcrux_ml_kem_types_MlKemPublicKey_15 *uu____0 = public_key;
11932 /* Passing arrays by value in Rust generates a copy in C */
11933 uint8_t copy_of_randomness[32U];
11934 memcpy(copy_of_randomness, randomness, (size_t)32U * sizeof(uint8_t));
11935 return libcrux_ml_kem_ind_cca_instantiations_portable_kyber_encapsulate_7a(
11936 uu____0, copy_of_randomness);
11937 }
11938
11939 /**
11940 This function found in impl {(libcrux_ml_kem::variant::Variant for
11941 libcrux_ml_kem::variant::Kyber)}
11942 */
11943 /**
11944 A monomorphic instance of libcrux_ml_kem.variant.cpa_keygen_seed_33
11945 with types libcrux_ml_kem_hash_functions_portable_PortableHash[[$3size_t]]
11946 with const generics
11947 - K= 3
11948 */
libcrux_ml_kem_variant_cpa_keygen_seed_33_b6(Eurydice_slice key_generation_seed,uint8_t ret[64U])11949 static KRML_MUSTINLINE void libcrux_ml_kem_variant_cpa_keygen_seed_33_b6(
11950 Eurydice_slice key_generation_seed, uint8_t ret[64U]) {
11951 libcrux_ml_kem_hash_functions_portable_G_f1_e4(key_generation_seed, ret);
11952 }
11953
11954 /**
11955 A monomorphic instance of libcrux_ml_kem.ind_cpa.generate_keypair
11956 with types libcrux_ml_kem_vector_portable_vector_type_PortableVector,
11957 libcrux_ml_kem_hash_functions_portable_PortableHash[[$3size_t]],
11958 libcrux_ml_kem_variant_Kyber with const generics
11959 - K= 3
11960 - PRIVATE_KEY_SIZE= 1152
11961 - PUBLIC_KEY_SIZE= 1184
11962 - RANKED_BYTES_PER_RING_ELEMENT= 1152
11963 - ETA1= 2
11964 - ETA1_RANDOMNESS_SIZE= 128
11965 */
11966 static inline libcrux_ml_kem_utils_extraction_helper_Keypair768
libcrux_ml_kem_ind_cpa_generate_keypair_fc0(Eurydice_slice key_generation_seed)11967 libcrux_ml_kem_ind_cpa_generate_keypair_fc0(
11968 Eurydice_slice key_generation_seed) {
11969 uint8_t hashed[64U];
11970 libcrux_ml_kem_variant_cpa_keygen_seed_33_b6(key_generation_seed, hashed);
11971 Eurydice_slice_uint8_t_x2 uu____0 = Eurydice_slice_split_at(
11972 Eurydice_array_to_slice((size_t)64U, hashed, uint8_t), (size_t)32U,
11973 uint8_t, Eurydice_slice_uint8_t_x2);
11974 Eurydice_slice seed_for_A0 = uu____0.fst;
11975 Eurydice_slice seed_for_secret_and_error = uu____0.snd;
11976 libcrux_ml_kem_polynomial_PolynomialRingElement_f0 A_transpose[3U][3U];
11977 uint8_t ret[34U];
11978 libcrux_ml_kem_utils_into_padded_array_ea1(seed_for_A0, ret);
11979 libcrux_ml_kem_matrix_sample_matrix_A_38(ret, true, A_transpose);
11980 uint8_t prf_input[33U];
11981 libcrux_ml_kem_utils_into_padded_array_ea2(seed_for_secret_and_error,
11982 prf_input);
11983 /* Passing arrays by value in Rust generates a copy in C */
11984 uint8_t copy_of_prf_input0[33U];
11985 memcpy(copy_of_prf_input0, prf_input, (size_t)33U * sizeof(uint8_t));
11986 tuple_b0 uu____2 = libcrux_ml_kem_ind_cpa_sample_vector_cbd_then_ntt_fc(
11987 copy_of_prf_input0, 0U);
11988 libcrux_ml_kem_polynomial_PolynomialRingElement_f0 secret_as_ntt[3U];
11989 memcpy(
11990 secret_as_ntt, uu____2.fst,
11991 (size_t)3U * sizeof(libcrux_ml_kem_polynomial_PolynomialRingElement_f0));
11992 uint8_t domain_separator = uu____2.snd;
11993 /* Passing arrays by value in Rust generates a copy in C */
11994 uint8_t copy_of_prf_input[33U];
11995 memcpy(copy_of_prf_input, prf_input, (size_t)33U * sizeof(uint8_t));
11996 libcrux_ml_kem_polynomial_PolynomialRingElement_f0 error_as_ntt[3U];
11997 memcpy(
11998 error_as_ntt,
11999 libcrux_ml_kem_ind_cpa_sample_vector_cbd_then_ntt_fc(copy_of_prf_input,
12000 domain_separator)
12001 .fst,
12002 (size_t)3U * sizeof(libcrux_ml_kem_polynomial_PolynomialRingElement_f0));
12003 libcrux_ml_kem_polynomial_PolynomialRingElement_f0 t_as_ntt[3U];
12004 libcrux_ml_kem_matrix_compute_As_plus_e_60(A_transpose, secret_as_ntt,
12005 error_as_ntt, t_as_ntt);
12006 uint8_t seed_for_A[32U];
12007 Result_00 dst;
12008 Eurydice_slice_to_array2(&dst, seed_for_A0, Eurydice_slice, uint8_t[32U]);
12009 unwrap_41_83(dst, seed_for_A);
12010 uint8_t public_key_serialized[1184U];
12011 libcrux_ml_kem_ind_cpa_serialize_public_key_79(
12012 t_as_ntt, Eurydice_array_to_slice((size_t)32U, seed_for_A, uint8_t),
12013 public_key_serialized);
12014 uint8_t secret_key_serialized[1152U];
12015 libcrux_ml_kem_ind_cpa_serialize_secret_key_b5(secret_as_ntt,
12016 secret_key_serialized);
12017 /* Passing arrays by value in Rust generates a copy in C */
12018 uint8_t copy_of_secret_key_serialized[1152U];
12019 memcpy(copy_of_secret_key_serialized, secret_key_serialized,
12020 (size_t)1152U * sizeof(uint8_t));
12021 /* Passing arrays by value in Rust generates a copy in C */
12022 uint8_t copy_of_public_key_serialized[1184U];
12023 memcpy(copy_of_public_key_serialized, public_key_serialized,
12024 (size_t)1184U * sizeof(uint8_t));
12025 libcrux_ml_kem_utils_extraction_helper_Keypair768 lit;
12026 memcpy(lit.fst, copy_of_secret_key_serialized,
12027 (size_t)1152U * sizeof(uint8_t));
12028 memcpy(lit.snd, copy_of_public_key_serialized,
12029 (size_t)1184U * sizeof(uint8_t));
12030 return lit;
12031 }
12032
12033 /**
12034 Packed API
12035
12036 Generate a key pair.
12037
12038 Depending on the `Vector` and `Hasher` used, this requires different hardware
12039 features
12040 */
12041 /**
12042 A monomorphic instance of libcrux_ml_kem.ind_cca.generate_keypair
12043 with types libcrux_ml_kem_vector_portable_vector_type_PortableVector,
12044 libcrux_ml_kem_hash_functions_portable_PortableHash[[$3size_t]],
12045 libcrux_ml_kem_variant_Kyber with const generics
12046 - K= 3
12047 - CPA_PRIVATE_KEY_SIZE= 1152
12048 - PRIVATE_KEY_SIZE= 2400
12049 - PUBLIC_KEY_SIZE= 1184
12050 - BYTES_PER_RING_ELEMENT= 1152
12051 - ETA1= 2
12052 - ETA1_RANDOMNESS_SIZE= 128
12053 */
12054 static inline libcrux_ml_kem_mlkem768_MlKem768KeyPair
libcrux_ml_kem_ind_cca_generate_keypair_8c0(uint8_t randomness[64U])12055 libcrux_ml_kem_ind_cca_generate_keypair_8c0(uint8_t randomness[64U]) {
12056 Eurydice_slice ind_cpa_keypair_randomness = Eurydice_array_to_subslice2(
12057 randomness, (size_t)0U,
12058 LIBCRUX_ML_KEM_CONSTANTS_CPA_PKE_KEY_GENERATION_SEED_SIZE, uint8_t);
12059 Eurydice_slice implicit_rejection_value = Eurydice_array_to_subslice_from(
12060 (size_t)64U, randomness,
12061 LIBCRUX_ML_KEM_CONSTANTS_CPA_PKE_KEY_GENERATION_SEED_SIZE, uint8_t,
12062 size_t);
12063 libcrux_ml_kem_utils_extraction_helper_Keypair768 uu____0 =
12064 libcrux_ml_kem_ind_cpa_generate_keypair_fc0(ind_cpa_keypair_randomness);
12065 uint8_t ind_cpa_private_key[1152U];
12066 memcpy(ind_cpa_private_key, uu____0.fst, (size_t)1152U * sizeof(uint8_t));
12067 uint8_t public_key[1184U];
12068 memcpy(public_key, uu____0.snd, (size_t)1184U * sizeof(uint8_t));
12069 uint8_t secret_key_serialized[2400U];
12070 libcrux_ml_kem_ind_cca_serialize_kem_secret_key_48(
12071 Eurydice_array_to_slice((size_t)1152U, ind_cpa_private_key, uint8_t),
12072 Eurydice_array_to_slice((size_t)1184U, public_key, uint8_t),
12073 implicit_rejection_value, secret_key_serialized);
12074 /* Passing arrays by value in Rust generates a copy in C */
12075 uint8_t copy_of_secret_key_serialized[2400U];
12076 memcpy(copy_of_secret_key_serialized, secret_key_serialized,
12077 (size_t)2400U * sizeof(uint8_t));
12078 libcrux_ml_kem_types_MlKemPrivateKey_55 private_key =
12079 libcrux_ml_kem_types_from_05_f2(copy_of_secret_key_serialized);
12080 libcrux_ml_kem_types_MlKemPrivateKey_55 uu____2 = private_key;
12081 /* Passing arrays by value in Rust generates a copy in C */
12082 uint8_t copy_of_public_key[1184U];
12083 memcpy(copy_of_public_key, public_key, (size_t)1184U * sizeof(uint8_t));
12084 return libcrux_ml_kem_types_from_17_35(
12085 uu____2, libcrux_ml_kem_types_from_b6_da(copy_of_public_key));
12086 }
12087
12088 /**
12089 A monomorphic instance of
12090 libcrux_ml_kem.ind_cca.instantiations.portable.kyber_generate_keypair with const
12091 generics
12092 - K= 3
12093 - CPA_PRIVATE_KEY_SIZE= 1152
12094 - PRIVATE_KEY_SIZE= 2400
12095 - PUBLIC_KEY_SIZE= 1184
12096 - BYTES_PER_RING_ELEMENT= 1152
12097 - ETA1= 2
12098 - ETA1_RANDOMNESS_SIZE= 128
12099 */
12100 static inline libcrux_ml_kem_mlkem768_MlKem768KeyPair
libcrux_ml_kem_ind_cca_instantiations_portable_kyber_generate_keypair_9b(uint8_t randomness[64U])12101 libcrux_ml_kem_ind_cca_instantiations_portable_kyber_generate_keypair_9b(
12102 uint8_t randomness[64U]) {
12103 /* Passing arrays by value in Rust generates a copy in C */
12104 uint8_t copy_of_randomness[64U];
12105 memcpy(copy_of_randomness, randomness, (size_t)64U * sizeof(uint8_t));
12106 return libcrux_ml_kem_ind_cca_generate_keypair_8c0(copy_of_randomness);
12107 }
12108
12109 /**
12110 Generate Kyber 768 Key Pair
12111 */
12112 static inline libcrux_ml_kem_mlkem768_MlKem768KeyPair
libcrux_ml_kem_mlkem768_portable_kyber_generate_key_pair(uint8_t randomness[64U])12113 libcrux_ml_kem_mlkem768_portable_kyber_generate_key_pair(
12114 uint8_t randomness[64U]) {
12115 /* Passing arrays by value in Rust generates a copy in C */
12116 uint8_t copy_of_randomness[64U];
12117 memcpy(copy_of_randomness, randomness, (size_t)64U * sizeof(uint8_t));
12118 return libcrux_ml_kem_ind_cca_instantiations_portable_kyber_generate_keypair_9b(
12119 copy_of_randomness);
12120 }
12121
12122 /**
12123 Validate an ML-KEM private key.
12124
12125 This implements the Hash check in 7.3 3.
12126 Note that the size checks in 7.2 1 and 2 are covered by the `SECRET_KEY_SIZE`
12127 and `CIPHERTEXT_SIZE` in the `private_key` and `ciphertext` types.
12128 */
12129 /**
12130 A monomorphic instance of libcrux_ml_kem.ind_cca.validate_private_key
12131 with types libcrux_ml_kem_hash_functions_portable_PortableHash[[$3size_t]]
12132 with const generics
12133 - K= 3
12134 - SECRET_KEY_SIZE= 2400
12135 - CIPHERTEXT_SIZE= 1088
12136 */
libcrux_ml_kem_ind_cca_validate_private_key_e7(libcrux_ml_kem_types_MlKemPrivateKey_55 * private_key,libcrux_ml_kem_mlkem768_MlKem768Ciphertext * _ciphertext)12137 static KRML_MUSTINLINE bool libcrux_ml_kem_ind_cca_validate_private_key_e7(
12138 libcrux_ml_kem_types_MlKemPrivateKey_55 *private_key,
12139 libcrux_ml_kem_mlkem768_MlKem768Ciphertext *_ciphertext) {
12140 uint8_t t[32U];
12141 libcrux_ml_kem_hash_functions_portable_H_f1_1a(
12142 Eurydice_array_to_subslice2(private_key->value, (size_t)384U * (size_t)3U,
12143 (size_t)768U * (size_t)3U + (size_t)32U,
12144 uint8_t),
12145 t);
12146 Eurydice_slice expected = Eurydice_array_to_subslice2(
12147 private_key->value, (size_t)768U * (size_t)3U + (size_t)32U,
12148 (size_t)768U * (size_t)3U + (size_t)64U, uint8_t);
12149 return core_array_equality___core__cmp__PartialEq__0___Slice_U____for__Array_T__N___3__eq(
12150 (size_t)32U, t, &expected, uint8_t, uint8_t, bool);
12151 }
12152
12153 /**
12154 Portable private key validation
12155 */
12156 /**
12157 A monomorphic instance of
12158 libcrux_ml_kem.ind_cca.instantiations.portable.validate_private_key with const
12159 generics
12160 - K= 3
12161 - SECRET_KEY_SIZE= 2400
12162 - CIPHERTEXT_SIZE= 1088
12163 */
12164 static KRML_MUSTINLINE bool
libcrux_ml_kem_ind_cca_instantiations_portable_validate_private_key_9c(libcrux_ml_kem_types_MlKemPrivateKey_55 * private_key,libcrux_ml_kem_mlkem768_MlKem768Ciphertext * ciphertext)12165 libcrux_ml_kem_ind_cca_instantiations_portable_validate_private_key_9c(
12166 libcrux_ml_kem_types_MlKemPrivateKey_55 *private_key,
12167 libcrux_ml_kem_mlkem768_MlKem768Ciphertext *ciphertext) {
12168 return libcrux_ml_kem_ind_cca_validate_private_key_e7(private_key,
12169 ciphertext);
12170 }
12171
12172 /**
12173 Validate a private key.
12174
12175 Returns `true` if valid, and `false` otherwise.
12176 */
libcrux_ml_kem_mlkem768_portable_validate_private_key(libcrux_ml_kem_types_MlKemPrivateKey_55 * private_key,libcrux_ml_kem_mlkem768_MlKem768Ciphertext * ciphertext)12177 static inline bool libcrux_ml_kem_mlkem768_portable_validate_private_key(
12178 libcrux_ml_kem_types_MlKemPrivateKey_55 *private_key,
12179 libcrux_ml_kem_mlkem768_MlKem768Ciphertext *ciphertext) {
12180 return libcrux_ml_kem_ind_cca_instantiations_portable_validate_private_key_9c(
12181 private_key, ciphertext);
12182 }
12183
12184 /**
12185 A monomorphic instance of
12186 libcrux_ml_kem.serialize.deserialize_ring_elements_reduced.closure with types
12187 libcrux_ml_kem_vector_portable_vector_type_PortableVector with const generics
12188 - PUBLIC_KEY_SIZE= 1184
12189 - K= 3
12190 */
12191 static inline libcrux_ml_kem_polynomial_PolynomialRingElement_f0
libcrux_ml_kem_serialize_deserialize_ring_elements_reduced_closure_cd0(size_t _i)12192 libcrux_ml_kem_serialize_deserialize_ring_elements_reduced_closure_cd0(
12193 size_t _i) {
12194 return libcrux_ml_kem_polynomial_ZERO_89_ea();
12195 }
12196
12197 /**
12198 This function deserializes ring elements and reduces the result by the field
12199 modulus.
12200
12201 This function MUST NOT be used on secret inputs.
12202 */
12203 /**
12204 A monomorphic instance of
12205 libcrux_ml_kem.serialize.deserialize_ring_elements_reduced with types
12206 libcrux_ml_kem_vector_portable_vector_type_PortableVector with const generics
12207 - PUBLIC_KEY_SIZE= 1184
12208 - K= 3
12209 */
12210 static KRML_MUSTINLINE void
libcrux_ml_kem_serialize_deserialize_ring_elements_reduced_330(Eurydice_slice public_key,libcrux_ml_kem_polynomial_PolynomialRingElement_f0 ret[3U])12211 libcrux_ml_kem_serialize_deserialize_ring_elements_reduced_330(
12212 Eurydice_slice public_key,
12213 libcrux_ml_kem_polynomial_PolynomialRingElement_f0 ret[3U]) {
12214 libcrux_ml_kem_polynomial_PolynomialRingElement_f0 deserialized_pk[3U];
12215 for (size_t i = (size_t)0U; i < (size_t)3U; i++) {
12216 deserialized_pk[i] = libcrux_ml_kem_polynomial_ZERO_89_ea();
12217 }
12218 for (size_t i = (size_t)0U;
12219 i < Eurydice_slice_len(public_key, uint8_t) /
12220 LIBCRUX_ML_KEM_CONSTANTS_BYTES_PER_RING_ELEMENT;
12221 i++) {
12222 size_t i0 = i;
12223 Eurydice_slice ring_element = Eurydice_slice_subslice2(
12224 public_key, i0 * LIBCRUX_ML_KEM_CONSTANTS_BYTES_PER_RING_ELEMENT,
12225 i0 * LIBCRUX_ML_KEM_CONSTANTS_BYTES_PER_RING_ELEMENT +
12226 LIBCRUX_ML_KEM_CONSTANTS_BYTES_PER_RING_ELEMENT,
12227 uint8_t);
12228 libcrux_ml_kem_polynomial_PolynomialRingElement_f0 uu____0 =
12229 libcrux_ml_kem_serialize_deserialize_to_reduced_ring_element_4c(
12230 ring_element);
12231 deserialized_pk[i0] = uu____0;
12232 }
12233 memcpy(
12234 ret, deserialized_pk,
12235 (size_t)3U * sizeof(libcrux_ml_kem_polynomial_PolynomialRingElement_f0));
12236 }
12237
12238 /**
12239 Validate an ML-KEM public key.
12240
12241 This implements the Modulus check in 7.2 2.
12242 Note that the size check in 7.2 1 is covered by the `PUBLIC_KEY_SIZE` in the
12243 `public_key` type.
12244 */
12245 /**
12246 A monomorphic instance of libcrux_ml_kem.ind_cca.validate_public_key
12247 with types libcrux_ml_kem_vector_portable_vector_type_PortableVector
12248 with const generics
12249 - K= 3
12250 - RANKED_BYTES_PER_RING_ELEMENT= 1152
12251 - PUBLIC_KEY_SIZE= 1184
12252 */
libcrux_ml_kem_ind_cca_validate_public_key_19(uint8_t * public_key)12253 static KRML_MUSTINLINE bool libcrux_ml_kem_ind_cca_validate_public_key_19(
12254 uint8_t *public_key) {
12255 libcrux_ml_kem_polynomial_PolynomialRingElement_f0 deserialized_pk[3U];
12256 libcrux_ml_kem_serialize_deserialize_ring_elements_reduced_330(
12257 Eurydice_array_to_subslice_to((size_t)1184U, public_key, (size_t)1152U,
12258 uint8_t, size_t),
12259 deserialized_pk);
12260 libcrux_ml_kem_polynomial_PolynomialRingElement_f0 *uu____0 = deserialized_pk;
12261 uint8_t public_key_serialized[1184U];
12262 libcrux_ml_kem_ind_cpa_serialize_public_key_79(
12263 uu____0,
12264 Eurydice_array_to_subslice_from((size_t)1184U, public_key, (size_t)1152U,
12265 uint8_t, size_t),
12266 public_key_serialized);
12267 return core_array_equality___core__cmp__PartialEq__Array_U__N___for__Array_T__N____eq(
12268 (size_t)1184U, public_key, public_key_serialized, uint8_t, uint8_t, bool);
12269 }
12270
12271 /**
12272 Portable public key validation
12273 */
12274 /**
12275 A monomorphic instance of
12276 libcrux_ml_kem.ind_cca.instantiations.portable.validate_public_key with const
12277 generics
12278 - K= 3
12279 - RANKED_BYTES_PER_RING_ELEMENT= 1152
12280 - PUBLIC_KEY_SIZE= 1184
12281 */
12282 static KRML_MUSTINLINE bool
libcrux_ml_kem_ind_cca_instantiations_portable_validate_public_key_4b(uint8_t * public_key)12283 libcrux_ml_kem_ind_cca_instantiations_portable_validate_public_key_4b(
12284 uint8_t *public_key) {
12285 return libcrux_ml_kem_ind_cca_validate_public_key_19(public_key);
12286 }
12287
12288 /**
12289 Validate a public key.
12290
12291 Returns `true` if valid, and `false` otherwise.
12292 */
libcrux_ml_kem_mlkem768_portable_validate_public_key(libcrux_ml_kem_types_MlKemPublicKey_15 * public_key)12293 static inline bool libcrux_ml_kem_mlkem768_portable_validate_public_key(
12294 libcrux_ml_kem_types_MlKemPublicKey_15 *public_key) {
12295 return libcrux_ml_kem_ind_cca_instantiations_portable_validate_public_key_4b(
12296 public_key->value);
12297 }
12298
12299 /**
12300 This function found in impl {(core::clone::Clone for
12301 libcrux_ml_kem::vector::portable::vector_type::PortableVector)}
12302 */
12303 static inline libcrux_ml_kem_vector_portable_vector_type_PortableVector
libcrux_ml_kem_vector_portable_vector_type_clone_3b(libcrux_ml_kem_vector_portable_vector_type_PortableVector * self)12304 libcrux_ml_kem_vector_portable_vector_type_clone_3b(
12305 libcrux_ml_kem_vector_portable_vector_type_PortableVector *self) {
12306 return self[0U];
12307 }
12308
12309 typedef int16_t libcrux_ml_kem_vector_portable_vector_type_FieldElement;
12310
12311 typedef int16_t
12312 libcrux_ml_kem_vector_portable_arithmetic_MontgomeryFieldElement;
12313
12314 typedef int16_t
12315 libcrux_ml_kem_vector_portable_arithmetic_FieldElementTimesMontgomeryR;
12316
12317 #if defined(__cplusplus)
12318 }
12319 #endif
12320
12321 #define __libcrux_mlkem768_portable_H_DEFINED
12322 #endif
12323
12324
12325 /* rename some types to be a bit more ergonomic */
12326 #define libcrux_mlkem768_keypair libcrux_ml_kem_mlkem768_MlKem768KeyPair_s
12327 #define libcrux_mlkem768_pk_valid_result Option_92_s
12328 #define libcrux_mlkem768_pk libcrux_ml_kem_types_MlKemPublicKey_15_s
12329 #define libcrux_mlkem768_sk libcrux_ml_kem_types_MlKemPrivateKey_55_s
12330 #define libcrux_mlkem768_ciphertext libcrux_ml_kem_mlkem768_MlKem768Ciphertext_s
12331 #define libcrux_mlkem768_enc_result tuple_3c_s
12332 /* defines for PRNG inputs */
12333 #define LIBCRUX_ML_KEM_KEY_PAIR_PRNG_LEN 64
12334 #define LIBCRUX_ML_KEM_ENC_PRNG_LEN 32
12335