xref: /freebsd/crypto/openssh/libcrux_mlkem768_sha3.h (revision 2574974648c68c738aec3ff96644d888d7913a37)
1 /*  $OpenBSD: libcrux_mlkem768_sha3.h,v 1.4 2025/11/13 05:13:06 djm Exp $ */
2 
3 /* Extracted from libcrux revision 026a87ab6d88ad3626b9fbbf3710d1e0483c1849 */
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 static inline void
store64_le(uint8_t dst[8],uint64_t src)38 store64_le(uint8_t dst[8], uint64_t src)
39 {
40 	dst[0] = src & 0xff;
41 	dst[1] = (src >> 8) & 0xff;
42 	dst[2] = (src >> 16) & 0xff;
43 	dst[3] = (src >> 24) & 0xff;
44 	dst[4] = (src >> 32) & 0xff;
45 	dst[5] = (src >> 40) & 0xff;
46 	dst[6] = (src >> 48) & 0xff;
47 	dst[7] = (src >> 56) & 0xff;
48 }
49 
50 static inline void
store32_le(uint8_t dst[4],uint32_t src)51 store32_le(uint8_t dst[4], uint32_t src)
52 {
53 	dst[0] = src & 0xff;
54 	dst[1] = (src >> 8) & 0xff;
55 	dst[2] = (src >> 16) & 0xff;
56 	dst[3] = (src >> 24) & 0xff;
57 }
58 
59 static inline void
store32_be(uint8_t dst[4],uint32_t src)60 store32_be(uint8_t dst[4], uint32_t src)
61 {
62 	dst[0] = (src >> 24) & 0xff;
63 	dst[1] = (src >> 16) & 0xff;
64 	dst[2] = (src >> 8) & 0xff;
65 	dst[3] = src & 0xff;
66 }
67 
68 static inline uint64_t
load64_le(uint8_t src[8])69 load64_le(uint8_t src[8])
70 {
71 	return (uint64_t)(src[0]) |
72 	    ((uint64_t)(src[1]) << 8) |
73 	    ((uint64_t)(src[2]) << 16) |
74 	    ((uint64_t)(src[3]) << 24) |
75 	    ((uint64_t)(src[4]) << 32) |
76 	    ((uint64_t)(src[5]) << 40) |
77 	    ((uint64_t)(src[6]) << 48) |
78 	    ((uint64_t)(src[7]) << 56);
79 }
80 
81 static inline uint32_t
load32_le(uint8_t src[4])82 load32_le(uint8_t src[4])
83 {
84 	return (uint32_t)(src[0]) |
85 	    ((uint32_t)(src[1]) << 8) |
86 	    ((uint32_t)(src[2]) << 16) |
87 	    ((uint32_t)(src[3]) << 24);
88 }
89 
90 #ifdef MISSING_BUILTIN_POPCOUNT
91 static inline unsigned int
__builtin_popcount(unsigned int num)92 __builtin_popcount(unsigned int num)
93 {
94   const int v[16] = { 0, 1, 1, 2, 1, 2, 2, 3, 1, 2, 2, 3, 2, 3, 3, 4 };
95   return v[num & 0xf] + v[(num >> 4) & 0xf];
96 }
97 #endif
98 
99 /* from libcrux/libcrux-ml-kem/extracts/c_header_only/generated/eurydice_glue.h */
100 #pragma once
101 
102 
103 #ifdef _MSC_VER
104 // For __popcnt
105 #endif
106 
107 
108 // C++ HELPERS
109 
110 #if defined(__cplusplus)
111 
112 #ifndef KRML_HOST_EPRINTF
113 #define KRML_HOST_EPRINTF(...) fprintf(stderr, __VA_ARGS__)
114 #endif
115 
116 
117 #ifndef __cpp_lib_type_identity
118 template <class T>
119 struct type_identity {
120   using type = T;
121 };
122 
123 template <class T>
124 using type_identity_t = typename type_identity<T>::type;
125 #else
126 using std::type_identity_t;
127 #endif
128 
129 #define KRML_UNION_CONSTRUCTOR(T)                              \
130   template <typename V>                                        \
131   constexpr T(int t, V U::*m, type_identity_t<V> v) : tag(t) { \
132     val.*m = std::move(v);                                     \
133   }                                                            \
134   T() = default;
135 
136 #endif
137 
138 // GENERAL-PURPOSE STUFF
139 
140 #define LowStar_Ignore_ignore(e, t, _ret_t) ((void)e)
141 
142 #define EURYDICE_ASSERT(test, msg)                                            \
143   do {                                                                        \
144     if (!(test)) {                                                            \
145       fprintf(stderr, "assertion \"%s\" failed: file \"%s\", line %d\n", msg, \
146               __FILE__, __LINE__);                                            \
147       exit(255);                                                              \
148     }                                                                         \
149   } while (0)
150 
151 // SLICES, ARRAYS, ETC.
152 
153 // We represent a slice as a pair of an (untyped) pointer, along with the length
154 // of the slice, i.e. the number of elements in the slice (this is NOT the
155 // number of bytes). This design choice has two important consequences.
156 // - if you need to use `ptr`, you MUST cast it to a proper type *before*
157 //   performing pointer arithmetic on it (remember that C desugars pointer
158 //   arithmetic based on the type of the address)
159 // - if you need to use `len` for a C style function (e.g. memcpy, memcmp), you
160 //   need to multiply it by sizeof t, where t is the type of the elements.
161 //
162 // Empty slices have `len == 0` and `ptr` always needs to be a valid pointer
163 // that is not NULL (otherwise the construction in EURYDICE_SLICE computes `NULL
164 // + start`).
165 typedef struct {
166   void *ptr;
167   size_t len;
168 } Eurydice_slice;
169 
170 #if defined(__cplusplus)
171 #define KRML_CLITERAL(type) type
172 #else
173 #define KRML_CLITERAL(type) (type)
174 #endif
175 
176 #if defined(__cplusplus) && defined(__cpp_designated_initializers) || \
177     !(defined(__cplusplus))
178 #define EURYDICE_CFIELD(X) X
179 #else
180 #define EURYDICE_CFIELD(X)
181 #endif
182 
183 // Helper macro to create a slice out of a pointer x, a start index in x
184 // (included), and an end index in x (excluded). The argument x must be suitably
185 // cast to something that can decay (see remark above about how pointer
186 // arithmetic works in C), meaning either pointer or array type.
187 #define EURYDICE_SLICE(x, start, end) \
188   (KRML_CLITERAL(Eurydice_slice){(void *)(x + start), end - start})
189 
190 // Slice length
191 #define EURYDICE_SLICE_LEN(s, _) (s).len
192 #define Eurydice_slice_len(s, _) (s).len
193 
194 // This macro is a pain because in case the dereferenced element type is an
195 // array, you cannot simply write `t x` as it would yield `int[4] x` instead,
196 // which is NOT correct C syntax, so we add a dedicated phase in Eurydice that
197 // adds an extra argument to this macro at the last minute so that we have the
198 // correct type of *pointers* to elements.
199 #define Eurydice_slice_index(s, i, t, t_ptr_t) (((t_ptr_t)s.ptr)[i])
200 
201 // The following functions get sub slices from a slice.
202 
203 #define Eurydice_slice_subslice(s, r, t, _0, _1) \
204   EURYDICE_SLICE((t *)s.ptr, r.start, r.end)
205 
206 // Variant for when the start and end indices are statically known (i.e., the
207 // range argument `r` is a literal).
208 #define Eurydice_slice_subslice2(s, start, end, t) \
209   EURYDICE_SLICE((t *)s.ptr, (start), (end))
210 
211 // Previous version above does not work when t is an array type (as usual). Will
212 // be deprecated soon.
213 #define Eurydice_slice_subslice3(s, start, end, t_ptr) \
214   EURYDICE_SLICE((t_ptr)s.ptr, (start), (end))
215 
216 #define Eurydice_slice_subslice_to(s, subslice_end_pos, t, _0, _1) \
217   EURYDICE_SLICE((t *)s.ptr, 0, subslice_end_pos)
218 
219 #define Eurydice_slice_subslice_from(s, subslice_start_pos, t, _0, _1) \
220   EURYDICE_SLICE((t *)s.ptr, subslice_start_pos, s.len)
221 
222 #define Eurydice_array_to_slice(end, x, t) \
223   EURYDICE_SLICE(x, 0,                     \
224                  end) /* x is already at an array type, no need for cast */
225 #define Eurydice_array_to_subslice(_arraylen, x, r, t, _0, _1) \
226   EURYDICE_SLICE((t *)x, r.start, r.end)
227 
228 // Same as above, variant for when start and end are statically known
229 #define Eurydice_array_to_subslice2(x, start, end, t) \
230   EURYDICE_SLICE((t *)x, (start), (end))
231 
232 // Same as above, variant for when start and end are statically known
233 #define Eurydice_array_to_subslice3(x, start, end, t_ptr) \
234   EURYDICE_SLICE((t_ptr)x, (start), (end))
235 
236 #define Eurydice_array_repeat(dst, len, init, t) \
237   ERROR "should've been desugared"
238 
239 // The following functions convert an array into a slice.
240 
241 #define Eurydice_array_to_subslice_to(_size, x, r, t, _range_t, _0) \
242   EURYDICE_SLICE((t *)x, 0, r)
243 #define Eurydice_array_to_subslice_from(size, x, r, t, _range_t, _0) \
244   EURYDICE_SLICE((t *)x, r, size)
245 
246 // Copy a slice with memcopy
247 #define Eurydice_slice_copy(dst, src, t) \
248   memcpy(dst.ptr, src.ptr, dst.len * sizeof(t))
249 
250 #define core_array___Array_T__N___as_slice(len_, ptr_, t, _ret_t) \
251   KRML_CLITERAL(Eurydice_slice) { ptr_, len_ }
252 
253 #define core_array__core__clone__Clone_for__Array_T__N___clone( \
254     len, src, dst, elem_type, _ret_t)                           \
255   (memcpy(dst, src, len * sizeof(elem_type)))
256 #define TryFromSliceError uint8_t
257 #define core_array_TryFromSliceError uint8_t
258 
259 #define Eurydice_array_eq(sz, a1, a2, t) (memcmp(a1, a2, sz * sizeof(t)) == 0)
260 
261 // core::cmp::PartialEq<&0 (@Slice<U>)> for @Array<T, N>
262 #define Eurydice_array_eq_slice(sz, a1, s2, t, _) \
263   (memcmp(a1, (s2)->ptr, sz * sizeof(t)) == 0)
264 
265 #define core_array_equality___core__cmp__PartialEq__Array_U__N___for__Array_T__N____eq( \
266     sz, a1, a2, t, _, _ret_t)                                                           \
267   Eurydice_array_eq(sz, a1, a2, t, _)
268 #define core_array_equality___core__cmp__PartialEq__0___Slice_U____for__Array_T__N___3__eq( \
269     sz, a1, a2, t, _, _ret_t)                                                               \
270   Eurydice_array_eq(sz, a1, ((a2)->ptr), t, _)
271 
272 #define Eurydice_slice_split_at(slice, mid, element_type, ret_t)          \
273   KRML_CLITERAL(ret_t) {                                                  \
274     EURYDICE_CFIELD(.fst =)                                               \
275     EURYDICE_SLICE((element_type *)(slice).ptr, 0, mid),                  \
276         EURYDICE_CFIELD(.snd =)                                           \
277             EURYDICE_SLICE((element_type *)(slice).ptr, mid, (slice).len) \
278   }
279 
280 #define Eurydice_slice_split_at_mut(slice, mid, element_type, ret_t)  \
281   KRML_CLITERAL(ret_t) {                                              \
282     EURYDICE_CFIELD(.fst =)                                           \
283     KRML_CLITERAL(Eurydice_slice){EURYDICE_CFIELD(.ptr =)(slice.ptr), \
284                                   EURYDICE_CFIELD(.len =) mid},       \
285         EURYDICE_CFIELD(.snd =) KRML_CLITERAL(Eurydice_slice) {       \
286       EURYDICE_CFIELD(.ptr =)                                         \
287       ((char *)slice.ptr + mid * sizeof(element_type)),               \
288           EURYDICE_CFIELD(.len =)(slice.len - mid)                    \
289     }                                                                 \
290   }
291 
292 // Conversion of slice to an array, rewritten (by Eurydice) to name the
293 // destination array, since arrays are not values in C.
294 // N.B.: see note in karamel/lib/Inlining.ml if you change this.
295 #define Eurydice_slice_to_array2(dst, src, _0, t_arr, _1)                 \
296   Eurydice_slice_to_array3(&(dst)->tag, (char *)&(dst)->val.case_Ok, src, \
297                            sizeof(t_arr))
298 
Eurydice_slice_to_array3(uint8_t * dst_tag,char * dst_ok,Eurydice_slice src,size_t sz)299 static inline void Eurydice_slice_to_array3(uint8_t *dst_tag, char *dst_ok,
300                                             Eurydice_slice src, size_t sz) {
301   *dst_tag = 0;
302   memcpy(dst_ok, src.ptr, sz);
303 }
304 
305 // SUPPORT FOR DSTs (Dynamically-Sized Types)
306 
307 // A DST is a fat pointer that keeps tracks of the size of it flexible array
308 // member. Slices are a specific case of DSTs, where [T; N] implements
309 // Unsize<[T]>, meaning an array of statically known size can be converted to a
310 // fat pointer, i.e. a slice.
311 //
312 // Unlike slices, DSTs have a built-in definition that gets monomorphized, of
313 // the form:
314 //
315 // typedef struct {
316 //   T *ptr;
317 //   size_t len; // number of elements
318 // } Eurydice_dst;
319 //
320 // Furthermore, T = T0<[U0]> where `struct T0<U: ?Sized>`, where the `U` is the
321 // last field. This means that there are two monomorphizations of T0 in the
322 // program. One is `T0<[V; N]>`
323 // -- this is directly converted to a Eurydice_dst via suitable codegen (no
324 // macro). The other is `T = T0<[U]>`, where `[U]` gets emitted to
325 // `Eurydice_derefed_slice`, a type that only appears in that precise situation
326 // and is thus defined to give rise to a flexible array member.
327 
328 typedef char Eurydice_derefed_slice[];
329 
330 #define Eurydice_slice_of_dst(fam_ptr, len_, t, _) \
331   ((Eurydice_slice){.ptr = (void *)(fam_ptr), .len = len_})
332 
333 #define Eurydice_slice_of_boxed_array(ptr_, len_, t, _) \
334   ((Eurydice_slice){.ptr = (void *)(ptr_), .len = len_})
335 
336 // CORE STUFF (conversions, endianness, ...)
337 
338 // We slap extern "C" on declarations that intend to implement a prototype
339 // generated by Eurydice, because Eurydice prototypes are always emitted within
340 // an extern "C" block, UNLESS you use -fcxx17-compat, in which case, you must
341 // pass -DKRML_CXX17_COMPAT="" to your C++ compiler.
342 #if defined(__cplusplus) && !defined(KRML_CXX17_COMPAT)
343 extern "C" {
344 #endif
345 
core_num__u32__to_be_bytes(uint32_t src,uint8_t dst[4])346 static inline void core_num__u32__to_be_bytes(uint32_t src, uint8_t dst[4]) {
347   store32_be(dst, src);
348 }
349 
core_num__u32__to_le_bytes(uint32_t src,uint8_t dst[4])350 static inline void core_num__u32__to_le_bytes(uint32_t src, uint8_t dst[4]) {
351   store32_le(dst, src);
352 }
353 
core_num__u32__from_le_bytes(uint8_t buf[4])354 static inline uint32_t core_num__u32__from_le_bytes(uint8_t buf[4]) {
355   return load32_le(buf);
356 }
357 
core_num__u64__to_le_bytes(uint64_t v,uint8_t buf[8])358 static inline void core_num__u64__to_le_bytes(uint64_t v, uint8_t buf[8]) {
359   store64_le(buf, v);
360 }
361 
core_num__u64__from_le_bytes(uint8_t buf[8])362 static inline uint64_t core_num__u64__from_le_bytes(uint8_t buf[8]) {
363   return load64_le(buf);
364 }
365 
core_convert_num___core__convert__From_i32__for_i64__from(int32_t x)366 static inline int64_t core_convert_num___core__convert__From_i32__for_i64__from(
367     int32_t x) {
368   return x;
369 }
370 
core_convert_num___core__convert__From_u8__for_u64__from(uint8_t x)371 static inline uint64_t core_convert_num___core__convert__From_u8__for_u64__from(
372     uint8_t x) {
373   return x;
374 }
375 
376 static inline uint64_t
core_convert_num___core__convert__From_u16__for_u64__from(uint16_t x)377 core_convert_num___core__convert__From_u16__for_u64__from(uint16_t x) {
378   return x;
379 }
380 
381 static inline size_t
core_convert_num___core__convert__From_u16__for_usize__from(uint16_t x)382 core_convert_num___core__convert__From_u16__for_usize__from(uint16_t x) {
383   return x;
384 }
385 
core_num__u8__count_ones(uint8_t x0)386 static inline uint32_t core_num__u8__count_ones(uint8_t x0) {
387 #ifdef _MSC_VER
388   return __popcnt(x0);
389 #else
390   return __builtin_popcount(x0);
391 #endif
392 }
393 
core_num__i32__count_ones(int32_t x0)394 static inline uint32_t core_num__i32__count_ones(int32_t x0) {
395 #ifdef _MSC_VER
396   return __popcnt(x0);
397 #else
398   return __builtin_popcount(x0);
399 #endif
400 }
401 
core_cmp_impls___core__cmp__Ord_for_usize__min(size_t a,size_t b)402 static inline size_t core_cmp_impls___core__cmp__Ord_for_usize__min(size_t a,
403                                                                     size_t b) {
404   if (a <= b)
405     return a;
406   else
407     return b;
408 }
409 
410 // unsigned overflow wraparound semantics in C
core_num__u16__wrapping_add(uint16_t x,uint16_t y)411 static inline uint16_t core_num__u16__wrapping_add(uint16_t x, uint16_t y) {
412   return x + y;
413 }
core_num__u8__wrapping_sub(uint8_t x,uint8_t y)414 static inline uint8_t core_num__u8__wrapping_sub(uint8_t x, uint8_t y) {
415   return x - y;
416 }
core_num__u64__rotate_left(uint64_t x0,uint32_t x1)417 static inline uint64_t core_num__u64__rotate_left(uint64_t x0, uint32_t x1) {
418   return (x0 << x1 | x0 >> (64 - x1));
419 }
420 
core_ops_arith__i32__add_assign(int32_t * x0,int32_t * x1)421 static inline void core_ops_arith__i32__add_assign(int32_t *x0, int32_t *x1) {
422   *x0 = *x0 + *x1;
423 }
424 
Eurydice_bitand_pv_u8(uint8_t * p,uint8_t v)425 static inline uint8_t Eurydice_bitand_pv_u8(uint8_t *p, uint8_t v) {
426   return (*p) & v;
427 }
Eurydice_shr_pv_u8(uint8_t * p,int32_t v)428 static inline uint8_t Eurydice_shr_pv_u8(uint8_t *p, int32_t v) {
429   return (*p) >> v;
430 }
Eurydice_min_u32(uint32_t x,uint32_t y)431 static inline uint32_t Eurydice_min_u32(uint32_t x, uint32_t y) {
432   return x < y ? x : y;
433 }
434 
435 static inline uint8_t
core_ops_bit___core__ops__bit__BitAnd_u8__u8__for___a__u8___46__bitand(uint8_t * x0,uint8_t x1)436 core_ops_bit___core__ops__bit__BitAnd_u8__u8__for___a__u8___46__bitand(
437     uint8_t *x0, uint8_t x1) {
438   return Eurydice_bitand_pv_u8(x0, x1);
439 }
440 
441 static inline uint8_t
core_ops_bit___core__ops__bit__Shr_i32__u8__for___a__u8___792__shr(uint8_t * x0,int32_t x1)442 core_ops_bit___core__ops__bit__Shr_i32__u8__for___a__u8___792__shr(uint8_t *x0,
443                                                                    int32_t x1) {
444   return Eurydice_shr_pv_u8(x0, x1);
445 }
446 
447 #define core_num_nonzero_private_NonZeroUsizeInner size_t
448 static inline core_num_nonzero_private_NonZeroUsizeInner
core_num_nonzero_private___core__clone__Clone_for_core__num__nonzero__private__NonZeroUsizeInner__26__clone(core_num_nonzero_private_NonZeroUsizeInner * x0)449 core_num_nonzero_private___core__clone__Clone_for_core__num__nonzero__private__NonZeroUsizeInner__26__clone(
450     core_num_nonzero_private_NonZeroUsizeInner *x0) {
451   return *x0;
452 }
453 
454 #if defined(__cplusplus) && !defined(KRML_CXX17_COMPAT)
455 }
456 #endif
457 
458 // ITERATORS
459 
460 #define Eurydice_range_iter_next(iter_ptr, t, ret_t)      \
461   (((iter_ptr)->start >= (iter_ptr)->end)                 \
462        ? (KRML_CLITERAL(ret_t){EURYDICE_CFIELD(.tag =) 0, \
463                                EURYDICE_CFIELD(.f0 =) 0}) \
464        : (KRML_CLITERAL(ret_t){EURYDICE_CFIELD(.tag =) 1, \
465                                EURYDICE_CFIELD(.f0 =)(iter_ptr)->start++}))
466 
467 #define core_iter_range___core__iter__traits__iterator__Iterator_A__for_core__ops__range__Range_A__TraitClause_0___6__next \
468   Eurydice_range_iter_next
469 
470 // See note in karamel/lib/Inlining.ml if you change this
471 #define Eurydice_into_iter(x, t, _ret_t, _) (x)
472 #define core_iter_traits_collect___core__iter__traits__collect__IntoIterator_Clause1_Item__I__for_I__1__into_iter \
473   Eurydice_into_iter
474 
475 typedef struct {
476   Eurydice_slice slice;
477   size_t chunk_size;
478 } Eurydice_chunks;
479 
480 // Can't use macros Eurydice_slice_subslice_{to,from} because they require a
481 // type, and this static inline function cannot receive a type as an argument.
482 // Instead, we receive the element size and use it to peform manual offset
483 // computations rather than going through the macros.
chunk_next(Eurydice_chunks * chunks,size_t element_size)484 static inline Eurydice_slice chunk_next(Eurydice_chunks *chunks,
485                                         size_t element_size) {
486   size_t chunk_size = chunks->slice.len >= chunks->chunk_size
487                           ? chunks->chunk_size
488                           : chunks->slice.len;
489   Eurydice_slice curr_chunk;
490   curr_chunk.ptr = chunks->slice.ptr;
491   curr_chunk.len = chunk_size;
492   chunks->slice.ptr = (char *)(chunks->slice.ptr) + chunk_size * element_size;
493   chunks->slice.len = chunks->slice.len - chunk_size;
494   return curr_chunk;
495 }
496 
497 #define core_slice___Slice_T___chunks(slice_, sz_, t, _ret_t) \
498   ((Eurydice_chunks){.slice = slice_, .chunk_size = sz_})
499 #define core_slice___Slice_T___chunks_exact(slice_, sz_, t, _ret_t)         \
500   ((Eurydice_chunks){                                                       \
501       .slice = {.ptr = slice_.ptr, .len = slice_.len - (slice_.len % sz_)}, \
502       .chunk_size = sz_})
503 #define core_slice_iter_Chunks Eurydice_chunks
504 #define core_slice_iter_ChunksExact Eurydice_chunks
505 #define Eurydice_chunks_next(iter, t, ret_t)                     \
506   (((iter)->slice.len == 0) ? ((ret_t){.tag = core_option_None}) \
507                             : ((ret_t){.tag = core_option_Some,  \
508                                        .f0 = chunk_next(iter, sizeof(t))}))
509 #define core_slice_iter___core__iter__traits__iterator__Iterator_for_core__slice__iter__Chunks__a__T___70__next \
510   Eurydice_chunks_next
511 // This name changed on 20240627
512 #define core_slice_iter___core__iter__traits__iterator__Iterator_for_core__slice__iter__Chunks__a__T___71__next \
513   Eurydice_chunks_next
514 #define core_slice_iter__core__slice__iter__ChunksExact__a__T__89__next( \
515     iter, t, _ret_t)                                                     \
516   core_slice_iter__core__slice__iter__Chunks__a__T__70__next(iter, t)
517 
518 typedef struct {
519   Eurydice_slice s;
520   size_t index;
521 } Eurydice_slice_iterator;
522 
523 #define core_slice___Slice_T___iter(x, t, _ret_t) \
524   ((Eurydice_slice_iterator){.s = x, .index = 0})
525 #define core_slice_iter_Iter Eurydice_slice_iterator
526 #define core_slice_iter__core__slice__iter__Iter__a__T__181__next(iter, t, \
527                                                                   ret_t)   \
528   (((iter)->index == (iter)->s.len)                                        \
529        ? (KRML_CLITERAL(ret_t){.tag = core_option_None})                   \
530        : (KRML_CLITERAL(ret_t){                                            \
531              .tag = core_option_Some,                                      \
532              .f0 = ((iter)->index++,                                       \
533                     &((t *)((iter)->s.ptr))[(iter)->index - 1])}))
534 #define core_option__core__option__Option_T__TraitClause_0___is_some(X, _0, \
535                                                                      _1)    \
536   ((X)->tag == 1)
537 // STRINGS
538 
539 typedef const char *Prims_string;
540 
541 // MISC (UNTESTED)
542 
543 typedef void *core_fmt_Formatter;
544 typedef void *core_fmt_Arguments;
545 typedef void *core_fmt_rt_Argument;
546 #define core_fmt_rt__core__fmt__rt__Argument__a__1__new_display(x1, x2, x3, \
547                                                                 x4)         \
548   NULL
549 
550 // BOXES
551 
552 // Crimes.
malloc_and_init(size_t sz,char * init)553 static inline char *malloc_and_init(size_t sz, char *init) {
554   char *ptr = (char *)malloc(sz);
555   memcpy(ptr, init, sz);
556   return ptr;
557 }
558 
559 #define Eurydice_box_new(init, t, t_dst) \
560   ((t_dst)(malloc_and_init(sizeof(t), (char *)(&init))))
561 
562 #define Eurydice_box_new_array(len, ptr, t, t_dst) \
563   ((t_dst)(malloc_and_init(len * sizeof(t), (char *)(ptr))))
564 
565 /* from libcrux/libcrux-ml-kem/extracts/c_header_only/generated/libcrux_mlkem_core.h */
566 /*
567  * SPDX-FileCopyrightText: 2025 Cryspen Sarl <info@cryspen.com>
568  *
569  * SPDX-License-Identifier: MIT or Apache-2.0
570  *
571  * This code was generated with the following revisions:
572  * Charon: 667d2fc98984ff7f3df989c2367e6c1fa4a000e7
573  * Eurydice: 2381cbc416ef2ad0b561c362c500bc84f36b6785
574  * Karamel: 80f5435f2fc505973c469a4afcc8d875cddd0d8b
575  * F*: 71d8221589d4d438af3706d89cb653cf53e18aab
576  * Libcrux: 68dfed5a4a9e40277f62828471c029afed1ecdcc
577  */
578 
579 #ifndef libcrux_mlkem_core_H
580 #define libcrux_mlkem_core_H
581 
582 
583 #if defined(__cplusplus)
584 extern "C" {
585 #endif
586 
587 /**
588 A monomorphic instance of core.ops.range.Range
589 with types size_t
590 
591 */
592 typedef struct core_ops_range_Range_08_s {
593   size_t start;
594   size_t end;
595 } core_ops_range_Range_08;
596 
597 static inline uint16_t core_num__u16__wrapping_add(uint16_t x0, uint16_t x1);
598 
599 static inline uint64_t core_num__u64__from_le_bytes(uint8_t x0[8U]);
600 
601 static inline uint64_t core_num__u64__rotate_left(uint64_t x0, uint32_t x1);
602 
603 static inline void core_num__u64__to_le_bytes(uint64_t x0, uint8_t x1[8U]);
604 
605 static inline uint32_t core_num__u8__count_ones(uint8_t x0);
606 
607 static inline uint8_t core_num__u8__wrapping_sub(uint8_t x0, uint8_t x1);
608 
609 #define LIBCRUX_ML_KEM_CONSTANTS_SHARED_SECRET_SIZE ((size_t)32U)
610 
611 #define LIBCRUX_ML_KEM_CONSTANTS_BITS_PER_COEFFICIENT ((size_t)12U)
612 
613 #define LIBCRUX_ML_KEM_CONSTANTS_COEFFICIENTS_IN_RING_ELEMENT ((size_t)256U)
614 
615 #define LIBCRUX_ML_KEM_CONSTANTS_BITS_PER_RING_ELEMENT \
616   (LIBCRUX_ML_KEM_CONSTANTS_COEFFICIENTS_IN_RING_ELEMENT * (size_t)12U)
617 
618 #define LIBCRUX_ML_KEM_CONSTANTS_BYTES_PER_RING_ELEMENT \
619   (LIBCRUX_ML_KEM_CONSTANTS_BITS_PER_RING_ELEMENT / (size_t)8U)
620 
621 #define LIBCRUX_ML_KEM_CONSTANTS_CPA_PKE_KEY_GENERATION_SEED_SIZE ((size_t)32U)
622 
623 #define LIBCRUX_ML_KEM_CONSTANTS_G_DIGEST_SIZE ((size_t)64U)
624 
625 #define LIBCRUX_ML_KEM_CONSTANTS_H_DIGEST_SIZE ((size_t)32U)
626 
627 /**
628  K * BITS_PER_RING_ELEMENT / 8
629 
630  [eurydice] Note that we can't use const generics here because that breaks
631             C extraction with eurydice.
632 */
libcrux_ml_kem_constants_ranked_bytes_per_ring_element(size_t rank)633 static inline size_t libcrux_ml_kem_constants_ranked_bytes_per_ring_element(
634     size_t rank) {
635   return rank * LIBCRUX_ML_KEM_CONSTANTS_BITS_PER_RING_ELEMENT / (size_t)8U;
636 }
637 
638 /**
639 This function found in impl {libcrux_secrets::traits::Classify<T> for T}
640 */
641 /**
642 A monomorphic instance of libcrux_secrets.int.public_integers.classify_27
643 with types uint8_t
644 
645 */
646 static KRML_MUSTINLINE uint8_t
libcrux_secrets_int_public_integers_classify_27_90(uint8_t self)647 libcrux_secrets_int_public_integers_classify_27_90(uint8_t self) {
648   return self;
649 }
650 
651 /**
652 This function found in impl {libcrux_secrets::traits::Declassify<T> for T}
653 */
654 /**
655 A monomorphic instance of libcrux_secrets.int.public_integers.declassify_d8
656 with types int16_t
657 
658 */
659 static KRML_MUSTINLINE int16_t
libcrux_secrets_int_public_integers_declassify_d8_39(int16_t self)660 libcrux_secrets_int_public_integers_declassify_d8_39(int16_t self) {
661   return self;
662 }
663 
664 /**
665 This function found in impl {libcrux_secrets::int::CastOps for i16}
666 */
libcrux_secrets_int_as_u8_f5(int16_t self)667 static KRML_MUSTINLINE uint8_t libcrux_secrets_int_as_u8_f5(int16_t self) {
668   return libcrux_secrets_int_public_integers_classify_27_90(
669       (uint8_t)libcrux_secrets_int_public_integers_declassify_d8_39(self));
670 }
671 
672 /**
673 This function found in impl {libcrux_secrets::traits::Classify<T> for T}
674 */
675 /**
676 A monomorphic instance of libcrux_secrets.int.public_integers.classify_27
677 with types int16_t
678 
679 */
680 static KRML_MUSTINLINE int16_t
libcrux_secrets_int_public_integers_classify_27_39(int16_t self)681 libcrux_secrets_int_public_integers_classify_27_39(int16_t self) {
682   return self;
683 }
684 
685 /**
686 This function found in impl {libcrux_secrets::traits::Declassify<T> for T}
687 */
688 /**
689 A monomorphic instance of libcrux_secrets.int.public_integers.declassify_d8
690 with types uint8_t
691 
692 */
693 static KRML_MUSTINLINE uint8_t
libcrux_secrets_int_public_integers_declassify_d8_90(uint8_t self)694 libcrux_secrets_int_public_integers_declassify_d8_90(uint8_t self) {
695   return self;
696 }
697 
698 /**
699 This function found in impl {libcrux_secrets::int::CastOps for u8}
700 */
libcrux_secrets_int_as_i16_59(uint8_t self)701 static KRML_MUSTINLINE int16_t libcrux_secrets_int_as_i16_59(uint8_t self) {
702   return libcrux_secrets_int_public_integers_classify_27_39(
703       (int16_t)libcrux_secrets_int_public_integers_declassify_d8_90(self));
704 }
705 
706 /**
707 This function found in impl {libcrux_secrets::traits::Classify<T> for T}
708 */
709 /**
710 A monomorphic instance of libcrux_secrets.int.public_integers.classify_27
711 with types int32_t
712 
713 */
714 static KRML_MUSTINLINE int32_t
libcrux_secrets_int_public_integers_classify_27_a8(int32_t self)715 libcrux_secrets_int_public_integers_classify_27_a8(int32_t self) {
716   return self;
717 }
718 
719 /**
720 This function found in impl {libcrux_secrets::int::CastOps for i16}
721 */
libcrux_secrets_int_as_i32_f5(int16_t self)722 static KRML_MUSTINLINE int32_t libcrux_secrets_int_as_i32_f5(int16_t self) {
723   return libcrux_secrets_int_public_integers_classify_27_a8(
724       (int32_t)libcrux_secrets_int_public_integers_declassify_d8_39(self));
725 }
726 
727 /**
728 This function found in impl {libcrux_secrets::traits::Declassify<T> for T}
729 */
730 /**
731 A monomorphic instance of libcrux_secrets.int.public_integers.declassify_d8
732 with types int32_t
733 
734 */
735 static KRML_MUSTINLINE int32_t
libcrux_secrets_int_public_integers_declassify_d8_a8(int32_t self)736 libcrux_secrets_int_public_integers_declassify_d8_a8(int32_t self) {
737   return self;
738 }
739 
740 /**
741 This function found in impl {libcrux_secrets::int::CastOps for i32}
742 */
libcrux_secrets_int_as_i16_36(int32_t self)743 static KRML_MUSTINLINE int16_t libcrux_secrets_int_as_i16_36(int32_t self) {
744   return libcrux_secrets_int_public_integers_classify_27_39(
745       (int16_t)libcrux_secrets_int_public_integers_declassify_d8_a8(self));
746 }
747 
748 /**
749 This function found in impl {libcrux_secrets::traits::Declassify<T> for T}
750 */
751 /**
752 A monomorphic instance of libcrux_secrets.int.public_integers.declassify_d8
753 with types uint32_t
754 
755 */
756 static KRML_MUSTINLINE uint32_t
libcrux_secrets_int_public_integers_declassify_d8_df(uint32_t self)757 libcrux_secrets_int_public_integers_declassify_d8_df(uint32_t self) {
758   return self;
759 }
760 
761 /**
762 This function found in impl {libcrux_secrets::int::CastOps for u32}
763 */
libcrux_secrets_int_as_i32_b8(uint32_t self)764 static KRML_MUSTINLINE int32_t libcrux_secrets_int_as_i32_b8(uint32_t self) {
765   return libcrux_secrets_int_public_integers_classify_27_a8(
766       (int32_t)libcrux_secrets_int_public_integers_declassify_d8_df(self));
767 }
768 
769 /**
770 This function found in impl {libcrux_secrets::traits::Classify<T> for T}
771 */
772 /**
773 A monomorphic instance of libcrux_secrets.int.public_integers.classify_27
774 with types uint16_t
775 
776 */
777 static KRML_MUSTINLINE uint16_t
libcrux_secrets_int_public_integers_classify_27_de(uint16_t self)778 libcrux_secrets_int_public_integers_classify_27_de(uint16_t self) {
779   return self;
780 }
781 
782 /**
783 This function found in impl {libcrux_secrets::int::CastOps for i16}
784 */
libcrux_secrets_int_as_u16_f5(int16_t self)785 static KRML_MUSTINLINE uint16_t libcrux_secrets_int_as_u16_f5(int16_t self) {
786   return libcrux_secrets_int_public_integers_classify_27_de(
787       (uint16_t)libcrux_secrets_int_public_integers_declassify_d8_39(self));
788 }
789 
790 /**
791 This function found in impl {libcrux_secrets::traits::Declassify<T> for T}
792 */
793 /**
794 A monomorphic instance of libcrux_secrets.int.public_integers.declassify_d8
795 with types uint16_t
796 
797 */
798 static KRML_MUSTINLINE uint16_t
libcrux_secrets_int_public_integers_declassify_d8_de(uint16_t self)799 libcrux_secrets_int_public_integers_declassify_d8_de(uint16_t self) {
800   return self;
801 }
802 
803 /**
804 This function found in impl {libcrux_secrets::int::CastOps for u16}
805 */
libcrux_secrets_int_as_i16_ca(uint16_t self)806 static KRML_MUSTINLINE int16_t libcrux_secrets_int_as_i16_ca(uint16_t self) {
807   return libcrux_secrets_int_public_integers_classify_27_39(
808       (int16_t)libcrux_secrets_int_public_integers_declassify_d8_de(self));
809 }
810 
811 /**
812 This function found in impl {libcrux_secrets::traits::Classify<T> for T}
813 */
814 /**
815 A monomorphic instance of libcrux_secrets.int.public_integers.classify_27
816 with types uint64_t
817 
818 */
819 static KRML_MUSTINLINE uint64_t
libcrux_secrets_int_public_integers_classify_27_49(uint64_t self)820 libcrux_secrets_int_public_integers_classify_27_49(uint64_t self) {
821   return self;
822 }
823 
824 /**
825 This function found in impl {libcrux_secrets::int::CastOps for u16}
826 */
libcrux_secrets_int_as_u64_ca(uint16_t self)827 static KRML_MUSTINLINE uint64_t libcrux_secrets_int_as_u64_ca(uint16_t self) {
828   return libcrux_secrets_int_public_integers_classify_27_49(
829       (uint64_t)libcrux_secrets_int_public_integers_declassify_d8_de(self));
830 }
831 
832 /**
833 This function found in impl {libcrux_secrets::traits::Classify<T> for T}
834 */
835 /**
836 A monomorphic instance of libcrux_secrets.int.public_integers.classify_27
837 with types uint32_t
838 
839 */
840 static KRML_MUSTINLINE uint32_t
libcrux_secrets_int_public_integers_classify_27_df(uint32_t self)841 libcrux_secrets_int_public_integers_classify_27_df(uint32_t self) {
842   return self;
843 }
844 
845 /**
846 This function found in impl {libcrux_secrets::traits::Declassify<T> for T}
847 */
848 /**
849 A monomorphic instance of libcrux_secrets.int.public_integers.declassify_d8
850 with types uint64_t
851 
852 */
853 static KRML_MUSTINLINE uint64_t
libcrux_secrets_int_public_integers_declassify_d8_49(uint64_t self)854 libcrux_secrets_int_public_integers_declassify_d8_49(uint64_t self) {
855   return self;
856 }
857 
858 /**
859 This function found in impl {libcrux_secrets::int::CastOps for u64}
860 */
libcrux_secrets_int_as_u32_a3(uint64_t self)861 static KRML_MUSTINLINE uint32_t libcrux_secrets_int_as_u32_a3(uint64_t self) {
862   return libcrux_secrets_int_public_integers_classify_27_df(
863       (uint32_t)libcrux_secrets_int_public_integers_declassify_d8_49(self));
864 }
865 
866 /**
867 This function found in impl {libcrux_secrets::int::CastOps for u32}
868 */
libcrux_secrets_int_as_i16_b8(uint32_t self)869 static KRML_MUSTINLINE int16_t libcrux_secrets_int_as_i16_b8(uint32_t self) {
870   return libcrux_secrets_int_public_integers_classify_27_39(
871       (int16_t)libcrux_secrets_int_public_integers_declassify_d8_df(self));
872 }
873 
874 /**
875 This function found in impl {libcrux_secrets::int::CastOps for i16}
876 */
libcrux_secrets_int_as_i16_f5(int16_t self)877 static KRML_MUSTINLINE int16_t libcrux_secrets_int_as_i16_f5(int16_t self) {
878   return libcrux_secrets_int_public_integers_classify_27_39(
879       libcrux_secrets_int_public_integers_declassify_d8_39(self));
880 }
881 
882 typedef struct libcrux_ml_kem_utils_extraction_helper_Keypair768_s {
883   uint8_t fst[1152U];
884   uint8_t snd[1184U];
885 } libcrux_ml_kem_utils_extraction_helper_Keypair768;
886 
887 #define Ok 0
888 #define Err 1
889 
890 typedef uint8_t Result_b2_tags;
891 
892 /**
893 A monomorphic instance of core.result.Result
894 with types uint8_t[24size_t], core_array_TryFromSliceError
895 
896 */
897 typedef struct Result_b2_s {
898   Result_b2_tags tag;
899   union {
900     uint8_t case_Ok[24U];
901     TryFromSliceError case_Err;
902   } val;
903 } Result_b2;
904 
905 /**
906 This function found in impl {core::result::Result<T, E>[TraitClause@0,
907 TraitClause@1]}
908 */
909 /**
910 A monomorphic instance of core.result.unwrap_26
911 with types uint8_t[24size_t], core_array_TryFromSliceError
912 
913 */
unwrap_26_70(Result_b2 self,uint8_t ret[24U])914 static inline void unwrap_26_70(Result_b2 self, uint8_t ret[24U]) {
915   if (self.tag == Ok) {
916     uint8_t f0[24U];
917     memcpy(f0, self.val.case_Ok, (size_t)24U * sizeof(uint8_t));
918     memcpy(ret, f0, (size_t)24U * sizeof(uint8_t));
919   } else {
920     KRML_HOST_EPRINTF("KaRaMeL abort at %s:%d\n%s\n", __FILE__, __LINE__,
921                       "unwrap not Ok");
922     KRML_HOST_EXIT(255U);
923   }
924 }
925 
926 /**
927 A monomorphic instance of core.result.Result
928 with types uint8_t[20size_t], core_array_TryFromSliceError
929 
930 */
931 typedef struct Result_e1_s {
932   Result_b2_tags tag;
933   union {
934     uint8_t case_Ok[20U];
935     TryFromSliceError case_Err;
936   } val;
937 } Result_e1;
938 
939 /**
940 This function found in impl {core::result::Result<T, E>[TraitClause@0,
941 TraitClause@1]}
942 */
943 /**
944 A monomorphic instance of core.result.unwrap_26
945 with types uint8_t[20size_t], core_array_TryFromSliceError
946 
947 */
unwrap_26_20(Result_e1 self,uint8_t ret[20U])948 static inline void unwrap_26_20(Result_e1 self, uint8_t ret[20U]) {
949   if (self.tag == Ok) {
950     uint8_t f0[20U];
951     memcpy(f0, self.val.case_Ok, (size_t)20U * sizeof(uint8_t));
952     memcpy(ret, f0, (size_t)20U * sizeof(uint8_t));
953   } else {
954     KRML_HOST_EPRINTF("KaRaMeL abort at %s:%d\n%s\n", __FILE__, __LINE__,
955                       "unwrap not Ok");
956     KRML_HOST_EXIT(255U);
957   }
958 }
959 
960 /**
961  Pad the `slice` with `0`s at the end.
962 */
963 /**
964 A monomorphic instance of libcrux_ml_kem.utils.into_padded_array
965 with const generics
966 - LEN= 32
967 */
libcrux_ml_kem_utils_into_padded_array_9e(Eurydice_slice slice,uint8_t ret[32U])968 static KRML_MUSTINLINE void libcrux_ml_kem_utils_into_padded_array_9e(
969     Eurydice_slice slice, uint8_t ret[32U]) {
970   uint8_t out[32U] = {0U};
971   uint8_t *uu____0 = out;
972   Eurydice_slice_copy(
973       Eurydice_array_to_subslice3(
974           uu____0, (size_t)0U, Eurydice_slice_len(slice, uint8_t), uint8_t *),
975       slice, uint8_t);
976   memcpy(ret, out, (size_t)32U * sizeof(uint8_t));
977 }
978 
979 /**
980 A monomorphic instance of libcrux_ml_kem.types.MlKemPrivateKey
981 with const generics
982 - $2400size_t
983 */
984 typedef struct libcrux_ml_kem_types_MlKemPrivateKey_d9_s {
985   uint8_t value[2400U];
986 } libcrux_ml_kem_types_MlKemPrivateKey_d9;
987 
988 /**
989 This function found in impl {core::default::Default for
990 libcrux_ml_kem::types::MlKemPrivateKey<SIZE>}
991 */
992 /**
993 A monomorphic instance of libcrux_ml_kem.types.default_d3
994 with const generics
995 - SIZE= 2400
996 */
997 static inline libcrux_ml_kem_types_MlKemPrivateKey_d9
libcrux_ml_kem_types_default_d3_28(void)998 libcrux_ml_kem_types_default_d3_28(void) {
999   return (
1000       KRML_CLITERAL(libcrux_ml_kem_types_MlKemPrivateKey_d9){.value = {0U}});
1001 }
1002 
1003 /**
1004 A monomorphic instance of libcrux_ml_kem.types.MlKemPublicKey
1005 with const generics
1006 - $1184size_t
1007 */
1008 typedef struct libcrux_ml_kem_types_MlKemPublicKey_30_s {
1009   uint8_t value[1184U];
1010 } libcrux_ml_kem_types_MlKemPublicKey_30;
1011 
1012 /**
1013 This function found in impl {core::convert::From<@Array<u8, SIZE>> for
1014 libcrux_ml_kem::types::MlKemPublicKey<SIZE>}
1015 */
1016 /**
1017 A monomorphic instance of libcrux_ml_kem.types.from_fd
1018 with const generics
1019 - SIZE= 1184
1020 */
1021 static inline libcrux_ml_kem_types_MlKemPublicKey_30
libcrux_ml_kem_types_from_fd_d0(uint8_t value[1184U])1022 libcrux_ml_kem_types_from_fd_d0(uint8_t value[1184U]) {
1023   /* Passing arrays by value in Rust generates a copy in C */
1024   uint8_t copy_of_value[1184U];
1025   memcpy(copy_of_value, value, (size_t)1184U * sizeof(uint8_t));
1026   libcrux_ml_kem_types_MlKemPublicKey_30 lit;
1027   memcpy(lit.value, copy_of_value, (size_t)1184U * sizeof(uint8_t));
1028   return lit;
1029 }
1030 
1031 typedef struct libcrux_ml_kem_mlkem768_MlKem768KeyPair_s {
1032   libcrux_ml_kem_types_MlKemPrivateKey_d9 sk;
1033   libcrux_ml_kem_types_MlKemPublicKey_30 pk;
1034 } libcrux_ml_kem_mlkem768_MlKem768KeyPair;
1035 
1036 /**
1037 This function found in impl
1038 {libcrux_ml_kem::types::MlKemKeyPair<PRIVATE_KEY_SIZE, PUBLIC_KEY_SIZE>}
1039 */
1040 /**
1041 A monomorphic instance of libcrux_ml_kem.types.from_17
1042 with const generics
1043 - PRIVATE_KEY_SIZE= 2400
1044 - PUBLIC_KEY_SIZE= 1184
1045 */
1046 static inline libcrux_ml_kem_mlkem768_MlKem768KeyPair
libcrux_ml_kem_types_from_17_74(libcrux_ml_kem_types_MlKemPrivateKey_d9 sk,libcrux_ml_kem_types_MlKemPublicKey_30 pk)1047 libcrux_ml_kem_types_from_17_74(libcrux_ml_kem_types_MlKemPrivateKey_d9 sk,
1048                                 libcrux_ml_kem_types_MlKemPublicKey_30 pk) {
1049   return (KRML_CLITERAL(libcrux_ml_kem_mlkem768_MlKem768KeyPair){.sk = sk,
1050                                                                  .pk = pk});
1051 }
1052 
1053 /**
1054 This function found in impl {core::convert::From<@Array<u8, SIZE>> for
1055 libcrux_ml_kem::types::MlKemPrivateKey<SIZE>}
1056 */
1057 /**
1058 A monomorphic instance of libcrux_ml_kem.types.from_77
1059 with const generics
1060 - SIZE= 2400
1061 */
1062 static inline libcrux_ml_kem_types_MlKemPrivateKey_d9
libcrux_ml_kem_types_from_77_28(uint8_t value[2400U])1063 libcrux_ml_kem_types_from_77_28(uint8_t value[2400U]) {
1064   /* Passing arrays by value in Rust generates a copy in C */
1065   uint8_t copy_of_value[2400U];
1066   memcpy(copy_of_value, value, (size_t)2400U * sizeof(uint8_t));
1067   libcrux_ml_kem_types_MlKemPrivateKey_d9 lit;
1068   memcpy(lit.value, copy_of_value, (size_t)2400U * sizeof(uint8_t));
1069   return lit;
1070 }
1071 
1072 /**
1073 A monomorphic instance of core.result.Result
1074 with types uint8_t[32size_t], core_array_TryFromSliceError
1075 
1076 */
1077 typedef struct Result_fb_s {
1078   Result_b2_tags tag;
1079   union {
1080     uint8_t case_Ok[32U];
1081     TryFromSliceError case_Err;
1082   } val;
1083 } Result_fb;
1084 
1085 /**
1086 This function found in impl {core::result::Result<T, E>[TraitClause@0,
1087 TraitClause@1]}
1088 */
1089 /**
1090 A monomorphic instance of core.result.unwrap_26
1091 with types uint8_t[32size_t], core_array_TryFromSliceError
1092 
1093 */
unwrap_26_b3(Result_fb self,uint8_t ret[32U])1094 static inline void unwrap_26_b3(Result_fb self, uint8_t ret[32U]) {
1095   if (self.tag == Ok) {
1096     uint8_t f0[32U];
1097     memcpy(f0, self.val.case_Ok, (size_t)32U * sizeof(uint8_t));
1098     memcpy(ret, f0, (size_t)32U * sizeof(uint8_t));
1099   } else {
1100     KRML_HOST_EPRINTF("KaRaMeL abort at %s:%d\n%s\n", __FILE__, __LINE__,
1101                       "unwrap not Ok");
1102     KRML_HOST_EXIT(255U);
1103   }
1104 }
1105 
1106 typedef struct libcrux_ml_kem_mlkem768_MlKem768Ciphertext_s {
1107   uint8_t value[1088U];
1108 } libcrux_ml_kem_mlkem768_MlKem768Ciphertext;
1109 
1110 /**
1111 A monomorphic instance of K.
1112 with types libcrux_ml_kem_types_MlKemCiphertext[[$1088size_t]],
1113 uint8_t[32size_t]
1114 
1115 */
1116 typedef struct tuple_c2_s {
1117   libcrux_ml_kem_mlkem768_MlKem768Ciphertext fst;
1118   uint8_t snd[32U];
1119 } tuple_c2;
1120 
1121 /**
1122 This function found in impl {core::convert::From<@Array<u8, SIZE>> for
1123 libcrux_ml_kem::types::MlKemCiphertext<SIZE>}
1124 */
1125 /**
1126 A monomorphic instance of libcrux_ml_kem.types.from_e0
1127 with const generics
1128 - SIZE= 1088
1129 */
1130 static inline libcrux_ml_kem_mlkem768_MlKem768Ciphertext
libcrux_ml_kem_types_from_e0_80(uint8_t value[1088U])1131 libcrux_ml_kem_types_from_e0_80(uint8_t value[1088U]) {
1132   /* Passing arrays by value in Rust generates a copy in C */
1133   uint8_t copy_of_value[1088U];
1134   memcpy(copy_of_value, value, (size_t)1088U * sizeof(uint8_t));
1135   libcrux_ml_kem_mlkem768_MlKem768Ciphertext lit;
1136   memcpy(lit.value, copy_of_value, (size_t)1088U * sizeof(uint8_t));
1137   return lit;
1138 }
1139 
1140 /**
1141 This function found in impl {libcrux_ml_kem::types::MlKemPublicKey<SIZE>}
1142 */
1143 /**
1144 A monomorphic instance of libcrux_ml_kem.types.as_slice_e6
1145 with const generics
1146 - SIZE= 1184
1147 */
libcrux_ml_kem_types_as_slice_e6_d0(libcrux_ml_kem_types_MlKemPublicKey_30 * self)1148 static inline uint8_t *libcrux_ml_kem_types_as_slice_e6_d0(
1149     libcrux_ml_kem_types_MlKemPublicKey_30 *self) {
1150   return self->value;
1151 }
1152 
1153 /**
1154 This function found in impl {libcrux_ml_kem::types::MlKemCiphertext<SIZE>}
1155 */
1156 /**
1157 A monomorphic instance of libcrux_ml_kem.types.as_slice_a9
1158 with const generics
1159 - SIZE= 1088
1160 */
libcrux_ml_kem_types_as_slice_a9_80(libcrux_ml_kem_mlkem768_MlKem768Ciphertext * self)1161 static inline uint8_t *libcrux_ml_kem_types_as_slice_a9_80(
1162     libcrux_ml_kem_mlkem768_MlKem768Ciphertext *self) {
1163   return self->value;
1164 }
1165 
1166 /**
1167 A monomorphic instance of libcrux_ml_kem.utils.prf_input_inc
1168 with const generics
1169 - K= 3
1170 */
libcrux_ml_kem_utils_prf_input_inc_e0(uint8_t (* prf_inputs)[33U],uint8_t domain_separator)1171 static KRML_MUSTINLINE uint8_t libcrux_ml_kem_utils_prf_input_inc_e0(
1172     uint8_t (*prf_inputs)[33U], uint8_t domain_separator) {
1173   for (size_t i = (size_t)0U; i < (size_t)3U; i++) {
1174     size_t i0 = i;
1175     prf_inputs[i0][32U] = domain_separator;
1176     domain_separator = (uint32_t)domain_separator + 1U;
1177   }
1178   return domain_separator;
1179 }
1180 
1181 /**
1182  Pad the `slice` with `0`s at the end.
1183 */
1184 /**
1185 A monomorphic instance of libcrux_ml_kem.utils.into_padded_array
1186 with const generics
1187 - LEN= 33
1188 */
libcrux_ml_kem_utils_into_padded_array_c8(Eurydice_slice slice,uint8_t ret[33U])1189 static KRML_MUSTINLINE void libcrux_ml_kem_utils_into_padded_array_c8(
1190     Eurydice_slice slice, uint8_t ret[33U]) {
1191   uint8_t out[33U] = {0U};
1192   uint8_t *uu____0 = out;
1193   Eurydice_slice_copy(
1194       Eurydice_array_to_subslice3(
1195           uu____0, (size_t)0U, Eurydice_slice_len(slice, uint8_t), uint8_t *),
1196       slice, uint8_t);
1197   memcpy(ret, out, (size_t)33U * sizeof(uint8_t));
1198 }
1199 
1200 /**
1201  Pad the `slice` with `0`s at the end.
1202 */
1203 /**
1204 A monomorphic instance of libcrux_ml_kem.utils.into_padded_array
1205 with const generics
1206 - LEN= 34
1207 */
libcrux_ml_kem_utils_into_padded_array_b6(Eurydice_slice slice,uint8_t ret[34U])1208 static KRML_MUSTINLINE void libcrux_ml_kem_utils_into_padded_array_b6(
1209     Eurydice_slice slice, uint8_t ret[34U]) {
1210   uint8_t out[34U] = {0U};
1211   uint8_t *uu____0 = out;
1212   Eurydice_slice_copy(
1213       Eurydice_array_to_subslice3(
1214           uu____0, (size_t)0U, Eurydice_slice_len(slice, uint8_t), uint8_t *),
1215       slice, uint8_t);
1216   memcpy(ret, out, (size_t)34U * sizeof(uint8_t));
1217 }
1218 
1219 /**
1220 This function found in impl {core::convert::AsRef<@Slice<u8>> for
1221 libcrux_ml_kem::types::MlKemCiphertext<SIZE>}
1222 */
1223 /**
1224 A monomorphic instance of libcrux_ml_kem.types.as_ref_d3
1225 with const generics
1226 - SIZE= 1088
1227 */
libcrux_ml_kem_types_as_ref_d3_80(libcrux_ml_kem_mlkem768_MlKem768Ciphertext * self)1228 static inline Eurydice_slice libcrux_ml_kem_types_as_ref_d3_80(
1229     libcrux_ml_kem_mlkem768_MlKem768Ciphertext *self) {
1230   return Eurydice_array_to_slice((size_t)1088U, self->value, uint8_t);
1231 }
1232 
1233 /**
1234  Pad the `slice` with `0`s at the end.
1235 */
1236 /**
1237 A monomorphic instance of libcrux_ml_kem.utils.into_padded_array
1238 with const generics
1239 - LEN= 1120
1240 */
libcrux_ml_kem_utils_into_padded_array_15(Eurydice_slice slice,uint8_t ret[1120U])1241 static KRML_MUSTINLINE void libcrux_ml_kem_utils_into_padded_array_15(
1242     Eurydice_slice slice, uint8_t ret[1120U]) {
1243   uint8_t out[1120U] = {0U};
1244   uint8_t *uu____0 = out;
1245   Eurydice_slice_copy(
1246       Eurydice_array_to_subslice3(
1247           uu____0, (size_t)0U, Eurydice_slice_len(slice, uint8_t), uint8_t *),
1248       slice, uint8_t);
1249   memcpy(ret, out, (size_t)1120U * sizeof(uint8_t));
1250 }
1251 
1252 /**
1253  Pad the `slice` with `0`s at the end.
1254 */
1255 /**
1256 A monomorphic instance of libcrux_ml_kem.utils.into_padded_array
1257 with const generics
1258 - LEN= 64
1259 */
libcrux_ml_kem_utils_into_padded_array_24(Eurydice_slice slice,uint8_t ret[64U])1260 static KRML_MUSTINLINE void libcrux_ml_kem_utils_into_padded_array_24(
1261     Eurydice_slice slice, uint8_t ret[64U]) {
1262   uint8_t out[64U] = {0U};
1263   uint8_t *uu____0 = out;
1264   Eurydice_slice_copy(
1265       Eurydice_array_to_subslice3(
1266           uu____0, (size_t)0U, Eurydice_slice_len(slice, uint8_t), uint8_t *),
1267       slice, uint8_t);
1268   memcpy(ret, out, (size_t)64U * sizeof(uint8_t));
1269 }
1270 
1271 typedef struct Eurydice_slice_uint8_t_x4_s {
1272   Eurydice_slice fst;
1273   Eurydice_slice snd;
1274   Eurydice_slice thd;
1275   Eurydice_slice f3;
1276 } Eurydice_slice_uint8_t_x4;
1277 
1278 typedef struct Eurydice_slice_uint8_t_x2_s {
1279   Eurydice_slice fst;
1280   Eurydice_slice snd;
1281 } Eurydice_slice_uint8_t_x2;
1282 
1283 /**
1284  Unpack an incoming private key into it's different parts.
1285 
1286  We have this here in types to extract into a common core for C.
1287 */
1288 /**
1289 A monomorphic instance of libcrux_ml_kem.types.unpack_private_key
1290 with const generics
1291 - CPA_SECRET_KEY_SIZE= 1152
1292 - PUBLIC_KEY_SIZE= 1184
1293 */
1294 static inline Eurydice_slice_uint8_t_x4
libcrux_ml_kem_types_unpack_private_key_b4(Eurydice_slice private_key)1295 libcrux_ml_kem_types_unpack_private_key_b4(Eurydice_slice private_key) {
1296   Eurydice_slice_uint8_t_x2 uu____0 = Eurydice_slice_split_at(
1297       private_key, (size_t)1152U, uint8_t, Eurydice_slice_uint8_t_x2);
1298   Eurydice_slice ind_cpa_secret_key = uu____0.fst;
1299   Eurydice_slice secret_key0 = uu____0.snd;
1300   Eurydice_slice_uint8_t_x2 uu____1 = Eurydice_slice_split_at(
1301       secret_key0, (size_t)1184U, uint8_t, Eurydice_slice_uint8_t_x2);
1302   Eurydice_slice ind_cpa_public_key = uu____1.fst;
1303   Eurydice_slice secret_key = uu____1.snd;
1304   Eurydice_slice_uint8_t_x2 uu____2 = Eurydice_slice_split_at(
1305       secret_key, LIBCRUX_ML_KEM_CONSTANTS_H_DIGEST_SIZE, uint8_t,
1306       Eurydice_slice_uint8_t_x2);
1307   Eurydice_slice ind_cpa_public_key_hash = uu____2.fst;
1308   Eurydice_slice implicit_rejection_value = uu____2.snd;
1309   return (
1310       KRML_CLITERAL(Eurydice_slice_uint8_t_x4){.fst = ind_cpa_secret_key,
1311                                                .snd = ind_cpa_public_key,
1312                                                .thd = ind_cpa_public_key_hash,
1313                                                .f3 = implicit_rejection_value});
1314 }
1315 
1316 /**
1317 This function found in impl {libcrux_secrets::traits::Declassify<T> for T}
1318 */
1319 /**
1320 A monomorphic instance of libcrux_secrets.int.public_integers.declassify_d8
1321 with types uint8_t[24size_t]
1322 
1323 */
1324 static KRML_MUSTINLINE void
libcrux_secrets_int_public_integers_declassify_d8_d2(uint8_t self[24U],uint8_t ret[24U])1325 libcrux_secrets_int_public_integers_declassify_d8_d2(uint8_t self[24U],
1326                                                      uint8_t ret[24U]) {
1327   memcpy(ret, self, (size_t)24U * sizeof(uint8_t));
1328 }
1329 
1330 /**
1331 This function found in impl {libcrux_secrets::traits::Declassify<T> for T}
1332 */
1333 /**
1334 A monomorphic instance of libcrux_secrets.int.public_integers.declassify_d8
1335 with types uint8_t[20size_t]
1336 
1337 */
1338 static KRML_MUSTINLINE void
libcrux_secrets_int_public_integers_declassify_d8_57(uint8_t self[20U],uint8_t ret[20U])1339 libcrux_secrets_int_public_integers_declassify_d8_57(uint8_t self[20U],
1340                                                      uint8_t ret[20U]) {
1341   memcpy(ret, self, (size_t)20U * sizeof(uint8_t));
1342 }
1343 
1344 /**
1345 This function found in impl {libcrux_secrets::traits::Declassify<T> for T}
1346 */
1347 /**
1348 A monomorphic instance of libcrux_secrets.int.public_integers.declassify_d8
1349 with types uint8_t[8size_t]
1350 
1351 */
1352 static KRML_MUSTINLINE void
libcrux_secrets_int_public_integers_declassify_d8_76(uint8_t self[8U],uint8_t ret[8U])1353 libcrux_secrets_int_public_integers_declassify_d8_76(uint8_t self[8U],
1354                                                      uint8_t ret[8U]) {
1355   memcpy(ret, self, (size_t)8U * sizeof(uint8_t));
1356 }
1357 
1358 /**
1359 This function found in impl {libcrux_secrets::traits::Declassify<T> for T}
1360 */
1361 /**
1362 A monomorphic instance of libcrux_secrets.int.public_integers.declassify_d8
1363 with types uint8_t[2size_t]
1364 
1365 */
1366 static KRML_MUSTINLINE void
libcrux_secrets_int_public_integers_declassify_d8_d4(uint8_t self[2U],uint8_t ret[2U])1367 libcrux_secrets_int_public_integers_declassify_d8_d4(uint8_t self[2U],
1368                                                      uint8_t ret[2U]) {
1369   memcpy(ret, self, (size_t)2U * sizeof(uint8_t));
1370 }
1371 
1372 /**
1373 This function found in impl {libcrux_secrets::traits::Classify<T> for T}
1374 */
1375 /**
1376 A monomorphic instance of libcrux_secrets.int.public_integers.classify_27
1377 with types int16_t[16size_t]
1378 
1379 */
libcrux_secrets_int_public_integers_classify_27_46(int16_t self[16U],int16_t ret[16U])1380 static KRML_MUSTINLINE void libcrux_secrets_int_public_integers_classify_27_46(
1381     int16_t self[16U], int16_t ret[16U]) {
1382   memcpy(ret, self, (size_t)16U * sizeof(int16_t));
1383 }
1384 
1385 /**
1386 This function found in impl {libcrux_secrets::traits::ClassifyRef<&'a
1387 (@Slice<T>)> for &'a (@Slice<T>)}
1388 */
1389 /**
1390 A monomorphic instance of libcrux_secrets.int.classify_public.classify_ref_9b
1391 with types uint8_t
1392 
1393 */
1394 static KRML_MUSTINLINE Eurydice_slice
libcrux_secrets_int_classify_public_classify_ref_9b_90(Eurydice_slice self)1395 libcrux_secrets_int_classify_public_classify_ref_9b_90(Eurydice_slice self) {
1396   return self;
1397 }
1398 
1399 /**
1400 This function found in impl {libcrux_secrets::traits::ClassifyRef<&'a
1401 (@Slice<T>)> for &'a (@Slice<T>)}
1402 */
1403 /**
1404 A monomorphic instance of libcrux_secrets.int.classify_public.classify_ref_9b
1405 with types int16_t
1406 
1407 */
1408 static KRML_MUSTINLINE Eurydice_slice
libcrux_secrets_int_classify_public_classify_ref_9b_39(Eurydice_slice self)1409 libcrux_secrets_int_classify_public_classify_ref_9b_39(Eurydice_slice self) {
1410   return self;
1411 }
1412 
1413 /**
1414 A monomorphic instance of core.result.Result
1415 with types int16_t[16size_t], core_array_TryFromSliceError
1416 
1417 */
1418 typedef struct Result_0a_s {
1419   Result_b2_tags tag;
1420   union {
1421     int16_t case_Ok[16U];
1422     TryFromSliceError case_Err;
1423   } val;
1424 } Result_0a;
1425 
1426 /**
1427 This function found in impl {core::result::Result<T, E>[TraitClause@0,
1428 TraitClause@1]}
1429 */
1430 /**
1431 A monomorphic instance of core.result.unwrap_26
1432 with types int16_t[16size_t], core_array_TryFromSliceError
1433 
1434 */
unwrap_26_00(Result_0a self,int16_t ret[16U])1435 static inline void unwrap_26_00(Result_0a self, int16_t ret[16U]) {
1436   if (self.tag == Ok) {
1437     int16_t f0[16U];
1438     memcpy(f0, self.val.case_Ok, (size_t)16U * sizeof(int16_t));
1439     memcpy(ret, f0, (size_t)16U * sizeof(int16_t));
1440   } else {
1441     KRML_HOST_EPRINTF("KaRaMeL abort at %s:%d\n%s\n", __FILE__, __LINE__,
1442                       "unwrap not Ok");
1443     KRML_HOST_EXIT(255U);
1444   }
1445 }
1446 
1447 /**
1448 A monomorphic instance of core.result.Result
1449 with types uint8_t[8size_t], core_array_TryFromSliceError
1450 
1451 */
1452 typedef struct Result_15_s {
1453   Result_b2_tags tag;
1454   union {
1455     uint8_t case_Ok[8U];
1456     TryFromSliceError case_Err;
1457   } val;
1458 } Result_15;
1459 
1460 /**
1461 This function found in impl {core::result::Result<T, E>[TraitClause@0,
1462 TraitClause@1]}
1463 */
1464 /**
1465 A monomorphic instance of core.result.unwrap_26
1466 with types uint8_t[8size_t], core_array_TryFromSliceError
1467 
1468 */
unwrap_26_68(Result_15 self,uint8_t ret[8U])1469 static inline void unwrap_26_68(Result_15 self, uint8_t ret[8U]) {
1470   if (self.tag == Ok) {
1471     uint8_t f0[8U];
1472     memcpy(f0, self.val.case_Ok, (size_t)8U * sizeof(uint8_t));
1473     memcpy(ret, f0, (size_t)8U * sizeof(uint8_t));
1474   } else {
1475     KRML_HOST_EPRINTF("KaRaMeL abort at %s:%d\n%s\n", __FILE__, __LINE__,
1476                       "unwrap not Ok");
1477     KRML_HOST_EXIT(255U);
1478   }
1479 }
1480 
1481 #if defined(__cplusplus)
1482 }
1483 #endif
1484 
1485 #define libcrux_mlkem_core_H_DEFINED
1486 #endif /* libcrux_mlkem_core_H */
1487 
1488 /* from libcrux/libcrux-ml-kem/extracts/c_header_only/generated/libcrux_ct_ops.h */
1489 /*
1490  * SPDX-FileCopyrightText: 2025 Cryspen Sarl <info@cryspen.com>
1491  *
1492  * SPDX-License-Identifier: MIT or Apache-2.0
1493  *
1494  * This code was generated with the following revisions:
1495  * Charon: 667d2fc98984ff7f3df989c2367e6c1fa4a000e7
1496  * Eurydice: 2381cbc416ef2ad0b561c362c500bc84f36b6785
1497  * Karamel: 80f5435f2fc505973c469a4afcc8d875cddd0d8b
1498  * F*: 71d8221589d4d438af3706d89cb653cf53e18aab
1499  * Libcrux: 68dfed5a4a9e40277f62828471c029afed1ecdcc
1500  */
1501 
1502 #ifndef libcrux_ct_ops_H
1503 #define libcrux_ct_ops_H
1504 
1505 
1506 #if defined(__cplusplus)
1507 extern "C" {
1508 #endif
1509 
1510 
1511 /**
1512  Return 1 if `value` is not zero and 0 otherwise.
1513 */
1514 static KRML_NOINLINE uint8_t
libcrux_ml_kem_constant_time_ops_inz(uint8_t value)1515 libcrux_ml_kem_constant_time_ops_inz(uint8_t value) {
1516   uint16_t value0 = (uint16_t)value;
1517   uint8_t result =
1518       (uint8_t)((uint32_t)core_num__u16__wrapping_add(~value0, 1U) >> 8U);
1519   return (uint32_t)result & 1U;
1520 }
1521 
1522 static KRML_NOINLINE uint8_t
libcrux_ml_kem_constant_time_ops_is_non_zero(uint8_t value)1523 libcrux_ml_kem_constant_time_ops_is_non_zero(uint8_t value) {
1524   return libcrux_ml_kem_constant_time_ops_inz(value);
1525 }
1526 
1527 /**
1528  Return 1 if the bytes of `lhs` and `rhs` do not exactly
1529  match and 0 otherwise.
1530 */
libcrux_ml_kem_constant_time_ops_compare(Eurydice_slice lhs,Eurydice_slice rhs)1531 static KRML_NOINLINE uint8_t libcrux_ml_kem_constant_time_ops_compare(
1532     Eurydice_slice lhs, Eurydice_slice rhs) {
1533   uint8_t r = 0U;
1534   for (size_t i = (size_t)0U; i < Eurydice_slice_len(lhs, uint8_t); i++) {
1535     size_t i0 = i;
1536     uint8_t nr = (uint32_t)r |
1537                  ((uint32_t)Eurydice_slice_index(lhs, i0, uint8_t, uint8_t *) ^
1538                   (uint32_t)Eurydice_slice_index(rhs, i0, uint8_t, uint8_t *));
1539     r = nr;
1540   }
1541   return libcrux_ml_kem_constant_time_ops_is_non_zero(r);
1542 }
1543 
1544 static KRML_NOINLINE uint8_t
libcrux_ml_kem_constant_time_ops_compare_ciphertexts_in_constant_time(Eurydice_slice lhs,Eurydice_slice rhs)1545 libcrux_ml_kem_constant_time_ops_compare_ciphertexts_in_constant_time(
1546     Eurydice_slice lhs, Eurydice_slice rhs) {
1547   return libcrux_ml_kem_constant_time_ops_compare(lhs, rhs);
1548 }
1549 
1550 /**
1551  If `selector` is not zero, return the bytes in `rhs`; return the bytes in
1552  `lhs` otherwise.
1553 */
libcrux_ml_kem_constant_time_ops_select_ct(Eurydice_slice lhs,Eurydice_slice rhs,uint8_t selector,uint8_t ret[32U])1554 static KRML_NOINLINE void libcrux_ml_kem_constant_time_ops_select_ct(
1555     Eurydice_slice lhs, Eurydice_slice rhs, uint8_t selector,
1556     uint8_t ret[32U]) {
1557   uint8_t mask = core_num__u8__wrapping_sub(
1558       libcrux_ml_kem_constant_time_ops_is_non_zero(selector), 1U);
1559   uint8_t out[32U] = {0U};
1560   for (size_t i = (size_t)0U; i < LIBCRUX_ML_KEM_CONSTANTS_SHARED_SECRET_SIZE;
1561        i++) {
1562     size_t i0 = i;
1563     uint8_t outi =
1564         ((uint32_t)Eurydice_slice_index(lhs, i0, uint8_t, uint8_t *) &
1565          (uint32_t)mask) |
1566         ((uint32_t)Eurydice_slice_index(rhs, i0, uint8_t, uint8_t *) &
1567          (uint32_t)~mask);
1568     out[i0] = outi;
1569   }
1570   memcpy(ret, out, (size_t)32U * sizeof(uint8_t));
1571 }
1572 
1573 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])1574 libcrux_ml_kem_constant_time_ops_select_shared_secret_in_constant_time(
1575     Eurydice_slice lhs, Eurydice_slice rhs, uint8_t selector,
1576     uint8_t ret[32U]) {
1577   libcrux_ml_kem_constant_time_ops_select_ct(lhs, rhs, selector, ret);
1578 }
1579 
1580 static KRML_NOINLINE 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])1581 libcrux_ml_kem_constant_time_ops_compare_ciphertexts_select_shared_secret_in_constant_time(
1582     Eurydice_slice lhs_c, Eurydice_slice rhs_c, Eurydice_slice lhs_s,
1583     Eurydice_slice rhs_s, uint8_t ret[32U]) {
1584   uint8_t selector =
1585       libcrux_ml_kem_constant_time_ops_compare_ciphertexts_in_constant_time(
1586           lhs_c, rhs_c);
1587   uint8_t ret0[32U];
1588   libcrux_ml_kem_constant_time_ops_select_shared_secret_in_constant_time(
1589       lhs_s, rhs_s, selector, ret0);
1590   memcpy(ret, ret0, (size_t)32U * sizeof(uint8_t));
1591 }
1592 
1593 #if defined(__cplusplus)
1594 }
1595 #endif
1596 
1597 #define libcrux_ct_ops_H_DEFINED
1598 #endif /* libcrux_ct_ops_H */
1599 
1600 /* from libcrux/libcrux-ml-kem/extracts/c_header_only/generated/libcrux_sha3_portable.h */
1601 /*
1602  * SPDX-FileCopyrightText: 2025 Cryspen Sarl <info@cryspen.com>
1603  *
1604  * SPDX-License-Identifier: MIT or Apache-2.0
1605  *
1606  * This code was generated with the following revisions:
1607  * Charon: 667d2fc98984ff7f3df989c2367e6c1fa4a000e7
1608  * Eurydice: 2381cbc416ef2ad0b561c362c500bc84f36b6785
1609  * Karamel: 80f5435f2fc505973c469a4afcc8d875cddd0d8b
1610  * F*: 71d8221589d4d438af3706d89cb653cf53e18aab
1611  * Libcrux: 68dfed5a4a9e40277f62828471c029afed1ecdcc
1612  */
1613 
1614 #ifndef libcrux_sha3_portable_H
1615 #define libcrux_sha3_portable_H
1616 
1617 
1618 #if defined(__cplusplus)
1619 extern "C" {
1620 #endif
1621 
1622 
1623 /**
1624 This function found in impl {libcrux_sha3::traits::KeccakItem<1usize> for u64}
1625 */
libcrux_sha3_simd_portable_zero_d2(void)1626 static KRML_MUSTINLINE uint64_t libcrux_sha3_simd_portable_zero_d2(void) {
1627   return 0ULL;
1628 }
1629 
libcrux_sha3_simd_portable__veor5q_u64(uint64_t a,uint64_t b,uint64_t c,uint64_t d,uint64_t e)1630 static KRML_MUSTINLINE uint64_t libcrux_sha3_simd_portable__veor5q_u64(
1631     uint64_t a, uint64_t b, uint64_t c, uint64_t d, uint64_t e) {
1632   return (((a ^ b) ^ c) ^ d) ^ e;
1633 }
1634 
1635 /**
1636 This function found in impl {libcrux_sha3::traits::KeccakItem<1usize> for u64}
1637 */
libcrux_sha3_simd_portable_xor5_d2(uint64_t a,uint64_t b,uint64_t c,uint64_t d,uint64_t e)1638 static KRML_MUSTINLINE uint64_t libcrux_sha3_simd_portable_xor5_d2(
1639     uint64_t a, uint64_t b, uint64_t c, uint64_t d, uint64_t e) {
1640   return libcrux_sha3_simd_portable__veor5q_u64(a, b, c, d, e);
1641 }
1642 
1643 /**
1644 A monomorphic instance of libcrux_sha3.simd.portable.rotate_left
1645 with const generics
1646 - LEFT= 1
1647 - RIGHT= 63
1648 */
1649 static KRML_MUSTINLINE uint64_t
libcrux_sha3_simd_portable_rotate_left_76(uint64_t x)1650 libcrux_sha3_simd_portable_rotate_left_76(uint64_t x) {
1651   return core_num__u64__rotate_left(x, (uint32_t)(int32_t)1);
1652 }
1653 
1654 static KRML_MUSTINLINE uint64_t
libcrux_sha3_simd_portable__vrax1q_u64(uint64_t a,uint64_t b)1655 libcrux_sha3_simd_portable__vrax1q_u64(uint64_t a, uint64_t b) {
1656   uint64_t uu____0 = a;
1657   return uu____0 ^ libcrux_sha3_simd_portable_rotate_left_76(b);
1658 }
1659 
1660 /**
1661 This function found in impl {libcrux_sha3::traits::KeccakItem<1usize> for u64}
1662 */
1663 static KRML_MUSTINLINE uint64_t
libcrux_sha3_simd_portable_rotate_left1_and_xor_d2(uint64_t a,uint64_t b)1664 libcrux_sha3_simd_portable_rotate_left1_and_xor_d2(uint64_t a, uint64_t b) {
1665   return libcrux_sha3_simd_portable__vrax1q_u64(a, b);
1666 }
1667 
1668 static KRML_MUSTINLINE uint64_t
libcrux_sha3_simd_portable__vbcaxq_u64(uint64_t a,uint64_t b,uint64_t c)1669 libcrux_sha3_simd_portable__vbcaxq_u64(uint64_t a, uint64_t b, uint64_t c) {
1670   return a ^ (b & ~c);
1671 }
1672 
1673 /**
1674 This function found in impl {libcrux_sha3::traits::KeccakItem<1usize> for u64}
1675 */
1676 static KRML_MUSTINLINE uint64_t
libcrux_sha3_simd_portable_and_not_xor_d2(uint64_t a,uint64_t b,uint64_t c)1677 libcrux_sha3_simd_portable_and_not_xor_d2(uint64_t a, uint64_t b, uint64_t c) {
1678   return libcrux_sha3_simd_portable__vbcaxq_u64(a, b, c);
1679 }
1680 
1681 static KRML_MUSTINLINE uint64_t
libcrux_sha3_simd_portable__veorq_n_u64(uint64_t a,uint64_t c)1682 libcrux_sha3_simd_portable__veorq_n_u64(uint64_t a, uint64_t c) {
1683   return a ^ c;
1684 }
1685 
1686 /**
1687 This function found in impl {libcrux_sha3::traits::KeccakItem<1usize> for u64}
1688 */
1689 static KRML_MUSTINLINE uint64_t
libcrux_sha3_simd_portable_xor_constant_d2(uint64_t a,uint64_t c)1690 libcrux_sha3_simd_portable_xor_constant_d2(uint64_t a, uint64_t c) {
1691   return libcrux_sha3_simd_portable__veorq_n_u64(a, c);
1692 }
1693 
1694 /**
1695 This function found in impl {libcrux_sha3::traits::KeccakItem<1usize> for u64}
1696 */
libcrux_sha3_simd_portable_xor_d2(uint64_t a,uint64_t b)1697 static KRML_MUSTINLINE uint64_t libcrux_sha3_simd_portable_xor_d2(uint64_t a,
1698                                                                   uint64_t b) {
1699   return a ^ b;
1700 }
1701 
1702 static const uint64_t
1703     libcrux_sha3_generic_keccak_constants_ROUNDCONSTANTS[24U] = {
1704         1ULL,
1705         32898ULL,
1706         9223372036854808714ULL,
1707         9223372039002292224ULL,
1708         32907ULL,
1709         2147483649ULL,
1710         9223372039002292353ULL,
1711         9223372036854808585ULL,
1712         138ULL,
1713         136ULL,
1714         2147516425ULL,
1715         2147483658ULL,
1716         2147516555ULL,
1717         9223372036854775947ULL,
1718         9223372036854808713ULL,
1719         9223372036854808579ULL,
1720         9223372036854808578ULL,
1721         9223372036854775936ULL,
1722         32778ULL,
1723         9223372039002259466ULL,
1724         9223372039002292353ULL,
1725         9223372036854808704ULL,
1726         2147483649ULL,
1727         9223372039002292232ULL};
1728 
1729 typedef struct size_t_x2_s {
1730   size_t fst;
1731   size_t snd;
1732 } size_t_x2;
1733 
1734 /**
1735 A monomorphic instance of libcrux_sha3.generic_keccak.KeccakState
1736 with types uint64_t
1737 with const generics
1738 - $1size_t
1739 */
1740 typedef struct libcrux_sha3_generic_keccak_KeccakState_17_s {
1741   uint64_t st[25U];
1742 } libcrux_sha3_generic_keccak_KeccakState_17;
1743 
1744 /**
1745 This function found in impl {libcrux_sha3::generic_keccak::KeccakState<T,
1746 N>[TraitClause@0, TraitClause@1]}
1747 */
1748 /**
1749 A monomorphic instance of libcrux_sha3.generic_keccak.new_80
1750 with types uint64_t
1751 with const generics
1752 - N= 1
1753 */
1754 static KRML_MUSTINLINE libcrux_sha3_generic_keccak_KeccakState_17
libcrux_sha3_generic_keccak_new_80_04(void)1755 libcrux_sha3_generic_keccak_new_80_04(void) {
1756   libcrux_sha3_generic_keccak_KeccakState_17 lit;
1757   uint64_t repeat_expression[25U];
1758   for (size_t i = (size_t)0U; i < (size_t)25U; i++) {
1759     repeat_expression[i] = libcrux_sha3_simd_portable_zero_d2();
1760   }
1761   memcpy(lit.st, repeat_expression, (size_t)25U * sizeof(uint64_t));
1762   return lit;
1763 }
1764 
1765 /**
1766 A monomorphic instance of libcrux_sha3.traits.get_ij
1767 with types uint64_t
1768 with const generics
1769 - N= 1
1770 */
libcrux_sha3_traits_get_ij_04(uint64_t * arr,size_t i,size_t j)1771 static KRML_MUSTINLINE uint64_t *libcrux_sha3_traits_get_ij_04(uint64_t *arr,
1772                                                                size_t i,
1773                                                                size_t j) {
1774   return &arr[(size_t)5U * j + i];
1775 }
1776 
1777 /**
1778 A monomorphic instance of libcrux_sha3.traits.set_ij
1779 with types uint64_t
1780 with const generics
1781 - N= 1
1782 */
libcrux_sha3_traits_set_ij_04(uint64_t * arr,size_t i,size_t j,uint64_t value)1783 static KRML_MUSTINLINE void libcrux_sha3_traits_set_ij_04(uint64_t *arr,
1784                                                           size_t i, size_t j,
1785                                                           uint64_t value) {
1786   arr[(size_t)5U * j + i] = value;
1787 }
1788 
1789 /**
1790 A monomorphic instance of libcrux_sha3.simd.portable.load_block
1791 with const generics
1792 - RATE= 72
1793 */
libcrux_sha3_simd_portable_load_block_f8(uint64_t * state,Eurydice_slice blocks,size_t start)1794 static KRML_MUSTINLINE void libcrux_sha3_simd_portable_load_block_f8(
1795     uint64_t *state, Eurydice_slice blocks, size_t start) {
1796   uint64_t state_flat[25U] = {0U};
1797   for (size_t i = (size_t)0U; i < (size_t)72U / (size_t)8U; i++) {
1798     size_t i0 = i;
1799     size_t offset = start + (size_t)8U * i0;
1800     uint8_t uu____0[8U];
1801     Result_15 dst;
1802     Eurydice_slice_to_array2(
1803         &dst,
1804         Eurydice_slice_subslice3(blocks, offset, offset + (size_t)8U,
1805                                  uint8_t *),
1806         Eurydice_slice, uint8_t[8U], TryFromSliceError);
1807     unwrap_26_68(dst, uu____0);
1808     state_flat[i0] = core_num__u64__from_le_bytes(uu____0);
1809   }
1810   for (size_t i = (size_t)0U; i < (size_t)72U / (size_t)8U; i++) {
1811     size_t i0 = i;
1812     libcrux_sha3_traits_set_ij_04(
1813         state, i0 / (size_t)5U, i0 % (size_t)5U,
1814         libcrux_sha3_traits_get_ij_04(state, i0 / (size_t)5U,
1815                                       i0 % (size_t)5U)[0U] ^
1816             state_flat[i0]);
1817   }
1818 }
1819 
1820 /**
1821 This function found in impl {libcrux_sha3::traits::Absorb<1usize> for
1822 libcrux_sha3::generic_keccak::KeccakState<u64, 1usize>[core::marker::Sized<u64>,
1823 libcrux_sha3::simd::portable::{libcrux_sha3::traits::KeccakItem<1usize> for
1824 u64}]}
1825 */
1826 /**
1827 A monomorphic instance of libcrux_sha3.simd.portable.load_block_a1
1828 with const generics
1829 - RATE= 72
1830 */
libcrux_sha3_simd_portable_load_block_a1_f8(libcrux_sha3_generic_keccak_KeccakState_17 * self,Eurydice_slice * input,size_t start)1831 static inline void libcrux_sha3_simd_portable_load_block_a1_f8(
1832     libcrux_sha3_generic_keccak_KeccakState_17 *self, Eurydice_slice *input,
1833     size_t start) {
1834   libcrux_sha3_simd_portable_load_block_f8(self->st, input[0U], start);
1835 }
1836 
1837 /**
1838 This function found in impl {core::ops::index::Index<(usize, usize), T> for
1839 libcrux_sha3::generic_keccak::KeccakState<T, N>[TraitClause@0, TraitClause@1]}
1840 */
1841 /**
1842 A monomorphic instance of libcrux_sha3.generic_keccak.index_c2
1843 with types uint64_t
1844 with const generics
1845 - N= 1
1846 */
libcrux_sha3_generic_keccak_index_c2_04(libcrux_sha3_generic_keccak_KeccakState_17 * self,size_t_x2 index)1847 static inline uint64_t *libcrux_sha3_generic_keccak_index_c2_04(
1848     libcrux_sha3_generic_keccak_KeccakState_17 *self, size_t_x2 index) {
1849   return libcrux_sha3_traits_get_ij_04(self->st, index.fst, index.snd);
1850 }
1851 
1852 /**
1853 This function found in impl {libcrux_sha3::generic_keccak::KeccakState<T,
1854 N>[TraitClause@0, TraitClause@1]}
1855 */
1856 /**
1857 A monomorphic instance of libcrux_sha3.generic_keccak.theta_80
1858 with types uint64_t
1859 with const generics
1860 - N= 1
1861 */
libcrux_sha3_generic_keccak_theta_80_04(libcrux_sha3_generic_keccak_KeccakState_17 * self,uint64_t ret[5U])1862 static KRML_MUSTINLINE void libcrux_sha3_generic_keccak_theta_80_04(
1863     libcrux_sha3_generic_keccak_KeccakState_17 *self, uint64_t ret[5U]) {
1864   uint64_t c[5U] = {
1865       libcrux_sha3_simd_portable_xor5_d2(
1866           libcrux_sha3_generic_keccak_index_c2_04(
1867               self, (KRML_CLITERAL(size_t_x2){.fst = (size_t)0U,
1868                                               .snd = (size_t)0U}))[0U],
1869           libcrux_sha3_generic_keccak_index_c2_04(
1870               self, (KRML_CLITERAL(size_t_x2){.fst = (size_t)1U,
1871                                               .snd = (size_t)0U}))[0U],
1872           libcrux_sha3_generic_keccak_index_c2_04(
1873               self, (KRML_CLITERAL(size_t_x2){.fst = (size_t)2U,
1874                                               .snd = (size_t)0U}))[0U],
1875           libcrux_sha3_generic_keccak_index_c2_04(
1876               self, (KRML_CLITERAL(size_t_x2){.fst = (size_t)3U,
1877                                               .snd = (size_t)0U}))[0U],
1878           libcrux_sha3_generic_keccak_index_c2_04(
1879               self, (KRML_CLITERAL(size_t_x2){.fst = (size_t)4U,
1880                                               .snd = (size_t)0U}))[0U]),
1881       libcrux_sha3_simd_portable_xor5_d2(
1882           libcrux_sha3_generic_keccak_index_c2_04(
1883               self, (KRML_CLITERAL(size_t_x2){.fst = (size_t)0U,
1884                                               .snd = (size_t)1U}))[0U],
1885           libcrux_sha3_generic_keccak_index_c2_04(
1886               self, (KRML_CLITERAL(size_t_x2){.fst = (size_t)1U,
1887                                               .snd = (size_t)1U}))[0U],
1888           libcrux_sha3_generic_keccak_index_c2_04(
1889               self, (KRML_CLITERAL(size_t_x2){.fst = (size_t)2U,
1890                                               .snd = (size_t)1U}))[0U],
1891           libcrux_sha3_generic_keccak_index_c2_04(
1892               self, (KRML_CLITERAL(size_t_x2){.fst = (size_t)3U,
1893                                               .snd = (size_t)1U}))[0U],
1894           libcrux_sha3_generic_keccak_index_c2_04(
1895               self, (KRML_CLITERAL(size_t_x2){.fst = (size_t)4U,
1896                                               .snd = (size_t)1U}))[0U]),
1897       libcrux_sha3_simd_portable_xor5_d2(
1898           libcrux_sha3_generic_keccak_index_c2_04(
1899               self, (KRML_CLITERAL(size_t_x2){.fst = (size_t)0U,
1900                                               .snd = (size_t)2U}))[0U],
1901           libcrux_sha3_generic_keccak_index_c2_04(
1902               self, (KRML_CLITERAL(size_t_x2){.fst = (size_t)1U,
1903                                               .snd = (size_t)2U}))[0U],
1904           libcrux_sha3_generic_keccak_index_c2_04(
1905               self, (KRML_CLITERAL(size_t_x2){.fst = (size_t)2U,
1906                                               .snd = (size_t)2U}))[0U],
1907           libcrux_sha3_generic_keccak_index_c2_04(
1908               self, (KRML_CLITERAL(size_t_x2){.fst = (size_t)3U,
1909                                               .snd = (size_t)2U}))[0U],
1910           libcrux_sha3_generic_keccak_index_c2_04(
1911               self, (KRML_CLITERAL(size_t_x2){.fst = (size_t)4U,
1912                                               .snd = (size_t)2U}))[0U]),
1913       libcrux_sha3_simd_portable_xor5_d2(
1914           libcrux_sha3_generic_keccak_index_c2_04(
1915               self, (KRML_CLITERAL(size_t_x2){.fst = (size_t)0U,
1916                                               .snd = (size_t)3U}))[0U],
1917           libcrux_sha3_generic_keccak_index_c2_04(
1918               self, (KRML_CLITERAL(size_t_x2){.fst = (size_t)1U,
1919                                               .snd = (size_t)3U}))[0U],
1920           libcrux_sha3_generic_keccak_index_c2_04(
1921               self, (KRML_CLITERAL(size_t_x2){.fst = (size_t)2U,
1922                                               .snd = (size_t)3U}))[0U],
1923           libcrux_sha3_generic_keccak_index_c2_04(
1924               self, (KRML_CLITERAL(size_t_x2){.fst = (size_t)3U,
1925                                               .snd = (size_t)3U}))[0U],
1926           libcrux_sha3_generic_keccak_index_c2_04(
1927               self, (KRML_CLITERAL(size_t_x2){.fst = (size_t)4U,
1928                                               .snd = (size_t)3U}))[0U]),
1929       libcrux_sha3_simd_portable_xor5_d2(
1930           libcrux_sha3_generic_keccak_index_c2_04(
1931               self, (KRML_CLITERAL(size_t_x2){.fst = (size_t)0U,
1932                                               .snd = (size_t)4U}))[0U],
1933           libcrux_sha3_generic_keccak_index_c2_04(
1934               self, (KRML_CLITERAL(size_t_x2){.fst = (size_t)1U,
1935                                               .snd = (size_t)4U}))[0U],
1936           libcrux_sha3_generic_keccak_index_c2_04(
1937               self, (KRML_CLITERAL(size_t_x2){.fst = (size_t)2U,
1938                                               .snd = (size_t)4U}))[0U],
1939           libcrux_sha3_generic_keccak_index_c2_04(
1940               self, (KRML_CLITERAL(size_t_x2){.fst = (size_t)3U,
1941                                               .snd = (size_t)4U}))[0U],
1942           libcrux_sha3_generic_keccak_index_c2_04(
1943               self, (KRML_CLITERAL(size_t_x2){.fst = (size_t)4U,
1944                                               .snd = (size_t)4U}))[0U])};
1945   uint64_t uu____0 = libcrux_sha3_simd_portable_rotate_left1_and_xor_d2(
1946       c[((size_t)0U + (size_t)4U) % (size_t)5U],
1947       c[((size_t)0U + (size_t)1U) % (size_t)5U]);
1948   uint64_t uu____1 = libcrux_sha3_simd_portable_rotate_left1_and_xor_d2(
1949       c[((size_t)1U + (size_t)4U) % (size_t)5U],
1950       c[((size_t)1U + (size_t)1U) % (size_t)5U]);
1951   uint64_t uu____2 = libcrux_sha3_simd_portable_rotate_left1_and_xor_d2(
1952       c[((size_t)2U + (size_t)4U) % (size_t)5U],
1953       c[((size_t)2U + (size_t)1U) % (size_t)5U]);
1954   uint64_t uu____3 = libcrux_sha3_simd_portable_rotate_left1_and_xor_d2(
1955       c[((size_t)3U + (size_t)4U) % (size_t)5U],
1956       c[((size_t)3U + (size_t)1U) % (size_t)5U]);
1957   ret[0U] = uu____0;
1958   ret[1U] = uu____1;
1959   ret[2U] = uu____2;
1960   ret[3U] = uu____3;
1961   ret[4U] = libcrux_sha3_simd_portable_rotate_left1_and_xor_d2(
1962       c[((size_t)4U + (size_t)4U) % (size_t)5U],
1963       c[((size_t)4U + (size_t)1U) % (size_t)5U]);
1964 }
1965 
1966 /**
1967 This function found in impl {libcrux_sha3::generic_keccak::KeccakState<T,
1968 N>[TraitClause@0, TraitClause@1]}
1969 */
1970 /**
1971 A monomorphic instance of libcrux_sha3.generic_keccak.set_80
1972 with types uint64_t
1973 with const generics
1974 - N= 1
1975 */
libcrux_sha3_generic_keccak_set_80_04(libcrux_sha3_generic_keccak_KeccakState_17 * self,size_t i,size_t j,uint64_t v)1976 static inline void libcrux_sha3_generic_keccak_set_80_04(
1977     libcrux_sha3_generic_keccak_KeccakState_17 *self, size_t i, size_t j,
1978     uint64_t v) {
1979   libcrux_sha3_traits_set_ij_04(self->st, i, j, v);
1980 }
1981 
1982 /**
1983 A monomorphic instance of libcrux_sha3.simd.portable.rotate_left
1984 with const generics
1985 - LEFT= 36
1986 - RIGHT= 28
1987 */
1988 static KRML_MUSTINLINE uint64_t
libcrux_sha3_simd_portable_rotate_left_02(uint64_t x)1989 libcrux_sha3_simd_portable_rotate_left_02(uint64_t x) {
1990   return core_num__u64__rotate_left(x, (uint32_t)(int32_t)36);
1991 }
1992 
1993 /**
1994 A monomorphic instance of libcrux_sha3.simd.portable._vxarq_u64
1995 with const generics
1996 - LEFT= 36
1997 - RIGHT= 28
1998 */
1999 static KRML_MUSTINLINE uint64_t
libcrux_sha3_simd_portable__vxarq_u64_02(uint64_t a,uint64_t b)2000 libcrux_sha3_simd_portable__vxarq_u64_02(uint64_t a, uint64_t b) {
2001   return libcrux_sha3_simd_portable_rotate_left_02(a ^ b);
2002 }
2003 
2004 /**
2005 This function found in impl {libcrux_sha3::traits::KeccakItem<1usize> for u64}
2006 */
2007 /**
2008 A monomorphic instance of libcrux_sha3.simd.portable.xor_and_rotate_d2
2009 with const generics
2010 - LEFT= 36
2011 - RIGHT= 28
2012 */
2013 static KRML_MUSTINLINE uint64_t
libcrux_sha3_simd_portable_xor_and_rotate_d2_02(uint64_t a,uint64_t b)2014 libcrux_sha3_simd_portable_xor_and_rotate_d2_02(uint64_t a, uint64_t b) {
2015   return libcrux_sha3_simd_portable__vxarq_u64_02(a, b);
2016 }
2017 
2018 /**
2019 A monomorphic instance of libcrux_sha3.simd.portable.rotate_left
2020 with const generics
2021 - LEFT= 3
2022 - RIGHT= 61
2023 */
2024 static KRML_MUSTINLINE uint64_t
libcrux_sha3_simd_portable_rotate_left_ac(uint64_t x)2025 libcrux_sha3_simd_portable_rotate_left_ac(uint64_t x) {
2026   return core_num__u64__rotate_left(x, (uint32_t)(int32_t)3);
2027 }
2028 
2029 /**
2030 A monomorphic instance of libcrux_sha3.simd.portable._vxarq_u64
2031 with const generics
2032 - LEFT= 3
2033 - RIGHT= 61
2034 */
2035 static KRML_MUSTINLINE uint64_t
libcrux_sha3_simd_portable__vxarq_u64_ac(uint64_t a,uint64_t b)2036 libcrux_sha3_simd_portable__vxarq_u64_ac(uint64_t a, uint64_t b) {
2037   return libcrux_sha3_simd_portable_rotate_left_ac(a ^ b);
2038 }
2039 
2040 /**
2041 This function found in impl {libcrux_sha3::traits::KeccakItem<1usize> for u64}
2042 */
2043 /**
2044 A monomorphic instance of libcrux_sha3.simd.portable.xor_and_rotate_d2
2045 with const generics
2046 - LEFT= 3
2047 - RIGHT= 61
2048 */
2049 static KRML_MUSTINLINE uint64_t
libcrux_sha3_simd_portable_xor_and_rotate_d2_ac(uint64_t a,uint64_t b)2050 libcrux_sha3_simd_portable_xor_and_rotate_d2_ac(uint64_t a, uint64_t b) {
2051   return libcrux_sha3_simd_portable__vxarq_u64_ac(a, b);
2052 }
2053 
2054 /**
2055 A monomorphic instance of libcrux_sha3.simd.portable.rotate_left
2056 with const generics
2057 - LEFT= 41
2058 - RIGHT= 23
2059 */
2060 static KRML_MUSTINLINE uint64_t
libcrux_sha3_simd_portable_rotate_left_020(uint64_t x)2061 libcrux_sha3_simd_portable_rotate_left_020(uint64_t x) {
2062   return core_num__u64__rotate_left(x, (uint32_t)(int32_t)41);
2063 }
2064 
2065 /**
2066 A monomorphic instance of libcrux_sha3.simd.portable._vxarq_u64
2067 with const generics
2068 - LEFT= 41
2069 - RIGHT= 23
2070 */
2071 static KRML_MUSTINLINE uint64_t
libcrux_sha3_simd_portable__vxarq_u64_020(uint64_t a,uint64_t b)2072 libcrux_sha3_simd_portable__vxarq_u64_020(uint64_t a, uint64_t b) {
2073   return libcrux_sha3_simd_portable_rotate_left_020(a ^ b);
2074 }
2075 
2076 /**
2077 This function found in impl {libcrux_sha3::traits::KeccakItem<1usize> for u64}
2078 */
2079 /**
2080 A monomorphic instance of libcrux_sha3.simd.portable.xor_and_rotate_d2
2081 with const generics
2082 - LEFT= 41
2083 - RIGHT= 23
2084 */
2085 static KRML_MUSTINLINE uint64_t
libcrux_sha3_simd_portable_xor_and_rotate_d2_020(uint64_t a,uint64_t b)2086 libcrux_sha3_simd_portable_xor_and_rotate_d2_020(uint64_t a, uint64_t b) {
2087   return libcrux_sha3_simd_portable__vxarq_u64_020(a, b);
2088 }
2089 
2090 /**
2091 A monomorphic instance of libcrux_sha3.simd.portable.rotate_left
2092 with const generics
2093 - LEFT= 18
2094 - RIGHT= 46
2095 */
2096 static KRML_MUSTINLINE uint64_t
libcrux_sha3_simd_portable_rotate_left_a9(uint64_t x)2097 libcrux_sha3_simd_portable_rotate_left_a9(uint64_t x) {
2098   return core_num__u64__rotate_left(x, (uint32_t)(int32_t)18);
2099 }
2100 
2101 /**
2102 A monomorphic instance of libcrux_sha3.simd.portable._vxarq_u64
2103 with const generics
2104 - LEFT= 18
2105 - RIGHT= 46
2106 */
2107 static KRML_MUSTINLINE uint64_t
libcrux_sha3_simd_portable__vxarq_u64_a9(uint64_t a,uint64_t b)2108 libcrux_sha3_simd_portable__vxarq_u64_a9(uint64_t a, uint64_t b) {
2109   return libcrux_sha3_simd_portable_rotate_left_a9(a ^ b);
2110 }
2111 
2112 /**
2113 This function found in impl {libcrux_sha3::traits::KeccakItem<1usize> for u64}
2114 */
2115 /**
2116 A monomorphic instance of libcrux_sha3.simd.portable.xor_and_rotate_d2
2117 with const generics
2118 - LEFT= 18
2119 - RIGHT= 46
2120 */
2121 static KRML_MUSTINLINE uint64_t
libcrux_sha3_simd_portable_xor_and_rotate_d2_a9(uint64_t a,uint64_t b)2122 libcrux_sha3_simd_portable_xor_and_rotate_d2_a9(uint64_t a, uint64_t b) {
2123   return libcrux_sha3_simd_portable__vxarq_u64_a9(a, b);
2124 }
2125 
2126 /**
2127 A monomorphic instance of libcrux_sha3.simd.portable._vxarq_u64
2128 with const generics
2129 - LEFT= 1
2130 - RIGHT= 63
2131 */
2132 static KRML_MUSTINLINE uint64_t
libcrux_sha3_simd_portable__vxarq_u64_76(uint64_t a,uint64_t b)2133 libcrux_sha3_simd_portable__vxarq_u64_76(uint64_t a, uint64_t b) {
2134   return libcrux_sha3_simd_portable_rotate_left_76(a ^ b);
2135 }
2136 
2137 /**
2138 This function found in impl {libcrux_sha3::traits::KeccakItem<1usize> for u64}
2139 */
2140 /**
2141 A monomorphic instance of libcrux_sha3.simd.portable.xor_and_rotate_d2
2142 with const generics
2143 - LEFT= 1
2144 - RIGHT= 63
2145 */
2146 static KRML_MUSTINLINE uint64_t
libcrux_sha3_simd_portable_xor_and_rotate_d2_76(uint64_t a,uint64_t b)2147 libcrux_sha3_simd_portable_xor_and_rotate_d2_76(uint64_t a, uint64_t b) {
2148   return libcrux_sha3_simd_portable__vxarq_u64_76(a, b);
2149 }
2150 
2151 /**
2152 A monomorphic instance of libcrux_sha3.simd.portable.rotate_left
2153 with const generics
2154 - LEFT= 44
2155 - RIGHT= 20
2156 */
2157 static KRML_MUSTINLINE uint64_t
libcrux_sha3_simd_portable_rotate_left_58(uint64_t x)2158 libcrux_sha3_simd_portable_rotate_left_58(uint64_t x) {
2159   return core_num__u64__rotate_left(x, (uint32_t)(int32_t)44);
2160 }
2161 
2162 /**
2163 A monomorphic instance of libcrux_sha3.simd.portable._vxarq_u64
2164 with const generics
2165 - LEFT= 44
2166 - RIGHT= 20
2167 */
2168 static KRML_MUSTINLINE uint64_t
libcrux_sha3_simd_portable__vxarq_u64_58(uint64_t a,uint64_t b)2169 libcrux_sha3_simd_portable__vxarq_u64_58(uint64_t a, uint64_t b) {
2170   return libcrux_sha3_simd_portable_rotate_left_58(a ^ b);
2171 }
2172 
2173 /**
2174 This function found in impl {libcrux_sha3::traits::KeccakItem<1usize> for u64}
2175 */
2176 /**
2177 A monomorphic instance of libcrux_sha3.simd.portable.xor_and_rotate_d2
2178 with const generics
2179 - LEFT= 44
2180 - RIGHT= 20
2181 */
2182 static KRML_MUSTINLINE uint64_t
libcrux_sha3_simd_portable_xor_and_rotate_d2_58(uint64_t a,uint64_t b)2183 libcrux_sha3_simd_portable_xor_and_rotate_d2_58(uint64_t a, uint64_t b) {
2184   return libcrux_sha3_simd_portable__vxarq_u64_58(a, b);
2185 }
2186 
2187 /**
2188 A monomorphic instance of libcrux_sha3.simd.portable.rotate_left
2189 with const generics
2190 - LEFT= 10
2191 - RIGHT= 54
2192 */
2193 static KRML_MUSTINLINE uint64_t
libcrux_sha3_simd_portable_rotate_left_e0(uint64_t x)2194 libcrux_sha3_simd_portable_rotate_left_e0(uint64_t x) {
2195   return core_num__u64__rotate_left(x, (uint32_t)(int32_t)10);
2196 }
2197 
2198 /**
2199 A monomorphic instance of libcrux_sha3.simd.portable._vxarq_u64
2200 with const generics
2201 - LEFT= 10
2202 - RIGHT= 54
2203 */
2204 static KRML_MUSTINLINE uint64_t
libcrux_sha3_simd_portable__vxarq_u64_e0(uint64_t a,uint64_t b)2205 libcrux_sha3_simd_portable__vxarq_u64_e0(uint64_t a, uint64_t b) {
2206   return libcrux_sha3_simd_portable_rotate_left_e0(a ^ b);
2207 }
2208 
2209 /**
2210 This function found in impl {libcrux_sha3::traits::KeccakItem<1usize> for u64}
2211 */
2212 /**
2213 A monomorphic instance of libcrux_sha3.simd.portable.xor_and_rotate_d2
2214 with const generics
2215 - LEFT= 10
2216 - RIGHT= 54
2217 */
2218 static KRML_MUSTINLINE uint64_t
libcrux_sha3_simd_portable_xor_and_rotate_d2_e0(uint64_t a,uint64_t b)2219 libcrux_sha3_simd_portable_xor_and_rotate_d2_e0(uint64_t a, uint64_t b) {
2220   return libcrux_sha3_simd_portable__vxarq_u64_e0(a, b);
2221 }
2222 
2223 /**
2224 A monomorphic instance of libcrux_sha3.simd.portable.rotate_left
2225 with const generics
2226 - LEFT= 45
2227 - RIGHT= 19
2228 */
2229 static KRML_MUSTINLINE uint64_t
libcrux_sha3_simd_portable_rotate_left_63(uint64_t x)2230 libcrux_sha3_simd_portable_rotate_left_63(uint64_t x) {
2231   return core_num__u64__rotate_left(x, (uint32_t)(int32_t)45);
2232 }
2233 
2234 /**
2235 A monomorphic instance of libcrux_sha3.simd.portable._vxarq_u64
2236 with const generics
2237 - LEFT= 45
2238 - RIGHT= 19
2239 */
2240 static KRML_MUSTINLINE uint64_t
libcrux_sha3_simd_portable__vxarq_u64_63(uint64_t a,uint64_t b)2241 libcrux_sha3_simd_portable__vxarq_u64_63(uint64_t a, uint64_t b) {
2242   return libcrux_sha3_simd_portable_rotate_left_63(a ^ b);
2243 }
2244 
2245 /**
2246 This function found in impl {libcrux_sha3::traits::KeccakItem<1usize> for u64}
2247 */
2248 /**
2249 A monomorphic instance of libcrux_sha3.simd.portable.xor_and_rotate_d2
2250 with const generics
2251 - LEFT= 45
2252 - RIGHT= 19
2253 */
2254 static KRML_MUSTINLINE uint64_t
libcrux_sha3_simd_portable_xor_and_rotate_d2_63(uint64_t a,uint64_t b)2255 libcrux_sha3_simd_portable_xor_and_rotate_d2_63(uint64_t a, uint64_t b) {
2256   return libcrux_sha3_simd_portable__vxarq_u64_63(a, b);
2257 }
2258 
2259 /**
2260 A monomorphic instance of libcrux_sha3.simd.portable.rotate_left
2261 with const generics
2262 - LEFT= 2
2263 - RIGHT= 62
2264 */
2265 static KRML_MUSTINLINE uint64_t
libcrux_sha3_simd_portable_rotate_left_6a(uint64_t x)2266 libcrux_sha3_simd_portable_rotate_left_6a(uint64_t x) {
2267   return core_num__u64__rotate_left(x, (uint32_t)(int32_t)2);
2268 }
2269 
2270 /**
2271 A monomorphic instance of libcrux_sha3.simd.portable._vxarq_u64
2272 with const generics
2273 - LEFT= 2
2274 - RIGHT= 62
2275 */
2276 static KRML_MUSTINLINE uint64_t
libcrux_sha3_simd_portable__vxarq_u64_6a(uint64_t a,uint64_t b)2277 libcrux_sha3_simd_portable__vxarq_u64_6a(uint64_t a, uint64_t b) {
2278   return libcrux_sha3_simd_portable_rotate_left_6a(a ^ b);
2279 }
2280 
2281 /**
2282 This function found in impl {libcrux_sha3::traits::KeccakItem<1usize> for u64}
2283 */
2284 /**
2285 A monomorphic instance of libcrux_sha3.simd.portable.xor_and_rotate_d2
2286 with const generics
2287 - LEFT= 2
2288 - RIGHT= 62
2289 */
2290 static KRML_MUSTINLINE uint64_t
libcrux_sha3_simd_portable_xor_and_rotate_d2_6a(uint64_t a,uint64_t b)2291 libcrux_sha3_simd_portable_xor_and_rotate_d2_6a(uint64_t a, uint64_t b) {
2292   return libcrux_sha3_simd_portable__vxarq_u64_6a(a, b);
2293 }
2294 
2295 /**
2296 A monomorphic instance of libcrux_sha3.simd.portable.rotate_left
2297 with const generics
2298 - LEFT= 62
2299 - RIGHT= 2
2300 */
2301 static KRML_MUSTINLINE uint64_t
libcrux_sha3_simd_portable_rotate_left_ab(uint64_t x)2302 libcrux_sha3_simd_portable_rotate_left_ab(uint64_t x) {
2303   return core_num__u64__rotate_left(x, (uint32_t)(int32_t)62);
2304 }
2305 
2306 /**
2307 A monomorphic instance of libcrux_sha3.simd.portable._vxarq_u64
2308 with const generics
2309 - LEFT= 62
2310 - RIGHT= 2
2311 */
2312 static KRML_MUSTINLINE uint64_t
libcrux_sha3_simd_portable__vxarq_u64_ab(uint64_t a,uint64_t b)2313 libcrux_sha3_simd_portable__vxarq_u64_ab(uint64_t a, uint64_t b) {
2314   return libcrux_sha3_simd_portable_rotate_left_ab(a ^ b);
2315 }
2316 
2317 /**
2318 This function found in impl {libcrux_sha3::traits::KeccakItem<1usize> for u64}
2319 */
2320 /**
2321 A monomorphic instance of libcrux_sha3.simd.portable.xor_and_rotate_d2
2322 with const generics
2323 - LEFT= 62
2324 - RIGHT= 2
2325 */
2326 static KRML_MUSTINLINE uint64_t
libcrux_sha3_simd_portable_xor_and_rotate_d2_ab(uint64_t a,uint64_t b)2327 libcrux_sha3_simd_portable_xor_and_rotate_d2_ab(uint64_t a, uint64_t b) {
2328   return libcrux_sha3_simd_portable__vxarq_u64_ab(a, b);
2329 }
2330 
2331 /**
2332 A monomorphic instance of libcrux_sha3.simd.portable.rotate_left
2333 with const generics
2334 - LEFT= 6
2335 - RIGHT= 58
2336 */
2337 static KRML_MUSTINLINE uint64_t
libcrux_sha3_simd_portable_rotate_left_5b(uint64_t x)2338 libcrux_sha3_simd_portable_rotate_left_5b(uint64_t x) {
2339   return core_num__u64__rotate_left(x, (uint32_t)(int32_t)6);
2340 }
2341 
2342 /**
2343 A monomorphic instance of libcrux_sha3.simd.portable._vxarq_u64
2344 with const generics
2345 - LEFT= 6
2346 - RIGHT= 58
2347 */
2348 static KRML_MUSTINLINE uint64_t
libcrux_sha3_simd_portable__vxarq_u64_5b(uint64_t a,uint64_t b)2349 libcrux_sha3_simd_portable__vxarq_u64_5b(uint64_t a, uint64_t b) {
2350   return libcrux_sha3_simd_portable_rotate_left_5b(a ^ b);
2351 }
2352 
2353 /**
2354 This function found in impl {libcrux_sha3::traits::KeccakItem<1usize> for u64}
2355 */
2356 /**
2357 A monomorphic instance of libcrux_sha3.simd.portable.xor_and_rotate_d2
2358 with const generics
2359 - LEFT= 6
2360 - RIGHT= 58
2361 */
2362 static KRML_MUSTINLINE uint64_t
libcrux_sha3_simd_portable_xor_and_rotate_d2_5b(uint64_t a,uint64_t b)2363 libcrux_sha3_simd_portable_xor_and_rotate_d2_5b(uint64_t a, uint64_t b) {
2364   return libcrux_sha3_simd_portable__vxarq_u64_5b(a, b);
2365 }
2366 
2367 /**
2368 A monomorphic instance of libcrux_sha3.simd.portable.rotate_left
2369 with const generics
2370 - LEFT= 43
2371 - RIGHT= 21
2372 */
2373 static KRML_MUSTINLINE uint64_t
libcrux_sha3_simd_portable_rotate_left_6f(uint64_t x)2374 libcrux_sha3_simd_portable_rotate_left_6f(uint64_t x) {
2375   return core_num__u64__rotate_left(x, (uint32_t)(int32_t)43);
2376 }
2377 
2378 /**
2379 A monomorphic instance of libcrux_sha3.simd.portable._vxarq_u64
2380 with const generics
2381 - LEFT= 43
2382 - RIGHT= 21
2383 */
2384 static KRML_MUSTINLINE uint64_t
libcrux_sha3_simd_portable__vxarq_u64_6f(uint64_t a,uint64_t b)2385 libcrux_sha3_simd_portable__vxarq_u64_6f(uint64_t a, uint64_t b) {
2386   return libcrux_sha3_simd_portable_rotate_left_6f(a ^ b);
2387 }
2388 
2389 /**
2390 This function found in impl {libcrux_sha3::traits::KeccakItem<1usize> for u64}
2391 */
2392 /**
2393 A monomorphic instance of libcrux_sha3.simd.portable.xor_and_rotate_d2
2394 with const generics
2395 - LEFT= 43
2396 - RIGHT= 21
2397 */
2398 static KRML_MUSTINLINE uint64_t
libcrux_sha3_simd_portable_xor_and_rotate_d2_6f(uint64_t a,uint64_t b)2399 libcrux_sha3_simd_portable_xor_and_rotate_d2_6f(uint64_t a, uint64_t b) {
2400   return libcrux_sha3_simd_portable__vxarq_u64_6f(a, b);
2401 }
2402 
2403 /**
2404 A monomorphic instance of libcrux_sha3.simd.portable.rotate_left
2405 with const generics
2406 - LEFT= 15
2407 - RIGHT= 49
2408 */
2409 static KRML_MUSTINLINE uint64_t
libcrux_sha3_simd_portable_rotate_left_62(uint64_t x)2410 libcrux_sha3_simd_portable_rotate_left_62(uint64_t x) {
2411   return core_num__u64__rotate_left(x, (uint32_t)(int32_t)15);
2412 }
2413 
2414 /**
2415 A monomorphic instance of libcrux_sha3.simd.portable._vxarq_u64
2416 with const generics
2417 - LEFT= 15
2418 - RIGHT= 49
2419 */
2420 static KRML_MUSTINLINE uint64_t
libcrux_sha3_simd_portable__vxarq_u64_62(uint64_t a,uint64_t b)2421 libcrux_sha3_simd_portable__vxarq_u64_62(uint64_t a, uint64_t b) {
2422   return libcrux_sha3_simd_portable_rotate_left_62(a ^ b);
2423 }
2424 
2425 /**
2426 This function found in impl {libcrux_sha3::traits::KeccakItem<1usize> for u64}
2427 */
2428 /**
2429 A monomorphic instance of libcrux_sha3.simd.portable.xor_and_rotate_d2
2430 with const generics
2431 - LEFT= 15
2432 - RIGHT= 49
2433 */
2434 static KRML_MUSTINLINE uint64_t
libcrux_sha3_simd_portable_xor_and_rotate_d2_62(uint64_t a,uint64_t b)2435 libcrux_sha3_simd_portable_xor_and_rotate_d2_62(uint64_t a, uint64_t b) {
2436   return libcrux_sha3_simd_portable__vxarq_u64_62(a, b);
2437 }
2438 
2439 /**
2440 A monomorphic instance of libcrux_sha3.simd.portable.rotate_left
2441 with const generics
2442 - LEFT= 61
2443 - RIGHT= 3
2444 */
2445 static KRML_MUSTINLINE uint64_t
libcrux_sha3_simd_portable_rotate_left_23(uint64_t x)2446 libcrux_sha3_simd_portable_rotate_left_23(uint64_t x) {
2447   return core_num__u64__rotate_left(x, (uint32_t)(int32_t)61);
2448 }
2449 
2450 /**
2451 A monomorphic instance of libcrux_sha3.simd.portable._vxarq_u64
2452 with const generics
2453 - LEFT= 61
2454 - RIGHT= 3
2455 */
2456 static KRML_MUSTINLINE uint64_t
libcrux_sha3_simd_portable__vxarq_u64_23(uint64_t a,uint64_t b)2457 libcrux_sha3_simd_portable__vxarq_u64_23(uint64_t a, uint64_t b) {
2458   return libcrux_sha3_simd_portable_rotate_left_23(a ^ b);
2459 }
2460 
2461 /**
2462 This function found in impl {libcrux_sha3::traits::KeccakItem<1usize> for u64}
2463 */
2464 /**
2465 A monomorphic instance of libcrux_sha3.simd.portable.xor_and_rotate_d2
2466 with const generics
2467 - LEFT= 61
2468 - RIGHT= 3
2469 */
2470 static KRML_MUSTINLINE uint64_t
libcrux_sha3_simd_portable_xor_and_rotate_d2_23(uint64_t a,uint64_t b)2471 libcrux_sha3_simd_portable_xor_and_rotate_d2_23(uint64_t a, uint64_t b) {
2472   return libcrux_sha3_simd_portable__vxarq_u64_23(a, b);
2473 }
2474 
2475 /**
2476 A monomorphic instance of libcrux_sha3.simd.portable.rotate_left
2477 with const generics
2478 - LEFT= 28
2479 - RIGHT= 36
2480 */
2481 static KRML_MUSTINLINE uint64_t
libcrux_sha3_simd_portable_rotate_left_37(uint64_t x)2482 libcrux_sha3_simd_portable_rotate_left_37(uint64_t x) {
2483   return core_num__u64__rotate_left(x, (uint32_t)(int32_t)28);
2484 }
2485 
2486 /**
2487 A monomorphic instance of libcrux_sha3.simd.portable._vxarq_u64
2488 with const generics
2489 - LEFT= 28
2490 - RIGHT= 36
2491 */
2492 static KRML_MUSTINLINE uint64_t
libcrux_sha3_simd_portable__vxarq_u64_37(uint64_t a,uint64_t b)2493 libcrux_sha3_simd_portable__vxarq_u64_37(uint64_t a, uint64_t b) {
2494   return libcrux_sha3_simd_portable_rotate_left_37(a ^ b);
2495 }
2496 
2497 /**
2498 This function found in impl {libcrux_sha3::traits::KeccakItem<1usize> for u64}
2499 */
2500 /**
2501 A monomorphic instance of libcrux_sha3.simd.portable.xor_and_rotate_d2
2502 with const generics
2503 - LEFT= 28
2504 - RIGHT= 36
2505 */
2506 static KRML_MUSTINLINE uint64_t
libcrux_sha3_simd_portable_xor_and_rotate_d2_37(uint64_t a,uint64_t b)2507 libcrux_sha3_simd_portable_xor_and_rotate_d2_37(uint64_t a, uint64_t b) {
2508   return libcrux_sha3_simd_portable__vxarq_u64_37(a, b);
2509 }
2510 
2511 /**
2512 A monomorphic instance of libcrux_sha3.simd.portable.rotate_left
2513 with const generics
2514 - LEFT= 55
2515 - RIGHT= 9
2516 */
2517 static KRML_MUSTINLINE uint64_t
libcrux_sha3_simd_portable_rotate_left_bb(uint64_t x)2518 libcrux_sha3_simd_portable_rotate_left_bb(uint64_t x) {
2519   return core_num__u64__rotate_left(x, (uint32_t)(int32_t)55);
2520 }
2521 
2522 /**
2523 A monomorphic instance of libcrux_sha3.simd.portable._vxarq_u64
2524 with const generics
2525 - LEFT= 55
2526 - RIGHT= 9
2527 */
2528 static KRML_MUSTINLINE uint64_t
libcrux_sha3_simd_portable__vxarq_u64_bb(uint64_t a,uint64_t b)2529 libcrux_sha3_simd_portable__vxarq_u64_bb(uint64_t a, uint64_t b) {
2530   return libcrux_sha3_simd_portable_rotate_left_bb(a ^ b);
2531 }
2532 
2533 /**
2534 This function found in impl {libcrux_sha3::traits::KeccakItem<1usize> for u64}
2535 */
2536 /**
2537 A monomorphic instance of libcrux_sha3.simd.portable.xor_and_rotate_d2
2538 with const generics
2539 - LEFT= 55
2540 - RIGHT= 9
2541 */
2542 static KRML_MUSTINLINE uint64_t
libcrux_sha3_simd_portable_xor_and_rotate_d2_bb(uint64_t a,uint64_t b)2543 libcrux_sha3_simd_portable_xor_and_rotate_d2_bb(uint64_t a, uint64_t b) {
2544   return libcrux_sha3_simd_portable__vxarq_u64_bb(a, b);
2545 }
2546 
2547 /**
2548 A monomorphic instance of libcrux_sha3.simd.portable.rotate_left
2549 with const generics
2550 - LEFT= 25
2551 - RIGHT= 39
2552 */
2553 static KRML_MUSTINLINE uint64_t
libcrux_sha3_simd_portable_rotate_left_b9(uint64_t x)2554 libcrux_sha3_simd_portable_rotate_left_b9(uint64_t x) {
2555   return core_num__u64__rotate_left(x, (uint32_t)(int32_t)25);
2556 }
2557 
2558 /**
2559 A monomorphic instance of libcrux_sha3.simd.portable._vxarq_u64
2560 with const generics
2561 - LEFT= 25
2562 - RIGHT= 39
2563 */
2564 static KRML_MUSTINLINE uint64_t
libcrux_sha3_simd_portable__vxarq_u64_b9(uint64_t a,uint64_t b)2565 libcrux_sha3_simd_portable__vxarq_u64_b9(uint64_t a, uint64_t b) {
2566   return libcrux_sha3_simd_portable_rotate_left_b9(a ^ b);
2567 }
2568 
2569 /**
2570 This function found in impl {libcrux_sha3::traits::KeccakItem<1usize> for u64}
2571 */
2572 /**
2573 A monomorphic instance of libcrux_sha3.simd.portable.xor_and_rotate_d2
2574 with const generics
2575 - LEFT= 25
2576 - RIGHT= 39
2577 */
2578 static KRML_MUSTINLINE uint64_t
libcrux_sha3_simd_portable_xor_and_rotate_d2_b9(uint64_t a,uint64_t b)2579 libcrux_sha3_simd_portable_xor_and_rotate_d2_b9(uint64_t a, uint64_t b) {
2580   return libcrux_sha3_simd_portable__vxarq_u64_b9(a, b);
2581 }
2582 
2583 /**
2584 A monomorphic instance of libcrux_sha3.simd.portable.rotate_left
2585 with const generics
2586 - LEFT= 21
2587 - RIGHT= 43
2588 */
2589 static KRML_MUSTINLINE uint64_t
libcrux_sha3_simd_portable_rotate_left_54(uint64_t x)2590 libcrux_sha3_simd_portable_rotate_left_54(uint64_t x) {
2591   return core_num__u64__rotate_left(x, (uint32_t)(int32_t)21);
2592 }
2593 
2594 /**
2595 A monomorphic instance of libcrux_sha3.simd.portable._vxarq_u64
2596 with const generics
2597 - LEFT= 21
2598 - RIGHT= 43
2599 */
2600 static KRML_MUSTINLINE uint64_t
libcrux_sha3_simd_portable__vxarq_u64_54(uint64_t a,uint64_t b)2601 libcrux_sha3_simd_portable__vxarq_u64_54(uint64_t a, uint64_t b) {
2602   return libcrux_sha3_simd_portable_rotate_left_54(a ^ b);
2603 }
2604 
2605 /**
2606 This function found in impl {libcrux_sha3::traits::KeccakItem<1usize> for u64}
2607 */
2608 /**
2609 A monomorphic instance of libcrux_sha3.simd.portable.xor_and_rotate_d2
2610 with const generics
2611 - LEFT= 21
2612 - RIGHT= 43
2613 */
2614 static KRML_MUSTINLINE uint64_t
libcrux_sha3_simd_portable_xor_and_rotate_d2_54(uint64_t a,uint64_t b)2615 libcrux_sha3_simd_portable_xor_and_rotate_d2_54(uint64_t a, uint64_t b) {
2616   return libcrux_sha3_simd_portable__vxarq_u64_54(a, b);
2617 }
2618 
2619 /**
2620 A monomorphic instance of libcrux_sha3.simd.portable.rotate_left
2621 with const generics
2622 - LEFT= 56
2623 - RIGHT= 8
2624 */
2625 static KRML_MUSTINLINE uint64_t
libcrux_sha3_simd_portable_rotate_left_4c(uint64_t x)2626 libcrux_sha3_simd_portable_rotate_left_4c(uint64_t x) {
2627   return core_num__u64__rotate_left(x, (uint32_t)(int32_t)56);
2628 }
2629 
2630 /**
2631 A monomorphic instance of libcrux_sha3.simd.portable._vxarq_u64
2632 with const generics
2633 - LEFT= 56
2634 - RIGHT= 8
2635 */
2636 static KRML_MUSTINLINE uint64_t
libcrux_sha3_simd_portable__vxarq_u64_4c(uint64_t a,uint64_t b)2637 libcrux_sha3_simd_portable__vxarq_u64_4c(uint64_t a, uint64_t b) {
2638   return libcrux_sha3_simd_portable_rotate_left_4c(a ^ b);
2639 }
2640 
2641 /**
2642 This function found in impl {libcrux_sha3::traits::KeccakItem<1usize> for u64}
2643 */
2644 /**
2645 A monomorphic instance of libcrux_sha3.simd.portable.xor_and_rotate_d2
2646 with const generics
2647 - LEFT= 56
2648 - RIGHT= 8
2649 */
2650 static KRML_MUSTINLINE uint64_t
libcrux_sha3_simd_portable_xor_and_rotate_d2_4c(uint64_t a,uint64_t b)2651 libcrux_sha3_simd_portable_xor_and_rotate_d2_4c(uint64_t a, uint64_t b) {
2652   return libcrux_sha3_simd_portable__vxarq_u64_4c(a, b);
2653 }
2654 
2655 /**
2656 A monomorphic instance of libcrux_sha3.simd.portable.rotate_left
2657 with const generics
2658 - LEFT= 27
2659 - RIGHT= 37
2660 */
2661 static KRML_MUSTINLINE uint64_t
libcrux_sha3_simd_portable_rotate_left_ce(uint64_t x)2662 libcrux_sha3_simd_portable_rotate_left_ce(uint64_t x) {
2663   return core_num__u64__rotate_left(x, (uint32_t)(int32_t)27);
2664 }
2665 
2666 /**
2667 A monomorphic instance of libcrux_sha3.simd.portable._vxarq_u64
2668 with const generics
2669 - LEFT= 27
2670 - RIGHT= 37
2671 */
2672 static KRML_MUSTINLINE uint64_t
libcrux_sha3_simd_portable__vxarq_u64_ce(uint64_t a,uint64_t b)2673 libcrux_sha3_simd_portable__vxarq_u64_ce(uint64_t a, uint64_t b) {
2674   return libcrux_sha3_simd_portable_rotate_left_ce(a ^ b);
2675 }
2676 
2677 /**
2678 This function found in impl {libcrux_sha3::traits::KeccakItem<1usize> for u64}
2679 */
2680 /**
2681 A monomorphic instance of libcrux_sha3.simd.portable.xor_and_rotate_d2
2682 with const generics
2683 - LEFT= 27
2684 - RIGHT= 37
2685 */
2686 static KRML_MUSTINLINE uint64_t
libcrux_sha3_simd_portable_xor_and_rotate_d2_ce(uint64_t a,uint64_t b)2687 libcrux_sha3_simd_portable_xor_and_rotate_d2_ce(uint64_t a, uint64_t b) {
2688   return libcrux_sha3_simd_portable__vxarq_u64_ce(a, b);
2689 }
2690 
2691 /**
2692 A monomorphic instance of libcrux_sha3.simd.portable.rotate_left
2693 with const generics
2694 - LEFT= 20
2695 - RIGHT= 44
2696 */
2697 static KRML_MUSTINLINE uint64_t
libcrux_sha3_simd_portable_rotate_left_77(uint64_t x)2698 libcrux_sha3_simd_portable_rotate_left_77(uint64_t x) {
2699   return core_num__u64__rotate_left(x, (uint32_t)(int32_t)20);
2700 }
2701 
2702 /**
2703 A monomorphic instance of libcrux_sha3.simd.portable._vxarq_u64
2704 with const generics
2705 - LEFT= 20
2706 - RIGHT= 44
2707 */
2708 static KRML_MUSTINLINE uint64_t
libcrux_sha3_simd_portable__vxarq_u64_77(uint64_t a,uint64_t b)2709 libcrux_sha3_simd_portable__vxarq_u64_77(uint64_t a, uint64_t b) {
2710   return libcrux_sha3_simd_portable_rotate_left_77(a ^ b);
2711 }
2712 
2713 /**
2714 This function found in impl {libcrux_sha3::traits::KeccakItem<1usize> for u64}
2715 */
2716 /**
2717 A monomorphic instance of libcrux_sha3.simd.portable.xor_and_rotate_d2
2718 with const generics
2719 - LEFT= 20
2720 - RIGHT= 44
2721 */
2722 static KRML_MUSTINLINE uint64_t
libcrux_sha3_simd_portable_xor_and_rotate_d2_77(uint64_t a,uint64_t b)2723 libcrux_sha3_simd_portable_xor_and_rotate_d2_77(uint64_t a, uint64_t b) {
2724   return libcrux_sha3_simd_portable__vxarq_u64_77(a, b);
2725 }
2726 
2727 /**
2728 A monomorphic instance of libcrux_sha3.simd.portable.rotate_left
2729 with const generics
2730 - LEFT= 39
2731 - RIGHT= 25
2732 */
2733 static KRML_MUSTINLINE uint64_t
libcrux_sha3_simd_portable_rotate_left_25(uint64_t x)2734 libcrux_sha3_simd_portable_rotate_left_25(uint64_t x) {
2735   return core_num__u64__rotate_left(x, (uint32_t)(int32_t)39);
2736 }
2737 
2738 /**
2739 A monomorphic instance of libcrux_sha3.simd.portable._vxarq_u64
2740 with const generics
2741 - LEFT= 39
2742 - RIGHT= 25
2743 */
2744 static KRML_MUSTINLINE uint64_t
libcrux_sha3_simd_portable__vxarq_u64_25(uint64_t a,uint64_t b)2745 libcrux_sha3_simd_portable__vxarq_u64_25(uint64_t a, uint64_t b) {
2746   return libcrux_sha3_simd_portable_rotate_left_25(a ^ b);
2747 }
2748 
2749 /**
2750 This function found in impl {libcrux_sha3::traits::KeccakItem<1usize> for u64}
2751 */
2752 /**
2753 A monomorphic instance of libcrux_sha3.simd.portable.xor_and_rotate_d2
2754 with const generics
2755 - LEFT= 39
2756 - RIGHT= 25
2757 */
2758 static KRML_MUSTINLINE uint64_t
libcrux_sha3_simd_portable_xor_and_rotate_d2_25(uint64_t a,uint64_t b)2759 libcrux_sha3_simd_portable_xor_and_rotate_d2_25(uint64_t a, uint64_t b) {
2760   return libcrux_sha3_simd_portable__vxarq_u64_25(a, b);
2761 }
2762 
2763 /**
2764 A monomorphic instance of libcrux_sha3.simd.portable.rotate_left
2765 with const generics
2766 - LEFT= 8
2767 - RIGHT= 56
2768 */
2769 static KRML_MUSTINLINE uint64_t
libcrux_sha3_simd_portable_rotate_left_af(uint64_t x)2770 libcrux_sha3_simd_portable_rotate_left_af(uint64_t x) {
2771   return core_num__u64__rotate_left(x, (uint32_t)(int32_t)8);
2772 }
2773 
2774 /**
2775 A monomorphic instance of libcrux_sha3.simd.portable._vxarq_u64
2776 with const generics
2777 - LEFT= 8
2778 - RIGHT= 56
2779 */
2780 static KRML_MUSTINLINE uint64_t
libcrux_sha3_simd_portable__vxarq_u64_af(uint64_t a,uint64_t b)2781 libcrux_sha3_simd_portable__vxarq_u64_af(uint64_t a, uint64_t b) {
2782   return libcrux_sha3_simd_portable_rotate_left_af(a ^ b);
2783 }
2784 
2785 /**
2786 This function found in impl {libcrux_sha3::traits::KeccakItem<1usize> for u64}
2787 */
2788 /**
2789 A monomorphic instance of libcrux_sha3.simd.portable.xor_and_rotate_d2
2790 with const generics
2791 - LEFT= 8
2792 - RIGHT= 56
2793 */
2794 static KRML_MUSTINLINE uint64_t
libcrux_sha3_simd_portable_xor_and_rotate_d2_af(uint64_t a,uint64_t b)2795 libcrux_sha3_simd_portable_xor_and_rotate_d2_af(uint64_t a, uint64_t b) {
2796   return libcrux_sha3_simd_portable__vxarq_u64_af(a, b);
2797 }
2798 
2799 /**
2800 A monomorphic instance of libcrux_sha3.simd.portable.rotate_left
2801 with const generics
2802 - LEFT= 14
2803 - RIGHT= 50
2804 */
2805 static KRML_MUSTINLINE uint64_t
libcrux_sha3_simd_portable_rotate_left_fd(uint64_t x)2806 libcrux_sha3_simd_portable_rotate_left_fd(uint64_t x) {
2807   return core_num__u64__rotate_left(x, (uint32_t)(int32_t)14);
2808 }
2809 
2810 /**
2811 A monomorphic instance of libcrux_sha3.simd.portable._vxarq_u64
2812 with const generics
2813 - LEFT= 14
2814 - RIGHT= 50
2815 */
2816 static KRML_MUSTINLINE uint64_t
libcrux_sha3_simd_portable__vxarq_u64_fd(uint64_t a,uint64_t b)2817 libcrux_sha3_simd_portable__vxarq_u64_fd(uint64_t a, uint64_t b) {
2818   return libcrux_sha3_simd_portable_rotate_left_fd(a ^ b);
2819 }
2820 
2821 /**
2822 This function found in impl {libcrux_sha3::traits::KeccakItem<1usize> for u64}
2823 */
2824 /**
2825 A monomorphic instance of libcrux_sha3.simd.portable.xor_and_rotate_d2
2826 with const generics
2827 - LEFT= 14
2828 - RIGHT= 50
2829 */
2830 static KRML_MUSTINLINE uint64_t
libcrux_sha3_simd_portable_xor_and_rotate_d2_fd(uint64_t a,uint64_t b)2831 libcrux_sha3_simd_portable_xor_and_rotate_d2_fd(uint64_t a, uint64_t b) {
2832   return libcrux_sha3_simd_portable__vxarq_u64_fd(a, b);
2833 }
2834 
2835 /**
2836 This function found in impl {libcrux_sha3::generic_keccak::KeccakState<T,
2837 N>[TraitClause@0, TraitClause@1]}
2838 */
2839 /**
2840 A monomorphic instance of libcrux_sha3.generic_keccak.rho_80
2841 with types uint64_t
2842 with const generics
2843 - N= 1
2844 */
libcrux_sha3_generic_keccak_rho_80_04(libcrux_sha3_generic_keccak_KeccakState_17 * self,uint64_t t[5U])2845 static KRML_MUSTINLINE void libcrux_sha3_generic_keccak_rho_80_04(
2846     libcrux_sha3_generic_keccak_KeccakState_17 *self, uint64_t t[5U]) {
2847   libcrux_sha3_generic_keccak_set_80_04(
2848       self, (size_t)0U, (size_t)0U,
2849       libcrux_sha3_simd_portable_xor_d2(
2850           libcrux_sha3_generic_keccak_index_c2_04(
2851               self, (KRML_CLITERAL(size_t_x2){.fst = (size_t)0U,
2852                                               .snd = (size_t)0U}))[0U],
2853           t[0U]));
2854   libcrux_sha3_generic_keccak_KeccakState_17 *uu____0 = self;
2855   libcrux_sha3_generic_keccak_set_80_04(
2856       uu____0, (size_t)1U, (size_t)0U,
2857       libcrux_sha3_simd_portable_xor_and_rotate_d2_02(
2858           libcrux_sha3_generic_keccak_index_c2_04(
2859               self, (KRML_CLITERAL(size_t_x2){.fst = (size_t)1U,
2860                                               .snd = (size_t)0U}))[0U],
2861           t[0U]));
2862   libcrux_sha3_generic_keccak_KeccakState_17 *uu____1 = self;
2863   libcrux_sha3_generic_keccak_set_80_04(
2864       uu____1, (size_t)2U, (size_t)0U,
2865       libcrux_sha3_simd_portable_xor_and_rotate_d2_ac(
2866           libcrux_sha3_generic_keccak_index_c2_04(
2867               self, (KRML_CLITERAL(size_t_x2){.fst = (size_t)2U,
2868                                               .snd = (size_t)0U}))[0U],
2869           t[0U]));
2870   libcrux_sha3_generic_keccak_KeccakState_17 *uu____2 = self;
2871   libcrux_sha3_generic_keccak_set_80_04(
2872       uu____2, (size_t)3U, (size_t)0U,
2873       libcrux_sha3_simd_portable_xor_and_rotate_d2_020(
2874           libcrux_sha3_generic_keccak_index_c2_04(
2875               self, (KRML_CLITERAL(size_t_x2){.fst = (size_t)3U,
2876                                               .snd = (size_t)0U}))[0U],
2877           t[0U]));
2878   libcrux_sha3_generic_keccak_KeccakState_17 *uu____3 = self;
2879   libcrux_sha3_generic_keccak_set_80_04(
2880       uu____3, (size_t)4U, (size_t)0U,
2881       libcrux_sha3_simd_portable_xor_and_rotate_d2_a9(
2882           libcrux_sha3_generic_keccak_index_c2_04(
2883               self, (KRML_CLITERAL(size_t_x2){.fst = (size_t)4U,
2884                                               .snd = (size_t)0U}))[0U],
2885           t[0U]));
2886   libcrux_sha3_generic_keccak_KeccakState_17 *uu____4 = self;
2887   libcrux_sha3_generic_keccak_set_80_04(
2888       uu____4, (size_t)0U, (size_t)1U,
2889       libcrux_sha3_simd_portable_xor_and_rotate_d2_76(
2890           libcrux_sha3_generic_keccak_index_c2_04(
2891               self, (KRML_CLITERAL(size_t_x2){.fst = (size_t)0U,
2892                                               .snd = (size_t)1U}))[0U],
2893           t[1U]));
2894   libcrux_sha3_generic_keccak_KeccakState_17 *uu____5 = self;
2895   libcrux_sha3_generic_keccak_set_80_04(
2896       uu____5, (size_t)1U, (size_t)1U,
2897       libcrux_sha3_simd_portable_xor_and_rotate_d2_58(
2898           libcrux_sha3_generic_keccak_index_c2_04(
2899               self, (KRML_CLITERAL(size_t_x2){.fst = (size_t)1U,
2900                                               .snd = (size_t)1U}))[0U],
2901           t[1U]));
2902   libcrux_sha3_generic_keccak_KeccakState_17 *uu____6 = self;
2903   libcrux_sha3_generic_keccak_set_80_04(
2904       uu____6, (size_t)2U, (size_t)1U,
2905       libcrux_sha3_simd_portable_xor_and_rotate_d2_e0(
2906           libcrux_sha3_generic_keccak_index_c2_04(
2907               self, (KRML_CLITERAL(size_t_x2){.fst = (size_t)2U,
2908                                               .snd = (size_t)1U}))[0U],
2909           t[1U]));
2910   libcrux_sha3_generic_keccak_KeccakState_17 *uu____7 = self;
2911   libcrux_sha3_generic_keccak_set_80_04(
2912       uu____7, (size_t)3U, (size_t)1U,
2913       libcrux_sha3_simd_portable_xor_and_rotate_d2_63(
2914           libcrux_sha3_generic_keccak_index_c2_04(
2915               self, (KRML_CLITERAL(size_t_x2){.fst = (size_t)3U,
2916                                               .snd = (size_t)1U}))[0U],
2917           t[1U]));
2918   libcrux_sha3_generic_keccak_KeccakState_17 *uu____8 = self;
2919   libcrux_sha3_generic_keccak_set_80_04(
2920       uu____8, (size_t)4U, (size_t)1U,
2921       libcrux_sha3_simd_portable_xor_and_rotate_d2_6a(
2922           libcrux_sha3_generic_keccak_index_c2_04(
2923               self, (KRML_CLITERAL(size_t_x2){.fst = (size_t)4U,
2924                                               .snd = (size_t)1U}))[0U],
2925           t[1U]));
2926   libcrux_sha3_generic_keccak_KeccakState_17 *uu____9 = self;
2927   libcrux_sha3_generic_keccak_set_80_04(
2928       uu____9, (size_t)0U, (size_t)2U,
2929       libcrux_sha3_simd_portable_xor_and_rotate_d2_ab(
2930           libcrux_sha3_generic_keccak_index_c2_04(
2931               self, (KRML_CLITERAL(size_t_x2){.fst = (size_t)0U,
2932                                               .snd = (size_t)2U}))[0U],
2933           t[2U]));
2934   libcrux_sha3_generic_keccak_KeccakState_17 *uu____10 = self;
2935   libcrux_sha3_generic_keccak_set_80_04(
2936       uu____10, (size_t)1U, (size_t)2U,
2937       libcrux_sha3_simd_portable_xor_and_rotate_d2_5b(
2938           libcrux_sha3_generic_keccak_index_c2_04(
2939               self, (KRML_CLITERAL(size_t_x2){.fst = (size_t)1U,
2940                                               .snd = (size_t)2U}))[0U],
2941           t[2U]));
2942   libcrux_sha3_generic_keccak_KeccakState_17 *uu____11 = self;
2943   libcrux_sha3_generic_keccak_set_80_04(
2944       uu____11, (size_t)2U, (size_t)2U,
2945       libcrux_sha3_simd_portable_xor_and_rotate_d2_6f(
2946           libcrux_sha3_generic_keccak_index_c2_04(
2947               self, (KRML_CLITERAL(size_t_x2){.fst = (size_t)2U,
2948                                               .snd = (size_t)2U}))[0U],
2949           t[2U]));
2950   libcrux_sha3_generic_keccak_KeccakState_17 *uu____12 = self;
2951   libcrux_sha3_generic_keccak_set_80_04(
2952       uu____12, (size_t)3U, (size_t)2U,
2953       libcrux_sha3_simd_portable_xor_and_rotate_d2_62(
2954           libcrux_sha3_generic_keccak_index_c2_04(
2955               self, (KRML_CLITERAL(size_t_x2){.fst = (size_t)3U,
2956                                               .snd = (size_t)2U}))[0U],
2957           t[2U]));
2958   libcrux_sha3_generic_keccak_KeccakState_17 *uu____13 = self;
2959   libcrux_sha3_generic_keccak_set_80_04(
2960       uu____13, (size_t)4U, (size_t)2U,
2961       libcrux_sha3_simd_portable_xor_and_rotate_d2_23(
2962           libcrux_sha3_generic_keccak_index_c2_04(
2963               self, (KRML_CLITERAL(size_t_x2){.fst = (size_t)4U,
2964                                               .snd = (size_t)2U}))[0U],
2965           t[2U]));
2966   libcrux_sha3_generic_keccak_KeccakState_17 *uu____14 = self;
2967   libcrux_sha3_generic_keccak_set_80_04(
2968       uu____14, (size_t)0U, (size_t)3U,
2969       libcrux_sha3_simd_portable_xor_and_rotate_d2_37(
2970           libcrux_sha3_generic_keccak_index_c2_04(
2971               self, (KRML_CLITERAL(size_t_x2){.fst = (size_t)0U,
2972                                               .snd = (size_t)3U}))[0U],
2973           t[3U]));
2974   libcrux_sha3_generic_keccak_KeccakState_17 *uu____15 = self;
2975   libcrux_sha3_generic_keccak_set_80_04(
2976       uu____15, (size_t)1U, (size_t)3U,
2977       libcrux_sha3_simd_portable_xor_and_rotate_d2_bb(
2978           libcrux_sha3_generic_keccak_index_c2_04(
2979               self, (KRML_CLITERAL(size_t_x2){.fst = (size_t)1U,
2980                                               .snd = (size_t)3U}))[0U],
2981           t[3U]));
2982   libcrux_sha3_generic_keccak_KeccakState_17 *uu____16 = self;
2983   libcrux_sha3_generic_keccak_set_80_04(
2984       uu____16, (size_t)2U, (size_t)3U,
2985       libcrux_sha3_simd_portable_xor_and_rotate_d2_b9(
2986           libcrux_sha3_generic_keccak_index_c2_04(
2987               self, (KRML_CLITERAL(size_t_x2){.fst = (size_t)2U,
2988                                               .snd = (size_t)3U}))[0U],
2989           t[3U]));
2990   libcrux_sha3_generic_keccak_KeccakState_17 *uu____17 = self;
2991   libcrux_sha3_generic_keccak_set_80_04(
2992       uu____17, (size_t)3U, (size_t)3U,
2993       libcrux_sha3_simd_portable_xor_and_rotate_d2_54(
2994           libcrux_sha3_generic_keccak_index_c2_04(
2995               self, (KRML_CLITERAL(size_t_x2){.fst = (size_t)3U,
2996                                               .snd = (size_t)3U}))[0U],
2997           t[3U]));
2998   libcrux_sha3_generic_keccak_KeccakState_17 *uu____18 = self;
2999   libcrux_sha3_generic_keccak_set_80_04(
3000       uu____18, (size_t)4U, (size_t)3U,
3001       libcrux_sha3_simd_portable_xor_and_rotate_d2_4c(
3002           libcrux_sha3_generic_keccak_index_c2_04(
3003               self, (KRML_CLITERAL(size_t_x2){.fst = (size_t)4U,
3004                                               .snd = (size_t)3U}))[0U],
3005           t[3U]));
3006   libcrux_sha3_generic_keccak_KeccakState_17 *uu____19 = self;
3007   libcrux_sha3_generic_keccak_set_80_04(
3008       uu____19, (size_t)0U, (size_t)4U,
3009       libcrux_sha3_simd_portable_xor_and_rotate_d2_ce(
3010           libcrux_sha3_generic_keccak_index_c2_04(
3011               self, (KRML_CLITERAL(size_t_x2){.fst = (size_t)0U,
3012                                               .snd = (size_t)4U}))[0U],
3013           t[4U]));
3014   libcrux_sha3_generic_keccak_KeccakState_17 *uu____20 = self;
3015   libcrux_sha3_generic_keccak_set_80_04(
3016       uu____20, (size_t)1U, (size_t)4U,
3017       libcrux_sha3_simd_portable_xor_and_rotate_d2_77(
3018           libcrux_sha3_generic_keccak_index_c2_04(
3019               self, (KRML_CLITERAL(size_t_x2){.fst = (size_t)1U,
3020                                               .snd = (size_t)4U}))[0U],
3021           t[4U]));
3022   libcrux_sha3_generic_keccak_KeccakState_17 *uu____21 = self;
3023   libcrux_sha3_generic_keccak_set_80_04(
3024       uu____21, (size_t)2U, (size_t)4U,
3025       libcrux_sha3_simd_portable_xor_and_rotate_d2_25(
3026           libcrux_sha3_generic_keccak_index_c2_04(
3027               self, (KRML_CLITERAL(size_t_x2){.fst = (size_t)2U,
3028                                               .snd = (size_t)4U}))[0U],
3029           t[4U]));
3030   libcrux_sha3_generic_keccak_KeccakState_17 *uu____22 = self;
3031   libcrux_sha3_generic_keccak_set_80_04(
3032       uu____22, (size_t)3U, (size_t)4U,
3033       libcrux_sha3_simd_portable_xor_and_rotate_d2_af(
3034           libcrux_sha3_generic_keccak_index_c2_04(
3035               self, (KRML_CLITERAL(size_t_x2){.fst = (size_t)3U,
3036                                               .snd = (size_t)4U}))[0U],
3037           t[4U]));
3038   libcrux_sha3_generic_keccak_KeccakState_17 *uu____23 = self;
3039   libcrux_sha3_generic_keccak_set_80_04(
3040       uu____23, (size_t)4U, (size_t)4U,
3041       libcrux_sha3_simd_portable_xor_and_rotate_d2_fd(
3042           libcrux_sha3_generic_keccak_index_c2_04(
3043               self, (KRML_CLITERAL(size_t_x2){.fst = (size_t)4U,
3044                                               .snd = (size_t)4U}))[0U],
3045           t[4U]));
3046 }
3047 
3048 /**
3049 This function found in impl {libcrux_sha3::generic_keccak::KeccakState<T,
3050 N>[TraitClause@0, TraitClause@1]}
3051 */
3052 /**
3053 A monomorphic instance of libcrux_sha3.generic_keccak.pi_80
3054 with types uint64_t
3055 with const generics
3056 - N= 1
3057 */
libcrux_sha3_generic_keccak_pi_80_04(libcrux_sha3_generic_keccak_KeccakState_17 * self)3058 static KRML_MUSTINLINE void libcrux_sha3_generic_keccak_pi_80_04(
3059     libcrux_sha3_generic_keccak_KeccakState_17 *self) {
3060   libcrux_sha3_generic_keccak_KeccakState_17 old = self[0U];
3061   libcrux_sha3_generic_keccak_set_80_04(
3062       self, (size_t)1U, (size_t)0U,
3063       libcrux_sha3_generic_keccak_index_c2_04(
3064           &old, (KRML_CLITERAL(size_t_x2){.fst = (size_t)0U,
3065                                           .snd = (size_t)3U}))[0U]);
3066   libcrux_sha3_generic_keccak_set_80_04(
3067       self, (size_t)2U, (size_t)0U,
3068       libcrux_sha3_generic_keccak_index_c2_04(
3069           &old, (KRML_CLITERAL(size_t_x2){.fst = (size_t)0U,
3070                                           .snd = (size_t)1U}))[0U]);
3071   libcrux_sha3_generic_keccak_set_80_04(
3072       self, (size_t)3U, (size_t)0U,
3073       libcrux_sha3_generic_keccak_index_c2_04(
3074           &old, (KRML_CLITERAL(size_t_x2){.fst = (size_t)0U,
3075                                           .snd = (size_t)4U}))[0U]);
3076   libcrux_sha3_generic_keccak_set_80_04(
3077       self, (size_t)4U, (size_t)0U,
3078       libcrux_sha3_generic_keccak_index_c2_04(
3079           &old, (KRML_CLITERAL(size_t_x2){.fst = (size_t)0U,
3080                                           .snd = (size_t)2U}))[0U]);
3081   libcrux_sha3_generic_keccak_set_80_04(
3082       self, (size_t)0U, (size_t)1U,
3083       libcrux_sha3_generic_keccak_index_c2_04(
3084           &old, (KRML_CLITERAL(size_t_x2){.fst = (size_t)1U,
3085                                           .snd = (size_t)1U}))[0U]);
3086   libcrux_sha3_generic_keccak_set_80_04(
3087       self, (size_t)1U, (size_t)1U,
3088       libcrux_sha3_generic_keccak_index_c2_04(
3089           &old, (KRML_CLITERAL(size_t_x2){.fst = (size_t)1U,
3090                                           .snd = (size_t)4U}))[0U]);
3091   libcrux_sha3_generic_keccak_set_80_04(
3092       self, (size_t)2U, (size_t)1U,
3093       libcrux_sha3_generic_keccak_index_c2_04(
3094           &old, (KRML_CLITERAL(size_t_x2){.fst = (size_t)1U,
3095                                           .snd = (size_t)2U}))[0U]);
3096   libcrux_sha3_generic_keccak_set_80_04(
3097       self, (size_t)3U, (size_t)1U,
3098       libcrux_sha3_generic_keccak_index_c2_04(
3099           &old, (KRML_CLITERAL(size_t_x2){.fst = (size_t)1U,
3100                                           .snd = (size_t)0U}))[0U]);
3101   libcrux_sha3_generic_keccak_set_80_04(
3102       self, (size_t)4U, (size_t)1U,
3103       libcrux_sha3_generic_keccak_index_c2_04(
3104           &old, (KRML_CLITERAL(size_t_x2){.fst = (size_t)1U,
3105                                           .snd = (size_t)3U}))[0U]);
3106   libcrux_sha3_generic_keccak_set_80_04(
3107       self, (size_t)0U, (size_t)2U,
3108       libcrux_sha3_generic_keccak_index_c2_04(
3109           &old, (KRML_CLITERAL(size_t_x2){.fst = (size_t)2U,
3110                                           .snd = (size_t)2U}))[0U]);
3111   libcrux_sha3_generic_keccak_set_80_04(
3112       self, (size_t)1U, (size_t)2U,
3113       libcrux_sha3_generic_keccak_index_c2_04(
3114           &old, (KRML_CLITERAL(size_t_x2){.fst = (size_t)2U,
3115                                           .snd = (size_t)0U}))[0U]);
3116   libcrux_sha3_generic_keccak_set_80_04(
3117       self, (size_t)2U, (size_t)2U,
3118       libcrux_sha3_generic_keccak_index_c2_04(
3119           &old, (KRML_CLITERAL(size_t_x2){.fst = (size_t)2U,
3120                                           .snd = (size_t)3U}))[0U]);
3121   libcrux_sha3_generic_keccak_set_80_04(
3122       self, (size_t)3U, (size_t)2U,
3123       libcrux_sha3_generic_keccak_index_c2_04(
3124           &old, (KRML_CLITERAL(size_t_x2){.fst = (size_t)2U,
3125                                           .snd = (size_t)1U}))[0U]);
3126   libcrux_sha3_generic_keccak_set_80_04(
3127       self, (size_t)4U, (size_t)2U,
3128       libcrux_sha3_generic_keccak_index_c2_04(
3129           &old, (KRML_CLITERAL(size_t_x2){.fst = (size_t)2U,
3130                                           .snd = (size_t)4U}))[0U]);
3131   libcrux_sha3_generic_keccak_set_80_04(
3132       self, (size_t)0U, (size_t)3U,
3133       libcrux_sha3_generic_keccak_index_c2_04(
3134           &old, (KRML_CLITERAL(size_t_x2){.fst = (size_t)3U,
3135                                           .snd = (size_t)3U}))[0U]);
3136   libcrux_sha3_generic_keccak_set_80_04(
3137       self, (size_t)1U, (size_t)3U,
3138       libcrux_sha3_generic_keccak_index_c2_04(
3139           &old, (KRML_CLITERAL(size_t_x2){.fst = (size_t)3U,
3140                                           .snd = (size_t)1U}))[0U]);
3141   libcrux_sha3_generic_keccak_set_80_04(
3142       self, (size_t)2U, (size_t)3U,
3143       libcrux_sha3_generic_keccak_index_c2_04(
3144           &old, (KRML_CLITERAL(size_t_x2){.fst = (size_t)3U,
3145                                           .snd = (size_t)4U}))[0U]);
3146   libcrux_sha3_generic_keccak_set_80_04(
3147       self, (size_t)3U, (size_t)3U,
3148       libcrux_sha3_generic_keccak_index_c2_04(
3149           &old, (KRML_CLITERAL(size_t_x2){.fst = (size_t)3U,
3150                                           .snd = (size_t)2U}))[0U]);
3151   libcrux_sha3_generic_keccak_set_80_04(
3152       self, (size_t)4U, (size_t)3U,
3153       libcrux_sha3_generic_keccak_index_c2_04(
3154           &old, (KRML_CLITERAL(size_t_x2){.fst = (size_t)3U,
3155                                           .snd = (size_t)0U}))[0U]);
3156   libcrux_sha3_generic_keccak_set_80_04(
3157       self, (size_t)0U, (size_t)4U,
3158       libcrux_sha3_generic_keccak_index_c2_04(
3159           &old, (KRML_CLITERAL(size_t_x2){.fst = (size_t)4U,
3160                                           .snd = (size_t)4U}))[0U]);
3161   libcrux_sha3_generic_keccak_set_80_04(
3162       self, (size_t)1U, (size_t)4U,
3163       libcrux_sha3_generic_keccak_index_c2_04(
3164           &old, (KRML_CLITERAL(size_t_x2){.fst = (size_t)4U,
3165                                           .snd = (size_t)2U}))[0U]);
3166   libcrux_sha3_generic_keccak_set_80_04(
3167       self, (size_t)2U, (size_t)4U,
3168       libcrux_sha3_generic_keccak_index_c2_04(
3169           &old, (KRML_CLITERAL(size_t_x2){.fst = (size_t)4U,
3170                                           .snd = (size_t)0U}))[0U]);
3171   libcrux_sha3_generic_keccak_set_80_04(
3172       self, (size_t)3U, (size_t)4U,
3173       libcrux_sha3_generic_keccak_index_c2_04(
3174           &old, (KRML_CLITERAL(size_t_x2){.fst = (size_t)4U,
3175                                           .snd = (size_t)3U}))[0U]);
3176   libcrux_sha3_generic_keccak_set_80_04(
3177       self, (size_t)4U, (size_t)4U,
3178       libcrux_sha3_generic_keccak_index_c2_04(
3179           &old, (KRML_CLITERAL(size_t_x2){.fst = (size_t)4U,
3180                                           .snd = (size_t)1U}))[0U]);
3181 }
3182 
3183 /**
3184 This function found in impl {libcrux_sha3::generic_keccak::KeccakState<T,
3185 N>[TraitClause@0, TraitClause@1]}
3186 */
3187 /**
3188 A monomorphic instance of libcrux_sha3.generic_keccak.chi_80
3189 with types uint64_t
3190 with const generics
3191 - N= 1
3192 */
libcrux_sha3_generic_keccak_chi_80_04(libcrux_sha3_generic_keccak_KeccakState_17 * self)3193 static KRML_MUSTINLINE void libcrux_sha3_generic_keccak_chi_80_04(
3194     libcrux_sha3_generic_keccak_KeccakState_17 *self) {
3195   libcrux_sha3_generic_keccak_KeccakState_17 old = self[0U];
3196   for (size_t i0 = (size_t)0U; i0 < (size_t)5U; i0++) {
3197     size_t i1 = i0;
3198     for (size_t i = (size_t)0U; i < (size_t)5U; i++) {
3199       size_t j = i;
3200       libcrux_sha3_generic_keccak_set_80_04(
3201           self, i1, j,
3202           libcrux_sha3_simd_portable_and_not_xor_d2(
3203               libcrux_sha3_generic_keccak_index_c2_04(
3204                   self, (KRML_CLITERAL(size_t_x2){.fst = i1, .snd = j}))[0U],
3205               libcrux_sha3_generic_keccak_index_c2_04(
3206                   &old,
3207                   (KRML_CLITERAL(size_t_x2){
3208                       .fst = i1, .snd = (j + (size_t)2U) % (size_t)5U}))[0U],
3209               libcrux_sha3_generic_keccak_index_c2_04(
3210                   &old,
3211                   (KRML_CLITERAL(size_t_x2){
3212                       .fst = i1, .snd = (j + (size_t)1U) % (size_t)5U}))[0U]));
3213     }
3214   }
3215 }
3216 
3217 /**
3218 This function found in impl {libcrux_sha3::generic_keccak::KeccakState<T,
3219 N>[TraitClause@0, TraitClause@1]}
3220 */
3221 /**
3222 A monomorphic instance of libcrux_sha3.generic_keccak.iota_80
3223 with types uint64_t
3224 with const generics
3225 - N= 1
3226 */
libcrux_sha3_generic_keccak_iota_80_04(libcrux_sha3_generic_keccak_KeccakState_17 * self,size_t i)3227 static KRML_MUSTINLINE void libcrux_sha3_generic_keccak_iota_80_04(
3228     libcrux_sha3_generic_keccak_KeccakState_17 *self, size_t i) {
3229   libcrux_sha3_generic_keccak_set_80_04(
3230       self, (size_t)0U, (size_t)0U,
3231       libcrux_sha3_simd_portable_xor_constant_d2(
3232           libcrux_sha3_generic_keccak_index_c2_04(
3233               self, (KRML_CLITERAL(size_t_x2){.fst = (size_t)0U,
3234                                               .snd = (size_t)0U}))[0U],
3235           libcrux_sha3_generic_keccak_constants_ROUNDCONSTANTS[i]));
3236 }
3237 
3238 /**
3239 This function found in impl {libcrux_sha3::generic_keccak::KeccakState<T,
3240 N>[TraitClause@0, TraitClause@1]}
3241 */
3242 /**
3243 A monomorphic instance of libcrux_sha3.generic_keccak.keccakf1600_80
3244 with types uint64_t
3245 with const generics
3246 - N= 1
3247 */
libcrux_sha3_generic_keccak_keccakf1600_80_04(libcrux_sha3_generic_keccak_KeccakState_17 * self)3248 static KRML_MUSTINLINE void libcrux_sha3_generic_keccak_keccakf1600_80_04(
3249     libcrux_sha3_generic_keccak_KeccakState_17 *self) {
3250   for (size_t i = (size_t)0U; i < (size_t)24U; i++) {
3251     size_t i0 = i;
3252     uint64_t t[5U];
3253     libcrux_sha3_generic_keccak_theta_80_04(self, t);
3254     libcrux_sha3_generic_keccak_KeccakState_17 *uu____0 = self;
3255     uint64_t uu____1[5U];
3256     memcpy(uu____1, t, (size_t)5U * sizeof(uint64_t));
3257     libcrux_sha3_generic_keccak_rho_80_04(uu____0, uu____1);
3258     libcrux_sha3_generic_keccak_pi_80_04(self);
3259     libcrux_sha3_generic_keccak_chi_80_04(self);
3260     libcrux_sha3_generic_keccak_iota_80_04(self, i0);
3261   }
3262 }
3263 
3264 /**
3265 This function found in impl {libcrux_sha3::generic_keccak::KeccakState<T,
3266 N>[TraitClause@0, TraitClause@1]}
3267 */
3268 /**
3269 A monomorphic instance of libcrux_sha3.generic_keccak.absorb_block_80
3270 with types uint64_t
3271 with const generics
3272 - N= 1
3273 - RATE= 72
3274 */
libcrux_sha3_generic_keccak_absorb_block_80_c6(libcrux_sha3_generic_keccak_KeccakState_17 * self,Eurydice_slice * blocks,size_t start)3275 static KRML_MUSTINLINE void libcrux_sha3_generic_keccak_absorb_block_80_c6(
3276     libcrux_sha3_generic_keccak_KeccakState_17 *self, Eurydice_slice *blocks,
3277     size_t start) {
3278   libcrux_sha3_simd_portable_load_block_a1_f8(self, blocks, start);
3279   libcrux_sha3_generic_keccak_keccakf1600_80_04(self);
3280 }
3281 
3282 /**
3283 A monomorphic instance of libcrux_sha3.simd.portable.load_last
3284 with const generics
3285 - RATE= 72
3286 - DELIMITER= 6
3287 */
libcrux_sha3_simd_portable_load_last_96(uint64_t * state,Eurydice_slice blocks,size_t start,size_t len)3288 static KRML_MUSTINLINE void libcrux_sha3_simd_portable_load_last_96(
3289     uint64_t *state, Eurydice_slice blocks, size_t start, size_t len) {
3290   uint8_t buffer[72U] = {0U};
3291   Eurydice_slice_copy(
3292       Eurydice_array_to_subslice3(buffer, (size_t)0U, len, uint8_t *),
3293       Eurydice_slice_subslice3(blocks, start, start + len, uint8_t *), uint8_t);
3294   buffer[len] = 6U;
3295   size_t uu____0 = (size_t)72U - (size_t)1U;
3296   buffer[uu____0] = (uint32_t)buffer[uu____0] | 128U;
3297   libcrux_sha3_simd_portable_load_block_f8(
3298       state, Eurydice_array_to_slice((size_t)72U, buffer, uint8_t), (size_t)0U);
3299 }
3300 
3301 /**
3302 This function found in impl {libcrux_sha3::traits::Absorb<1usize> for
3303 libcrux_sha3::generic_keccak::KeccakState<u64, 1usize>[core::marker::Sized<u64>,
3304 libcrux_sha3::simd::portable::{libcrux_sha3::traits::KeccakItem<1usize> for
3305 u64}]}
3306 */
3307 /**
3308 A monomorphic instance of libcrux_sha3.simd.portable.load_last_a1
3309 with const generics
3310 - RATE= 72
3311 - DELIMITER= 6
3312 */
libcrux_sha3_simd_portable_load_last_a1_96(libcrux_sha3_generic_keccak_KeccakState_17 * self,Eurydice_slice * input,size_t start,size_t len)3313 static inline void libcrux_sha3_simd_portable_load_last_a1_96(
3314     libcrux_sha3_generic_keccak_KeccakState_17 *self, Eurydice_slice *input,
3315     size_t start, size_t len) {
3316   libcrux_sha3_simd_portable_load_last_96(self->st, input[0U], start, len);
3317 }
3318 
3319 /**
3320 This function found in impl {libcrux_sha3::generic_keccak::KeccakState<T,
3321 N>[TraitClause@0, TraitClause@1]}
3322 */
3323 /**
3324 A monomorphic instance of libcrux_sha3.generic_keccak.absorb_final_80
3325 with types uint64_t
3326 with const generics
3327 - N= 1
3328 - RATE= 72
3329 - DELIM= 6
3330 */
libcrux_sha3_generic_keccak_absorb_final_80_9e(libcrux_sha3_generic_keccak_KeccakState_17 * self,Eurydice_slice * last,size_t start,size_t len)3331 static KRML_MUSTINLINE void libcrux_sha3_generic_keccak_absorb_final_80_9e(
3332     libcrux_sha3_generic_keccak_KeccakState_17 *self, Eurydice_slice *last,
3333     size_t start, size_t len) {
3334   libcrux_sha3_simd_portable_load_last_a1_96(self, last, start, len);
3335   libcrux_sha3_generic_keccak_keccakf1600_80_04(self);
3336 }
3337 
3338 /**
3339 A monomorphic instance of libcrux_sha3.simd.portable.store_block
3340 with const generics
3341 - RATE= 72
3342 */
libcrux_sha3_simd_portable_store_block_f8(uint64_t * s,Eurydice_slice out,size_t start,size_t len)3343 static KRML_MUSTINLINE void libcrux_sha3_simd_portable_store_block_f8(
3344     uint64_t *s, Eurydice_slice out, size_t start, size_t len) {
3345   size_t octets = len / (size_t)8U;
3346   for (size_t i = (size_t)0U; i < octets; i++) {
3347     size_t i0 = i;
3348     Eurydice_slice uu____0 = Eurydice_slice_subslice3(
3349         out, start + (size_t)8U * i0, start + (size_t)8U * i0 + (size_t)8U,
3350         uint8_t *);
3351     uint8_t ret[8U];
3352     core_num__u64__to_le_bytes(
3353         libcrux_sha3_traits_get_ij_04(s, i0 / (size_t)5U, i0 % (size_t)5U)[0U],
3354         ret);
3355     Eurydice_slice_copy(
3356         uu____0, Eurydice_array_to_slice((size_t)8U, ret, uint8_t), uint8_t);
3357   }
3358   size_t remaining = len % (size_t)8U;
3359   if (remaining > (size_t)0U) {
3360     Eurydice_slice uu____1 = Eurydice_slice_subslice3(
3361         out, start + len - remaining, start + len, uint8_t *);
3362     uint8_t ret[8U];
3363     core_num__u64__to_le_bytes(
3364         libcrux_sha3_traits_get_ij_04(s, octets / (size_t)5U,
3365                                       octets % (size_t)5U)[0U],
3366         ret);
3367     Eurydice_slice_copy(
3368         uu____1,
3369         Eurydice_array_to_subslice3(ret, (size_t)0U, remaining, uint8_t *),
3370         uint8_t);
3371   }
3372 }
3373 
3374 /**
3375 This function found in impl {libcrux_sha3::traits::Squeeze1<u64> for
3376 libcrux_sha3::generic_keccak::KeccakState<u64, 1usize>[core::marker::Sized<u64>,
3377 libcrux_sha3::simd::portable::{libcrux_sha3::traits::KeccakItem<1usize> for
3378 u64}]}
3379 */
3380 /**
3381 A monomorphic instance of libcrux_sha3.simd.portable.squeeze_13
3382 with const generics
3383 - RATE= 72
3384 */
libcrux_sha3_simd_portable_squeeze_13_f8(libcrux_sha3_generic_keccak_KeccakState_17 * self,Eurydice_slice out,size_t start,size_t len)3385 static inline void libcrux_sha3_simd_portable_squeeze_13_f8(
3386     libcrux_sha3_generic_keccak_KeccakState_17 *self, Eurydice_slice out,
3387     size_t start, size_t len) {
3388   libcrux_sha3_simd_portable_store_block_f8(self->st, out, start, len);
3389 }
3390 
3391 /**
3392 A monomorphic instance of libcrux_sha3.generic_keccak.portable.keccak1
3393 with const generics
3394 - RATE= 72
3395 - DELIM= 6
3396 */
libcrux_sha3_generic_keccak_portable_keccak1_96(Eurydice_slice data,Eurydice_slice out)3397 static inline void libcrux_sha3_generic_keccak_portable_keccak1_96(
3398     Eurydice_slice data, Eurydice_slice out) {
3399   libcrux_sha3_generic_keccak_KeccakState_17 s =
3400       libcrux_sha3_generic_keccak_new_80_04();
3401   size_t data_len = Eurydice_slice_len(data, uint8_t);
3402   for (size_t i = (size_t)0U; i < data_len / (size_t)72U; i++) {
3403     size_t i0 = i;
3404     Eurydice_slice buf[1U] = {data};
3405     libcrux_sha3_generic_keccak_absorb_block_80_c6(&s, buf, i0 * (size_t)72U);
3406   }
3407   size_t rem = data_len % (size_t)72U;
3408   Eurydice_slice buf[1U] = {data};
3409   libcrux_sha3_generic_keccak_absorb_final_80_9e(&s, buf, data_len - rem, rem);
3410   size_t outlen = Eurydice_slice_len(out, uint8_t);
3411   size_t blocks = outlen / (size_t)72U;
3412   size_t last = outlen - outlen % (size_t)72U;
3413   if (blocks == (size_t)0U) {
3414     libcrux_sha3_simd_portable_squeeze_13_f8(&s, out, (size_t)0U, outlen);
3415   } else {
3416     libcrux_sha3_simd_portable_squeeze_13_f8(&s, out, (size_t)0U, (size_t)72U);
3417     for (size_t i = (size_t)1U; i < blocks; i++) {
3418       size_t i0 = i;
3419       libcrux_sha3_generic_keccak_keccakf1600_80_04(&s);
3420       libcrux_sha3_simd_portable_squeeze_13_f8(&s, out, i0 * (size_t)72U,
3421                                                (size_t)72U);
3422     }
3423     if (last < outlen) {
3424       libcrux_sha3_generic_keccak_keccakf1600_80_04(&s);
3425       libcrux_sha3_simd_portable_squeeze_13_f8(&s, out, last, outlen - last);
3426     }
3427   }
3428 }
3429 
3430 /**
3431  A portable SHA3 512 implementation.
3432 */
libcrux_sha3_portable_sha512(Eurydice_slice digest,Eurydice_slice data)3433 static KRML_MUSTINLINE void libcrux_sha3_portable_sha512(Eurydice_slice digest,
3434                                                          Eurydice_slice data) {
3435   libcrux_sha3_generic_keccak_portable_keccak1_96(data, digest);
3436 }
3437 
3438 /**
3439 A monomorphic instance of libcrux_sha3.simd.portable.load_block
3440 with const generics
3441 - RATE= 136
3442 */
libcrux_sha3_simd_portable_load_block_5b(uint64_t * state,Eurydice_slice blocks,size_t start)3443 static KRML_MUSTINLINE void libcrux_sha3_simd_portable_load_block_5b(
3444     uint64_t *state, Eurydice_slice blocks, size_t start) {
3445   uint64_t state_flat[25U] = {0U};
3446   for (size_t i = (size_t)0U; i < (size_t)136U / (size_t)8U; i++) {
3447     size_t i0 = i;
3448     size_t offset = start + (size_t)8U * i0;
3449     uint8_t uu____0[8U];
3450     Result_15 dst;
3451     Eurydice_slice_to_array2(
3452         &dst,
3453         Eurydice_slice_subslice3(blocks, offset, offset + (size_t)8U,
3454                                  uint8_t *),
3455         Eurydice_slice, uint8_t[8U], TryFromSliceError);
3456     unwrap_26_68(dst, uu____0);
3457     state_flat[i0] = core_num__u64__from_le_bytes(uu____0);
3458   }
3459   for (size_t i = (size_t)0U; i < (size_t)136U / (size_t)8U; i++) {
3460     size_t i0 = i;
3461     libcrux_sha3_traits_set_ij_04(
3462         state, i0 / (size_t)5U, i0 % (size_t)5U,
3463         libcrux_sha3_traits_get_ij_04(state, i0 / (size_t)5U,
3464                                       i0 % (size_t)5U)[0U] ^
3465             state_flat[i0]);
3466   }
3467 }
3468 
3469 /**
3470 This function found in impl {libcrux_sha3::traits::Absorb<1usize> for
3471 libcrux_sha3::generic_keccak::KeccakState<u64, 1usize>[core::marker::Sized<u64>,
3472 libcrux_sha3::simd::portable::{libcrux_sha3::traits::KeccakItem<1usize> for
3473 u64}]}
3474 */
3475 /**
3476 A monomorphic instance of libcrux_sha3.simd.portable.load_block_a1
3477 with const generics
3478 - RATE= 136
3479 */
libcrux_sha3_simd_portable_load_block_a1_5b(libcrux_sha3_generic_keccak_KeccakState_17 * self,Eurydice_slice * input,size_t start)3480 static inline void libcrux_sha3_simd_portable_load_block_a1_5b(
3481     libcrux_sha3_generic_keccak_KeccakState_17 *self, Eurydice_slice *input,
3482     size_t start) {
3483   libcrux_sha3_simd_portable_load_block_5b(self->st, input[0U], start);
3484 }
3485 
3486 /**
3487 This function found in impl {libcrux_sha3::generic_keccak::KeccakState<T,
3488 N>[TraitClause@0, TraitClause@1]}
3489 */
3490 /**
3491 A monomorphic instance of libcrux_sha3.generic_keccak.absorb_block_80
3492 with types uint64_t
3493 with const generics
3494 - N= 1
3495 - RATE= 136
3496 */
libcrux_sha3_generic_keccak_absorb_block_80_c60(libcrux_sha3_generic_keccak_KeccakState_17 * self,Eurydice_slice * blocks,size_t start)3497 static KRML_MUSTINLINE void libcrux_sha3_generic_keccak_absorb_block_80_c60(
3498     libcrux_sha3_generic_keccak_KeccakState_17 *self, Eurydice_slice *blocks,
3499     size_t start) {
3500   libcrux_sha3_simd_portable_load_block_a1_5b(self, blocks, start);
3501   libcrux_sha3_generic_keccak_keccakf1600_80_04(self);
3502 }
3503 
3504 /**
3505 A monomorphic instance of libcrux_sha3.simd.portable.load_last
3506 with const generics
3507 - RATE= 136
3508 - DELIMITER= 6
3509 */
libcrux_sha3_simd_portable_load_last_ad(uint64_t * state,Eurydice_slice blocks,size_t start,size_t len)3510 static KRML_MUSTINLINE void libcrux_sha3_simd_portable_load_last_ad(
3511     uint64_t *state, Eurydice_slice blocks, size_t start, size_t len) {
3512   uint8_t buffer[136U] = {0U};
3513   Eurydice_slice_copy(
3514       Eurydice_array_to_subslice3(buffer, (size_t)0U, len, uint8_t *),
3515       Eurydice_slice_subslice3(blocks, start, start + len, uint8_t *), uint8_t);
3516   buffer[len] = 6U;
3517   size_t uu____0 = (size_t)136U - (size_t)1U;
3518   buffer[uu____0] = (uint32_t)buffer[uu____0] | 128U;
3519   libcrux_sha3_simd_portable_load_block_5b(
3520       state, Eurydice_array_to_slice((size_t)136U, buffer, uint8_t),
3521       (size_t)0U);
3522 }
3523 
3524 /**
3525 This function found in impl {libcrux_sha3::traits::Absorb<1usize> for
3526 libcrux_sha3::generic_keccak::KeccakState<u64, 1usize>[core::marker::Sized<u64>,
3527 libcrux_sha3::simd::portable::{libcrux_sha3::traits::KeccakItem<1usize> for
3528 u64}]}
3529 */
3530 /**
3531 A monomorphic instance of libcrux_sha3.simd.portable.load_last_a1
3532 with const generics
3533 - RATE= 136
3534 - DELIMITER= 6
3535 */
libcrux_sha3_simd_portable_load_last_a1_ad(libcrux_sha3_generic_keccak_KeccakState_17 * self,Eurydice_slice * input,size_t start,size_t len)3536 static inline void libcrux_sha3_simd_portable_load_last_a1_ad(
3537     libcrux_sha3_generic_keccak_KeccakState_17 *self, Eurydice_slice *input,
3538     size_t start, size_t len) {
3539   libcrux_sha3_simd_portable_load_last_ad(self->st, input[0U], start, len);
3540 }
3541 
3542 /**
3543 This function found in impl {libcrux_sha3::generic_keccak::KeccakState<T,
3544 N>[TraitClause@0, TraitClause@1]}
3545 */
3546 /**
3547 A monomorphic instance of libcrux_sha3.generic_keccak.absorb_final_80
3548 with types uint64_t
3549 with const generics
3550 - N= 1
3551 - RATE= 136
3552 - DELIM= 6
3553 */
libcrux_sha3_generic_keccak_absorb_final_80_9e0(libcrux_sha3_generic_keccak_KeccakState_17 * self,Eurydice_slice * last,size_t start,size_t len)3554 static KRML_MUSTINLINE void libcrux_sha3_generic_keccak_absorb_final_80_9e0(
3555     libcrux_sha3_generic_keccak_KeccakState_17 *self, Eurydice_slice *last,
3556     size_t start, size_t len) {
3557   libcrux_sha3_simd_portable_load_last_a1_ad(self, last, start, len);
3558   libcrux_sha3_generic_keccak_keccakf1600_80_04(self);
3559 }
3560 
3561 /**
3562 A monomorphic instance of libcrux_sha3.simd.portable.store_block
3563 with const generics
3564 - RATE= 136
3565 */
libcrux_sha3_simd_portable_store_block_5b(uint64_t * s,Eurydice_slice out,size_t start,size_t len)3566 static KRML_MUSTINLINE void libcrux_sha3_simd_portable_store_block_5b(
3567     uint64_t *s, Eurydice_slice out, size_t start, size_t len) {
3568   size_t octets = len / (size_t)8U;
3569   for (size_t i = (size_t)0U; i < octets; i++) {
3570     size_t i0 = i;
3571     Eurydice_slice uu____0 = Eurydice_slice_subslice3(
3572         out, start + (size_t)8U * i0, start + (size_t)8U * i0 + (size_t)8U,
3573         uint8_t *);
3574     uint8_t ret[8U];
3575     core_num__u64__to_le_bytes(
3576         libcrux_sha3_traits_get_ij_04(s, i0 / (size_t)5U, i0 % (size_t)5U)[0U],
3577         ret);
3578     Eurydice_slice_copy(
3579         uu____0, Eurydice_array_to_slice((size_t)8U, ret, uint8_t), uint8_t);
3580   }
3581   size_t remaining = len % (size_t)8U;
3582   if (remaining > (size_t)0U) {
3583     Eurydice_slice uu____1 = Eurydice_slice_subslice3(
3584         out, start + len - remaining, start + len, uint8_t *);
3585     uint8_t ret[8U];
3586     core_num__u64__to_le_bytes(
3587         libcrux_sha3_traits_get_ij_04(s, octets / (size_t)5U,
3588                                       octets % (size_t)5U)[0U],
3589         ret);
3590     Eurydice_slice_copy(
3591         uu____1,
3592         Eurydice_array_to_subslice3(ret, (size_t)0U, remaining, uint8_t *),
3593         uint8_t);
3594   }
3595 }
3596 
3597 /**
3598 This function found in impl {libcrux_sha3::traits::Squeeze1<u64> for
3599 libcrux_sha3::generic_keccak::KeccakState<u64, 1usize>[core::marker::Sized<u64>,
3600 libcrux_sha3::simd::portable::{libcrux_sha3::traits::KeccakItem<1usize> for
3601 u64}]}
3602 */
3603 /**
3604 A monomorphic instance of libcrux_sha3.simd.portable.squeeze_13
3605 with const generics
3606 - RATE= 136
3607 */
libcrux_sha3_simd_portable_squeeze_13_5b(libcrux_sha3_generic_keccak_KeccakState_17 * self,Eurydice_slice out,size_t start,size_t len)3608 static inline void libcrux_sha3_simd_portable_squeeze_13_5b(
3609     libcrux_sha3_generic_keccak_KeccakState_17 *self, Eurydice_slice out,
3610     size_t start, size_t len) {
3611   libcrux_sha3_simd_portable_store_block_5b(self->st, out, start, len);
3612 }
3613 
3614 /**
3615 A monomorphic instance of libcrux_sha3.generic_keccak.portable.keccak1
3616 with const generics
3617 - RATE= 136
3618 - DELIM= 6
3619 */
libcrux_sha3_generic_keccak_portable_keccak1_ad(Eurydice_slice data,Eurydice_slice out)3620 static inline void libcrux_sha3_generic_keccak_portable_keccak1_ad(
3621     Eurydice_slice data, Eurydice_slice out) {
3622   libcrux_sha3_generic_keccak_KeccakState_17 s =
3623       libcrux_sha3_generic_keccak_new_80_04();
3624   size_t data_len = Eurydice_slice_len(data, uint8_t);
3625   for (size_t i = (size_t)0U; i < data_len / (size_t)136U; i++) {
3626     size_t i0 = i;
3627     Eurydice_slice buf[1U] = {data};
3628     libcrux_sha3_generic_keccak_absorb_block_80_c60(&s, buf, i0 * (size_t)136U);
3629   }
3630   size_t rem = data_len % (size_t)136U;
3631   Eurydice_slice buf[1U] = {data};
3632   libcrux_sha3_generic_keccak_absorb_final_80_9e0(&s, buf, data_len - rem, rem);
3633   size_t outlen = Eurydice_slice_len(out, uint8_t);
3634   size_t blocks = outlen / (size_t)136U;
3635   size_t last = outlen - outlen % (size_t)136U;
3636   if (blocks == (size_t)0U) {
3637     libcrux_sha3_simd_portable_squeeze_13_5b(&s, out, (size_t)0U, outlen);
3638   } else {
3639     libcrux_sha3_simd_portable_squeeze_13_5b(&s, out, (size_t)0U, (size_t)136U);
3640     for (size_t i = (size_t)1U; i < blocks; i++) {
3641       size_t i0 = i;
3642       libcrux_sha3_generic_keccak_keccakf1600_80_04(&s);
3643       libcrux_sha3_simd_portable_squeeze_13_5b(&s, out, i0 * (size_t)136U,
3644                                                (size_t)136U);
3645     }
3646     if (last < outlen) {
3647       libcrux_sha3_generic_keccak_keccakf1600_80_04(&s);
3648       libcrux_sha3_simd_portable_squeeze_13_5b(&s, out, last, outlen - last);
3649     }
3650   }
3651 }
3652 
3653 /**
3654  A portable SHA3 256 implementation.
3655 */
libcrux_sha3_portable_sha256(Eurydice_slice digest,Eurydice_slice data)3656 static KRML_MUSTINLINE void libcrux_sha3_portable_sha256(Eurydice_slice digest,
3657                                                          Eurydice_slice data) {
3658   libcrux_sha3_generic_keccak_portable_keccak1_ad(data, digest);
3659 }
3660 
3661 /**
3662 A monomorphic instance of libcrux_sha3.simd.portable.load_last
3663 with const generics
3664 - RATE= 136
3665 - DELIMITER= 31
3666 */
libcrux_sha3_simd_portable_load_last_ad0(uint64_t * state,Eurydice_slice blocks,size_t start,size_t len)3667 static KRML_MUSTINLINE void libcrux_sha3_simd_portable_load_last_ad0(
3668     uint64_t *state, Eurydice_slice blocks, size_t start, size_t len) {
3669   uint8_t buffer[136U] = {0U};
3670   Eurydice_slice_copy(
3671       Eurydice_array_to_subslice3(buffer, (size_t)0U, len, uint8_t *),
3672       Eurydice_slice_subslice3(blocks, start, start + len, uint8_t *), uint8_t);
3673   buffer[len] = 31U;
3674   size_t uu____0 = (size_t)136U - (size_t)1U;
3675   buffer[uu____0] = (uint32_t)buffer[uu____0] | 128U;
3676   libcrux_sha3_simd_portable_load_block_5b(
3677       state, Eurydice_array_to_slice((size_t)136U, buffer, uint8_t),
3678       (size_t)0U);
3679 }
3680 
3681 /**
3682 This function found in impl {libcrux_sha3::traits::Absorb<1usize> for
3683 libcrux_sha3::generic_keccak::KeccakState<u64, 1usize>[core::marker::Sized<u64>,
3684 libcrux_sha3::simd::portable::{libcrux_sha3::traits::KeccakItem<1usize> for
3685 u64}]}
3686 */
3687 /**
3688 A monomorphic instance of libcrux_sha3.simd.portable.load_last_a1
3689 with const generics
3690 - RATE= 136
3691 - DELIMITER= 31
3692 */
libcrux_sha3_simd_portable_load_last_a1_ad0(libcrux_sha3_generic_keccak_KeccakState_17 * self,Eurydice_slice * input,size_t start,size_t len)3693 static inline void libcrux_sha3_simd_portable_load_last_a1_ad0(
3694     libcrux_sha3_generic_keccak_KeccakState_17 *self, Eurydice_slice *input,
3695     size_t start, size_t len) {
3696   libcrux_sha3_simd_portable_load_last_ad0(self->st, input[0U], start, len);
3697 }
3698 
3699 /**
3700 This function found in impl {libcrux_sha3::generic_keccak::KeccakState<T,
3701 N>[TraitClause@0, TraitClause@1]}
3702 */
3703 /**
3704 A monomorphic instance of libcrux_sha3.generic_keccak.absorb_final_80
3705 with types uint64_t
3706 with const generics
3707 - N= 1
3708 - RATE= 136
3709 - DELIM= 31
3710 */
libcrux_sha3_generic_keccak_absorb_final_80_9e1(libcrux_sha3_generic_keccak_KeccakState_17 * self,Eurydice_slice * last,size_t start,size_t len)3711 static KRML_MUSTINLINE void libcrux_sha3_generic_keccak_absorb_final_80_9e1(
3712     libcrux_sha3_generic_keccak_KeccakState_17 *self, Eurydice_slice *last,
3713     size_t start, size_t len) {
3714   libcrux_sha3_simd_portable_load_last_a1_ad0(self, last, start, len);
3715   libcrux_sha3_generic_keccak_keccakf1600_80_04(self);
3716 }
3717 
3718 /**
3719 A monomorphic instance of libcrux_sha3.generic_keccak.portable.keccak1
3720 with const generics
3721 - RATE= 136
3722 - DELIM= 31
3723 */
libcrux_sha3_generic_keccak_portable_keccak1_ad0(Eurydice_slice data,Eurydice_slice out)3724 static inline void libcrux_sha3_generic_keccak_portable_keccak1_ad0(
3725     Eurydice_slice data, Eurydice_slice out) {
3726   libcrux_sha3_generic_keccak_KeccakState_17 s =
3727       libcrux_sha3_generic_keccak_new_80_04();
3728   size_t data_len = Eurydice_slice_len(data, uint8_t);
3729   for (size_t i = (size_t)0U; i < data_len / (size_t)136U; i++) {
3730     size_t i0 = i;
3731     Eurydice_slice buf[1U] = {data};
3732     libcrux_sha3_generic_keccak_absorb_block_80_c60(&s, buf, i0 * (size_t)136U);
3733   }
3734   size_t rem = data_len % (size_t)136U;
3735   Eurydice_slice buf[1U] = {data};
3736   libcrux_sha3_generic_keccak_absorb_final_80_9e1(&s, buf, data_len - rem, rem);
3737   size_t outlen = Eurydice_slice_len(out, uint8_t);
3738   size_t blocks = outlen / (size_t)136U;
3739   size_t last = outlen - outlen % (size_t)136U;
3740   if (blocks == (size_t)0U) {
3741     libcrux_sha3_simd_portable_squeeze_13_5b(&s, out, (size_t)0U, outlen);
3742   } else {
3743     libcrux_sha3_simd_portable_squeeze_13_5b(&s, out, (size_t)0U, (size_t)136U);
3744     for (size_t i = (size_t)1U; i < blocks; i++) {
3745       size_t i0 = i;
3746       libcrux_sha3_generic_keccak_keccakf1600_80_04(&s);
3747       libcrux_sha3_simd_portable_squeeze_13_5b(&s, out, i0 * (size_t)136U,
3748                                                (size_t)136U);
3749     }
3750     if (last < outlen) {
3751       libcrux_sha3_generic_keccak_keccakf1600_80_04(&s);
3752       libcrux_sha3_simd_portable_squeeze_13_5b(&s, out, last, outlen - last);
3753     }
3754   }
3755 }
3756 
3757 /**
3758  A portable SHAKE256 implementation.
3759 */
libcrux_sha3_portable_shake256(Eurydice_slice digest,Eurydice_slice data)3760 static KRML_MUSTINLINE void libcrux_sha3_portable_shake256(
3761     Eurydice_slice digest, Eurydice_slice data) {
3762   libcrux_sha3_generic_keccak_portable_keccak1_ad0(data, digest);
3763 }
3764 
3765 typedef libcrux_sha3_generic_keccak_KeccakState_17
3766     libcrux_sha3_portable_KeccakState;
3767 
3768 /**
3769  Create a new SHAKE-128 state object.
3770 */
3771 static KRML_MUSTINLINE libcrux_sha3_generic_keccak_KeccakState_17
libcrux_sha3_portable_incremental_shake128_init(void)3772 libcrux_sha3_portable_incremental_shake128_init(void) {
3773   return libcrux_sha3_generic_keccak_new_80_04();
3774 }
3775 
3776 /**
3777 A monomorphic instance of libcrux_sha3.simd.portable.load_block
3778 with const generics
3779 - RATE= 168
3780 */
libcrux_sha3_simd_portable_load_block_3a(uint64_t * state,Eurydice_slice blocks,size_t start)3781 static KRML_MUSTINLINE void libcrux_sha3_simd_portable_load_block_3a(
3782     uint64_t *state, Eurydice_slice blocks, size_t start) {
3783   uint64_t state_flat[25U] = {0U};
3784   for (size_t i = (size_t)0U; i < (size_t)168U / (size_t)8U; i++) {
3785     size_t i0 = i;
3786     size_t offset = start + (size_t)8U * i0;
3787     uint8_t uu____0[8U];
3788     Result_15 dst;
3789     Eurydice_slice_to_array2(
3790         &dst,
3791         Eurydice_slice_subslice3(blocks, offset, offset + (size_t)8U,
3792                                  uint8_t *),
3793         Eurydice_slice, uint8_t[8U], TryFromSliceError);
3794     unwrap_26_68(dst, uu____0);
3795     state_flat[i0] = core_num__u64__from_le_bytes(uu____0);
3796   }
3797   for (size_t i = (size_t)0U; i < (size_t)168U / (size_t)8U; i++) {
3798     size_t i0 = i;
3799     libcrux_sha3_traits_set_ij_04(
3800         state, i0 / (size_t)5U, i0 % (size_t)5U,
3801         libcrux_sha3_traits_get_ij_04(state, i0 / (size_t)5U,
3802                                       i0 % (size_t)5U)[0U] ^
3803             state_flat[i0]);
3804   }
3805 }
3806 
3807 /**
3808 A monomorphic instance of libcrux_sha3.simd.portable.load_last
3809 with const generics
3810 - RATE= 168
3811 - DELIMITER= 31
3812 */
libcrux_sha3_simd_portable_load_last_c6(uint64_t * state,Eurydice_slice blocks,size_t start,size_t len)3813 static KRML_MUSTINLINE void libcrux_sha3_simd_portable_load_last_c6(
3814     uint64_t *state, Eurydice_slice blocks, size_t start, size_t len) {
3815   uint8_t buffer[168U] = {0U};
3816   Eurydice_slice_copy(
3817       Eurydice_array_to_subslice3(buffer, (size_t)0U, len, uint8_t *),
3818       Eurydice_slice_subslice3(blocks, start, start + len, uint8_t *), uint8_t);
3819   buffer[len] = 31U;
3820   size_t uu____0 = (size_t)168U - (size_t)1U;
3821   buffer[uu____0] = (uint32_t)buffer[uu____0] | 128U;
3822   libcrux_sha3_simd_portable_load_block_3a(
3823       state, Eurydice_array_to_slice((size_t)168U, buffer, uint8_t),
3824       (size_t)0U);
3825 }
3826 
3827 /**
3828 This function found in impl {libcrux_sha3::traits::Absorb<1usize> for
3829 libcrux_sha3::generic_keccak::KeccakState<u64, 1usize>[core::marker::Sized<u64>,
3830 libcrux_sha3::simd::portable::{libcrux_sha3::traits::KeccakItem<1usize> for
3831 u64}]}
3832 */
3833 /**
3834 A monomorphic instance of libcrux_sha3.simd.portable.load_last_a1
3835 with const generics
3836 - RATE= 168
3837 - DELIMITER= 31
3838 */
libcrux_sha3_simd_portable_load_last_a1_c6(libcrux_sha3_generic_keccak_KeccakState_17 * self,Eurydice_slice * input,size_t start,size_t len)3839 static inline void libcrux_sha3_simd_portable_load_last_a1_c6(
3840     libcrux_sha3_generic_keccak_KeccakState_17 *self, Eurydice_slice *input,
3841     size_t start, size_t len) {
3842   libcrux_sha3_simd_portable_load_last_c6(self->st, input[0U], start, len);
3843 }
3844 
3845 /**
3846 This function found in impl {libcrux_sha3::generic_keccak::KeccakState<T,
3847 N>[TraitClause@0, TraitClause@1]}
3848 */
3849 /**
3850 A monomorphic instance of libcrux_sha3.generic_keccak.absorb_final_80
3851 with types uint64_t
3852 with const generics
3853 - N= 1
3854 - RATE= 168
3855 - DELIM= 31
3856 */
libcrux_sha3_generic_keccak_absorb_final_80_9e2(libcrux_sha3_generic_keccak_KeccakState_17 * self,Eurydice_slice * last,size_t start,size_t len)3857 static KRML_MUSTINLINE void libcrux_sha3_generic_keccak_absorb_final_80_9e2(
3858     libcrux_sha3_generic_keccak_KeccakState_17 *self, Eurydice_slice *last,
3859     size_t start, size_t len) {
3860   libcrux_sha3_simd_portable_load_last_a1_c6(self, last, start, len);
3861   libcrux_sha3_generic_keccak_keccakf1600_80_04(self);
3862 }
3863 
3864 /**
3865  Absorb
3866 */
3867 static KRML_MUSTINLINE void
libcrux_sha3_portable_incremental_shake128_absorb_final(libcrux_sha3_generic_keccak_KeccakState_17 * s,Eurydice_slice data0)3868 libcrux_sha3_portable_incremental_shake128_absorb_final(
3869     libcrux_sha3_generic_keccak_KeccakState_17 *s, Eurydice_slice data0) {
3870   libcrux_sha3_generic_keccak_KeccakState_17 *uu____0 = s;
3871   Eurydice_slice uu____1[1U] = {data0};
3872   libcrux_sha3_generic_keccak_absorb_final_80_9e2(
3873       uu____0, uu____1, (size_t)0U, Eurydice_slice_len(data0, uint8_t));
3874 }
3875 
3876 /**
3877 A monomorphic instance of libcrux_sha3.simd.portable.store_block
3878 with const generics
3879 - RATE= 168
3880 */
libcrux_sha3_simd_portable_store_block_3a(uint64_t * s,Eurydice_slice out,size_t start,size_t len)3881 static KRML_MUSTINLINE void libcrux_sha3_simd_portable_store_block_3a(
3882     uint64_t *s, Eurydice_slice out, size_t start, size_t len) {
3883   size_t octets = len / (size_t)8U;
3884   for (size_t i = (size_t)0U; i < octets; i++) {
3885     size_t i0 = i;
3886     Eurydice_slice uu____0 = Eurydice_slice_subslice3(
3887         out, start + (size_t)8U * i0, start + (size_t)8U * i0 + (size_t)8U,
3888         uint8_t *);
3889     uint8_t ret[8U];
3890     core_num__u64__to_le_bytes(
3891         libcrux_sha3_traits_get_ij_04(s, i0 / (size_t)5U, i0 % (size_t)5U)[0U],
3892         ret);
3893     Eurydice_slice_copy(
3894         uu____0, Eurydice_array_to_slice((size_t)8U, ret, uint8_t), uint8_t);
3895   }
3896   size_t remaining = len % (size_t)8U;
3897   if (remaining > (size_t)0U) {
3898     Eurydice_slice uu____1 = Eurydice_slice_subslice3(
3899         out, start + len - remaining, start + len, uint8_t *);
3900     uint8_t ret[8U];
3901     core_num__u64__to_le_bytes(
3902         libcrux_sha3_traits_get_ij_04(s, octets / (size_t)5U,
3903                                       octets % (size_t)5U)[0U],
3904         ret);
3905     Eurydice_slice_copy(
3906         uu____1,
3907         Eurydice_array_to_subslice3(ret, (size_t)0U, remaining, uint8_t *),
3908         uint8_t);
3909   }
3910 }
3911 
3912 /**
3913 This function found in impl {libcrux_sha3::traits::Squeeze1<u64> for
3914 libcrux_sha3::generic_keccak::KeccakState<u64, 1usize>[core::marker::Sized<u64>,
3915 libcrux_sha3::simd::portable::{libcrux_sha3::traits::KeccakItem<1usize> for
3916 u64}]}
3917 */
3918 /**
3919 A monomorphic instance of libcrux_sha3.simd.portable.squeeze_13
3920 with const generics
3921 - RATE= 168
3922 */
libcrux_sha3_simd_portable_squeeze_13_3a(libcrux_sha3_generic_keccak_KeccakState_17 * self,Eurydice_slice out,size_t start,size_t len)3923 static inline void libcrux_sha3_simd_portable_squeeze_13_3a(
3924     libcrux_sha3_generic_keccak_KeccakState_17 *self, Eurydice_slice out,
3925     size_t start, size_t len) {
3926   libcrux_sha3_simd_portable_store_block_3a(self->st, out, start, len);
3927 }
3928 
3929 /**
3930 This function found in impl {libcrux_sha3::generic_keccak::KeccakState<u64,
3931 1usize>[core::marker::Sized<u64>,
3932 libcrux_sha3::simd::portable::{libcrux_sha3::traits::KeccakItem<1usize> for
3933 u64}]}
3934 */
3935 /**
3936 A monomorphic instance of
3937 libcrux_sha3.generic_keccak.portable.squeeze_first_three_blocks_b4 with const
3938 generics
3939 - RATE= 168
3940 */
3941 static KRML_MUSTINLINE void
libcrux_sha3_generic_keccak_portable_squeeze_first_three_blocks_b4_3a(libcrux_sha3_generic_keccak_KeccakState_17 * self,Eurydice_slice out)3942 libcrux_sha3_generic_keccak_portable_squeeze_first_three_blocks_b4_3a(
3943     libcrux_sha3_generic_keccak_KeccakState_17 *self, Eurydice_slice out) {
3944   libcrux_sha3_simd_portable_squeeze_13_3a(self, out, (size_t)0U, (size_t)168U);
3945   libcrux_sha3_generic_keccak_keccakf1600_80_04(self);
3946   libcrux_sha3_simd_portable_squeeze_13_3a(self, out, (size_t)168U,
3947                                            (size_t)168U);
3948   libcrux_sha3_generic_keccak_keccakf1600_80_04(self);
3949   libcrux_sha3_simd_portable_squeeze_13_3a(self, out, (size_t)2U * (size_t)168U,
3950                                            (size_t)168U);
3951 }
3952 
3953 /**
3954  Squeeze three blocks
3955 */
3956 static KRML_MUSTINLINE void
libcrux_sha3_portable_incremental_shake128_squeeze_first_three_blocks(libcrux_sha3_generic_keccak_KeccakState_17 * s,Eurydice_slice out0)3957 libcrux_sha3_portable_incremental_shake128_squeeze_first_three_blocks(
3958     libcrux_sha3_generic_keccak_KeccakState_17 *s, Eurydice_slice out0) {
3959   libcrux_sha3_generic_keccak_portable_squeeze_first_three_blocks_b4_3a(s,
3960                                                                         out0);
3961 }
3962 
3963 /**
3964 This function found in impl {libcrux_sha3::generic_keccak::KeccakState<u64,
3965 1usize>[core::marker::Sized<u64>,
3966 libcrux_sha3::simd::portable::{libcrux_sha3::traits::KeccakItem<1usize> for
3967 u64}]}
3968 */
3969 /**
3970 A monomorphic instance of
3971 libcrux_sha3.generic_keccak.portable.squeeze_next_block_b4 with const generics
3972 - RATE= 168
3973 */
3974 static KRML_MUSTINLINE void
libcrux_sha3_generic_keccak_portable_squeeze_next_block_b4_3a(libcrux_sha3_generic_keccak_KeccakState_17 * self,Eurydice_slice out,size_t start)3975 libcrux_sha3_generic_keccak_portable_squeeze_next_block_b4_3a(
3976     libcrux_sha3_generic_keccak_KeccakState_17 *self, Eurydice_slice out,
3977     size_t start) {
3978   libcrux_sha3_generic_keccak_keccakf1600_80_04(self);
3979   libcrux_sha3_simd_portable_squeeze_13_3a(self, out, start, (size_t)168U);
3980 }
3981 
3982 /**
3983  Squeeze another block
3984 */
3985 static KRML_MUSTINLINE void
libcrux_sha3_portable_incremental_shake128_squeeze_next_block(libcrux_sha3_generic_keccak_KeccakState_17 * s,Eurydice_slice out0)3986 libcrux_sha3_portable_incremental_shake128_squeeze_next_block(
3987     libcrux_sha3_generic_keccak_KeccakState_17 *s, Eurydice_slice out0) {
3988   libcrux_sha3_generic_keccak_portable_squeeze_next_block_b4_3a(s, out0,
3989                                                                 (size_t)0U);
3990 }
3991 
3992 #define libcrux_sha3_Algorithm_Sha224 1
3993 #define libcrux_sha3_Algorithm_Sha256 2
3994 #define libcrux_sha3_Algorithm_Sha384 3
3995 #define libcrux_sha3_Algorithm_Sha512 4
3996 
3997 typedef uint8_t libcrux_sha3_Algorithm;
3998 
3999 typedef uint8_t libcrux_sha3_Sha3_224Digest[28U];
4000 
4001 typedef uint8_t libcrux_sha3_Sha3_256Digest[32U];
4002 
4003 typedef uint8_t libcrux_sha3_Sha3_384Digest[48U];
4004 
4005 typedef uint8_t libcrux_sha3_Sha3_512Digest[64U];
4006 
4007 /**
4008  Returns the output size of a digest.
4009 */
libcrux_sha3_digest_size(libcrux_sha3_Algorithm mode)4010 static inline size_t libcrux_sha3_digest_size(libcrux_sha3_Algorithm mode) {
4011   switch (mode) {
4012     case libcrux_sha3_Algorithm_Sha224: {
4013       break;
4014     }
4015     case libcrux_sha3_Algorithm_Sha256: {
4016       return (size_t)32U;
4017     }
4018     case libcrux_sha3_Algorithm_Sha384: {
4019       return (size_t)48U;
4020     }
4021     case libcrux_sha3_Algorithm_Sha512: {
4022       return (size_t)64U;
4023     }
4024     default: {
4025       KRML_HOST_EPRINTF("KaRaMeL incomplete match at %s:%d\n", __FILE__,
4026                         __LINE__);
4027       KRML_HOST_EXIT(253U);
4028     }
4029   }
4030   return (size_t)28U;
4031 }
4032 
4033 /**
4034 A monomorphic instance of libcrux_sha3.simd.portable.load_block
4035 with const generics
4036 - RATE= 144
4037 */
libcrux_sha3_simd_portable_load_block_2c(uint64_t * state,Eurydice_slice blocks,size_t start)4038 static KRML_MUSTINLINE void libcrux_sha3_simd_portable_load_block_2c(
4039     uint64_t *state, Eurydice_slice blocks, size_t start) {
4040   uint64_t state_flat[25U] = {0U};
4041   for (size_t i = (size_t)0U; i < (size_t)144U / (size_t)8U; i++) {
4042     size_t i0 = i;
4043     size_t offset = start + (size_t)8U * i0;
4044     uint8_t uu____0[8U];
4045     Result_15 dst;
4046     Eurydice_slice_to_array2(
4047         &dst,
4048         Eurydice_slice_subslice3(blocks, offset, offset + (size_t)8U,
4049                                  uint8_t *),
4050         Eurydice_slice, uint8_t[8U], TryFromSliceError);
4051     unwrap_26_68(dst, uu____0);
4052     state_flat[i0] = core_num__u64__from_le_bytes(uu____0);
4053   }
4054   for (size_t i = (size_t)0U; i < (size_t)144U / (size_t)8U; i++) {
4055     size_t i0 = i;
4056     libcrux_sha3_traits_set_ij_04(
4057         state, i0 / (size_t)5U, i0 % (size_t)5U,
4058         libcrux_sha3_traits_get_ij_04(state, i0 / (size_t)5U,
4059                                       i0 % (size_t)5U)[0U] ^
4060             state_flat[i0]);
4061   }
4062 }
4063 
4064 /**
4065 This function found in impl {libcrux_sha3::traits::Absorb<1usize> for
4066 libcrux_sha3::generic_keccak::KeccakState<u64, 1usize>[core::marker::Sized<u64>,
4067 libcrux_sha3::simd::portable::{libcrux_sha3::traits::KeccakItem<1usize> for
4068 u64}]}
4069 */
4070 /**
4071 A monomorphic instance of libcrux_sha3.simd.portable.load_block_a1
4072 with const generics
4073 - RATE= 144
4074 */
libcrux_sha3_simd_portable_load_block_a1_2c(libcrux_sha3_generic_keccak_KeccakState_17 * self,Eurydice_slice * input,size_t start)4075 static inline void libcrux_sha3_simd_portable_load_block_a1_2c(
4076     libcrux_sha3_generic_keccak_KeccakState_17 *self, Eurydice_slice *input,
4077     size_t start) {
4078   libcrux_sha3_simd_portable_load_block_2c(self->st, input[0U], start);
4079 }
4080 
4081 /**
4082 This function found in impl {libcrux_sha3::generic_keccak::KeccakState<T,
4083 N>[TraitClause@0, TraitClause@1]}
4084 */
4085 /**
4086 A monomorphic instance of libcrux_sha3.generic_keccak.absorb_block_80
4087 with types uint64_t
4088 with const generics
4089 - N= 1
4090 - RATE= 144
4091 */
libcrux_sha3_generic_keccak_absorb_block_80_c61(libcrux_sha3_generic_keccak_KeccakState_17 * self,Eurydice_slice * blocks,size_t start)4092 static KRML_MUSTINLINE void libcrux_sha3_generic_keccak_absorb_block_80_c61(
4093     libcrux_sha3_generic_keccak_KeccakState_17 *self, Eurydice_slice *blocks,
4094     size_t start) {
4095   libcrux_sha3_simd_portable_load_block_a1_2c(self, blocks, start);
4096   libcrux_sha3_generic_keccak_keccakf1600_80_04(self);
4097 }
4098 
4099 /**
4100 A monomorphic instance of libcrux_sha3.simd.portable.load_last
4101 with const generics
4102 - RATE= 144
4103 - DELIMITER= 6
4104 */
libcrux_sha3_simd_portable_load_last_1e(uint64_t * state,Eurydice_slice blocks,size_t start,size_t len)4105 static KRML_MUSTINLINE void libcrux_sha3_simd_portable_load_last_1e(
4106     uint64_t *state, Eurydice_slice blocks, size_t start, size_t len) {
4107   uint8_t buffer[144U] = {0U};
4108   Eurydice_slice_copy(
4109       Eurydice_array_to_subslice3(buffer, (size_t)0U, len, uint8_t *),
4110       Eurydice_slice_subslice3(blocks, start, start + len, uint8_t *), uint8_t);
4111   buffer[len] = 6U;
4112   size_t uu____0 = (size_t)144U - (size_t)1U;
4113   buffer[uu____0] = (uint32_t)buffer[uu____0] | 128U;
4114   libcrux_sha3_simd_portable_load_block_2c(
4115       state, Eurydice_array_to_slice((size_t)144U, buffer, uint8_t),
4116       (size_t)0U);
4117 }
4118 
4119 /**
4120 This function found in impl {libcrux_sha3::traits::Absorb<1usize> for
4121 libcrux_sha3::generic_keccak::KeccakState<u64, 1usize>[core::marker::Sized<u64>,
4122 libcrux_sha3::simd::portable::{libcrux_sha3::traits::KeccakItem<1usize> for
4123 u64}]}
4124 */
4125 /**
4126 A monomorphic instance of libcrux_sha3.simd.portable.load_last_a1
4127 with const generics
4128 - RATE= 144
4129 - DELIMITER= 6
4130 */
libcrux_sha3_simd_portable_load_last_a1_1e(libcrux_sha3_generic_keccak_KeccakState_17 * self,Eurydice_slice * input,size_t start,size_t len)4131 static inline void libcrux_sha3_simd_portable_load_last_a1_1e(
4132     libcrux_sha3_generic_keccak_KeccakState_17 *self, Eurydice_slice *input,
4133     size_t start, size_t len) {
4134   libcrux_sha3_simd_portable_load_last_1e(self->st, input[0U], start, len);
4135 }
4136 
4137 /**
4138 This function found in impl {libcrux_sha3::generic_keccak::KeccakState<T,
4139 N>[TraitClause@0, TraitClause@1]}
4140 */
4141 /**
4142 A monomorphic instance of libcrux_sha3.generic_keccak.absorb_final_80
4143 with types uint64_t
4144 with const generics
4145 - N= 1
4146 - RATE= 144
4147 - DELIM= 6
4148 */
libcrux_sha3_generic_keccak_absorb_final_80_9e3(libcrux_sha3_generic_keccak_KeccakState_17 * self,Eurydice_slice * last,size_t start,size_t len)4149 static KRML_MUSTINLINE void libcrux_sha3_generic_keccak_absorb_final_80_9e3(
4150     libcrux_sha3_generic_keccak_KeccakState_17 *self, Eurydice_slice *last,
4151     size_t start, size_t len) {
4152   libcrux_sha3_simd_portable_load_last_a1_1e(self, last, start, len);
4153   libcrux_sha3_generic_keccak_keccakf1600_80_04(self);
4154 }
4155 
4156 /**
4157 A monomorphic instance of libcrux_sha3.simd.portable.store_block
4158 with const generics
4159 - RATE= 144
4160 */
libcrux_sha3_simd_portable_store_block_2c(uint64_t * s,Eurydice_slice out,size_t start,size_t len)4161 static KRML_MUSTINLINE void libcrux_sha3_simd_portable_store_block_2c(
4162     uint64_t *s, Eurydice_slice out, size_t start, size_t len) {
4163   size_t octets = len / (size_t)8U;
4164   for (size_t i = (size_t)0U; i < octets; i++) {
4165     size_t i0 = i;
4166     Eurydice_slice uu____0 = Eurydice_slice_subslice3(
4167         out, start + (size_t)8U * i0, start + (size_t)8U * i0 + (size_t)8U,
4168         uint8_t *);
4169     uint8_t ret[8U];
4170     core_num__u64__to_le_bytes(
4171         libcrux_sha3_traits_get_ij_04(s, i0 / (size_t)5U, i0 % (size_t)5U)[0U],
4172         ret);
4173     Eurydice_slice_copy(
4174         uu____0, Eurydice_array_to_slice((size_t)8U, ret, uint8_t), uint8_t);
4175   }
4176   size_t remaining = len % (size_t)8U;
4177   if (remaining > (size_t)0U) {
4178     Eurydice_slice uu____1 = Eurydice_slice_subslice3(
4179         out, start + len - remaining, start + len, uint8_t *);
4180     uint8_t ret[8U];
4181     core_num__u64__to_le_bytes(
4182         libcrux_sha3_traits_get_ij_04(s, octets / (size_t)5U,
4183                                       octets % (size_t)5U)[0U],
4184         ret);
4185     Eurydice_slice_copy(
4186         uu____1,
4187         Eurydice_array_to_subslice3(ret, (size_t)0U, remaining, uint8_t *),
4188         uint8_t);
4189   }
4190 }
4191 
4192 /**
4193 This function found in impl {libcrux_sha3::traits::Squeeze1<u64> for
4194 libcrux_sha3::generic_keccak::KeccakState<u64, 1usize>[core::marker::Sized<u64>,
4195 libcrux_sha3::simd::portable::{libcrux_sha3::traits::KeccakItem<1usize> for
4196 u64}]}
4197 */
4198 /**
4199 A monomorphic instance of libcrux_sha3.simd.portable.squeeze_13
4200 with const generics
4201 - RATE= 144
4202 */
libcrux_sha3_simd_portable_squeeze_13_2c(libcrux_sha3_generic_keccak_KeccakState_17 * self,Eurydice_slice out,size_t start,size_t len)4203 static inline void libcrux_sha3_simd_portable_squeeze_13_2c(
4204     libcrux_sha3_generic_keccak_KeccakState_17 *self, Eurydice_slice out,
4205     size_t start, size_t len) {
4206   libcrux_sha3_simd_portable_store_block_2c(self->st, out, start, len);
4207 }
4208 
4209 /**
4210 A monomorphic instance of libcrux_sha3.generic_keccak.portable.keccak1
4211 with const generics
4212 - RATE= 144
4213 - DELIM= 6
4214 */
libcrux_sha3_generic_keccak_portable_keccak1_1e(Eurydice_slice data,Eurydice_slice out)4215 static inline void libcrux_sha3_generic_keccak_portable_keccak1_1e(
4216     Eurydice_slice data, Eurydice_slice out) {
4217   libcrux_sha3_generic_keccak_KeccakState_17 s =
4218       libcrux_sha3_generic_keccak_new_80_04();
4219   size_t data_len = Eurydice_slice_len(data, uint8_t);
4220   for (size_t i = (size_t)0U; i < data_len / (size_t)144U; i++) {
4221     size_t i0 = i;
4222     Eurydice_slice buf[1U] = {data};
4223     libcrux_sha3_generic_keccak_absorb_block_80_c61(&s, buf, i0 * (size_t)144U);
4224   }
4225   size_t rem = data_len % (size_t)144U;
4226   Eurydice_slice buf[1U] = {data};
4227   libcrux_sha3_generic_keccak_absorb_final_80_9e3(&s, buf, data_len - rem, rem);
4228   size_t outlen = Eurydice_slice_len(out, uint8_t);
4229   size_t blocks = outlen / (size_t)144U;
4230   size_t last = outlen - outlen % (size_t)144U;
4231   if (blocks == (size_t)0U) {
4232     libcrux_sha3_simd_portable_squeeze_13_2c(&s, out, (size_t)0U, outlen);
4233   } else {
4234     libcrux_sha3_simd_portable_squeeze_13_2c(&s, out, (size_t)0U, (size_t)144U);
4235     for (size_t i = (size_t)1U; i < blocks; i++) {
4236       size_t i0 = i;
4237       libcrux_sha3_generic_keccak_keccakf1600_80_04(&s);
4238       libcrux_sha3_simd_portable_squeeze_13_2c(&s, out, i0 * (size_t)144U,
4239                                                (size_t)144U);
4240     }
4241     if (last < outlen) {
4242       libcrux_sha3_generic_keccak_keccakf1600_80_04(&s);
4243       libcrux_sha3_simd_portable_squeeze_13_2c(&s, out, last, outlen - last);
4244     }
4245   }
4246 }
4247 
4248 /**
4249  A portable SHA3 224 implementation.
4250 */
libcrux_sha3_portable_sha224(Eurydice_slice digest,Eurydice_slice data)4251 static KRML_MUSTINLINE void libcrux_sha3_portable_sha224(Eurydice_slice digest,
4252                                                          Eurydice_slice data) {
4253   libcrux_sha3_generic_keccak_portable_keccak1_1e(data, digest);
4254 }
4255 
4256 /**
4257 A monomorphic instance of libcrux_sha3.simd.portable.load_block
4258 with const generics
4259 - RATE= 104
4260 */
libcrux_sha3_simd_portable_load_block_7a(uint64_t * state,Eurydice_slice blocks,size_t start)4261 static KRML_MUSTINLINE void libcrux_sha3_simd_portable_load_block_7a(
4262     uint64_t *state, Eurydice_slice blocks, size_t start) {
4263   uint64_t state_flat[25U] = {0U};
4264   for (size_t i = (size_t)0U; i < (size_t)104U / (size_t)8U; i++) {
4265     size_t i0 = i;
4266     size_t offset = start + (size_t)8U * i0;
4267     uint8_t uu____0[8U];
4268     Result_15 dst;
4269     Eurydice_slice_to_array2(
4270         &dst,
4271         Eurydice_slice_subslice3(blocks, offset, offset + (size_t)8U,
4272                                  uint8_t *),
4273         Eurydice_slice, uint8_t[8U], TryFromSliceError);
4274     unwrap_26_68(dst, uu____0);
4275     state_flat[i0] = core_num__u64__from_le_bytes(uu____0);
4276   }
4277   for (size_t i = (size_t)0U; i < (size_t)104U / (size_t)8U; i++) {
4278     size_t i0 = i;
4279     libcrux_sha3_traits_set_ij_04(
4280         state, i0 / (size_t)5U, i0 % (size_t)5U,
4281         libcrux_sha3_traits_get_ij_04(state, i0 / (size_t)5U,
4282                                       i0 % (size_t)5U)[0U] ^
4283             state_flat[i0]);
4284   }
4285 }
4286 
4287 /**
4288 This function found in impl {libcrux_sha3::traits::Absorb<1usize> for
4289 libcrux_sha3::generic_keccak::KeccakState<u64, 1usize>[core::marker::Sized<u64>,
4290 libcrux_sha3::simd::portable::{libcrux_sha3::traits::KeccakItem<1usize> for
4291 u64}]}
4292 */
4293 /**
4294 A monomorphic instance of libcrux_sha3.simd.portable.load_block_a1
4295 with const generics
4296 - RATE= 104
4297 */
libcrux_sha3_simd_portable_load_block_a1_7a(libcrux_sha3_generic_keccak_KeccakState_17 * self,Eurydice_slice * input,size_t start)4298 static inline void libcrux_sha3_simd_portable_load_block_a1_7a(
4299     libcrux_sha3_generic_keccak_KeccakState_17 *self, Eurydice_slice *input,
4300     size_t start) {
4301   libcrux_sha3_simd_portable_load_block_7a(self->st, input[0U], start);
4302 }
4303 
4304 /**
4305 This function found in impl {libcrux_sha3::generic_keccak::KeccakState<T,
4306 N>[TraitClause@0, TraitClause@1]}
4307 */
4308 /**
4309 A monomorphic instance of libcrux_sha3.generic_keccak.absorb_block_80
4310 with types uint64_t
4311 with const generics
4312 - N= 1
4313 - RATE= 104
4314 */
libcrux_sha3_generic_keccak_absorb_block_80_c62(libcrux_sha3_generic_keccak_KeccakState_17 * self,Eurydice_slice * blocks,size_t start)4315 static KRML_MUSTINLINE void libcrux_sha3_generic_keccak_absorb_block_80_c62(
4316     libcrux_sha3_generic_keccak_KeccakState_17 *self, Eurydice_slice *blocks,
4317     size_t start) {
4318   libcrux_sha3_simd_portable_load_block_a1_7a(self, blocks, start);
4319   libcrux_sha3_generic_keccak_keccakf1600_80_04(self);
4320 }
4321 
4322 /**
4323 A monomorphic instance of libcrux_sha3.simd.portable.load_last
4324 with const generics
4325 - RATE= 104
4326 - DELIMITER= 6
4327 */
libcrux_sha3_simd_portable_load_last_7c(uint64_t * state,Eurydice_slice blocks,size_t start,size_t len)4328 static KRML_MUSTINLINE void libcrux_sha3_simd_portable_load_last_7c(
4329     uint64_t *state, Eurydice_slice blocks, size_t start, size_t len) {
4330   uint8_t buffer[104U] = {0U};
4331   Eurydice_slice_copy(
4332       Eurydice_array_to_subslice3(buffer, (size_t)0U, len, uint8_t *),
4333       Eurydice_slice_subslice3(blocks, start, start + len, uint8_t *), uint8_t);
4334   buffer[len] = 6U;
4335   size_t uu____0 = (size_t)104U - (size_t)1U;
4336   buffer[uu____0] = (uint32_t)buffer[uu____0] | 128U;
4337   libcrux_sha3_simd_portable_load_block_7a(
4338       state, Eurydice_array_to_slice((size_t)104U, buffer, uint8_t),
4339       (size_t)0U);
4340 }
4341 
4342 /**
4343 This function found in impl {libcrux_sha3::traits::Absorb<1usize> for
4344 libcrux_sha3::generic_keccak::KeccakState<u64, 1usize>[core::marker::Sized<u64>,
4345 libcrux_sha3::simd::portable::{libcrux_sha3::traits::KeccakItem<1usize> for
4346 u64}]}
4347 */
4348 /**
4349 A monomorphic instance of libcrux_sha3.simd.portable.load_last_a1
4350 with const generics
4351 - RATE= 104
4352 - DELIMITER= 6
4353 */
libcrux_sha3_simd_portable_load_last_a1_7c(libcrux_sha3_generic_keccak_KeccakState_17 * self,Eurydice_slice * input,size_t start,size_t len)4354 static inline void libcrux_sha3_simd_portable_load_last_a1_7c(
4355     libcrux_sha3_generic_keccak_KeccakState_17 *self, Eurydice_slice *input,
4356     size_t start, size_t len) {
4357   libcrux_sha3_simd_portable_load_last_7c(self->st, input[0U], start, len);
4358 }
4359 
4360 /**
4361 This function found in impl {libcrux_sha3::generic_keccak::KeccakState<T,
4362 N>[TraitClause@0, TraitClause@1]}
4363 */
4364 /**
4365 A monomorphic instance of libcrux_sha3.generic_keccak.absorb_final_80
4366 with types uint64_t
4367 with const generics
4368 - N= 1
4369 - RATE= 104
4370 - DELIM= 6
4371 */
libcrux_sha3_generic_keccak_absorb_final_80_9e4(libcrux_sha3_generic_keccak_KeccakState_17 * self,Eurydice_slice * last,size_t start,size_t len)4372 static KRML_MUSTINLINE void libcrux_sha3_generic_keccak_absorb_final_80_9e4(
4373     libcrux_sha3_generic_keccak_KeccakState_17 *self, Eurydice_slice *last,
4374     size_t start, size_t len) {
4375   libcrux_sha3_simd_portable_load_last_a1_7c(self, last, start, len);
4376   libcrux_sha3_generic_keccak_keccakf1600_80_04(self);
4377 }
4378 
4379 /**
4380 A monomorphic instance of libcrux_sha3.simd.portable.store_block
4381 with const generics
4382 - RATE= 104
4383 */
libcrux_sha3_simd_portable_store_block_7a(uint64_t * s,Eurydice_slice out,size_t start,size_t len)4384 static KRML_MUSTINLINE void libcrux_sha3_simd_portable_store_block_7a(
4385     uint64_t *s, Eurydice_slice out, size_t start, size_t len) {
4386   size_t octets = len / (size_t)8U;
4387   for (size_t i = (size_t)0U; i < octets; i++) {
4388     size_t i0 = i;
4389     Eurydice_slice uu____0 = Eurydice_slice_subslice3(
4390         out, start + (size_t)8U * i0, start + (size_t)8U * i0 + (size_t)8U,
4391         uint8_t *);
4392     uint8_t ret[8U];
4393     core_num__u64__to_le_bytes(
4394         libcrux_sha3_traits_get_ij_04(s, i0 / (size_t)5U, i0 % (size_t)5U)[0U],
4395         ret);
4396     Eurydice_slice_copy(
4397         uu____0, Eurydice_array_to_slice((size_t)8U, ret, uint8_t), uint8_t);
4398   }
4399   size_t remaining = len % (size_t)8U;
4400   if (remaining > (size_t)0U) {
4401     Eurydice_slice uu____1 = Eurydice_slice_subslice3(
4402         out, start + len - remaining, start + len, uint8_t *);
4403     uint8_t ret[8U];
4404     core_num__u64__to_le_bytes(
4405         libcrux_sha3_traits_get_ij_04(s, octets / (size_t)5U,
4406                                       octets % (size_t)5U)[0U],
4407         ret);
4408     Eurydice_slice_copy(
4409         uu____1,
4410         Eurydice_array_to_subslice3(ret, (size_t)0U, remaining, uint8_t *),
4411         uint8_t);
4412   }
4413 }
4414 
4415 /**
4416 This function found in impl {libcrux_sha3::traits::Squeeze1<u64> for
4417 libcrux_sha3::generic_keccak::KeccakState<u64, 1usize>[core::marker::Sized<u64>,
4418 libcrux_sha3::simd::portable::{libcrux_sha3::traits::KeccakItem<1usize> for
4419 u64}]}
4420 */
4421 /**
4422 A monomorphic instance of libcrux_sha3.simd.portable.squeeze_13
4423 with const generics
4424 - RATE= 104
4425 */
libcrux_sha3_simd_portable_squeeze_13_7a(libcrux_sha3_generic_keccak_KeccakState_17 * self,Eurydice_slice out,size_t start,size_t len)4426 static inline void libcrux_sha3_simd_portable_squeeze_13_7a(
4427     libcrux_sha3_generic_keccak_KeccakState_17 *self, Eurydice_slice out,
4428     size_t start, size_t len) {
4429   libcrux_sha3_simd_portable_store_block_7a(self->st, out, start, len);
4430 }
4431 
4432 /**
4433 A monomorphic instance of libcrux_sha3.generic_keccak.portable.keccak1
4434 with const generics
4435 - RATE= 104
4436 - DELIM= 6
4437 */
libcrux_sha3_generic_keccak_portable_keccak1_7c(Eurydice_slice data,Eurydice_slice out)4438 static inline void libcrux_sha3_generic_keccak_portable_keccak1_7c(
4439     Eurydice_slice data, Eurydice_slice out) {
4440   libcrux_sha3_generic_keccak_KeccakState_17 s =
4441       libcrux_sha3_generic_keccak_new_80_04();
4442   size_t data_len = Eurydice_slice_len(data, uint8_t);
4443   for (size_t i = (size_t)0U; i < data_len / (size_t)104U; i++) {
4444     size_t i0 = i;
4445     Eurydice_slice buf[1U] = {data};
4446     libcrux_sha3_generic_keccak_absorb_block_80_c62(&s, buf, i0 * (size_t)104U);
4447   }
4448   size_t rem = data_len % (size_t)104U;
4449   Eurydice_slice buf[1U] = {data};
4450   libcrux_sha3_generic_keccak_absorb_final_80_9e4(&s, buf, data_len - rem, rem);
4451   size_t outlen = Eurydice_slice_len(out, uint8_t);
4452   size_t blocks = outlen / (size_t)104U;
4453   size_t last = outlen - outlen % (size_t)104U;
4454   if (blocks == (size_t)0U) {
4455     libcrux_sha3_simd_portable_squeeze_13_7a(&s, out, (size_t)0U, outlen);
4456   } else {
4457     libcrux_sha3_simd_portable_squeeze_13_7a(&s, out, (size_t)0U, (size_t)104U);
4458     for (size_t i = (size_t)1U; i < blocks; i++) {
4459       size_t i0 = i;
4460       libcrux_sha3_generic_keccak_keccakf1600_80_04(&s);
4461       libcrux_sha3_simd_portable_squeeze_13_7a(&s, out, i0 * (size_t)104U,
4462                                                (size_t)104U);
4463     }
4464     if (last < outlen) {
4465       libcrux_sha3_generic_keccak_keccakf1600_80_04(&s);
4466       libcrux_sha3_simd_portable_squeeze_13_7a(&s, out, last, outlen - last);
4467     }
4468   }
4469 }
4470 
4471 /**
4472  A portable SHA3 384 implementation.
4473 */
libcrux_sha3_portable_sha384(Eurydice_slice digest,Eurydice_slice data)4474 static KRML_MUSTINLINE void libcrux_sha3_portable_sha384(Eurydice_slice digest,
4475                                                          Eurydice_slice data) {
4476   libcrux_sha3_generic_keccak_portable_keccak1_7c(data, digest);
4477 }
4478 
4479 /**
4480  SHA3 224
4481 
4482  Preconditions:
4483  - `digest.len() == 28`
4484 */
libcrux_sha3_sha224_ema(Eurydice_slice digest,Eurydice_slice payload)4485 static inline void libcrux_sha3_sha224_ema(Eurydice_slice digest,
4486                                            Eurydice_slice payload) {
4487   libcrux_sha3_portable_sha224(digest, payload);
4488 }
4489 
4490 /**
4491  SHA3 224
4492 */
libcrux_sha3_sha224(Eurydice_slice data,uint8_t ret[28U])4493 static inline void libcrux_sha3_sha224(Eurydice_slice data, uint8_t ret[28U]) {
4494   uint8_t out[28U] = {0U};
4495   libcrux_sha3_sha224_ema(Eurydice_array_to_slice((size_t)28U, out, uint8_t),
4496                           data);
4497   memcpy(ret, out, (size_t)28U * sizeof(uint8_t));
4498 }
4499 
4500 /**
4501  SHA3 256
4502 */
libcrux_sha3_sha256_ema(Eurydice_slice digest,Eurydice_slice payload)4503 static inline void libcrux_sha3_sha256_ema(Eurydice_slice digest,
4504                                            Eurydice_slice payload) {
4505   libcrux_sha3_portable_sha256(digest, payload);
4506 }
4507 
4508 /**
4509  SHA3 256
4510 */
libcrux_sha3_sha256(Eurydice_slice data,uint8_t ret[32U])4511 static inline void libcrux_sha3_sha256(Eurydice_slice data, uint8_t ret[32U]) {
4512   uint8_t out[32U] = {0U};
4513   libcrux_sha3_sha256_ema(Eurydice_array_to_slice((size_t)32U, out, uint8_t),
4514                           data);
4515   memcpy(ret, out, (size_t)32U * sizeof(uint8_t));
4516 }
4517 
4518 /**
4519  SHA3 384
4520 */
libcrux_sha3_sha384_ema(Eurydice_slice digest,Eurydice_slice payload)4521 static inline void libcrux_sha3_sha384_ema(Eurydice_slice digest,
4522                                            Eurydice_slice payload) {
4523   libcrux_sha3_portable_sha384(digest, payload);
4524 }
4525 
4526 /**
4527  SHA3 384
4528 */
libcrux_sha3_sha384(Eurydice_slice data,uint8_t ret[48U])4529 static inline void libcrux_sha3_sha384(Eurydice_slice data, uint8_t ret[48U]) {
4530   uint8_t out[48U] = {0U};
4531   libcrux_sha3_sha384_ema(Eurydice_array_to_slice((size_t)48U, out, uint8_t),
4532                           data);
4533   memcpy(ret, out, (size_t)48U * sizeof(uint8_t));
4534 }
4535 
4536 /**
4537  SHA3 512
4538 */
libcrux_sha3_sha512_ema(Eurydice_slice digest,Eurydice_slice payload)4539 static inline void libcrux_sha3_sha512_ema(Eurydice_slice digest,
4540                                            Eurydice_slice payload) {
4541   libcrux_sha3_portable_sha512(digest, payload);
4542 }
4543 
4544 /**
4545  SHA3 512
4546 */
libcrux_sha3_sha512(Eurydice_slice data,uint8_t ret[64U])4547 static inline void libcrux_sha3_sha512(Eurydice_slice data, uint8_t ret[64U]) {
4548   uint8_t out[64U] = {0U};
4549   libcrux_sha3_sha512_ema(Eurydice_array_to_slice((size_t)64U, out, uint8_t),
4550                           data);
4551   memcpy(ret, out, (size_t)64U * sizeof(uint8_t));
4552 }
4553 
4554 /**
4555 This function found in impl {libcrux_sha3::traits::Absorb<1usize> for
4556 libcrux_sha3::generic_keccak::KeccakState<u64, 1usize>[core::marker::Sized<u64>,
4557 libcrux_sha3::simd::portable::{libcrux_sha3::traits::KeccakItem<1usize> for
4558 u64}]}
4559 */
4560 /**
4561 A monomorphic instance of libcrux_sha3.simd.portable.load_block_a1
4562 with const generics
4563 - RATE= 168
4564 */
libcrux_sha3_simd_portable_load_block_a1_3a(libcrux_sha3_generic_keccak_KeccakState_17 * self,Eurydice_slice * input,size_t start)4565 static inline void libcrux_sha3_simd_portable_load_block_a1_3a(
4566     libcrux_sha3_generic_keccak_KeccakState_17 *self, Eurydice_slice *input,
4567     size_t start) {
4568   libcrux_sha3_simd_portable_load_block_3a(self->st, input[0U], start);
4569 }
4570 
4571 /**
4572 This function found in impl {libcrux_sha3::generic_keccak::KeccakState<T,
4573 N>[TraitClause@0, TraitClause@1]}
4574 */
4575 /**
4576 A monomorphic instance of libcrux_sha3.generic_keccak.absorb_block_80
4577 with types uint64_t
4578 with const generics
4579 - N= 1
4580 - RATE= 168
4581 */
libcrux_sha3_generic_keccak_absorb_block_80_c63(libcrux_sha3_generic_keccak_KeccakState_17 * self,Eurydice_slice * blocks,size_t start)4582 static KRML_MUSTINLINE void libcrux_sha3_generic_keccak_absorb_block_80_c63(
4583     libcrux_sha3_generic_keccak_KeccakState_17 *self, Eurydice_slice *blocks,
4584     size_t start) {
4585   libcrux_sha3_simd_portable_load_block_a1_3a(self, blocks, start);
4586   libcrux_sha3_generic_keccak_keccakf1600_80_04(self);
4587 }
4588 
4589 /**
4590 A monomorphic instance of libcrux_sha3.generic_keccak.portable.keccak1
4591 with const generics
4592 - RATE= 168
4593 - DELIM= 31
4594 */
libcrux_sha3_generic_keccak_portable_keccak1_c6(Eurydice_slice data,Eurydice_slice out)4595 static inline void libcrux_sha3_generic_keccak_portable_keccak1_c6(
4596     Eurydice_slice data, Eurydice_slice out) {
4597   libcrux_sha3_generic_keccak_KeccakState_17 s =
4598       libcrux_sha3_generic_keccak_new_80_04();
4599   size_t data_len = Eurydice_slice_len(data, uint8_t);
4600   for (size_t i = (size_t)0U; i < data_len / (size_t)168U; i++) {
4601     size_t i0 = i;
4602     Eurydice_slice buf[1U] = {data};
4603     libcrux_sha3_generic_keccak_absorb_block_80_c63(&s, buf, i0 * (size_t)168U);
4604   }
4605   size_t rem = data_len % (size_t)168U;
4606   Eurydice_slice buf[1U] = {data};
4607   libcrux_sha3_generic_keccak_absorb_final_80_9e2(&s, buf, data_len - rem, rem);
4608   size_t outlen = Eurydice_slice_len(out, uint8_t);
4609   size_t blocks = outlen / (size_t)168U;
4610   size_t last = outlen - outlen % (size_t)168U;
4611   if (blocks == (size_t)0U) {
4612     libcrux_sha3_simd_portable_squeeze_13_3a(&s, out, (size_t)0U, outlen);
4613   } else {
4614     libcrux_sha3_simd_portable_squeeze_13_3a(&s, out, (size_t)0U, (size_t)168U);
4615     for (size_t i = (size_t)1U; i < blocks; i++) {
4616       size_t i0 = i;
4617       libcrux_sha3_generic_keccak_keccakf1600_80_04(&s);
4618       libcrux_sha3_simd_portable_squeeze_13_3a(&s, out, i0 * (size_t)168U,
4619                                                (size_t)168U);
4620     }
4621     if (last < outlen) {
4622       libcrux_sha3_generic_keccak_keccakf1600_80_04(&s);
4623       libcrux_sha3_simd_portable_squeeze_13_3a(&s, out, last, outlen - last);
4624     }
4625   }
4626 }
4627 
4628 /**
4629  A portable SHAKE128 implementation.
4630 */
libcrux_sha3_portable_shake128(Eurydice_slice digest,Eurydice_slice data)4631 static KRML_MUSTINLINE void libcrux_sha3_portable_shake128(
4632     Eurydice_slice digest, Eurydice_slice data) {
4633   libcrux_sha3_generic_keccak_portable_keccak1_c6(data, digest);
4634 }
4635 
4636 /**
4637  SHAKE 128
4638 
4639  Writes `out.len()` bytes.
4640 */
libcrux_sha3_shake128_ema(Eurydice_slice out,Eurydice_slice data)4641 static inline void libcrux_sha3_shake128_ema(Eurydice_slice out,
4642                                              Eurydice_slice data) {
4643   libcrux_sha3_portable_shake128(out, data);
4644 }
4645 
4646 /**
4647  SHAKE 256
4648 
4649  Writes `out.len()` bytes.
4650 */
libcrux_sha3_shake256_ema(Eurydice_slice out,Eurydice_slice data)4651 static inline void libcrux_sha3_shake256_ema(Eurydice_slice out,
4652                                              Eurydice_slice data) {
4653   libcrux_sha3_portable_shake256(out, data);
4654 }
4655 
4656 /**
4657 This function found in impl {libcrux_sha3::generic_keccak::KeccakState<u64,
4658 1usize>[core::marker::Sized<u64>,
4659 libcrux_sha3::simd::portable::{libcrux_sha3::traits::KeccakItem<1usize> for
4660 u64}]}
4661 */
4662 /**
4663 A monomorphic instance of
4664 libcrux_sha3.generic_keccak.portable.squeeze_first_five_blocks_b4 with const
4665 generics
4666 - RATE= 168
4667 */
4668 static KRML_MUSTINLINE void
libcrux_sha3_generic_keccak_portable_squeeze_first_five_blocks_b4_3a(libcrux_sha3_generic_keccak_KeccakState_17 * self,Eurydice_slice out)4669 libcrux_sha3_generic_keccak_portable_squeeze_first_five_blocks_b4_3a(
4670     libcrux_sha3_generic_keccak_KeccakState_17 *self, Eurydice_slice out) {
4671   libcrux_sha3_simd_portable_squeeze_13_3a(self, out, (size_t)0U, (size_t)168U);
4672   libcrux_sha3_generic_keccak_keccakf1600_80_04(self);
4673   libcrux_sha3_simd_portable_squeeze_13_3a(self, out, (size_t)168U,
4674                                            (size_t)168U);
4675   libcrux_sha3_generic_keccak_keccakf1600_80_04(self);
4676   libcrux_sha3_simd_portable_squeeze_13_3a(self, out, (size_t)2U * (size_t)168U,
4677                                            (size_t)168U);
4678   libcrux_sha3_generic_keccak_keccakf1600_80_04(self);
4679   libcrux_sha3_simd_portable_squeeze_13_3a(self, out, (size_t)3U * (size_t)168U,
4680                                            (size_t)168U);
4681   libcrux_sha3_generic_keccak_keccakf1600_80_04(self);
4682   libcrux_sha3_simd_portable_squeeze_13_3a(self, out, (size_t)4U * (size_t)168U,
4683                                            (size_t)168U);
4684 }
4685 
4686 /**
4687  Squeeze five blocks
4688 */
4689 static KRML_MUSTINLINE void
libcrux_sha3_portable_incremental_shake128_squeeze_first_five_blocks(libcrux_sha3_generic_keccak_KeccakState_17 * s,Eurydice_slice out0)4690 libcrux_sha3_portable_incremental_shake128_squeeze_first_five_blocks(
4691     libcrux_sha3_generic_keccak_KeccakState_17 *s, Eurydice_slice out0) {
4692   libcrux_sha3_generic_keccak_portable_squeeze_first_five_blocks_b4_3a(s, out0);
4693 }
4694 
4695 /**
4696  Absorb some data for SHAKE-256 for the last time
4697 */
4698 static KRML_MUSTINLINE void
libcrux_sha3_portable_incremental_shake256_absorb_final(libcrux_sha3_generic_keccak_KeccakState_17 * s,Eurydice_slice data)4699 libcrux_sha3_portable_incremental_shake256_absorb_final(
4700     libcrux_sha3_generic_keccak_KeccakState_17 *s, Eurydice_slice data) {
4701   libcrux_sha3_generic_keccak_KeccakState_17 *uu____0 = s;
4702   Eurydice_slice uu____1[1U] = {data};
4703   libcrux_sha3_generic_keccak_absorb_final_80_9e1(
4704       uu____0, uu____1, (size_t)0U, Eurydice_slice_len(data, uint8_t));
4705 }
4706 
4707 /**
4708  Create a new SHAKE-256 state object.
4709 */
4710 static KRML_MUSTINLINE libcrux_sha3_generic_keccak_KeccakState_17
libcrux_sha3_portable_incremental_shake256_init(void)4711 libcrux_sha3_portable_incremental_shake256_init(void) {
4712   return libcrux_sha3_generic_keccak_new_80_04();
4713 }
4714 
4715 /**
4716 This function found in impl {libcrux_sha3::generic_keccak::KeccakState<u64,
4717 1usize>[core::marker::Sized<u64>,
4718 libcrux_sha3::simd::portable::{libcrux_sha3::traits::KeccakItem<1usize> for
4719 u64}]}
4720 */
4721 /**
4722 A monomorphic instance of
4723 libcrux_sha3.generic_keccak.portable.squeeze_first_block_b4 with const generics
4724 - RATE= 136
4725 */
4726 static KRML_MUSTINLINE void
libcrux_sha3_generic_keccak_portable_squeeze_first_block_b4_5b(libcrux_sha3_generic_keccak_KeccakState_17 * self,Eurydice_slice out)4727 libcrux_sha3_generic_keccak_portable_squeeze_first_block_b4_5b(
4728     libcrux_sha3_generic_keccak_KeccakState_17 *self, Eurydice_slice out) {
4729   libcrux_sha3_simd_portable_squeeze_13_5b(self, out, (size_t)0U, (size_t)136U);
4730 }
4731 
4732 /**
4733  Squeeze the first SHAKE-256 block
4734 */
4735 static KRML_MUSTINLINE void
libcrux_sha3_portable_incremental_shake256_squeeze_first_block(libcrux_sha3_generic_keccak_KeccakState_17 * s,Eurydice_slice out)4736 libcrux_sha3_portable_incremental_shake256_squeeze_first_block(
4737     libcrux_sha3_generic_keccak_KeccakState_17 *s, Eurydice_slice out) {
4738   libcrux_sha3_generic_keccak_portable_squeeze_first_block_b4_5b(s, out);
4739 }
4740 
4741 /**
4742 This function found in impl {libcrux_sha3::generic_keccak::KeccakState<u64,
4743 1usize>[core::marker::Sized<u64>,
4744 libcrux_sha3::simd::portable::{libcrux_sha3::traits::KeccakItem<1usize> for
4745 u64}]}
4746 */
4747 /**
4748 A monomorphic instance of
4749 libcrux_sha3.generic_keccak.portable.squeeze_next_block_b4 with const generics
4750 - RATE= 136
4751 */
4752 static KRML_MUSTINLINE void
libcrux_sha3_generic_keccak_portable_squeeze_next_block_b4_5b(libcrux_sha3_generic_keccak_KeccakState_17 * self,Eurydice_slice out,size_t start)4753 libcrux_sha3_generic_keccak_portable_squeeze_next_block_b4_5b(
4754     libcrux_sha3_generic_keccak_KeccakState_17 *self, Eurydice_slice out,
4755     size_t start) {
4756   libcrux_sha3_generic_keccak_keccakf1600_80_04(self);
4757   libcrux_sha3_simd_portable_squeeze_13_5b(self, out, start, (size_t)136U);
4758 }
4759 
4760 /**
4761  Squeeze the next SHAKE-256 block
4762 */
4763 static KRML_MUSTINLINE void
libcrux_sha3_portable_incremental_shake256_squeeze_next_block(libcrux_sha3_generic_keccak_KeccakState_17 * s,Eurydice_slice out)4764 libcrux_sha3_portable_incremental_shake256_squeeze_next_block(
4765     libcrux_sha3_generic_keccak_KeccakState_17 *s, Eurydice_slice out) {
4766   libcrux_sha3_generic_keccak_portable_squeeze_next_block_b4_5b(s, out,
4767                                                                 (size_t)0U);
4768 }
4769 
4770 /**
4771 A monomorphic instance of libcrux_sha3.generic_keccak.xof.KeccakXofState
4772 with types uint64_t
4773 with const generics
4774 - $1size_t
4775 - $136size_t
4776 */
4777 typedef struct libcrux_sha3_generic_keccak_xof_KeccakXofState_e2_s {
4778   libcrux_sha3_generic_keccak_KeccakState_17 inner;
4779   uint8_t buf[1U][136U];
4780   size_t buf_len;
4781   bool sponge;
4782 } libcrux_sha3_generic_keccak_xof_KeccakXofState_e2;
4783 
4784 typedef libcrux_sha3_generic_keccak_xof_KeccakXofState_e2
4785     libcrux_sha3_portable_incremental_Shake256Xof;
4786 
4787 /**
4788 This function found in impl
4789 {libcrux_sha3::generic_keccak::xof::KeccakXofState<STATE, PARALLEL_LANES,
4790 RATE>[TraitClause@0, TraitClause@1]}
4791 */
4792 /**
4793 A monomorphic instance of libcrux_sha3.generic_keccak.xof.fill_buffer_35
4794 with types uint64_t
4795 with const generics
4796 - PARALLEL_LANES= 1
4797 - RATE= 136
4798 */
libcrux_sha3_generic_keccak_xof_fill_buffer_35_c6(libcrux_sha3_generic_keccak_xof_KeccakXofState_e2 * self,Eurydice_slice * inputs)4799 static inline size_t libcrux_sha3_generic_keccak_xof_fill_buffer_35_c6(
4800     libcrux_sha3_generic_keccak_xof_KeccakXofState_e2 *self,
4801     Eurydice_slice *inputs) {
4802   size_t input_len = Eurydice_slice_len(inputs[0U], uint8_t);
4803   size_t consumed = (size_t)0U;
4804   if (self->buf_len > (size_t)0U) {
4805     if (self->buf_len + input_len >= (size_t)136U) {
4806       consumed = (size_t)136U - self->buf_len;
4807       for (size_t i = (size_t)0U; i < (size_t)1U; i++) {
4808         size_t i0 = i;
4809         Eurydice_slice uu____0 = Eurydice_array_to_subslice_from(
4810             (size_t)136U, self->buf[i0], self->buf_len, uint8_t, size_t,
4811             uint8_t[]);
4812         Eurydice_slice_copy(
4813             uu____0,
4814             Eurydice_slice_subslice_to(inputs[i0], consumed, uint8_t, size_t,
4815                                        uint8_t[]),
4816             uint8_t);
4817       }
4818       self->buf_len = self->buf_len + consumed;
4819     }
4820   }
4821   return consumed;
4822 }
4823 
4824 /**
4825 This function found in impl
4826 {libcrux_sha3::generic_keccak::xof::KeccakXofState<STATE, PARALLEL_LANES,
4827 RATE>[TraitClause@0, TraitClause@1]}
4828 */
4829 /**
4830 A monomorphic instance of libcrux_sha3.generic_keccak.xof.absorb_full_35
4831 with types uint64_t
4832 with const generics
4833 - PARALLEL_LANES= 1
4834 - RATE= 136
4835 */
libcrux_sha3_generic_keccak_xof_absorb_full_35_c6(libcrux_sha3_generic_keccak_xof_KeccakXofState_e2 * self,Eurydice_slice * inputs)4836 static inline size_t libcrux_sha3_generic_keccak_xof_absorb_full_35_c6(
4837     libcrux_sha3_generic_keccak_xof_KeccakXofState_e2 *self,
4838     Eurydice_slice *inputs) {
4839   size_t input_consumed =
4840       libcrux_sha3_generic_keccak_xof_fill_buffer_35_c6(self, inputs);
4841   if (input_consumed > (size_t)0U) {
4842     Eurydice_slice borrowed[1U];
4843     for (size_t i = (size_t)0U; i < (size_t)1U; i++) {
4844       uint8_t buf[136U] = {0U};
4845       borrowed[i] = core_array___Array_T__N___as_slice((size_t)136U, buf,
4846                                                        uint8_t, Eurydice_slice);
4847     }
4848     for (size_t i = (size_t)0U; i < (size_t)1U; i++) {
4849       size_t i0 = i;
4850       borrowed[i0] =
4851           Eurydice_array_to_slice((size_t)136U, self->buf[i0], uint8_t);
4852     }
4853     libcrux_sha3_simd_portable_load_block_a1_5b(&self->inner, borrowed,
4854                                                 (size_t)0U);
4855     libcrux_sha3_generic_keccak_keccakf1600_80_04(&self->inner);
4856     self->buf_len = (size_t)0U;
4857   }
4858   size_t input_to_consume =
4859       Eurydice_slice_len(inputs[0U], uint8_t) - input_consumed;
4860   size_t num_blocks = input_to_consume / (size_t)136U;
4861   size_t remainder = input_to_consume % (size_t)136U;
4862   for (size_t i = (size_t)0U; i < num_blocks; i++) {
4863     size_t i0 = i;
4864     libcrux_sha3_simd_portable_load_block_a1_5b(
4865         &self->inner, inputs, input_consumed + i0 * (size_t)136U);
4866     libcrux_sha3_generic_keccak_keccakf1600_80_04(&self->inner);
4867   }
4868   return remainder;
4869 }
4870 
4871 /**
4872 This function found in impl
4873 {libcrux_sha3::generic_keccak::xof::KeccakXofState<STATE, PARALLEL_LANES,
4874 RATE>[TraitClause@0, TraitClause@1]}
4875 */
4876 /**
4877 A monomorphic instance of libcrux_sha3.generic_keccak.xof.absorb_35
4878 with types uint64_t
4879 with const generics
4880 - PARALLEL_LANES= 1
4881 - RATE= 136
4882 */
libcrux_sha3_generic_keccak_xof_absorb_35_c6(libcrux_sha3_generic_keccak_xof_KeccakXofState_e2 * self,Eurydice_slice * inputs)4883 static KRML_MUSTINLINE void libcrux_sha3_generic_keccak_xof_absorb_35_c6(
4884     libcrux_sha3_generic_keccak_xof_KeccakXofState_e2 *self,
4885     Eurydice_slice *inputs) {
4886   size_t input_remainder_len =
4887       libcrux_sha3_generic_keccak_xof_absorb_full_35_c6(self, inputs);
4888   if (input_remainder_len > (size_t)0U) {
4889     size_t input_len = Eurydice_slice_len(inputs[0U], uint8_t);
4890     for (size_t i = (size_t)0U; i < (size_t)1U; i++) {
4891       size_t i0 = i;
4892       Eurydice_slice_copy(Eurydice_array_to_subslice3(
4893                               self->buf[i0], self->buf_len,
4894                               self->buf_len + input_remainder_len, uint8_t *),
4895                           Eurydice_slice_subslice_from(
4896                               inputs[i0], input_len - input_remainder_len,
4897                               uint8_t, size_t, uint8_t[]),
4898                           uint8_t);
4899     }
4900     self->buf_len = self->buf_len + input_remainder_len;
4901   }
4902 }
4903 
4904 /**
4905  Shake256 absorb
4906 */
4907 /**
4908 This function found in impl {libcrux_sha3::portable::incremental::Xof<136usize>
4909 for libcrux_sha3::portable::incremental::Shake256Xof}
4910 */
libcrux_sha3_portable_incremental_absorb_42(libcrux_sha3_generic_keccak_xof_KeccakXofState_e2 * self,Eurydice_slice input)4911 static inline void libcrux_sha3_portable_incremental_absorb_42(
4912     libcrux_sha3_generic_keccak_xof_KeccakXofState_e2 *self,
4913     Eurydice_slice input) {
4914   Eurydice_slice buf[1U] = {input};
4915   libcrux_sha3_generic_keccak_xof_absorb_35_c6(self, buf);
4916 }
4917 
4918 /**
4919 This function found in impl
4920 {libcrux_sha3::generic_keccak::xof::KeccakXofState<STATE, PARALLEL_LANES,
4921 RATE>[TraitClause@0, TraitClause@1]}
4922 */
4923 /**
4924 A monomorphic instance of libcrux_sha3.generic_keccak.xof.absorb_final_35
4925 with types uint64_t
4926 with const generics
4927 - PARALLEL_LANES= 1
4928 - RATE= 136
4929 - DELIMITER= 31
4930 */
libcrux_sha3_generic_keccak_xof_absorb_final_35_9e(libcrux_sha3_generic_keccak_xof_KeccakXofState_e2 * self,Eurydice_slice * inputs)4931 static KRML_MUSTINLINE void libcrux_sha3_generic_keccak_xof_absorb_final_35_9e(
4932     libcrux_sha3_generic_keccak_xof_KeccakXofState_e2 *self,
4933     Eurydice_slice *inputs) {
4934   libcrux_sha3_generic_keccak_xof_absorb_35_c6(self, inputs);
4935   Eurydice_slice borrowed[1U];
4936   for (size_t i = (size_t)0U; i < (size_t)1U; i++) {
4937     uint8_t buf[136U] = {0U};
4938     borrowed[i] = core_array___Array_T__N___as_slice((size_t)136U, buf, uint8_t,
4939                                                      Eurydice_slice);
4940   }
4941   for (size_t i = (size_t)0U; i < (size_t)1U; i++) {
4942     size_t i0 = i;
4943     borrowed[i0] =
4944         Eurydice_array_to_slice((size_t)136U, self->buf[i0], uint8_t);
4945   }
4946   libcrux_sha3_simd_portable_load_last_a1_ad0(&self->inner, borrowed,
4947                                               (size_t)0U, self->buf_len);
4948   libcrux_sha3_generic_keccak_keccakf1600_80_04(&self->inner);
4949 }
4950 
4951 /**
4952  Shake256 absorb final
4953 */
4954 /**
4955 This function found in impl {libcrux_sha3::portable::incremental::Xof<136usize>
4956 for libcrux_sha3::portable::incremental::Shake256Xof}
4957 */
libcrux_sha3_portable_incremental_absorb_final_42(libcrux_sha3_generic_keccak_xof_KeccakXofState_e2 * self,Eurydice_slice input)4958 static inline void libcrux_sha3_portable_incremental_absorb_final_42(
4959     libcrux_sha3_generic_keccak_xof_KeccakXofState_e2 *self,
4960     Eurydice_slice input) {
4961   Eurydice_slice buf[1U] = {input};
4962   libcrux_sha3_generic_keccak_xof_absorb_final_35_9e(self, buf);
4963 }
4964 
4965 /**
4966 This function found in impl
4967 {libcrux_sha3::generic_keccak::xof::KeccakXofState<STATE, PARALLEL_LANES,
4968 RATE>[TraitClause@0, TraitClause@1]}
4969 */
4970 /**
4971 A monomorphic instance of libcrux_sha3.generic_keccak.xof.zero_block_35
4972 with types uint64_t
4973 with const generics
4974 - PARALLEL_LANES= 1
4975 - RATE= 136
4976 */
libcrux_sha3_generic_keccak_xof_zero_block_35_c6(uint8_t ret[136U])4977 static inline void libcrux_sha3_generic_keccak_xof_zero_block_35_c6(
4978     uint8_t ret[136U]) {
4979   memset(ret, 0U, 136U * sizeof(uint8_t));
4980 }
4981 
4982 /**
4983 This function found in impl
4984 {libcrux_sha3::generic_keccak::xof::KeccakXofState<STATE, PARALLEL_LANES,
4985 RATE>[TraitClause@0, TraitClause@1]}
4986 */
4987 /**
4988 A monomorphic instance of libcrux_sha3.generic_keccak.xof.new_35
4989 with types uint64_t
4990 with const generics
4991 - PARALLEL_LANES= 1
4992 - RATE= 136
4993 */
4994 static inline libcrux_sha3_generic_keccak_xof_KeccakXofState_e2
libcrux_sha3_generic_keccak_xof_new_35_c6(void)4995 libcrux_sha3_generic_keccak_xof_new_35_c6(void) {
4996   libcrux_sha3_generic_keccak_xof_KeccakXofState_e2 lit;
4997   lit.inner = libcrux_sha3_generic_keccak_new_80_04();
4998   uint8_t repeat_expression[1U][136U];
4999   for (size_t i = (size_t)0U; i < (size_t)1U; i++) {
5000     libcrux_sha3_generic_keccak_xof_zero_block_35_c6(repeat_expression[i]);
5001   }
5002   memcpy(lit.buf, repeat_expression, (size_t)1U * sizeof(uint8_t[136U]));
5003   lit.buf_len = (size_t)0U;
5004   lit.sponge = false;
5005   return lit;
5006 }
5007 
5008 /**
5009  Shake256 new state
5010 */
5011 /**
5012 This function found in impl {libcrux_sha3::portable::incremental::Xof<136usize>
5013 for libcrux_sha3::portable::incremental::Shake256Xof}
5014 */
5015 static inline libcrux_sha3_generic_keccak_xof_KeccakXofState_e2
libcrux_sha3_portable_incremental_new_42(void)5016 libcrux_sha3_portable_incremental_new_42(void) {
5017   return libcrux_sha3_generic_keccak_xof_new_35_c6();
5018 }
5019 
5020 /**
5021  Squeeze `N` x `LEN` bytes. Only `N = 1` for now.
5022 */
5023 /**
5024 This function found in impl
5025 {libcrux_sha3::generic_keccak::xof::KeccakXofState<STATE, 1usize,
5026 RATE>[TraitClause@0, TraitClause@1]}
5027 */
5028 /**
5029 A monomorphic instance of libcrux_sha3.generic_keccak.xof.squeeze_85
5030 with types uint64_t
5031 with const generics
5032 - RATE= 136
5033 */
libcrux_sha3_generic_keccak_xof_squeeze_85_c7(libcrux_sha3_generic_keccak_xof_KeccakXofState_e2 * self,Eurydice_slice out)5034 static KRML_MUSTINLINE void libcrux_sha3_generic_keccak_xof_squeeze_85_c7(
5035     libcrux_sha3_generic_keccak_xof_KeccakXofState_e2 *self,
5036     Eurydice_slice out) {
5037   if (self->sponge) {
5038     libcrux_sha3_generic_keccak_keccakf1600_80_04(&self->inner);
5039   }
5040   size_t out_len = Eurydice_slice_len(out, uint8_t);
5041   if (out_len > (size_t)0U) {
5042     if (out_len <= (size_t)136U) {
5043       libcrux_sha3_simd_portable_squeeze_13_5b(&self->inner, out, (size_t)0U,
5044                                                out_len);
5045     } else {
5046       size_t blocks = out_len / (size_t)136U;
5047       for (size_t i = (size_t)0U; i < blocks; i++) {
5048         size_t i0 = i;
5049         libcrux_sha3_generic_keccak_keccakf1600_80_04(&self->inner);
5050         libcrux_sha3_simd_portable_squeeze_13_5b(
5051             &self->inner, out, i0 * (size_t)136U, (size_t)136U);
5052       }
5053       size_t remaining = out_len % (size_t)136U;
5054       if (remaining > (size_t)0U) {
5055         libcrux_sha3_generic_keccak_keccakf1600_80_04(&self->inner);
5056         libcrux_sha3_simd_portable_squeeze_13_5b(
5057             &self->inner, out, blocks * (size_t)136U, remaining);
5058       }
5059     }
5060     self->sponge = true;
5061   }
5062 }
5063 
5064 /**
5065  Shake256 squeeze
5066 */
5067 /**
5068 This function found in impl {libcrux_sha3::portable::incremental::Xof<136usize>
5069 for libcrux_sha3::portable::incremental::Shake256Xof}
5070 */
libcrux_sha3_portable_incremental_squeeze_42(libcrux_sha3_generic_keccak_xof_KeccakXofState_e2 * self,Eurydice_slice out)5071 static inline void libcrux_sha3_portable_incremental_squeeze_42(
5072     libcrux_sha3_generic_keccak_xof_KeccakXofState_e2 *self,
5073     Eurydice_slice out) {
5074   libcrux_sha3_generic_keccak_xof_squeeze_85_c7(self, out);
5075 }
5076 
5077 /**
5078 A monomorphic instance of libcrux_sha3.generic_keccak.xof.KeccakXofState
5079 with types uint64_t
5080 with const generics
5081 - $1size_t
5082 - $168size_t
5083 */
5084 typedef struct libcrux_sha3_generic_keccak_xof_KeccakXofState_97_s {
5085   libcrux_sha3_generic_keccak_KeccakState_17 inner;
5086   uint8_t buf[1U][168U];
5087   size_t buf_len;
5088   bool sponge;
5089 } libcrux_sha3_generic_keccak_xof_KeccakXofState_97;
5090 
5091 typedef libcrux_sha3_generic_keccak_xof_KeccakXofState_97
5092     libcrux_sha3_portable_incremental_Shake128Xof;
5093 
5094 /**
5095 This function found in impl
5096 {libcrux_sha3::generic_keccak::xof::KeccakXofState<STATE, PARALLEL_LANES,
5097 RATE>[TraitClause@0, TraitClause@1]}
5098 */
5099 /**
5100 A monomorphic instance of libcrux_sha3.generic_keccak.xof.fill_buffer_35
5101 with types uint64_t
5102 with const generics
5103 - PARALLEL_LANES= 1
5104 - RATE= 168
5105 */
libcrux_sha3_generic_keccak_xof_fill_buffer_35_c60(libcrux_sha3_generic_keccak_xof_KeccakXofState_97 * self,Eurydice_slice * inputs)5106 static inline size_t libcrux_sha3_generic_keccak_xof_fill_buffer_35_c60(
5107     libcrux_sha3_generic_keccak_xof_KeccakXofState_97 *self,
5108     Eurydice_slice *inputs) {
5109   size_t input_len = Eurydice_slice_len(inputs[0U], uint8_t);
5110   size_t consumed = (size_t)0U;
5111   if (self->buf_len > (size_t)0U) {
5112     if (self->buf_len + input_len >= (size_t)168U) {
5113       consumed = (size_t)168U - self->buf_len;
5114       for (size_t i = (size_t)0U; i < (size_t)1U; i++) {
5115         size_t i0 = i;
5116         Eurydice_slice uu____0 = Eurydice_array_to_subslice_from(
5117             (size_t)168U, self->buf[i0], self->buf_len, uint8_t, size_t,
5118             uint8_t[]);
5119         Eurydice_slice_copy(
5120             uu____0,
5121             Eurydice_slice_subslice_to(inputs[i0], consumed, uint8_t, size_t,
5122                                        uint8_t[]),
5123             uint8_t);
5124       }
5125       self->buf_len = self->buf_len + consumed;
5126     }
5127   }
5128   return consumed;
5129 }
5130 
5131 /**
5132 This function found in impl
5133 {libcrux_sha3::generic_keccak::xof::KeccakXofState<STATE, PARALLEL_LANES,
5134 RATE>[TraitClause@0, TraitClause@1]}
5135 */
5136 /**
5137 A monomorphic instance of libcrux_sha3.generic_keccak.xof.absorb_full_35
5138 with types uint64_t
5139 with const generics
5140 - PARALLEL_LANES= 1
5141 - RATE= 168
5142 */
libcrux_sha3_generic_keccak_xof_absorb_full_35_c60(libcrux_sha3_generic_keccak_xof_KeccakXofState_97 * self,Eurydice_slice * inputs)5143 static inline size_t libcrux_sha3_generic_keccak_xof_absorb_full_35_c60(
5144     libcrux_sha3_generic_keccak_xof_KeccakXofState_97 *self,
5145     Eurydice_slice *inputs) {
5146   size_t input_consumed =
5147       libcrux_sha3_generic_keccak_xof_fill_buffer_35_c60(self, inputs);
5148   if (input_consumed > (size_t)0U) {
5149     Eurydice_slice borrowed[1U];
5150     for (size_t i = (size_t)0U; i < (size_t)1U; i++) {
5151       uint8_t buf[168U] = {0U};
5152       borrowed[i] = core_array___Array_T__N___as_slice((size_t)168U, buf,
5153                                                        uint8_t, Eurydice_slice);
5154     }
5155     for (size_t i = (size_t)0U; i < (size_t)1U; i++) {
5156       size_t i0 = i;
5157       borrowed[i0] =
5158           Eurydice_array_to_slice((size_t)168U, self->buf[i0], uint8_t);
5159     }
5160     libcrux_sha3_simd_portable_load_block_a1_3a(&self->inner, borrowed,
5161                                                 (size_t)0U);
5162     libcrux_sha3_generic_keccak_keccakf1600_80_04(&self->inner);
5163     self->buf_len = (size_t)0U;
5164   }
5165   size_t input_to_consume =
5166       Eurydice_slice_len(inputs[0U], uint8_t) - input_consumed;
5167   size_t num_blocks = input_to_consume / (size_t)168U;
5168   size_t remainder = input_to_consume % (size_t)168U;
5169   for (size_t i = (size_t)0U; i < num_blocks; i++) {
5170     size_t i0 = i;
5171     libcrux_sha3_simd_portable_load_block_a1_3a(
5172         &self->inner, inputs, input_consumed + i0 * (size_t)168U);
5173     libcrux_sha3_generic_keccak_keccakf1600_80_04(&self->inner);
5174   }
5175   return remainder;
5176 }
5177 
5178 /**
5179 This function found in impl
5180 {libcrux_sha3::generic_keccak::xof::KeccakXofState<STATE, PARALLEL_LANES,
5181 RATE>[TraitClause@0, TraitClause@1]}
5182 */
5183 /**
5184 A monomorphic instance of libcrux_sha3.generic_keccak.xof.absorb_35
5185 with types uint64_t
5186 with const generics
5187 - PARALLEL_LANES= 1
5188 - RATE= 168
5189 */
libcrux_sha3_generic_keccak_xof_absorb_35_c60(libcrux_sha3_generic_keccak_xof_KeccakXofState_97 * self,Eurydice_slice * inputs)5190 static KRML_MUSTINLINE void libcrux_sha3_generic_keccak_xof_absorb_35_c60(
5191     libcrux_sha3_generic_keccak_xof_KeccakXofState_97 *self,
5192     Eurydice_slice *inputs) {
5193   size_t input_remainder_len =
5194       libcrux_sha3_generic_keccak_xof_absorb_full_35_c60(self, inputs);
5195   if (input_remainder_len > (size_t)0U) {
5196     size_t input_len = Eurydice_slice_len(inputs[0U], uint8_t);
5197     for (size_t i = (size_t)0U; i < (size_t)1U; i++) {
5198       size_t i0 = i;
5199       Eurydice_slice_copy(Eurydice_array_to_subslice3(
5200                               self->buf[i0], self->buf_len,
5201                               self->buf_len + input_remainder_len, uint8_t *),
5202                           Eurydice_slice_subslice_from(
5203                               inputs[i0], input_len - input_remainder_len,
5204                               uint8_t, size_t, uint8_t[]),
5205                           uint8_t);
5206     }
5207     self->buf_len = self->buf_len + input_remainder_len;
5208   }
5209 }
5210 
5211 /**
5212 This function found in impl {libcrux_sha3::portable::incremental::Xof<168usize>
5213 for libcrux_sha3::portable::incremental::Shake128Xof}
5214 */
libcrux_sha3_portable_incremental_absorb_26(libcrux_sha3_generic_keccak_xof_KeccakXofState_97 * self,Eurydice_slice input)5215 static inline void libcrux_sha3_portable_incremental_absorb_26(
5216     libcrux_sha3_generic_keccak_xof_KeccakXofState_97 *self,
5217     Eurydice_slice input) {
5218   Eurydice_slice buf[1U] = {input};
5219   libcrux_sha3_generic_keccak_xof_absorb_35_c60(self, buf);
5220 }
5221 
5222 /**
5223 This function found in impl
5224 {libcrux_sha3::generic_keccak::xof::KeccakXofState<STATE, PARALLEL_LANES,
5225 RATE>[TraitClause@0, TraitClause@1]}
5226 */
5227 /**
5228 A monomorphic instance of libcrux_sha3.generic_keccak.xof.absorb_final_35
5229 with types uint64_t
5230 with const generics
5231 - PARALLEL_LANES= 1
5232 - RATE= 168
5233 - DELIMITER= 31
5234 */
libcrux_sha3_generic_keccak_xof_absorb_final_35_9e0(libcrux_sha3_generic_keccak_xof_KeccakXofState_97 * self,Eurydice_slice * inputs)5235 static KRML_MUSTINLINE void libcrux_sha3_generic_keccak_xof_absorb_final_35_9e0(
5236     libcrux_sha3_generic_keccak_xof_KeccakXofState_97 *self,
5237     Eurydice_slice *inputs) {
5238   libcrux_sha3_generic_keccak_xof_absorb_35_c60(self, inputs);
5239   Eurydice_slice borrowed[1U];
5240   for (size_t i = (size_t)0U; i < (size_t)1U; i++) {
5241     uint8_t buf[168U] = {0U};
5242     borrowed[i] = core_array___Array_T__N___as_slice((size_t)168U, buf, uint8_t,
5243                                                      Eurydice_slice);
5244   }
5245   for (size_t i = (size_t)0U; i < (size_t)1U; i++) {
5246     size_t i0 = i;
5247     borrowed[i0] =
5248         Eurydice_array_to_slice((size_t)168U, self->buf[i0], uint8_t);
5249   }
5250   libcrux_sha3_simd_portable_load_last_a1_c6(&self->inner, borrowed, (size_t)0U,
5251                                              self->buf_len);
5252   libcrux_sha3_generic_keccak_keccakf1600_80_04(&self->inner);
5253 }
5254 
5255 /**
5256 This function found in impl {libcrux_sha3::portable::incremental::Xof<168usize>
5257 for libcrux_sha3::portable::incremental::Shake128Xof}
5258 */
libcrux_sha3_portable_incremental_absorb_final_26(libcrux_sha3_generic_keccak_xof_KeccakXofState_97 * self,Eurydice_slice input)5259 static inline void libcrux_sha3_portable_incremental_absorb_final_26(
5260     libcrux_sha3_generic_keccak_xof_KeccakXofState_97 *self,
5261     Eurydice_slice input) {
5262   Eurydice_slice buf[1U] = {input};
5263   libcrux_sha3_generic_keccak_xof_absorb_final_35_9e0(self, buf);
5264 }
5265 
5266 /**
5267 This function found in impl
5268 {libcrux_sha3::generic_keccak::xof::KeccakXofState<STATE, PARALLEL_LANES,
5269 RATE>[TraitClause@0, TraitClause@1]}
5270 */
5271 /**
5272 A monomorphic instance of libcrux_sha3.generic_keccak.xof.zero_block_35
5273 with types uint64_t
5274 with const generics
5275 - PARALLEL_LANES= 1
5276 - RATE= 168
5277 */
libcrux_sha3_generic_keccak_xof_zero_block_35_c60(uint8_t ret[168U])5278 static inline void libcrux_sha3_generic_keccak_xof_zero_block_35_c60(
5279     uint8_t ret[168U]) {
5280   memset(ret, 0U, 168U * sizeof(uint8_t));
5281 }
5282 
5283 /**
5284 This function found in impl
5285 {libcrux_sha3::generic_keccak::xof::KeccakXofState<STATE, PARALLEL_LANES,
5286 RATE>[TraitClause@0, TraitClause@1]}
5287 */
5288 /**
5289 A monomorphic instance of libcrux_sha3.generic_keccak.xof.new_35
5290 with types uint64_t
5291 with const generics
5292 - PARALLEL_LANES= 1
5293 - RATE= 168
5294 */
5295 static inline libcrux_sha3_generic_keccak_xof_KeccakXofState_97
libcrux_sha3_generic_keccak_xof_new_35_c60(void)5296 libcrux_sha3_generic_keccak_xof_new_35_c60(void) {
5297   libcrux_sha3_generic_keccak_xof_KeccakXofState_97 lit;
5298   lit.inner = libcrux_sha3_generic_keccak_new_80_04();
5299   uint8_t repeat_expression[1U][168U];
5300   for (size_t i = (size_t)0U; i < (size_t)1U; i++) {
5301     libcrux_sha3_generic_keccak_xof_zero_block_35_c60(repeat_expression[i]);
5302   }
5303   memcpy(lit.buf, repeat_expression, (size_t)1U * sizeof(uint8_t[168U]));
5304   lit.buf_len = (size_t)0U;
5305   lit.sponge = false;
5306   return lit;
5307 }
5308 
5309 /**
5310 This function found in impl {libcrux_sha3::portable::incremental::Xof<168usize>
5311 for libcrux_sha3::portable::incremental::Shake128Xof}
5312 */
5313 static inline libcrux_sha3_generic_keccak_xof_KeccakXofState_97
libcrux_sha3_portable_incremental_new_26(void)5314 libcrux_sha3_portable_incremental_new_26(void) {
5315   return libcrux_sha3_generic_keccak_xof_new_35_c60();
5316 }
5317 
5318 /**
5319  Squeeze `N` x `LEN` bytes. Only `N = 1` for now.
5320 */
5321 /**
5322 This function found in impl
5323 {libcrux_sha3::generic_keccak::xof::KeccakXofState<STATE, 1usize,
5324 RATE>[TraitClause@0, TraitClause@1]}
5325 */
5326 /**
5327 A monomorphic instance of libcrux_sha3.generic_keccak.xof.squeeze_85
5328 with types uint64_t
5329 with const generics
5330 - RATE= 168
5331 */
libcrux_sha3_generic_keccak_xof_squeeze_85_13(libcrux_sha3_generic_keccak_xof_KeccakXofState_97 * self,Eurydice_slice out)5332 static KRML_MUSTINLINE void libcrux_sha3_generic_keccak_xof_squeeze_85_13(
5333     libcrux_sha3_generic_keccak_xof_KeccakXofState_97 *self,
5334     Eurydice_slice out) {
5335   if (self->sponge) {
5336     libcrux_sha3_generic_keccak_keccakf1600_80_04(&self->inner);
5337   }
5338   size_t out_len = Eurydice_slice_len(out, uint8_t);
5339   if (out_len > (size_t)0U) {
5340     if (out_len <= (size_t)168U) {
5341       libcrux_sha3_simd_portable_squeeze_13_3a(&self->inner, out, (size_t)0U,
5342                                                out_len);
5343     } else {
5344       size_t blocks = out_len / (size_t)168U;
5345       for (size_t i = (size_t)0U; i < blocks; i++) {
5346         size_t i0 = i;
5347         libcrux_sha3_generic_keccak_keccakf1600_80_04(&self->inner);
5348         libcrux_sha3_simd_portable_squeeze_13_3a(
5349             &self->inner, out, i0 * (size_t)168U, (size_t)168U);
5350       }
5351       size_t remaining = out_len % (size_t)168U;
5352       if (remaining > (size_t)0U) {
5353         libcrux_sha3_generic_keccak_keccakf1600_80_04(&self->inner);
5354         libcrux_sha3_simd_portable_squeeze_13_3a(
5355             &self->inner, out, blocks * (size_t)168U, remaining);
5356       }
5357     }
5358     self->sponge = true;
5359   }
5360 }
5361 
5362 /**
5363  Shake128 squeeze
5364 */
5365 /**
5366 This function found in impl {libcrux_sha3::portable::incremental::Xof<168usize>
5367 for libcrux_sha3::portable::incremental::Shake128Xof}
5368 */
libcrux_sha3_portable_incremental_squeeze_26(libcrux_sha3_generic_keccak_xof_KeccakXofState_97 * self,Eurydice_slice out)5369 static inline void libcrux_sha3_portable_incremental_squeeze_26(
5370     libcrux_sha3_generic_keccak_xof_KeccakXofState_97 *self,
5371     Eurydice_slice out) {
5372   libcrux_sha3_generic_keccak_xof_squeeze_85_13(self, out);
5373 }
5374 
5375 /**
5376 This function found in impl {core::clone::Clone for
5377 libcrux_sha3::portable::KeccakState}
5378 */
5379 static inline libcrux_sha3_generic_keccak_KeccakState_17
libcrux_sha3_portable_clone_fe(libcrux_sha3_generic_keccak_KeccakState_17 * self)5380 libcrux_sha3_portable_clone_fe(
5381     libcrux_sha3_generic_keccak_KeccakState_17 *self) {
5382   return self[0U];
5383 }
5384 
5385 /**
5386 This function found in impl {core::convert::From<libcrux_sha3::Algorithm> for
5387 u32}
5388 */
libcrux_sha3_from_6c(libcrux_sha3_Algorithm v)5389 static inline uint32_t libcrux_sha3_from_6c(libcrux_sha3_Algorithm v) {
5390   switch (v) {
5391     case libcrux_sha3_Algorithm_Sha224: {
5392       break;
5393     }
5394     case libcrux_sha3_Algorithm_Sha256: {
5395       return 2U;
5396     }
5397     case libcrux_sha3_Algorithm_Sha384: {
5398       return 3U;
5399     }
5400     case libcrux_sha3_Algorithm_Sha512: {
5401       return 4U;
5402     }
5403     default: {
5404       KRML_HOST_EPRINTF("KaRaMeL incomplete match at %s:%d\n", __FILE__,
5405                         __LINE__);
5406       KRML_HOST_EXIT(253U);
5407     }
5408   }
5409   return 1U;
5410 }
5411 
5412 /**
5413 This function found in impl {core::convert::From<u32> for
5414 libcrux_sha3::Algorithm}
5415 */
libcrux_sha3_from_29(uint32_t v)5416 static inline libcrux_sha3_Algorithm libcrux_sha3_from_29(uint32_t v) {
5417   switch (v) {
5418     case 1U: {
5419       break;
5420     }
5421     case 2U: {
5422       return libcrux_sha3_Algorithm_Sha256;
5423     }
5424     case 3U: {
5425       return libcrux_sha3_Algorithm_Sha384;
5426     }
5427     case 4U: {
5428       return libcrux_sha3_Algorithm_Sha512;
5429     }
5430     default: {
5431       KRML_HOST_EPRINTF("KaRaMeL abort at %s:%d\n%s\n", __FILE__, __LINE__,
5432                         "panic!");
5433       KRML_HOST_EXIT(255U);
5434     }
5435   }
5436   return libcrux_sha3_Algorithm_Sha224;
5437 }
5438 
5439 #if defined(__cplusplus)
5440 }
5441 #endif
5442 
5443 #define libcrux_sha3_portable_H_DEFINED
5444 #endif /* libcrux_sha3_portable_H */
5445 
5446 /* from libcrux/libcrux-ml-kem/extracts/c_header_only/generated/libcrux_mlkem768_portable.h */
5447 /*
5448  * SPDX-FileCopyrightText: 2025 Cryspen Sarl <info@cryspen.com>
5449  *
5450  * SPDX-License-Identifier: MIT or Apache-2.0
5451  *
5452  * This code was generated with the following revisions:
5453  * Charon: 667d2fc98984ff7f3df989c2367e6c1fa4a000e7
5454  * Eurydice: 2381cbc416ef2ad0b561c362c500bc84f36b6785
5455  * Karamel: 80f5435f2fc505973c469a4afcc8d875cddd0d8b
5456  * F*: 71d8221589d4d438af3706d89cb653cf53e18aab
5457  * Libcrux: 68dfed5a4a9e40277f62828471c029afed1ecdcc
5458  */
5459 
5460 #ifndef libcrux_mlkem768_portable_H
5461 #define libcrux_mlkem768_portable_H
5462 
5463 
5464 #if defined(__cplusplus)
5465 extern "C" {
5466 #endif
5467 
5468 
libcrux_ml_kem_hash_functions_portable_G(Eurydice_slice input,uint8_t ret[64U])5469 static inline void libcrux_ml_kem_hash_functions_portable_G(
5470     Eurydice_slice input, uint8_t ret[64U]) {
5471   uint8_t digest[64U] = {0U};
5472   libcrux_sha3_portable_sha512(
5473       Eurydice_array_to_slice((size_t)64U, digest, uint8_t), input);
5474   memcpy(ret, digest, (size_t)64U * sizeof(uint8_t));
5475 }
5476 
libcrux_ml_kem_hash_functions_portable_H(Eurydice_slice input,uint8_t ret[32U])5477 static inline void libcrux_ml_kem_hash_functions_portable_H(
5478     Eurydice_slice input, uint8_t ret[32U]) {
5479   uint8_t digest[32U] = {0U};
5480   libcrux_sha3_portable_sha256(
5481       Eurydice_array_to_slice((size_t)32U, digest, uint8_t), input);
5482   memcpy(ret, digest, (size_t)32U * sizeof(uint8_t));
5483 }
5484 
5485 static const int16_t libcrux_ml_kem_polynomial_ZETAS_TIMES_MONTGOMERY_R[128U] =
5486     {(int16_t)-1044, (int16_t)-758,  (int16_t)-359,  (int16_t)-1517,
5487      (int16_t)1493,  (int16_t)1422,  (int16_t)287,   (int16_t)202,
5488      (int16_t)-171,  (int16_t)622,   (int16_t)1577,  (int16_t)182,
5489      (int16_t)962,   (int16_t)-1202, (int16_t)-1474, (int16_t)1468,
5490      (int16_t)573,   (int16_t)-1325, (int16_t)264,   (int16_t)383,
5491      (int16_t)-829,  (int16_t)1458,  (int16_t)-1602, (int16_t)-130,
5492      (int16_t)-681,  (int16_t)1017,  (int16_t)732,   (int16_t)608,
5493      (int16_t)-1542, (int16_t)411,   (int16_t)-205,  (int16_t)-1571,
5494      (int16_t)1223,  (int16_t)652,   (int16_t)-552,  (int16_t)1015,
5495      (int16_t)-1293, (int16_t)1491,  (int16_t)-282,  (int16_t)-1544,
5496      (int16_t)516,   (int16_t)-8,    (int16_t)-320,  (int16_t)-666,
5497      (int16_t)-1618, (int16_t)-1162, (int16_t)126,   (int16_t)1469,
5498      (int16_t)-853,  (int16_t)-90,   (int16_t)-271,  (int16_t)830,
5499      (int16_t)107,   (int16_t)-1421, (int16_t)-247,  (int16_t)-951,
5500      (int16_t)-398,  (int16_t)961,   (int16_t)-1508, (int16_t)-725,
5501      (int16_t)448,   (int16_t)-1065, (int16_t)677,   (int16_t)-1275,
5502      (int16_t)-1103, (int16_t)430,   (int16_t)555,   (int16_t)843,
5503      (int16_t)-1251, (int16_t)871,   (int16_t)1550,  (int16_t)105,
5504      (int16_t)422,   (int16_t)587,   (int16_t)177,   (int16_t)-235,
5505      (int16_t)-291,  (int16_t)-460,  (int16_t)1574,  (int16_t)1653,
5506      (int16_t)-246,  (int16_t)778,   (int16_t)1159,  (int16_t)-147,
5507      (int16_t)-777,  (int16_t)1483,  (int16_t)-602,  (int16_t)1119,
5508      (int16_t)-1590, (int16_t)644,   (int16_t)-872,  (int16_t)349,
5509      (int16_t)418,   (int16_t)329,   (int16_t)-156,  (int16_t)-75,
5510      (int16_t)817,   (int16_t)1097,  (int16_t)603,   (int16_t)610,
5511      (int16_t)1322,  (int16_t)-1285, (int16_t)-1465, (int16_t)384,
5512      (int16_t)-1215, (int16_t)-136,  (int16_t)1218,  (int16_t)-1335,
5513      (int16_t)-874,  (int16_t)220,   (int16_t)-1187, (int16_t)-1659,
5514      (int16_t)-1185, (int16_t)-1530, (int16_t)-1278, (int16_t)794,
5515      (int16_t)-1510, (int16_t)-854,  (int16_t)-870,  (int16_t)478,
5516      (int16_t)-108,  (int16_t)-308,  (int16_t)996,   (int16_t)991,
5517      (int16_t)958,   (int16_t)-1460, (int16_t)1522,  (int16_t)1628};
5518 
libcrux_ml_kem_polynomial_zeta(size_t i)5519 static KRML_MUSTINLINE int16_t libcrux_ml_kem_polynomial_zeta(size_t i) {
5520   return libcrux_ml_kem_polynomial_ZETAS_TIMES_MONTGOMERY_R[i];
5521 }
5522 
5523 #define LIBCRUX_ML_KEM_POLYNOMIAL_VECTORS_IN_RING_ELEMENT ((size_t)16U)
5524 
5525 #define LIBCRUX_ML_KEM_VECTOR_TRAITS_FIELD_ELEMENTS_IN_VECTOR ((size_t)16U)
5526 
5527 #define LIBCRUX_ML_KEM_VECTOR_TRAITS_MONTGOMERY_R_SQUARED_MOD_FIELD_MODULUS \
5528   ((int16_t)1353)
5529 
5530 #define LIBCRUX_ML_KEM_VECTOR_TRAITS_FIELD_MODULUS ((int16_t)3329)
5531 
5532 #define LIBCRUX_ML_KEM_VECTOR_TRAITS_INVERSE_OF_MODULUS_MOD_MONTGOMERY_R \
5533   (62209U)
5534 
5535 typedef struct libcrux_ml_kem_vector_portable_vector_type_PortableVector_s {
5536   int16_t elements[16U];
5537 } libcrux_ml_kem_vector_portable_vector_type_PortableVector;
5538 
5539 static KRML_MUSTINLINE libcrux_ml_kem_vector_portable_vector_type_PortableVector
libcrux_ml_kem_vector_portable_vector_type_from_i16_array(Eurydice_slice array)5540 libcrux_ml_kem_vector_portable_vector_type_from_i16_array(
5541     Eurydice_slice array) {
5542   libcrux_ml_kem_vector_portable_vector_type_PortableVector lit;
5543   int16_t ret[16U];
5544   Result_0a dst;
5545   Eurydice_slice_to_array2(
5546       &dst, Eurydice_slice_subslice3(array, (size_t)0U, (size_t)16U, int16_t *),
5547       Eurydice_slice, int16_t[16U], TryFromSliceError);
5548   unwrap_26_00(dst, ret);
5549   memcpy(lit.elements, ret, (size_t)16U * sizeof(int16_t));
5550   return lit;
5551 }
5552 
5553 /**
5554 This function found in impl {libcrux_ml_kem::vector::traits::Operations for
5555 libcrux_ml_kem::vector::portable::vector_type::PortableVector}
5556 */
5557 static inline libcrux_ml_kem_vector_portable_vector_type_PortableVector
libcrux_ml_kem_vector_portable_from_i16_array_b8(Eurydice_slice array)5558 libcrux_ml_kem_vector_portable_from_i16_array_b8(Eurydice_slice array) {
5559   return libcrux_ml_kem_vector_portable_vector_type_from_i16_array(
5560       libcrux_secrets_int_classify_public_classify_ref_9b_39(array));
5561 }
5562 
5563 typedef struct int16_t_x8_s {
5564   int16_t fst;
5565   int16_t snd;
5566   int16_t thd;
5567   int16_t f3;
5568   int16_t f4;
5569   int16_t f5;
5570   int16_t f6;
5571   int16_t f7;
5572 } int16_t_x8;
5573 
5574 static KRML_MUSTINLINE libcrux_ml_kem_vector_portable_vector_type_PortableVector
libcrux_ml_kem_vector_portable_vector_type_zero(void)5575 libcrux_ml_kem_vector_portable_vector_type_zero(void) {
5576   libcrux_ml_kem_vector_portable_vector_type_PortableVector lit;
5577   int16_t ret[16U];
5578   int16_t buf[16U] = {0U};
5579   libcrux_secrets_int_public_integers_classify_27_46(buf, ret);
5580   memcpy(lit.elements, ret, (size_t)16U * sizeof(int16_t));
5581   return lit;
5582 }
5583 
5584 /**
5585 This function found in impl {libcrux_ml_kem::vector::traits::Operations for
5586 libcrux_ml_kem::vector::portable::vector_type::PortableVector}
5587 */
5588 static inline libcrux_ml_kem_vector_portable_vector_type_PortableVector
libcrux_ml_kem_vector_portable_ZERO_b8(void)5589 libcrux_ml_kem_vector_portable_ZERO_b8(void) {
5590   return libcrux_ml_kem_vector_portable_vector_type_zero();
5591 }
5592 
5593 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)5594 libcrux_ml_kem_vector_portable_arithmetic_add(
5595     libcrux_ml_kem_vector_portable_vector_type_PortableVector lhs,
5596     libcrux_ml_kem_vector_portable_vector_type_PortableVector *rhs) {
5597   for (size_t i = (size_t)0U;
5598        i < LIBCRUX_ML_KEM_VECTOR_TRAITS_FIELD_ELEMENTS_IN_VECTOR; i++) {
5599     size_t i0 = i;
5600     size_t uu____0 = i0;
5601     lhs.elements[uu____0] = lhs.elements[uu____0] + rhs->elements[i0];
5602   }
5603   return lhs;
5604 }
5605 
5606 /**
5607 This function found in impl {libcrux_ml_kem::vector::traits::Operations for
5608 libcrux_ml_kem::vector::portable::vector_type::PortableVector}
5609 */
5610 static inline libcrux_ml_kem_vector_portable_vector_type_PortableVector
libcrux_ml_kem_vector_portable_add_b8(libcrux_ml_kem_vector_portable_vector_type_PortableVector lhs,libcrux_ml_kem_vector_portable_vector_type_PortableVector * rhs)5611 libcrux_ml_kem_vector_portable_add_b8(
5612     libcrux_ml_kem_vector_portable_vector_type_PortableVector lhs,
5613     libcrux_ml_kem_vector_portable_vector_type_PortableVector *rhs) {
5614   return libcrux_ml_kem_vector_portable_arithmetic_add(lhs, rhs);
5615 }
5616 
5617 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)5618 libcrux_ml_kem_vector_portable_arithmetic_sub(
5619     libcrux_ml_kem_vector_portable_vector_type_PortableVector lhs,
5620     libcrux_ml_kem_vector_portable_vector_type_PortableVector *rhs) {
5621   for (size_t i = (size_t)0U;
5622        i < LIBCRUX_ML_KEM_VECTOR_TRAITS_FIELD_ELEMENTS_IN_VECTOR; i++) {
5623     size_t i0 = i;
5624     size_t uu____0 = i0;
5625     lhs.elements[uu____0] = lhs.elements[uu____0] - rhs->elements[i0];
5626   }
5627   return lhs;
5628 }
5629 
5630 /**
5631 This function found in impl {libcrux_ml_kem::vector::traits::Operations for
5632 libcrux_ml_kem::vector::portable::vector_type::PortableVector}
5633 */
5634 static inline libcrux_ml_kem_vector_portable_vector_type_PortableVector
libcrux_ml_kem_vector_portable_sub_b8(libcrux_ml_kem_vector_portable_vector_type_PortableVector lhs,libcrux_ml_kem_vector_portable_vector_type_PortableVector * rhs)5635 libcrux_ml_kem_vector_portable_sub_b8(
5636     libcrux_ml_kem_vector_portable_vector_type_PortableVector lhs,
5637     libcrux_ml_kem_vector_portable_vector_type_PortableVector *rhs) {
5638   return libcrux_ml_kem_vector_portable_arithmetic_sub(lhs, rhs);
5639 }
5640 
5641 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 vec,int16_t c)5642 libcrux_ml_kem_vector_portable_arithmetic_multiply_by_constant(
5643     libcrux_ml_kem_vector_portable_vector_type_PortableVector vec, int16_t c) {
5644   for (size_t i = (size_t)0U;
5645        i < LIBCRUX_ML_KEM_VECTOR_TRAITS_FIELD_ELEMENTS_IN_VECTOR; i++) {
5646     size_t i0 = i;
5647     size_t uu____0 = i0;
5648     vec.elements[uu____0] = vec.elements[uu____0] * c;
5649   }
5650   return vec;
5651 }
5652 
5653 /**
5654 This function found in impl {libcrux_ml_kem::vector::traits::Operations for
5655 libcrux_ml_kem::vector::portable::vector_type::PortableVector}
5656 */
5657 static inline libcrux_ml_kem_vector_portable_vector_type_PortableVector
libcrux_ml_kem_vector_portable_multiply_by_constant_b8(libcrux_ml_kem_vector_portable_vector_type_PortableVector vec,int16_t c)5658 libcrux_ml_kem_vector_portable_multiply_by_constant_b8(
5659     libcrux_ml_kem_vector_portable_vector_type_PortableVector vec, int16_t c) {
5660   return libcrux_ml_kem_vector_portable_arithmetic_multiply_by_constant(vec, c);
5661 }
5662 
5663 /**
5664  Note: This function is not secret independent
5665  Only use with public values.
5666 */
5667 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 vec)5668 libcrux_ml_kem_vector_portable_arithmetic_cond_subtract_3329(
5669     libcrux_ml_kem_vector_portable_vector_type_PortableVector vec) {
5670   for (size_t i = (size_t)0U;
5671        i < LIBCRUX_ML_KEM_VECTOR_TRAITS_FIELD_ELEMENTS_IN_VECTOR; i++) {
5672     size_t i0 = i;
5673     if (libcrux_secrets_int_public_integers_declassify_d8_39(
5674             vec.elements[i0]) >= (int16_t)3329) {
5675       size_t uu____0 = i0;
5676       vec.elements[uu____0] = vec.elements[uu____0] - (int16_t)3329;
5677     }
5678   }
5679   return vec;
5680 }
5681 
5682 /**
5683 This function found in impl {libcrux_ml_kem::vector::traits::Operations for
5684 libcrux_ml_kem::vector::portable::vector_type::PortableVector}
5685 */
5686 static inline libcrux_ml_kem_vector_portable_vector_type_PortableVector
libcrux_ml_kem_vector_portable_cond_subtract_3329_b8(libcrux_ml_kem_vector_portable_vector_type_PortableVector v)5687 libcrux_ml_kem_vector_portable_cond_subtract_3329_b8(
5688     libcrux_ml_kem_vector_portable_vector_type_PortableVector v) {
5689   return libcrux_ml_kem_vector_portable_arithmetic_cond_subtract_3329(v);
5690 }
5691 
5692 #define LIBCRUX_ML_KEM_VECTOR_PORTABLE_ARITHMETIC_BARRETT_MULTIPLIER \
5693   ((int32_t)20159)
5694 
5695 #define LIBCRUX_ML_KEM_VECTOR_TRAITS_BARRETT_SHIFT ((int32_t)26)
5696 
5697 #define LIBCRUX_ML_KEM_VECTOR_TRAITS_BARRETT_R \
5698   ((int32_t)1 << (uint32_t)LIBCRUX_ML_KEM_VECTOR_TRAITS_BARRETT_SHIFT)
5699 
5700 /**
5701  Signed Barrett Reduction
5702 
5703  Given an input `value`, `barrett_reduce` outputs a representative `result`
5704  such that:
5705 
5706  - result ≡ value (mod FIELD_MODULUS)
5707  - the absolute value of `result` is bound as follows:
5708 
5709  `|result| ≤ FIELD_MODULUS / 2 · (|value|/BARRETT_R + 1)
5710 
5711  Note: The input bound is 28296 to prevent overflow in the multiplication of
5712  quotient by FIELD_MODULUS
5713 
5714 */
5715 static inline int16_t
libcrux_ml_kem_vector_portable_arithmetic_barrett_reduce_element(int16_t value)5716 libcrux_ml_kem_vector_portable_arithmetic_barrett_reduce_element(
5717     int16_t value) {
5718   int32_t t = libcrux_secrets_int_as_i32_f5(value) *
5719                   LIBCRUX_ML_KEM_VECTOR_PORTABLE_ARITHMETIC_BARRETT_MULTIPLIER +
5720               (LIBCRUX_ML_KEM_VECTOR_TRAITS_BARRETT_R >> 1U);
5721   int16_t quotient = libcrux_secrets_int_as_i16_36(
5722       t >> (uint32_t)LIBCRUX_ML_KEM_VECTOR_TRAITS_BARRETT_SHIFT);
5723   return value - quotient * LIBCRUX_ML_KEM_VECTOR_TRAITS_FIELD_MODULUS;
5724 }
5725 
5726 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 vec)5727 libcrux_ml_kem_vector_portable_arithmetic_barrett_reduce(
5728     libcrux_ml_kem_vector_portable_vector_type_PortableVector vec) {
5729   for (size_t i = (size_t)0U;
5730        i < LIBCRUX_ML_KEM_VECTOR_TRAITS_FIELD_ELEMENTS_IN_VECTOR; i++) {
5731     size_t i0 = i;
5732     int16_t vi =
5733         libcrux_ml_kem_vector_portable_arithmetic_barrett_reduce_element(
5734             vec.elements[i0]);
5735     vec.elements[i0] = vi;
5736   }
5737   return vec;
5738 }
5739 
5740 /**
5741 This function found in impl {libcrux_ml_kem::vector::traits::Operations for
5742 libcrux_ml_kem::vector::portable::vector_type::PortableVector}
5743 */
5744 static inline libcrux_ml_kem_vector_portable_vector_type_PortableVector
libcrux_ml_kem_vector_portable_barrett_reduce_b8(libcrux_ml_kem_vector_portable_vector_type_PortableVector vector)5745 libcrux_ml_kem_vector_portable_barrett_reduce_b8(
5746     libcrux_ml_kem_vector_portable_vector_type_PortableVector vector) {
5747   return libcrux_ml_kem_vector_portable_arithmetic_barrett_reduce(vector);
5748 }
5749 
5750 #define LIBCRUX_ML_KEM_VECTOR_PORTABLE_ARITHMETIC_MONTGOMERY_SHIFT (16U)
5751 
5752 /**
5753  Signed Montgomery Reduction
5754 
5755  Given an input `value`, `montgomery_reduce` outputs a representative `o`
5756  such that:
5757 
5758  - o ≡ value · MONTGOMERY_R^(-1) (mod FIELD_MODULUS)
5759  - the absolute value of `o` is bound as follows:
5760 
5761  `|result| ≤ ceil(|value| / MONTGOMERY_R) + 1665
5762 
5763  In particular, if `|value| ≤ FIELD_MODULUS-1 * FIELD_MODULUS-1`, then `|o| <=
5764  FIELD_MODULUS-1`. And, if `|value| ≤ pow2 16 * FIELD_MODULUS-1`, then `|o| <=
5765  FIELD_MODULUS + 1664
5766 
5767 */
5768 static inline int16_t
libcrux_ml_kem_vector_portable_arithmetic_montgomery_reduce_element(int32_t value)5769 libcrux_ml_kem_vector_portable_arithmetic_montgomery_reduce_element(
5770     int32_t value) {
5771   int32_t k =
5772       libcrux_secrets_int_as_i32_f5(libcrux_secrets_int_as_i16_36(value)) *
5773       libcrux_secrets_int_as_i32_b8(
5774           libcrux_secrets_int_public_integers_classify_27_df(
5775               LIBCRUX_ML_KEM_VECTOR_TRAITS_INVERSE_OF_MODULUS_MOD_MONTGOMERY_R));
5776   int32_t k_times_modulus =
5777       libcrux_secrets_int_as_i32_f5(libcrux_secrets_int_as_i16_36(k)) *
5778       libcrux_secrets_int_as_i32_f5(
5779           libcrux_secrets_int_public_integers_classify_27_39(
5780               LIBCRUX_ML_KEM_VECTOR_TRAITS_FIELD_MODULUS));
5781   int16_t c = libcrux_secrets_int_as_i16_36(
5782       k_times_modulus >>
5783       (uint32_t)LIBCRUX_ML_KEM_VECTOR_PORTABLE_ARITHMETIC_MONTGOMERY_SHIFT);
5784   int16_t value_high = libcrux_secrets_int_as_i16_36(
5785       value >>
5786       (uint32_t)LIBCRUX_ML_KEM_VECTOR_PORTABLE_ARITHMETIC_MONTGOMERY_SHIFT);
5787   return value_high - c;
5788 }
5789 
5790 /**
5791  If `fe` is some field element 'x' of the Kyber field and `fer` is congruent to
5792  `y · MONTGOMERY_R`, this procedure outputs a value that is congruent to
5793  `x · y`, as follows:
5794 
5795     `fe · fer ≡ x · y · MONTGOMERY_R (mod FIELD_MODULUS)`
5796 
5797  `montgomery_reduce` takes the value `x · y · MONTGOMERY_R` and outputs a
5798  representative `x · y · MONTGOMERY_R * MONTGOMERY_R^{-1} ≡ x · y (mod
5799  FIELD_MODULUS)`.
5800 */
5801 static KRML_MUSTINLINE int16_t
libcrux_ml_kem_vector_portable_arithmetic_montgomery_multiply_fe_by_fer(int16_t fe,int16_t fer)5802 libcrux_ml_kem_vector_portable_arithmetic_montgomery_multiply_fe_by_fer(
5803     int16_t fe, int16_t fer) {
5804   int32_t product =
5805       libcrux_secrets_int_as_i32_f5(fe) * libcrux_secrets_int_as_i32_f5(fer);
5806   return libcrux_ml_kem_vector_portable_arithmetic_montgomery_reduce_element(
5807       product);
5808 }
5809 
5810 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 vec,int16_t c)5811 libcrux_ml_kem_vector_portable_arithmetic_montgomery_multiply_by_constant(
5812     libcrux_ml_kem_vector_portable_vector_type_PortableVector vec, int16_t c) {
5813   for (size_t i = (size_t)0U;
5814        i < LIBCRUX_ML_KEM_VECTOR_TRAITS_FIELD_ELEMENTS_IN_VECTOR; i++) {
5815     size_t i0 = i;
5816     vec.elements[i0] =
5817         libcrux_ml_kem_vector_portable_arithmetic_montgomery_multiply_fe_by_fer(
5818             vec.elements[i0], c);
5819   }
5820   return vec;
5821 }
5822 
5823 /**
5824 This function found in impl {libcrux_ml_kem::vector::traits::Operations for
5825 libcrux_ml_kem::vector::portable::vector_type::PortableVector}
5826 */
5827 static inline libcrux_ml_kem_vector_portable_vector_type_PortableVector
libcrux_ml_kem_vector_portable_montgomery_multiply_by_constant_b8(libcrux_ml_kem_vector_portable_vector_type_PortableVector vector,int16_t constant)5828 libcrux_ml_kem_vector_portable_montgomery_multiply_by_constant_b8(
5829     libcrux_ml_kem_vector_portable_vector_type_PortableVector vector,
5830     int16_t constant) {
5831   return libcrux_ml_kem_vector_portable_arithmetic_montgomery_multiply_by_constant(
5832       vector, libcrux_secrets_int_public_integers_classify_27_39(constant));
5833 }
5834 
5835 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 vec,int16_t c)5836 libcrux_ml_kem_vector_portable_arithmetic_bitwise_and_with_constant(
5837     libcrux_ml_kem_vector_portable_vector_type_PortableVector vec, int16_t c) {
5838   for (size_t i = (size_t)0U;
5839        i < LIBCRUX_ML_KEM_VECTOR_TRAITS_FIELD_ELEMENTS_IN_VECTOR; i++) {
5840     size_t i0 = i;
5841     size_t uu____0 = i0;
5842     vec.elements[uu____0] = vec.elements[uu____0] & c;
5843   }
5844   return vec;
5845 }
5846 
5847 /**
5848 A monomorphic instance of libcrux_ml_kem.vector.portable.arithmetic.shift_right
5849 with const generics
5850 - SHIFT_BY= 15
5851 */
5852 static KRML_MUSTINLINE libcrux_ml_kem_vector_portable_vector_type_PortableVector
libcrux_ml_kem_vector_portable_arithmetic_shift_right_ef(libcrux_ml_kem_vector_portable_vector_type_PortableVector vec)5853 libcrux_ml_kem_vector_portable_arithmetic_shift_right_ef(
5854     libcrux_ml_kem_vector_portable_vector_type_PortableVector vec) {
5855   for (size_t i = (size_t)0U;
5856        i < LIBCRUX_ML_KEM_VECTOR_TRAITS_FIELD_ELEMENTS_IN_VECTOR; i++) {
5857     size_t i0 = i;
5858     vec.elements[i0] = vec.elements[i0] >> (uint32_t)(int32_t)15;
5859   }
5860   return vec;
5861 }
5862 
5863 static KRML_MUSTINLINE libcrux_ml_kem_vector_portable_vector_type_PortableVector
libcrux_ml_kem_vector_portable_arithmetic_to_unsigned_representative(libcrux_ml_kem_vector_portable_vector_type_PortableVector a)5864 libcrux_ml_kem_vector_portable_arithmetic_to_unsigned_representative(
5865     libcrux_ml_kem_vector_portable_vector_type_PortableVector a) {
5866   libcrux_ml_kem_vector_portable_vector_type_PortableVector t =
5867       libcrux_ml_kem_vector_portable_arithmetic_shift_right_ef(a);
5868   libcrux_ml_kem_vector_portable_vector_type_PortableVector fm =
5869       libcrux_ml_kem_vector_portable_arithmetic_bitwise_and_with_constant(
5870           t, LIBCRUX_ML_KEM_VECTOR_TRAITS_FIELD_MODULUS);
5871   return libcrux_ml_kem_vector_portable_arithmetic_add(a, &fm);
5872 }
5873 
5874 /**
5875 This function found in impl {libcrux_ml_kem::vector::traits::Operations for
5876 libcrux_ml_kem::vector::portable::vector_type::PortableVector}
5877 */
5878 static inline libcrux_ml_kem_vector_portable_vector_type_PortableVector
libcrux_ml_kem_vector_portable_to_unsigned_representative_b8(libcrux_ml_kem_vector_portable_vector_type_PortableVector a)5879 libcrux_ml_kem_vector_portable_to_unsigned_representative_b8(
5880     libcrux_ml_kem_vector_portable_vector_type_PortableVector a) {
5881   return libcrux_ml_kem_vector_portable_arithmetic_to_unsigned_representative(
5882       a);
5883 }
5884 
5885 /**
5886  The `compress_*` functions implement the `Compress` function specified in the
5887  NIST FIPS 203 standard (Page 18, Expression 4.5), which is defined as:
5888 
5889  ```plaintext
5890  Compress_d: ℤq -> ℤ_{2ᵈ}
5891  Compress_d(x) = ⌈(2ᵈ/q)·x⌋
5892  ```
5893 
5894  Since `⌈x⌋ = ⌊x + 1/2⌋` we have:
5895 
5896  ```plaintext
5897  Compress_d(x) = ⌊(2ᵈ/q)·x + 1/2⌋
5898                = ⌊(2^{d+1}·x + q) / 2q⌋
5899  ```
5900 
5901  For further information about the function implementations, consult the
5902  `implementation_notes.pdf` document in this directory.
5903 
5904  The NIST FIPS 203 standard can be found at
5905  <https://csrc.nist.gov/pubs/fips/203/ipd>.
5906 */
5907 static inline uint8_t
libcrux_ml_kem_vector_portable_compress_compress_message_coefficient(uint16_t fe)5908 libcrux_ml_kem_vector_portable_compress_compress_message_coefficient(
5909     uint16_t fe) {
5910   int16_t shifted =
5911       libcrux_secrets_int_public_integers_classify_27_39((int16_t)1664) -
5912       libcrux_secrets_int_as_i16_ca(fe);
5913   int16_t mask = shifted >> 15U;
5914   int16_t shifted_to_positive = mask ^ shifted;
5915   int16_t shifted_positive_in_range = shifted_to_positive - (int16_t)832;
5916   int16_t r0 = shifted_positive_in_range >> 15U;
5917   int16_t r1 = r0 & (int16_t)1;
5918   return libcrux_secrets_int_as_u8_f5(r1);
5919 }
5920 
5921 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 a)5922 libcrux_ml_kem_vector_portable_compress_compress_1(
5923     libcrux_ml_kem_vector_portable_vector_type_PortableVector a) {
5924   for (size_t i = (size_t)0U;
5925        i < LIBCRUX_ML_KEM_VECTOR_TRAITS_FIELD_ELEMENTS_IN_VECTOR; i++) {
5926     size_t i0 = i;
5927     a.elements[i0] = libcrux_secrets_int_as_i16_59(
5928         libcrux_ml_kem_vector_portable_compress_compress_message_coefficient(
5929             libcrux_secrets_int_as_u16_f5(a.elements[i0])));
5930   }
5931   return a;
5932 }
5933 
5934 /**
5935 This function found in impl {libcrux_ml_kem::vector::traits::Operations for
5936 libcrux_ml_kem::vector::portable::vector_type::PortableVector}
5937 */
5938 static inline libcrux_ml_kem_vector_portable_vector_type_PortableVector
libcrux_ml_kem_vector_portable_compress_1_b8(libcrux_ml_kem_vector_portable_vector_type_PortableVector a)5939 libcrux_ml_kem_vector_portable_compress_1_b8(
5940     libcrux_ml_kem_vector_portable_vector_type_PortableVector a) {
5941   return libcrux_ml_kem_vector_portable_compress_compress_1(a);
5942 }
5943 
5944 static KRML_MUSTINLINE uint32_t
libcrux_ml_kem_vector_portable_arithmetic_get_n_least_significant_bits(uint8_t n,uint32_t value)5945 libcrux_ml_kem_vector_portable_arithmetic_get_n_least_significant_bits(
5946     uint8_t n, uint32_t value) {
5947   return value & ((1U << (uint32_t)n) - 1U);
5948 }
5949 
5950 static inline int16_t
libcrux_ml_kem_vector_portable_compress_compress_ciphertext_coefficient(uint8_t coefficient_bits,uint16_t fe)5951 libcrux_ml_kem_vector_portable_compress_compress_ciphertext_coefficient(
5952     uint8_t coefficient_bits, uint16_t fe) {
5953   uint64_t compressed = libcrux_secrets_int_as_u64_ca(fe)
5954                         << (uint32_t)coefficient_bits;
5955   compressed = compressed + 1664ULL;
5956   compressed = compressed * 10321340ULL;
5957   compressed = compressed >> 35U;
5958   return libcrux_secrets_int_as_i16_b8(
5959       libcrux_ml_kem_vector_portable_arithmetic_get_n_least_significant_bits(
5960           coefficient_bits, libcrux_secrets_int_as_u32_a3(compressed)));
5961 }
5962 
5963 static KRML_MUSTINLINE libcrux_ml_kem_vector_portable_vector_type_PortableVector
libcrux_ml_kem_vector_portable_compress_decompress_1(libcrux_ml_kem_vector_portable_vector_type_PortableVector a)5964 libcrux_ml_kem_vector_portable_compress_decompress_1(
5965     libcrux_ml_kem_vector_portable_vector_type_PortableVector a) {
5966   libcrux_ml_kem_vector_portable_vector_type_PortableVector z =
5967       libcrux_ml_kem_vector_portable_vector_type_zero();
5968   libcrux_ml_kem_vector_portable_vector_type_PortableVector s =
5969       libcrux_ml_kem_vector_portable_arithmetic_sub(z, &a);
5970   libcrux_ml_kem_vector_portable_vector_type_PortableVector res =
5971       libcrux_ml_kem_vector_portable_arithmetic_bitwise_and_with_constant(
5972           s, (int16_t)1665);
5973   return res;
5974 }
5975 
5976 /**
5977 This function found in impl {libcrux_ml_kem::vector::traits::Operations for
5978 libcrux_ml_kem::vector::portable::vector_type::PortableVector}
5979 */
5980 static inline libcrux_ml_kem_vector_portable_vector_type_PortableVector
libcrux_ml_kem_vector_portable_decompress_1_b8(libcrux_ml_kem_vector_portable_vector_type_PortableVector a)5981 libcrux_ml_kem_vector_portable_decompress_1_b8(
5982     libcrux_ml_kem_vector_portable_vector_type_PortableVector a) {
5983   return libcrux_ml_kem_vector_portable_compress_decompress_1(a);
5984 }
5985 
libcrux_ml_kem_vector_portable_ntt_ntt_step(libcrux_ml_kem_vector_portable_vector_type_PortableVector * vec,int16_t zeta,size_t i,size_t j)5986 static KRML_MUSTINLINE void libcrux_ml_kem_vector_portable_ntt_ntt_step(
5987     libcrux_ml_kem_vector_portable_vector_type_PortableVector *vec,
5988     int16_t zeta, size_t i, size_t j) {
5989   int16_t t =
5990       libcrux_ml_kem_vector_portable_arithmetic_montgomery_multiply_fe_by_fer(
5991           vec->elements[j],
5992           libcrux_secrets_int_public_integers_classify_27_39(zeta));
5993   int16_t a_minus_t = vec->elements[i] - t;
5994   int16_t a_plus_t = vec->elements[i] + t;
5995   vec->elements[j] = a_minus_t;
5996   vec->elements[i] = a_plus_t;
5997 }
5998 
5999 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 vec,int16_t zeta0,int16_t zeta1,int16_t zeta2,int16_t zeta3)6000 libcrux_ml_kem_vector_portable_ntt_ntt_layer_1_step(
6001     libcrux_ml_kem_vector_portable_vector_type_PortableVector vec,
6002     int16_t zeta0, int16_t zeta1, int16_t zeta2, int16_t zeta3) {
6003   libcrux_ml_kem_vector_portable_ntt_ntt_step(&vec, zeta0, (size_t)0U,
6004                                               (size_t)2U);
6005   libcrux_ml_kem_vector_portable_ntt_ntt_step(&vec, zeta0, (size_t)1U,
6006                                               (size_t)3U);
6007   libcrux_ml_kem_vector_portable_ntt_ntt_step(&vec, zeta1, (size_t)4U,
6008                                               (size_t)6U);
6009   libcrux_ml_kem_vector_portable_ntt_ntt_step(&vec, zeta1, (size_t)5U,
6010                                               (size_t)7U);
6011   libcrux_ml_kem_vector_portable_ntt_ntt_step(&vec, zeta2, (size_t)8U,
6012                                               (size_t)10U);
6013   libcrux_ml_kem_vector_portable_ntt_ntt_step(&vec, zeta2, (size_t)9U,
6014                                               (size_t)11U);
6015   libcrux_ml_kem_vector_portable_ntt_ntt_step(&vec, zeta3, (size_t)12U,
6016                                               (size_t)14U);
6017   libcrux_ml_kem_vector_portable_ntt_ntt_step(&vec, zeta3, (size_t)13U,
6018                                               (size_t)15U);
6019   return vec;
6020 }
6021 
6022 /**
6023 This function found in impl {libcrux_ml_kem::vector::traits::Operations for
6024 libcrux_ml_kem::vector::portable::vector_type::PortableVector}
6025 */
6026 static inline libcrux_ml_kem_vector_portable_vector_type_PortableVector
libcrux_ml_kem_vector_portable_ntt_layer_1_step_b8(libcrux_ml_kem_vector_portable_vector_type_PortableVector a,int16_t zeta0,int16_t zeta1,int16_t zeta2,int16_t zeta3)6027 libcrux_ml_kem_vector_portable_ntt_layer_1_step_b8(
6028     libcrux_ml_kem_vector_portable_vector_type_PortableVector a, int16_t zeta0,
6029     int16_t zeta1, int16_t zeta2, int16_t zeta3) {
6030   return libcrux_ml_kem_vector_portable_ntt_ntt_layer_1_step(a, zeta0, zeta1,
6031                                                              zeta2, zeta3);
6032 }
6033 
6034 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 vec,int16_t zeta0,int16_t zeta1)6035 libcrux_ml_kem_vector_portable_ntt_ntt_layer_2_step(
6036     libcrux_ml_kem_vector_portable_vector_type_PortableVector vec,
6037     int16_t zeta0, int16_t zeta1) {
6038   libcrux_ml_kem_vector_portable_ntt_ntt_step(&vec, zeta0, (size_t)0U,
6039                                               (size_t)4U);
6040   libcrux_ml_kem_vector_portable_ntt_ntt_step(&vec, zeta0, (size_t)1U,
6041                                               (size_t)5U);
6042   libcrux_ml_kem_vector_portable_ntt_ntt_step(&vec, zeta0, (size_t)2U,
6043                                               (size_t)6U);
6044   libcrux_ml_kem_vector_portable_ntt_ntt_step(&vec, zeta0, (size_t)3U,
6045                                               (size_t)7U);
6046   libcrux_ml_kem_vector_portable_ntt_ntt_step(&vec, zeta1, (size_t)8U,
6047                                               (size_t)12U);
6048   libcrux_ml_kem_vector_portable_ntt_ntt_step(&vec, zeta1, (size_t)9U,
6049                                               (size_t)13U);
6050   libcrux_ml_kem_vector_portable_ntt_ntt_step(&vec, zeta1, (size_t)10U,
6051                                               (size_t)14U);
6052   libcrux_ml_kem_vector_portable_ntt_ntt_step(&vec, zeta1, (size_t)11U,
6053                                               (size_t)15U);
6054   return vec;
6055 }
6056 
6057 /**
6058 This function found in impl {libcrux_ml_kem::vector::traits::Operations for
6059 libcrux_ml_kem::vector::portable::vector_type::PortableVector}
6060 */
6061 static inline libcrux_ml_kem_vector_portable_vector_type_PortableVector
libcrux_ml_kem_vector_portable_ntt_layer_2_step_b8(libcrux_ml_kem_vector_portable_vector_type_PortableVector a,int16_t zeta0,int16_t zeta1)6062 libcrux_ml_kem_vector_portable_ntt_layer_2_step_b8(
6063     libcrux_ml_kem_vector_portable_vector_type_PortableVector a, int16_t zeta0,
6064     int16_t zeta1) {
6065   return libcrux_ml_kem_vector_portable_ntt_ntt_layer_2_step(a, zeta0, zeta1);
6066 }
6067 
6068 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 vec,int16_t zeta)6069 libcrux_ml_kem_vector_portable_ntt_ntt_layer_3_step(
6070     libcrux_ml_kem_vector_portable_vector_type_PortableVector vec,
6071     int16_t zeta) {
6072   libcrux_ml_kem_vector_portable_ntt_ntt_step(&vec, zeta, (size_t)0U,
6073                                               (size_t)8U);
6074   libcrux_ml_kem_vector_portable_ntt_ntt_step(&vec, zeta, (size_t)1U,
6075                                               (size_t)9U);
6076   libcrux_ml_kem_vector_portable_ntt_ntt_step(&vec, zeta, (size_t)2U,
6077                                               (size_t)10U);
6078   libcrux_ml_kem_vector_portable_ntt_ntt_step(&vec, zeta, (size_t)3U,
6079                                               (size_t)11U);
6080   libcrux_ml_kem_vector_portable_ntt_ntt_step(&vec, zeta, (size_t)4U,
6081                                               (size_t)12U);
6082   libcrux_ml_kem_vector_portable_ntt_ntt_step(&vec, zeta, (size_t)5U,
6083                                               (size_t)13U);
6084   libcrux_ml_kem_vector_portable_ntt_ntt_step(&vec, zeta, (size_t)6U,
6085                                               (size_t)14U);
6086   libcrux_ml_kem_vector_portable_ntt_ntt_step(&vec, zeta, (size_t)7U,
6087                                               (size_t)15U);
6088   return vec;
6089 }
6090 
6091 /**
6092 This function found in impl {libcrux_ml_kem::vector::traits::Operations for
6093 libcrux_ml_kem::vector::portable::vector_type::PortableVector}
6094 */
6095 static inline libcrux_ml_kem_vector_portable_vector_type_PortableVector
libcrux_ml_kem_vector_portable_ntt_layer_3_step_b8(libcrux_ml_kem_vector_portable_vector_type_PortableVector a,int16_t zeta)6096 libcrux_ml_kem_vector_portable_ntt_layer_3_step_b8(
6097     libcrux_ml_kem_vector_portable_vector_type_PortableVector a, int16_t zeta) {
6098   return libcrux_ml_kem_vector_portable_ntt_ntt_layer_3_step(a, zeta);
6099 }
6100 
libcrux_ml_kem_vector_portable_ntt_inv_ntt_step(libcrux_ml_kem_vector_portable_vector_type_PortableVector * vec,int16_t zeta,size_t i,size_t j)6101 static KRML_MUSTINLINE void libcrux_ml_kem_vector_portable_ntt_inv_ntt_step(
6102     libcrux_ml_kem_vector_portable_vector_type_PortableVector *vec,
6103     int16_t zeta, size_t i, size_t j) {
6104   int16_t a_minus_b = vec->elements[j] - vec->elements[i];
6105   int16_t a_plus_b = vec->elements[j] + vec->elements[i];
6106   int16_t o0 = libcrux_ml_kem_vector_portable_arithmetic_barrett_reduce_element(
6107       a_plus_b);
6108   int16_t o1 =
6109       libcrux_ml_kem_vector_portable_arithmetic_montgomery_multiply_fe_by_fer(
6110           a_minus_b, libcrux_secrets_int_public_integers_classify_27_39(zeta));
6111   vec->elements[i] = o0;
6112   vec->elements[j] = o1;
6113 }
6114 
6115 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 vec,int16_t zeta0,int16_t zeta1,int16_t zeta2,int16_t zeta3)6116 libcrux_ml_kem_vector_portable_ntt_inv_ntt_layer_1_step(
6117     libcrux_ml_kem_vector_portable_vector_type_PortableVector vec,
6118     int16_t zeta0, int16_t zeta1, int16_t zeta2, int16_t zeta3) {
6119   libcrux_ml_kem_vector_portable_ntt_inv_ntt_step(&vec, zeta0, (size_t)0U,
6120                                                   (size_t)2U);
6121   libcrux_ml_kem_vector_portable_ntt_inv_ntt_step(&vec, zeta0, (size_t)1U,
6122                                                   (size_t)3U);
6123   libcrux_ml_kem_vector_portable_ntt_inv_ntt_step(&vec, zeta1, (size_t)4U,
6124                                                   (size_t)6U);
6125   libcrux_ml_kem_vector_portable_ntt_inv_ntt_step(&vec, zeta1, (size_t)5U,
6126                                                   (size_t)7U);
6127   libcrux_ml_kem_vector_portable_ntt_inv_ntt_step(&vec, zeta2, (size_t)8U,
6128                                                   (size_t)10U);
6129   libcrux_ml_kem_vector_portable_ntt_inv_ntt_step(&vec, zeta2, (size_t)9U,
6130                                                   (size_t)11U);
6131   libcrux_ml_kem_vector_portable_ntt_inv_ntt_step(&vec, zeta3, (size_t)12U,
6132                                                   (size_t)14U);
6133   libcrux_ml_kem_vector_portable_ntt_inv_ntt_step(&vec, zeta3, (size_t)13U,
6134                                                   (size_t)15U);
6135   return vec;
6136 }
6137 
6138 /**
6139 This function found in impl {libcrux_ml_kem::vector::traits::Operations for
6140 libcrux_ml_kem::vector::portable::vector_type::PortableVector}
6141 */
6142 static inline libcrux_ml_kem_vector_portable_vector_type_PortableVector
libcrux_ml_kem_vector_portable_inv_ntt_layer_1_step_b8(libcrux_ml_kem_vector_portable_vector_type_PortableVector a,int16_t zeta0,int16_t zeta1,int16_t zeta2,int16_t zeta3)6143 libcrux_ml_kem_vector_portable_inv_ntt_layer_1_step_b8(
6144     libcrux_ml_kem_vector_portable_vector_type_PortableVector a, int16_t zeta0,
6145     int16_t zeta1, int16_t zeta2, int16_t zeta3) {
6146   return libcrux_ml_kem_vector_portable_ntt_inv_ntt_layer_1_step(
6147       a, zeta0, zeta1, zeta2, zeta3);
6148 }
6149 
6150 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 vec,int16_t zeta0,int16_t zeta1)6151 libcrux_ml_kem_vector_portable_ntt_inv_ntt_layer_2_step(
6152     libcrux_ml_kem_vector_portable_vector_type_PortableVector vec,
6153     int16_t zeta0, int16_t zeta1) {
6154   libcrux_ml_kem_vector_portable_ntt_inv_ntt_step(&vec, zeta0, (size_t)0U,
6155                                                   (size_t)4U);
6156   libcrux_ml_kem_vector_portable_ntt_inv_ntt_step(&vec, zeta0, (size_t)1U,
6157                                                   (size_t)5U);
6158   libcrux_ml_kem_vector_portable_ntt_inv_ntt_step(&vec, zeta0, (size_t)2U,
6159                                                   (size_t)6U);
6160   libcrux_ml_kem_vector_portable_ntt_inv_ntt_step(&vec, zeta0, (size_t)3U,
6161                                                   (size_t)7U);
6162   libcrux_ml_kem_vector_portable_ntt_inv_ntt_step(&vec, zeta1, (size_t)8U,
6163                                                   (size_t)12U);
6164   libcrux_ml_kem_vector_portable_ntt_inv_ntt_step(&vec, zeta1, (size_t)9U,
6165                                                   (size_t)13U);
6166   libcrux_ml_kem_vector_portable_ntt_inv_ntt_step(&vec, zeta1, (size_t)10U,
6167                                                   (size_t)14U);
6168   libcrux_ml_kem_vector_portable_ntt_inv_ntt_step(&vec, zeta1, (size_t)11U,
6169                                                   (size_t)15U);
6170   return vec;
6171 }
6172 
6173 /**
6174 This function found in impl {libcrux_ml_kem::vector::traits::Operations for
6175 libcrux_ml_kem::vector::portable::vector_type::PortableVector}
6176 */
6177 static inline libcrux_ml_kem_vector_portable_vector_type_PortableVector
libcrux_ml_kem_vector_portable_inv_ntt_layer_2_step_b8(libcrux_ml_kem_vector_portable_vector_type_PortableVector a,int16_t zeta0,int16_t zeta1)6178 libcrux_ml_kem_vector_portable_inv_ntt_layer_2_step_b8(
6179     libcrux_ml_kem_vector_portable_vector_type_PortableVector a, int16_t zeta0,
6180     int16_t zeta1) {
6181   return libcrux_ml_kem_vector_portable_ntt_inv_ntt_layer_2_step(a, zeta0,
6182                                                                  zeta1);
6183 }
6184 
6185 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 vec,int16_t zeta)6186 libcrux_ml_kem_vector_portable_ntt_inv_ntt_layer_3_step(
6187     libcrux_ml_kem_vector_portable_vector_type_PortableVector vec,
6188     int16_t zeta) {
6189   libcrux_ml_kem_vector_portable_ntt_inv_ntt_step(&vec, zeta, (size_t)0U,
6190                                                   (size_t)8U);
6191   libcrux_ml_kem_vector_portable_ntt_inv_ntt_step(&vec, zeta, (size_t)1U,
6192                                                   (size_t)9U);
6193   libcrux_ml_kem_vector_portable_ntt_inv_ntt_step(&vec, zeta, (size_t)2U,
6194                                                   (size_t)10U);
6195   libcrux_ml_kem_vector_portable_ntt_inv_ntt_step(&vec, zeta, (size_t)3U,
6196                                                   (size_t)11U);
6197   libcrux_ml_kem_vector_portable_ntt_inv_ntt_step(&vec, zeta, (size_t)4U,
6198                                                   (size_t)12U);
6199   libcrux_ml_kem_vector_portable_ntt_inv_ntt_step(&vec, zeta, (size_t)5U,
6200                                                   (size_t)13U);
6201   libcrux_ml_kem_vector_portable_ntt_inv_ntt_step(&vec, zeta, (size_t)6U,
6202                                                   (size_t)14U);
6203   libcrux_ml_kem_vector_portable_ntt_inv_ntt_step(&vec, zeta, (size_t)7U,
6204                                                   (size_t)15U);
6205   return vec;
6206 }
6207 
6208 /**
6209 This function found in impl {libcrux_ml_kem::vector::traits::Operations for
6210 libcrux_ml_kem::vector::portable::vector_type::PortableVector}
6211 */
6212 static inline libcrux_ml_kem_vector_portable_vector_type_PortableVector
libcrux_ml_kem_vector_portable_inv_ntt_layer_3_step_b8(libcrux_ml_kem_vector_portable_vector_type_PortableVector a,int16_t zeta)6213 libcrux_ml_kem_vector_portable_inv_ntt_layer_3_step_b8(
6214     libcrux_ml_kem_vector_portable_vector_type_PortableVector a, int16_t zeta) {
6215   return libcrux_ml_kem_vector_portable_ntt_inv_ntt_layer_3_step(a, zeta);
6216 }
6217 
6218 /**
6219  Compute the product of two Kyber binomials with respect to the
6220  modulus `X² - zeta`.
6221 
6222  This function almost implements <strong>Algorithm 11</strong> of the
6223  NIST FIPS 203 standard, which is reproduced below:
6224 
6225  ```plaintext
6226  Input:  a₀, a₁, b₀, b₁ ∈ ℤq.
6227  Input: γ ∈ ℤq.
6228  Output: c₀, c₁ ∈ ℤq.
6229 
6230  c₀ ← a₀·b₀ + a₁·b₁·γ
6231  c₁ ← a₀·b₁ + a₁·b₀
6232  return c₀, c₁
6233  ```
6234  We say "almost" because the coefficients output by this function are in
6235  the Montgomery domain (unlike in the specification).
6236 
6237  The NIST FIPS 203 standard can be found at
6238  <https://csrc.nist.gov/pubs/fips/203/ipd>.
6239 */
6240 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,libcrux_ml_kem_vector_portable_vector_type_PortableVector * out)6241 libcrux_ml_kem_vector_portable_ntt_ntt_multiply_binomials(
6242     libcrux_ml_kem_vector_portable_vector_type_PortableVector *a,
6243     libcrux_ml_kem_vector_portable_vector_type_PortableVector *b, int16_t zeta,
6244     size_t i, libcrux_ml_kem_vector_portable_vector_type_PortableVector *out) {
6245   int16_t ai = a->elements[(size_t)2U * i];
6246   int16_t bi = b->elements[(size_t)2U * i];
6247   int16_t aj = a->elements[(size_t)2U * i + (size_t)1U];
6248   int16_t bj = b->elements[(size_t)2U * i + (size_t)1U];
6249   int32_t ai_bi =
6250       libcrux_secrets_int_as_i32_f5(ai) * libcrux_secrets_int_as_i32_f5(bi);
6251   int32_t aj_bj_ =
6252       libcrux_secrets_int_as_i32_f5(aj) * libcrux_secrets_int_as_i32_f5(bj);
6253   int16_t aj_bj =
6254       libcrux_ml_kem_vector_portable_arithmetic_montgomery_reduce_element(
6255           aj_bj_);
6256   int32_t aj_bj_zeta = libcrux_secrets_int_as_i32_f5(aj_bj) *
6257                        libcrux_secrets_int_as_i32_f5(zeta);
6258   int32_t ai_bi_aj_bj = ai_bi + aj_bj_zeta;
6259   int16_t o0 =
6260       libcrux_ml_kem_vector_portable_arithmetic_montgomery_reduce_element(
6261           ai_bi_aj_bj);
6262   int32_t ai_bj =
6263       libcrux_secrets_int_as_i32_f5(ai) * libcrux_secrets_int_as_i32_f5(bj);
6264   int32_t aj_bi =
6265       libcrux_secrets_int_as_i32_f5(aj) * libcrux_secrets_int_as_i32_f5(bi);
6266   int32_t ai_bj_aj_bi = ai_bj + aj_bi;
6267   int16_t o1 =
6268       libcrux_ml_kem_vector_portable_arithmetic_montgomery_reduce_element(
6269           ai_bj_aj_bi);
6270   out->elements[(size_t)2U * i] = o0;
6271   out->elements[(size_t)2U * i + (size_t)1U] = o1;
6272 }
6273 
6274 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)6275 libcrux_ml_kem_vector_portable_ntt_ntt_multiply(
6276     libcrux_ml_kem_vector_portable_vector_type_PortableVector *lhs,
6277     libcrux_ml_kem_vector_portable_vector_type_PortableVector *rhs,
6278     int16_t zeta0, int16_t zeta1, int16_t zeta2, int16_t zeta3) {
6279   int16_t nzeta0 = -zeta0;
6280   int16_t nzeta1 = -zeta1;
6281   int16_t nzeta2 = -zeta2;
6282   int16_t nzeta3 = -zeta3;
6283   libcrux_ml_kem_vector_portable_vector_type_PortableVector out =
6284       libcrux_ml_kem_vector_portable_vector_type_zero();
6285   libcrux_ml_kem_vector_portable_ntt_ntt_multiply_binomials(
6286       lhs, rhs, libcrux_secrets_int_public_integers_classify_27_39(zeta0),
6287       (size_t)0U, &out);
6288   libcrux_ml_kem_vector_portable_ntt_ntt_multiply_binomials(
6289       lhs, rhs, libcrux_secrets_int_public_integers_classify_27_39(nzeta0),
6290       (size_t)1U, &out);
6291   libcrux_ml_kem_vector_portable_ntt_ntt_multiply_binomials(
6292       lhs, rhs, libcrux_secrets_int_public_integers_classify_27_39(zeta1),
6293       (size_t)2U, &out);
6294   libcrux_ml_kem_vector_portable_ntt_ntt_multiply_binomials(
6295       lhs, rhs, libcrux_secrets_int_public_integers_classify_27_39(nzeta1),
6296       (size_t)3U, &out);
6297   libcrux_ml_kem_vector_portable_ntt_ntt_multiply_binomials(
6298       lhs, rhs, libcrux_secrets_int_public_integers_classify_27_39(zeta2),
6299       (size_t)4U, &out);
6300   libcrux_ml_kem_vector_portable_ntt_ntt_multiply_binomials(
6301       lhs, rhs, libcrux_secrets_int_public_integers_classify_27_39(nzeta2),
6302       (size_t)5U, &out);
6303   libcrux_ml_kem_vector_portable_ntt_ntt_multiply_binomials(
6304       lhs, rhs, libcrux_secrets_int_public_integers_classify_27_39(zeta3),
6305       (size_t)6U, &out);
6306   libcrux_ml_kem_vector_portable_ntt_ntt_multiply_binomials(
6307       lhs, rhs, libcrux_secrets_int_public_integers_classify_27_39(nzeta3),
6308       (size_t)7U, &out);
6309   return out;
6310 }
6311 
6312 /**
6313 This function found in impl {libcrux_ml_kem::vector::traits::Operations for
6314 libcrux_ml_kem::vector::portable::vector_type::PortableVector}
6315 */
6316 static inline libcrux_ml_kem_vector_portable_vector_type_PortableVector
libcrux_ml_kem_vector_portable_ntt_multiply_b8(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)6317 libcrux_ml_kem_vector_portable_ntt_multiply_b8(
6318     libcrux_ml_kem_vector_portable_vector_type_PortableVector *lhs,
6319     libcrux_ml_kem_vector_portable_vector_type_PortableVector *rhs,
6320     int16_t zeta0, int16_t zeta1, int16_t zeta2, int16_t zeta3) {
6321   return libcrux_ml_kem_vector_portable_ntt_ntt_multiply(lhs, rhs, zeta0, zeta1,
6322                                                          zeta2, zeta3);
6323 }
6324 
6325 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])6326 libcrux_ml_kem_vector_portable_serialize_serialize_1(
6327     libcrux_ml_kem_vector_portable_vector_type_PortableVector v,
6328     uint8_t ret[2U]) {
6329   uint8_t result0 =
6330       (((((((uint32_t)libcrux_secrets_int_as_u8_f5(v.elements[0U]) |
6331             (uint32_t)libcrux_secrets_int_as_u8_f5(v.elements[1U]) << 1U) |
6332            (uint32_t)libcrux_secrets_int_as_u8_f5(v.elements[2U]) << 2U) |
6333           (uint32_t)libcrux_secrets_int_as_u8_f5(v.elements[3U]) << 3U) |
6334          (uint32_t)libcrux_secrets_int_as_u8_f5(v.elements[4U]) << 4U) |
6335         (uint32_t)libcrux_secrets_int_as_u8_f5(v.elements[5U]) << 5U) |
6336        (uint32_t)libcrux_secrets_int_as_u8_f5(v.elements[6U]) << 6U) |
6337       (uint32_t)libcrux_secrets_int_as_u8_f5(v.elements[7U]) << 7U;
6338   uint8_t result1 =
6339       (((((((uint32_t)libcrux_secrets_int_as_u8_f5(v.elements[8U]) |
6340             (uint32_t)libcrux_secrets_int_as_u8_f5(v.elements[9U]) << 1U) |
6341            (uint32_t)libcrux_secrets_int_as_u8_f5(v.elements[10U]) << 2U) |
6342           (uint32_t)libcrux_secrets_int_as_u8_f5(v.elements[11U]) << 3U) |
6343          (uint32_t)libcrux_secrets_int_as_u8_f5(v.elements[12U]) << 4U) |
6344         (uint32_t)libcrux_secrets_int_as_u8_f5(v.elements[13U]) << 5U) |
6345        (uint32_t)libcrux_secrets_int_as_u8_f5(v.elements[14U]) << 6U) |
6346       (uint32_t)libcrux_secrets_int_as_u8_f5(v.elements[15U]) << 7U;
6347   ret[0U] = result0;
6348   ret[1U] = result1;
6349 }
6350 
libcrux_ml_kem_vector_portable_serialize_1(libcrux_ml_kem_vector_portable_vector_type_PortableVector a,uint8_t ret[2U])6351 static inline void libcrux_ml_kem_vector_portable_serialize_1(
6352     libcrux_ml_kem_vector_portable_vector_type_PortableVector a,
6353     uint8_t ret[2U]) {
6354   uint8_t ret0[2U];
6355   libcrux_ml_kem_vector_portable_serialize_serialize_1(a, ret0);
6356   libcrux_secrets_int_public_integers_declassify_d8_d4(ret0, ret);
6357 }
6358 
6359 /**
6360 This function found in impl {libcrux_ml_kem::vector::traits::Operations for
6361 libcrux_ml_kem::vector::portable::vector_type::PortableVector}
6362 */
libcrux_ml_kem_vector_portable_serialize_1_b8(libcrux_ml_kem_vector_portable_vector_type_PortableVector a,uint8_t ret[2U])6363 static inline void libcrux_ml_kem_vector_portable_serialize_1_b8(
6364     libcrux_ml_kem_vector_portable_vector_type_PortableVector a,
6365     uint8_t ret[2U]) {
6366   libcrux_ml_kem_vector_portable_serialize_1(a, ret);
6367 }
6368 
6369 static KRML_MUSTINLINE libcrux_ml_kem_vector_portable_vector_type_PortableVector
libcrux_ml_kem_vector_portable_serialize_deserialize_1(Eurydice_slice v)6370 libcrux_ml_kem_vector_portable_serialize_deserialize_1(Eurydice_slice v) {
6371   int16_t result0 = libcrux_secrets_int_as_i16_59(
6372       (uint32_t)Eurydice_slice_index(v, (size_t)0U, uint8_t, uint8_t *) & 1U);
6373   int16_t result1 = libcrux_secrets_int_as_i16_59(
6374       (uint32_t)Eurydice_slice_index(v, (size_t)0U, uint8_t, uint8_t *) >> 1U &
6375       1U);
6376   int16_t result2 = libcrux_secrets_int_as_i16_59(
6377       (uint32_t)Eurydice_slice_index(v, (size_t)0U, uint8_t, uint8_t *) >> 2U &
6378       1U);
6379   int16_t result3 = libcrux_secrets_int_as_i16_59(
6380       (uint32_t)Eurydice_slice_index(v, (size_t)0U, uint8_t, uint8_t *) >> 3U &
6381       1U);
6382   int16_t result4 = libcrux_secrets_int_as_i16_59(
6383       (uint32_t)Eurydice_slice_index(v, (size_t)0U, uint8_t, uint8_t *) >> 4U &
6384       1U);
6385   int16_t result5 = libcrux_secrets_int_as_i16_59(
6386       (uint32_t)Eurydice_slice_index(v, (size_t)0U, uint8_t, uint8_t *) >> 5U &
6387       1U);
6388   int16_t result6 = libcrux_secrets_int_as_i16_59(
6389       (uint32_t)Eurydice_slice_index(v, (size_t)0U, uint8_t, uint8_t *) >> 6U &
6390       1U);
6391   int16_t result7 = libcrux_secrets_int_as_i16_59(
6392       (uint32_t)Eurydice_slice_index(v, (size_t)0U, uint8_t, uint8_t *) >> 7U &
6393       1U);
6394   int16_t result8 = libcrux_secrets_int_as_i16_59(
6395       (uint32_t)Eurydice_slice_index(v, (size_t)1U, uint8_t, uint8_t *) & 1U);
6396   int16_t result9 = libcrux_secrets_int_as_i16_59(
6397       (uint32_t)Eurydice_slice_index(v, (size_t)1U, uint8_t, uint8_t *) >> 1U &
6398       1U);
6399   int16_t result10 = libcrux_secrets_int_as_i16_59(
6400       (uint32_t)Eurydice_slice_index(v, (size_t)1U, uint8_t, uint8_t *) >> 2U &
6401       1U);
6402   int16_t result11 = libcrux_secrets_int_as_i16_59(
6403       (uint32_t)Eurydice_slice_index(v, (size_t)1U, uint8_t, uint8_t *) >> 3U &
6404       1U);
6405   int16_t result12 = libcrux_secrets_int_as_i16_59(
6406       (uint32_t)Eurydice_slice_index(v, (size_t)1U, uint8_t, uint8_t *) >> 4U &
6407       1U);
6408   int16_t result13 = libcrux_secrets_int_as_i16_59(
6409       (uint32_t)Eurydice_slice_index(v, (size_t)1U, uint8_t, uint8_t *) >> 5U &
6410       1U);
6411   int16_t result14 = libcrux_secrets_int_as_i16_59(
6412       (uint32_t)Eurydice_slice_index(v, (size_t)1U, uint8_t, uint8_t *) >> 6U &
6413       1U);
6414   int16_t result15 = libcrux_secrets_int_as_i16_59(
6415       (uint32_t)Eurydice_slice_index(v, (size_t)1U, uint8_t, uint8_t *) >> 7U &
6416       1U);
6417   return (
6418       KRML_CLITERAL(libcrux_ml_kem_vector_portable_vector_type_PortableVector){
6419           .elements = {result0, result1, result2, result3, result4, result5,
6420                        result6, result7, result8, result9, result10, result11,
6421                        result12, result13, result14, result15}});
6422 }
6423 
6424 static inline libcrux_ml_kem_vector_portable_vector_type_PortableVector
libcrux_ml_kem_vector_portable_deserialize_1(Eurydice_slice a)6425 libcrux_ml_kem_vector_portable_deserialize_1(Eurydice_slice a) {
6426   return libcrux_ml_kem_vector_portable_serialize_deserialize_1(
6427       libcrux_secrets_int_classify_public_classify_ref_9b_90(a));
6428 }
6429 
6430 /**
6431 This function found in impl {libcrux_ml_kem::vector::traits::Operations for
6432 libcrux_ml_kem::vector::portable::vector_type::PortableVector}
6433 */
6434 static inline libcrux_ml_kem_vector_portable_vector_type_PortableVector
libcrux_ml_kem_vector_portable_deserialize_1_b8(Eurydice_slice a)6435 libcrux_ml_kem_vector_portable_deserialize_1_b8(Eurydice_slice a) {
6436   return libcrux_ml_kem_vector_portable_deserialize_1(a);
6437 }
6438 
6439 typedef struct uint8_t_x4_s {
6440   uint8_t fst;
6441   uint8_t snd;
6442   uint8_t thd;
6443   uint8_t f3;
6444 } uint8_t_x4;
6445 
6446 static KRML_MUSTINLINE uint8_t_x4
libcrux_ml_kem_vector_portable_serialize_serialize_4_int(Eurydice_slice v)6447 libcrux_ml_kem_vector_portable_serialize_serialize_4_int(Eurydice_slice v) {
6448   uint8_t result0 = (uint32_t)libcrux_secrets_int_as_u8_f5(
6449                         Eurydice_slice_index(v, (size_t)1U, int16_t, int16_t *))
6450                         << 4U |
6451                     (uint32_t)libcrux_secrets_int_as_u8_f5(Eurydice_slice_index(
6452                         v, (size_t)0U, int16_t, int16_t *));
6453   uint8_t result1 = (uint32_t)libcrux_secrets_int_as_u8_f5(
6454                         Eurydice_slice_index(v, (size_t)3U, int16_t, int16_t *))
6455                         << 4U |
6456                     (uint32_t)libcrux_secrets_int_as_u8_f5(Eurydice_slice_index(
6457                         v, (size_t)2U, int16_t, int16_t *));
6458   uint8_t result2 = (uint32_t)libcrux_secrets_int_as_u8_f5(
6459                         Eurydice_slice_index(v, (size_t)5U, int16_t, int16_t *))
6460                         << 4U |
6461                     (uint32_t)libcrux_secrets_int_as_u8_f5(Eurydice_slice_index(
6462                         v, (size_t)4U, int16_t, int16_t *));
6463   uint8_t result3 = (uint32_t)libcrux_secrets_int_as_u8_f5(
6464                         Eurydice_slice_index(v, (size_t)7U, int16_t, int16_t *))
6465                         << 4U |
6466                     (uint32_t)libcrux_secrets_int_as_u8_f5(Eurydice_slice_index(
6467                         v, (size_t)6U, int16_t, int16_t *));
6468   return (KRML_CLITERAL(uint8_t_x4){
6469       .fst = result0, .snd = result1, .thd = result2, .f3 = result3});
6470 }
6471 
6472 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])6473 libcrux_ml_kem_vector_portable_serialize_serialize_4(
6474     libcrux_ml_kem_vector_portable_vector_type_PortableVector v,
6475     uint8_t ret[8U]) {
6476   uint8_t_x4 result0_3 =
6477       libcrux_ml_kem_vector_portable_serialize_serialize_4_int(
6478           Eurydice_array_to_subslice3(v.elements, (size_t)0U, (size_t)8U,
6479                                       int16_t *));
6480   uint8_t_x4 result4_7 =
6481       libcrux_ml_kem_vector_portable_serialize_serialize_4_int(
6482           Eurydice_array_to_subslice3(v.elements, (size_t)8U, (size_t)16U,
6483                                       int16_t *));
6484   ret[0U] = result0_3.fst;
6485   ret[1U] = result0_3.snd;
6486   ret[2U] = result0_3.thd;
6487   ret[3U] = result0_3.f3;
6488   ret[4U] = result4_7.fst;
6489   ret[5U] = result4_7.snd;
6490   ret[6U] = result4_7.thd;
6491   ret[7U] = result4_7.f3;
6492 }
6493 
libcrux_ml_kem_vector_portable_serialize_4(libcrux_ml_kem_vector_portable_vector_type_PortableVector a,uint8_t ret[8U])6494 static inline void libcrux_ml_kem_vector_portable_serialize_4(
6495     libcrux_ml_kem_vector_portable_vector_type_PortableVector a,
6496     uint8_t ret[8U]) {
6497   uint8_t ret0[8U];
6498   libcrux_ml_kem_vector_portable_serialize_serialize_4(a, ret0);
6499   libcrux_secrets_int_public_integers_declassify_d8_76(ret0, ret);
6500 }
6501 
6502 /**
6503 This function found in impl {libcrux_ml_kem::vector::traits::Operations for
6504 libcrux_ml_kem::vector::portable::vector_type::PortableVector}
6505 */
libcrux_ml_kem_vector_portable_serialize_4_b8(libcrux_ml_kem_vector_portable_vector_type_PortableVector a,uint8_t ret[8U])6506 static inline void libcrux_ml_kem_vector_portable_serialize_4_b8(
6507     libcrux_ml_kem_vector_portable_vector_type_PortableVector a,
6508     uint8_t ret[8U]) {
6509   libcrux_ml_kem_vector_portable_serialize_4(a, ret);
6510 }
6511 
6512 static KRML_MUSTINLINE int16_t_x8
libcrux_ml_kem_vector_portable_serialize_deserialize_4_int(Eurydice_slice bytes)6513 libcrux_ml_kem_vector_portable_serialize_deserialize_4_int(
6514     Eurydice_slice bytes) {
6515   int16_t v0 = libcrux_secrets_int_as_i16_59(
6516       (uint32_t)Eurydice_slice_index(bytes, (size_t)0U, uint8_t, uint8_t *) &
6517       15U);
6518   int16_t v1 = libcrux_secrets_int_as_i16_59(
6519       (uint32_t)Eurydice_slice_index(bytes, (size_t)0U, uint8_t, uint8_t *) >>
6520           4U &
6521       15U);
6522   int16_t v2 = libcrux_secrets_int_as_i16_59(
6523       (uint32_t)Eurydice_slice_index(bytes, (size_t)1U, uint8_t, uint8_t *) &
6524       15U);
6525   int16_t v3 = libcrux_secrets_int_as_i16_59(
6526       (uint32_t)Eurydice_slice_index(bytes, (size_t)1U, uint8_t, uint8_t *) >>
6527           4U &
6528       15U);
6529   int16_t v4 = libcrux_secrets_int_as_i16_59(
6530       (uint32_t)Eurydice_slice_index(bytes, (size_t)2U, uint8_t, uint8_t *) &
6531       15U);
6532   int16_t v5 = libcrux_secrets_int_as_i16_59(
6533       (uint32_t)Eurydice_slice_index(bytes, (size_t)2U, uint8_t, uint8_t *) >>
6534           4U &
6535       15U);
6536   int16_t v6 = libcrux_secrets_int_as_i16_59(
6537       (uint32_t)Eurydice_slice_index(bytes, (size_t)3U, uint8_t, uint8_t *) &
6538       15U);
6539   int16_t v7 = libcrux_secrets_int_as_i16_59(
6540       (uint32_t)Eurydice_slice_index(bytes, (size_t)3U, uint8_t, uint8_t *) >>
6541           4U &
6542       15U);
6543   return (KRML_CLITERAL(int16_t_x8){.fst = v0,
6544                                     .snd = v1,
6545                                     .thd = v2,
6546                                     .f3 = v3,
6547                                     .f4 = v4,
6548                                     .f5 = v5,
6549                                     .f6 = v6,
6550                                     .f7 = v7});
6551 }
6552 
6553 static KRML_MUSTINLINE libcrux_ml_kem_vector_portable_vector_type_PortableVector
libcrux_ml_kem_vector_portable_serialize_deserialize_4(Eurydice_slice bytes)6554 libcrux_ml_kem_vector_portable_serialize_deserialize_4(Eurydice_slice bytes) {
6555   int16_t_x8 v0_7 = libcrux_ml_kem_vector_portable_serialize_deserialize_4_int(
6556       Eurydice_slice_subslice3(bytes, (size_t)0U, (size_t)4U, uint8_t *));
6557   int16_t_x8 v8_15 = libcrux_ml_kem_vector_portable_serialize_deserialize_4_int(
6558       Eurydice_slice_subslice3(bytes, (size_t)4U, (size_t)8U, uint8_t *));
6559   return (
6560       KRML_CLITERAL(libcrux_ml_kem_vector_portable_vector_type_PortableVector){
6561           .elements = {v0_7.fst, v0_7.snd, v0_7.thd, v0_7.f3, v0_7.f4, v0_7.f5,
6562                        v0_7.f6, v0_7.f7, v8_15.fst, v8_15.snd, v8_15.thd,
6563                        v8_15.f3, v8_15.f4, v8_15.f5, v8_15.f6, v8_15.f7}});
6564 }
6565 
6566 static inline libcrux_ml_kem_vector_portable_vector_type_PortableVector
libcrux_ml_kem_vector_portable_deserialize_4(Eurydice_slice a)6567 libcrux_ml_kem_vector_portable_deserialize_4(Eurydice_slice a) {
6568   return libcrux_ml_kem_vector_portable_serialize_deserialize_4(
6569       libcrux_secrets_int_classify_public_classify_ref_9b_90(a));
6570 }
6571 
6572 /**
6573 This function found in impl {libcrux_ml_kem::vector::traits::Operations for
6574 libcrux_ml_kem::vector::portable::vector_type::PortableVector}
6575 */
6576 static inline libcrux_ml_kem_vector_portable_vector_type_PortableVector
libcrux_ml_kem_vector_portable_deserialize_4_b8(Eurydice_slice a)6577 libcrux_ml_kem_vector_portable_deserialize_4_b8(Eurydice_slice a) {
6578   return libcrux_ml_kem_vector_portable_deserialize_4(a);
6579 }
6580 
6581 typedef struct uint8_t_x5_s {
6582   uint8_t fst;
6583   uint8_t snd;
6584   uint8_t thd;
6585   uint8_t f3;
6586   uint8_t f4;
6587 } uint8_t_x5;
6588 
6589 static KRML_MUSTINLINE uint8_t_x5
libcrux_ml_kem_vector_portable_serialize_serialize_10_int(Eurydice_slice v)6590 libcrux_ml_kem_vector_portable_serialize_serialize_10_int(Eurydice_slice v) {
6591   uint8_t r0 = libcrux_secrets_int_as_u8_f5(
6592       Eurydice_slice_index(v, (size_t)0U, int16_t, int16_t *) & (int16_t)255);
6593   uint8_t r1 =
6594       (uint32_t)libcrux_secrets_int_as_u8_f5(
6595           Eurydice_slice_index(v, (size_t)1U, int16_t, int16_t *) & (int16_t)63)
6596           << 2U |
6597       (uint32_t)libcrux_secrets_int_as_u8_f5(
6598           Eurydice_slice_index(v, (size_t)0U, int16_t, int16_t *) >> 8U &
6599           (int16_t)3);
6600   uint8_t r2 =
6601       (uint32_t)libcrux_secrets_int_as_u8_f5(
6602           Eurydice_slice_index(v, (size_t)2U, int16_t, int16_t *) & (int16_t)15)
6603           << 4U |
6604       (uint32_t)libcrux_secrets_int_as_u8_f5(
6605           Eurydice_slice_index(v, (size_t)1U, int16_t, int16_t *) >> 6U &
6606           (int16_t)15);
6607   uint8_t r3 =
6608       (uint32_t)libcrux_secrets_int_as_u8_f5(
6609           Eurydice_slice_index(v, (size_t)3U, int16_t, int16_t *) & (int16_t)3)
6610           << 6U |
6611       (uint32_t)libcrux_secrets_int_as_u8_f5(
6612           Eurydice_slice_index(v, (size_t)2U, int16_t, int16_t *) >> 4U &
6613           (int16_t)63);
6614   uint8_t r4 = libcrux_secrets_int_as_u8_f5(
6615       Eurydice_slice_index(v, (size_t)3U, int16_t, int16_t *) >> 2U &
6616       (int16_t)255);
6617   return (KRML_CLITERAL(uint8_t_x5){
6618       .fst = r0, .snd = r1, .thd = r2, .f3 = r3, .f4 = r4});
6619 }
6620 
6621 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])6622 libcrux_ml_kem_vector_portable_serialize_serialize_10(
6623     libcrux_ml_kem_vector_portable_vector_type_PortableVector v,
6624     uint8_t ret[20U]) {
6625   uint8_t_x5 r0_4 = libcrux_ml_kem_vector_portable_serialize_serialize_10_int(
6626       Eurydice_array_to_subslice3(v.elements, (size_t)0U, (size_t)4U,
6627                                   int16_t *));
6628   uint8_t_x5 r5_9 = libcrux_ml_kem_vector_portable_serialize_serialize_10_int(
6629       Eurydice_array_to_subslice3(v.elements, (size_t)4U, (size_t)8U,
6630                                   int16_t *));
6631   uint8_t_x5 r10_14 = libcrux_ml_kem_vector_portable_serialize_serialize_10_int(
6632       Eurydice_array_to_subslice3(v.elements, (size_t)8U, (size_t)12U,
6633                                   int16_t *));
6634   uint8_t_x5 r15_19 = libcrux_ml_kem_vector_portable_serialize_serialize_10_int(
6635       Eurydice_array_to_subslice3(v.elements, (size_t)12U, (size_t)16U,
6636                                   int16_t *));
6637   ret[0U] = r0_4.fst;
6638   ret[1U] = r0_4.snd;
6639   ret[2U] = r0_4.thd;
6640   ret[3U] = r0_4.f3;
6641   ret[4U] = r0_4.f4;
6642   ret[5U] = r5_9.fst;
6643   ret[6U] = r5_9.snd;
6644   ret[7U] = r5_9.thd;
6645   ret[8U] = r5_9.f3;
6646   ret[9U] = r5_9.f4;
6647   ret[10U] = r10_14.fst;
6648   ret[11U] = r10_14.snd;
6649   ret[12U] = r10_14.thd;
6650   ret[13U] = r10_14.f3;
6651   ret[14U] = r10_14.f4;
6652   ret[15U] = r15_19.fst;
6653   ret[16U] = r15_19.snd;
6654   ret[17U] = r15_19.thd;
6655   ret[18U] = r15_19.f3;
6656   ret[19U] = r15_19.f4;
6657 }
6658 
libcrux_ml_kem_vector_portable_serialize_10(libcrux_ml_kem_vector_portable_vector_type_PortableVector a,uint8_t ret[20U])6659 static inline void libcrux_ml_kem_vector_portable_serialize_10(
6660     libcrux_ml_kem_vector_portable_vector_type_PortableVector a,
6661     uint8_t ret[20U]) {
6662   uint8_t ret0[20U];
6663   libcrux_ml_kem_vector_portable_serialize_serialize_10(a, ret0);
6664   libcrux_secrets_int_public_integers_declassify_d8_57(ret0, ret);
6665 }
6666 
6667 /**
6668 This function found in impl {libcrux_ml_kem::vector::traits::Operations for
6669 libcrux_ml_kem::vector::portable::vector_type::PortableVector}
6670 */
libcrux_ml_kem_vector_portable_serialize_10_b8(libcrux_ml_kem_vector_portable_vector_type_PortableVector a,uint8_t ret[20U])6671 static inline void libcrux_ml_kem_vector_portable_serialize_10_b8(
6672     libcrux_ml_kem_vector_portable_vector_type_PortableVector a,
6673     uint8_t ret[20U]) {
6674   libcrux_ml_kem_vector_portable_serialize_10(a, ret);
6675 }
6676 
6677 static KRML_MUSTINLINE int16_t_x8
libcrux_ml_kem_vector_portable_serialize_deserialize_10_int(Eurydice_slice bytes)6678 libcrux_ml_kem_vector_portable_serialize_deserialize_10_int(
6679     Eurydice_slice bytes) {
6680   int16_t r0 = libcrux_secrets_int_as_i16_f5(
6681       (libcrux_secrets_int_as_i16_59(
6682            Eurydice_slice_index(bytes, (size_t)1U, uint8_t, uint8_t *)) &
6683        (int16_t)3)
6684           << 8U |
6685       (libcrux_secrets_int_as_i16_59(
6686            Eurydice_slice_index(bytes, (size_t)0U, uint8_t, uint8_t *)) &
6687        (int16_t)255));
6688   int16_t r1 = libcrux_secrets_int_as_i16_f5(
6689       (libcrux_secrets_int_as_i16_59(
6690            Eurydice_slice_index(bytes, (size_t)2U, uint8_t, uint8_t *)) &
6691        (int16_t)15)
6692           << 6U |
6693       libcrux_secrets_int_as_i16_59(
6694           Eurydice_slice_index(bytes, (size_t)1U, uint8_t, uint8_t *)) >>
6695           2U);
6696   int16_t r2 = libcrux_secrets_int_as_i16_f5(
6697       (libcrux_secrets_int_as_i16_59(
6698            Eurydice_slice_index(bytes, (size_t)3U, uint8_t, uint8_t *)) &
6699        (int16_t)63)
6700           << 4U |
6701       libcrux_secrets_int_as_i16_59(
6702           Eurydice_slice_index(bytes, (size_t)2U, uint8_t, uint8_t *)) >>
6703           4U);
6704   int16_t r3 = libcrux_secrets_int_as_i16_f5(
6705       libcrux_secrets_int_as_i16_59(
6706           Eurydice_slice_index(bytes, (size_t)4U, uint8_t, uint8_t *))
6707           << 2U |
6708       libcrux_secrets_int_as_i16_59(
6709           Eurydice_slice_index(bytes, (size_t)3U, uint8_t, uint8_t *)) >>
6710           6U);
6711   int16_t r4 = libcrux_secrets_int_as_i16_f5(
6712       (libcrux_secrets_int_as_i16_59(
6713            Eurydice_slice_index(bytes, (size_t)6U, uint8_t, uint8_t *)) &
6714        (int16_t)3)
6715           << 8U |
6716       (libcrux_secrets_int_as_i16_59(
6717            Eurydice_slice_index(bytes, (size_t)5U, uint8_t, uint8_t *)) &
6718        (int16_t)255));
6719   int16_t r5 = libcrux_secrets_int_as_i16_f5(
6720       (libcrux_secrets_int_as_i16_59(
6721            Eurydice_slice_index(bytes, (size_t)7U, uint8_t, uint8_t *)) &
6722        (int16_t)15)
6723           << 6U |
6724       libcrux_secrets_int_as_i16_59(
6725           Eurydice_slice_index(bytes, (size_t)6U, uint8_t, uint8_t *)) >>
6726           2U);
6727   int16_t r6 = libcrux_secrets_int_as_i16_f5(
6728       (libcrux_secrets_int_as_i16_59(
6729            Eurydice_slice_index(bytes, (size_t)8U, uint8_t, uint8_t *)) &
6730        (int16_t)63)
6731           << 4U |
6732       libcrux_secrets_int_as_i16_59(
6733           Eurydice_slice_index(bytes, (size_t)7U, uint8_t, uint8_t *)) >>
6734           4U);
6735   int16_t r7 = libcrux_secrets_int_as_i16_f5(
6736       libcrux_secrets_int_as_i16_59(
6737           Eurydice_slice_index(bytes, (size_t)9U, uint8_t, uint8_t *))
6738           << 2U |
6739       libcrux_secrets_int_as_i16_59(
6740           Eurydice_slice_index(bytes, (size_t)8U, uint8_t, uint8_t *)) >>
6741           6U);
6742   return (KRML_CLITERAL(int16_t_x8){.fst = r0,
6743                                     .snd = r1,
6744                                     .thd = r2,
6745                                     .f3 = r3,
6746                                     .f4 = r4,
6747                                     .f5 = r5,
6748                                     .f6 = r6,
6749                                     .f7 = r7});
6750 }
6751 
6752 static KRML_MUSTINLINE libcrux_ml_kem_vector_portable_vector_type_PortableVector
libcrux_ml_kem_vector_portable_serialize_deserialize_10(Eurydice_slice bytes)6753 libcrux_ml_kem_vector_portable_serialize_deserialize_10(Eurydice_slice bytes) {
6754   int16_t_x8 v0_7 = libcrux_ml_kem_vector_portable_serialize_deserialize_10_int(
6755       Eurydice_slice_subslice3(bytes, (size_t)0U, (size_t)10U, uint8_t *));
6756   int16_t_x8 v8_15 =
6757       libcrux_ml_kem_vector_portable_serialize_deserialize_10_int(
6758           Eurydice_slice_subslice3(bytes, (size_t)10U, (size_t)20U, uint8_t *));
6759   return (
6760       KRML_CLITERAL(libcrux_ml_kem_vector_portable_vector_type_PortableVector){
6761           .elements = {v0_7.fst, v0_7.snd, v0_7.thd, v0_7.f3, v0_7.f4, v0_7.f5,
6762                        v0_7.f6, v0_7.f7, v8_15.fst, v8_15.snd, v8_15.thd,
6763                        v8_15.f3, v8_15.f4, v8_15.f5, v8_15.f6, v8_15.f7}});
6764 }
6765 
6766 static inline libcrux_ml_kem_vector_portable_vector_type_PortableVector
libcrux_ml_kem_vector_portable_deserialize_10(Eurydice_slice a)6767 libcrux_ml_kem_vector_portable_deserialize_10(Eurydice_slice a) {
6768   return libcrux_ml_kem_vector_portable_serialize_deserialize_10(
6769       libcrux_secrets_int_classify_public_classify_ref_9b_90(a));
6770 }
6771 
6772 /**
6773 This function found in impl {libcrux_ml_kem::vector::traits::Operations for
6774 libcrux_ml_kem::vector::portable::vector_type::PortableVector}
6775 */
6776 static inline libcrux_ml_kem_vector_portable_vector_type_PortableVector
libcrux_ml_kem_vector_portable_deserialize_10_b8(Eurydice_slice a)6777 libcrux_ml_kem_vector_portable_deserialize_10_b8(Eurydice_slice a) {
6778   return libcrux_ml_kem_vector_portable_deserialize_10(a);
6779 }
6780 
6781 typedef struct uint8_t_x3_s {
6782   uint8_t fst;
6783   uint8_t snd;
6784   uint8_t thd;
6785 } uint8_t_x3;
6786 
6787 static KRML_MUSTINLINE uint8_t_x3
libcrux_ml_kem_vector_portable_serialize_serialize_12_int(Eurydice_slice v)6788 libcrux_ml_kem_vector_portable_serialize_serialize_12_int(Eurydice_slice v) {
6789   uint8_t r0 = libcrux_secrets_int_as_u8_f5(
6790       Eurydice_slice_index(v, (size_t)0U, int16_t, int16_t *) & (int16_t)255);
6791   uint8_t r1 = libcrux_secrets_int_as_u8_f5(
6792       Eurydice_slice_index(v, (size_t)0U, int16_t, int16_t *) >> 8U |
6793       (Eurydice_slice_index(v, (size_t)1U, int16_t, int16_t *) & (int16_t)15)
6794           << 4U);
6795   uint8_t r2 = libcrux_secrets_int_as_u8_f5(
6796       Eurydice_slice_index(v, (size_t)1U, int16_t, int16_t *) >> 4U &
6797       (int16_t)255);
6798   return (KRML_CLITERAL(uint8_t_x3){.fst = r0, .snd = r1, .thd = r2});
6799 }
6800 
6801 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])6802 libcrux_ml_kem_vector_portable_serialize_serialize_12(
6803     libcrux_ml_kem_vector_portable_vector_type_PortableVector v,
6804     uint8_t ret[24U]) {
6805   uint8_t_x3 r0_2 = libcrux_ml_kem_vector_portable_serialize_serialize_12_int(
6806       Eurydice_array_to_subslice3(v.elements, (size_t)0U, (size_t)2U,
6807                                   int16_t *));
6808   uint8_t_x3 r3_5 = libcrux_ml_kem_vector_portable_serialize_serialize_12_int(
6809       Eurydice_array_to_subslice3(v.elements, (size_t)2U, (size_t)4U,
6810                                   int16_t *));
6811   uint8_t_x3 r6_8 = libcrux_ml_kem_vector_portable_serialize_serialize_12_int(
6812       Eurydice_array_to_subslice3(v.elements, (size_t)4U, (size_t)6U,
6813                                   int16_t *));
6814   uint8_t_x3 r9_11 = libcrux_ml_kem_vector_portable_serialize_serialize_12_int(
6815       Eurydice_array_to_subslice3(v.elements, (size_t)6U, (size_t)8U,
6816                                   int16_t *));
6817   uint8_t_x3 r12_14 = libcrux_ml_kem_vector_portable_serialize_serialize_12_int(
6818       Eurydice_array_to_subslice3(v.elements, (size_t)8U, (size_t)10U,
6819                                   int16_t *));
6820   uint8_t_x3 r15_17 = libcrux_ml_kem_vector_portable_serialize_serialize_12_int(
6821       Eurydice_array_to_subslice3(v.elements, (size_t)10U, (size_t)12U,
6822                                   int16_t *));
6823   uint8_t_x3 r18_20 = libcrux_ml_kem_vector_portable_serialize_serialize_12_int(
6824       Eurydice_array_to_subslice3(v.elements, (size_t)12U, (size_t)14U,
6825                                   int16_t *));
6826   uint8_t_x3 r21_23 = libcrux_ml_kem_vector_portable_serialize_serialize_12_int(
6827       Eurydice_array_to_subslice3(v.elements, (size_t)14U, (size_t)16U,
6828                                   int16_t *));
6829   ret[0U] = r0_2.fst;
6830   ret[1U] = r0_2.snd;
6831   ret[2U] = r0_2.thd;
6832   ret[3U] = r3_5.fst;
6833   ret[4U] = r3_5.snd;
6834   ret[5U] = r3_5.thd;
6835   ret[6U] = r6_8.fst;
6836   ret[7U] = r6_8.snd;
6837   ret[8U] = r6_8.thd;
6838   ret[9U] = r9_11.fst;
6839   ret[10U] = r9_11.snd;
6840   ret[11U] = r9_11.thd;
6841   ret[12U] = r12_14.fst;
6842   ret[13U] = r12_14.snd;
6843   ret[14U] = r12_14.thd;
6844   ret[15U] = r15_17.fst;
6845   ret[16U] = r15_17.snd;
6846   ret[17U] = r15_17.thd;
6847   ret[18U] = r18_20.fst;
6848   ret[19U] = r18_20.snd;
6849   ret[20U] = r18_20.thd;
6850   ret[21U] = r21_23.fst;
6851   ret[22U] = r21_23.snd;
6852   ret[23U] = r21_23.thd;
6853 }
6854 
libcrux_ml_kem_vector_portable_serialize_12(libcrux_ml_kem_vector_portable_vector_type_PortableVector a,uint8_t ret[24U])6855 static inline void libcrux_ml_kem_vector_portable_serialize_12(
6856     libcrux_ml_kem_vector_portable_vector_type_PortableVector a,
6857     uint8_t ret[24U]) {
6858   uint8_t ret0[24U];
6859   libcrux_ml_kem_vector_portable_serialize_serialize_12(a, ret0);
6860   libcrux_secrets_int_public_integers_declassify_d8_d2(ret0, ret);
6861 }
6862 
6863 /**
6864 This function found in impl {libcrux_ml_kem::vector::traits::Operations for
6865 libcrux_ml_kem::vector::portable::vector_type::PortableVector}
6866 */
libcrux_ml_kem_vector_portable_serialize_12_b8(libcrux_ml_kem_vector_portable_vector_type_PortableVector a,uint8_t ret[24U])6867 static inline void libcrux_ml_kem_vector_portable_serialize_12_b8(
6868     libcrux_ml_kem_vector_portable_vector_type_PortableVector a,
6869     uint8_t ret[24U]) {
6870   libcrux_ml_kem_vector_portable_serialize_12(a, ret);
6871 }
6872 
6873 typedef struct int16_t_x2_s {
6874   int16_t fst;
6875   int16_t snd;
6876 } int16_t_x2;
6877 
6878 static KRML_MUSTINLINE int16_t_x2
libcrux_ml_kem_vector_portable_serialize_deserialize_12_int(Eurydice_slice bytes)6879 libcrux_ml_kem_vector_portable_serialize_deserialize_12_int(
6880     Eurydice_slice bytes) {
6881   int16_t byte0 = libcrux_secrets_int_as_i16_59(
6882       Eurydice_slice_index(bytes, (size_t)0U, uint8_t, uint8_t *));
6883   int16_t byte1 = libcrux_secrets_int_as_i16_59(
6884       Eurydice_slice_index(bytes, (size_t)1U, uint8_t, uint8_t *));
6885   int16_t byte2 = libcrux_secrets_int_as_i16_59(
6886       Eurydice_slice_index(bytes, (size_t)2U, uint8_t, uint8_t *));
6887   int16_t r0 = (byte1 & (int16_t)15) << 8U | (byte0 & (int16_t)255);
6888   int16_t r1 = byte2 << 4U | (byte1 >> 4U & (int16_t)15);
6889   return (KRML_CLITERAL(int16_t_x2){.fst = r0, .snd = r1});
6890 }
6891 
6892 static KRML_MUSTINLINE libcrux_ml_kem_vector_portable_vector_type_PortableVector
libcrux_ml_kem_vector_portable_serialize_deserialize_12(Eurydice_slice bytes)6893 libcrux_ml_kem_vector_portable_serialize_deserialize_12(Eurydice_slice bytes) {
6894   int16_t_x2 v0_1 = libcrux_ml_kem_vector_portable_serialize_deserialize_12_int(
6895       Eurydice_slice_subslice3(bytes, (size_t)0U, (size_t)3U, uint8_t *));
6896   int16_t_x2 v2_3 = libcrux_ml_kem_vector_portable_serialize_deserialize_12_int(
6897       Eurydice_slice_subslice3(bytes, (size_t)3U, (size_t)6U, uint8_t *));
6898   int16_t_x2 v4_5 = libcrux_ml_kem_vector_portable_serialize_deserialize_12_int(
6899       Eurydice_slice_subslice3(bytes, (size_t)6U, (size_t)9U, uint8_t *));
6900   int16_t_x2 v6_7 = libcrux_ml_kem_vector_portable_serialize_deserialize_12_int(
6901       Eurydice_slice_subslice3(bytes, (size_t)9U, (size_t)12U, uint8_t *));
6902   int16_t_x2 v8_9 = libcrux_ml_kem_vector_portable_serialize_deserialize_12_int(
6903       Eurydice_slice_subslice3(bytes, (size_t)12U, (size_t)15U, uint8_t *));
6904   int16_t_x2 v10_11 =
6905       libcrux_ml_kem_vector_portable_serialize_deserialize_12_int(
6906           Eurydice_slice_subslice3(bytes, (size_t)15U, (size_t)18U, uint8_t *));
6907   int16_t_x2 v12_13 =
6908       libcrux_ml_kem_vector_portable_serialize_deserialize_12_int(
6909           Eurydice_slice_subslice3(bytes, (size_t)18U, (size_t)21U, uint8_t *));
6910   int16_t_x2 v14_15 =
6911       libcrux_ml_kem_vector_portable_serialize_deserialize_12_int(
6912           Eurydice_slice_subslice3(bytes, (size_t)21U, (size_t)24U, uint8_t *));
6913   return (
6914       KRML_CLITERAL(libcrux_ml_kem_vector_portable_vector_type_PortableVector){
6915           .elements = {v0_1.fst, v0_1.snd, v2_3.fst, v2_3.snd, v4_5.fst,
6916                        v4_5.snd, v6_7.fst, v6_7.snd, v8_9.fst, v8_9.snd,
6917                        v10_11.fst, v10_11.snd, v12_13.fst, v12_13.snd,
6918                        v14_15.fst, v14_15.snd}});
6919 }
6920 
6921 static inline libcrux_ml_kem_vector_portable_vector_type_PortableVector
libcrux_ml_kem_vector_portable_deserialize_12(Eurydice_slice a)6922 libcrux_ml_kem_vector_portable_deserialize_12(Eurydice_slice a) {
6923   return libcrux_ml_kem_vector_portable_serialize_deserialize_12(
6924       libcrux_secrets_int_classify_public_classify_ref_9b_90(a));
6925 }
6926 
6927 /**
6928 This function found in impl {libcrux_ml_kem::vector::traits::Operations for
6929 libcrux_ml_kem::vector::portable::vector_type::PortableVector}
6930 */
6931 static inline libcrux_ml_kem_vector_portable_vector_type_PortableVector
libcrux_ml_kem_vector_portable_deserialize_12_b8(Eurydice_slice a)6932 libcrux_ml_kem_vector_portable_deserialize_12_b8(Eurydice_slice a) {
6933   return libcrux_ml_kem_vector_portable_deserialize_12(a);
6934 }
6935 
6936 static KRML_MUSTINLINE size_t
libcrux_ml_kem_vector_portable_sampling_rej_sample(Eurydice_slice a,Eurydice_slice result)6937 libcrux_ml_kem_vector_portable_sampling_rej_sample(Eurydice_slice a,
6938                                                    Eurydice_slice result) {
6939   size_t sampled = (size_t)0U;
6940   for (size_t i = (size_t)0U; i < Eurydice_slice_len(a, uint8_t) / (size_t)3U;
6941        i++) {
6942     size_t i0 = i;
6943     int16_t b1 = (int16_t)Eurydice_slice_index(a, i0 * (size_t)3U + (size_t)0U,
6944                                                uint8_t, uint8_t *);
6945     int16_t b2 = (int16_t)Eurydice_slice_index(a, i0 * (size_t)3U + (size_t)1U,
6946                                                uint8_t, uint8_t *);
6947     int16_t b3 = (int16_t)Eurydice_slice_index(a, i0 * (size_t)3U + (size_t)2U,
6948                                                uint8_t, uint8_t *);
6949     int16_t d1 = (b2 & (int16_t)15) << 8U | b1;
6950     int16_t d2 = b3 << 4U | b2 >> 4U;
6951     if (d1 < LIBCRUX_ML_KEM_VECTOR_TRAITS_FIELD_MODULUS) {
6952       if (sampled < (size_t)16U) {
6953         Eurydice_slice_index(result, sampled, int16_t, int16_t *) = d1;
6954         sampled++;
6955       }
6956     }
6957     if (d2 < LIBCRUX_ML_KEM_VECTOR_TRAITS_FIELD_MODULUS) {
6958       if (sampled < (size_t)16U) {
6959         Eurydice_slice_index(result, sampled, int16_t, int16_t *) = d2;
6960         sampled++;
6961       }
6962     }
6963   }
6964   return sampled;
6965 }
6966 
6967 /**
6968 This function found in impl {libcrux_ml_kem::vector::traits::Operations for
6969 libcrux_ml_kem::vector::portable::vector_type::PortableVector}
6970 */
libcrux_ml_kem_vector_portable_rej_sample_b8(Eurydice_slice a,Eurydice_slice out)6971 static inline size_t libcrux_ml_kem_vector_portable_rej_sample_b8(
6972     Eurydice_slice a, Eurydice_slice out) {
6973   return libcrux_ml_kem_vector_portable_sampling_rej_sample(a, out);
6974 }
6975 
6976 #define LIBCRUX_ML_KEM_MLKEM768_VECTOR_U_COMPRESSION_FACTOR ((size_t)10U)
6977 
6978 #define LIBCRUX_ML_KEM_MLKEM768_C1_BLOCK_SIZE              \
6979   (LIBCRUX_ML_KEM_CONSTANTS_COEFFICIENTS_IN_RING_ELEMENT * \
6980    LIBCRUX_ML_KEM_MLKEM768_VECTOR_U_COMPRESSION_FACTOR / (size_t)8U)
6981 
6982 #define LIBCRUX_ML_KEM_MLKEM768_RANK ((size_t)3U)
6983 
6984 #define LIBCRUX_ML_KEM_MLKEM768_C1_SIZE \
6985   (LIBCRUX_ML_KEM_MLKEM768_C1_BLOCK_SIZE * LIBCRUX_ML_KEM_MLKEM768_RANK)
6986 
6987 #define LIBCRUX_ML_KEM_MLKEM768_VECTOR_V_COMPRESSION_FACTOR ((size_t)4U)
6988 
6989 #define LIBCRUX_ML_KEM_MLKEM768_C2_SIZE                    \
6990   (LIBCRUX_ML_KEM_CONSTANTS_COEFFICIENTS_IN_RING_ELEMENT * \
6991    LIBCRUX_ML_KEM_MLKEM768_VECTOR_V_COMPRESSION_FACTOR / (size_t)8U)
6992 
6993 #define LIBCRUX_ML_KEM_MLKEM768_CPA_PKE_CIPHERTEXT_SIZE \
6994   (LIBCRUX_ML_KEM_MLKEM768_C1_SIZE + LIBCRUX_ML_KEM_MLKEM768_C2_SIZE)
6995 
6996 #define LIBCRUX_ML_KEM_MLKEM768_T_AS_NTT_ENCODED_SIZE      \
6997   (LIBCRUX_ML_KEM_MLKEM768_RANK *                          \
6998    LIBCRUX_ML_KEM_CONSTANTS_COEFFICIENTS_IN_RING_ELEMENT * \
6999    LIBCRUX_ML_KEM_CONSTANTS_BITS_PER_COEFFICIENT / (size_t)8U)
7000 
7001 #define LIBCRUX_ML_KEM_MLKEM768_CPA_PKE_PUBLIC_KEY_SIZE \
7002   (LIBCRUX_ML_KEM_MLKEM768_T_AS_NTT_ENCODED_SIZE + (size_t)32U)
7003 
7004 #define LIBCRUX_ML_KEM_MLKEM768_CPA_PKE_SECRET_KEY_SIZE    \
7005   (LIBCRUX_ML_KEM_MLKEM768_RANK *                          \
7006    LIBCRUX_ML_KEM_CONSTANTS_COEFFICIENTS_IN_RING_ELEMENT * \
7007    LIBCRUX_ML_KEM_CONSTANTS_BITS_PER_COEFFICIENT / (size_t)8U)
7008 
7009 #define LIBCRUX_ML_KEM_MLKEM768_ETA1 ((size_t)2U)
7010 
7011 #define LIBCRUX_ML_KEM_MLKEM768_ETA1_RANDOMNESS_SIZE \
7012   (LIBCRUX_ML_KEM_MLKEM768_ETA1 * (size_t)64U)
7013 
7014 #define LIBCRUX_ML_KEM_MLKEM768_ETA2 ((size_t)2U)
7015 
7016 #define LIBCRUX_ML_KEM_MLKEM768_ETA2_RANDOMNESS_SIZE \
7017   (LIBCRUX_ML_KEM_MLKEM768_ETA2 * (size_t)64U)
7018 
7019 #define LIBCRUX_ML_KEM_MLKEM768_IMPLICIT_REJECTION_HASH_INPUT_SIZE \
7020   (LIBCRUX_ML_KEM_CONSTANTS_SHARED_SECRET_SIZE +                   \
7021    LIBCRUX_ML_KEM_MLKEM768_CPA_PKE_CIPHERTEXT_SIZE)
7022 
7023 typedef libcrux_ml_kem_types_MlKemPrivateKey_d9
7024     libcrux_ml_kem_mlkem768_MlKem768PrivateKey;
7025 
7026 typedef libcrux_ml_kem_types_MlKemPublicKey_30
7027     libcrux_ml_kem_mlkem768_MlKem768PublicKey;
7028 
7029 #define LIBCRUX_ML_KEM_MLKEM768_RANKED_BYTES_PER_RING_ELEMENT \
7030   (LIBCRUX_ML_KEM_MLKEM768_RANK *                             \
7031    LIBCRUX_ML_KEM_CONSTANTS_BITS_PER_RING_ELEMENT / (size_t)8U)
7032 
7033 #define LIBCRUX_ML_KEM_MLKEM768_SECRET_KEY_SIZE      \
7034   (LIBCRUX_ML_KEM_MLKEM768_CPA_PKE_SECRET_KEY_SIZE + \
7035    LIBCRUX_ML_KEM_MLKEM768_CPA_PKE_PUBLIC_KEY_SIZE + \
7036    LIBCRUX_ML_KEM_CONSTANTS_H_DIGEST_SIZE +          \
7037    LIBCRUX_ML_KEM_CONSTANTS_SHARED_SECRET_SIZE)
7038 
7039 /**
7040 A monomorphic instance of libcrux_ml_kem.polynomial.PolynomialRingElement
7041 with types libcrux_ml_kem_vector_portable_vector_type_PortableVector
7042 
7043 */
7044 typedef struct libcrux_ml_kem_polynomial_PolynomialRingElement_1d_s {
7045   libcrux_ml_kem_vector_portable_vector_type_PortableVector coefficients[16U];
7046 } libcrux_ml_kem_polynomial_PolynomialRingElement_1d;
7047 
7048 /**
7049 A monomorphic instance of
7050 libcrux_ml_kem.ind_cpa.unpacked.IndCpaPrivateKeyUnpacked with types
7051 libcrux_ml_kem_vector_portable_vector_type_PortableVector with const generics
7052 - $3size_t
7053 */
7054 typedef struct libcrux_ml_kem_ind_cpa_unpacked_IndCpaPrivateKeyUnpacked_a0_s {
7055   libcrux_ml_kem_polynomial_PolynomialRingElement_1d secret_as_ntt[3U];
7056 } libcrux_ml_kem_ind_cpa_unpacked_IndCpaPrivateKeyUnpacked_a0;
7057 
7058 /**
7059 This function found in impl
7060 {libcrux_ml_kem::polynomial::PolynomialRingElement<Vector>[TraitClause@0,
7061 TraitClause@1]}
7062 */
7063 /**
7064 A monomorphic instance of libcrux_ml_kem.polynomial.ZERO_d6
7065 with types libcrux_ml_kem_vector_portable_vector_type_PortableVector
7066 with const generics
7067 
7068 */
7069 static inline libcrux_ml_kem_polynomial_PolynomialRingElement_1d
libcrux_ml_kem_polynomial_ZERO_d6_ea(void)7070 libcrux_ml_kem_polynomial_ZERO_d6_ea(void) {
7071   libcrux_ml_kem_polynomial_PolynomialRingElement_1d lit;
7072   libcrux_ml_kem_vector_portable_vector_type_PortableVector
7073       repeat_expression[16U];
7074   for (size_t i = (size_t)0U; i < (size_t)16U; i++) {
7075     repeat_expression[i] = libcrux_ml_kem_vector_portable_ZERO_b8();
7076   }
7077   memcpy(lit.coefficients, repeat_expression,
7078          (size_t)16U *
7079              sizeof(libcrux_ml_kem_vector_portable_vector_type_PortableVector));
7080   return lit;
7081 }
7082 
7083 /**
7084 This function found in impl {core::ops::function::FnMut<(usize),
7085 libcrux_ml_kem::polynomial::PolynomialRingElement<Vector>[TraitClause@0,
7086 TraitClause@1]> for libcrux_ml_kem::ind_cpa::decrypt::closure<Vector, K,
7087 CIPHERTEXT_SIZE, VECTOR_U_ENCODED_SIZE, U_COMPRESSION_FACTOR,
7088 V_COMPRESSION_FACTOR>[TraitClause@0, TraitClause@1]}
7089 */
7090 /**
7091 A monomorphic instance of libcrux_ml_kem.ind_cpa.decrypt.call_mut_0b
7092 with types libcrux_ml_kem_vector_portable_vector_type_PortableVector
7093 with const generics
7094 - K= 3
7095 - CIPHERTEXT_SIZE= 1088
7096 - VECTOR_U_ENCODED_SIZE= 960
7097 - U_COMPRESSION_FACTOR= 10
7098 - V_COMPRESSION_FACTOR= 4
7099 */
7100 static inline libcrux_ml_kem_polynomial_PolynomialRingElement_1d
libcrux_ml_kem_ind_cpa_decrypt_call_mut_0b_42(void ** _,size_t tupled_args)7101 libcrux_ml_kem_ind_cpa_decrypt_call_mut_0b_42(void **_, size_t tupled_args) {
7102   return libcrux_ml_kem_polynomial_ZERO_d6_ea();
7103 }
7104 
7105 /**
7106 A monomorphic instance of
7107 libcrux_ml_kem.serialize.deserialize_to_uncompressed_ring_element with types
7108 libcrux_ml_kem_vector_portable_vector_type_PortableVector with const generics
7109 
7110 */
7111 static KRML_MUSTINLINE libcrux_ml_kem_polynomial_PolynomialRingElement_1d
libcrux_ml_kem_serialize_deserialize_to_uncompressed_ring_element_ea(Eurydice_slice serialized)7112 libcrux_ml_kem_serialize_deserialize_to_uncompressed_ring_element_ea(
7113     Eurydice_slice serialized) {
7114   libcrux_ml_kem_polynomial_PolynomialRingElement_1d re =
7115       libcrux_ml_kem_polynomial_ZERO_d6_ea();
7116   for (size_t i = (size_t)0U;
7117        i < Eurydice_slice_len(serialized, uint8_t) / (size_t)24U; i++) {
7118     size_t i0 = i;
7119     Eurydice_slice bytes =
7120         Eurydice_slice_subslice3(serialized, i0 * (size_t)24U,
7121                                  i0 * (size_t)24U + (size_t)24U, uint8_t *);
7122     libcrux_ml_kem_vector_portable_vector_type_PortableVector uu____0 =
7123         libcrux_ml_kem_vector_portable_deserialize_12_b8(bytes);
7124     re.coefficients[i0] = uu____0;
7125   }
7126   return re;
7127 }
7128 
7129 /**
7130  Call [`deserialize_to_uncompressed_ring_element`] for each ring element.
7131 */
7132 /**
7133 A monomorphic instance of libcrux_ml_kem.ind_cpa.deserialize_vector
7134 with types libcrux_ml_kem_vector_portable_vector_type_PortableVector
7135 with const generics
7136 - K= 3
7137 */
libcrux_ml_kem_ind_cpa_deserialize_vector_1b(Eurydice_slice secret_key,libcrux_ml_kem_polynomial_PolynomialRingElement_1d * secret_as_ntt)7138 static KRML_MUSTINLINE void libcrux_ml_kem_ind_cpa_deserialize_vector_1b(
7139     Eurydice_slice secret_key,
7140     libcrux_ml_kem_polynomial_PolynomialRingElement_1d *secret_as_ntt) {
7141   for (size_t i = (size_t)0U; i < (size_t)3U; i++) {
7142     size_t i0 = i;
7143     libcrux_ml_kem_polynomial_PolynomialRingElement_1d uu____0 =
7144         libcrux_ml_kem_serialize_deserialize_to_uncompressed_ring_element_ea(
7145             Eurydice_slice_subslice3(
7146                 secret_key,
7147                 i0 * LIBCRUX_ML_KEM_CONSTANTS_BYTES_PER_RING_ELEMENT,
7148                 (i0 + (size_t)1U) *
7149                     LIBCRUX_ML_KEM_CONSTANTS_BYTES_PER_RING_ELEMENT,
7150                 uint8_t *));
7151     secret_as_ntt[i0] = uu____0;
7152   }
7153 }
7154 
7155 /**
7156 This function found in impl {core::ops::function::FnMut<(usize),
7157 libcrux_ml_kem::polynomial::PolynomialRingElement<Vector>[TraitClause@0,
7158 TraitClause@1]> for
7159 libcrux_ml_kem::ind_cpa::deserialize_then_decompress_u::closure<Vector, K,
7160 CIPHERTEXT_SIZE, U_COMPRESSION_FACTOR>[TraitClause@0, TraitClause@1]}
7161 */
7162 /**
7163 A monomorphic instance of
7164 libcrux_ml_kem.ind_cpa.deserialize_then_decompress_u.call_mut_35 with types
7165 libcrux_ml_kem_vector_portable_vector_type_PortableVector with const generics
7166 - K= 3
7167 - CIPHERTEXT_SIZE= 1088
7168 - U_COMPRESSION_FACTOR= 10
7169 */
7170 static inline libcrux_ml_kem_polynomial_PolynomialRingElement_1d
libcrux_ml_kem_ind_cpa_deserialize_then_decompress_u_call_mut_35_6c(void ** _,size_t tupled_args)7171 libcrux_ml_kem_ind_cpa_deserialize_then_decompress_u_call_mut_35_6c(
7172     void **_, size_t tupled_args) {
7173   return libcrux_ml_kem_polynomial_ZERO_d6_ea();
7174 }
7175 
7176 /**
7177 A monomorphic instance of
7178 libcrux_ml_kem.vector.portable.compress.decompress_ciphertext_coefficient with
7179 const generics
7180 - COEFFICIENT_BITS= 10
7181 */
7182 static KRML_MUSTINLINE libcrux_ml_kem_vector_portable_vector_type_PortableVector
libcrux_ml_kem_vector_portable_compress_decompress_ciphertext_coefficient_ef(libcrux_ml_kem_vector_portable_vector_type_PortableVector a)7183 libcrux_ml_kem_vector_portable_compress_decompress_ciphertext_coefficient_ef(
7184     libcrux_ml_kem_vector_portable_vector_type_PortableVector a) {
7185   for (size_t i = (size_t)0U;
7186        i < LIBCRUX_ML_KEM_VECTOR_TRAITS_FIELD_ELEMENTS_IN_VECTOR; i++) {
7187     size_t i0 = i;
7188     int32_t decompressed =
7189         libcrux_secrets_int_as_i32_f5(a.elements[i0]) *
7190         libcrux_secrets_int_as_i32_f5(
7191             libcrux_secrets_int_public_integers_classify_27_39(
7192                 LIBCRUX_ML_KEM_VECTOR_TRAITS_FIELD_MODULUS));
7193     decompressed = (decompressed << 1U) + ((int32_t)1 << (uint32_t)(int32_t)10);
7194     decompressed = decompressed >> (uint32_t)((int32_t)10 + (int32_t)1);
7195     a.elements[i0] = libcrux_secrets_int_as_i16_36(decompressed);
7196   }
7197   return a;
7198 }
7199 
7200 /**
7201 This function found in impl {libcrux_ml_kem::vector::traits::Operations for
7202 libcrux_ml_kem::vector::portable::vector_type::PortableVector}
7203 */
7204 /**
7205 A monomorphic instance of
7206 libcrux_ml_kem.vector.portable.decompress_ciphertext_coefficient_b8 with const
7207 generics
7208 - COEFFICIENT_BITS= 10
7209 */
7210 static inline libcrux_ml_kem_vector_portable_vector_type_PortableVector
libcrux_ml_kem_vector_portable_decompress_ciphertext_coefficient_b8_ef(libcrux_ml_kem_vector_portable_vector_type_PortableVector a)7211 libcrux_ml_kem_vector_portable_decompress_ciphertext_coefficient_b8_ef(
7212     libcrux_ml_kem_vector_portable_vector_type_PortableVector a) {
7213   return libcrux_ml_kem_vector_portable_compress_decompress_ciphertext_coefficient_ef(
7214       a);
7215 }
7216 
7217 /**
7218 A monomorphic instance of
7219 libcrux_ml_kem.serialize.deserialize_then_decompress_10 with types
7220 libcrux_ml_kem_vector_portable_vector_type_PortableVector with const generics
7221 
7222 */
7223 static KRML_MUSTINLINE libcrux_ml_kem_polynomial_PolynomialRingElement_1d
libcrux_ml_kem_serialize_deserialize_then_decompress_10_ea(Eurydice_slice serialized)7224 libcrux_ml_kem_serialize_deserialize_then_decompress_10_ea(
7225     Eurydice_slice serialized) {
7226   libcrux_ml_kem_polynomial_PolynomialRingElement_1d re =
7227       libcrux_ml_kem_polynomial_ZERO_d6_ea();
7228   for (size_t i = (size_t)0U;
7229        i < Eurydice_slice_len(serialized, uint8_t) / (size_t)20U; i++) {
7230     size_t i0 = i;
7231     Eurydice_slice bytes =
7232         Eurydice_slice_subslice3(serialized, i0 * (size_t)20U,
7233                                  i0 * (size_t)20U + (size_t)20U, uint8_t *);
7234     libcrux_ml_kem_vector_portable_vector_type_PortableVector coefficient =
7235         libcrux_ml_kem_vector_portable_deserialize_10_b8(bytes);
7236     libcrux_ml_kem_vector_portable_vector_type_PortableVector uu____0 =
7237         libcrux_ml_kem_vector_portable_decompress_ciphertext_coefficient_b8_ef(
7238             coefficient);
7239     re.coefficients[i0] = uu____0;
7240   }
7241   return re;
7242 }
7243 
7244 /**
7245 A monomorphic instance of
7246 libcrux_ml_kem.serialize.deserialize_then_decompress_ring_element_u with types
7247 libcrux_ml_kem_vector_portable_vector_type_PortableVector with const generics
7248 - COMPRESSION_FACTOR= 10
7249 */
7250 static KRML_MUSTINLINE libcrux_ml_kem_polynomial_PolynomialRingElement_1d
libcrux_ml_kem_serialize_deserialize_then_decompress_ring_element_u_0a(Eurydice_slice serialized)7251 libcrux_ml_kem_serialize_deserialize_then_decompress_ring_element_u_0a(
7252     Eurydice_slice serialized) {
7253   return libcrux_ml_kem_serialize_deserialize_then_decompress_10_ea(serialized);
7254 }
7255 
7256 typedef struct libcrux_ml_kem_vector_portable_vector_type_PortableVector_x2_s {
7257   libcrux_ml_kem_vector_portable_vector_type_PortableVector fst;
7258   libcrux_ml_kem_vector_portable_vector_type_PortableVector snd;
7259 } libcrux_ml_kem_vector_portable_vector_type_PortableVector_x2;
7260 
7261 /**
7262 A monomorphic instance of libcrux_ml_kem.ntt.ntt_layer_int_vec_step
7263 with types libcrux_ml_kem_vector_portable_vector_type_PortableVector
7264 with const generics
7265 
7266 */
7267 static KRML_MUSTINLINE
7268     libcrux_ml_kem_vector_portable_vector_type_PortableVector_x2
libcrux_ml_kem_ntt_ntt_layer_int_vec_step_ea(libcrux_ml_kem_vector_portable_vector_type_PortableVector a,libcrux_ml_kem_vector_portable_vector_type_PortableVector b,int16_t zeta_r)7269     libcrux_ml_kem_ntt_ntt_layer_int_vec_step_ea(
7270         libcrux_ml_kem_vector_portable_vector_type_PortableVector a,
7271         libcrux_ml_kem_vector_portable_vector_type_PortableVector b,
7272         int16_t zeta_r) {
7273   libcrux_ml_kem_vector_portable_vector_type_PortableVector t =
7274       libcrux_ml_kem_vector_portable_montgomery_multiply_by_constant_b8(b,
7275                                                                         zeta_r);
7276   b = libcrux_ml_kem_vector_portable_sub_b8(a, &t);
7277   a = libcrux_ml_kem_vector_portable_add_b8(a, &t);
7278   return (KRML_CLITERAL(
7279       libcrux_ml_kem_vector_portable_vector_type_PortableVector_x2){.fst = a,
7280                                                                     .snd = b});
7281 }
7282 
7283 /**
7284 A monomorphic instance of libcrux_ml_kem.ntt.ntt_at_layer_4_plus
7285 with types libcrux_ml_kem_vector_portable_vector_type_PortableVector
7286 with const generics
7287 
7288 */
libcrux_ml_kem_ntt_ntt_at_layer_4_plus_ea(size_t * zeta_i,libcrux_ml_kem_polynomial_PolynomialRingElement_1d * re,size_t layer,size_t _initial_coefficient_bound)7289 static KRML_MUSTINLINE void libcrux_ml_kem_ntt_ntt_at_layer_4_plus_ea(
7290     size_t *zeta_i, libcrux_ml_kem_polynomial_PolynomialRingElement_1d *re,
7291     size_t layer, size_t _initial_coefficient_bound) {
7292   size_t step = (size_t)1U << (uint32_t)layer;
7293   for (size_t i0 = (size_t)0U; i0 < (size_t)128U >> (uint32_t)layer; i0++) {
7294     size_t round = i0;
7295     zeta_i[0U] = zeta_i[0U] + (size_t)1U;
7296     size_t offset = round * step * (size_t)2U;
7297     size_t offset_vec = offset / (size_t)16U;
7298     size_t step_vec = step / (size_t)16U;
7299     for (size_t i = offset_vec; i < offset_vec + step_vec; i++) {
7300       size_t j = i;
7301       libcrux_ml_kem_vector_portable_vector_type_PortableVector_x2 uu____0 =
7302           libcrux_ml_kem_ntt_ntt_layer_int_vec_step_ea(
7303               re->coefficients[j], re->coefficients[j + step_vec],
7304               libcrux_ml_kem_polynomial_zeta(zeta_i[0U]));
7305       libcrux_ml_kem_vector_portable_vector_type_PortableVector x = uu____0.fst;
7306       libcrux_ml_kem_vector_portable_vector_type_PortableVector y = uu____0.snd;
7307       re->coefficients[j] = x;
7308       re->coefficients[j + step_vec] = y;
7309     }
7310   }
7311 }
7312 
7313 /**
7314 A monomorphic instance of libcrux_ml_kem.ntt.ntt_at_layer_3
7315 with types libcrux_ml_kem_vector_portable_vector_type_PortableVector
7316 with const generics
7317 
7318 */
libcrux_ml_kem_ntt_ntt_at_layer_3_ea(size_t * zeta_i,libcrux_ml_kem_polynomial_PolynomialRingElement_1d * re,size_t _initial_coefficient_bound)7319 static KRML_MUSTINLINE void libcrux_ml_kem_ntt_ntt_at_layer_3_ea(
7320     size_t *zeta_i, libcrux_ml_kem_polynomial_PolynomialRingElement_1d *re,
7321     size_t _initial_coefficient_bound) {
7322   for (size_t i = (size_t)0U; i < (size_t)16U; i++) {
7323     size_t round = i;
7324     zeta_i[0U] = zeta_i[0U] + (size_t)1U;
7325     libcrux_ml_kem_vector_portable_vector_type_PortableVector uu____0 =
7326         libcrux_ml_kem_vector_portable_ntt_layer_3_step_b8(
7327             re->coefficients[round],
7328             libcrux_ml_kem_polynomial_zeta(zeta_i[0U]));
7329     re->coefficients[round] = uu____0;
7330   }
7331 }
7332 
7333 /**
7334 A monomorphic instance of libcrux_ml_kem.ntt.ntt_at_layer_2
7335 with types libcrux_ml_kem_vector_portable_vector_type_PortableVector
7336 with const generics
7337 
7338 */
libcrux_ml_kem_ntt_ntt_at_layer_2_ea(size_t * zeta_i,libcrux_ml_kem_polynomial_PolynomialRingElement_1d * re,size_t _initial_coefficient_bound)7339 static KRML_MUSTINLINE void libcrux_ml_kem_ntt_ntt_at_layer_2_ea(
7340     size_t *zeta_i, libcrux_ml_kem_polynomial_PolynomialRingElement_1d *re,
7341     size_t _initial_coefficient_bound) {
7342   for (size_t i = (size_t)0U; i < (size_t)16U; i++) {
7343     size_t round = i;
7344     zeta_i[0U] = zeta_i[0U] + (size_t)1U;
7345     re->coefficients[round] =
7346         libcrux_ml_kem_vector_portable_ntt_layer_2_step_b8(
7347             re->coefficients[round], libcrux_ml_kem_polynomial_zeta(zeta_i[0U]),
7348             libcrux_ml_kem_polynomial_zeta(zeta_i[0U] + (size_t)1U));
7349     zeta_i[0U] = zeta_i[0U] + (size_t)1U;
7350   }
7351 }
7352 
7353 /**
7354 A monomorphic instance of libcrux_ml_kem.ntt.ntt_at_layer_1
7355 with types libcrux_ml_kem_vector_portable_vector_type_PortableVector
7356 with const generics
7357 
7358 */
libcrux_ml_kem_ntt_ntt_at_layer_1_ea(size_t * zeta_i,libcrux_ml_kem_polynomial_PolynomialRingElement_1d * re,size_t _initial_coefficient_bound)7359 static KRML_MUSTINLINE void libcrux_ml_kem_ntt_ntt_at_layer_1_ea(
7360     size_t *zeta_i, libcrux_ml_kem_polynomial_PolynomialRingElement_1d *re,
7361     size_t _initial_coefficient_bound) {
7362   for (size_t i = (size_t)0U; i < (size_t)16U; i++) {
7363     size_t round = i;
7364     zeta_i[0U] = zeta_i[0U] + (size_t)1U;
7365     re->coefficients[round] =
7366         libcrux_ml_kem_vector_portable_ntt_layer_1_step_b8(
7367             re->coefficients[round], libcrux_ml_kem_polynomial_zeta(zeta_i[0U]),
7368             libcrux_ml_kem_polynomial_zeta(zeta_i[0U] + (size_t)1U),
7369             libcrux_ml_kem_polynomial_zeta(zeta_i[0U] + (size_t)2U),
7370             libcrux_ml_kem_polynomial_zeta(zeta_i[0U] + (size_t)3U));
7371     zeta_i[0U] = zeta_i[0U] + (size_t)3U;
7372   }
7373 }
7374 
7375 /**
7376 A monomorphic instance of libcrux_ml_kem.polynomial.poly_barrett_reduce
7377 with types libcrux_ml_kem_vector_portable_vector_type_PortableVector
7378 with const generics
7379 
7380 */
libcrux_ml_kem_polynomial_poly_barrett_reduce_ea(libcrux_ml_kem_polynomial_PolynomialRingElement_1d * myself)7381 static KRML_MUSTINLINE void libcrux_ml_kem_polynomial_poly_barrett_reduce_ea(
7382     libcrux_ml_kem_polynomial_PolynomialRingElement_1d *myself) {
7383   for (size_t i = (size_t)0U;
7384        i < LIBCRUX_ML_KEM_POLYNOMIAL_VECTORS_IN_RING_ELEMENT; i++) {
7385     size_t i0 = i;
7386     libcrux_ml_kem_vector_portable_vector_type_PortableVector uu____0 =
7387         libcrux_ml_kem_vector_portable_barrett_reduce_b8(
7388             myself->coefficients[i0]);
7389     myself->coefficients[i0] = uu____0;
7390   }
7391 }
7392 
7393 /**
7394 This function found in impl
7395 {libcrux_ml_kem::polynomial::PolynomialRingElement<Vector>[TraitClause@0,
7396 TraitClause@1]}
7397 */
7398 /**
7399 A monomorphic instance of libcrux_ml_kem.polynomial.poly_barrett_reduce_d6
7400 with types libcrux_ml_kem_vector_portable_vector_type_PortableVector
7401 with const generics
7402 
7403 */
libcrux_ml_kem_polynomial_poly_barrett_reduce_d6_ea(libcrux_ml_kem_polynomial_PolynomialRingElement_1d * self)7404 static KRML_MUSTINLINE void libcrux_ml_kem_polynomial_poly_barrett_reduce_d6_ea(
7405     libcrux_ml_kem_polynomial_PolynomialRingElement_1d *self) {
7406   libcrux_ml_kem_polynomial_poly_barrett_reduce_ea(self);
7407 }
7408 
7409 /**
7410 A monomorphic instance of libcrux_ml_kem.ntt.ntt_vector_u
7411 with types libcrux_ml_kem_vector_portable_vector_type_PortableVector
7412 with const generics
7413 - VECTOR_U_COMPRESSION_FACTOR= 10
7414 */
libcrux_ml_kem_ntt_ntt_vector_u_0a(libcrux_ml_kem_polynomial_PolynomialRingElement_1d * re)7415 static KRML_MUSTINLINE void libcrux_ml_kem_ntt_ntt_vector_u_0a(
7416     libcrux_ml_kem_polynomial_PolynomialRingElement_1d *re) {
7417   size_t zeta_i = (size_t)0U;
7418   libcrux_ml_kem_ntt_ntt_at_layer_4_plus_ea(&zeta_i, re, (size_t)7U,
7419                                             (size_t)3328U);
7420   libcrux_ml_kem_ntt_ntt_at_layer_4_plus_ea(&zeta_i, re, (size_t)6U,
7421                                             (size_t)2U * (size_t)3328U);
7422   libcrux_ml_kem_ntt_ntt_at_layer_4_plus_ea(&zeta_i, re, (size_t)5U,
7423                                             (size_t)3U * (size_t)3328U);
7424   libcrux_ml_kem_ntt_ntt_at_layer_4_plus_ea(&zeta_i, re, (size_t)4U,
7425                                             (size_t)4U * (size_t)3328U);
7426   libcrux_ml_kem_ntt_ntt_at_layer_3_ea(&zeta_i, re, (size_t)5U * (size_t)3328U);
7427   libcrux_ml_kem_ntt_ntt_at_layer_2_ea(&zeta_i, re, (size_t)6U * (size_t)3328U);
7428   libcrux_ml_kem_ntt_ntt_at_layer_1_ea(&zeta_i, re, (size_t)7U * (size_t)3328U);
7429   libcrux_ml_kem_polynomial_poly_barrett_reduce_d6_ea(re);
7430 }
7431 
7432 /**
7433  Call [`deserialize_then_decompress_ring_element_u`] on each ring element
7434  in the `ciphertext`.
7435 */
7436 /**
7437 A monomorphic instance of libcrux_ml_kem.ind_cpa.deserialize_then_decompress_u
7438 with types libcrux_ml_kem_vector_portable_vector_type_PortableVector
7439 with const generics
7440 - K= 3
7441 - CIPHERTEXT_SIZE= 1088
7442 - U_COMPRESSION_FACTOR= 10
7443 */
7444 static KRML_MUSTINLINE void
libcrux_ml_kem_ind_cpa_deserialize_then_decompress_u_6c(uint8_t * ciphertext,libcrux_ml_kem_polynomial_PolynomialRingElement_1d ret[3U])7445 libcrux_ml_kem_ind_cpa_deserialize_then_decompress_u_6c(
7446     uint8_t *ciphertext,
7447     libcrux_ml_kem_polynomial_PolynomialRingElement_1d ret[3U]) {
7448   libcrux_ml_kem_polynomial_PolynomialRingElement_1d u_as_ntt[3U];
7449   for (size_t i = (size_t)0U; i < (size_t)3U; i++) {
7450     /* original Rust expression is not an lvalue in C */
7451     void *lvalue = (void *)0U;
7452     u_as_ntt[i] =
7453         libcrux_ml_kem_ind_cpa_deserialize_then_decompress_u_call_mut_35_6c(
7454             &lvalue, i);
7455   }
7456   for (size_t i = (size_t)0U;
7457        i < Eurydice_slice_len(
7458                Eurydice_array_to_slice((size_t)1088U, ciphertext, uint8_t),
7459                uint8_t) /
7460                (LIBCRUX_ML_KEM_CONSTANTS_COEFFICIENTS_IN_RING_ELEMENT *
7461                 (size_t)10U / (size_t)8U);
7462        i++) {
7463     size_t i0 = i;
7464     Eurydice_slice u_bytes = Eurydice_array_to_subslice3(
7465         ciphertext,
7466         i0 * (LIBCRUX_ML_KEM_CONSTANTS_COEFFICIENTS_IN_RING_ELEMENT *
7467               (size_t)10U / (size_t)8U),
7468         i0 * (LIBCRUX_ML_KEM_CONSTANTS_COEFFICIENTS_IN_RING_ELEMENT *
7469               (size_t)10U / (size_t)8U) +
7470             LIBCRUX_ML_KEM_CONSTANTS_COEFFICIENTS_IN_RING_ELEMENT *
7471                 (size_t)10U / (size_t)8U,
7472         uint8_t *);
7473     u_as_ntt[i0] =
7474         libcrux_ml_kem_serialize_deserialize_then_decompress_ring_element_u_0a(
7475             u_bytes);
7476     libcrux_ml_kem_ntt_ntt_vector_u_0a(&u_as_ntt[i0]);
7477   }
7478   memcpy(
7479       ret, u_as_ntt,
7480       (size_t)3U * sizeof(libcrux_ml_kem_polynomial_PolynomialRingElement_1d));
7481 }
7482 
7483 /**
7484 A monomorphic instance of
7485 libcrux_ml_kem.vector.portable.compress.decompress_ciphertext_coefficient with
7486 const generics
7487 - COEFFICIENT_BITS= 4
7488 */
7489 static KRML_MUSTINLINE libcrux_ml_kem_vector_portable_vector_type_PortableVector
libcrux_ml_kem_vector_portable_compress_decompress_ciphertext_coefficient_d1(libcrux_ml_kem_vector_portable_vector_type_PortableVector a)7490 libcrux_ml_kem_vector_portable_compress_decompress_ciphertext_coefficient_d1(
7491     libcrux_ml_kem_vector_portable_vector_type_PortableVector a) {
7492   for (size_t i = (size_t)0U;
7493        i < LIBCRUX_ML_KEM_VECTOR_TRAITS_FIELD_ELEMENTS_IN_VECTOR; i++) {
7494     size_t i0 = i;
7495     int32_t decompressed =
7496         libcrux_secrets_int_as_i32_f5(a.elements[i0]) *
7497         libcrux_secrets_int_as_i32_f5(
7498             libcrux_secrets_int_public_integers_classify_27_39(
7499                 LIBCRUX_ML_KEM_VECTOR_TRAITS_FIELD_MODULUS));
7500     decompressed = (decompressed << 1U) + ((int32_t)1 << (uint32_t)(int32_t)4);
7501     decompressed = decompressed >> (uint32_t)((int32_t)4 + (int32_t)1);
7502     a.elements[i0] = libcrux_secrets_int_as_i16_36(decompressed);
7503   }
7504   return a;
7505 }
7506 
7507 /**
7508 This function found in impl {libcrux_ml_kem::vector::traits::Operations for
7509 libcrux_ml_kem::vector::portable::vector_type::PortableVector}
7510 */
7511 /**
7512 A monomorphic instance of
7513 libcrux_ml_kem.vector.portable.decompress_ciphertext_coefficient_b8 with const
7514 generics
7515 - COEFFICIENT_BITS= 4
7516 */
7517 static inline libcrux_ml_kem_vector_portable_vector_type_PortableVector
libcrux_ml_kem_vector_portable_decompress_ciphertext_coefficient_b8_d1(libcrux_ml_kem_vector_portable_vector_type_PortableVector a)7518 libcrux_ml_kem_vector_portable_decompress_ciphertext_coefficient_b8_d1(
7519     libcrux_ml_kem_vector_portable_vector_type_PortableVector a) {
7520   return libcrux_ml_kem_vector_portable_compress_decompress_ciphertext_coefficient_d1(
7521       a);
7522 }
7523 
7524 /**
7525 A monomorphic instance of libcrux_ml_kem.serialize.deserialize_then_decompress_4
7526 with types libcrux_ml_kem_vector_portable_vector_type_PortableVector
7527 with const generics
7528 
7529 */
7530 static KRML_MUSTINLINE libcrux_ml_kem_polynomial_PolynomialRingElement_1d
libcrux_ml_kem_serialize_deserialize_then_decompress_4_ea(Eurydice_slice serialized)7531 libcrux_ml_kem_serialize_deserialize_then_decompress_4_ea(
7532     Eurydice_slice serialized) {
7533   libcrux_ml_kem_polynomial_PolynomialRingElement_1d re =
7534       libcrux_ml_kem_polynomial_ZERO_d6_ea();
7535   for (size_t i = (size_t)0U;
7536        i < Eurydice_slice_len(serialized, uint8_t) / (size_t)8U; i++) {
7537     size_t i0 = i;
7538     Eurydice_slice bytes = Eurydice_slice_subslice3(
7539         serialized, i0 * (size_t)8U, i0 * (size_t)8U + (size_t)8U, uint8_t *);
7540     libcrux_ml_kem_vector_portable_vector_type_PortableVector coefficient =
7541         libcrux_ml_kem_vector_portable_deserialize_4_b8(bytes);
7542     libcrux_ml_kem_vector_portable_vector_type_PortableVector uu____0 =
7543         libcrux_ml_kem_vector_portable_decompress_ciphertext_coefficient_b8_d1(
7544             coefficient);
7545     re.coefficients[i0] = uu____0;
7546   }
7547   return re;
7548 }
7549 
7550 /**
7551 A monomorphic instance of
7552 libcrux_ml_kem.serialize.deserialize_then_decompress_ring_element_v with types
7553 libcrux_ml_kem_vector_portable_vector_type_PortableVector with const generics
7554 - K= 3
7555 - COMPRESSION_FACTOR= 4
7556 */
7557 static KRML_MUSTINLINE libcrux_ml_kem_polynomial_PolynomialRingElement_1d
libcrux_ml_kem_serialize_deserialize_then_decompress_ring_element_v_89(Eurydice_slice serialized)7558 libcrux_ml_kem_serialize_deserialize_then_decompress_ring_element_v_89(
7559     Eurydice_slice serialized) {
7560   return libcrux_ml_kem_serialize_deserialize_then_decompress_4_ea(serialized);
7561 }
7562 
7563 /**
7564 A monomorphic instance of libcrux_ml_kem.polynomial.ZERO
7565 with types libcrux_ml_kem_vector_portable_vector_type_PortableVector
7566 with const generics
7567 
7568 */
7569 static inline libcrux_ml_kem_polynomial_PolynomialRingElement_1d
libcrux_ml_kem_polynomial_ZERO_ea(void)7570 libcrux_ml_kem_polynomial_ZERO_ea(void) {
7571   libcrux_ml_kem_polynomial_PolynomialRingElement_1d lit;
7572   libcrux_ml_kem_vector_portable_vector_type_PortableVector
7573       repeat_expression[16U];
7574   for (size_t i = (size_t)0U; i < (size_t)16U; i++) {
7575     repeat_expression[i] = libcrux_ml_kem_vector_portable_ZERO_b8();
7576   }
7577   memcpy(lit.coefficients, repeat_expression,
7578          (size_t)16U *
7579              sizeof(libcrux_ml_kem_vector_portable_vector_type_PortableVector));
7580   return lit;
7581 }
7582 
7583 /**
7584  Given two `KyberPolynomialRingElement`s in their NTT representations,
7585  compute their product. Given two polynomials in the NTT domain `f^` and `ĵ`,
7586  the `iᵗʰ` coefficient of the product `k̂` is determined by the calculation:
7587 
7588  ```plaintext
7589  ĥ[2·i] + ĥ[2·i + 1]X = (f^[2·i] + f^[2·i + 1]X)·(ĝ[2·i] + ĝ[2·i + 1]X) mod (X²
7590  - ζ^(2·BitRev₇(i) + 1))
7591  ```
7592 
7593  This function almost implements <strong>Algorithm 10</strong> of the
7594  NIST FIPS 203 standard, which is reproduced below:
7595 
7596  ```plaintext
7597  Input: Two arrays fˆ ∈ ℤ₂₅₆ and ĝ ∈ ℤ₂₅₆.
7598  Output: An array ĥ ∈ ℤq.
7599 
7600  for(i ← 0; i < 128; i++)
7601      (ĥ[2i], ĥ[2i+1]) ← BaseCaseMultiply(fˆ[2i], fˆ[2i+1], ĝ[2i], ĝ[2i+1],
7602  ζ^(2·BitRev₇(i) + 1)) end for return ĥ
7603  ```
7604  We say "almost" because the coefficients of the ring element output by
7605  this function are in the Montgomery domain.
7606 
7607  The NIST FIPS 203 standard can be found at
7608  <https://csrc.nist.gov/pubs/fips/203/ipd>.
7609 */
7610 /**
7611 A monomorphic instance of libcrux_ml_kem.polynomial.ntt_multiply
7612 with types libcrux_ml_kem_vector_portable_vector_type_PortableVector
7613 with const generics
7614 
7615 */
7616 static KRML_MUSTINLINE libcrux_ml_kem_polynomial_PolynomialRingElement_1d
libcrux_ml_kem_polynomial_ntt_multiply_ea(libcrux_ml_kem_polynomial_PolynomialRingElement_1d * myself,libcrux_ml_kem_polynomial_PolynomialRingElement_1d * rhs)7617 libcrux_ml_kem_polynomial_ntt_multiply_ea(
7618     libcrux_ml_kem_polynomial_PolynomialRingElement_1d *myself,
7619     libcrux_ml_kem_polynomial_PolynomialRingElement_1d *rhs) {
7620   libcrux_ml_kem_polynomial_PolynomialRingElement_1d out =
7621       libcrux_ml_kem_polynomial_ZERO_ea();
7622   for (size_t i = (size_t)0U;
7623        i < LIBCRUX_ML_KEM_POLYNOMIAL_VECTORS_IN_RING_ELEMENT; i++) {
7624     size_t i0 = i;
7625     libcrux_ml_kem_vector_portable_vector_type_PortableVector uu____0 =
7626         libcrux_ml_kem_vector_portable_ntt_multiply_b8(
7627             &myself->coefficients[i0], &rhs->coefficients[i0],
7628             libcrux_ml_kem_polynomial_zeta((size_t)64U + (size_t)4U * i0),
7629             libcrux_ml_kem_polynomial_zeta((size_t)64U + (size_t)4U * i0 +
7630                                            (size_t)1U),
7631             libcrux_ml_kem_polynomial_zeta((size_t)64U + (size_t)4U * i0 +
7632                                            (size_t)2U),
7633             libcrux_ml_kem_polynomial_zeta((size_t)64U + (size_t)4U * i0 +
7634                                            (size_t)3U));
7635     out.coefficients[i0] = uu____0;
7636   }
7637   return out;
7638 }
7639 
7640 /**
7641 This function found in impl
7642 {libcrux_ml_kem::polynomial::PolynomialRingElement<Vector>[TraitClause@0,
7643 TraitClause@1]}
7644 */
7645 /**
7646 A monomorphic instance of libcrux_ml_kem.polynomial.ntt_multiply_d6
7647 with types libcrux_ml_kem_vector_portable_vector_type_PortableVector
7648 with const generics
7649 
7650 */
7651 static KRML_MUSTINLINE libcrux_ml_kem_polynomial_PolynomialRingElement_1d
libcrux_ml_kem_polynomial_ntt_multiply_d6_ea(libcrux_ml_kem_polynomial_PolynomialRingElement_1d * self,libcrux_ml_kem_polynomial_PolynomialRingElement_1d * rhs)7652 libcrux_ml_kem_polynomial_ntt_multiply_d6_ea(
7653     libcrux_ml_kem_polynomial_PolynomialRingElement_1d *self,
7654     libcrux_ml_kem_polynomial_PolynomialRingElement_1d *rhs) {
7655   return libcrux_ml_kem_polynomial_ntt_multiply_ea(self, rhs);
7656 }
7657 
7658 /**
7659  Given two polynomial ring elements `lhs` and `rhs`, compute the pointwise
7660  sum of their constituent coefficients.
7661 */
7662 /**
7663 A monomorphic instance of libcrux_ml_kem.polynomial.add_to_ring_element
7664 with types libcrux_ml_kem_vector_portable_vector_type_PortableVector
7665 with const generics
7666 - K= 3
7667 */
libcrux_ml_kem_polynomial_add_to_ring_element_1b(libcrux_ml_kem_polynomial_PolynomialRingElement_1d * myself,libcrux_ml_kem_polynomial_PolynomialRingElement_1d * rhs)7668 static KRML_MUSTINLINE void libcrux_ml_kem_polynomial_add_to_ring_element_1b(
7669     libcrux_ml_kem_polynomial_PolynomialRingElement_1d *myself,
7670     libcrux_ml_kem_polynomial_PolynomialRingElement_1d *rhs) {
7671   for (size_t i = (size_t)0U;
7672        i < Eurydice_slice_len(
7673                Eurydice_array_to_slice(
7674                    (size_t)16U, myself->coefficients,
7675                    libcrux_ml_kem_vector_portable_vector_type_PortableVector),
7676                libcrux_ml_kem_vector_portable_vector_type_PortableVector);
7677        i++) {
7678     size_t i0 = i;
7679     libcrux_ml_kem_vector_portable_vector_type_PortableVector uu____0 =
7680         libcrux_ml_kem_vector_portable_add_b8(myself->coefficients[i0],
7681                                               &rhs->coefficients[i0]);
7682     myself->coefficients[i0] = uu____0;
7683   }
7684 }
7685 
7686 /**
7687 This function found in impl
7688 {libcrux_ml_kem::polynomial::PolynomialRingElement<Vector>[TraitClause@0,
7689 TraitClause@1]}
7690 */
7691 /**
7692 A monomorphic instance of libcrux_ml_kem.polynomial.add_to_ring_element_d6
7693 with types libcrux_ml_kem_vector_portable_vector_type_PortableVector
7694 with const generics
7695 - K= 3
7696 */
libcrux_ml_kem_polynomial_add_to_ring_element_d6_1b(libcrux_ml_kem_polynomial_PolynomialRingElement_1d * self,libcrux_ml_kem_polynomial_PolynomialRingElement_1d * rhs)7697 static KRML_MUSTINLINE void libcrux_ml_kem_polynomial_add_to_ring_element_d6_1b(
7698     libcrux_ml_kem_polynomial_PolynomialRingElement_1d *self,
7699     libcrux_ml_kem_polynomial_PolynomialRingElement_1d *rhs) {
7700   libcrux_ml_kem_polynomial_add_to_ring_element_1b(self, rhs);
7701 }
7702 
7703 /**
7704 A monomorphic instance of libcrux_ml_kem.invert_ntt.invert_ntt_at_layer_1
7705 with types libcrux_ml_kem_vector_portable_vector_type_PortableVector
7706 with const generics
7707 
7708 */
libcrux_ml_kem_invert_ntt_invert_ntt_at_layer_1_ea(size_t * zeta_i,libcrux_ml_kem_polynomial_PolynomialRingElement_1d * re)7709 static KRML_MUSTINLINE void libcrux_ml_kem_invert_ntt_invert_ntt_at_layer_1_ea(
7710     size_t *zeta_i, libcrux_ml_kem_polynomial_PolynomialRingElement_1d *re) {
7711   for (size_t i = (size_t)0U; i < (size_t)16U; i++) {
7712     size_t round = i;
7713     zeta_i[0U] = zeta_i[0U] - (size_t)1U;
7714     re->coefficients[round] =
7715         libcrux_ml_kem_vector_portable_inv_ntt_layer_1_step_b8(
7716             re->coefficients[round], libcrux_ml_kem_polynomial_zeta(zeta_i[0U]),
7717             libcrux_ml_kem_polynomial_zeta(zeta_i[0U] - (size_t)1U),
7718             libcrux_ml_kem_polynomial_zeta(zeta_i[0U] - (size_t)2U),
7719             libcrux_ml_kem_polynomial_zeta(zeta_i[0U] - (size_t)3U));
7720     zeta_i[0U] = zeta_i[0U] - (size_t)3U;
7721   }
7722 }
7723 
7724 /**
7725 A monomorphic instance of libcrux_ml_kem.invert_ntt.invert_ntt_at_layer_2
7726 with types libcrux_ml_kem_vector_portable_vector_type_PortableVector
7727 with const generics
7728 
7729 */
libcrux_ml_kem_invert_ntt_invert_ntt_at_layer_2_ea(size_t * zeta_i,libcrux_ml_kem_polynomial_PolynomialRingElement_1d * re)7730 static KRML_MUSTINLINE void libcrux_ml_kem_invert_ntt_invert_ntt_at_layer_2_ea(
7731     size_t *zeta_i, libcrux_ml_kem_polynomial_PolynomialRingElement_1d *re) {
7732   for (size_t i = (size_t)0U; i < (size_t)16U; i++) {
7733     size_t round = i;
7734     zeta_i[0U] = zeta_i[0U] - (size_t)1U;
7735     re->coefficients[round] =
7736         libcrux_ml_kem_vector_portable_inv_ntt_layer_2_step_b8(
7737             re->coefficients[round], libcrux_ml_kem_polynomial_zeta(zeta_i[0U]),
7738             libcrux_ml_kem_polynomial_zeta(zeta_i[0U] - (size_t)1U));
7739     zeta_i[0U] = zeta_i[0U] - (size_t)1U;
7740   }
7741 }
7742 
7743 /**
7744 A monomorphic instance of libcrux_ml_kem.invert_ntt.invert_ntt_at_layer_3
7745 with types libcrux_ml_kem_vector_portable_vector_type_PortableVector
7746 with const generics
7747 
7748 */
libcrux_ml_kem_invert_ntt_invert_ntt_at_layer_3_ea(size_t * zeta_i,libcrux_ml_kem_polynomial_PolynomialRingElement_1d * re)7749 static KRML_MUSTINLINE void libcrux_ml_kem_invert_ntt_invert_ntt_at_layer_3_ea(
7750     size_t *zeta_i, libcrux_ml_kem_polynomial_PolynomialRingElement_1d *re) {
7751   for (size_t i = (size_t)0U; i < (size_t)16U; i++) {
7752     size_t round = i;
7753     zeta_i[0U] = zeta_i[0U] - (size_t)1U;
7754     libcrux_ml_kem_vector_portable_vector_type_PortableVector uu____0 =
7755         libcrux_ml_kem_vector_portable_inv_ntt_layer_3_step_b8(
7756             re->coefficients[round],
7757             libcrux_ml_kem_polynomial_zeta(zeta_i[0U]));
7758     re->coefficients[round] = uu____0;
7759   }
7760 }
7761 
7762 /**
7763 A monomorphic instance of
7764 libcrux_ml_kem.invert_ntt.inv_ntt_layer_int_vec_step_reduce with types
7765 libcrux_ml_kem_vector_portable_vector_type_PortableVector with const generics
7766 
7767 */
7768 static KRML_MUSTINLINE
7769     libcrux_ml_kem_vector_portable_vector_type_PortableVector_x2
libcrux_ml_kem_invert_ntt_inv_ntt_layer_int_vec_step_reduce_ea(libcrux_ml_kem_vector_portable_vector_type_PortableVector a,libcrux_ml_kem_vector_portable_vector_type_PortableVector b,int16_t zeta_r)7770     libcrux_ml_kem_invert_ntt_inv_ntt_layer_int_vec_step_reduce_ea(
7771         libcrux_ml_kem_vector_portable_vector_type_PortableVector a,
7772         libcrux_ml_kem_vector_portable_vector_type_PortableVector b,
7773         int16_t zeta_r) {
7774   libcrux_ml_kem_vector_portable_vector_type_PortableVector a_minus_b =
7775       libcrux_ml_kem_vector_portable_sub_b8(b, &a);
7776   a = libcrux_ml_kem_vector_portable_barrett_reduce_b8(
7777       libcrux_ml_kem_vector_portable_add_b8(a, &b));
7778   b = libcrux_ml_kem_vector_portable_montgomery_multiply_by_constant_b8(
7779       a_minus_b, zeta_r);
7780   return (KRML_CLITERAL(
7781       libcrux_ml_kem_vector_portable_vector_type_PortableVector_x2){.fst = a,
7782                                                                     .snd = b});
7783 }
7784 
7785 /**
7786 A monomorphic instance of libcrux_ml_kem.invert_ntt.invert_ntt_at_layer_4_plus
7787 with types libcrux_ml_kem_vector_portable_vector_type_PortableVector
7788 with const generics
7789 
7790 */
7791 static KRML_MUSTINLINE void
libcrux_ml_kem_invert_ntt_invert_ntt_at_layer_4_plus_ea(size_t * zeta_i,libcrux_ml_kem_polynomial_PolynomialRingElement_1d * re,size_t layer)7792 libcrux_ml_kem_invert_ntt_invert_ntt_at_layer_4_plus_ea(
7793     size_t *zeta_i, libcrux_ml_kem_polynomial_PolynomialRingElement_1d *re,
7794     size_t layer) {
7795   size_t step = (size_t)1U << (uint32_t)layer;
7796   for (size_t i0 = (size_t)0U; i0 < (size_t)128U >> (uint32_t)layer; i0++) {
7797     size_t round = i0;
7798     zeta_i[0U] = zeta_i[0U] - (size_t)1U;
7799     size_t offset = round * step * (size_t)2U;
7800     size_t offset_vec =
7801         offset / LIBCRUX_ML_KEM_VECTOR_TRAITS_FIELD_ELEMENTS_IN_VECTOR;
7802     size_t step_vec =
7803         step / LIBCRUX_ML_KEM_VECTOR_TRAITS_FIELD_ELEMENTS_IN_VECTOR;
7804     for (size_t i = offset_vec; i < offset_vec + step_vec; i++) {
7805       size_t j = i;
7806       libcrux_ml_kem_vector_portable_vector_type_PortableVector_x2 uu____0 =
7807           libcrux_ml_kem_invert_ntt_inv_ntt_layer_int_vec_step_reduce_ea(
7808               re->coefficients[j], re->coefficients[j + step_vec],
7809               libcrux_ml_kem_polynomial_zeta(zeta_i[0U]));
7810       libcrux_ml_kem_vector_portable_vector_type_PortableVector x = uu____0.fst;
7811       libcrux_ml_kem_vector_portable_vector_type_PortableVector y = uu____0.snd;
7812       re->coefficients[j] = x;
7813       re->coefficients[j + step_vec] = y;
7814     }
7815   }
7816 }
7817 
7818 /**
7819 A monomorphic instance of libcrux_ml_kem.invert_ntt.invert_ntt_montgomery
7820 with types libcrux_ml_kem_vector_portable_vector_type_PortableVector
7821 with const generics
7822 - K= 3
7823 */
libcrux_ml_kem_invert_ntt_invert_ntt_montgomery_1b(libcrux_ml_kem_polynomial_PolynomialRingElement_1d * re)7824 static KRML_MUSTINLINE void libcrux_ml_kem_invert_ntt_invert_ntt_montgomery_1b(
7825     libcrux_ml_kem_polynomial_PolynomialRingElement_1d *re) {
7826   size_t zeta_i =
7827       LIBCRUX_ML_KEM_CONSTANTS_COEFFICIENTS_IN_RING_ELEMENT / (size_t)2U;
7828   libcrux_ml_kem_invert_ntt_invert_ntt_at_layer_1_ea(&zeta_i, re);
7829   libcrux_ml_kem_invert_ntt_invert_ntt_at_layer_2_ea(&zeta_i, re);
7830   libcrux_ml_kem_invert_ntt_invert_ntt_at_layer_3_ea(&zeta_i, re);
7831   libcrux_ml_kem_invert_ntt_invert_ntt_at_layer_4_plus_ea(&zeta_i, re,
7832                                                           (size_t)4U);
7833   libcrux_ml_kem_invert_ntt_invert_ntt_at_layer_4_plus_ea(&zeta_i, re,
7834                                                           (size_t)5U);
7835   libcrux_ml_kem_invert_ntt_invert_ntt_at_layer_4_plus_ea(&zeta_i, re,
7836                                                           (size_t)6U);
7837   libcrux_ml_kem_invert_ntt_invert_ntt_at_layer_4_plus_ea(&zeta_i, re,
7838                                                           (size_t)7U);
7839   libcrux_ml_kem_polynomial_poly_barrett_reduce_d6_ea(re);
7840 }
7841 
7842 /**
7843 A monomorphic instance of libcrux_ml_kem.polynomial.subtract_reduce
7844 with types libcrux_ml_kem_vector_portable_vector_type_PortableVector
7845 with const generics
7846 
7847 */
7848 static KRML_MUSTINLINE libcrux_ml_kem_polynomial_PolynomialRingElement_1d
libcrux_ml_kem_polynomial_subtract_reduce_ea(libcrux_ml_kem_polynomial_PolynomialRingElement_1d * myself,libcrux_ml_kem_polynomial_PolynomialRingElement_1d b)7849 libcrux_ml_kem_polynomial_subtract_reduce_ea(
7850     libcrux_ml_kem_polynomial_PolynomialRingElement_1d *myself,
7851     libcrux_ml_kem_polynomial_PolynomialRingElement_1d b) {
7852   for (size_t i = (size_t)0U;
7853        i < LIBCRUX_ML_KEM_POLYNOMIAL_VECTORS_IN_RING_ELEMENT; i++) {
7854     size_t i0 = i;
7855     libcrux_ml_kem_vector_portable_vector_type_PortableVector
7856         coefficient_normal_form =
7857             libcrux_ml_kem_vector_portable_montgomery_multiply_by_constant_b8(
7858                 b.coefficients[i0], (int16_t)1441);
7859     libcrux_ml_kem_vector_portable_vector_type_PortableVector diff =
7860         libcrux_ml_kem_vector_portable_sub_b8(myself->coefficients[i0],
7861                                               &coefficient_normal_form);
7862     libcrux_ml_kem_vector_portable_vector_type_PortableVector red =
7863         libcrux_ml_kem_vector_portable_barrett_reduce_b8(diff);
7864     b.coefficients[i0] = red;
7865   }
7866   return b;
7867 }
7868 
7869 /**
7870 This function found in impl
7871 {libcrux_ml_kem::polynomial::PolynomialRingElement<Vector>[TraitClause@0,
7872 TraitClause@1]}
7873 */
7874 /**
7875 A monomorphic instance of libcrux_ml_kem.polynomial.subtract_reduce_d6
7876 with types libcrux_ml_kem_vector_portable_vector_type_PortableVector
7877 with const generics
7878 
7879 */
7880 static KRML_MUSTINLINE libcrux_ml_kem_polynomial_PolynomialRingElement_1d
libcrux_ml_kem_polynomial_subtract_reduce_d6_ea(libcrux_ml_kem_polynomial_PolynomialRingElement_1d * self,libcrux_ml_kem_polynomial_PolynomialRingElement_1d b)7881 libcrux_ml_kem_polynomial_subtract_reduce_d6_ea(
7882     libcrux_ml_kem_polynomial_PolynomialRingElement_1d *self,
7883     libcrux_ml_kem_polynomial_PolynomialRingElement_1d b) {
7884   return libcrux_ml_kem_polynomial_subtract_reduce_ea(self, b);
7885 }
7886 
7887 /**
7888  The following functions compute various expressions involving
7889  vectors and matrices. The computation of these expressions has been
7890  abstracted away into these functions in order to save on loop iterations.
7891  Compute v − InverseNTT(sᵀ ◦ NTT(u))
7892 */
7893 /**
7894 A monomorphic instance of libcrux_ml_kem.matrix.compute_message
7895 with types libcrux_ml_kem_vector_portable_vector_type_PortableVector
7896 with const generics
7897 - K= 3
7898 */
7899 static KRML_MUSTINLINE libcrux_ml_kem_polynomial_PolynomialRingElement_1d
libcrux_ml_kem_matrix_compute_message_1b(libcrux_ml_kem_polynomial_PolynomialRingElement_1d * v,libcrux_ml_kem_polynomial_PolynomialRingElement_1d * secret_as_ntt,libcrux_ml_kem_polynomial_PolynomialRingElement_1d * u_as_ntt)7900 libcrux_ml_kem_matrix_compute_message_1b(
7901     libcrux_ml_kem_polynomial_PolynomialRingElement_1d *v,
7902     libcrux_ml_kem_polynomial_PolynomialRingElement_1d *secret_as_ntt,
7903     libcrux_ml_kem_polynomial_PolynomialRingElement_1d *u_as_ntt) {
7904   libcrux_ml_kem_polynomial_PolynomialRingElement_1d result =
7905       libcrux_ml_kem_polynomial_ZERO_d6_ea();
7906   for (size_t i = (size_t)0U; i < (size_t)3U; i++) {
7907     size_t i0 = i;
7908     libcrux_ml_kem_polynomial_PolynomialRingElement_1d product =
7909         libcrux_ml_kem_polynomial_ntt_multiply_d6_ea(&secret_as_ntt[i0],
7910                                                      &u_as_ntt[i0]);
7911     libcrux_ml_kem_polynomial_add_to_ring_element_d6_1b(&result, &product);
7912   }
7913   libcrux_ml_kem_invert_ntt_invert_ntt_montgomery_1b(&result);
7914   return libcrux_ml_kem_polynomial_subtract_reduce_d6_ea(v, result);
7915 }
7916 
7917 /**
7918 A monomorphic instance of libcrux_ml_kem.serialize.to_unsigned_field_modulus
7919 with types libcrux_ml_kem_vector_portable_vector_type_PortableVector
7920 with const generics
7921 
7922 */
7923 static KRML_MUSTINLINE libcrux_ml_kem_vector_portable_vector_type_PortableVector
libcrux_ml_kem_serialize_to_unsigned_field_modulus_ea(libcrux_ml_kem_vector_portable_vector_type_PortableVector a)7924 libcrux_ml_kem_serialize_to_unsigned_field_modulus_ea(
7925     libcrux_ml_kem_vector_portable_vector_type_PortableVector a) {
7926   return libcrux_ml_kem_vector_portable_to_unsigned_representative_b8(a);
7927 }
7928 
7929 /**
7930 A monomorphic instance of
7931 libcrux_ml_kem.serialize.compress_then_serialize_message with types
7932 libcrux_ml_kem_vector_portable_vector_type_PortableVector with const generics
7933 
7934 */
7935 static KRML_MUSTINLINE void
libcrux_ml_kem_serialize_compress_then_serialize_message_ea(libcrux_ml_kem_polynomial_PolynomialRingElement_1d re,uint8_t ret[32U])7936 libcrux_ml_kem_serialize_compress_then_serialize_message_ea(
7937     libcrux_ml_kem_polynomial_PolynomialRingElement_1d re, uint8_t ret[32U]) {
7938   uint8_t serialized[32U] = {0U};
7939   for (size_t i = (size_t)0U; i < (size_t)16U; i++) {
7940     size_t i0 = i;
7941     libcrux_ml_kem_vector_portable_vector_type_PortableVector coefficient =
7942         libcrux_ml_kem_serialize_to_unsigned_field_modulus_ea(
7943             re.coefficients[i0]);
7944     libcrux_ml_kem_vector_portable_vector_type_PortableVector
7945         coefficient_compressed =
7946             libcrux_ml_kem_vector_portable_compress_1_b8(coefficient);
7947     uint8_t bytes[2U];
7948     libcrux_ml_kem_vector_portable_serialize_1_b8(coefficient_compressed,
7949                                                   bytes);
7950     Eurydice_slice_copy(
7951         Eurydice_array_to_subslice3(serialized, (size_t)2U * i0,
7952                                     (size_t)2U * i0 + (size_t)2U, uint8_t *),
7953         Eurydice_array_to_slice((size_t)2U, bytes, uint8_t), uint8_t);
7954   }
7955   memcpy(ret, serialized, (size_t)32U * sizeof(uint8_t));
7956 }
7957 
7958 /**
7959  This function implements <strong>Algorithm 14</strong> of the
7960  NIST FIPS 203 specification; this is the Kyber CPA-PKE decryption algorithm.
7961 
7962  Algorithm 14 is reproduced below:
7963 
7964  ```plaintext
7965  Input: decryption key dkₚₖₑ ∈ ��^{384k}.
7966  Input: ciphertext c ∈ ��^{32(dᵤk + dᵥ)}.
7967  Output: message m ∈ ��^{32}.
7968 
7969  c₁ ← c[0 : 32dᵤk]
7970  c₂ ← c[32dᵤk : 32(dᵤk + dᵥ)]
7971  u ← Decompress_{dᵤ}(ByteDecode_{dᵤ}(c₁))
7972  v ← Decompress_{dᵥ}(ByteDecode_{dᵥ}(c₂))
7973  ŝ ← ByteDecode₁₂(dkₚₖₑ)
7974  w ← v - NTT-¹(ŝᵀ ◦ NTT(u))
7975  m ← ByteEncode₁(Compress₁(w))
7976  return m
7977  ```
7978 
7979  The NIST FIPS 203 standard can be found at
7980  <https://csrc.nist.gov/pubs/fips/203/ipd>.
7981 */
7982 /**
7983 A monomorphic instance of libcrux_ml_kem.ind_cpa.decrypt_unpacked
7984 with types libcrux_ml_kem_vector_portable_vector_type_PortableVector
7985 with const generics
7986 - K= 3
7987 - CIPHERTEXT_SIZE= 1088
7988 - VECTOR_U_ENCODED_SIZE= 960
7989 - U_COMPRESSION_FACTOR= 10
7990 - V_COMPRESSION_FACTOR= 4
7991 */
libcrux_ml_kem_ind_cpa_decrypt_unpacked_42(libcrux_ml_kem_ind_cpa_unpacked_IndCpaPrivateKeyUnpacked_a0 * secret_key,uint8_t * ciphertext,uint8_t ret[32U])7992 static KRML_MUSTINLINE void libcrux_ml_kem_ind_cpa_decrypt_unpacked_42(
7993     libcrux_ml_kem_ind_cpa_unpacked_IndCpaPrivateKeyUnpacked_a0 *secret_key,
7994     uint8_t *ciphertext, uint8_t ret[32U]) {
7995   libcrux_ml_kem_polynomial_PolynomialRingElement_1d u_as_ntt[3U];
7996   libcrux_ml_kem_ind_cpa_deserialize_then_decompress_u_6c(ciphertext, u_as_ntt);
7997   libcrux_ml_kem_polynomial_PolynomialRingElement_1d v =
7998       libcrux_ml_kem_serialize_deserialize_then_decompress_ring_element_v_89(
7999           Eurydice_array_to_subslice_from((size_t)1088U, ciphertext,
8000                                           (size_t)960U, uint8_t, size_t,
8001                                           uint8_t[]));
8002   libcrux_ml_kem_polynomial_PolynomialRingElement_1d message =
8003       libcrux_ml_kem_matrix_compute_message_1b(&v, secret_key->secret_as_ntt,
8004                                                u_as_ntt);
8005   uint8_t ret0[32U];
8006   libcrux_ml_kem_serialize_compress_then_serialize_message_ea(message, ret0);
8007   memcpy(ret, ret0, (size_t)32U * sizeof(uint8_t));
8008 }
8009 
8010 /**
8011 A monomorphic instance of libcrux_ml_kem.ind_cpa.decrypt
8012 with types libcrux_ml_kem_vector_portable_vector_type_PortableVector
8013 with const generics
8014 - K= 3
8015 - CIPHERTEXT_SIZE= 1088
8016 - VECTOR_U_ENCODED_SIZE= 960
8017 - U_COMPRESSION_FACTOR= 10
8018 - V_COMPRESSION_FACTOR= 4
8019 */
libcrux_ml_kem_ind_cpa_decrypt_42(Eurydice_slice secret_key,uint8_t * ciphertext,uint8_t ret[32U])8020 static KRML_MUSTINLINE void libcrux_ml_kem_ind_cpa_decrypt_42(
8021     Eurydice_slice secret_key, uint8_t *ciphertext, uint8_t ret[32U]) {
8022   libcrux_ml_kem_ind_cpa_unpacked_IndCpaPrivateKeyUnpacked_a0
8023       secret_key_unpacked;
8024   libcrux_ml_kem_polynomial_PolynomialRingElement_1d ret0[3U];
8025   for (size_t i = (size_t)0U; i < (size_t)3U; i++) {
8026     /* original Rust expression is not an lvalue in C */
8027     void *lvalue = (void *)0U;
8028     ret0[i] = libcrux_ml_kem_ind_cpa_decrypt_call_mut_0b_42(&lvalue, i);
8029   }
8030   memcpy(
8031       secret_key_unpacked.secret_as_ntt, ret0,
8032       (size_t)3U * sizeof(libcrux_ml_kem_polynomial_PolynomialRingElement_1d));
8033   libcrux_ml_kem_ind_cpa_deserialize_vector_1b(
8034       secret_key, secret_key_unpacked.secret_as_ntt);
8035   uint8_t ret1[32U];
8036   libcrux_ml_kem_ind_cpa_decrypt_unpacked_42(&secret_key_unpacked, ciphertext,
8037                                              ret1);
8038   memcpy(ret, ret1, (size_t)32U * sizeof(uint8_t));
8039 }
8040 
8041 /**
8042 This function found in impl {libcrux_ml_kem::hash_functions::Hash<K> for
8043 libcrux_ml_kem::hash_functions::portable::PortableHash<K>}
8044 */
8045 /**
8046 A monomorphic instance of libcrux_ml_kem.hash_functions.portable.G_4a
8047 with const generics
8048 - K= 3
8049 */
libcrux_ml_kem_hash_functions_portable_G_4a_e0(Eurydice_slice input,uint8_t ret[64U])8050 static inline void libcrux_ml_kem_hash_functions_portable_G_4a_e0(
8051     Eurydice_slice input, uint8_t ret[64U]) {
8052   libcrux_ml_kem_hash_functions_portable_G(input, ret);
8053 }
8054 
8055 /**
8056 A monomorphic instance of libcrux_ml_kem.hash_functions.portable.PRF
8057 with const generics
8058 - LEN= 32
8059 */
libcrux_ml_kem_hash_functions_portable_PRF_9e(Eurydice_slice input,uint8_t ret[32U])8060 static inline void libcrux_ml_kem_hash_functions_portable_PRF_9e(
8061     Eurydice_slice input, uint8_t ret[32U]) {
8062   uint8_t digest[32U] = {0U};
8063   libcrux_sha3_portable_shake256(
8064       Eurydice_array_to_slice((size_t)32U, digest, uint8_t), input);
8065   memcpy(ret, digest, (size_t)32U * sizeof(uint8_t));
8066 }
8067 
8068 /**
8069 This function found in impl {libcrux_ml_kem::hash_functions::Hash<K> for
8070 libcrux_ml_kem::hash_functions::portable::PortableHash<K>}
8071 */
8072 /**
8073 A monomorphic instance of libcrux_ml_kem.hash_functions.portable.PRF_4a
8074 with const generics
8075 - K= 3
8076 - LEN= 32
8077 */
libcrux_ml_kem_hash_functions_portable_PRF_4a_41(Eurydice_slice input,uint8_t ret[32U])8078 static inline void libcrux_ml_kem_hash_functions_portable_PRF_4a_41(
8079     Eurydice_slice input, uint8_t ret[32U]) {
8080   libcrux_ml_kem_hash_functions_portable_PRF_9e(input, ret);
8081 }
8082 
8083 /**
8084 A monomorphic instance of
8085 libcrux_ml_kem.ind_cpa.unpacked.IndCpaPublicKeyUnpacked with types
8086 libcrux_ml_kem_vector_portable_vector_type_PortableVector with const generics
8087 - $3size_t
8088 */
8089 typedef struct libcrux_ml_kem_ind_cpa_unpacked_IndCpaPublicKeyUnpacked_a0_s {
8090   libcrux_ml_kem_polynomial_PolynomialRingElement_1d t_as_ntt[3U];
8091   uint8_t seed_for_A[32U];
8092   libcrux_ml_kem_polynomial_PolynomialRingElement_1d A[3U][3U];
8093 } libcrux_ml_kem_ind_cpa_unpacked_IndCpaPublicKeyUnpacked_a0;
8094 
8095 /**
8096 This function found in impl {core::default::Default for
8097 libcrux_ml_kem::ind_cpa::unpacked::IndCpaPublicKeyUnpacked<Vector,
8098 K>[TraitClause@0, TraitClause@1]}
8099 */
8100 /**
8101 A monomorphic instance of libcrux_ml_kem.ind_cpa.unpacked.default_8b
8102 with types libcrux_ml_kem_vector_portable_vector_type_PortableVector
8103 with const generics
8104 - K= 3
8105 */
8106 static inline libcrux_ml_kem_ind_cpa_unpacked_IndCpaPublicKeyUnpacked_a0
libcrux_ml_kem_ind_cpa_unpacked_default_8b_1b(void)8107 libcrux_ml_kem_ind_cpa_unpacked_default_8b_1b(void) {
8108   libcrux_ml_kem_polynomial_PolynomialRingElement_1d uu____0[3U];
8109   for (size_t i = (size_t)0U; i < (size_t)3U; i++) {
8110     uu____0[i] = libcrux_ml_kem_polynomial_ZERO_d6_ea();
8111   }
8112   uint8_t uu____1[32U] = {0U};
8113   libcrux_ml_kem_ind_cpa_unpacked_IndCpaPublicKeyUnpacked_a0 lit;
8114   memcpy(
8115       lit.t_as_ntt, uu____0,
8116       (size_t)3U * sizeof(libcrux_ml_kem_polynomial_PolynomialRingElement_1d));
8117   memcpy(lit.seed_for_A, uu____1, (size_t)32U * sizeof(uint8_t));
8118   libcrux_ml_kem_polynomial_PolynomialRingElement_1d repeat_expression0[3U][3U];
8119   for (size_t i0 = (size_t)0U; i0 < (size_t)3U; i0++) {
8120     libcrux_ml_kem_polynomial_PolynomialRingElement_1d repeat_expression[3U];
8121     for (size_t i = (size_t)0U; i < (size_t)3U; i++) {
8122       repeat_expression[i] = libcrux_ml_kem_polynomial_ZERO_d6_ea();
8123     }
8124     memcpy(repeat_expression0[i0], repeat_expression,
8125            (size_t)3U *
8126                sizeof(libcrux_ml_kem_polynomial_PolynomialRingElement_1d));
8127   }
8128   memcpy(lit.A, repeat_expression0,
8129          (size_t)3U *
8130              sizeof(libcrux_ml_kem_polynomial_PolynomialRingElement_1d[3U]));
8131   return lit;
8132 }
8133 
8134 /**
8135  Only use with public values.
8136 
8137  This MUST NOT be used with secret inputs, like its caller
8138  `deserialize_ring_elements_reduced`.
8139 */
8140 /**
8141 A monomorphic instance of
8142 libcrux_ml_kem.serialize.deserialize_to_reduced_ring_element with types
8143 libcrux_ml_kem_vector_portable_vector_type_PortableVector with const generics
8144 
8145 */
8146 static KRML_MUSTINLINE libcrux_ml_kem_polynomial_PolynomialRingElement_1d
libcrux_ml_kem_serialize_deserialize_to_reduced_ring_element_ea(Eurydice_slice serialized)8147 libcrux_ml_kem_serialize_deserialize_to_reduced_ring_element_ea(
8148     Eurydice_slice serialized) {
8149   libcrux_ml_kem_polynomial_PolynomialRingElement_1d re =
8150       libcrux_ml_kem_polynomial_ZERO_d6_ea();
8151   for (size_t i = (size_t)0U;
8152        i < Eurydice_slice_len(serialized, uint8_t) / (size_t)24U; i++) {
8153     size_t i0 = i;
8154     Eurydice_slice bytes =
8155         Eurydice_slice_subslice3(serialized, i0 * (size_t)24U,
8156                                  i0 * (size_t)24U + (size_t)24U, uint8_t *);
8157     libcrux_ml_kem_vector_portable_vector_type_PortableVector coefficient =
8158         libcrux_ml_kem_vector_portable_deserialize_12_b8(bytes);
8159     libcrux_ml_kem_vector_portable_vector_type_PortableVector uu____0 =
8160         libcrux_ml_kem_vector_portable_cond_subtract_3329_b8(coefficient);
8161     re.coefficients[i0] = uu____0;
8162   }
8163   return re;
8164 }
8165 
8166 /**
8167  See [deserialize_ring_elements_reduced_out].
8168 */
8169 /**
8170 A monomorphic instance of
8171 libcrux_ml_kem.serialize.deserialize_ring_elements_reduced with types
8172 libcrux_ml_kem_vector_portable_vector_type_PortableVector with const generics
8173 - K= 3
8174 */
8175 static KRML_MUSTINLINE void
libcrux_ml_kem_serialize_deserialize_ring_elements_reduced_1b(Eurydice_slice public_key,libcrux_ml_kem_polynomial_PolynomialRingElement_1d * deserialized_pk)8176 libcrux_ml_kem_serialize_deserialize_ring_elements_reduced_1b(
8177     Eurydice_slice public_key,
8178     libcrux_ml_kem_polynomial_PolynomialRingElement_1d *deserialized_pk) {
8179   for (size_t i = (size_t)0U;
8180        i < Eurydice_slice_len(public_key, uint8_t) /
8181                LIBCRUX_ML_KEM_CONSTANTS_BYTES_PER_RING_ELEMENT;
8182        i++) {
8183     size_t i0 = i;
8184     Eurydice_slice ring_element = Eurydice_slice_subslice3(
8185         public_key, i0 * LIBCRUX_ML_KEM_CONSTANTS_BYTES_PER_RING_ELEMENT,
8186         i0 * LIBCRUX_ML_KEM_CONSTANTS_BYTES_PER_RING_ELEMENT +
8187             LIBCRUX_ML_KEM_CONSTANTS_BYTES_PER_RING_ELEMENT,
8188         uint8_t *);
8189     libcrux_ml_kem_polynomial_PolynomialRingElement_1d uu____0 =
8190         libcrux_ml_kem_serialize_deserialize_to_reduced_ring_element_ea(
8191             ring_element);
8192     deserialized_pk[i0] = uu____0;
8193   }
8194 }
8195 
8196 /**
8197 A monomorphic instance of libcrux_ml_kem.hash_functions.portable.PortableHash
8198 with const generics
8199 - $3size_t
8200 */
8201 typedef struct libcrux_ml_kem_hash_functions_portable_PortableHash_88_s {
8202   libcrux_sha3_generic_keccak_KeccakState_17 shake128_state[3U];
8203 } libcrux_ml_kem_hash_functions_portable_PortableHash_88;
8204 
8205 /**
8206 A monomorphic instance of
8207 libcrux_ml_kem.hash_functions.portable.shake128_init_absorb_final with const
8208 generics
8209 - K= 3
8210 */
8211 static inline libcrux_ml_kem_hash_functions_portable_PortableHash_88
libcrux_ml_kem_hash_functions_portable_shake128_init_absorb_final_e0(uint8_t (* input)[34U])8212 libcrux_ml_kem_hash_functions_portable_shake128_init_absorb_final_e0(
8213     uint8_t (*input)[34U]) {
8214   libcrux_ml_kem_hash_functions_portable_PortableHash_88 shake128_state;
8215   libcrux_sha3_generic_keccak_KeccakState_17 repeat_expression[3U];
8216   for (size_t i = (size_t)0U; i < (size_t)3U; i++) {
8217     repeat_expression[i] = libcrux_sha3_portable_incremental_shake128_init();
8218   }
8219   memcpy(shake128_state.shake128_state, repeat_expression,
8220          (size_t)3U * sizeof(libcrux_sha3_generic_keccak_KeccakState_17));
8221   for (size_t i = (size_t)0U; i < (size_t)3U; i++) {
8222     size_t i0 = i;
8223     libcrux_sha3_portable_incremental_shake128_absorb_final(
8224         &shake128_state.shake128_state[i0],
8225         Eurydice_array_to_slice((size_t)34U, input[i0], uint8_t));
8226   }
8227   return shake128_state;
8228 }
8229 
8230 /**
8231 This function found in impl {libcrux_ml_kem::hash_functions::Hash<K> for
8232 libcrux_ml_kem::hash_functions::portable::PortableHash<K>}
8233 */
8234 /**
8235 A monomorphic instance of
8236 libcrux_ml_kem.hash_functions.portable.shake128_init_absorb_final_4a with const
8237 generics
8238 - K= 3
8239 */
8240 static inline libcrux_ml_kem_hash_functions_portable_PortableHash_88
libcrux_ml_kem_hash_functions_portable_shake128_init_absorb_final_4a_e0(uint8_t (* input)[34U])8241 libcrux_ml_kem_hash_functions_portable_shake128_init_absorb_final_4a_e0(
8242     uint8_t (*input)[34U]) {
8243   return libcrux_ml_kem_hash_functions_portable_shake128_init_absorb_final_e0(
8244       input);
8245 }
8246 
8247 /**
8248 A monomorphic instance of
8249 libcrux_ml_kem.hash_functions.portable.shake128_squeeze_first_three_blocks with
8250 const generics
8251 - K= 3
8252 */
8253 static inline void
libcrux_ml_kem_hash_functions_portable_shake128_squeeze_first_three_blocks_e0(libcrux_ml_kem_hash_functions_portable_PortableHash_88 * st,uint8_t ret[3U][504U])8254 libcrux_ml_kem_hash_functions_portable_shake128_squeeze_first_three_blocks_e0(
8255     libcrux_ml_kem_hash_functions_portable_PortableHash_88 *st,
8256     uint8_t ret[3U][504U]) {
8257   uint8_t out[3U][504U] = {{0U}};
8258   for (size_t i = (size_t)0U; i < (size_t)3U; i++) {
8259     size_t i0 = i;
8260     libcrux_sha3_portable_incremental_shake128_squeeze_first_three_blocks(
8261         &st->shake128_state[i0],
8262         Eurydice_array_to_slice((size_t)504U, out[i0], uint8_t));
8263   }
8264   memcpy(ret, out, (size_t)3U * sizeof(uint8_t[504U]));
8265 }
8266 
8267 /**
8268 This function found in impl {libcrux_ml_kem::hash_functions::Hash<K> for
8269 libcrux_ml_kem::hash_functions::portable::PortableHash<K>}
8270 */
8271 /**
8272 A monomorphic instance of
8273 libcrux_ml_kem.hash_functions.portable.shake128_squeeze_first_three_blocks_4a
8274 with const generics
8275 - K= 3
8276 */
8277 static inline void
libcrux_ml_kem_hash_functions_portable_shake128_squeeze_first_three_blocks_4a_e0(libcrux_ml_kem_hash_functions_portable_PortableHash_88 * self,uint8_t ret[3U][504U])8278 libcrux_ml_kem_hash_functions_portable_shake128_squeeze_first_three_blocks_4a_e0(
8279     libcrux_ml_kem_hash_functions_portable_PortableHash_88 *self,
8280     uint8_t ret[3U][504U]) {
8281   libcrux_ml_kem_hash_functions_portable_shake128_squeeze_first_three_blocks_e0(
8282       self, ret);
8283 }
8284 
8285 /**
8286  If `bytes` contains a set of uniformly random bytes, this function
8287  uniformly samples a ring element `â` that is treated as being the NTT
8288  representation of the corresponding polynomial `a`.
8289 
8290  Since rejection sampling is used, it is possible the supplied bytes are
8291  not enough to sample the element, in which case an `Err` is returned and the
8292  caller must try again with a fresh set of bytes.
8293 
8294  This function <strong>partially</strong> implements <strong>Algorithm
8295  6</strong> of the NIST FIPS 203 standard, We say "partially" because this
8296  implementation only accepts a finite set of bytes as input and returns an error
8297  if the set is not enough; Algorithm 6 of the FIPS 203 standard on the other
8298  hand samples from an infinite stream of bytes until the ring element is filled.
8299  Algorithm 6 is reproduced below:
8300 
8301  ```plaintext
8302  Input: byte stream B ∈ ��*.
8303  Output: array â ∈ ℤ₂₅₆.
8304 
8305  i ← 0
8306  j ← 0
8307  while j < 256 do
8308      d₁ ← B[i] + 256·(B[i+1] mod 16)
8309      d₂ ← ⌊B[i+1]/16⌋ + 16·B[i+2]
8310      if d₁ < q then
8311          â[j] ← d₁
8312          j ← j + 1
8313      end if
8314      if d₂ < q and j < 256 then
8315          â[j] ← d₂
8316          j ← j + 1
8317      end if
8318      i ← i + 3
8319  end while
8320  return â
8321  ```
8322 
8323  The NIST FIPS 203 standard can be found at
8324  <https://csrc.nist.gov/pubs/fips/203/ipd>.
8325 */
8326 /**
8327 A monomorphic instance of
8328 libcrux_ml_kem.sampling.sample_from_uniform_distribution_next with types
8329 libcrux_ml_kem_vector_portable_vector_type_PortableVector with const generics
8330 - K= 3
8331 - N= 504
8332 */
8333 static KRML_MUSTINLINE bool
libcrux_ml_kem_sampling_sample_from_uniform_distribution_next_89(uint8_t (* randomness)[504U],size_t * sampled_coefficients,int16_t (* out)[272U])8334 libcrux_ml_kem_sampling_sample_from_uniform_distribution_next_89(
8335     uint8_t (*randomness)[504U], size_t *sampled_coefficients,
8336     int16_t (*out)[272U]) {
8337   for (size_t i0 = (size_t)0U; i0 < (size_t)3U; i0++) {
8338     size_t i1 = i0;
8339     for (size_t i = (size_t)0U; i < (size_t)504U / (size_t)24U; i++) {
8340       size_t r = i;
8341       if (sampled_coefficients[i1] <
8342           LIBCRUX_ML_KEM_CONSTANTS_COEFFICIENTS_IN_RING_ELEMENT) {
8343         size_t sampled = libcrux_ml_kem_vector_portable_rej_sample_b8(
8344             Eurydice_array_to_subslice3(randomness[i1], r * (size_t)24U,
8345                                         r * (size_t)24U + (size_t)24U,
8346                                         uint8_t *),
8347             Eurydice_array_to_subslice3(out[i1], sampled_coefficients[i1],
8348                                         sampled_coefficients[i1] + (size_t)16U,
8349                                         int16_t *));
8350         size_t uu____0 = i1;
8351         sampled_coefficients[uu____0] = sampled_coefficients[uu____0] + sampled;
8352       }
8353     }
8354   }
8355   bool done = true;
8356   for (size_t i = (size_t)0U; i < (size_t)3U; i++) {
8357     size_t i0 = i;
8358     if (sampled_coefficients[i0] >=
8359         LIBCRUX_ML_KEM_CONSTANTS_COEFFICIENTS_IN_RING_ELEMENT) {
8360       sampled_coefficients[i0] =
8361           LIBCRUX_ML_KEM_CONSTANTS_COEFFICIENTS_IN_RING_ELEMENT;
8362     } else {
8363       done = false;
8364     }
8365   }
8366   return done;
8367 }
8368 
8369 /**
8370 A monomorphic instance of
8371 libcrux_ml_kem.hash_functions.portable.shake128_squeeze_next_block with const
8372 generics
8373 - K= 3
8374 */
8375 static inline void
libcrux_ml_kem_hash_functions_portable_shake128_squeeze_next_block_e0(libcrux_ml_kem_hash_functions_portable_PortableHash_88 * st,uint8_t ret[3U][168U])8376 libcrux_ml_kem_hash_functions_portable_shake128_squeeze_next_block_e0(
8377     libcrux_ml_kem_hash_functions_portable_PortableHash_88 *st,
8378     uint8_t ret[3U][168U]) {
8379   uint8_t out[3U][168U] = {{0U}};
8380   for (size_t i = (size_t)0U; i < (size_t)3U; i++) {
8381     size_t i0 = i;
8382     libcrux_sha3_portable_incremental_shake128_squeeze_next_block(
8383         &st->shake128_state[i0],
8384         Eurydice_array_to_slice((size_t)168U, out[i0], uint8_t));
8385   }
8386   memcpy(ret, out, (size_t)3U * sizeof(uint8_t[168U]));
8387 }
8388 
8389 /**
8390 This function found in impl {libcrux_ml_kem::hash_functions::Hash<K> for
8391 libcrux_ml_kem::hash_functions::portable::PortableHash<K>}
8392 */
8393 /**
8394 A monomorphic instance of
8395 libcrux_ml_kem.hash_functions.portable.shake128_squeeze_next_block_4a with const
8396 generics
8397 - K= 3
8398 */
8399 static inline void
libcrux_ml_kem_hash_functions_portable_shake128_squeeze_next_block_4a_e0(libcrux_ml_kem_hash_functions_portable_PortableHash_88 * self,uint8_t ret[3U][168U])8400 libcrux_ml_kem_hash_functions_portable_shake128_squeeze_next_block_4a_e0(
8401     libcrux_ml_kem_hash_functions_portable_PortableHash_88 *self,
8402     uint8_t ret[3U][168U]) {
8403   libcrux_ml_kem_hash_functions_portable_shake128_squeeze_next_block_e0(self,
8404                                                                         ret);
8405 }
8406 
8407 /**
8408  If `bytes` contains a set of uniformly random bytes, this function
8409  uniformly samples a ring element `â` that is treated as being the NTT
8410  representation of the corresponding polynomial `a`.
8411 
8412  Since rejection sampling is used, it is possible the supplied bytes are
8413  not enough to sample the element, in which case an `Err` is returned and the
8414  caller must try again with a fresh set of bytes.
8415 
8416  This function <strong>partially</strong> implements <strong>Algorithm
8417  6</strong> of the NIST FIPS 203 standard, We say "partially" because this
8418  implementation only accepts a finite set of bytes as input and returns an error
8419  if the set is not enough; Algorithm 6 of the FIPS 203 standard on the other
8420  hand samples from an infinite stream of bytes until the ring element is filled.
8421  Algorithm 6 is reproduced below:
8422 
8423  ```plaintext
8424  Input: byte stream B ∈ ��*.
8425  Output: array â ∈ ℤ₂₅₆.
8426 
8427  i ← 0
8428  j ← 0
8429  while j < 256 do
8430      d₁ ← B[i] + 256·(B[i+1] mod 16)
8431      d₂ ← ⌊B[i+1]/16⌋ + 16·B[i+2]
8432      if d₁ < q then
8433          â[j] ← d₁
8434          j ← j + 1
8435      end if
8436      if d₂ < q and j < 256 then
8437          â[j] ← d₂
8438          j ← j + 1
8439      end if
8440      i ← i + 3
8441  end while
8442  return â
8443  ```
8444 
8445  The NIST FIPS 203 standard can be found at
8446  <https://csrc.nist.gov/pubs/fips/203/ipd>.
8447 */
8448 /**
8449 A monomorphic instance of
8450 libcrux_ml_kem.sampling.sample_from_uniform_distribution_next with types
8451 libcrux_ml_kem_vector_portable_vector_type_PortableVector with const generics
8452 - K= 3
8453 - N= 168
8454 */
8455 static KRML_MUSTINLINE bool
libcrux_ml_kem_sampling_sample_from_uniform_distribution_next_890(uint8_t (* randomness)[168U],size_t * sampled_coefficients,int16_t (* out)[272U])8456 libcrux_ml_kem_sampling_sample_from_uniform_distribution_next_890(
8457     uint8_t (*randomness)[168U], size_t *sampled_coefficients,
8458     int16_t (*out)[272U]) {
8459   for (size_t i0 = (size_t)0U; i0 < (size_t)3U; i0++) {
8460     size_t i1 = i0;
8461     for (size_t i = (size_t)0U; i < (size_t)168U / (size_t)24U; i++) {
8462       size_t r = i;
8463       if (sampled_coefficients[i1] <
8464           LIBCRUX_ML_KEM_CONSTANTS_COEFFICIENTS_IN_RING_ELEMENT) {
8465         size_t sampled = libcrux_ml_kem_vector_portable_rej_sample_b8(
8466             Eurydice_array_to_subslice3(randomness[i1], r * (size_t)24U,
8467                                         r * (size_t)24U + (size_t)24U,
8468                                         uint8_t *),
8469             Eurydice_array_to_subslice3(out[i1], sampled_coefficients[i1],
8470                                         sampled_coefficients[i1] + (size_t)16U,
8471                                         int16_t *));
8472         size_t uu____0 = i1;
8473         sampled_coefficients[uu____0] = sampled_coefficients[uu____0] + sampled;
8474       }
8475     }
8476   }
8477   bool done = true;
8478   for (size_t i = (size_t)0U; i < (size_t)3U; i++) {
8479     size_t i0 = i;
8480     if (sampled_coefficients[i0] >=
8481         LIBCRUX_ML_KEM_CONSTANTS_COEFFICIENTS_IN_RING_ELEMENT) {
8482       sampled_coefficients[i0] =
8483           LIBCRUX_ML_KEM_CONSTANTS_COEFFICIENTS_IN_RING_ELEMENT;
8484     } else {
8485       done = false;
8486     }
8487   }
8488   return done;
8489 }
8490 
8491 /**
8492 A monomorphic instance of libcrux_ml_kem.polynomial.from_i16_array
8493 with types libcrux_ml_kem_vector_portable_vector_type_PortableVector
8494 with const generics
8495 
8496 */
8497 static KRML_MUSTINLINE libcrux_ml_kem_polynomial_PolynomialRingElement_1d
libcrux_ml_kem_polynomial_from_i16_array_ea(Eurydice_slice a)8498 libcrux_ml_kem_polynomial_from_i16_array_ea(Eurydice_slice a) {
8499   libcrux_ml_kem_polynomial_PolynomialRingElement_1d result =
8500       libcrux_ml_kem_polynomial_ZERO_ea();
8501   for (size_t i = (size_t)0U;
8502        i < LIBCRUX_ML_KEM_POLYNOMIAL_VECTORS_IN_RING_ELEMENT; i++) {
8503     size_t i0 = i;
8504     libcrux_ml_kem_vector_portable_vector_type_PortableVector uu____0 =
8505         libcrux_ml_kem_vector_portable_from_i16_array_b8(
8506             Eurydice_slice_subslice3(a, i0 * (size_t)16U,
8507                                      (i0 + (size_t)1U) * (size_t)16U,
8508                                      int16_t *));
8509     result.coefficients[i0] = uu____0;
8510   }
8511   return result;
8512 }
8513 
8514 /**
8515 This function found in impl
8516 {libcrux_ml_kem::polynomial::PolynomialRingElement<Vector>[TraitClause@0,
8517 TraitClause@1]}
8518 */
8519 /**
8520 A monomorphic instance of libcrux_ml_kem.polynomial.from_i16_array_d6
8521 with types libcrux_ml_kem_vector_portable_vector_type_PortableVector
8522 with const generics
8523 
8524 */
8525 static KRML_MUSTINLINE libcrux_ml_kem_polynomial_PolynomialRingElement_1d
libcrux_ml_kem_polynomial_from_i16_array_d6_ea(Eurydice_slice a)8526 libcrux_ml_kem_polynomial_from_i16_array_d6_ea(Eurydice_slice a) {
8527   return libcrux_ml_kem_polynomial_from_i16_array_ea(a);
8528 }
8529 
8530 /**
8531 This function found in impl {core::ops::function::FnMut<(@Array<i16, 272usize>),
8532 libcrux_ml_kem::polynomial::PolynomialRingElement<Vector>[TraitClause@0,
8533 TraitClause@2]> for libcrux_ml_kem::sampling::sample_from_xof::closure<Vector,
8534 Hasher, K>[TraitClause@0, TraitClause@1, TraitClause@2, TraitClause@3]}
8535 */
8536 /**
8537 A monomorphic instance of libcrux_ml_kem.sampling.sample_from_xof.call_mut_e7
8538 with types libcrux_ml_kem_vector_portable_vector_type_PortableVector,
8539 libcrux_ml_kem_hash_functions_portable_PortableHash[[$3size_t]] with const
8540 generics
8541 - K= 3
8542 */
8543 static inline libcrux_ml_kem_polynomial_PolynomialRingElement_1d
libcrux_ml_kem_sampling_sample_from_xof_call_mut_e7_2b(void ** _,int16_t tupled_args[272U])8544 libcrux_ml_kem_sampling_sample_from_xof_call_mut_e7_2b(
8545     void **_, int16_t tupled_args[272U]) {
8546   int16_t s[272U];
8547   memcpy(s, tupled_args, (size_t)272U * sizeof(int16_t));
8548   return libcrux_ml_kem_polynomial_from_i16_array_d6_ea(
8549       Eurydice_array_to_subslice3(s, (size_t)0U, (size_t)256U, int16_t *));
8550 }
8551 
8552 /**
8553 A monomorphic instance of libcrux_ml_kem.sampling.sample_from_xof
8554 with types libcrux_ml_kem_vector_portable_vector_type_PortableVector,
8555 libcrux_ml_kem_hash_functions_portable_PortableHash[[$3size_t]] with const
8556 generics
8557 - K= 3
8558 */
libcrux_ml_kem_sampling_sample_from_xof_2b(uint8_t (* seeds)[34U],libcrux_ml_kem_polynomial_PolynomialRingElement_1d ret[3U])8559 static KRML_MUSTINLINE void libcrux_ml_kem_sampling_sample_from_xof_2b(
8560     uint8_t (*seeds)[34U],
8561     libcrux_ml_kem_polynomial_PolynomialRingElement_1d ret[3U]) {
8562   size_t sampled_coefficients[3U] = {0U};
8563   int16_t out[3U][272U] = {{0U}};
8564   libcrux_ml_kem_hash_functions_portable_PortableHash_88 xof_state =
8565       libcrux_ml_kem_hash_functions_portable_shake128_init_absorb_final_4a_e0(
8566           seeds);
8567   uint8_t randomness0[3U][504U];
8568   libcrux_ml_kem_hash_functions_portable_shake128_squeeze_first_three_blocks_4a_e0(
8569       &xof_state, randomness0);
8570   bool done = libcrux_ml_kem_sampling_sample_from_uniform_distribution_next_89(
8571       randomness0, sampled_coefficients, out);
8572   while (true) {
8573     if (done) {
8574       break;
8575     } else {
8576       uint8_t randomness[3U][168U];
8577       libcrux_ml_kem_hash_functions_portable_shake128_squeeze_next_block_4a_e0(
8578           &xof_state, randomness);
8579       done = libcrux_ml_kem_sampling_sample_from_uniform_distribution_next_890(
8580           randomness, sampled_coefficients, out);
8581     }
8582   }
8583   /* Passing arrays by value in Rust generates a copy in C */
8584   int16_t copy_of_out[3U][272U];
8585   memcpy(copy_of_out, out, (size_t)3U * sizeof(int16_t[272U]));
8586   libcrux_ml_kem_polynomial_PolynomialRingElement_1d ret0[3U];
8587   for (size_t i = (size_t)0U; i < (size_t)3U; i++) {
8588     /* original Rust expression is not an lvalue in C */
8589     void *lvalue = (void *)0U;
8590     ret0[i] = libcrux_ml_kem_sampling_sample_from_xof_call_mut_e7_2b(
8591         &lvalue, copy_of_out[i]);
8592   }
8593   memcpy(
8594       ret, ret0,
8595       (size_t)3U * sizeof(libcrux_ml_kem_polynomial_PolynomialRingElement_1d));
8596 }
8597 
8598 /**
8599 A monomorphic instance of libcrux_ml_kem.matrix.sample_matrix_A
8600 with types libcrux_ml_kem_vector_portable_vector_type_PortableVector,
8601 libcrux_ml_kem_hash_functions_portable_PortableHash[[$3size_t]] with const
8602 generics
8603 - K= 3
8604 */
libcrux_ml_kem_matrix_sample_matrix_A_2b(libcrux_ml_kem_polynomial_PolynomialRingElement_1d (* A_transpose)[3U],uint8_t * seed,bool transpose)8605 static KRML_MUSTINLINE void libcrux_ml_kem_matrix_sample_matrix_A_2b(
8606     libcrux_ml_kem_polynomial_PolynomialRingElement_1d (*A_transpose)[3U],
8607     uint8_t *seed, bool transpose) {
8608   for (size_t i0 = (size_t)0U; i0 < (size_t)3U; i0++) {
8609     size_t i1 = i0;
8610     uint8_t seeds[3U][34U];
8611     for (size_t i = (size_t)0U; i < (size_t)3U; i++) {
8612       core_array__core__clone__Clone_for__Array_T__N___clone(
8613           (size_t)34U, seed, seeds[i], uint8_t, void *);
8614     }
8615     for (size_t i = (size_t)0U; i < (size_t)3U; i++) {
8616       size_t j = i;
8617       seeds[j][32U] = (uint8_t)i1;
8618       seeds[j][33U] = (uint8_t)j;
8619     }
8620     libcrux_ml_kem_polynomial_PolynomialRingElement_1d sampled[3U];
8621     libcrux_ml_kem_sampling_sample_from_xof_2b(seeds, sampled);
8622     for (size_t i = (size_t)0U;
8623          i < Eurydice_slice_len(
8624                  Eurydice_array_to_slice(
8625                      (size_t)3U, sampled,
8626                      libcrux_ml_kem_polynomial_PolynomialRingElement_1d),
8627                  libcrux_ml_kem_polynomial_PolynomialRingElement_1d);
8628          i++) {
8629       size_t j = i;
8630       libcrux_ml_kem_polynomial_PolynomialRingElement_1d sample = sampled[j];
8631       if (transpose) {
8632         A_transpose[j][i1] = sample;
8633       } else {
8634         A_transpose[i1][j] = sample;
8635       }
8636     }
8637   }
8638 }
8639 
8640 /**
8641 A monomorphic instance of libcrux_ml_kem.ind_cpa.build_unpacked_public_key_mut
8642 with types libcrux_ml_kem_vector_portable_vector_type_PortableVector,
8643 libcrux_ml_kem_hash_functions_portable_PortableHash[[$3size_t]] with const
8644 generics
8645 - K= 3
8646 - T_AS_NTT_ENCODED_SIZE= 1152
8647 */
8648 static KRML_MUSTINLINE void
libcrux_ml_kem_ind_cpa_build_unpacked_public_key_mut_3f(Eurydice_slice public_key,libcrux_ml_kem_ind_cpa_unpacked_IndCpaPublicKeyUnpacked_a0 * unpacked_public_key)8649 libcrux_ml_kem_ind_cpa_build_unpacked_public_key_mut_3f(
8650     Eurydice_slice public_key,
8651     libcrux_ml_kem_ind_cpa_unpacked_IndCpaPublicKeyUnpacked_a0
8652         *unpacked_public_key) {
8653   Eurydice_slice uu____0 = Eurydice_slice_subslice_to(
8654       public_key, (size_t)1152U, uint8_t, size_t, uint8_t[]);
8655   libcrux_ml_kem_serialize_deserialize_ring_elements_reduced_1b(
8656       uu____0, unpacked_public_key->t_as_ntt);
8657   Eurydice_slice seed = Eurydice_slice_subslice_from(
8658       public_key, (size_t)1152U, uint8_t, size_t, uint8_t[]);
8659   libcrux_ml_kem_polynomial_PolynomialRingElement_1d(*uu____1)[3U] =
8660       unpacked_public_key->A;
8661   uint8_t ret[34U];
8662   libcrux_ml_kem_utils_into_padded_array_b6(seed, ret);
8663   libcrux_ml_kem_matrix_sample_matrix_A_2b(uu____1, ret, false);
8664 }
8665 
8666 /**
8667 A monomorphic instance of libcrux_ml_kem.ind_cpa.build_unpacked_public_key
8668 with types libcrux_ml_kem_vector_portable_vector_type_PortableVector,
8669 libcrux_ml_kem_hash_functions_portable_PortableHash[[$3size_t]] with const
8670 generics
8671 - K= 3
8672 - T_AS_NTT_ENCODED_SIZE= 1152
8673 */
8674 static KRML_MUSTINLINE
8675     libcrux_ml_kem_ind_cpa_unpacked_IndCpaPublicKeyUnpacked_a0
libcrux_ml_kem_ind_cpa_build_unpacked_public_key_3f(Eurydice_slice public_key)8676     libcrux_ml_kem_ind_cpa_build_unpacked_public_key_3f(
8677         Eurydice_slice public_key) {
8678   libcrux_ml_kem_ind_cpa_unpacked_IndCpaPublicKeyUnpacked_a0
8679       unpacked_public_key = libcrux_ml_kem_ind_cpa_unpacked_default_8b_1b();
8680   libcrux_ml_kem_ind_cpa_build_unpacked_public_key_mut_3f(public_key,
8681                                                           &unpacked_public_key);
8682   return unpacked_public_key;
8683 }
8684 
8685 /**
8686 A monomorphic instance of K.
8687 with types libcrux_ml_kem_polynomial_PolynomialRingElement
8688 libcrux_ml_kem_vector_portable_vector_type_PortableVector[3size_t],
8689 libcrux_ml_kem_polynomial_PolynomialRingElement
8690 libcrux_ml_kem_vector_portable_vector_type_PortableVector
8691 
8692 */
8693 typedef struct tuple_ed_s {
8694   libcrux_ml_kem_polynomial_PolynomialRingElement_1d fst[3U];
8695   libcrux_ml_kem_polynomial_PolynomialRingElement_1d snd;
8696 } tuple_ed;
8697 
8698 /**
8699 This function found in impl {core::ops::function::FnMut<(usize),
8700 libcrux_ml_kem::polynomial::PolynomialRingElement<Vector>[TraitClause@0,
8701 TraitClause@2]> for libcrux_ml_kem::ind_cpa::encrypt_c1::closure<Vector, Hasher,
8702 K, C1_LEN, U_COMPRESSION_FACTOR, BLOCK_LEN, ETA1, ETA1_RANDOMNESS_SIZE, ETA2,
8703 ETA2_RANDOMNESS_SIZE>[TraitClause@0, TraitClause@1, TraitClause@2,
8704 TraitClause@3]}
8705 */
8706 /**
8707 A monomorphic instance of libcrux_ml_kem.ind_cpa.encrypt_c1.call_mut_f1
8708 with types libcrux_ml_kem_vector_portable_vector_type_PortableVector,
8709 libcrux_ml_kem_hash_functions_portable_PortableHash[[$3size_t]] with const
8710 generics
8711 - K= 3
8712 - C1_LEN= 960
8713 - U_COMPRESSION_FACTOR= 10
8714 - BLOCK_LEN= 320
8715 - ETA1= 2
8716 - ETA1_RANDOMNESS_SIZE= 128
8717 - ETA2= 2
8718 - ETA2_RANDOMNESS_SIZE= 128
8719 */
8720 static inline libcrux_ml_kem_polynomial_PolynomialRingElement_1d
libcrux_ml_kem_ind_cpa_encrypt_c1_call_mut_f1_85(void ** _,size_t tupled_args)8721 libcrux_ml_kem_ind_cpa_encrypt_c1_call_mut_f1_85(void **_, size_t tupled_args) {
8722   return libcrux_ml_kem_polynomial_ZERO_d6_ea();
8723 }
8724 
8725 /**
8726 A monomorphic instance of libcrux_ml_kem.hash_functions.portable.PRFxN
8727 with const generics
8728 - K= 3
8729 - LEN= 128
8730 */
libcrux_ml_kem_hash_functions_portable_PRFxN_41(uint8_t (* input)[33U],uint8_t ret[3U][128U])8731 static inline void libcrux_ml_kem_hash_functions_portable_PRFxN_41(
8732     uint8_t (*input)[33U], uint8_t ret[3U][128U]) {
8733   uint8_t out[3U][128U] = {{0U}};
8734   for (size_t i = (size_t)0U; i < (size_t)3U; i++) {
8735     size_t i0 = i;
8736     libcrux_sha3_portable_shake256(
8737         Eurydice_array_to_slice((size_t)128U, out[i0], uint8_t),
8738         Eurydice_array_to_slice((size_t)33U, input[i0], uint8_t));
8739   }
8740   memcpy(ret, out, (size_t)3U * sizeof(uint8_t[128U]));
8741 }
8742 
8743 /**
8744 This function found in impl {libcrux_ml_kem::hash_functions::Hash<K> for
8745 libcrux_ml_kem::hash_functions::portable::PortableHash<K>}
8746 */
8747 /**
8748 A monomorphic instance of libcrux_ml_kem.hash_functions.portable.PRFxN_4a
8749 with const generics
8750 - K= 3
8751 - LEN= 128
8752 */
libcrux_ml_kem_hash_functions_portable_PRFxN_4a_41(uint8_t (* input)[33U],uint8_t ret[3U][128U])8753 static inline void libcrux_ml_kem_hash_functions_portable_PRFxN_4a_41(
8754     uint8_t (*input)[33U], uint8_t ret[3U][128U]) {
8755   libcrux_ml_kem_hash_functions_portable_PRFxN_41(input, ret);
8756 }
8757 
8758 /**
8759  Given a series of uniformly random bytes in `randomness`, for some number
8760  `eta`, the `sample_from_binomial_distribution_{eta}` functions sample a ring
8761  element from a binomial distribution centered at 0 that uses two sets of `eta`
8762  coin flips. If, for example, `eta = ETA`, each ring coefficient is a value `v`
8763  such such that `v ∈ {-ETA, -ETA + 1, ..., 0, ..., ETA + 1, ETA}` and:
8764 
8765  ```plaintext
8766  - If v < 0, Pr[v] = Pr[-v]
8767  - If v >= 0, Pr[v] = BINOMIAL_COEFFICIENT(2 * ETA; ETA - v) / 2 ^ (2 * ETA)
8768  ```
8769 
8770  The values `v < 0` are mapped to the appropriate `KyberFieldElement`.
8771 
8772  The expected value is:
8773 
8774  ```plaintext
8775  E[X] = (-ETA)Pr[-ETA] + (-(ETA - 1))Pr[-(ETA - 1)] + ... + (ETA - 1)Pr[ETA - 1]
8776  + (ETA)Pr[ETA] = 0 since Pr[-v] = Pr[v] when v < 0.
8777  ```
8778 
8779  And the variance is:
8780 
8781  ```plaintext
8782  Var(X) = E[(X - E[X])^2]
8783         = E[X^2]
8784         = sum_(v=-ETA to ETA)v^2 * (BINOMIAL_COEFFICIENT(2 * ETA; ETA - v) /
8785  2^(2 * ETA)) = ETA / 2
8786  ```
8787 
8788  This function implements <strong>Algorithm 7</strong> of the NIST FIPS 203
8789  standard, which is reproduced below:
8790 
8791  ```plaintext
8792  Input: byte array B ∈ ��^{64η}.
8793  Output: array f ∈ ℤ₂₅₆.
8794 
8795  b ← BytesToBits(B)
8796  for (i ← 0; i < 256; i++)
8797      x ← ∑(j=0 to η - 1) b[2iη + j]
8798      y ← ∑(j=0 to η - 1) b[2iη + η + j]
8799      f[i] ← x−y mod q
8800  end for
8801  return f
8802  ```
8803 
8804  The NIST FIPS 203 standard can be found at
8805  <https://csrc.nist.gov/pubs/fips/203/ipd>.
8806 */
8807 /**
8808 A monomorphic instance of
8809 libcrux_ml_kem.sampling.sample_from_binomial_distribution_2 with types
8810 libcrux_ml_kem_vector_portable_vector_type_PortableVector with const generics
8811 
8812 */
8813 static KRML_MUSTINLINE libcrux_ml_kem_polynomial_PolynomialRingElement_1d
libcrux_ml_kem_sampling_sample_from_binomial_distribution_2_ea(Eurydice_slice randomness)8814 libcrux_ml_kem_sampling_sample_from_binomial_distribution_2_ea(
8815     Eurydice_slice randomness) {
8816   int16_t sampled_i16s[256U] = {0U};
8817   for (size_t i0 = (size_t)0U;
8818        i0 < Eurydice_slice_len(randomness, uint8_t) / (size_t)4U; i0++) {
8819     size_t chunk_number = i0;
8820     Eurydice_slice byte_chunk = Eurydice_slice_subslice3(
8821         randomness, chunk_number * (size_t)4U,
8822         chunk_number * (size_t)4U + (size_t)4U, uint8_t *);
8823     uint32_t random_bits_as_u32 =
8824         (((uint32_t)Eurydice_slice_index(byte_chunk, (size_t)0U, uint8_t,
8825                                          uint8_t *) |
8826           (uint32_t)Eurydice_slice_index(byte_chunk, (size_t)1U, uint8_t,
8827                                          uint8_t *)
8828               << 8U) |
8829          (uint32_t)Eurydice_slice_index(byte_chunk, (size_t)2U, uint8_t,
8830                                         uint8_t *)
8831              << 16U) |
8832         (uint32_t)Eurydice_slice_index(byte_chunk, (size_t)3U, uint8_t,
8833                                        uint8_t *)
8834             << 24U;
8835     uint32_t even_bits = random_bits_as_u32 & 1431655765U;
8836     uint32_t odd_bits = random_bits_as_u32 >> 1U & 1431655765U;
8837     uint32_t coin_toss_outcomes = even_bits + odd_bits;
8838     for (uint32_t i = 0U; i < 32U / 4U; i++) {
8839       uint32_t outcome_set = i;
8840       uint32_t outcome_set0 = outcome_set * 4U;
8841       int16_t outcome_1 =
8842           (int16_t)(coin_toss_outcomes >> (uint32_t)outcome_set0 & 3U);
8843       int16_t outcome_2 =
8844           (int16_t)(coin_toss_outcomes >> (uint32_t)(outcome_set0 + 2U) & 3U);
8845       size_t offset = (size_t)(outcome_set0 >> 2U);
8846       sampled_i16s[(size_t)8U * chunk_number + offset] = outcome_1 - outcome_2;
8847     }
8848   }
8849   return libcrux_ml_kem_polynomial_from_i16_array_d6_ea(
8850       Eurydice_array_to_slice((size_t)256U, sampled_i16s, int16_t));
8851 }
8852 
8853 /**
8854 A monomorphic instance of
8855 libcrux_ml_kem.sampling.sample_from_binomial_distribution with types
8856 libcrux_ml_kem_vector_portable_vector_type_PortableVector with const generics
8857 - ETA= 2
8858 */
8859 static KRML_MUSTINLINE libcrux_ml_kem_polynomial_PolynomialRingElement_1d
libcrux_ml_kem_sampling_sample_from_binomial_distribution_a0(Eurydice_slice randomness)8860 libcrux_ml_kem_sampling_sample_from_binomial_distribution_a0(
8861     Eurydice_slice randomness) {
8862   return libcrux_ml_kem_sampling_sample_from_binomial_distribution_2_ea(
8863       randomness);
8864 }
8865 
8866 /**
8867 A monomorphic instance of libcrux_ml_kem.ntt.ntt_at_layer_7
8868 with types libcrux_ml_kem_vector_portable_vector_type_PortableVector
8869 with const generics
8870 
8871 */
libcrux_ml_kem_ntt_ntt_at_layer_7_ea(libcrux_ml_kem_polynomial_PolynomialRingElement_1d * re)8872 static KRML_MUSTINLINE void libcrux_ml_kem_ntt_ntt_at_layer_7_ea(
8873     libcrux_ml_kem_polynomial_PolynomialRingElement_1d *re) {
8874   size_t step = LIBCRUX_ML_KEM_POLYNOMIAL_VECTORS_IN_RING_ELEMENT / (size_t)2U;
8875   for (size_t i = (size_t)0U; i < step; i++) {
8876     size_t j = i;
8877     libcrux_ml_kem_vector_portable_vector_type_PortableVector t =
8878         libcrux_ml_kem_vector_portable_multiply_by_constant_b8(
8879             re->coefficients[j + step], (int16_t)-1600);
8880     re->coefficients[j + step] =
8881         libcrux_ml_kem_vector_portable_sub_b8(re->coefficients[j], &t);
8882     libcrux_ml_kem_vector_portable_vector_type_PortableVector uu____1 =
8883         libcrux_ml_kem_vector_portable_add_b8(re->coefficients[j], &t);
8884     re->coefficients[j] = uu____1;
8885   }
8886 }
8887 
8888 /**
8889 A monomorphic instance of libcrux_ml_kem.ntt.ntt_binomially_sampled_ring_element
8890 with types libcrux_ml_kem_vector_portable_vector_type_PortableVector
8891 with const generics
8892 
8893 */
8894 static KRML_MUSTINLINE void
libcrux_ml_kem_ntt_ntt_binomially_sampled_ring_element_ea(libcrux_ml_kem_polynomial_PolynomialRingElement_1d * re)8895 libcrux_ml_kem_ntt_ntt_binomially_sampled_ring_element_ea(
8896     libcrux_ml_kem_polynomial_PolynomialRingElement_1d *re) {
8897   libcrux_ml_kem_ntt_ntt_at_layer_7_ea(re);
8898   size_t zeta_i = (size_t)1U;
8899   libcrux_ml_kem_ntt_ntt_at_layer_4_plus_ea(&zeta_i, re, (size_t)6U,
8900                                             (size_t)11207U);
8901   libcrux_ml_kem_ntt_ntt_at_layer_4_plus_ea(&zeta_i, re, (size_t)5U,
8902                                             (size_t)11207U + (size_t)3328U);
8903   libcrux_ml_kem_ntt_ntt_at_layer_4_plus_ea(
8904       &zeta_i, re, (size_t)4U, (size_t)11207U + (size_t)2U * (size_t)3328U);
8905   libcrux_ml_kem_ntt_ntt_at_layer_3_ea(
8906       &zeta_i, re, (size_t)11207U + (size_t)3U * (size_t)3328U);
8907   libcrux_ml_kem_ntt_ntt_at_layer_2_ea(
8908       &zeta_i, re, (size_t)11207U + (size_t)4U * (size_t)3328U);
8909   libcrux_ml_kem_ntt_ntt_at_layer_1_ea(
8910       &zeta_i, re, (size_t)11207U + (size_t)5U * (size_t)3328U);
8911   libcrux_ml_kem_polynomial_poly_barrett_reduce_d6_ea(re);
8912 }
8913 
8914 /**
8915  Sample a vector of ring elements from a centered binomial distribution and
8916  convert them into their NTT representations.
8917 */
8918 /**
8919 A monomorphic instance of libcrux_ml_kem.ind_cpa.sample_vector_cbd_then_ntt
8920 with types libcrux_ml_kem_vector_portable_vector_type_PortableVector,
8921 libcrux_ml_kem_hash_functions_portable_PortableHash[[$3size_t]] with const
8922 generics
8923 - K= 3
8924 - ETA= 2
8925 - ETA_RANDOMNESS_SIZE= 128
8926 */
8927 static KRML_MUSTINLINE uint8_t
libcrux_ml_kem_ind_cpa_sample_vector_cbd_then_ntt_3b(libcrux_ml_kem_polynomial_PolynomialRingElement_1d * re_as_ntt,uint8_t * prf_input,uint8_t domain_separator)8928 libcrux_ml_kem_ind_cpa_sample_vector_cbd_then_ntt_3b(
8929     libcrux_ml_kem_polynomial_PolynomialRingElement_1d *re_as_ntt,
8930     uint8_t *prf_input, uint8_t domain_separator) {
8931   uint8_t prf_inputs[3U][33U];
8932   for (size_t i = (size_t)0U; i < (size_t)3U; i++) {
8933     core_array__core__clone__Clone_for__Array_T__N___clone(
8934         (size_t)33U, prf_input, prf_inputs[i], uint8_t, void *);
8935   }
8936   domain_separator =
8937       libcrux_ml_kem_utils_prf_input_inc_e0(prf_inputs, domain_separator);
8938   uint8_t prf_outputs[3U][128U];
8939   libcrux_ml_kem_hash_functions_portable_PRFxN_4a_41(prf_inputs, prf_outputs);
8940   for (size_t i = (size_t)0U; i < (size_t)3U; i++) {
8941     size_t i0 = i;
8942     re_as_ntt[i0] =
8943         libcrux_ml_kem_sampling_sample_from_binomial_distribution_a0(
8944             Eurydice_array_to_slice((size_t)128U, prf_outputs[i0], uint8_t));
8945     libcrux_ml_kem_ntt_ntt_binomially_sampled_ring_element_ea(&re_as_ntt[i0]);
8946   }
8947   return domain_separator;
8948 }
8949 
8950 /**
8951 This function found in impl {core::ops::function::FnMut<(usize),
8952 libcrux_ml_kem::polynomial::PolynomialRingElement<Vector>[TraitClause@0,
8953 TraitClause@2]> for libcrux_ml_kem::ind_cpa::encrypt_c1::closure#1<Vector,
8954 Hasher, K, C1_LEN, U_COMPRESSION_FACTOR, BLOCK_LEN, ETA1, ETA1_RANDOMNESS_SIZE,
8955 ETA2, ETA2_RANDOMNESS_SIZE>[TraitClause@0, TraitClause@1, TraitClause@2,
8956 TraitClause@3]}
8957 */
8958 /**
8959 A monomorphic instance of libcrux_ml_kem.ind_cpa.encrypt_c1.call_mut_dd
8960 with types libcrux_ml_kem_vector_portable_vector_type_PortableVector,
8961 libcrux_ml_kem_hash_functions_portable_PortableHash[[$3size_t]] with const
8962 generics
8963 - K= 3
8964 - C1_LEN= 960
8965 - U_COMPRESSION_FACTOR= 10
8966 - BLOCK_LEN= 320
8967 - ETA1= 2
8968 - ETA1_RANDOMNESS_SIZE= 128
8969 - ETA2= 2
8970 - ETA2_RANDOMNESS_SIZE= 128
8971 */
8972 static inline libcrux_ml_kem_polynomial_PolynomialRingElement_1d
libcrux_ml_kem_ind_cpa_encrypt_c1_call_mut_dd_85(void ** _,size_t tupled_args)8973 libcrux_ml_kem_ind_cpa_encrypt_c1_call_mut_dd_85(void **_, size_t tupled_args) {
8974   return libcrux_ml_kem_polynomial_ZERO_d6_ea();
8975 }
8976 
8977 /**
8978  Sample a vector of ring elements from a centered binomial distribution.
8979 */
8980 /**
8981 A monomorphic instance of libcrux_ml_kem.ind_cpa.sample_ring_element_cbd
8982 with types libcrux_ml_kem_vector_portable_vector_type_PortableVector,
8983 libcrux_ml_kem_hash_functions_portable_PortableHash[[$3size_t]] with const
8984 generics
8985 - K= 3
8986 - ETA2_RANDOMNESS_SIZE= 128
8987 - ETA2= 2
8988 */
8989 static KRML_MUSTINLINE uint8_t
libcrux_ml_kem_ind_cpa_sample_ring_element_cbd_3b(uint8_t * prf_input,uint8_t domain_separator,libcrux_ml_kem_polynomial_PolynomialRingElement_1d * error_1)8990 libcrux_ml_kem_ind_cpa_sample_ring_element_cbd_3b(
8991     uint8_t *prf_input, uint8_t domain_separator,
8992     libcrux_ml_kem_polynomial_PolynomialRingElement_1d *error_1) {
8993   uint8_t prf_inputs[3U][33U];
8994   for (size_t i = (size_t)0U; i < (size_t)3U; i++) {
8995     core_array__core__clone__Clone_for__Array_T__N___clone(
8996         (size_t)33U, prf_input, prf_inputs[i], uint8_t, void *);
8997   }
8998   domain_separator =
8999       libcrux_ml_kem_utils_prf_input_inc_e0(prf_inputs, domain_separator);
9000   uint8_t prf_outputs[3U][128U];
9001   libcrux_ml_kem_hash_functions_portable_PRFxN_4a_41(prf_inputs, prf_outputs);
9002   for (size_t i = (size_t)0U; i < (size_t)3U; i++) {
9003     size_t i0 = i;
9004     libcrux_ml_kem_polynomial_PolynomialRingElement_1d uu____0 =
9005         libcrux_ml_kem_sampling_sample_from_binomial_distribution_a0(
9006             Eurydice_array_to_slice((size_t)128U, prf_outputs[i0], uint8_t));
9007     error_1[i0] = uu____0;
9008   }
9009   return domain_separator;
9010 }
9011 
9012 /**
9013 A monomorphic instance of libcrux_ml_kem.hash_functions.portable.PRF
9014 with const generics
9015 - LEN= 128
9016 */
libcrux_ml_kem_hash_functions_portable_PRF_a6(Eurydice_slice input,uint8_t ret[128U])9017 static inline void libcrux_ml_kem_hash_functions_portable_PRF_a6(
9018     Eurydice_slice input, uint8_t ret[128U]) {
9019   uint8_t digest[128U] = {0U};
9020   libcrux_sha3_portable_shake256(
9021       Eurydice_array_to_slice((size_t)128U, digest, uint8_t), input);
9022   memcpy(ret, digest, (size_t)128U * sizeof(uint8_t));
9023 }
9024 
9025 /**
9026 This function found in impl {libcrux_ml_kem::hash_functions::Hash<K> for
9027 libcrux_ml_kem::hash_functions::portable::PortableHash<K>}
9028 */
9029 /**
9030 A monomorphic instance of libcrux_ml_kem.hash_functions.portable.PRF_4a
9031 with const generics
9032 - K= 3
9033 - LEN= 128
9034 */
libcrux_ml_kem_hash_functions_portable_PRF_4a_410(Eurydice_slice input,uint8_t ret[128U])9035 static inline void libcrux_ml_kem_hash_functions_portable_PRF_4a_410(
9036     Eurydice_slice input, uint8_t ret[128U]) {
9037   libcrux_ml_kem_hash_functions_portable_PRF_a6(input, ret);
9038 }
9039 
9040 /**
9041 This function found in impl {core::ops::function::FnMut<(usize),
9042 libcrux_ml_kem::polynomial::PolynomialRingElement<Vector>[TraitClause@0,
9043 TraitClause@1]> for libcrux_ml_kem::matrix::compute_vector_u::closure<Vector,
9044 K>[TraitClause@0, TraitClause@1]}
9045 */
9046 /**
9047 A monomorphic instance of libcrux_ml_kem.matrix.compute_vector_u.call_mut_a8
9048 with types libcrux_ml_kem_vector_portable_vector_type_PortableVector
9049 with const generics
9050 - K= 3
9051 */
9052 static inline libcrux_ml_kem_polynomial_PolynomialRingElement_1d
libcrux_ml_kem_matrix_compute_vector_u_call_mut_a8_1b(void ** _,size_t tupled_args)9053 libcrux_ml_kem_matrix_compute_vector_u_call_mut_a8_1b(void **_,
9054                                                       size_t tupled_args) {
9055   return libcrux_ml_kem_polynomial_ZERO_d6_ea();
9056 }
9057 
9058 /**
9059 A monomorphic instance of libcrux_ml_kem.polynomial.add_error_reduce
9060 with types libcrux_ml_kem_vector_portable_vector_type_PortableVector
9061 with const generics
9062 
9063 */
libcrux_ml_kem_polynomial_add_error_reduce_ea(libcrux_ml_kem_polynomial_PolynomialRingElement_1d * myself,libcrux_ml_kem_polynomial_PolynomialRingElement_1d * error)9064 static KRML_MUSTINLINE void libcrux_ml_kem_polynomial_add_error_reduce_ea(
9065     libcrux_ml_kem_polynomial_PolynomialRingElement_1d *myself,
9066     libcrux_ml_kem_polynomial_PolynomialRingElement_1d *error) {
9067   for (size_t i = (size_t)0U;
9068        i < LIBCRUX_ML_KEM_POLYNOMIAL_VECTORS_IN_RING_ELEMENT; i++) {
9069     size_t j = i;
9070     libcrux_ml_kem_vector_portable_vector_type_PortableVector
9071         coefficient_normal_form =
9072             libcrux_ml_kem_vector_portable_montgomery_multiply_by_constant_b8(
9073                 myself->coefficients[j], (int16_t)1441);
9074     libcrux_ml_kem_vector_portable_vector_type_PortableVector sum =
9075         libcrux_ml_kem_vector_portable_add_b8(coefficient_normal_form,
9076                                               &error->coefficients[j]);
9077     libcrux_ml_kem_vector_portable_vector_type_PortableVector red =
9078         libcrux_ml_kem_vector_portable_barrett_reduce_b8(sum);
9079     myself->coefficients[j] = red;
9080   }
9081 }
9082 
9083 /**
9084 This function found in impl
9085 {libcrux_ml_kem::polynomial::PolynomialRingElement<Vector>[TraitClause@0,
9086 TraitClause@1]}
9087 */
9088 /**
9089 A monomorphic instance of libcrux_ml_kem.polynomial.add_error_reduce_d6
9090 with types libcrux_ml_kem_vector_portable_vector_type_PortableVector
9091 with const generics
9092 
9093 */
libcrux_ml_kem_polynomial_add_error_reduce_d6_ea(libcrux_ml_kem_polynomial_PolynomialRingElement_1d * self,libcrux_ml_kem_polynomial_PolynomialRingElement_1d * error)9094 static KRML_MUSTINLINE void libcrux_ml_kem_polynomial_add_error_reduce_d6_ea(
9095     libcrux_ml_kem_polynomial_PolynomialRingElement_1d *self,
9096     libcrux_ml_kem_polynomial_PolynomialRingElement_1d *error) {
9097   libcrux_ml_kem_polynomial_add_error_reduce_ea(self, error);
9098 }
9099 
9100 /**
9101  Compute u := InvertNTT(Aᵀ ◦ r̂) + e₁
9102 */
9103 /**
9104 A monomorphic instance of libcrux_ml_kem.matrix.compute_vector_u
9105 with types libcrux_ml_kem_vector_portable_vector_type_PortableVector
9106 with const generics
9107 - K= 3
9108 */
libcrux_ml_kem_matrix_compute_vector_u_1b(libcrux_ml_kem_polynomial_PolynomialRingElement_1d (* a_as_ntt)[3U],libcrux_ml_kem_polynomial_PolynomialRingElement_1d * r_as_ntt,libcrux_ml_kem_polynomial_PolynomialRingElement_1d * error_1,libcrux_ml_kem_polynomial_PolynomialRingElement_1d ret[3U])9109 static KRML_MUSTINLINE void libcrux_ml_kem_matrix_compute_vector_u_1b(
9110     libcrux_ml_kem_polynomial_PolynomialRingElement_1d (*a_as_ntt)[3U],
9111     libcrux_ml_kem_polynomial_PolynomialRingElement_1d *r_as_ntt,
9112     libcrux_ml_kem_polynomial_PolynomialRingElement_1d *error_1,
9113     libcrux_ml_kem_polynomial_PolynomialRingElement_1d ret[3U]) {
9114   libcrux_ml_kem_polynomial_PolynomialRingElement_1d result[3U];
9115   for (size_t i = (size_t)0U; i < (size_t)3U; i++) {
9116     /* original Rust expression is not an lvalue in C */
9117     void *lvalue = (void *)0U;
9118     result[i] =
9119         libcrux_ml_kem_matrix_compute_vector_u_call_mut_a8_1b(&lvalue, i);
9120   }
9121   for (size_t i0 = (size_t)0U;
9122        i0 < Eurydice_slice_len(
9123                 Eurydice_array_to_slice(
9124                     (size_t)3U, a_as_ntt,
9125                     libcrux_ml_kem_polynomial_PolynomialRingElement_1d[3U]),
9126                 libcrux_ml_kem_polynomial_PolynomialRingElement_1d[3U]);
9127        i0++) {
9128     size_t i1 = i0;
9129     libcrux_ml_kem_polynomial_PolynomialRingElement_1d *row = a_as_ntt[i1];
9130     for (size_t i = (size_t)0U;
9131          i < Eurydice_slice_len(
9132                  Eurydice_array_to_slice(
9133                      (size_t)3U, row,
9134                      libcrux_ml_kem_polynomial_PolynomialRingElement_1d),
9135                  libcrux_ml_kem_polynomial_PolynomialRingElement_1d);
9136          i++) {
9137       size_t j = i;
9138       libcrux_ml_kem_polynomial_PolynomialRingElement_1d *a_element = &row[j];
9139       libcrux_ml_kem_polynomial_PolynomialRingElement_1d product =
9140           libcrux_ml_kem_polynomial_ntt_multiply_d6_ea(a_element, &r_as_ntt[j]);
9141       libcrux_ml_kem_polynomial_add_to_ring_element_d6_1b(&result[i1],
9142                                                           &product);
9143     }
9144     libcrux_ml_kem_invert_ntt_invert_ntt_montgomery_1b(&result[i1]);
9145     libcrux_ml_kem_polynomial_add_error_reduce_d6_ea(&result[i1], &error_1[i1]);
9146   }
9147   memcpy(
9148       ret, result,
9149       (size_t)3U * sizeof(libcrux_ml_kem_polynomial_PolynomialRingElement_1d));
9150 }
9151 
9152 /**
9153 A monomorphic instance of libcrux_ml_kem.vector.portable.compress.compress
9154 with const generics
9155 - COEFFICIENT_BITS= 10
9156 */
9157 static KRML_MUSTINLINE libcrux_ml_kem_vector_portable_vector_type_PortableVector
libcrux_ml_kem_vector_portable_compress_compress_ef(libcrux_ml_kem_vector_portable_vector_type_PortableVector a)9158 libcrux_ml_kem_vector_portable_compress_compress_ef(
9159     libcrux_ml_kem_vector_portable_vector_type_PortableVector a) {
9160   for (size_t i = (size_t)0U;
9161        i < LIBCRUX_ML_KEM_VECTOR_TRAITS_FIELD_ELEMENTS_IN_VECTOR; i++) {
9162     size_t i0 = i;
9163     int16_t uu____0 = libcrux_secrets_int_as_i16_f5(
9164         libcrux_ml_kem_vector_portable_compress_compress_ciphertext_coefficient(
9165             (uint8_t)(int32_t)10,
9166             libcrux_secrets_int_as_u16_f5(a.elements[i0])));
9167     a.elements[i0] = uu____0;
9168   }
9169   return a;
9170 }
9171 
9172 /**
9173 This function found in impl {libcrux_ml_kem::vector::traits::Operations for
9174 libcrux_ml_kem::vector::portable::vector_type::PortableVector}
9175 */
9176 /**
9177 A monomorphic instance of libcrux_ml_kem.vector.portable.compress_b8
9178 with const generics
9179 - COEFFICIENT_BITS= 10
9180 */
9181 static inline libcrux_ml_kem_vector_portable_vector_type_PortableVector
libcrux_ml_kem_vector_portable_compress_b8_ef(libcrux_ml_kem_vector_portable_vector_type_PortableVector a)9182 libcrux_ml_kem_vector_portable_compress_b8_ef(
9183     libcrux_ml_kem_vector_portable_vector_type_PortableVector a) {
9184   return libcrux_ml_kem_vector_portable_compress_compress_ef(a);
9185 }
9186 
9187 /**
9188 A monomorphic instance of libcrux_ml_kem.serialize.compress_then_serialize_10
9189 with types libcrux_ml_kem_vector_portable_vector_type_PortableVector
9190 with const generics
9191 - OUT_LEN= 320
9192 */
9193 static KRML_MUSTINLINE void
libcrux_ml_kem_serialize_compress_then_serialize_10_ff(libcrux_ml_kem_polynomial_PolynomialRingElement_1d * re,uint8_t ret[320U])9194 libcrux_ml_kem_serialize_compress_then_serialize_10_ff(
9195     libcrux_ml_kem_polynomial_PolynomialRingElement_1d *re, uint8_t ret[320U]) {
9196   uint8_t serialized[320U] = {0U};
9197   for (size_t i = (size_t)0U;
9198        i < LIBCRUX_ML_KEM_POLYNOMIAL_VECTORS_IN_RING_ELEMENT; i++) {
9199     size_t i0 = i;
9200     libcrux_ml_kem_vector_portable_vector_type_PortableVector coefficient =
9201         libcrux_ml_kem_vector_portable_compress_b8_ef(
9202             libcrux_ml_kem_serialize_to_unsigned_field_modulus_ea(
9203                 re->coefficients[i0]));
9204     uint8_t bytes[20U];
9205     libcrux_ml_kem_vector_portable_serialize_10_b8(coefficient, bytes);
9206     Eurydice_slice_copy(
9207         Eurydice_array_to_subslice3(serialized, (size_t)20U * i0,
9208                                     (size_t)20U * i0 + (size_t)20U, uint8_t *),
9209         Eurydice_array_to_slice((size_t)20U, bytes, uint8_t), uint8_t);
9210   }
9211   memcpy(ret, serialized, (size_t)320U * sizeof(uint8_t));
9212 }
9213 
9214 /**
9215 A monomorphic instance of
9216 libcrux_ml_kem.serialize.compress_then_serialize_ring_element_u with types
9217 libcrux_ml_kem_vector_portable_vector_type_PortableVector with const generics
9218 - COMPRESSION_FACTOR= 10
9219 - OUT_LEN= 320
9220 */
9221 static KRML_MUSTINLINE void
libcrux_ml_kem_serialize_compress_then_serialize_ring_element_u_fe(libcrux_ml_kem_polynomial_PolynomialRingElement_1d * re,uint8_t ret[320U])9222 libcrux_ml_kem_serialize_compress_then_serialize_ring_element_u_fe(
9223     libcrux_ml_kem_polynomial_PolynomialRingElement_1d *re, uint8_t ret[320U]) {
9224   uint8_t uu____0[320U];
9225   libcrux_ml_kem_serialize_compress_then_serialize_10_ff(re, uu____0);
9226   memcpy(ret, uu____0, (size_t)320U * sizeof(uint8_t));
9227 }
9228 
9229 /**
9230  Call [`compress_then_serialize_ring_element_u`] on each ring element.
9231 */
9232 /**
9233 A monomorphic instance of libcrux_ml_kem.ind_cpa.compress_then_serialize_u
9234 with types libcrux_ml_kem_vector_portable_vector_type_PortableVector
9235 with const generics
9236 - K= 3
9237 - OUT_LEN= 960
9238 - COMPRESSION_FACTOR= 10
9239 - BLOCK_LEN= 320
9240 */
libcrux_ml_kem_ind_cpa_compress_then_serialize_u_43(libcrux_ml_kem_polynomial_PolynomialRingElement_1d input[3U],Eurydice_slice out)9241 static KRML_MUSTINLINE void libcrux_ml_kem_ind_cpa_compress_then_serialize_u_43(
9242     libcrux_ml_kem_polynomial_PolynomialRingElement_1d input[3U],
9243     Eurydice_slice out) {
9244   for (size_t i = (size_t)0U;
9245        i < Eurydice_slice_len(
9246                Eurydice_array_to_slice(
9247                    (size_t)3U, input,
9248                    libcrux_ml_kem_polynomial_PolynomialRingElement_1d),
9249                libcrux_ml_kem_polynomial_PolynomialRingElement_1d);
9250        i++) {
9251     size_t i0 = i;
9252     libcrux_ml_kem_polynomial_PolynomialRingElement_1d re = input[i0];
9253     Eurydice_slice uu____0 = Eurydice_slice_subslice3(
9254         out, i0 * ((size_t)960U / (size_t)3U),
9255         (i0 + (size_t)1U) * ((size_t)960U / (size_t)3U), uint8_t *);
9256     uint8_t ret[320U];
9257     libcrux_ml_kem_serialize_compress_then_serialize_ring_element_u_fe(&re,
9258                                                                        ret);
9259     Eurydice_slice_copy(
9260         uu____0, Eurydice_array_to_slice((size_t)320U, ret, uint8_t), uint8_t);
9261   }
9262 }
9263 
9264 /**
9265 A monomorphic instance of libcrux_ml_kem.ind_cpa.encrypt_c1
9266 with types libcrux_ml_kem_vector_portable_vector_type_PortableVector,
9267 libcrux_ml_kem_hash_functions_portable_PortableHash[[$3size_t]] with const
9268 generics
9269 - K= 3
9270 - C1_LEN= 960
9271 - U_COMPRESSION_FACTOR= 10
9272 - BLOCK_LEN= 320
9273 - ETA1= 2
9274 - ETA1_RANDOMNESS_SIZE= 128
9275 - ETA2= 2
9276 - ETA2_RANDOMNESS_SIZE= 128
9277 */
libcrux_ml_kem_ind_cpa_encrypt_c1_85(Eurydice_slice randomness,libcrux_ml_kem_polynomial_PolynomialRingElement_1d (* matrix)[3U],Eurydice_slice ciphertext)9278 static KRML_MUSTINLINE tuple_ed libcrux_ml_kem_ind_cpa_encrypt_c1_85(
9279     Eurydice_slice randomness,
9280     libcrux_ml_kem_polynomial_PolynomialRingElement_1d (*matrix)[3U],
9281     Eurydice_slice ciphertext) {
9282   uint8_t prf_input[33U];
9283   libcrux_ml_kem_utils_into_padded_array_c8(randomness, prf_input);
9284   libcrux_ml_kem_polynomial_PolynomialRingElement_1d r_as_ntt[3U];
9285   for (size_t i = (size_t)0U; i < (size_t)3U; i++) {
9286     /* original Rust expression is not an lvalue in C */
9287     void *lvalue = (void *)0U;
9288     r_as_ntt[i] = libcrux_ml_kem_ind_cpa_encrypt_c1_call_mut_f1_85(&lvalue, i);
9289   }
9290   uint8_t domain_separator0 =
9291       libcrux_ml_kem_ind_cpa_sample_vector_cbd_then_ntt_3b(r_as_ntt, prf_input,
9292                                                            0U);
9293   libcrux_ml_kem_polynomial_PolynomialRingElement_1d error_1[3U];
9294   for (size_t i = (size_t)0U; i < (size_t)3U; i++) {
9295     /* original Rust expression is not an lvalue in C */
9296     void *lvalue = (void *)0U;
9297     error_1[i] = libcrux_ml_kem_ind_cpa_encrypt_c1_call_mut_dd_85(&lvalue, i);
9298   }
9299   uint8_t domain_separator = libcrux_ml_kem_ind_cpa_sample_ring_element_cbd_3b(
9300       prf_input, domain_separator0, error_1);
9301   prf_input[32U] = domain_separator;
9302   uint8_t prf_output[128U];
9303   libcrux_ml_kem_hash_functions_portable_PRF_4a_410(
9304       Eurydice_array_to_slice((size_t)33U, prf_input, uint8_t), prf_output);
9305   libcrux_ml_kem_polynomial_PolynomialRingElement_1d error_2 =
9306       libcrux_ml_kem_sampling_sample_from_binomial_distribution_a0(
9307           Eurydice_array_to_slice((size_t)128U, prf_output, uint8_t));
9308   libcrux_ml_kem_polynomial_PolynomialRingElement_1d u[3U];
9309   libcrux_ml_kem_matrix_compute_vector_u_1b(matrix, r_as_ntt, error_1, u);
9310   libcrux_ml_kem_polynomial_PolynomialRingElement_1d uu____0[3U];
9311   memcpy(
9312       uu____0, u,
9313       (size_t)3U * sizeof(libcrux_ml_kem_polynomial_PolynomialRingElement_1d));
9314   libcrux_ml_kem_ind_cpa_compress_then_serialize_u_43(uu____0, ciphertext);
9315   /* Passing arrays by value in Rust generates a copy in C */
9316   libcrux_ml_kem_polynomial_PolynomialRingElement_1d copy_of_r_as_ntt[3U];
9317   memcpy(
9318       copy_of_r_as_ntt, r_as_ntt,
9319       (size_t)3U * sizeof(libcrux_ml_kem_polynomial_PolynomialRingElement_1d));
9320   tuple_ed lit;
9321   memcpy(
9322       lit.fst, copy_of_r_as_ntt,
9323       (size_t)3U * sizeof(libcrux_ml_kem_polynomial_PolynomialRingElement_1d));
9324   lit.snd = error_2;
9325   return lit;
9326 }
9327 
9328 /**
9329 A monomorphic instance of
9330 libcrux_ml_kem.serialize.deserialize_then_decompress_message with types
9331 libcrux_ml_kem_vector_portable_vector_type_PortableVector with const generics
9332 
9333 */
9334 static KRML_MUSTINLINE libcrux_ml_kem_polynomial_PolynomialRingElement_1d
libcrux_ml_kem_serialize_deserialize_then_decompress_message_ea(uint8_t * serialized)9335 libcrux_ml_kem_serialize_deserialize_then_decompress_message_ea(
9336     uint8_t *serialized) {
9337   libcrux_ml_kem_polynomial_PolynomialRingElement_1d re =
9338       libcrux_ml_kem_polynomial_ZERO_d6_ea();
9339   for (size_t i = (size_t)0U; i < (size_t)16U; i++) {
9340     size_t i0 = i;
9341     libcrux_ml_kem_vector_portable_vector_type_PortableVector
9342         coefficient_compressed =
9343             libcrux_ml_kem_vector_portable_deserialize_1_b8(
9344                 Eurydice_array_to_subslice3(serialized, (size_t)2U * i0,
9345                                             (size_t)2U * i0 + (size_t)2U,
9346                                             uint8_t *));
9347     libcrux_ml_kem_vector_portable_vector_type_PortableVector uu____0 =
9348         libcrux_ml_kem_vector_portable_decompress_1_b8(coefficient_compressed);
9349     re.coefficients[i0] = uu____0;
9350   }
9351   return re;
9352 }
9353 
9354 /**
9355 A monomorphic instance of libcrux_ml_kem.polynomial.add_message_error_reduce
9356 with types libcrux_ml_kem_vector_portable_vector_type_PortableVector
9357 with const generics
9358 
9359 */
9360 static KRML_MUSTINLINE libcrux_ml_kem_polynomial_PolynomialRingElement_1d
libcrux_ml_kem_polynomial_add_message_error_reduce_ea(libcrux_ml_kem_polynomial_PolynomialRingElement_1d * myself,libcrux_ml_kem_polynomial_PolynomialRingElement_1d * message,libcrux_ml_kem_polynomial_PolynomialRingElement_1d result)9361 libcrux_ml_kem_polynomial_add_message_error_reduce_ea(
9362     libcrux_ml_kem_polynomial_PolynomialRingElement_1d *myself,
9363     libcrux_ml_kem_polynomial_PolynomialRingElement_1d *message,
9364     libcrux_ml_kem_polynomial_PolynomialRingElement_1d result) {
9365   for (size_t i = (size_t)0U;
9366        i < LIBCRUX_ML_KEM_POLYNOMIAL_VECTORS_IN_RING_ELEMENT; i++) {
9367     size_t i0 = i;
9368     libcrux_ml_kem_vector_portable_vector_type_PortableVector
9369         coefficient_normal_form =
9370             libcrux_ml_kem_vector_portable_montgomery_multiply_by_constant_b8(
9371                 result.coefficients[i0], (int16_t)1441);
9372     libcrux_ml_kem_vector_portable_vector_type_PortableVector sum1 =
9373         libcrux_ml_kem_vector_portable_add_b8(myself->coefficients[i0],
9374                                               &message->coefficients[i0]);
9375     libcrux_ml_kem_vector_portable_vector_type_PortableVector sum2 =
9376         libcrux_ml_kem_vector_portable_add_b8(coefficient_normal_form, &sum1);
9377     libcrux_ml_kem_vector_portable_vector_type_PortableVector red =
9378         libcrux_ml_kem_vector_portable_barrett_reduce_b8(sum2);
9379     result.coefficients[i0] = red;
9380   }
9381   return result;
9382 }
9383 
9384 /**
9385 This function found in impl
9386 {libcrux_ml_kem::polynomial::PolynomialRingElement<Vector>[TraitClause@0,
9387 TraitClause@1]}
9388 */
9389 /**
9390 A monomorphic instance of libcrux_ml_kem.polynomial.add_message_error_reduce_d6
9391 with types libcrux_ml_kem_vector_portable_vector_type_PortableVector
9392 with const generics
9393 
9394 */
9395 static KRML_MUSTINLINE libcrux_ml_kem_polynomial_PolynomialRingElement_1d
libcrux_ml_kem_polynomial_add_message_error_reduce_d6_ea(libcrux_ml_kem_polynomial_PolynomialRingElement_1d * self,libcrux_ml_kem_polynomial_PolynomialRingElement_1d * message,libcrux_ml_kem_polynomial_PolynomialRingElement_1d result)9396 libcrux_ml_kem_polynomial_add_message_error_reduce_d6_ea(
9397     libcrux_ml_kem_polynomial_PolynomialRingElement_1d *self,
9398     libcrux_ml_kem_polynomial_PolynomialRingElement_1d *message,
9399     libcrux_ml_kem_polynomial_PolynomialRingElement_1d result) {
9400   return libcrux_ml_kem_polynomial_add_message_error_reduce_ea(self, message,
9401                                                                result);
9402 }
9403 
9404 /**
9405  Compute InverseNTT(tᵀ ◦ r̂) + e₂ + message
9406 */
9407 /**
9408 A monomorphic instance of libcrux_ml_kem.matrix.compute_ring_element_v
9409 with types libcrux_ml_kem_vector_portable_vector_type_PortableVector
9410 with const generics
9411 - K= 3
9412 */
9413 static KRML_MUSTINLINE libcrux_ml_kem_polynomial_PolynomialRingElement_1d
libcrux_ml_kem_matrix_compute_ring_element_v_1b(libcrux_ml_kem_polynomial_PolynomialRingElement_1d * t_as_ntt,libcrux_ml_kem_polynomial_PolynomialRingElement_1d * r_as_ntt,libcrux_ml_kem_polynomial_PolynomialRingElement_1d * error_2,libcrux_ml_kem_polynomial_PolynomialRingElement_1d * message)9414 libcrux_ml_kem_matrix_compute_ring_element_v_1b(
9415     libcrux_ml_kem_polynomial_PolynomialRingElement_1d *t_as_ntt,
9416     libcrux_ml_kem_polynomial_PolynomialRingElement_1d *r_as_ntt,
9417     libcrux_ml_kem_polynomial_PolynomialRingElement_1d *error_2,
9418     libcrux_ml_kem_polynomial_PolynomialRingElement_1d *message) {
9419   libcrux_ml_kem_polynomial_PolynomialRingElement_1d result =
9420       libcrux_ml_kem_polynomial_ZERO_d6_ea();
9421   for (size_t i = (size_t)0U; i < (size_t)3U; i++) {
9422     size_t i0 = i;
9423     libcrux_ml_kem_polynomial_PolynomialRingElement_1d product =
9424         libcrux_ml_kem_polynomial_ntt_multiply_d6_ea(&t_as_ntt[i0],
9425                                                      &r_as_ntt[i0]);
9426     libcrux_ml_kem_polynomial_add_to_ring_element_d6_1b(&result, &product);
9427   }
9428   libcrux_ml_kem_invert_ntt_invert_ntt_montgomery_1b(&result);
9429   return libcrux_ml_kem_polynomial_add_message_error_reduce_d6_ea(
9430       error_2, message, result);
9431 }
9432 
9433 /**
9434 A monomorphic instance of libcrux_ml_kem.vector.portable.compress.compress
9435 with const generics
9436 - COEFFICIENT_BITS= 4
9437 */
9438 static KRML_MUSTINLINE libcrux_ml_kem_vector_portable_vector_type_PortableVector
libcrux_ml_kem_vector_portable_compress_compress_d1(libcrux_ml_kem_vector_portable_vector_type_PortableVector a)9439 libcrux_ml_kem_vector_portable_compress_compress_d1(
9440     libcrux_ml_kem_vector_portable_vector_type_PortableVector a) {
9441   for (size_t i = (size_t)0U;
9442        i < LIBCRUX_ML_KEM_VECTOR_TRAITS_FIELD_ELEMENTS_IN_VECTOR; i++) {
9443     size_t i0 = i;
9444     int16_t uu____0 = libcrux_secrets_int_as_i16_f5(
9445         libcrux_ml_kem_vector_portable_compress_compress_ciphertext_coefficient(
9446             (uint8_t)(int32_t)4,
9447             libcrux_secrets_int_as_u16_f5(a.elements[i0])));
9448     a.elements[i0] = uu____0;
9449   }
9450   return a;
9451 }
9452 
9453 /**
9454 This function found in impl {libcrux_ml_kem::vector::traits::Operations for
9455 libcrux_ml_kem::vector::portable::vector_type::PortableVector}
9456 */
9457 /**
9458 A monomorphic instance of libcrux_ml_kem.vector.portable.compress_b8
9459 with const generics
9460 - COEFFICIENT_BITS= 4
9461 */
9462 static inline libcrux_ml_kem_vector_portable_vector_type_PortableVector
libcrux_ml_kem_vector_portable_compress_b8_d1(libcrux_ml_kem_vector_portable_vector_type_PortableVector a)9463 libcrux_ml_kem_vector_portable_compress_b8_d1(
9464     libcrux_ml_kem_vector_portable_vector_type_PortableVector a) {
9465   return libcrux_ml_kem_vector_portable_compress_compress_d1(a);
9466 }
9467 
9468 /**
9469 A monomorphic instance of libcrux_ml_kem.serialize.compress_then_serialize_4
9470 with types libcrux_ml_kem_vector_portable_vector_type_PortableVector
9471 with const generics
9472 
9473 */
9474 static KRML_MUSTINLINE void
libcrux_ml_kem_serialize_compress_then_serialize_4_ea(libcrux_ml_kem_polynomial_PolynomialRingElement_1d re,Eurydice_slice serialized)9475 libcrux_ml_kem_serialize_compress_then_serialize_4_ea(
9476     libcrux_ml_kem_polynomial_PolynomialRingElement_1d re,
9477     Eurydice_slice serialized) {
9478   for (size_t i = (size_t)0U;
9479        i < LIBCRUX_ML_KEM_POLYNOMIAL_VECTORS_IN_RING_ELEMENT; i++) {
9480     size_t i0 = i;
9481     libcrux_ml_kem_vector_portable_vector_type_PortableVector coefficient =
9482         libcrux_ml_kem_vector_portable_compress_b8_d1(
9483             libcrux_ml_kem_serialize_to_unsigned_field_modulus_ea(
9484                 re.coefficients[i0]));
9485     uint8_t bytes[8U];
9486     libcrux_ml_kem_vector_portable_serialize_4_b8(coefficient, bytes);
9487     Eurydice_slice_copy(
9488         Eurydice_slice_subslice3(serialized, (size_t)8U * i0,
9489                                  (size_t)8U * i0 + (size_t)8U, uint8_t *),
9490         Eurydice_array_to_slice((size_t)8U, bytes, uint8_t), uint8_t);
9491   }
9492 }
9493 
9494 /**
9495 A monomorphic instance of
9496 libcrux_ml_kem.serialize.compress_then_serialize_ring_element_v with types
9497 libcrux_ml_kem_vector_portable_vector_type_PortableVector with const generics
9498 - K= 3
9499 - COMPRESSION_FACTOR= 4
9500 - OUT_LEN= 128
9501 */
9502 static KRML_MUSTINLINE void
libcrux_ml_kem_serialize_compress_then_serialize_ring_element_v_6c(libcrux_ml_kem_polynomial_PolynomialRingElement_1d re,Eurydice_slice out)9503 libcrux_ml_kem_serialize_compress_then_serialize_ring_element_v_6c(
9504     libcrux_ml_kem_polynomial_PolynomialRingElement_1d re, Eurydice_slice out) {
9505   libcrux_ml_kem_serialize_compress_then_serialize_4_ea(re, out);
9506 }
9507 
9508 /**
9509 A monomorphic instance of libcrux_ml_kem.ind_cpa.encrypt_c2
9510 with types libcrux_ml_kem_vector_portable_vector_type_PortableVector
9511 with const generics
9512 - K= 3
9513 - V_COMPRESSION_FACTOR= 4
9514 - C2_LEN= 128
9515 */
libcrux_ml_kem_ind_cpa_encrypt_c2_6c(libcrux_ml_kem_polynomial_PolynomialRingElement_1d * t_as_ntt,libcrux_ml_kem_polynomial_PolynomialRingElement_1d * r_as_ntt,libcrux_ml_kem_polynomial_PolynomialRingElement_1d * error_2,uint8_t * message,Eurydice_slice ciphertext)9516 static KRML_MUSTINLINE void libcrux_ml_kem_ind_cpa_encrypt_c2_6c(
9517     libcrux_ml_kem_polynomial_PolynomialRingElement_1d *t_as_ntt,
9518     libcrux_ml_kem_polynomial_PolynomialRingElement_1d *r_as_ntt,
9519     libcrux_ml_kem_polynomial_PolynomialRingElement_1d *error_2,
9520     uint8_t *message, Eurydice_slice ciphertext) {
9521   libcrux_ml_kem_polynomial_PolynomialRingElement_1d message_as_ring_element =
9522       libcrux_ml_kem_serialize_deserialize_then_decompress_message_ea(message);
9523   libcrux_ml_kem_polynomial_PolynomialRingElement_1d v =
9524       libcrux_ml_kem_matrix_compute_ring_element_v_1b(
9525           t_as_ntt, r_as_ntt, error_2, &message_as_ring_element);
9526   libcrux_ml_kem_serialize_compress_then_serialize_ring_element_v_6c(
9527       v, ciphertext);
9528 }
9529 
9530 /**
9531  This function implements <strong>Algorithm 13</strong> of the
9532  NIST FIPS 203 specification; this is the Kyber CPA-PKE encryption algorithm.
9533 
9534  Algorithm 13 is reproduced below:
9535 
9536  ```plaintext
9537  Input: encryption key ekₚₖₑ ∈ ��^{384k+32}.
9538  Input: message m ∈ ��^{32}.
9539  Input: encryption randomness r ∈ ��^{32}.
9540  Output: ciphertext c ∈ ��^{32(dᵤk + dᵥ)}.
9541 
9542  N ← 0
9543  t̂ ← ByteDecode₁₂(ekₚₖₑ[0:384k])
9544  ρ ← ekₚₖₑ[384k: 384k + 32]
9545  for (i ← 0; i < k; i++)
9546      for(j ← 0; j < k; j++)
9547          Â[i,j] ← SampleNTT(XOF(ρ, i, j))
9548      end for
9549  end for
9550  for(i ← 0; i < k; i++)
9551      r[i] ← SamplePolyCBD_{η₁}(PRF_{η₁}(r,N))
9552      N ← N + 1
9553  end for
9554  for(i ← 0; i < k; i++)
9555      e₁[i] ← SamplePolyCBD_{η₂}(PRF_{η₂}(r,N))
9556      N ← N + 1
9557  end for
9558  e₂ ← SamplePolyCBD_{η₂}(PRF_{η₂}(r,N))
9559  r̂ ← NTT(r)
9560  u ← NTT-¹(Âᵀ ◦ r̂) + e₁
9561  μ ← Decompress₁(ByteDecode₁(m)))
9562  v ← NTT-¹(t̂ᵀ ◦ rˆ) + e₂ + μ
9563  c₁ ← ByteEncode_{dᵤ}(Compress_{dᵤ}(u))
9564  c₂ ← ByteEncode_{dᵥ}(Compress_{dᵥ}(v))
9565  return c ← (c₁ ‖ c₂)
9566  ```
9567 
9568  The NIST FIPS 203 standard can be found at
9569  <https://csrc.nist.gov/pubs/fips/203/ipd>.
9570 */
9571 /**
9572 A monomorphic instance of libcrux_ml_kem.ind_cpa.encrypt_unpacked
9573 with types libcrux_ml_kem_vector_portable_vector_type_PortableVector,
9574 libcrux_ml_kem_hash_functions_portable_PortableHash[[$3size_t]] with const
9575 generics
9576 - K= 3
9577 - CIPHERTEXT_SIZE= 1088
9578 - T_AS_NTT_ENCODED_SIZE= 1152
9579 - C1_LEN= 960
9580 - C2_LEN= 128
9581 - U_COMPRESSION_FACTOR= 10
9582 - V_COMPRESSION_FACTOR= 4
9583 - BLOCK_LEN= 320
9584 - ETA1= 2
9585 - ETA1_RANDOMNESS_SIZE= 128
9586 - ETA2= 2
9587 - ETA2_RANDOMNESS_SIZE= 128
9588 */
libcrux_ml_kem_ind_cpa_encrypt_unpacked_2a(libcrux_ml_kem_ind_cpa_unpacked_IndCpaPublicKeyUnpacked_a0 * public_key,uint8_t * message,Eurydice_slice randomness,uint8_t ret[1088U])9589 static KRML_MUSTINLINE void libcrux_ml_kem_ind_cpa_encrypt_unpacked_2a(
9590     libcrux_ml_kem_ind_cpa_unpacked_IndCpaPublicKeyUnpacked_a0 *public_key,
9591     uint8_t *message, Eurydice_slice randomness, uint8_t ret[1088U]) {
9592   uint8_t ciphertext[1088U] = {0U};
9593   tuple_ed uu____0 = libcrux_ml_kem_ind_cpa_encrypt_c1_85(
9594       randomness, public_key->A,
9595       Eurydice_array_to_subslice3(ciphertext, (size_t)0U, (size_t)960U,
9596                                   uint8_t *));
9597   libcrux_ml_kem_polynomial_PolynomialRingElement_1d r_as_ntt[3U];
9598   memcpy(
9599       r_as_ntt, uu____0.fst,
9600       (size_t)3U * sizeof(libcrux_ml_kem_polynomial_PolynomialRingElement_1d));
9601   libcrux_ml_kem_polynomial_PolynomialRingElement_1d error_2 = uu____0.snd;
9602   libcrux_ml_kem_polynomial_PolynomialRingElement_1d *uu____1 =
9603       public_key->t_as_ntt;
9604   libcrux_ml_kem_polynomial_PolynomialRingElement_1d *uu____2 = r_as_ntt;
9605   libcrux_ml_kem_polynomial_PolynomialRingElement_1d *uu____3 = &error_2;
9606   uint8_t *uu____4 = message;
9607   libcrux_ml_kem_ind_cpa_encrypt_c2_6c(
9608       uu____1, uu____2, uu____3, uu____4,
9609       Eurydice_array_to_subslice_from((size_t)1088U, ciphertext, (size_t)960U,
9610                                       uint8_t, size_t, uint8_t[]));
9611   memcpy(ret, ciphertext, (size_t)1088U * sizeof(uint8_t));
9612 }
9613 
9614 /**
9615 A monomorphic instance of libcrux_ml_kem.ind_cpa.encrypt
9616 with types libcrux_ml_kem_vector_portable_vector_type_PortableVector,
9617 libcrux_ml_kem_hash_functions_portable_PortableHash[[$3size_t]] with const
9618 generics
9619 - K= 3
9620 - CIPHERTEXT_SIZE= 1088
9621 - T_AS_NTT_ENCODED_SIZE= 1152
9622 - C1_LEN= 960
9623 - C2_LEN= 128
9624 - U_COMPRESSION_FACTOR= 10
9625 - V_COMPRESSION_FACTOR= 4
9626 - BLOCK_LEN= 320
9627 - ETA1= 2
9628 - ETA1_RANDOMNESS_SIZE= 128
9629 - ETA2= 2
9630 - ETA2_RANDOMNESS_SIZE= 128
9631 */
libcrux_ml_kem_ind_cpa_encrypt_2a(Eurydice_slice public_key,uint8_t * message,Eurydice_slice randomness,uint8_t ret[1088U])9632 static KRML_MUSTINLINE void libcrux_ml_kem_ind_cpa_encrypt_2a(
9633     Eurydice_slice public_key, uint8_t *message, Eurydice_slice randomness,
9634     uint8_t ret[1088U]) {
9635   libcrux_ml_kem_ind_cpa_unpacked_IndCpaPublicKeyUnpacked_a0
9636       unpacked_public_key =
9637           libcrux_ml_kem_ind_cpa_build_unpacked_public_key_3f(public_key);
9638   uint8_t ret0[1088U];
9639   libcrux_ml_kem_ind_cpa_encrypt_unpacked_2a(&unpacked_public_key, message,
9640                                              randomness, ret0);
9641   memcpy(ret, ret0, (size_t)1088U * sizeof(uint8_t));
9642 }
9643 
9644 /**
9645 This function found in impl {libcrux_ml_kem::variant::Variant for
9646 libcrux_ml_kem::variant::MlKem}
9647 */
9648 /**
9649 A monomorphic instance of libcrux_ml_kem.variant.kdf_39
9650 with types libcrux_ml_kem_hash_functions_portable_PortableHash[[$3size_t]]
9651 with const generics
9652 - K= 3
9653 - CIPHERTEXT_SIZE= 1088
9654 */
libcrux_ml_kem_variant_kdf_39_d6(Eurydice_slice shared_secret,uint8_t * _,uint8_t ret[32U])9655 static KRML_MUSTINLINE void libcrux_ml_kem_variant_kdf_39_d6(
9656     Eurydice_slice shared_secret, uint8_t *_, uint8_t ret[32U]) {
9657   uint8_t out[32U] = {0U};
9658   Eurydice_slice_copy(Eurydice_array_to_slice((size_t)32U, out, uint8_t),
9659                       shared_secret, uint8_t);
9660   memcpy(ret, out, (size_t)32U * sizeof(uint8_t));
9661 }
9662 
9663 /**
9664  This code verifies on some machines, runs out of memory on others
9665 */
9666 /**
9667 A monomorphic instance of libcrux_ml_kem.ind_cca.decapsulate
9668 with types libcrux_ml_kem_vector_portable_vector_type_PortableVector,
9669 libcrux_ml_kem_hash_functions_portable_PortableHash[[$3size_t]],
9670 libcrux_ml_kem_variant_MlKem with const generics
9671 - K= 3
9672 - SECRET_KEY_SIZE= 2400
9673 - CPA_SECRET_KEY_SIZE= 1152
9674 - PUBLIC_KEY_SIZE= 1184
9675 - CIPHERTEXT_SIZE= 1088
9676 - T_AS_NTT_ENCODED_SIZE= 1152
9677 - C1_SIZE= 960
9678 - C2_SIZE= 128
9679 - VECTOR_U_COMPRESSION_FACTOR= 10
9680 - VECTOR_V_COMPRESSION_FACTOR= 4
9681 - C1_BLOCK_SIZE= 320
9682 - ETA1= 2
9683 - ETA1_RANDOMNESS_SIZE= 128
9684 - ETA2= 2
9685 - ETA2_RANDOMNESS_SIZE= 128
9686 - IMPLICIT_REJECTION_HASH_INPUT_SIZE= 1120
9687 */
libcrux_ml_kem_ind_cca_decapsulate_62(libcrux_ml_kem_types_MlKemPrivateKey_d9 * private_key,libcrux_ml_kem_mlkem768_MlKem768Ciphertext * ciphertext,uint8_t ret[32U])9688 static KRML_MUSTINLINE void libcrux_ml_kem_ind_cca_decapsulate_62(
9689     libcrux_ml_kem_types_MlKemPrivateKey_d9 *private_key,
9690     libcrux_ml_kem_mlkem768_MlKem768Ciphertext *ciphertext, uint8_t ret[32U]) {
9691   Eurydice_slice_uint8_t_x4 uu____0 =
9692       libcrux_ml_kem_types_unpack_private_key_b4(
9693           Eurydice_array_to_slice((size_t)2400U, private_key->value, uint8_t));
9694   Eurydice_slice ind_cpa_secret_key = uu____0.fst;
9695   Eurydice_slice ind_cpa_public_key = uu____0.snd;
9696   Eurydice_slice ind_cpa_public_key_hash = uu____0.thd;
9697   Eurydice_slice implicit_rejection_value = uu____0.f3;
9698   uint8_t decrypted[32U];
9699   libcrux_ml_kem_ind_cpa_decrypt_42(ind_cpa_secret_key, ciphertext->value,
9700                                     decrypted);
9701   uint8_t to_hash0[64U];
9702   libcrux_ml_kem_utils_into_padded_array_24(
9703       Eurydice_array_to_slice((size_t)32U, decrypted, uint8_t), to_hash0);
9704   Eurydice_slice_copy(
9705       Eurydice_array_to_subslice_from(
9706           (size_t)64U, to_hash0, LIBCRUX_ML_KEM_CONSTANTS_SHARED_SECRET_SIZE,
9707           uint8_t, size_t, uint8_t[]),
9708       ind_cpa_public_key_hash, uint8_t);
9709   uint8_t hashed[64U];
9710   libcrux_ml_kem_hash_functions_portable_G_4a_e0(
9711       Eurydice_array_to_slice((size_t)64U, to_hash0, uint8_t), hashed);
9712   Eurydice_slice_uint8_t_x2 uu____1 = Eurydice_slice_split_at(
9713       Eurydice_array_to_slice((size_t)64U, hashed, uint8_t),
9714       LIBCRUX_ML_KEM_CONSTANTS_SHARED_SECRET_SIZE, uint8_t,
9715       Eurydice_slice_uint8_t_x2);
9716   Eurydice_slice shared_secret0 = uu____1.fst;
9717   Eurydice_slice pseudorandomness = uu____1.snd;
9718   uint8_t to_hash[1120U];
9719   libcrux_ml_kem_utils_into_padded_array_15(implicit_rejection_value, to_hash);
9720   Eurydice_slice uu____2 = Eurydice_array_to_subslice_from(
9721       (size_t)1120U, to_hash, LIBCRUX_ML_KEM_CONSTANTS_SHARED_SECRET_SIZE,
9722       uint8_t, size_t, uint8_t[]);
9723   Eurydice_slice_copy(uu____2, libcrux_ml_kem_types_as_ref_d3_80(ciphertext),
9724                       uint8_t);
9725   uint8_t implicit_rejection_shared_secret0[32U];
9726   libcrux_ml_kem_hash_functions_portable_PRF_4a_41(
9727       Eurydice_array_to_slice((size_t)1120U, to_hash, uint8_t),
9728       implicit_rejection_shared_secret0);
9729   uint8_t expected_ciphertext[1088U];
9730   libcrux_ml_kem_ind_cpa_encrypt_2a(ind_cpa_public_key, decrypted,
9731                                     pseudorandomness, expected_ciphertext);
9732   uint8_t implicit_rejection_shared_secret[32U];
9733   libcrux_ml_kem_variant_kdf_39_d6(
9734       Eurydice_array_to_slice((size_t)32U, implicit_rejection_shared_secret0,
9735                               uint8_t),
9736       libcrux_ml_kem_types_as_slice_a9_80(ciphertext),
9737       implicit_rejection_shared_secret);
9738   uint8_t shared_secret[32U];
9739   libcrux_ml_kem_variant_kdf_39_d6(
9740       shared_secret0, libcrux_ml_kem_types_as_slice_a9_80(ciphertext),
9741       shared_secret);
9742   uint8_t ret0[32U];
9743   libcrux_ml_kem_constant_time_ops_compare_ciphertexts_select_shared_secret_in_constant_time(
9744       libcrux_ml_kem_types_as_ref_d3_80(ciphertext),
9745       Eurydice_array_to_slice((size_t)1088U, expected_ciphertext, uint8_t),
9746       Eurydice_array_to_slice((size_t)32U, shared_secret, uint8_t),
9747       Eurydice_array_to_slice((size_t)32U, implicit_rejection_shared_secret,
9748                               uint8_t),
9749       ret0);
9750   memcpy(ret, ret0, (size_t)32U * sizeof(uint8_t));
9751 }
9752 
9753 /**
9754  Portable decapsulate
9755 */
9756 /**
9757 A monomorphic instance of
9758 libcrux_ml_kem.ind_cca.instantiations.portable.decapsulate with const generics
9759 - K= 3
9760 - SECRET_KEY_SIZE= 2400
9761 - CPA_SECRET_KEY_SIZE= 1152
9762 - PUBLIC_KEY_SIZE= 1184
9763 - CIPHERTEXT_SIZE= 1088
9764 - T_AS_NTT_ENCODED_SIZE= 1152
9765 - C1_SIZE= 960
9766 - C2_SIZE= 128
9767 - VECTOR_U_COMPRESSION_FACTOR= 10
9768 - VECTOR_V_COMPRESSION_FACTOR= 4
9769 - C1_BLOCK_SIZE= 320
9770 - ETA1= 2
9771 - ETA1_RANDOMNESS_SIZE= 128
9772 - ETA2= 2
9773 - ETA2_RANDOMNESS_SIZE= 128
9774 - IMPLICIT_REJECTION_HASH_INPUT_SIZE= 1120
9775 */
9776 static inline void
libcrux_ml_kem_ind_cca_instantiations_portable_decapsulate_35(libcrux_ml_kem_types_MlKemPrivateKey_d9 * private_key,libcrux_ml_kem_mlkem768_MlKem768Ciphertext * ciphertext,uint8_t ret[32U])9777 libcrux_ml_kem_ind_cca_instantiations_portable_decapsulate_35(
9778     libcrux_ml_kem_types_MlKemPrivateKey_d9 *private_key,
9779     libcrux_ml_kem_mlkem768_MlKem768Ciphertext *ciphertext, uint8_t ret[32U]) {
9780   libcrux_ml_kem_ind_cca_decapsulate_62(private_key, ciphertext, ret);
9781 }
9782 
9783 /**
9784  Decapsulate ML-KEM 768
9785 
9786  Generates an [`MlKemSharedSecret`].
9787  The input is a reference to an [`MlKem768PrivateKey`] and an
9788  [`MlKem768Ciphertext`].
9789 */
libcrux_ml_kem_mlkem768_portable_decapsulate(libcrux_ml_kem_types_MlKemPrivateKey_d9 * private_key,libcrux_ml_kem_mlkem768_MlKem768Ciphertext * ciphertext,uint8_t ret[32U])9790 static inline void libcrux_ml_kem_mlkem768_portable_decapsulate(
9791     libcrux_ml_kem_types_MlKemPrivateKey_d9 *private_key,
9792     libcrux_ml_kem_mlkem768_MlKem768Ciphertext *ciphertext, uint8_t ret[32U]) {
9793   libcrux_ml_kem_ind_cca_instantiations_portable_decapsulate_35(
9794       private_key, ciphertext, ret);
9795 }
9796 
9797 /**
9798 This function found in impl {libcrux_ml_kem::variant::Variant for
9799 libcrux_ml_kem::variant::MlKem}
9800 */
9801 /**
9802 A monomorphic instance of libcrux_ml_kem.variant.entropy_preprocess_39
9803 with types libcrux_ml_kem_hash_functions_portable_PortableHash[[$3size_t]]
9804 with const generics
9805 - K= 3
9806 */
libcrux_ml_kem_variant_entropy_preprocess_39_9c(Eurydice_slice randomness,uint8_t ret[32U])9807 static KRML_MUSTINLINE void libcrux_ml_kem_variant_entropy_preprocess_39_9c(
9808     Eurydice_slice randomness, uint8_t ret[32U]) {
9809   uint8_t out[32U] = {0U};
9810   Eurydice_slice_copy(Eurydice_array_to_slice((size_t)32U, out, uint8_t),
9811                       randomness, uint8_t);
9812   memcpy(ret, out, (size_t)32U * sizeof(uint8_t));
9813 }
9814 
9815 /**
9816 This function found in impl {libcrux_ml_kem::hash_functions::Hash<K> for
9817 libcrux_ml_kem::hash_functions::portable::PortableHash<K>}
9818 */
9819 /**
9820 A monomorphic instance of libcrux_ml_kem.hash_functions.portable.H_4a
9821 with const generics
9822 - K= 3
9823 */
libcrux_ml_kem_hash_functions_portable_H_4a_e0(Eurydice_slice input,uint8_t ret[32U])9824 static inline void libcrux_ml_kem_hash_functions_portable_H_4a_e0(
9825     Eurydice_slice input, uint8_t ret[32U]) {
9826   libcrux_ml_kem_hash_functions_portable_H(input, ret);
9827 }
9828 
9829 /**
9830 A monomorphic instance of libcrux_ml_kem.ind_cca.encapsulate
9831 with types libcrux_ml_kem_vector_portable_vector_type_PortableVector,
9832 libcrux_ml_kem_hash_functions_portable_PortableHash[[$3size_t]],
9833 libcrux_ml_kem_variant_MlKem with const generics
9834 - K= 3
9835 - CIPHERTEXT_SIZE= 1088
9836 - PUBLIC_KEY_SIZE= 1184
9837 - T_AS_NTT_ENCODED_SIZE= 1152
9838 - C1_SIZE= 960
9839 - C2_SIZE= 128
9840 - VECTOR_U_COMPRESSION_FACTOR= 10
9841 - VECTOR_V_COMPRESSION_FACTOR= 4
9842 - C1_BLOCK_SIZE= 320
9843 - ETA1= 2
9844 - ETA1_RANDOMNESS_SIZE= 128
9845 - ETA2= 2
9846 - ETA2_RANDOMNESS_SIZE= 128
9847 */
libcrux_ml_kem_ind_cca_encapsulate_ca(libcrux_ml_kem_types_MlKemPublicKey_30 * public_key,uint8_t * randomness)9848 static KRML_MUSTINLINE tuple_c2 libcrux_ml_kem_ind_cca_encapsulate_ca(
9849     libcrux_ml_kem_types_MlKemPublicKey_30 *public_key, uint8_t *randomness) {
9850   uint8_t randomness0[32U];
9851   libcrux_ml_kem_variant_entropy_preprocess_39_9c(
9852       Eurydice_array_to_slice((size_t)32U, randomness, uint8_t), randomness0);
9853   uint8_t to_hash[64U];
9854   libcrux_ml_kem_utils_into_padded_array_24(
9855       Eurydice_array_to_slice((size_t)32U, randomness0, uint8_t), to_hash);
9856   Eurydice_slice uu____0 = Eurydice_array_to_subslice_from(
9857       (size_t)64U, to_hash, LIBCRUX_ML_KEM_CONSTANTS_H_DIGEST_SIZE, uint8_t,
9858       size_t, uint8_t[]);
9859   uint8_t ret0[32U];
9860   libcrux_ml_kem_hash_functions_portable_H_4a_e0(
9861       Eurydice_array_to_slice((size_t)1184U,
9862                               libcrux_ml_kem_types_as_slice_e6_d0(public_key),
9863                               uint8_t),
9864       ret0);
9865   Eurydice_slice_copy(
9866       uu____0, Eurydice_array_to_slice((size_t)32U, ret0, uint8_t), uint8_t);
9867   uint8_t hashed[64U];
9868   libcrux_ml_kem_hash_functions_portable_G_4a_e0(
9869       Eurydice_array_to_slice((size_t)64U, to_hash, uint8_t), hashed);
9870   Eurydice_slice_uint8_t_x2 uu____1 = Eurydice_slice_split_at(
9871       Eurydice_array_to_slice((size_t)64U, hashed, uint8_t),
9872       LIBCRUX_ML_KEM_CONSTANTS_SHARED_SECRET_SIZE, uint8_t,
9873       Eurydice_slice_uint8_t_x2);
9874   Eurydice_slice shared_secret = uu____1.fst;
9875   Eurydice_slice pseudorandomness = uu____1.snd;
9876   uint8_t ciphertext[1088U];
9877   libcrux_ml_kem_ind_cpa_encrypt_2a(
9878       Eurydice_array_to_slice((size_t)1184U,
9879                               libcrux_ml_kem_types_as_slice_e6_d0(public_key),
9880                               uint8_t),
9881       randomness0, pseudorandomness, ciphertext);
9882   /* Passing arrays by value in Rust generates a copy in C */
9883   uint8_t copy_of_ciphertext[1088U];
9884   memcpy(copy_of_ciphertext, ciphertext, (size_t)1088U * sizeof(uint8_t));
9885   tuple_c2 lit;
9886   lit.fst = libcrux_ml_kem_types_from_e0_80(copy_of_ciphertext);
9887   uint8_t ret[32U];
9888   libcrux_ml_kem_variant_kdf_39_d6(shared_secret, ciphertext, ret);
9889   memcpy(lit.snd, ret, (size_t)32U * sizeof(uint8_t));
9890   return lit;
9891 }
9892 
9893 /**
9894 A monomorphic instance of
9895 libcrux_ml_kem.ind_cca.instantiations.portable.encapsulate with const generics
9896 - K= 3
9897 - CIPHERTEXT_SIZE= 1088
9898 - PUBLIC_KEY_SIZE= 1184
9899 - T_AS_NTT_ENCODED_SIZE= 1152
9900 - C1_SIZE= 960
9901 - C2_SIZE= 128
9902 - VECTOR_U_COMPRESSION_FACTOR= 10
9903 - VECTOR_V_COMPRESSION_FACTOR= 4
9904 - C1_BLOCK_SIZE= 320
9905 - ETA1= 2
9906 - ETA1_RANDOMNESS_SIZE= 128
9907 - ETA2= 2
9908 - ETA2_RANDOMNESS_SIZE= 128
9909 */
9910 static inline tuple_c2
libcrux_ml_kem_ind_cca_instantiations_portable_encapsulate_cd(libcrux_ml_kem_types_MlKemPublicKey_30 * public_key,uint8_t * randomness)9911 libcrux_ml_kem_ind_cca_instantiations_portable_encapsulate_cd(
9912     libcrux_ml_kem_types_MlKemPublicKey_30 *public_key, uint8_t *randomness) {
9913   return libcrux_ml_kem_ind_cca_encapsulate_ca(public_key, randomness);
9914 }
9915 
9916 /**
9917  Encapsulate ML-KEM 768
9918 
9919  Generates an ([`MlKem768Ciphertext`], [`MlKemSharedSecret`]) tuple.
9920  The input is a reference to an [`MlKem768PublicKey`] and [`SHARED_SECRET_SIZE`]
9921  bytes of `randomness`.
9922 */
libcrux_ml_kem_mlkem768_portable_encapsulate(libcrux_ml_kem_types_MlKemPublicKey_30 * public_key,uint8_t randomness[32U])9923 static inline tuple_c2 libcrux_ml_kem_mlkem768_portable_encapsulate(
9924     libcrux_ml_kem_types_MlKemPublicKey_30 *public_key,
9925     uint8_t randomness[32U]) {
9926   return libcrux_ml_kem_ind_cca_instantiations_portable_encapsulate_cd(
9927       public_key, randomness);
9928 }
9929 
9930 /**
9931 This function found in impl {core::default::Default for
9932 libcrux_ml_kem::ind_cpa::unpacked::IndCpaPrivateKeyUnpacked<Vector,
9933 K>[TraitClause@0, TraitClause@1]}
9934 */
9935 /**
9936 A monomorphic instance of libcrux_ml_kem.ind_cpa.unpacked.default_70
9937 with types libcrux_ml_kem_vector_portable_vector_type_PortableVector
9938 with const generics
9939 - K= 3
9940 */
9941 static inline libcrux_ml_kem_ind_cpa_unpacked_IndCpaPrivateKeyUnpacked_a0
libcrux_ml_kem_ind_cpa_unpacked_default_70_1b(void)9942 libcrux_ml_kem_ind_cpa_unpacked_default_70_1b(void) {
9943   libcrux_ml_kem_ind_cpa_unpacked_IndCpaPrivateKeyUnpacked_a0 lit;
9944   libcrux_ml_kem_polynomial_PolynomialRingElement_1d repeat_expression[3U];
9945   for (size_t i = (size_t)0U; i < (size_t)3U; i++) {
9946     repeat_expression[i] = libcrux_ml_kem_polynomial_ZERO_d6_ea();
9947   }
9948   memcpy(
9949       lit.secret_as_ntt, repeat_expression,
9950       (size_t)3U * sizeof(libcrux_ml_kem_polynomial_PolynomialRingElement_1d));
9951   return lit;
9952 }
9953 
9954 /**
9955 This function found in impl {libcrux_ml_kem::variant::Variant for
9956 libcrux_ml_kem::variant::MlKem}
9957 */
9958 /**
9959 A monomorphic instance of libcrux_ml_kem.variant.cpa_keygen_seed_39
9960 with types libcrux_ml_kem_hash_functions_portable_PortableHash[[$3size_t]]
9961 with const generics
9962 - K= 3
9963 */
libcrux_ml_kem_variant_cpa_keygen_seed_39_9c(Eurydice_slice key_generation_seed,uint8_t ret[64U])9964 static KRML_MUSTINLINE void libcrux_ml_kem_variant_cpa_keygen_seed_39_9c(
9965     Eurydice_slice key_generation_seed, uint8_t ret[64U]) {
9966   uint8_t seed[33U] = {0U};
9967   Eurydice_slice_copy(
9968       Eurydice_array_to_subslice3(
9969           seed, (size_t)0U,
9970           LIBCRUX_ML_KEM_CONSTANTS_CPA_PKE_KEY_GENERATION_SEED_SIZE, uint8_t *),
9971       key_generation_seed, uint8_t);
9972   seed[LIBCRUX_ML_KEM_CONSTANTS_CPA_PKE_KEY_GENERATION_SEED_SIZE] =
9973       (uint8_t)(size_t)3U;
9974   uint8_t ret0[64U];
9975   libcrux_ml_kem_hash_functions_portable_G_4a_e0(
9976       Eurydice_array_to_slice((size_t)33U, seed, uint8_t), ret0);
9977   memcpy(ret, ret0, (size_t)64U * sizeof(uint8_t));
9978 }
9979 
9980 /**
9981 This function found in impl {core::ops::function::FnMut<(usize),
9982 libcrux_ml_kem::polynomial::PolynomialRingElement<Vector>[TraitClause@0,
9983 TraitClause@3]> for
9984 libcrux_ml_kem::ind_cpa::generate_keypair_unpacked::closure<Vector, Hasher,
9985 Scheme, K, ETA1, ETA1_RANDOMNESS_SIZE>[TraitClause@0, TraitClause@1,
9986 TraitClause@2, TraitClause@3, TraitClause@4, TraitClause@5]}
9987 */
9988 /**
9989 A monomorphic instance of
9990 libcrux_ml_kem.ind_cpa.generate_keypair_unpacked.call_mut_73 with types
9991 libcrux_ml_kem_vector_portable_vector_type_PortableVector,
9992 libcrux_ml_kem_hash_functions_portable_PortableHash[[$3size_t]],
9993 libcrux_ml_kem_variant_MlKem with const generics
9994 - K= 3
9995 - ETA1= 2
9996 - ETA1_RANDOMNESS_SIZE= 128
9997 */
9998 static inline libcrux_ml_kem_polynomial_PolynomialRingElement_1d
libcrux_ml_kem_ind_cpa_generate_keypair_unpacked_call_mut_73_1c(void ** _,size_t tupled_args)9999 libcrux_ml_kem_ind_cpa_generate_keypair_unpacked_call_mut_73_1c(
10000     void **_, size_t tupled_args) {
10001   return libcrux_ml_kem_polynomial_ZERO_d6_ea();
10002 }
10003 
10004 /**
10005 A monomorphic instance of libcrux_ml_kem.polynomial.to_standard_domain
10006 with types libcrux_ml_kem_vector_portable_vector_type_PortableVector
10007 with const generics
10008 
10009 */
10010 static KRML_MUSTINLINE libcrux_ml_kem_vector_portable_vector_type_PortableVector
libcrux_ml_kem_polynomial_to_standard_domain_ea(libcrux_ml_kem_vector_portable_vector_type_PortableVector vector)10011 libcrux_ml_kem_polynomial_to_standard_domain_ea(
10012     libcrux_ml_kem_vector_portable_vector_type_PortableVector vector) {
10013   return libcrux_ml_kem_vector_portable_montgomery_multiply_by_constant_b8(
10014       vector,
10015       LIBCRUX_ML_KEM_VECTOR_TRAITS_MONTGOMERY_R_SQUARED_MOD_FIELD_MODULUS);
10016 }
10017 
10018 /**
10019 A monomorphic instance of libcrux_ml_kem.polynomial.add_standard_error_reduce
10020 with types libcrux_ml_kem_vector_portable_vector_type_PortableVector
10021 with const generics
10022 
10023 */
10024 static KRML_MUSTINLINE void
libcrux_ml_kem_polynomial_add_standard_error_reduce_ea(libcrux_ml_kem_polynomial_PolynomialRingElement_1d * myself,libcrux_ml_kem_polynomial_PolynomialRingElement_1d * error)10025 libcrux_ml_kem_polynomial_add_standard_error_reduce_ea(
10026     libcrux_ml_kem_polynomial_PolynomialRingElement_1d *myself,
10027     libcrux_ml_kem_polynomial_PolynomialRingElement_1d *error) {
10028   for (size_t i = (size_t)0U;
10029        i < LIBCRUX_ML_KEM_POLYNOMIAL_VECTORS_IN_RING_ELEMENT; i++) {
10030     size_t j = i;
10031     libcrux_ml_kem_vector_portable_vector_type_PortableVector
10032         coefficient_normal_form =
10033             libcrux_ml_kem_polynomial_to_standard_domain_ea(
10034                 myself->coefficients[j]);
10035     libcrux_ml_kem_vector_portable_vector_type_PortableVector sum =
10036         libcrux_ml_kem_vector_portable_add_b8(coefficient_normal_form,
10037                                               &error->coefficients[j]);
10038     libcrux_ml_kem_vector_portable_vector_type_PortableVector red =
10039         libcrux_ml_kem_vector_portable_barrett_reduce_b8(sum);
10040     myself->coefficients[j] = red;
10041   }
10042 }
10043 
10044 /**
10045 This function found in impl
10046 {libcrux_ml_kem::polynomial::PolynomialRingElement<Vector>[TraitClause@0,
10047 TraitClause@1]}
10048 */
10049 /**
10050 A monomorphic instance of libcrux_ml_kem.polynomial.add_standard_error_reduce_d6
10051 with types libcrux_ml_kem_vector_portable_vector_type_PortableVector
10052 with const generics
10053 
10054 */
10055 static KRML_MUSTINLINE void
libcrux_ml_kem_polynomial_add_standard_error_reduce_d6_ea(libcrux_ml_kem_polynomial_PolynomialRingElement_1d * self,libcrux_ml_kem_polynomial_PolynomialRingElement_1d * error)10056 libcrux_ml_kem_polynomial_add_standard_error_reduce_d6_ea(
10057     libcrux_ml_kem_polynomial_PolynomialRingElement_1d *self,
10058     libcrux_ml_kem_polynomial_PolynomialRingElement_1d *error) {
10059   libcrux_ml_kem_polynomial_add_standard_error_reduce_ea(self, error);
10060 }
10061 
10062 /**
10063  Compute  ◦ ŝ + ê
10064 */
10065 /**
10066 A monomorphic instance of libcrux_ml_kem.matrix.compute_As_plus_e
10067 with types libcrux_ml_kem_vector_portable_vector_type_PortableVector
10068 with const generics
10069 - K= 3
10070 */
libcrux_ml_kem_matrix_compute_As_plus_e_1b(libcrux_ml_kem_polynomial_PolynomialRingElement_1d * t_as_ntt,libcrux_ml_kem_polynomial_PolynomialRingElement_1d (* matrix_A)[3U],libcrux_ml_kem_polynomial_PolynomialRingElement_1d * s_as_ntt,libcrux_ml_kem_polynomial_PolynomialRingElement_1d * error_as_ntt)10071 static KRML_MUSTINLINE void libcrux_ml_kem_matrix_compute_As_plus_e_1b(
10072     libcrux_ml_kem_polynomial_PolynomialRingElement_1d *t_as_ntt,
10073     libcrux_ml_kem_polynomial_PolynomialRingElement_1d (*matrix_A)[3U],
10074     libcrux_ml_kem_polynomial_PolynomialRingElement_1d *s_as_ntt,
10075     libcrux_ml_kem_polynomial_PolynomialRingElement_1d *error_as_ntt) {
10076   for (size_t i = (size_t)0U;
10077        i < Eurydice_slice_len(
10078                Eurydice_array_to_slice(
10079                    (size_t)3U, matrix_A,
10080                    libcrux_ml_kem_polynomial_PolynomialRingElement_1d[3U]),
10081                libcrux_ml_kem_polynomial_PolynomialRingElement_1d[3U]);
10082        i++) {
10083     size_t i0 = i;
10084     libcrux_ml_kem_polynomial_PolynomialRingElement_1d *row = matrix_A[i0];
10085     libcrux_ml_kem_polynomial_PolynomialRingElement_1d uu____0 =
10086         libcrux_ml_kem_polynomial_ZERO_d6_ea();
10087     t_as_ntt[i0] = uu____0;
10088     for (size_t i1 = (size_t)0U;
10089          i1 < Eurydice_slice_len(
10090                   Eurydice_array_to_slice(
10091                       (size_t)3U, row,
10092                       libcrux_ml_kem_polynomial_PolynomialRingElement_1d),
10093                   libcrux_ml_kem_polynomial_PolynomialRingElement_1d);
10094          i1++) {
10095       size_t j = i1;
10096       libcrux_ml_kem_polynomial_PolynomialRingElement_1d *matrix_element =
10097           &row[j];
10098       libcrux_ml_kem_polynomial_PolynomialRingElement_1d product =
10099           libcrux_ml_kem_polynomial_ntt_multiply_d6_ea(matrix_element,
10100                                                        &s_as_ntt[j]);
10101       libcrux_ml_kem_polynomial_add_to_ring_element_d6_1b(&t_as_ntt[i0],
10102                                                           &product);
10103     }
10104     libcrux_ml_kem_polynomial_add_standard_error_reduce_d6_ea(
10105         &t_as_ntt[i0], &error_as_ntt[i0]);
10106   }
10107 }
10108 
10109 /**
10110  This function implements most of <strong>Algorithm 12</strong> of the
10111  NIST FIPS 203 specification; this is the Kyber CPA-PKE key generation
10112  algorithm.
10113 
10114  We say "most of" since Algorithm 12 samples the required randomness within
10115  the function itself, whereas this implementation expects it to be provided
10116  through the `key_generation_seed` parameter.
10117 
10118  Algorithm 12 is reproduced below:
10119 
10120  ```plaintext
10121  Output: encryption key ekₚₖₑ ∈ ��^{384k+32}.
10122  Output: decryption key dkₚₖₑ ∈ ��^{384k}.
10123 
10124  d ←$ B
10125  (ρ,σ) ← G(d)
10126  N ← 0
10127  for (i ← 0; i < k; i++)
10128      for(j ← 0; j < k; j++)
10129          Â[i,j] ← SampleNTT(XOF(ρ, i, j))
10130      end for
10131  end for
10132  for(i ← 0; i < k; i++)
10133      s[i] ← SamplePolyCBD_{η₁}(PRF_{η₁}(σ,N))
10134      N ← N + 1
10135  end for
10136  for(i ← 0; i < k; i++)
10137      e[i] ← SamplePolyCBD_{η₂}(PRF_{η₂}(σ,N))
10138      N ← N + 1
10139  end for
10140  ŝ ← NTT(s)
10141  ê ← NTT(e)
10142  t̂ ← Â◦ŝ + ê
10143  ekₚₖₑ ← ByteEncode₁₂(t̂) ‖ ρ
10144  dkₚₖₑ ← ByteEncode₁₂(ŝ)
10145  ```
10146 
10147  The NIST FIPS 203 standard can be found at
10148  <https://csrc.nist.gov/pubs/fips/203/ipd>.
10149 */
10150 /**
10151 A monomorphic instance of libcrux_ml_kem.ind_cpa.generate_keypair_unpacked
10152 with types libcrux_ml_kem_vector_portable_vector_type_PortableVector,
10153 libcrux_ml_kem_hash_functions_portable_PortableHash[[$3size_t]],
10154 libcrux_ml_kem_variant_MlKem with const generics
10155 - K= 3
10156 - ETA1= 2
10157 - ETA1_RANDOMNESS_SIZE= 128
10158 */
libcrux_ml_kem_ind_cpa_generate_keypair_unpacked_1c(Eurydice_slice key_generation_seed,libcrux_ml_kem_ind_cpa_unpacked_IndCpaPrivateKeyUnpacked_a0 * private_key,libcrux_ml_kem_ind_cpa_unpacked_IndCpaPublicKeyUnpacked_a0 * public_key)10159 static KRML_MUSTINLINE void libcrux_ml_kem_ind_cpa_generate_keypair_unpacked_1c(
10160     Eurydice_slice key_generation_seed,
10161     libcrux_ml_kem_ind_cpa_unpacked_IndCpaPrivateKeyUnpacked_a0 *private_key,
10162     libcrux_ml_kem_ind_cpa_unpacked_IndCpaPublicKeyUnpacked_a0 *public_key) {
10163   uint8_t hashed[64U];
10164   libcrux_ml_kem_variant_cpa_keygen_seed_39_9c(key_generation_seed, hashed);
10165   Eurydice_slice_uint8_t_x2 uu____0 = Eurydice_slice_split_at(
10166       Eurydice_array_to_slice((size_t)64U, hashed, uint8_t), (size_t)32U,
10167       uint8_t, Eurydice_slice_uint8_t_x2);
10168   Eurydice_slice seed_for_A = uu____0.fst;
10169   Eurydice_slice seed_for_secret_and_error = uu____0.snd;
10170   libcrux_ml_kem_polynomial_PolynomialRingElement_1d(*uu____1)[3U] =
10171       public_key->A;
10172   uint8_t ret[34U];
10173   libcrux_ml_kem_utils_into_padded_array_b6(seed_for_A, ret);
10174   libcrux_ml_kem_matrix_sample_matrix_A_2b(uu____1, ret, true);
10175   uint8_t prf_input[33U];
10176   libcrux_ml_kem_utils_into_padded_array_c8(seed_for_secret_and_error,
10177                                             prf_input);
10178   uint8_t domain_separator =
10179       libcrux_ml_kem_ind_cpa_sample_vector_cbd_then_ntt_3b(
10180           private_key->secret_as_ntt, prf_input, 0U);
10181   libcrux_ml_kem_polynomial_PolynomialRingElement_1d error_as_ntt[3U];
10182   for (size_t i = (size_t)0U; i < (size_t)3U; i++) {
10183     /* original Rust expression is not an lvalue in C */
10184     void *lvalue = (void *)0U;
10185     error_as_ntt[i] =
10186         libcrux_ml_kem_ind_cpa_generate_keypair_unpacked_call_mut_73_1c(&lvalue,
10187                                                                         i);
10188   }
10189   libcrux_ml_kem_ind_cpa_sample_vector_cbd_then_ntt_3b(error_as_ntt, prf_input,
10190                                                        domain_separator);
10191   libcrux_ml_kem_matrix_compute_As_plus_e_1b(
10192       public_key->t_as_ntt, public_key->A, private_key->secret_as_ntt,
10193       error_as_ntt);
10194   uint8_t uu____2[32U];
10195   Result_fb dst;
10196   Eurydice_slice_to_array2(&dst, seed_for_A, Eurydice_slice, uint8_t[32U],
10197                            TryFromSliceError);
10198   unwrap_26_b3(dst, uu____2);
10199   memcpy(public_key->seed_for_A, uu____2, (size_t)32U * sizeof(uint8_t));
10200 }
10201 
10202 /**
10203 A monomorphic instance of
10204 libcrux_ml_kem.serialize.serialize_uncompressed_ring_element with types
10205 libcrux_ml_kem_vector_portable_vector_type_PortableVector with const generics
10206 
10207 */
10208 static KRML_MUSTINLINE void
libcrux_ml_kem_serialize_serialize_uncompressed_ring_element_ea(libcrux_ml_kem_polynomial_PolynomialRingElement_1d * re,uint8_t ret[384U])10209 libcrux_ml_kem_serialize_serialize_uncompressed_ring_element_ea(
10210     libcrux_ml_kem_polynomial_PolynomialRingElement_1d *re, uint8_t ret[384U]) {
10211   uint8_t serialized[384U] = {0U};
10212   for (size_t i = (size_t)0U;
10213        i < LIBCRUX_ML_KEM_POLYNOMIAL_VECTORS_IN_RING_ELEMENT; i++) {
10214     size_t i0 = i;
10215     libcrux_ml_kem_vector_portable_vector_type_PortableVector coefficient =
10216         libcrux_ml_kem_serialize_to_unsigned_field_modulus_ea(
10217             re->coefficients[i0]);
10218     uint8_t bytes[24U];
10219     libcrux_ml_kem_vector_portable_serialize_12_b8(coefficient, bytes);
10220     Eurydice_slice_copy(
10221         Eurydice_array_to_subslice3(serialized, (size_t)24U * i0,
10222                                     (size_t)24U * i0 + (size_t)24U, uint8_t *),
10223         Eurydice_array_to_slice((size_t)24U, bytes, uint8_t), uint8_t);
10224   }
10225   memcpy(ret, serialized, (size_t)384U * sizeof(uint8_t));
10226 }
10227 
10228 /**
10229  Call [`serialize_uncompressed_ring_element`] for each ring element.
10230 */
10231 /**
10232 A monomorphic instance of libcrux_ml_kem.ind_cpa.serialize_vector
10233 with types libcrux_ml_kem_vector_portable_vector_type_PortableVector
10234 with const generics
10235 - K= 3
10236 */
libcrux_ml_kem_ind_cpa_serialize_vector_1b(libcrux_ml_kem_polynomial_PolynomialRingElement_1d * key,Eurydice_slice out)10237 static KRML_MUSTINLINE void libcrux_ml_kem_ind_cpa_serialize_vector_1b(
10238     libcrux_ml_kem_polynomial_PolynomialRingElement_1d *key,
10239     Eurydice_slice out) {
10240   for (size_t i = (size_t)0U;
10241        i < Eurydice_slice_len(
10242                Eurydice_array_to_slice(
10243                    (size_t)3U, key,
10244                    libcrux_ml_kem_polynomial_PolynomialRingElement_1d),
10245                libcrux_ml_kem_polynomial_PolynomialRingElement_1d);
10246        i++) {
10247     size_t i0 = i;
10248     libcrux_ml_kem_polynomial_PolynomialRingElement_1d re = key[i0];
10249     Eurydice_slice uu____0 = Eurydice_slice_subslice3(
10250         out, i0 * LIBCRUX_ML_KEM_CONSTANTS_BYTES_PER_RING_ELEMENT,
10251         (i0 + (size_t)1U) * LIBCRUX_ML_KEM_CONSTANTS_BYTES_PER_RING_ELEMENT,
10252         uint8_t *);
10253     uint8_t ret[384U];
10254     libcrux_ml_kem_serialize_serialize_uncompressed_ring_element_ea(&re, ret);
10255     Eurydice_slice_copy(
10256         uu____0, Eurydice_array_to_slice((size_t)384U, ret, uint8_t), uint8_t);
10257   }
10258 }
10259 
10260 /**
10261  Concatenate `t` and `ρ` into the public key.
10262 */
10263 /**
10264 A monomorphic instance of libcrux_ml_kem.ind_cpa.serialize_public_key_mut
10265 with types libcrux_ml_kem_vector_portable_vector_type_PortableVector
10266 with const generics
10267 - K= 3
10268 - PUBLIC_KEY_SIZE= 1184
10269 */
libcrux_ml_kem_ind_cpa_serialize_public_key_mut_89(libcrux_ml_kem_polynomial_PolynomialRingElement_1d * t_as_ntt,Eurydice_slice seed_for_a,uint8_t * serialized)10270 static KRML_MUSTINLINE void libcrux_ml_kem_ind_cpa_serialize_public_key_mut_89(
10271     libcrux_ml_kem_polynomial_PolynomialRingElement_1d *t_as_ntt,
10272     Eurydice_slice seed_for_a, uint8_t *serialized) {
10273   libcrux_ml_kem_ind_cpa_serialize_vector_1b(
10274       t_as_ntt,
10275       Eurydice_array_to_subslice3(
10276           serialized, (size_t)0U,
10277           libcrux_ml_kem_constants_ranked_bytes_per_ring_element((size_t)3U),
10278           uint8_t *));
10279   Eurydice_slice_copy(
10280       Eurydice_array_to_subslice_from(
10281           (size_t)1184U, serialized,
10282           libcrux_ml_kem_constants_ranked_bytes_per_ring_element((size_t)3U),
10283           uint8_t, size_t, uint8_t[]),
10284       seed_for_a, uint8_t);
10285 }
10286 
10287 /**
10288  Concatenate `t` and `ρ` into the public key.
10289 */
10290 /**
10291 A monomorphic instance of libcrux_ml_kem.ind_cpa.serialize_public_key
10292 with types libcrux_ml_kem_vector_portable_vector_type_PortableVector
10293 with const generics
10294 - K= 3
10295 - PUBLIC_KEY_SIZE= 1184
10296 */
libcrux_ml_kem_ind_cpa_serialize_public_key_89(libcrux_ml_kem_polynomial_PolynomialRingElement_1d * t_as_ntt,Eurydice_slice seed_for_a,uint8_t ret[1184U])10297 static KRML_MUSTINLINE void libcrux_ml_kem_ind_cpa_serialize_public_key_89(
10298     libcrux_ml_kem_polynomial_PolynomialRingElement_1d *t_as_ntt,
10299     Eurydice_slice seed_for_a, uint8_t ret[1184U]) {
10300   uint8_t public_key_serialized[1184U] = {0U};
10301   libcrux_ml_kem_ind_cpa_serialize_public_key_mut_89(t_as_ntt, seed_for_a,
10302                                                      public_key_serialized);
10303   memcpy(ret, public_key_serialized, (size_t)1184U * sizeof(uint8_t));
10304 }
10305 
10306 /**
10307  Serialize the secret key from the unpacked key pair generation.
10308 */
10309 /**
10310 A monomorphic instance of libcrux_ml_kem.ind_cpa.serialize_unpacked_secret_key
10311 with types libcrux_ml_kem_vector_portable_vector_type_PortableVector
10312 with const generics
10313 - K= 3
10314 - PRIVATE_KEY_SIZE= 1152
10315 - PUBLIC_KEY_SIZE= 1184
10316 */
10317 static inline libcrux_ml_kem_utils_extraction_helper_Keypair768
libcrux_ml_kem_ind_cpa_serialize_unpacked_secret_key_6c(libcrux_ml_kem_ind_cpa_unpacked_IndCpaPublicKeyUnpacked_a0 * public_key,libcrux_ml_kem_ind_cpa_unpacked_IndCpaPrivateKeyUnpacked_a0 * private_key)10318 libcrux_ml_kem_ind_cpa_serialize_unpacked_secret_key_6c(
10319     libcrux_ml_kem_ind_cpa_unpacked_IndCpaPublicKeyUnpacked_a0 *public_key,
10320     libcrux_ml_kem_ind_cpa_unpacked_IndCpaPrivateKeyUnpacked_a0 *private_key) {
10321   uint8_t public_key_serialized[1184U];
10322   libcrux_ml_kem_ind_cpa_serialize_public_key_89(
10323       public_key->t_as_ntt,
10324       Eurydice_array_to_slice((size_t)32U, public_key->seed_for_A, uint8_t),
10325       public_key_serialized);
10326   uint8_t secret_key_serialized[1152U] = {0U};
10327   libcrux_ml_kem_ind_cpa_serialize_vector_1b(
10328       private_key->secret_as_ntt,
10329       Eurydice_array_to_slice((size_t)1152U, secret_key_serialized, uint8_t));
10330   /* Passing arrays by value in Rust generates a copy in C */
10331   uint8_t copy_of_secret_key_serialized[1152U];
10332   memcpy(copy_of_secret_key_serialized, secret_key_serialized,
10333          (size_t)1152U * sizeof(uint8_t));
10334   /* Passing arrays by value in Rust generates a copy in C */
10335   uint8_t copy_of_public_key_serialized[1184U];
10336   memcpy(copy_of_public_key_serialized, public_key_serialized,
10337          (size_t)1184U * sizeof(uint8_t));
10338   libcrux_ml_kem_utils_extraction_helper_Keypair768 lit;
10339   memcpy(lit.fst, copy_of_secret_key_serialized,
10340          (size_t)1152U * sizeof(uint8_t));
10341   memcpy(lit.snd, copy_of_public_key_serialized,
10342          (size_t)1184U * sizeof(uint8_t));
10343   return lit;
10344 }
10345 
10346 /**
10347 A monomorphic instance of libcrux_ml_kem.ind_cpa.generate_keypair
10348 with types libcrux_ml_kem_vector_portable_vector_type_PortableVector,
10349 libcrux_ml_kem_hash_functions_portable_PortableHash[[$3size_t]],
10350 libcrux_ml_kem_variant_MlKem with const generics
10351 - K= 3
10352 - PRIVATE_KEY_SIZE= 1152
10353 - PUBLIC_KEY_SIZE= 1184
10354 - ETA1= 2
10355 - ETA1_RANDOMNESS_SIZE= 128
10356 */
10357 static KRML_MUSTINLINE libcrux_ml_kem_utils_extraction_helper_Keypair768
libcrux_ml_kem_ind_cpa_generate_keypair_ea(Eurydice_slice key_generation_seed)10358 libcrux_ml_kem_ind_cpa_generate_keypair_ea(Eurydice_slice key_generation_seed) {
10359   libcrux_ml_kem_ind_cpa_unpacked_IndCpaPrivateKeyUnpacked_a0 private_key =
10360       libcrux_ml_kem_ind_cpa_unpacked_default_70_1b();
10361   libcrux_ml_kem_ind_cpa_unpacked_IndCpaPublicKeyUnpacked_a0 public_key =
10362       libcrux_ml_kem_ind_cpa_unpacked_default_8b_1b();
10363   libcrux_ml_kem_ind_cpa_generate_keypair_unpacked_1c(
10364       key_generation_seed, &private_key, &public_key);
10365   return libcrux_ml_kem_ind_cpa_serialize_unpacked_secret_key_6c(&public_key,
10366                                                                  &private_key);
10367 }
10368 
10369 /**
10370  Serialize the secret key.
10371 */
10372 /**
10373 A monomorphic instance of libcrux_ml_kem.ind_cca.serialize_kem_secret_key_mut
10374 with types libcrux_ml_kem_hash_functions_portable_PortableHash[[$3size_t]]
10375 with const generics
10376 - K= 3
10377 - SERIALIZED_KEY_LEN= 2400
10378 */
10379 static KRML_MUSTINLINE void
libcrux_ml_kem_ind_cca_serialize_kem_secret_key_mut_d6(Eurydice_slice private_key,Eurydice_slice public_key,Eurydice_slice implicit_rejection_value,uint8_t * serialized)10380 libcrux_ml_kem_ind_cca_serialize_kem_secret_key_mut_d6(
10381     Eurydice_slice private_key, Eurydice_slice public_key,
10382     Eurydice_slice implicit_rejection_value, uint8_t *serialized) {
10383   size_t pointer = (size_t)0U;
10384   uint8_t *uu____0 = serialized;
10385   size_t uu____1 = pointer;
10386   size_t uu____2 = pointer;
10387   Eurydice_slice_copy(
10388       Eurydice_array_to_subslice3(
10389           uu____0, uu____1, uu____2 + Eurydice_slice_len(private_key, uint8_t),
10390           uint8_t *),
10391       private_key, uint8_t);
10392   pointer = pointer + Eurydice_slice_len(private_key, uint8_t);
10393   uint8_t *uu____3 = serialized;
10394   size_t uu____4 = pointer;
10395   size_t uu____5 = pointer;
10396   Eurydice_slice_copy(
10397       Eurydice_array_to_subslice3(
10398           uu____3, uu____4, uu____5 + Eurydice_slice_len(public_key, uint8_t),
10399           uint8_t *),
10400       public_key, uint8_t);
10401   pointer = pointer + Eurydice_slice_len(public_key, uint8_t);
10402   Eurydice_slice uu____6 = Eurydice_array_to_subslice3(
10403       serialized, pointer, pointer + LIBCRUX_ML_KEM_CONSTANTS_H_DIGEST_SIZE,
10404       uint8_t *);
10405   uint8_t ret[32U];
10406   libcrux_ml_kem_hash_functions_portable_H_4a_e0(public_key, ret);
10407   Eurydice_slice_copy(
10408       uu____6, Eurydice_array_to_slice((size_t)32U, ret, uint8_t), uint8_t);
10409   pointer = pointer + LIBCRUX_ML_KEM_CONSTANTS_H_DIGEST_SIZE;
10410   uint8_t *uu____7 = serialized;
10411   size_t uu____8 = pointer;
10412   size_t uu____9 = pointer;
10413   Eurydice_slice_copy(
10414       Eurydice_array_to_subslice3(
10415           uu____7, uu____8,
10416           uu____9 + Eurydice_slice_len(implicit_rejection_value, uint8_t),
10417           uint8_t *),
10418       implicit_rejection_value, uint8_t);
10419 }
10420 
10421 /**
10422 A monomorphic instance of libcrux_ml_kem.ind_cca.serialize_kem_secret_key
10423 with types libcrux_ml_kem_hash_functions_portable_PortableHash[[$3size_t]]
10424 with const generics
10425 - K= 3
10426 - SERIALIZED_KEY_LEN= 2400
10427 */
libcrux_ml_kem_ind_cca_serialize_kem_secret_key_d6(Eurydice_slice private_key,Eurydice_slice public_key,Eurydice_slice implicit_rejection_value,uint8_t ret[2400U])10428 static KRML_MUSTINLINE void libcrux_ml_kem_ind_cca_serialize_kem_secret_key_d6(
10429     Eurydice_slice private_key, Eurydice_slice public_key,
10430     Eurydice_slice implicit_rejection_value, uint8_t ret[2400U]) {
10431   uint8_t out[2400U] = {0U};
10432   libcrux_ml_kem_ind_cca_serialize_kem_secret_key_mut_d6(
10433       private_key, public_key, implicit_rejection_value, out);
10434   memcpy(ret, out, (size_t)2400U * sizeof(uint8_t));
10435 }
10436 
10437 /**
10438  Packed API
10439 
10440  Generate a key pair.
10441 
10442  Depending on the `Vector` and `Hasher` used, this requires different hardware
10443  features
10444 */
10445 /**
10446 A monomorphic instance of libcrux_ml_kem.ind_cca.generate_keypair
10447 with types libcrux_ml_kem_vector_portable_vector_type_PortableVector,
10448 libcrux_ml_kem_hash_functions_portable_PortableHash[[$3size_t]],
10449 libcrux_ml_kem_variant_MlKem with const generics
10450 - K= 3
10451 - CPA_PRIVATE_KEY_SIZE= 1152
10452 - PRIVATE_KEY_SIZE= 2400
10453 - PUBLIC_KEY_SIZE= 1184
10454 - ETA1= 2
10455 - ETA1_RANDOMNESS_SIZE= 128
10456 */
10457 static KRML_MUSTINLINE libcrux_ml_kem_mlkem768_MlKem768KeyPair
libcrux_ml_kem_ind_cca_generate_keypair_15(uint8_t * randomness)10458 libcrux_ml_kem_ind_cca_generate_keypair_15(uint8_t *randomness) {
10459   Eurydice_slice ind_cpa_keypair_randomness = Eurydice_array_to_subslice3(
10460       randomness, (size_t)0U,
10461       LIBCRUX_ML_KEM_CONSTANTS_CPA_PKE_KEY_GENERATION_SEED_SIZE, uint8_t *);
10462   Eurydice_slice implicit_rejection_value = Eurydice_array_to_subslice_from(
10463       (size_t)64U, randomness,
10464       LIBCRUX_ML_KEM_CONSTANTS_CPA_PKE_KEY_GENERATION_SEED_SIZE, uint8_t,
10465       size_t, uint8_t[]);
10466   libcrux_ml_kem_utils_extraction_helper_Keypair768 uu____0 =
10467       libcrux_ml_kem_ind_cpa_generate_keypair_ea(ind_cpa_keypair_randomness);
10468   uint8_t ind_cpa_private_key[1152U];
10469   memcpy(ind_cpa_private_key, uu____0.fst, (size_t)1152U * sizeof(uint8_t));
10470   uint8_t public_key[1184U];
10471   memcpy(public_key, uu____0.snd, (size_t)1184U * sizeof(uint8_t));
10472   uint8_t secret_key_serialized[2400U];
10473   libcrux_ml_kem_ind_cca_serialize_kem_secret_key_d6(
10474       Eurydice_array_to_slice((size_t)1152U, ind_cpa_private_key, uint8_t),
10475       Eurydice_array_to_slice((size_t)1184U, public_key, uint8_t),
10476       implicit_rejection_value, secret_key_serialized);
10477   /* Passing arrays by value in Rust generates a copy in C */
10478   uint8_t copy_of_secret_key_serialized[2400U];
10479   memcpy(copy_of_secret_key_serialized, secret_key_serialized,
10480          (size_t)2400U * sizeof(uint8_t));
10481   libcrux_ml_kem_types_MlKemPrivateKey_d9 private_key =
10482       libcrux_ml_kem_types_from_77_28(copy_of_secret_key_serialized);
10483   libcrux_ml_kem_types_MlKemPrivateKey_d9 uu____2 = private_key;
10484   /* Passing arrays by value in Rust generates a copy in C */
10485   uint8_t copy_of_public_key[1184U];
10486   memcpy(copy_of_public_key, public_key, (size_t)1184U * sizeof(uint8_t));
10487   return libcrux_ml_kem_types_from_17_74(
10488       uu____2, libcrux_ml_kem_types_from_fd_d0(copy_of_public_key));
10489 }
10490 
10491 /**
10492  Portable generate key pair.
10493 */
10494 /**
10495 A monomorphic instance of
10496 libcrux_ml_kem.ind_cca.instantiations.portable.generate_keypair with const
10497 generics
10498 - K= 3
10499 - CPA_PRIVATE_KEY_SIZE= 1152
10500 - PRIVATE_KEY_SIZE= 2400
10501 - PUBLIC_KEY_SIZE= 1184
10502 - ETA1= 2
10503 - ETA1_RANDOMNESS_SIZE= 128
10504 */
10505 static inline libcrux_ml_kem_mlkem768_MlKem768KeyPair
libcrux_ml_kem_ind_cca_instantiations_portable_generate_keypair_ce(uint8_t * randomness)10506 libcrux_ml_kem_ind_cca_instantiations_portable_generate_keypair_ce(
10507     uint8_t *randomness) {
10508   return libcrux_ml_kem_ind_cca_generate_keypair_15(randomness);
10509 }
10510 
10511 /**
10512  Generate ML-KEM 768 Key Pair
10513 */
10514 static inline libcrux_ml_kem_mlkem768_MlKem768KeyPair
libcrux_ml_kem_mlkem768_portable_generate_key_pair(uint8_t randomness[64U])10515 libcrux_ml_kem_mlkem768_portable_generate_key_pair(uint8_t randomness[64U]) {
10516   return libcrux_ml_kem_ind_cca_instantiations_portable_generate_keypair_ce(
10517       randomness);
10518 }
10519 
10520 /**
10521  Validate an ML-KEM private key.
10522 
10523  This implements the Hash check in 7.3 3.
10524 */
10525 /**
10526 A monomorphic instance of libcrux_ml_kem.ind_cca.validate_private_key_only
10527 with types libcrux_ml_kem_hash_functions_portable_PortableHash[[$3size_t]]
10528 with const generics
10529 - K= 3
10530 - SECRET_KEY_SIZE= 2400
10531 */
libcrux_ml_kem_ind_cca_validate_private_key_only_d6(libcrux_ml_kem_types_MlKemPrivateKey_d9 * private_key)10532 static KRML_MUSTINLINE bool libcrux_ml_kem_ind_cca_validate_private_key_only_d6(
10533     libcrux_ml_kem_types_MlKemPrivateKey_d9 *private_key) {
10534   uint8_t t[32U];
10535   libcrux_ml_kem_hash_functions_portable_H_4a_e0(
10536       Eurydice_array_to_subslice3(private_key->value, (size_t)384U * (size_t)3U,
10537                                   (size_t)768U * (size_t)3U + (size_t)32U,
10538                                   uint8_t *),
10539       t);
10540   Eurydice_slice expected = Eurydice_array_to_subslice3(
10541       private_key->value, (size_t)768U * (size_t)3U + (size_t)32U,
10542       (size_t)768U * (size_t)3U + (size_t)64U, uint8_t *);
10543   return Eurydice_array_eq_slice((size_t)32U, t, &expected, uint8_t, bool);
10544 }
10545 
10546 /**
10547  Validate an ML-KEM private key.
10548 
10549  This implements the Hash check in 7.3 3.
10550  Note that the size checks in 7.2 1 and 2 are covered by the `SECRET_KEY_SIZE`
10551  and `CIPHERTEXT_SIZE` in the `private_key` and `ciphertext` types.
10552 */
10553 /**
10554 A monomorphic instance of libcrux_ml_kem.ind_cca.validate_private_key
10555 with types libcrux_ml_kem_hash_functions_portable_PortableHash[[$3size_t]]
10556 with const generics
10557 - K= 3
10558 - SECRET_KEY_SIZE= 2400
10559 - CIPHERTEXT_SIZE= 1088
10560 */
libcrux_ml_kem_ind_cca_validate_private_key_37(libcrux_ml_kem_types_MlKemPrivateKey_d9 * private_key,libcrux_ml_kem_mlkem768_MlKem768Ciphertext * _ciphertext)10561 static KRML_MUSTINLINE bool libcrux_ml_kem_ind_cca_validate_private_key_37(
10562     libcrux_ml_kem_types_MlKemPrivateKey_d9 *private_key,
10563     libcrux_ml_kem_mlkem768_MlKem768Ciphertext *_ciphertext) {
10564   return libcrux_ml_kem_ind_cca_validate_private_key_only_d6(private_key);
10565 }
10566 
10567 /**
10568  Private key validation
10569 */
10570 /**
10571 A monomorphic instance of
10572 libcrux_ml_kem.ind_cca.instantiations.portable.validate_private_key with const
10573 generics
10574 - K= 3
10575 - SECRET_KEY_SIZE= 2400
10576 - CIPHERTEXT_SIZE= 1088
10577 */
10578 static KRML_MUSTINLINE bool
libcrux_ml_kem_ind_cca_instantiations_portable_validate_private_key_31(libcrux_ml_kem_types_MlKemPrivateKey_d9 * private_key,libcrux_ml_kem_mlkem768_MlKem768Ciphertext * ciphertext)10579 libcrux_ml_kem_ind_cca_instantiations_portable_validate_private_key_31(
10580     libcrux_ml_kem_types_MlKemPrivateKey_d9 *private_key,
10581     libcrux_ml_kem_mlkem768_MlKem768Ciphertext *ciphertext) {
10582   return libcrux_ml_kem_ind_cca_validate_private_key_37(private_key,
10583                                                         ciphertext);
10584 }
10585 
10586 /**
10587  Validate a private key.
10588 
10589  Returns `true` if valid, and `false` otherwise.
10590 */
libcrux_ml_kem_mlkem768_portable_validate_private_key(libcrux_ml_kem_types_MlKemPrivateKey_d9 * private_key,libcrux_ml_kem_mlkem768_MlKem768Ciphertext * ciphertext)10591 static inline bool libcrux_ml_kem_mlkem768_portable_validate_private_key(
10592     libcrux_ml_kem_types_MlKemPrivateKey_d9 *private_key,
10593     libcrux_ml_kem_mlkem768_MlKem768Ciphertext *ciphertext) {
10594   return libcrux_ml_kem_ind_cca_instantiations_portable_validate_private_key_31(
10595       private_key, ciphertext);
10596 }
10597 
10598 /**
10599  Private key validation
10600 */
10601 /**
10602 A monomorphic instance of
10603 libcrux_ml_kem.ind_cca.instantiations.portable.validate_private_key_only with
10604 const generics
10605 - K= 3
10606 - SECRET_KEY_SIZE= 2400
10607 */
10608 static KRML_MUSTINLINE bool
libcrux_ml_kem_ind_cca_instantiations_portable_validate_private_key_only_41(libcrux_ml_kem_types_MlKemPrivateKey_d9 * private_key)10609 libcrux_ml_kem_ind_cca_instantiations_portable_validate_private_key_only_41(
10610     libcrux_ml_kem_types_MlKemPrivateKey_d9 *private_key) {
10611   return libcrux_ml_kem_ind_cca_validate_private_key_only_d6(private_key);
10612 }
10613 
10614 /**
10615  Validate the private key only.
10616 
10617  Returns `true` if valid, and `false` otherwise.
10618 */
libcrux_ml_kem_mlkem768_portable_validate_private_key_only(libcrux_ml_kem_types_MlKemPrivateKey_d9 * private_key)10619 static inline bool libcrux_ml_kem_mlkem768_portable_validate_private_key_only(
10620     libcrux_ml_kem_types_MlKemPrivateKey_d9 *private_key) {
10621   return libcrux_ml_kem_ind_cca_instantiations_portable_validate_private_key_only_41(
10622       private_key);
10623 }
10624 
10625 /**
10626 This function found in impl {core::ops::function::FnMut<(usize),
10627 libcrux_ml_kem::polynomial::PolynomialRingElement<Vector>[TraitClause@0,
10628 TraitClause@1]> for
10629 libcrux_ml_kem::serialize::deserialize_ring_elements_reduced_out::closure<Vector,
10630 K>[TraitClause@0, TraitClause@1]}
10631 */
10632 /**
10633 A monomorphic instance of
10634 libcrux_ml_kem.serialize.deserialize_ring_elements_reduced_out.call_mut_0b with
10635 types libcrux_ml_kem_vector_portable_vector_type_PortableVector with const
10636 generics
10637 - K= 3
10638 */
10639 static inline libcrux_ml_kem_polynomial_PolynomialRingElement_1d
libcrux_ml_kem_serialize_deserialize_ring_elements_reduced_out_call_mut_0b_1b(void ** _,size_t tupled_args)10640 libcrux_ml_kem_serialize_deserialize_ring_elements_reduced_out_call_mut_0b_1b(
10641     void **_, size_t tupled_args) {
10642   return libcrux_ml_kem_polynomial_ZERO_d6_ea();
10643 }
10644 
10645 /**
10646  This function deserializes ring elements and reduces the result by the field
10647  modulus.
10648 
10649  This function MUST NOT be used on secret inputs.
10650 */
10651 /**
10652 A monomorphic instance of
10653 libcrux_ml_kem.serialize.deserialize_ring_elements_reduced_out with types
10654 libcrux_ml_kem_vector_portable_vector_type_PortableVector with const generics
10655 - K= 3
10656 */
10657 static KRML_MUSTINLINE void
libcrux_ml_kem_serialize_deserialize_ring_elements_reduced_out_1b(Eurydice_slice public_key,libcrux_ml_kem_polynomial_PolynomialRingElement_1d ret[3U])10658 libcrux_ml_kem_serialize_deserialize_ring_elements_reduced_out_1b(
10659     Eurydice_slice public_key,
10660     libcrux_ml_kem_polynomial_PolynomialRingElement_1d ret[3U]) {
10661   libcrux_ml_kem_polynomial_PolynomialRingElement_1d deserialized_pk[3U];
10662   for (size_t i = (size_t)0U; i < (size_t)3U; i++) {
10663     /* original Rust expression is not an lvalue in C */
10664     void *lvalue = (void *)0U;
10665     deserialized_pk[i] =
10666         libcrux_ml_kem_serialize_deserialize_ring_elements_reduced_out_call_mut_0b_1b(
10667             &lvalue, i);
10668   }
10669   libcrux_ml_kem_serialize_deserialize_ring_elements_reduced_1b(
10670       public_key, deserialized_pk);
10671   memcpy(
10672       ret, deserialized_pk,
10673       (size_t)3U * sizeof(libcrux_ml_kem_polynomial_PolynomialRingElement_1d));
10674 }
10675 
10676 /**
10677  Validate an ML-KEM public key.
10678 
10679  This implements the Modulus check in 7.2 2.
10680  Note that the size check in 7.2 1 is covered by the `PUBLIC_KEY_SIZE` in the
10681  `public_key` type.
10682 */
10683 /**
10684 A monomorphic instance of libcrux_ml_kem.ind_cca.validate_public_key
10685 with types libcrux_ml_kem_vector_portable_vector_type_PortableVector
10686 with const generics
10687 - K= 3
10688 - PUBLIC_KEY_SIZE= 1184
10689 */
libcrux_ml_kem_ind_cca_validate_public_key_89(uint8_t * public_key)10690 static KRML_MUSTINLINE bool libcrux_ml_kem_ind_cca_validate_public_key_89(
10691     uint8_t *public_key) {
10692   libcrux_ml_kem_polynomial_PolynomialRingElement_1d deserialized_pk[3U];
10693   libcrux_ml_kem_serialize_deserialize_ring_elements_reduced_out_1b(
10694       Eurydice_array_to_subslice_to(
10695           (size_t)1184U, public_key,
10696           libcrux_ml_kem_constants_ranked_bytes_per_ring_element((size_t)3U),
10697           uint8_t, size_t, uint8_t[]),
10698       deserialized_pk);
10699   libcrux_ml_kem_polynomial_PolynomialRingElement_1d *uu____0 = deserialized_pk;
10700   uint8_t public_key_serialized[1184U];
10701   libcrux_ml_kem_ind_cpa_serialize_public_key_89(
10702       uu____0,
10703       Eurydice_array_to_subslice_from(
10704           (size_t)1184U, public_key,
10705           libcrux_ml_kem_constants_ranked_bytes_per_ring_element((size_t)3U),
10706           uint8_t, size_t, uint8_t[]),
10707       public_key_serialized);
10708   return Eurydice_array_eq((size_t)1184U, public_key, public_key_serialized,
10709                            uint8_t);
10710 }
10711 
10712 /**
10713  Public key validation
10714 */
10715 /**
10716 A monomorphic instance of
10717 libcrux_ml_kem.ind_cca.instantiations.portable.validate_public_key with const
10718 generics
10719 - K= 3
10720 - PUBLIC_KEY_SIZE= 1184
10721 */
10722 static KRML_MUSTINLINE bool
libcrux_ml_kem_ind_cca_instantiations_portable_validate_public_key_41(uint8_t * public_key)10723 libcrux_ml_kem_ind_cca_instantiations_portable_validate_public_key_41(
10724     uint8_t *public_key) {
10725   return libcrux_ml_kem_ind_cca_validate_public_key_89(public_key);
10726 }
10727 
10728 /**
10729  Validate a public key.
10730 
10731  Returns `true` if valid, and `false` otherwise.
10732 */
libcrux_ml_kem_mlkem768_portable_validate_public_key(libcrux_ml_kem_types_MlKemPublicKey_30 * public_key)10733 static inline bool libcrux_ml_kem_mlkem768_portable_validate_public_key(
10734     libcrux_ml_kem_types_MlKemPublicKey_30 *public_key) {
10735   return libcrux_ml_kem_ind_cca_instantiations_portable_validate_public_key_41(
10736       public_key->value);
10737 }
10738 
10739 /**
10740 A monomorphic instance of libcrux_ml_kem.ind_cca.unpacked.MlKemPublicKeyUnpacked
10741 with types libcrux_ml_kem_vector_portable_vector_type_PortableVector
10742 with const generics
10743 - $3size_t
10744 */
10745 typedef struct libcrux_ml_kem_ind_cca_unpacked_MlKemPublicKeyUnpacked_a0_s {
10746   libcrux_ml_kem_ind_cpa_unpacked_IndCpaPublicKeyUnpacked_a0 ind_cpa_public_key;
10747   uint8_t public_key_hash[32U];
10748 } libcrux_ml_kem_ind_cca_unpacked_MlKemPublicKeyUnpacked_a0;
10749 
10750 typedef libcrux_ml_kem_ind_cca_unpacked_MlKemPublicKeyUnpacked_a0
10751     libcrux_ml_kem_mlkem768_portable_unpacked_MlKem768PublicKeyUnpacked;
10752 
10753 /**
10754 A monomorphic instance of
10755 libcrux_ml_kem.ind_cca.unpacked.MlKemPrivateKeyUnpacked with types
10756 libcrux_ml_kem_vector_portable_vector_type_PortableVector with const generics
10757 - $3size_t
10758 */
10759 typedef struct libcrux_ml_kem_ind_cca_unpacked_MlKemPrivateKeyUnpacked_a0_s {
10760   libcrux_ml_kem_ind_cpa_unpacked_IndCpaPrivateKeyUnpacked_a0
10761       ind_cpa_private_key;
10762   uint8_t implicit_rejection_value[32U];
10763 } libcrux_ml_kem_ind_cca_unpacked_MlKemPrivateKeyUnpacked_a0;
10764 
10765 typedef struct
10766     libcrux_ml_kem_mlkem768_portable_unpacked_MlKem768KeyPairUnpacked_s {
10767   libcrux_ml_kem_ind_cca_unpacked_MlKemPrivateKeyUnpacked_a0 private_key;
10768   libcrux_ml_kem_ind_cca_unpacked_MlKemPublicKeyUnpacked_a0 public_key;
10769 } libcrux_ml_kem_mlkem768_portable_unpacked_MlKem768KeyPairUnpacked;
10770 
10771 /**
10772 A monomorphic instance of libcrux_ml_kem.ind_cca.unpacked.decapsulate
10773 with types libcrux_ml_kem_vector_portable_vector_type_PortableVector,
10774 libcrux_ml_kem_hash_functions_portable_PortableHash[[$3size_t]] with const
10775 generics
10776 - K= 3
10777 - SECRET_KEY_SIZE= 2400
10778 - CPA_SECRET_KEY_SIZE= 1152
10779 - PUBLIC_KEY_SIZE= 1184
10780 - CIPHERTEXT_SIZE= 1088
10781 - T_AS_NTT_ENCODED_SIZE= 1152
10782 - C1_SIZE= 960
10783 - C2_SIZE= 128
10784 - VECTOR_U_COMPRESSION_FACTOR= 10
10785 - VECTOR_V_COMPRESSION_FACTOR= 4
10786 - C1_BLOCK_SIZE= 320
10787 - ETA1= 2
10788 - ETA1_RANDOMNESS_SIZE= 128
10789 - ETA2= 2
10790 - ETA2_RANDOMNESS_SIZE= 128
10791 - IMPLICIT_REJECTION_HASH_INPUT_SIZE= 1120
10792 */
libcrux_ml_kem_ind_cca_unpacked_decapsulate_51(libcrux_ml_kem_mlkem768_portable_unpacked_MlKem768KeyPairUnpacked * key_pair,libcrux_ml_kem_mlkem768_MlKem768Ciphertext * ciphertext,uint8_t ret[32U])10793 static KRML_MUSTINLINE void libcrux_ml_kem_ind_cca_unpacked_decapsulate_51(
10794     libcrux_ml_kem_mlkem768_portable_unpacked_MlKem768KeyPairUnpacked *key_pair,
10795     libcrux_ml_kem_mlkem768_MlKem768Ciphertext *ciphertext, uint8_t ret[32U]) {
10796   uint8_t decrypted[32U];
10797   libcrux_ml_kem_ind_cpa_decrypt_unpacked_42(
10798       &key_pair->private_key.ind_cpa_private_key, ciphertext->value, decrypted);
10799   uint8_t to_hash0[64U];
10800   libcrux_ml_kem_utils_into_padded_array_24(
10801       Eurydice_array_to_slice((size_t)32U, decrypted, uint8_t), to_hash0);
10802   Eurydice_slice uu____0 = Eurydice_array_to_subslice_from(
10803       (size_t)64U, to_hash0, LIBCRUX_ML_KEM_CONSTANTS_SHARED_SECRET_SIZE,
10804       uint8_t, size_t, uint8_t[]);
10805   Eurydice_slice_copy(
10806       uu____0,
10807       Eurydice_array_to_slice((size_t)32U, key_pair->public_key.public_key_hash,
10808                               uint8_t),
10809       uint8_t);
10810   uint8_t hashed[64U];
10811   libcrux_ml_kem_hash_functions_portable_G_4a_e0(
10812       Eurydice_array_to_slice((size_t)64U, to_hash0, uint8_t), hashed);
10813   Eurydice_slice_uint8_t_x2 uu____1 = Eurydice_slice_split_at(
10814       Eurydice_array_to_slice((size_t)64U, hashed, uint8_t),
10815       LIBCRUX_ML_KEM_CONSTANTS_SHARED_SECRET_SIZE, uint8_t,
10816       Eurydice_slice_uint8_t_x2);
10817   Eurydice_slice shared_secret = uu____1.fst;
10818   Eurydice_slice pseudorandomness = uu____1.snd;
10819   uint8_t to_hash[1120U];
10820   libcrux_ml_kem_utils_into_padded_array_15(
10821       Eurydice_array_to_slice(
10822           (size_t)32U, key_pair->private_key.implicit_rejection_value, uint8_t),
10823       to_hash);
10824   Eurydice_slice uu____2 = Eurydice_array_to_subslice_from(
10825       (size_t)1120U, to_hash, LIBCRUX_ML_KEM_CONSTANTS_SHARED_SECRET_SIZE,
10826       uint8_t, size_t, uint8_t[]);
10827   Eurydice_slice_copy(uu____2, libcrux_ml_kem_types_as_ref_d3_80(ciphertext),
10828                       uint8_t);
10829   uint8_t implicit_rejection_shared_secret[32U];
10830   libcrux_ml_kem_hash_functions_portable_PRF_4a_41(
10831       Eurydice_array_to_slice((size_t)1120U, to_hash, uint8_t),
10832       implicit_rejection_shared_secret);
10833   uint8_t expected_ciphertext[1088U];
10834   libcrux_ml_kem_ind_cpa_encrypt_unpacked_2a(
10835       &key_pair->public_key.ind_cpa_public_key, decrypted, pseudorandomness,
10836       expected_ciphertext);
10837   uint8_t selector =
10838       libcrux_ml_kem_constant_time_ops_compare_ciphertexts_in_constant_time(
10839           libcrux_ml_kem_types_as_ref_d3_80(ciphertext),
10840           Eurydice_array_to_slice((size_t)1088U, expected_ciphertext, uint8_t));
10841   uint8_t ret0[32U];
10842   libcrux_ml_kem_constant_time_ops_select_shared_secret_in_constant_time(
10843       shared_secret,
10844       Eurydice_array_to_slice((size_t)32U, implicit_rejection_shared_secret,
10845                               uint8_t),
10846       selector, ret0);
10847   memcpy(ret, ret0, (size_t)32U * sizeof(uint8_t));
10848 }
10849 
10850 /**
10851  Unpacked decapsulate
10852 */
10853 /**
10854 A monomorphic instance of
10855 libcrux_ml_kem.ind_cca.instantiations.portable.unpacked.decapsulate with const
10856 generics
10857 - K= 3
10858 - SECRET_KEY_SIZE= 2400
10859 - CPA_SECRET_KEY_SIZE= 1152
10860 - PUBLIC_KEY_SIZE= 1184
10861 - CIPHERTEXT_SIZE= 1088
10862 - T_AS_NTT_ENCODED_SIZE= 1152
10863 - C1_SIZE= 960
10864 - C2_SIZE= 128
10865 - VECTOR_U_COMPRESSION_FACTOR= 10
10866 - VECTOR_V_COMPRESSION_FACTOR= 4
10867 - C1_BLOCK_SIZE= 320
10868 - ETA1= 2
10869 - ETA1_RANDOMNESS_SIZE= 128
10870 - ETA2= 2
10871 - ETA2_RANDOMNESS_SIZE= 128
10872 - IMPLICIT_REJECTION_HASH_INPUT_SIZE= 1120
10873 */
10874 static KRML_MUSTINLINE void
libcrux_ml_kem_ind_cca_instantiations_portable_unpacked_decapsulate_35(libcrux_ml_kem_mlkem768_portable_unpacked_MlKem768KeyPairUnpacked * key_pair,libcrux_ml_kem_mlkem768_MlKem768Ciphertext * ciphertext,uint8_t ret[32U])10875 libcrux_ml_kem_ind_cca_instantiations_portable_unpacked_decapsulate_35(
10876     libcrux_ml_kem_mlkem768_portable_unpacked_MlKem768KeyPairUnpacked *key_pair,
10877     libcrux_ml_kem_mlkem768_MlKem768Ciphertext *ciphertext, uint8_t ret[32U]) {
10878   libcrux_ml_kem_ind_cca_unpacked_decapsulate_51(key_pair, ciphertext, ret);
10879 }
10880 
10881 /**
10882  Decapsulate ML-KEM 768 (unpacked)
10883 
10884  Generates an [`MlKemSharedSecret`].
10885  The input is a reference to an unpacked key pair of type
10886  [`MlKem768KeyPairUnpacked`] and an [`MlKem768Ciphertext`].
10887 */
libcrux_ml_kem_mlkem768_portable_unpacked_decapsulate(libcrux_ml_kem_mlkem768_portable_unpacked_MlKem768KeyPairUnpacked * private_key,libcrux_ml_kem_mlkem768_MlKem768Ciphertext * ciphertext,uint8_t ret[32U])10888 static inline void libcrux_ml_kem_mlkem768_portable_unpacked_decapsulate(
10889     libcrux_ml_kem_mlkem768_portable_unpacked_MlKem768KeyPairUnpacked
10890         *private_key,
10891     libcrux_ml_kem_mlkem768_MlKem768Ciphertext *ciphertext, uint8_t ret[32U]) {
10892   libcrux_ml_kem_ind_cca_instantiations_portable_unpacked_decapsulate_35(
10893       private_key, ciphertext, ret);
10894 }
10895 
10896 /**
10897 A monomorphic instance of libcrux_ml_kem.ind_cca.unpacked.encaps_prepare
10898 with types libcrux_ml_kem_hash_functions_portable_PortableHash[[$3size_t]]
10899 with const generics
10900 - K= 3
10901 */
libcrux_ml_kem_ind_cca_unpacked_encaps_prepare_9c(Eurydice_slice randomness,Eurydice_slice pk_hash,uint8_t ret[64U])10902 static inline void libcrux_ml_kem_ind_cca_unpacked_encaps_prepare_9c(
10903     Eurydice_slice randomness, Eurydice_slice pk_hash, uint8_t ret[64U]) {
10904   uint8_t to_hash[64U];
10905   libcrux_ml_kem_utils_into_padded_array_24(randomness, to_hash);
10906   Eurydice_slice_copy(
10907       Eurydice_array_to_subslice_from((size_t)64U, to_hash,
10908                                       LIBCRUX_ML_KEM_CONSTANTS_H_DIGEST_SIZE,
10909                                       uint8_t, size_t, uint8_t[]),
10910       pk_hash, uint8_t);
10911   uint8_t ret0[64U];
10912   libcrux_ml_kem_hash_functions_portable_G_4a_e0(
10913       Eurydice_array_to_slice((size_t)64U, to_hash, uint8_t), ret0);
10914   memcpy(ret, ret0, (size_t)64U * sizeof(uint8_t));
10915 }
10916 
10917 /**
10918 A monomorphic instance of libcrux_ml_kem.ind_cca.unpacked.encapsulate
10919 with types libcrux_ml_kem_vector_portable_vector_type_PortableVector,
10920 libcrux_ml_kem_hash_functions_portable_PortableHash[[$3size_t]] with const
10921 generics
10922 - K= 3
10923 - CIPHERTEXT_SIZE= 1088
10924 - PUBLIC_KEY_SIZE= 1184
10925 - T_AS_NTT_ENCODED_SIZE= 1152
10926 - C1_SIZE= 960
10927 - C2_SIZE= 128
10928 - VECTOR_U_COMPRESSION_FACTOR= 10
10929 - VECTOR_V_COMPRESSION_FACTOR= 4
10930 - VECTOR_U_BLOCK_LEN= 320
10931 - ETA1= 2
10932 - ETA1_RANDOMNESS_SIZE= 128
10933 - ETA2= 2
10934 - ETA2_RANDOMNESS_SIZE= 128
10935 */
libcrux_ml_kem_ind_cca_unpacked_encapsulate_0c(libcrux_ml_kem_ind_cca_unpacked_MlKemPublicKeyUnpacked_a0 * public_key,uint8_t * randomness)10936 static KRML_MUSTINLINE tuple_c2 libcrux_ml_kem_ind_cca_unpacked_encapsulate_0c(
10937     libcrux_ml_kem_ind_cca_unpacked_MlKemPublicKeyUnpacked_a0 *public_key,
10938     uint8_t *randomness) {
10939   uint8_t hashed[64U];
10940   libcrux_ml_kem_ind_cca_unpacked_encaps_prepare_9c(
10941       Eurydice_array_to_slice((size_t)32U, randomness, uint8_t),
10942       Eurydice_array_to_slice((size_t)32U, public_key->public_key_hash,
10943                               uint8_t),
10944       hashed);
10945   Eurydice_slice_uint8_t_x2 uu____0 = Eurydice_slice_split_at(
10946       Eurydice_array_to_slice((size_t)64U, hashed, uint8_t),
10947       LIBCRUX_ML_KEM_CONSTANTS_SHARED_SECRET_SIZE, uint8_t,
10948       Eurydice_slice_uint8_t_x2);
10949   Eurydice_slice shared_secret = uu____0.fst;
10950   Eurydice_slice pseudorandomness = uu____0.snd;
10951   uint8_t ciphertext[1088U];
10952   libcrux_ml_kem_ind_cpa_encrypt_unpacked_2a(&public_key->ind_cpa_public_key,
10953                                              randomness, pseudorandomness,
10954                                              ciphertext);
10955   uint8_t shared_secret_array[32U] = {0U};
10956   Eurydice_slice_copy(
10957       Eurydice_array_to_slice((size_t)32U, shared_secret_array, uint8_t),
10958       shared_secret, uint8_t);
10959   /* Passing arrays by value in Rust generates a copy in C */
10960   uint8_t copy_of_ciphertext[1088U];
10961   memcpy(copy_of_ciphertext, ciphertext, (size_t)1088U * sizeof(uint8_t));
10962   libcrux_ml_kem_mlkem768_MlKem768Ciphertext uu____2 =
10963       libcrux_ml_kem_types_from_e0_80(copy_of_ciphertext);
10964   /* Passing arrays by value in Rust generates a copy in C */
10965   uint8_t copy_of_shared_secret_array[32U];
10966   memcpy(copy_of_shared_secret_array, shared_secret_array,
10967          (size_t)32U * sizeof(uint8_t));
10968   tuple_c2 lit;
10969   lit.fst = uu____2;
10970   memcpy(lit.snd, copy_of_shared_secret_array, (size_t)32U * sizeof(uint8_t));
10971   return lit;
10972 }
10973 
10974 /**
10975  Unpacked encapsulate
10976 */
10977 /**
10978 A monomorphic instance of
10979 libcrux_ml_kem.ind_cca.instantiations.portable.unpacked.encapsulate with const
10980 generics
10981 - K= 3
10982 - CIPHERTEXT_SIZE= 1088
10983 - PUBLIC_KEY_SIZE= 1184
10984 - T_AS_NTT_ENCODED_SIZE= 1152
10985 - C1_SIZE= 960
10986 - C2_SIZE= 128
10987 - VECTOR_U_COMPRESSION_FACTOR= 10
10988 - VECTOR_V_COMPRESSION_FACTOR= 4
10989 - VECTOR_U_BLOCK_LEN= 320
10990 - ETA1= 2
10991 - ETA1_RANDOMNESS_SIZE= 128
10992 - ETA2= 2
10993 - ETA2_RANDOMNESS_SIZE= 128
10994 */
10995 static KRML_MUSTINLINE tuple_c2
libcrux_ml_kem_ind_cca_instantiations_portable_unpacked_encapsulate_cd(libcrux_ml_kem_ind_cca_unpacked_MlKemPublicKeyUnpacked_a0 * public_key,uint8_t * randomness)10996 libcrux_ml_kem_ind_cca_instantiations_portable_unpacked_encapsulate_cd(
10997     libcrux_ml_kem_ind_cca_unpacked_MlKemPublicKeyUnpacked_a0 *public_key,
10998     uint8_t *randomness) {
10999   return libcrux_ml_kem_ind_cca_unpacked_encapsulate_0c(public_key, randomness);
11000 }
11001 
11002 /**
11003  Encapsulate ML-KEM 768 (unpacked)
11004 
11005  Generates an ([`MlKem768Ciphertext`], [`MlKemSharedSecret`]) tuple.
11006  The input is a reference to an unpacked public key of type
11007  [`MlKem768PublicKeyUnpacked`], the SHA3-256 hash of this public key, and
11008  [`SHARED_SECRET_SIZE`] bytes of `randomness`.
11009 */
libcrux_ml_kem_mlkem768_portable_unpacked_encapsulate(libcrux_ml_kem_ind_cca_unpacked_MlKemPublicKeyUnpacked_a0 * public_key,uint8_t randomness[32U])11010 static inline tuple_c2 libcrux_ml_kem_mlkem768_portable_unpacked_encapsulate(
11011     libcrux_ml_kem_ind_cca_unpacked_MlKemPublicKeyUnpacked_a0 *public_key,
11012     uint8_t randomness[32U]) {
11013   return libcrux_ml_kem_ind_cca_instantiations_portable_unpacked_encapsulate_cd(
11014       public_key, randomness);
11015 }
11016 
11017 /**
11018 This function found in impl {core::ops::function::FnMut<(usize),
11019 libcrux_ml_kem::polynomial::PolynomialRingElement<Vector>[TraitClause@0,
11020 TraitClause@1]> for
11021 libcrux_ml_kem::ind_cca::unpacked::transpose_a::closure::closure<Vector,
11022 K>[TraitClause@0, TraitClause@1]}
11023 */
11024 /**
11025 A monomorphic instance of
11026 libcrux_ml_kem.ind_cca.unpacked.transpose_a.closure.call_mut_b4 with types
11027 libcrux_ml_kem_vector_portable_vector_type_PortableVector with const generics
11028 - K= 3
11029 */
11030 static inline libcrux_ml_kem_polynomial_PolynomialRingElement_1d
libcrux_ml_kem_ind_cca_unpacked_transpose_a_closure_call_mut_b4_1b(void ** _,size_t tupled_args)11031 libcrux_ml_kem_ind_cca_unpacked_transpose_a_closure_call_mut_b4_1b(
11032     void **_, size_t tupled_args) {
11033   return libcrux_ml_kem_polynomial_ZERO_d6_ea();
11034 }
11035 
11036 /**
11037 This function found in impl {core::ops::function::FnMut<(usize),
11038 @Array<libcrux_ml_kem::polynomial::PolynomialRingElement<Vector>[TraitClause@0,
11039 TraitClause@1], K>> for
11040 libcrux_ml_kem::ind_cca::unpacked::transpose_a::closure<Vector,
11041 K>[TraitClause@0, TraitClause@1]}
11042 */
11043 /**
11044 A monomorphic instance of
11045 libcrux_ml_kem.ind_cca.unpacked.transpose_a.call_mut_7b with types
11046 libcrux_ml_kem_vector_portable_vector_type_PortableVector with const generics
11047 - K= 3
11048 */
libcrux_ml_kem_ind_cca_unpacked_transpose_a_call_mut_7b_1b(void ** _,size_t tupled_args,libcrux_ml_kem_polynomial_PolynomialRingElement_1d ret[3U])11049 static inline void libcrux_ml_kem_ind_cca_unpacked_transpose_a_call_mut_7b_1b(
11050     void **_, size_t tupled_args,
11051     libcrux_ml_kem_polynomial_PolynomialRingElement_1d ret[3U]) {
11052   for (size_t i = (size_t)0U; i < (size_t)3U; i++) {
11053     /* original Rust expression is not an lvalue in C */
11054     void *lvalue = (void *)0U;
11055     ret[i] = libcrux_ml_kem_ind_cca_unpacked_transpose_a_closure_call_mut_b4_1b(
11056         &lvalue, i);
11057   }
11058 }
11059 
11060 /**
11061 This function found in impl {core::clone::Clone for
11062 libcrux_ml_kem::polynomial::PolynomialRingElement<Vector>[TraitClause@0,
11063 TraitClause@2]}
11064 */
11065 /**
11066 A monomorphic instance of libcrux_ml_kem.polynomial.clone_c1
11067 with types libcrux_ml_kem_vector_portable_vector_type_PortableVector
11068 with const generics
11069 
11070 */
11071 static inline libcrux_ml_kem_polynomial_PolynomialRingElement_1d
libcrux_ml_kem_polynomial_clone_c1_ea(libcrux_ml_kem_polynomial_PolynomialRingElement_1d * self)11072 libcrux_ml_kem_polynomial_clone_c1_ea(
11073     libcrux_ml_kem_polynomial_PolynomialRingElement_1d *self) {
11074   libcrux_ml_kem_polynomial_PolynomialRingElement_1d lit;
11075   libcrux_ml_kem_vector_portable_vector_type_PortableVector ret[16U];
11076   core_array__core__clone__Clone_for__Array_T__N___clone(
11077       (size_t)16U, self->coefficients, ret,
11078       libcrux_ml_kem_vector_portable_vector_type_PortableVector, void *);
11079   memcpy(lit.coefficients, ret,
11080          (size_t)16U *
11081              sizeof(libcrux_ml_kem_vector_portable_vector_type_PortableVector));
11082   return lit;
11083 }
11084 
11085 /**
11086 A monomorphic instance of libcrux_ml_kem.ind_cca.unpacked.transpose_a
11087 with types libcrux_ml_kem_vector_portable_vector_type_PortableVector
11088 with const generics
11089 - K= 3
11090 */
libcrux_ml_kem_ind_cca_unpacked_transpose_a_1b(libcrux_ml_kem_polynomial_PolynomialRingElement_1d ind_cpa_a[3U][3U],libcrux_ml_kem_polynomial_PolynomialRingElement_1d ret[3U][3U])11091 static inline void libcrux_ml_kem_ind_cca_unpacked_transpose_a_1b(
11092     libcrux_ml_kem_polynomial_PolynomialRingElement_1d ind_cpa_a[3U][3U],
11093     libcrux_ml_kem_polynomial_PolynomialRingElement_1d ret[3U][3U]) {
11094   libcrux_ml_kem_polynomial_PolynomialRingElement_1d A[3U][3U];
11095   for (size_t i = (size_t)0U; i < (size_t)3U; i++) {
11096     /* original Rust expression is not an lvalue in C */
11097     void *lvalue = (void *)0U;
11098     libcrux_ml_kem_ind_cca_unpacked_transpose_a_call_mut_7b_1b(&lvalue, i,
11099                                                                A[i]);
11100   }
11101   for (size_t i = (size_t)0U; i < (size_t)3U; i++) {
11102     size_t i0 = i;
11103     libcrux_ml_kem_polynomial_PolynomialRingElement_1d _a_i[3U][3U];
11104     memcpy(_a_i, A,
11105            (size_t)3U *
11106                sizeof(libcrux_ml_kem_polynomial_PolynomialRingElement_1d[3U]));
11107     for (size_t i1 = (size_t)0U; i1 < (size_t)3U; i1++) {
11108       size_t j = i1;
11109       libcrux_ml_kem_polynomial_PolynomialRingElement_1d uu____0 =
11110           libcrux_ml_kem_polynomial_clone_c1_ea(&ind_cpa_a[j][i0]);
11111       A[i0][j] = uu____0;
11112     }
11113   }
11114   memcpy(ret, A,
11115          (size_t)3U *
11116              sizeof(libcrux_ml_kem_polynomial_PolynomialRingElement_1d[3U]));
11117 }
11118 
11119 /**
11120  Generate Unpacked Keys
11121 */
11122 /**
11123 A monomorphic instance of libcrux_ml_kem.ind_cca.unpacked.generate_keypair
11124 with types libcrux_ml_kem_vector_portable_vector_type_PortableVector,
11125 libcrux_ml_kem_hash_functions_portable_PortableHash[[$3size_t]],
11126 libcrux_ml_kem_variant_MlKem with const generics
11127 - K= 3
11128 - CPA_PRIVATE_KEY_SIZE= 1152
11129 - PRIVATE_KEY_SIZE= 2400
11130 - PUBLIC_KEY_SIZE= 1184
11131 - ETA1= 2
11132 - ETA1_RANDOMNESS_SIZE= 128
11133 */
libcrux_ml_kem_ind_cca_unpacked_generate_keypair_15(uint8_t randomness[64U],libcrux_ml_kem_mlkem768_portable_unpacked_MlKem768KeyPairUnpacked * out)11134 static KRML_MUSTINLINE void libcrux_ml_kem_ind_cca_unpacked_generate_keypair_15(
11135     uint8_t randomness[64U],
11136     libcrux_ml_kem_mlkem768_portable_unpacked_MlKem768KeyPairUnpacked *out) {
11137   Eurydice_slice ind_cpa_keypair_randomness = Eurydice_array_to_subslice3(
11138       randomness, (size_t)0U,
11139       LIBCRUX_ML_KEM_CONSTANTS_CPA_PKE_KEY_GENERATION_SEED_SIZE, uint8_t *);
11140   Eurydice_slice implicit_rejection_value = Eurydice_array_to_subslice_from(
11141       (size_t)64U, randomness,
11142       LIBCRUX_ML_KEM_CONSTANTS_CPA_PKE_KEY_GENERATION_SEED_SIZE, uint8_t,
11143       size_t, uint8_t[]);
11144   libcrux_ml_kem_ind_cpa_generate_keypair_unpacked_1c(
11145       ind_cpa_keypair_randomness, &out->private_key.ind_cpa_private_key,
11146       &out->public_key.ind_cpa_public_key);
11147   libcrux_ml_kem_polynomial_PolynomialRingElement_1d uu____0[3U][3U];
11148   memcpy(uu____0, out->public_key.ind_cpa_public_key.A,
11149          (size_t)3U *
11150              sizeof(libcrux_ml_kem_polynomial_PolynomialRingElement_1d[3U]));
11151   libcrux_ml_kem_polynomial_PolynomialRingElement_1d A[3U][3U];
11152   libcrux_ml_kem_ind_cca_unpacked_transpose_a_1b(uu____0, A);
11153   libcrux_ml_kem_polynomial_PolynomialRingElement_1d uu____1[3U][3U];
11154   memcpy(uu____1, A,
11155          (size_t)3U *
11156              sizeof(libcrux_ml_kem_polynomial_PolynomialRingElement_1d[3U]));
11157   memcpy(out->public_key.ind_cpa_public_key.A, uu____1,
11158          (size_t)3U *
11159              sizeof(libcrux_ml_kem_polynomial_PolynomialRingElement_1d[3U]));
11160   uint8_t pk_serialized[1184U];
11161   libcrux_ml_kem_ind_cpa_serialize_public_key_89(
11162       out->public_key.ind_cpa_public_key.t_as_ntt,
11163       Eurydice_array_to_slice(
11164           (size_t)32U, out->public_key.ind_cpa_public_key.seed_for_A, uint8_t),
11165       pk_serialized);
11166   uint8_t uu____2[32U];
11167   libcrux_ml_kem_hash_functions_portable_H_4a_e0(
11168       Eurydice_array_to_slice((size_t)1184U, pk_serialized, uint8_t), uu____2);
11169   memcpy(out->public_key.public_key_hash, uu____2,
11170          (size_t)32U * sizeof(uint8_t));
11171   uint8_t uu____3[32U];
11172   Result_fb dst;
11173   Eurydice_slice_to_array2(&dst, implicit_rejection_value, Eurydice_slice,
11174                            uint8_t[32U], TryFromSliceError);
11175   unwrap_26_b3(dst, uu____3);
11176   memcpy(out->private_key.implicit_rejection_value, uu____3,
11177          (size_t)32U * sizeof(uint8_t));
11178 }
11179 
11180 /**
11181  Generate a key pair
11182 */
11183 /**
11184 A monomorphic instance of
11185 libcrux_ml_kem.ind_cca.instantiations.portable.unpacked.generate_keypair with
11186 const generics
11187 - K= 3
11188 - CPA_PRIVATE_KEY_SIZE= 1152
11189 - PRIVATE_KEY_SIZE= 2400
11190 - PUBLIC_KEY_SIZE= 1184
11191 - ETA1= 2
11192 - ETA1_RANDOMNESS_SIZE= 128
11193 */
11194 static KRML_MUSTINLINE void
libcrux_ml_kem_ind_cca_instantiations_portable_unpacked_generate_keypair_ce(uint8_t randomness[64U],libcrux_ml_kem_mlkem768_portable_unpacked_MlKem768KeyPairUnpacked * out)11195 libcrux_ml_kem_ind_cca_instantiations_portable_unpacked_generate_keypair_ce(
11196     uint8_t randomness[64U],
11197     libcrux_ml_kem_mlkem768_portable_unpacked_MlKem768KeyPairUnpacked *out) {
11198   /* Passing arrays by value in Rust generates a copy in C */
11199   uint8_t copy_of_randomness[64U];
11200   memcpy(copy_of_randomness, randomness, (size_t)64U * sizeof(uint8_t));
11201   libcrux_ml_kem_ind_cca_unpacked_generate_keypair_15(copy_of_randomness, out);
11202 }
11203 
11204 /**
11205  Generate ML-KEM 768 Key Pair in "unpacked" form.
11206 */
11207 static inline void
libcrux_ml_kem_mlkem768_portable_unpacked_generate_key_pair_mut(uint8_t randomness[64U],libcrux_ml_kem_mlkem768_portable_unpacked_MlKem768KeyPairUnpacked * key_pair)11208 libcrux_ml_kem_mlkem768_portable_unpacked_generate_key_pair_mut(
11209     uint8_t randomness[64U],
11210     libcrux_ml_kem_mlkem768_portable_unpacked_MlKem768KeyPairUnpacked
11211         *key_pair) {
11212   /* Passing arrays by value in Rust generates a copy in C */
11213   uint8_t copy_of_randomness[64U];
11214   memcpy(copy_of_randomness, randomness, (size_t)64U * sizeof(uint8_t));
11215   libcrux_ml_kem_ind_cca_instantiations_portable_unpacked_generate_keypair_ce(
11216       copy_of_randomness, key_pair);
11217 }
11218 
11219 /**
11220 This function found in impl {core::default::Default for
11221 libcrux_ml_kem::ind_cca::unpacked::MlKemPublicKeyUnpacked<Vector,
11222 K>[TraitClause@0, TraitClause@1]}
11223 */
11224 /**
11225 A monomorphic instance of libcrux_ml_kem.ind_cca.unpacked.default_30
11226 with types libcrux_ml_kem_vector_portable_vector_type_PortableVector
11227 with const generics
11228 - K= 3
11229 */
11230 static KRML_MUSTINLINE libcrux_ml_kem_ind_cca_unpacked_MlKemPublicKeyUnpacked_a0
libcrux_ml_kem_ind_cca_unpacked_default_30_1b(void)11231 libcrux_ml_kem_ind_cca_unpacked_default_30_1b(void) {
11232   return (
11233       KRML_CLITERAL(libcrux_ml_kem_ind_cca_unpacked_MlKemPublicKeyUnpacked_a0){
11234           .ind_cpa_public_key = libcrux_ml_kem_ind_cpa_unpacked_default_8b_1b(),
11235           .public_key_hash = {0U}});
11236 }
11237 
11238 /**
11239 This function found in impl {core::default::Default for
11240 libcrux_ml_kem::ind_cca::unpacked::MlKemKeyPairUnpacked<Vector,
11241 K>[TraitClause@0, TraitClause@1]}
11242 */
11243 /**
11244 A monomorphic instance of libcrux_ml_kem.ind_cca.unpacked.default_7b
11245 with types libcrux_ml_kem_vector_portable_vector_type_PortableVector
11246 with const generics
11247 - K= 3
11248 */
11249 static KRML_MUSTINLINE
11250     libcrux_ml_kem_mlkem768_portable_unpacked_MlKem768KeyPairUnpacked
libcrux_ml_kem_ind_cca_unpacked_default_7b_1b(void)11251     libcrux_ml_kem_ind_cca_unpacked_default_7b_1b(void) {
11252   libcrux_ml_kem_ind_cca_unpacked_MlKemPrivateKeyUnpacked_a0 uu____0 = {
11253       .ind_cpa_private_key = libcrux_ml_kem_ind_cpa_unpacked_default_70_1b(),
11254       .implicit_rejection_value = {0U}};
11255   return (KRML_CLITERAL(
11256       libcrux_ml_kem_mlkem768_portable_unpacked_MlKem768KeyPairUnpacked){
11257       .private_key = uu____0,
11258       .public_key = libcrux_ml_kem_ind_cca_unpacked_default_30_1b()});
11259 }
11260 
11261 /**
11262  Generate ML-KEM 768 Key Pair in "unpacked" form.
11263 */
11264 static inline libcrux_ml_kem_mlkem768_portable_unpacked_MlKem768KeyPairUnpacked
libcrux_ml_kem_mlkem768_portable_unpacked_generate_key_pair(uint8_t randomness[64U])11265 libcrux_ml_kem_mlkem768_portable_unpacked_generate_key_pair(
11266     uint8_t randomness[64U]) {
11267   libcrux_ml_kem_mlkem768_portable_unpacked_MlKem768KeyPairUnpacked key_pair =
11268       libcrux_ml_kem_ind_cca_unpacked_default_7b_1b();
11269   uint8_t uu____0[64U];
11270   memcpy(uu____0, randomness, (size_t)64U * sizeof(uint8_t));
11271   libcrux_ml_kem_mlkem768_portable_unpacked_generate_key_pair_mut(uu____0,
11272                                                                   &key_pair);
11273   return key_pair;
11274 }
11275 
11276 /**
11277  Create a new, empty unpacked key.
11278 */
11279 static inline libcrux_ml_kem_mlkem768_portable_unpacked_MlKem768KeyPairUnpacked
libcrux_ml_kem_mlkem768_portable_unpacked_init_key_pair(void)11280 libcrux_ml_kem_mlkem768_portable_unpacked_init_key_pair(void) {
11281   return libcrux_ml_kem_ind_cca_unpacked_default_7b_1b();
11282 }
11283 
11284 /**
11285  Create a new, empty unpacked public key.
11286 */
11287 static inline libcrux_ml_kem_ind_cca_unpacked_MlKemPublicKeyUnpacked_a0
libcrux_ml_kem_mlkem768_portable_unpacked_init_public_key(void)11288 libcrux_ml_kem_mlkem768_portable_unpacked_init_public_key(void) {
11289   return libcrux_ml_kem_ind_cca_unpacked_default_30_1b();
11290 }
11291 
11292 /**
11293  Take a serialized private key and generate an unpacked key pair from it.
11294 */
11295 /**
11296 A monomorphic instance of libcrux_ml_kem.ind_cca.unpacked.keys_from_private_key
11297 with types libcrux_ml_kem_vector_portable_vector_type_PortableVector
11298 with const generics
11299 - K= 3
11300 - SECRET_KEY_SIZE= 2400
11301 - CPA_SECRET_KEY_SIZE= 1152
11302 - PUBLIC_KEY_SIZE= 1184
11303 - T_AS_NTT_ENCODED_SIZE= 1152
11304 */
11305 static KRML_MUSTINLINE void
libcrux_ml_kem_ind_cca_unpacked_keys_from_private_key_42(libcrux_ml_kem_types_MlKemPrivateKey_d9 * private_key,libcrux_ml_kem_mlkem768_portable_unpacked_MlKem768KeyPairUnpacked * key_pair)11306 libcrux_ml_kem_ind_cca_unpacked_keys_from_private_key_42(
11307     libcrux_ml_kem_types_MlKemPrivateKey_d9 *private_key,
11308     libcrux_ml_kem_mlkem768_portable_unpacked_MlKem768KeyPairUnpacked
11309         *key_pair) {
11310   Eurydice_slice_uint8_t_x4 uu____0 =
11311       libcrux_ml_kem_types_unpack_private_key_b4(
11312           Eurydice_array_to_slice((size_t)2400U, private_key->value, uint8_t));
11313   Eurydice_slice ind_cpa_secret_key = uu____0.fst;
11314   Eurydice_slice ind_cpa_public_key = uu____0.snd;
11315   Eurydice_slice ind_cpa_public_key_hash = uu____0.thd;
11316   Eurydice_slice implicit_rejection_value = uu____0.f3;
11317   libcrux_ml_kem_ind_cpa_deserialize_vector_1b(
11318       ind_cpa_secret_key,
11319       key_pair->private_key.ind_cpa_private_key.secret_as_ntt);
11320   libcrux_ml_kem_ind_cpa_build_unpacked_public_key_mut_3f(
11321       ind_cpa_public_key, &key_pair->public_key.ind_cpa_public_key);
11322   Eurydice_slice_copy(
11323       Eurydice_array_to_slice((size_t)32U, key_pair->public_key.public_key_hash,
11324                               uint8_t),
11325       ind_cpa_public_key_hash, uint8_t);
11326   Eurydice_slice_copy(
11327       Eurydice_array_to_slice(
11328           (size_t)32U, key_pair->private_key.implicit_rejection_value, uint8_t),
11329       implicit_rejection_value, uint8_t);
11330   Eurydice_slice_copy(
11331       Eurydice_array_to_slice(
11332           (size_t)32U, key_pair->public_key.ind_cpa_public_key.seed_for_A,
11333           uint8_t),
11334       Eurydice_slice_subslice_from(ind_cpa_public_key, (size_t)1152U, uint8_t,
11335                                    size_t, uint8_t[]),
11336       uint8_t);
11337 }
11338 
11339 /**
11340  Take a serialized private key and generate an unpacked key pair from it.
11341 */
11342 /**
11343 A monomorphic instance of
11344 libcrux_ml_kem.ind_cca.instantiations.portable.unpacked.keypair_from_private_key
11345 with const generics
11346 - K= 3
11347 - SECRET_KEY_SIZE= 2400
11348 - CPA_SECRET_KEY_SIZE= 1152
11349 - PUBLIC_KEY_SIZE= 1184
11350 - T_AS_NTT_ENCODED_SIZE= 1152
11351 */
11352 static KRML_MUSTINLINE void
libcrux_ml_kem_ind_cca_instantiations_portable_unpacked_keypair_from_private_key_fd(libcrux_ml_kem_types_MlKemPrivateKey_d9 * private_key,libcrux_ml_kem_mlkem768_portable_unpacked_MlKem768KeyPairUnpacked * key_pair)11353 libcrux_ml_kem_ind_cca_instantiations_portable_unpacked_keypair_from_private_key_fd(
11354     libcrux_ml_kem_types_MlKemPrivateKey_d9 *private_key,
11355     libcrux_ml_kem_mlkem768_portable_unpacked_MlKem768KeyPairUnpacked
11356         *key_pair) {
11357   libcrux_ml_kem_ind_cca_unpacked_keys_from_private_key_42(private_key,
11358                                                            key_pair);
11359 }
11360 
11361 /**
11362  Get an unpacked key from a private key.
11363 */
11364 static inline void
libcrux_ml_kem_mlkem768_portable_unpacked_key_pair_from_private_mut(libcrux_ml_kem_types_MlKemPrivateKey_d9 * private_key,libcrux_ml_kem_mlkem768_portable_unpacked_MlKem768KeyPairUnpacked * key_pair)11365 libcrux_ml_kem_mlkem768_portable_unpacked_key_pair_from_private_mut(
11366     libcrux_ml_kem_types_MlKemPrivateKey_d9 *private_key,
11367     libcrux_ml_kem_mlkem768_portable_unpacked_MlKem768KeyPairUnpacked
11368         *key_pair) {
11369   libcrux_ml_kem_ind_cca_instantiations_portable_unpacked_keypair_from_private_key_fd(
11370       private_key, key_pair);
11371 }
11372 
11373 /**
11374 This function found in impl
11375 {libcrux_ml_kem::ind_cca::unpacked::MlKemKeyPairUnpacked<Vector,
11376 K>[TraitClause@0, TraitClause@1]}
11377 */
11378 /**
11379 A monomorphic instance of
11380 libcrux_ml_kem.ind_cca.unpacked.serialized_private_key_mut_11 with types
11381 libcrux_ml_kem_vector_portable_vector_type_PortableVector with const generics
11382 - K= 3
11383 - CPA_PRIVATE_KEY_SIZE= 1152
11384 - PRIVATE_KEY_SIZE= 2400
11385 - PUBLIC_KEY_SIZE= 1184
11386 */
11387 static KRML_MUSTINLINE void
libcrux_ml_kem_ind_cca_unpacked_serialized_private_key_mut_11_43(libcrux_ml_kem_mlkem768_portable_unpacked_MlKem768KeyPairUnpacked * self,libcrux_ml_kem_types_MlKemPrivateKey_d9 * serialized)11388 libcrux_ml_kem_ind_cca_unpacked_serialized_private_key_mut_11_43(
11389     libcrux_ml_kem_mlkem768_portable_unpacked_MlKem768KeyPairUnpacked *self,
11390     libcrux_ml_kem_types_MlKemPrivateKey_d9 *serialized) {
11391   libcrux_ml_kem_utils_extraction_helper_Keypair768 uu____0 =
11392       libcrux_ml_kem_ind_cpa_serialize_unpacked_secret_key_6c(
11393           &self->public_key.ind_cpa_public_key,
11394           &self->private_key.ind_cpa_private_key);
11395   uint8_t ind_cpa_private_key[1152U];
11396   memcpy(ind_cpa_private_key, uu____0.fst, (size_t)1152U * sizeof(uint8_t));
11397   uint8_t ind_cpa_public_key[1184U];
11398   memcpy(ind_cpa_public_key, uu____0.snd, (size_t)1184U * sizeof(uint8_t));
11399   libcrux_ml_kem_ind_cca_serialize_kem_secret_key_mut_d6(
11400       Eurydice_array_to_slice((size_t)1152U, ind_cpa_private_key, uint8_t),
11401       Eurydice_array_to_slice((size_t)1184U, ind_cpa_public_key, uint8_t),
11402       Eurydice_array_to_slice(
11403           (size_t)32U, self->private_key.implicit_rejection_value, uint8_t),
11404       serialized->value);
11405 }
11406 
11407 /**
11408 This function found in impl
11409 {libcrux_ml_kem::ind_cca::unpacked::MlKemKeyPairUnpacked<Vector,
11410 K>[TraitClause@0, TraitClause@1]}
11411 */
11412 /**
11413 A monomorphic instance of
11414 libcrux_ml_kem.ind_cca.unpacked.serialized_private_key_11 with types
11415 libcrux_ml_kem_vector_portable_vector_type_PortableVector with const generics
11416 - K= 3
11417 - CPA_PRIVATE_KEY_SIZE= 1152
11418 - PRIVATE_KEY_SIZE= 2400
11419 - PUBLIC_KEY_SIZE= 1184
11420 */
11421 static KRML_MUSTINLINE libcrux_ml_kem_types_MlKemPrivateKey_d9
libcrux_ml_kem_ind_cca_unpacked_serialized_private_key_11_43(libcrux_ml_kem_mlkem768_portable_unpacked_MlKem768KeyPairUnpacked * self)11422 libcrux_ml_kem_ind_cca_unpacked_serialized_private_key_11_43(
11423     libcrux_ml_kem_mlkem768_portable_unpacked_MlKem768KeyPairUnpacked *self) {
11424   libcrux_ml_kem_types_MlKemPrivateKey_d9 sk =
11425       libcrux_ml_kem_types_default_d3_28();
11426   libcrux_ml_kem_ind_cca_unpacked_serialized_private_key_mut_11_43(self, &sk);
11427   return sk;
11428 }
11429 
11430 /**
11431  Get the serialized private key.
11432 */
11433 static inline libcrux_ml_kem_types_MlKemPrivateKey_d9
libcrux_ml_kem_mlkem768_portable_unpacked_key_pair_serialized_private_key(libcrux_ml_kem_mlkem768_portable_unpacked_MlKem768KeyPairUnpacked * key_pair)11434 libcrux_ml_kem_mlkem768_portable_unpacked_key_pair_serialized_private_key(
11435     libcrux_ml_kem_mlkem768_portable_unpacked_MlKem768KeyPairUnpacked
11436         *key_pair) {
11437   return libcrux_ml_kem_ind_cca_unpacked_serialized_private_key_11_43(key_pair);
11438 }
11439 
11440 /**
11441  Get the serialized private key.
11442 */
11443 static inline void
libcrux_ml_kem_mlkem768_portable_unpacked_key_pair_serialized_private_key_mut(libcrux_ml_kem_mlkem768_portable_unpacked_MlKem768KeyPairUnpacked * key_pair,libcrux_ml_kem_types_MlKemPrivateKey_d9 * serialized)11444 libcrux_ml_kem_mlkem768_portable_unpacked_key_pair_serialized_private_key_mut(
11445     libcrux_ml_kem_mlkem768_portable_unpacked_MlKem768KeyPairUnpacked *key_pair,
11446     libcrux_ml_kem_types_MlKemPrivateKey_d9 *serialized) {
11447   libcrux_ml_kem_ind_cca_unpacked_serialized_private_key_mut_11_43(key_pair,
11448                                                                    serialized);
11449 }
11450 
11451 /**
11452 This function found in impl
11453 {libcrux_ml_kem::ind_cca::unpacked::MlKemPublicKeyUnpacked<Vector,
11454 K>[TraitClause@0, TraitClause@1]}
11455 */
11456 /**
11457 A monomorphic instance of libcrux_ml_kem.ind_cca.unpacked.serialized_dd
11458 with types libcrux_ml_kem_vector_portable_vector_type_PortableVector
11459 with const generics
11460 - K= 3
11461 - PUBLIC_KEY_SIZE= 1184
11462 */
11463 static KRML_MUSTINLINE libcrux_ml_kem_types_MlKemPublicKey_30
libcrux_ml_kem_ind_cca_unpacked_serialized_dd_89(libcrux_ml_kem_ind_cca_unpacked_MlKemPublicKeyUnpacked_a0 * self)11464 libcrux_ml_kem_ind_cca_unpacked_serialized_dd_89(
11465     libcrux_ml_kem_ind_cca_unpacked_MlKemPublicKeyUnpacked_a0 *self) {
11466   uint8_t ret[1184U];
11467   libcrux_ml_kem_ind_cpa_serialize_public_key_89(
11468       self->ind_cpa_public_key.t_as_ntt,
11469       Eurydice_array_to_slice((size_t)32U, self->ind_cpa_public_key.seed_for_A,
11470                               uint8_t),
11471       ret);
11472   return libcrux_ml_kem_types_from_fd_d0(ret);
11473 }
11474 
11475 /**
11476 This function found in impl
11477 {libcrux_ml_kem::ind_cca::unpacked::MlKemKeyPairUnpacked<Vector,
11478 K>[TraitClause@0, TraitClause@1]}
11479 */
11480 /**
11481 A monomorphic instance of
11482 libcrux_ml_kem.ind_cca.unpacked.serialized_public_key_11 with types
11483 libcrux_ml_kem_vector_portable_vector_type_PortableVector with const generics
11484 - K= 3
11485 - PUBLIC_KEY_SIZE= 1184
11486 */
11487 static KRML_MUSTINLINE libcrux_ml_kem_types_MlKemPublicKey_30
libcrux_ml_kem_ind_cca_unpacked_serialized_public_key_11_89(libcrux_ml_kem_mlkem768_portable_unpacked_MlKem768KeyPairUnpacked * self)11488 libcrux_ml_kem_ind_cca_unpacked_serialized_public_key_11_89(
11489     libcrux_ml_kem_mlkem768_portable_unpacked_MlKem768KeyPairUnpacked *self) {
11490   return libcrux_ml_kem_ind_cca_unpacked_serialized_dd_89(&self->public_key);
11491 }
11492 
11493 /**
11494  Get the serialized public key.
11495 */
11496 static inline libcrux_ml_kem_types_MlKemPublicKey_30
libcrux_ml_kem_mlkem768_portable_unpacked_key_pair_serialized_public_key(libcrux_ml_kem_mlkem768_portable_unpacked_MlKem768KeyPairUnpacked * key_pair)11497 libcrux_ml_kem_mlkem768_portable_unpacked_key_pair_serialized_public_key(
11498     libcrux_ml_kem_mlkem768_portable_unpacked_MlKem768KeyPairUnpacked
11499         *key_pair) {
11500   return libcrux_ml_kem_ind_cca_unpacked_serialized_public_key_11_89(key_pair);
11501 }
11502 
11503 /**
11504 This function found in impl
11505 {libcrux_ml_kem::ind_cca::unpacked::MlKemPublicKeyUnpacked<Vector,
11506 K>[TraitClause@0, TraitClause@1]}
11507 */
11508 /**
11509 A monomorphic instance of libcrux_ml_kem.ind_cca.unpacked.serialized_mut_dd
11510 with types libcrux_ml_kem_vector_portable_vector_type_PortableVector
11511 with const generics
11512 - K= 3
11513 - PUBLIC_KEY_SIZE= 1184
11514 */
11515 static KRML_MUSTINLINE void
libcrux_ml_kem_ind_cca_unpacked_serialized_mut_dd_89(libcrux_ml_kem_ind_cca_unpacked_MlKemPublicKeyUnpacked_a0 * self,libcrux_ml_kem_types_MlKemPublicKey_30 * serialized)11516 libcrux_ml_kem_ind_cca_unpacked_serialized_mut_dd_89(
11517     libcrux_ml_kem_ind_cca_unpacked_MlKemPublicKeyUnpacked_a0 *self,
11518     libcrux_ml_kem_types_MlKemPublicKey_30 *serialized) {
11519   libcrux_ml_kem_ind_cpa_serialize_public_key_mut_89(
11520       self->ind_cpa_public_key.t_as_ntt,
11521       Eurydice_array_to_slice((size_t)32U, self->ind_cpa_public_key.seed_for_A,
11522                               uint8_t),
11523       serialized->value);
11524 }
11525 
11526 /**
11527 This function found in impl
11528 {libcrux_ml_kem::ind_cca::unpacked::MlKemKeyPairUnpacked<Vector,
11529 K>[TraitClause@0, TraitClause@1]}
11530 */
11531 /**
11532 A monomorphic instance of
11533 libcrux_ml_kem.ind_cca.unpacked.serialized_public_key_mut_11 with types
11534 libcrux_ml_kem_vector_portable_vector_type_PortableVector with const generics
11535 - K= 3
11536 - PUBLIC_KEY_SIZE= 1184
11537 */
11538 static KRML_MUSTINLINE void
libcrux_ml_kem_ind_cca_unpacked_serialized_public_key_mut_11_89(libcrux_ml_kem_mlkem768_portable_unpacked_MlKem768KeyPairUnpacked * self,libcrux_ml_kem_types_MlKemPublicKey_30 * serialized)11539 libcrux_ml_kem_ind_cca_unpacked_serialized_public_key_mut_11_89(
11540     libcrux_ml_kem_mlkem768_portable_unpacked_MlKem768KeyPairUnpacked *self,
11541     libcrux_ml_kem_types_MlKemPublicKey_30 *serialized) {
11542   libcrux_ml_kem_ind_cca_unpacked_serialized_mut_dd_89(&self->public_key,
11543                                                        serialized);
11544 }
11545 
11546 /**
11547  Get the serialized public key.
11548 */
11549 static inline void
libcrux_ml_kem_mlkem768_portable_unpacked_key_pair_serialized_public_key_mut(libcrux_ml_kem_mlkem768_portable_unpacked_MlKem768KeyPairUnpacked * key_pair,libcrux_ml_kem_types_MlKemPublicKey_30 * serialized)11550 libcrux_ml_kem_mlkem768_portable_unpacked_key_pair_serialized_public_key_mut(
11551     libcrux_ml_kem_mlkem768_portable_unpacked_MlKem768KeyPairUnpacked *key_pair,
11552     libcrux_ml_kem_types_MlKemPublicKey_30 *serialized) {
11553   libcrux_ml_kem_ind_cca_unpacked_serialized_public_key_mut_11_89(key_pair,
11554                                                                   serialized);
11555 }
11556 
11557 /**
11558 This function found in impl {core::clone::Clone for
11559 libcrux_ml_kem::ind_cpa::unpacked::IndCpaPublicKeyUnpacked<Vector,
11560 K>[TraitClause@0, TraitClause@2]}
11561 */
11562 /**
11563 A monomorphic instance of libcrux_ml_kem.ind_cpa.unpacked.clone_91
11564 with types libcrux_ml_kem_vector_portable_vector_type_PortableVector
11565 with const generics
11566 - K= 3
11567 */
11568 static inline libcrux_ml_kem_ind_cpa_unpacked_IndCpaPublicKeyUnpacked_a0
libcrux_ml_kem_ind_cpa_unpacked_clone_91_1b(libcrux_ml_kem_ind_cpa_unpacked_IndCpaPublicKeyUnpacked_a0 * self)11569 libcrux_ml_kem_ind_cpa_unpacked_clone_91_1b(
11570     libcrux_ml_kem_ind_cpa_unpacked_IndCpaPublicKeyUnpacked_a0 *self) {
11571   libcrux_ml_kem_polynomial_PolynomialRingElement_1d uu____0[3U];
11572   core_array__core__clone__Clone_for__Array_T__N___clone(
11573       (size_t)3U, self->t_as_ntt, uu____0,
11574       libcrux_ml_kem_polynomial_PolynomialRingElement_1d, void *);
11575   uint8_t uu____1[32U];
11576   core_array__core__clone__Clone_for__Array_T__N___clone(
11577       (size_t)32U, self->seed_for_A, uu____1, uint8_t, void *);
11578   libcrux_ml_kem_ind_cpa_unpacked_IndCpaPublicKeyUnpacked_a0 lit;
11579   memcpy(
11580       lit.t_as_ntt, uu____0,
11581       (size_t)3U * sizeof(libcrux_ml_kem_polynomial_PolynomialRingElement_1d));
11582   memcpy(lit.seed_for_A, uu____1, (size_t)32U * sizeof(uint8_t));
11583   libcrux_ml_kem_polynomial_PolynomialRingElement_1d ret[3U][3U];
11584   core_array__core__clone__Clone_for__Array_T__N___clone(
11585       (size_t)3U, self->A, ret,
11586       libcrux_ml_kem_polynomial_PolynomialRingElement_1d[3U], void *);
11587   memcpy(lit.A, ret,
11588          (size_t)3U *
11589              sizeof(libcrux_ml_kem_polynomial_PolynomialRingElement_1d[3U]));
11590   return lit;
11591 }
11592 
11593 /**
11594 This function found in impl {core::clone::Clone for
11595 libcrux_ml_kem::ind_cca::unpacked::MlKemPublicKeyUnpacked<Vector,
11596 K>[TraitClause@0, TraitClause@2]}
11597 */
11598 /**
11599 A monomorphic instance of libcrux_ml_kem.ind_cca.unpacked.clone_d7
11600 with types libcrux_ml_kem_vector_portable_vector_type_PortableVector
11601 with const generics
11602 - K= 3
11603 */
11604 static inline libcrux_ml_kem_ind_cca_unpacked_MlKemPublicKeyUnpacked_a0
libcrux_ml_kem_ind_cca_unpacked_clone_d7_1b(libcrux_ml_kem_ind_cca_unpacked_MlKemPublicKeyUnpacked_a0 * self)11605 libcrux_ml_kem_ind_cca_unpacked_clone_d7_1b(
11606     libcrux_ml_kem_ind_cca_unpacked_MlKemPublicKeyUnpacked_a0 *self) {
11607   libcrux_ml_kem_ind_cca_unpacked_MlKemPublicKeyUnpacked_a0 lit;
11608   lit.ind_cpa_public_key =
11609       libcrux_ml_kem_ind_cpa_unpacked_clone_91_1b(&self->ind_cpa_public_key);
11610   uint8_t ret[32U];
11611   core_array__core__clone__Clone_for__Array_T__N___clone(
11612       (size_t)32U, self->public_key_hash, ret, uint8_t, void *);
11613   memcpy(lit.public_key_hash, ret, (size_t)32U * sizeof(uint8_t));
11614   return lit;
11615 }
11616 
11617 /**
11618 This function found in impl
11619 {libcrux_ml_kem::ind_cca::unpacked::MlKemKeyPairUnpacked<Vector,
11620 K>[TraitClause@0, TraitClause@1]}
11621 */
11622 /**
11623 A monomorphic instance of libcrux_ml_kem.ind_cca.unpacked.public_key_11
11624 with types libcrux_ml_kem_vector_portable_vector_type_PortableVector
11625 with const generics
11626 - K= 3
11627 */
11628 static KRML_MUSTINLINE libcrux_ml_kem_ind_cca_unpacked_MlKemPublicKeyUnpacked_a0 *
libcrux_ml_kem_ind_cca_unpacked_public_key_11_1b(libcrux_ml_kem_mlkem768_portable_unpacked_MlKem768KeyPairUnpacked * self)11629 libcrux_ml_kem_ind_cca_unpacked_public_key_11_1b(
11630     libcrux_ml_kem_mlkem768_portable_unpacked_MlKem768KeyPairUnpacked *self) {
11631   return &self->public_key;
11632 }
11633 
11634 /**
11635  Get the unpacked public key.
11636 */
libcrux_ml_kem_mlkem768_portable_unpacked_public_key(libcrux_ml_kem_mlkem768_portable_unpacked_MlKem768KeyPairUnpacked * key_pair,libcrux_ml_kem_ind_cca_unpacked_MlKemPublicKeyUnpacked_a0 * pk)11637 static inline void libcrux_ml_kem_mlkem768_portable_unpacked_public_key(
11638     libcrux_ml_kem_mlkem768_portable_unpacked_MlKem768KeyPairUnpacked *key_pair,
11639     libcrux_ml_kem_ind_cca_unpacked_MlKemPublicKeyUnpacked_a0 *pk) {
11640   libcrux_ml_kem_ind_cca_unpacked_MlKemPublicKeyUnpacked_a0 uu____0 =
11641       libcrux_ml_kem_ind_cca_unpacked_clone_d7_1b(
11642           libcrux_ml_kem_ind_cca_unpacked_public_key_11_1b(key_pair));
11643   pk[0U] = uu____0;
11644 }
11645 
11646 /**
11647  Get the serialized public key.
11648 */
11649 static inline void
libcrux_ml_kem_mlkem768_portable_unpacked_serialized_public_key(libcrux_ml_kem_ind_cca_unpacked_MlKemPublicKeyUnpacked_a0 * public_key,libcrux_ml_kem_types_MlKemPublicKey_30 * serialized)11650 libcrux_ml_kem_mlkem768_portable_unpacked_serialized_public_key(
11651     libcrux_ml_kem_ind_cca_unpacked_MlKemPublicKeyUnpacked_a0 *public_key,
11652     libcrux_ml_kem_types_MlKemPublicKey_30 *serialized) {
11653   libcrux_ml_kem_ind_cca_unpacked_serialized_mut_dd_89(public_key, serialized);
11654 }
11655 
11656 /**
11657  Generate an unpacked key from a serialized key.
11658 */
11659 /**
11660 A monomorphic instance of libcrux_ml_kem.ind_cca.unpacked.unpack_public_key
11661 with types libcrux_ml_kem_hash_functions_portable_PortableHash[[$3size_t]],
11662 libcrux_ml_kem_vector_portable_vector_type_PortableVector with const generics
11663 - K= 3
11664 - T_AS_NTT_ENCODED_SIZE= 1152
11665 - PUBLIC_KEY_SIZE= 1184
11666 */
11667 static KRML_MUSTINLINE void
libcrux_ml_kem_ind_cca_unpacked_unpack_public_key_0a(libcrux_ml_kem_types_MlKemPublicKey_30 * public_key,libcrux_ml_kem_ind_cca_unpacked_MlKemPublicKeyUnpacked_a0 * unpacked_public_key)11668 libcrux_ml_kem_ind_cca_unpacked_unpack_public_key_0a(
11669     libcrux_ml_kem_types_MlKemPublicKey_30 *public_key,
11670     libcrux_ml_kem_ind_cca_unpacked_MlKemPublicKeyUnpacked_a0
11671         *unpacked_public_key) {
11672   Eurydice_slice uu____0 =
11673       Eurydice_array_to_subslice_to((size_t)1184U, public_key->value,
11674                                     (size_t)1152U, uint8_t, size_t, uint8_t[]);
11675   libcrux_ml_kem_serialize_deserialize_ring_elements_reduced_1b(
11676       uu____0, unpacked_public_key->ind_cpa_public_key.t_as_ntt);
11677   uint8_t uu____1[32U];
11678   libcrux_ml_kem_utils_into_padded_array_9e(
11679       Eurydice_array_to_subslice_from((size_t)1184U, public_key->value,
11680                                       (size_t)1152U, uint8_t, size_t,
11681                                       uint8_t[]),
11682       uu____1);
11683   memcpy(unpacked_public_key->ind_cpa_public_key.seed_for_A, uu____1,
11684          (size_t)32U * sizeof(uint8_t));
11685   libcrux_ml_kem_polynomial_PolynomialRingElement_1d(*uu____2)[3U] =
11686       unpacked_public_key->ind_cpa_public_key.A;
11687   uint8_t ret[34U];
11688   libcrux_ml_kem_utils_into_padded_array_b6(
11689       Eurydice_array_to_subslice_from((size_t)1184U, public_key->value,
11690                                       (size_t)1152U, uint8_t, size_t,
11691                                       uint8_t[]),
11692       ret);
11693   libcrux_ml_kem_matrix_sample_matrix_A_2b(uu____2, ret, false);
11694   uint8_t uu____3[32U];
11695   libcrux_ml_kem_hash_functions_portable_H_4a_e0(
11696       Eurydice_array_to_slice((size_t)1184U,
11697                               libcrux_ml_kem_types_as_slice_e6_d0(public_key),
11698                               uint8_t),
11699       uu____3);
11700   memcpy(unpacked_public_key->public_key_hash, uu____3,
11701          (size_t)32U * sizeof(uint8_t));
11702 }
11703 
11704 /**
11705  Get the unpacked public key.
11706 */
11707 /**
11708 A monomorphic instance of
11709 libcrux_ml_kem.ind_cca.instantiations.portable.unpacked.unpack_public_key with
11710 const generics
11711 - K= 3
11712 - T_AS_NTT_ENCODED_SIZE= 1152
11713 - PUBLIC_KEY_SIZE= 1184
11714 */
11715 static KRML_MUSTINLINE void
libcrux_ml_kem_ind_cca_instantiations_portable_unpacked_unpack_public_key_31(libcrux_ml_kem_types_MlKemPublicKey_30 * public_key,libcrux_ml_kem_ind_cca_unpacked_MlKemPublicKeyUnpacked_a0 * unpacked_public_key)11716 libcrux_ml_kem_ind_cca_instantiations_portable_unpacked_unpack_public_key_31(
11717     libcrux_ml_kem_types_MlKemPublicKey_30 *public_key,
11718     libcrux_ml_kem_ind_cca_unpacked_MlKemPublicKeyUnpacked_a0
11719         *unpacked_public_key) {
11720   libcrux_ml_kem_ind_cca_unpacked_unpack_public_key_0a(public_key,
11721                                                        unpacked_public_key);
11722 }
11723 
11724 /**
11725  Get the unpacked public key.
11726 */
11727 static inline void
libcrux_ml_kem_mlkem768_portable_unpacked_unpacked_public_key(libcrux_ml_kem_types_MlKemPublicKey_30 * public_key,libcrux_ml_kem_ind_cca_unpacked_MlKemPublicKeyUnpacked_a0 * unpacked_public_key)11728 libcrux_ml_kem_mlkem768_portable_unpacked_unpacked_public_key(
11729     libcrux_ml_kem_types_MlKemPublicKey_30 *public_key,
11730     libcrux_ml_kem_ind_cca_unpacked_MlKemPublicKeyUnpacked_a0
11731         *unpacked_public_key) {
11732   libcrux_ml_kem_ind_cca_instantiations_portable_unpacked_unpack_public_key_31(
11733       public_key, unpacked_public_key);
11734 }
11735 
11736 #if defined(__cplusplus)
11737 }
11738 #endif
11739 
11740 #define libcrux_mlkem768_portable_H_DEFINED
11741 #endif /* libcrux_mlkem768_portable_H */
11742 
11743 
11744 /* rename some types to be a bit more ergonomic */
11745 #define libcrux_mlkem768_keypair libcrux_ml_kem_mlkem768_MlKem768KeyPair_s
11746 #define libcrux_mlkem768_pk libcrux_ml_kem_types_MlKemPublicKey_30_s
11747 #define libcrux_mlkem768_sk libcrux_ml_kem_types_MlKemPrivateKey_d9_s
11748 #define libcrux_mlkem768_ciphertext libcrux_ml_kem_mlkem768_MlKem768Ciphertext_s
11749 #define libcrux_mlkem768_enc_result tuple_c2_s
11750 /* defines for PRNG inputs */
11751 #define LIBCRUX_ML_KEM_KEY_PAIR_PRNG_LEN 64U
11752 #define LIBCRUX_ML_KEM_ENC_PRNG_LEN 32
11753