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