1 /* $OpenBSD: libcrux_mlkem768_sha3.h,v 1.2 2024/10/27 02:06:01 djm Exp $ */
2
3 /* Extracted from libcrux revision 84c5d87b3092c59294345aa269ceefe0eb97cc35 */
4
5 /*
6 * MIT License
7 *
8 * Copyright (c) 2024 Cryspen
9 *
10 * Permission is hereby granted, free of charge, to any person obtaining a copy
11 * of this software and associated documentation files (the "Software"), to deal
12 * in the Software without restriction, including without limitation the rights
13 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
14 * copies of the Software, and to permit persons to whom the Software is
15 * furnished to do so, subject to the following conditions:
16 *
17 * The above copyright notice and this permission notice shall be included in all
18 * copies or substantial portions of the Software.
19 *
20 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
21 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
22 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
23 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
24 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
25 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
26 * SOFTWARE.
27 */
28
29 #if !defined(__GNUC__) || (__GNUC__ < 2)
30 # define __attribute__(x)
31 #endif
32 #define KRML_MUSTINLINE inline
33 #define KRML_NOINLINE __attribute__((noinline, unused))
34 #define KRML_HOST_EPRINTF(...)
35 #define KRML_HOST_EXIT(x) fatal_f("internal error")
36
37 /* from libcrux/libcrux-ml-kem/cg/eurydice_glue.h */
38 /*
39 * SPDX-FileCopyrightText: 2024 Eurydice Contributors
40 * SPDX-FileCopyrightText: 2024 Cryspen Sarl <info@cryspen.com>
41 *
42 * SPDX-License-Identifier: MIT or Apache-2.0
43 */
44
45 #pragma once
46
47 #if defined(__cplusplus)
48 extern "C" {
49 #endif
50
51
52
53 // SLICES, ARRAYS, ETC.
54
55 // The MSVC C++ compiler does not support compound literals.
56 // This CLITERAL is used to turn `(type){...}` into `type{...}` when using a C++
57 // compiler.
58 #if defined(__cplusplus)
59 #define CLITERAL(type) type
60 #else
61 #define CLITERAL(type) (type)
62 #endif
63
64 // We represent a slice as a pair of an (untyped) pointer, along with the length
65 // of the slice, i.e. the number of elements in the slice (this is NOT the
66 // number of bytes). This design choice has two important consequences.
67 // - if you need to use `ptr`, you MUST cast it to a proper type *before*
68 // performing pointer
69 // arithmetic on it (remember that C desugars pointer arithmetic based on the
70 // type of the address)
71 // - if you need to use `len` for a C style function (e.g. memcpy, memcmp), you
72 // need to multiply it
73 // by sizeof t, where t is the type of the elements.
74 //
75 // Empty slices have `len == 0` and `ptr` always needs to be valid pointer that
76 // is not NULL (otherwise the construction in EURYDICE_SLICE computes `NULL +
77 // start`).
78 typedef struct {
79 void *ptr;
80 size_t len;
81 } Eurydice_slice;
82
83 // Helper macro to create a slice out of a pointer x, a start index in x
84 // (included), and an end index in x (excluded). The argument x must be suitably
85 // cast to something that can decay (see remark above about how pointer
86 // arithmetic works in C), meaning either pointer or array type.
87 #define EURYDICE_SLICE(x, start, end) \
88 (CLITERAL(Eurydice_slice){.ptr = (void *)(x + start), .len = end - start})
89 #define EURYDICE_SLICE_LEN(s, _) s.len
90 // This macro is a pain because in case the dereferenced element type is an
91 // array, you cannot simply write `t x` as it would yield `int[4] x` instead,
92 // which is NOT correct C syntax, so we add a dedicated phase in Eurydice that
93 // adds an extra argument to this macro at the last minute so that we have the
94 // correct type of *pointers* to elements.
95 #define Eurydice_slice_index(s, i, t, t_ptr_t) (((t_ptr_t)s.ptr)[i])
96 #define Eurydice_slice_subslice(s, r, t, _) \
97 EURYDICE_SLICE((t *)s.ptr, r.start, r.end)
98 // Variant for when the start and end indices are statically known (i.e., the
99 // range argument `r` is a literal).
100 #define Eurydice_slice_subslice2(s, start, end, t) \
101 EURYDICE_SLICE((t *)s.ptr, start, end)
102 #define Eurydice_slice_subslice_to(s, subslice_end_pos, t, _) \
103 EURYDICE_SLICE((t *)s.ptr, 0, subslice_end_pos)
104 #define Eurydice_slice_subslice_from(s, subslice_start_pos, t, _) \
105 EURYDICE_SLICE((t *)s.ptr, subslice_start_pos, s.len)
106 #define Eurydice_array_to_slice(end, x, t) \
107 EURYDICE_SLICE(x, 0, \
108 end) /* x is already at an array type, no need for cast */
109 #define Eurydice_array_to_subslice(_arraylen, x, r, t, _) \
110 EURYDICE_SLICE((t *)x, r.start, r.end)
111 // Same as above, variant for when start and end are statically known
112 #define Eurydice_array_to_subslice2(x, start, end, t) \
113 EURYDICE_SLICE((t *)x, start, end)
114 #define Eurydice_array_to_subslice_to(_size, x, r, t, _range_t) \
115 EURYDICE_SLICE((t *)x, 0, r)
116 #define Eurydice_array_to_subslice_from(size, x, r, t, _range_t) \
117 EURYDICE_SLICE((t *)x, r, size)
118 #define Eurydice_slice_len(s, t) EURYDICE_SLICE_LEN(s, t)
119 #define Eurydice_slice_copy(dst, src, t) \
120 memcpy(dst.ptr, src.ptr, dst.len * sizeof(t))
121 #define core_array___Array_T__N__23__as_slice(len_, ptr_, t, _ret_t) \
122 ((Eurydice_slice){.ptr = ptr_, .len = len_})
123
124 #define core_array___core__clone__Clone_for__Array_T__N___20__clone( \
125 len, src, dst, elem_type, _ret_t) \
126 (memcpy(dst, src, len * sizeof(elem_type)))
127 #define TryFromSliceError uint8_t
128
129 #define Eurydice_array_eq(sz, a1, a2, t, _) \
130 (memcmp(a1, a2, sz * sizeof(t)) == 0)
131 #define core_array_equality___core__cmp__PartialEq__Array_U__N___for__Array_T__N____eq( \
132 sz, a1, a2, t, _, _ret_t) \
133 Eurydice_array_eq(sz, a1, a2, t, _)
134 #define core_array_equality___core__cmp__PartialEq__0___Slice_U____for__Array_T__N___3__eq( \
135 sz, a1, a2, t, _, _ret_t) \
136 Eurydice_array_eq(sz, a1, ((a2)->ptr), t, _)
137
138 #define Eurydice_slice_split_at(slice, mid, element_type, ret_t) \
139 (CLITERAL(ret_t){ \
140 .fst = EURYDICE_SLICE((element_type *)slice.ptr, 0, mid), \
141 .snd = EURYDICE_SLICE((element_type *)slice.ptr, mid, slice.len)})
142 #define Eurydice_slice_split_at_mut(slice, mid, element_type, ret_t) \
143 (CLITERAL(ret_t){ \
144 .fst = {.ptr = slice.ptr, .len = mid}, \
145 .snd = {.ptr = (char *)slice.ptr + mid * sizeof(element_type), \
146 .len = slice.len - mid}})
147
148 // Conversion of slice to an array, rewritten (by Eurydice) to name the
149 // destination array, since arrays are not values in C.
150 // N.B.: see note in karamel/lib/Inlining.ml if you change this.
151 #define Eurydice_slice_to_array2(dst, src, _, t_arr) \
152 Eurydice_slice_to_array3(&(dst)->tag, (char *)&(dst)->val.case_Ok, src, \
153 sizeof(t_arr))
154
Eurydice_slice_to_array3(uint8_t * dst_tag,char * dst_ok,Eurydice_slice src,size_t sz)155 static inline void Eurydice_slice_to_array3(uint8_t *dst_tag, char *dst_ok,
156 Eurydice_slice src, size_t sz) {
157 *dst_tag = 0;
158 memcpy(dst_ok, src.ptr, sz);
159 }
160
161 // CORE STUFF (conversions, endianness, ...)
162
core_num__u64_9__to_le_bytes(uint64_t v,uint8_t buf[8])163 static inline void core_num__u64_9__to_le_bytes(uint64_t v, uint8_t buf[8]) {
164 v = htole64(v);
165 memcpy(buf, &v, sizeof(v));
166 }
core_num__u64_9__from_le_bytes(uint8_t buf[8])167 static inline uint64_t core_num__u64_9__from_le_bytes(uint8_t buf[8]) {
168 uint64_t v;
169 memcpy(&v, buf, sizeof(v));
170 return le64toh(v);
171 }
172
core_num__u32_8__from_le_bytes(uint8_t buf[4])173 static inline uint32_t core_num__u32_8__from_le_bytes(uint8_t buf[4]) {
174 uint32_t v;
175 memcpy(&v, buf, sizeof(v));
176 return le32toh(v);
177 }
178
core_num__u8_6__count_ones(uint8_t x0)179 static inline uint32_t core_num__u8_6__count_ones(uint8_t x0) {
180 #if defined(_MSC_VER)
181 return __popcnt(x0);
182 #elif !defined(MISSING_BUILTIN_POPCOUNT)
183 return __builtin_popcount(x0);
184 #else
185 const uint8_t v[16] = { 0, 1, 1, 2, 1, 2, 2, 3, 1, 2, 2, 3, 2, 3, 3, 4 };
186 return v[x0 & 0xf] + v[(x0 >> 4) & 0xf];
187
188 #endif
189 }
190
191 // unsigned overflow wraparound semantics in C
core_num__u16_7__wrapping_add(uint16_t x,uint16_t y)192 static inline uint16_t core_num__u16_7__wrapping_add(uint16_t x, uint16_t y) {
193 return x + y;
194 }
core_num__u8_6__wrapping_sub(uint8_t x,uint8_t y)195 static inline uint8_t core_num__u8_6__wrapping_sub(uint8_t x, uint8_t y) {
196 return x - y;
197 }
198
199 // ITERATORS
200
201 #define Eurydice_range_iter_next(iter_ptr, t, ret_t) \
202 (((iter_ptr)->start == (iter_ptr)->end) \
203 ? (CLITERAL(ret_t){.tag = None}) \
204 : (CLITERAL(ret_t){.tag = Some, .f0 = (iter_ptr)->start++}))
205
206 #define core_iter_range___core__iter__traits__iterator__Iterator_for_core__ops__range__Range_A___6__next \
207 Eurydice_range_iter_next
208
209 // See note in karamel/lib/Inlining.ml if you change this
210 #define Eurydice_into_iter(x, t, _ret_t) (x)
211 #define core_iter_traits_collect___core__iter__traits__collect__IntoIterator_for_I__1__into_iter \
212 Eurydice_into_iter
213
214 #if defined(__cplusplus)
215 }
216 #endif
217
218 /* from libcrux/libcrux-ml-kem/cg/libcrux_core.h */
219 /*
220 * SPDX-FileCopyrightText: 2024 Cryspen Sarl <info@cryspen.com>
221 *
222 * SPDX-License-Identifier: MIT or Apache-2.0
223 *
224 * This code was generated with the following revisions:
225 * Charon: 6b5e110342a771a3e1c739b10294b1778e4be8b4
226 * Eurydice: 31be7d65ca5d6acdacfb33652e478d24dd85c1cb
227 * Karamel: 3205d3365ea2790b02368f79fcee38e38d0b5908
228 * F*: a32b316e521fa4f239b610ec8f1d15e78d62cbe8-dirty
229 * Libcrux: 4ad532b206174114dd4140b718e7794a28fc59ee
230 */
231
232 #ifndef __libcrux_core_H
233 #define __libcrux_core_H
234
235 #if defined(__cplusplus)
236 extern "C" {
237 #endif
238
239
240 /**
241 A monomorphic instance of core.ops.range.Range
242 with types size_t
243
244 */
245 typedef struct core_ops_range_Range_b3_s {
246 size_t start;
247 size_t end;
248 } core_ops_range_Range_b3;
249
250 #define Ok 0
251 #define Err 1
252
253 typedef uint8_t Result_86_tags;
254
255 #define None 0
256 #define Some 1
257
258 typedef uint8_t Option_ef_tags;
259
260 /**
261 A monomorphic instance of core.option.Option
262 with types size_t
263
264 */
265 typedef struct Option_b3_s {
266 Option_ef_tags tag;
267 size_t f0;
268 } Option_b3;
269
270 static inline uint16_t core_num__u16_7__wrapping_add(uint16_t x0, uint16_t x1);
271
272 #define CORE_NUM__U32_8__BITS (32U)
273
274 static inline uint64_t core_num__u64_9__from_le_bytes(uint8_t x0[8U]);
275
276 static inline void core_num__u64_9__to_le_bytes(uint64_t x0, uint8_t x1[8U]);
277
278 static inline uint32_t core_num__u8_6__count_ones(uint8_t x0);
279
280 static inline uint8_t core_num__u8_6__wrapping_sub(uint8_t x0, uint8_t x1);
281
282 #define LIBCRUX_ML_KEM_CONSTANTS_SHARED_SECRET_SIZE ((size_t)32U)
283
284 #define LIBCRUX_ML_KEM_CONSTANTS_BITS_PER_COEFFICIENT ((size_t)12U)
285
286 #define LIBCRUX_ML_KEM_CONSTANTS_COEFFICIENTS_IN_RING_ELEMENT ((size_t)256U)
287
288 #define LIBCRUX_ML_KEM_CONSTANTS_BITS_PER_RING_ELEMENT \
289 (LIBCRUX_ML_KEM_CONSTANTS_COEFFICIENTS_IN_RING_ELEMENT * (size_t)12U)
290
291 #define LIBCRUX_ML_KEM_CONSTANTS_BYTES_PER_RING_ELEMENT \
292 (LIBCRUX_ML_KEM_CONSTANTS_BITS_PER_RING_ELEMENT / (size_t)8U)
293
294 #define LIBCRUX_ML_KEM_CONSTANTS_CPA_PKE_KEY_GENERATION_SEED_SIZE ((size_t)32U)
295
296 #define LIBCRUX_ML_KEM_CONSTANTS_H_DIGEST_SIZE ((size_t)32U)
297
298 typedef struct libcrux_ml_kem_utils_extraction_helper_Keypair768_s {
299 uint8_t fst[1152U];
300 uint8_t snd[1184U];
301 } libcrux_ml_kem_utils_extraction_helper_Keypair768;
302
303 /**
304 A monomorphic instance of core.result.Result
305 with types uint8_t[24size_t], core_array_TryFromSliceError
306
307 */
308 typedef struct Result_6f_s {
309 Result_86_tags tag;
310 union {
311 uint8_t case_Ok[24U];
312 TryFromSliceError case_Err;
313 } val;
314 } Result_6f;
315
316 /**
317 This function found in impl {core::result::Result<T, E>}
318 */
319 /**
320 A monomorphic instance of core.result.unwrap_41
321 with types uint8_t[24size_t], core_array_TryFromSliceError
322
323 */
unwrap_41_1c(Result_6f self,uint8_t ret[24U])324 static inline void unwrap_41_1c(Result_6f self, uint8_t ret[24U]) {
325 if (self.tag == Ok) {
326 uint8_t f0[24U];
327 memcpy(f0, self.val.case_Ok, (size_t)24U * sizeof(uint8_t));
328 memcpy(ret, f0, (size_t)24U * sizeof(uint8_t));
329 } else {
330 KRML_HOST_EPRINTF("KaRaMeL abort at %s:%d\n%s\n", __FILE__, __LINE__,
331 "unwrap not Ok");
332 KRML_HOST_EXIT(255U);
333 }
334 }
335
336 /**
337 A monomorphic instance of core.result.Result
338 with types uint8_t[20size_t], core_array_TryFromSliceError
339
340 */
341 typedef struct Result_7a_s {
342 Result_86_tags tag;
343 union {
344 uint8_t case_Ok[20U];
345 TryFromSliceError case_Err;
346 } val;
347 } Result_7a;
348
349 /**
350 This function found in impl {core::result::Result<T, E>}
351 */
352 /**
353 A monomorphic instance of core.result.unwrap_41
354 with types uint8_t[20size_t], core_array_TryFromSliceError
355
356 */
unwrap_41_34(Result_7a self,uint8_t ret[20U])357 static inline void unwrap_41_34(Result_7a self, uint8_t ret[20U]) {
358 if (self.tag == Ok) {
359 uint8_t f0[20U];
360 memcpy(f0, self.val.case_Ok, (size_t)20U * sizeof(uint8_t));
361 memcpy(ret, f0, (size_t)20U * sizeof(uint8_t));
362 } else {
363 KRML_HOST_EPRINTF("KaRaMeL abort at %s:%d\n%s\n", __FILE__, __LINE__,
364 "unwrap not Ok");
365 KRML_HOST_EXIT(255U);
366 }
367 }
368
369 /**
370 A monomorphic instance of core.result.Result
371 with types uint8_t[10size_t], core_array_TryFromSliceError
372
373 */
374 typedef struct Result_cd_s {
375 Result_86_tags tag;
376 union {
377 uint8_t case_Ok[10U];
378 TryFromSliceError case_Err;
379 } val;
380 } Result_cd;
381
382 /**
383 This function found in impl {core::result::Result<T, E>}
384 */
385 /**
386 A monomorphic instance of core.result.unwrap_41
387 with types uint8_t[10size_t], core_array_TryFromSliceError
388
389 */
unwrap_41_e8(Result_cd self,uint8_t ret[10U])390 static inline void unwrap_41_e8(Result_cd self, uint8_t ret[10U]) {
391 if (self.tag == Ok) {
392 uint8_t f0[10U];
393 memcpy(f0, self.val.case_Ok, (size_t)10U * sizeof(uint8_t));
394 memcpy(ret, f0, (size_t)10U * sizeof(uint8_t));
395 } else {
396 KRML_HOST_EPRINTF("KaRaMeL abort at %s:%d\n%s\n", __FILE__, __LINE__,
397 "unwrap not Ok");
398 KRML_HOST_EXIT(255U);
399 }
400 }
401
402 typedef struct Eurydice_slice_uint8_t_4size_t__x2_s {
403 Eurydice_slice fst[4U];
404 Eurydice_slice snd[4U];
405 } Eurydice_slice_uint8_t_4size_t__x2;
406
407 typedef struct libcrux_ml_kem_mlkem768_MlKem768Ciphertext_s {
408 uint8_t value[1088U];
409 } libcrux_ml_kem_mlkem768_MlKem768Ciphertext;
410
411 /**
412 A reference to the raw byte slice.
413 */
414 /**
415 This function found in impl {libcrux_ml_kem::types::MlKemCiphertext<SIZE>#6}
416 */
417 /**
418 A monomorphic instance of libcrux_ml_kem.types.as_slice_d4
419 with const generics
420 - SIZE= 1088
421 */
libcrux_ml_kem_types_as_slice_d4_1d(libcrux_ml_kem_mlkem768_MlKem768Ciphertext * self)422 static inline uint8_t *libcrux_ml_kem_types_as_slice_d4_1d(
423 libcrux_ml_kem_mlkem768_MlKem768Ciphertext *self) {
424 return self->value;
425 }
426
427 /**
428 A monomorphic instance of libcrux_ml_kem.types.MlKemPublicKey
429 with const generics
430 - $1184size_t
431 */
432 typedef struct libcrux_ml_kem_types_MlKemPublicKey_15_s {
433 uint8_t value[1184U];
434 } libcrux_ml_kem_types_MlKemPublicKey_15;
435
436 /**
437 This function found in impl {(core::convert::From<@Array<u8, SIZE>> for
438 libcrux_ml_kem::types::MlKemPublicKey<SIZE>)#14}
439 */
440 /**
441 A monomorphic instance of libcrux_ml_kem.types.from_b6
442 with const generics
443 - SIZE= 1184
444 */
445 static inline libcrux_ml_kem_types_MlKemPublicKey_15
libcrux_ml_kem_types_from_b6_da(uint8_t value[1184U])446 libcrux_ml_kem_types_from_b6_da(uint8_t value[1184U]) {
447 /* Passing arrays by value in Rust generates a copy in C */
448 uint8_t copy_of_value[1184U];
449 memcpy(copy_of_value, value, (size_t)1184U * sizeof(uint8_t));
450 libcrux_ml_kem_types_MlKemPublicKey_15 lit;
451 memcpy(lit.value, copy_of_value, (size_t)1184U * sizeof(uint8_t));
452 return lit;
453 }
454
455 /**
456 A monomorphic instance of libcrux_ml_kem.types.MlKemPrivateKey
457 with const generics
458 - $2400size_t
459 */
460 typedef struct libcrux_ml_kem_types_MlKemPrivateKey_55_s {
461 uint8_t value[2400U];
462 } libcrux_ml_kem_types_MlKemPrivateKey_55;
463
464 typedef struct libcrux_ml_kem_mlkem768_MlKem768KeyPair_s {
465 libcrux_ml_kem_types_MlKemPrivateKey_55 sk;
466 libcrux_ml_kem_types_MlKemPublicKey_15 pk;
467 } libcrux_ml_kem_mlkem768_MlKem768KeyPair;
468
469 /**
470 Create a new [`MlKemKeyPair`] from the secret and public key.
471 */
472 /**
473 This function found in impl
474 {libcrux_ml_kem::types::MlKemKeyPair<PRIVATE_KEY_SIZE, PUBLIC_KEY_SIZE>}
475 */
476 /**
477 A monomorphic instance of libcrux_ml_kem.types.from_17
478 with const generics
479 - PRIVATE_KEY_SIZE= 2400
480 - PUBLIC_KEY_SIZE= 1184
481 */
482 static inline libcrux_ml_kem_mlkem768_MlKem768KeyPair
libcrux_ml_kem_types_from_17_35(libcrux_ml_kem_types_MlKemPrivateKey_55 sk,libcrux_ml_kem_types_MlKemPublicKey_15 pk)483 libcrux_ml_kem_types_from_17_35(libcrux_ml_kem_types_MlKemPrivateKey_55 sk,
484 libcrux_ml_kem_types_MlKemPublicKey_15 pk) {
485 return (
486 CLITERAL(libcrux_ml_kem_mlkem768_MlKem768KeyPair){.sk = sk, .pk = pk});
487 }
488
489 /**
490 This function found in impl {(core::convert::From<@Array<u8, SIZE>> for
491 libcrux_ml_kem::types::MlKemPrivateKey<SIZE>)#8}
492 */
493 /**
494 A monomorphic instance of libcrux_ml_kem.types.from_05
495 with const generics
496 - SIZE= 2400
497 */
498 static inline libcrux_ml_kem_types_MlKemPrivateKey_55
libcrux_ml_kem_types_from_05_f2(uint8_t value[2400U])499 libcrux_ml_kem_types_from_05_f2(uint8_t value[2400U]) {
500 /* Passing arrays by value in Rust generates a copy in C */
501 uint8_t copy_of_value[2400U];
502 memcpy(copy_of_value, value, (size_t)2400U * sizeof(uint8_t));
503 libcrux_ml_kem_types_MlKemPrivateKey_55 lit;
504 memcpy(lit.value, copy_of_value, (size_t)2400U * sizeof(uint8_t));
505 return lit;
506 }
507
508 /**
509 A monomorphic instance of core.result.Result
510 with types uint8_t[32size_t], core_array_TryFromSliceError
511
512 */
513 typedef struct Result_00_s {
514 Result_86_tags tag;
515 union {
516 uint8_t case_Ok[32U];
517 TryFromSliceError case_Err;
518 } val;
519 } Result_00;
520
521 /**
522 This function found in impl {core::result::Result<T, E>}
523 */
524 /**
525 A monomorphic instance of core.result.unwrap_41
526 with types uint8_t[32size_t], core_array_TryFromSliceError
527
528 */
unwrap_41_83(Result_00 self,uint8_t ret[32U])529 static inline void unwrap_41_83(Result_00 self, uint8_t ret[32U]) {
530 if (self.tag == Ok) {
531 uint8_t f0[32U];
532 memcpy(f0, self.val.case_Ok, (size_t)32U * sizeof(uint8_t));
533 memcpy(ret, f0, (size_t)32U * sizeof(uint8_t));
534 } else {
535 KRML_HOST_EPRINTF("KaRaMeL abort at %s:%d\n%s\n", __FILE__, __LINE__,
536 "unwrap not Ok");
537 KRML_HOST_EXIT(255U);
538 }
539 }
540
541 /**
542 A monomorphic instance of K.
543 with types libcrux_ml_kem_types_MlKemCiphertext[[$1088size_t]],
544 uint8_t[32size_t]
545
546 */
547 typedef struct tuple_3c_s {
548 libcrux_ml_kem_mlkem768_MlKem768Ciphertext fst;
549 uint8_t snd[32U];
550 } tuple_3c;
551
552 /**
553 This function found in impl {(core::convert::From<@Array<u8, SIZE>> for
554 libcrux_ml_kem::types::MlKemCiphertext<SIZE>)#2}
555 */
556 /**
557 A monomorphic instance of libcrux_ml_kem.types.from_01
558 with const generics
559 - SIZE= 1088
560 */
561 static inline libcrux_ml_kem_mlkem768_MlKem768Ciphertext
libcrux_ml_kem_types_from_01_9f(uint8_t value[1088U])562 libcrux_ml_kem_types_from_01_9f(uint8_t value[1088U]) {
563 /* Passing arrays by value in Rust generates a copy in C */
564 uint8_t copy_of_value[1088U];
565 memcpy(copy_of_value, value, (size_t)1088U * sizeof(uint8_t));
566 libcrux_ml_kem_mlkem768_MlKem768Ciphertext lit;
567 memcpy(lit.value, copy_of_value, (size_t)1088U * sizeof(uint8_t));
568 return lit;
569 }
570
571 /**
572 A reference to the raw byte slice.
573 */
574 /**
575 This function found in impl {libcrux_ml_kem::types::MlKemPublicKey<SIZE>#18}
576 */
577 /**
578 A monomorphic instance of libcrux_ml_kem.types.as_slice_cb
579 with const generics
580 - SIZE= 1184
581 */
libcrux_ml_kem_types_as_slice_cb_50(libcrux_ml_kem_types_MlKemPublicKey_15 * self)582 static inline uint8_t *libcrux_ml_kem_types_as_slice_cb_50(
583 libcrux_ml_kem_types_MlKemPublicKey_15 *self) {
584 return self->value;
585 }
586
587 /**
588 Pad the `slice` with `0`s at the end.
589 */
590 /**
591 A monomorphic instance of libcrux_ml_kem.utils.into_padded_array
592 with const generics
593 - LEN= 33
594 */
libcrux_ml_kem_utils_into_padded_array_ea2(Eurydice_slice slice,uint8_t ret[33U])595 static KRML_MUSTINLINE void libcrux_ml_kem_utils_into_padded_array_ea2(
596 Eurydice_slice slice, uint8_t ret[33U]) {
597 uint8_t out[33U] = {0U};
598 uint8_t *uu____0 = out;
599 Eurydice_slice_copy(
600 Eurydice_array_to_subslice2(uu____0, (size_t)0U,
601 Eurydice_slice_len(slice, uint8_t), uint8_t),
602 slice, uint8_t);
603 memcpy(ret, out, (size_t)33U * sizeof(uint8_t));
604 }
605
606 /**
607 Pad the `slice` with `0`s at the end.
608 */
609 /**
610 A monomorphic instance of libcrux_ml_kem.utils.into_padded_array
611 with const generics
612 - LEN= 34
613 */
libcrux_ml_kem_utils_into_padded_array_ea1(Eurydice_slice slice,uint8_t ret[34U])614 static KRML_MUSTINLINE void libcrux_ml_kem_utils_into_padded_array_ea1(
615 Eurydice_slice slice, uint8_t ret[34U]) {
616 uint8_t out[34U] = {0U};
617 uint8_t *uu____0 = out;
618 Eurydice_slice_copy(
619 Eurydice_array_to_subslice2(uu____0, (size_t)0U,
620 Eurydice_slice_len(slice, uint8_t), uint8_t),
621 slice, uint8_t);
622 memcpy(ret, out, (size_t)34U * sizeof(uint8_t));
623 }
624
625 /**
626 This function found in impl {(core::convert::AsRef<@Slice<u8>> for
627 libcrux_ml_kem::types::MlKemCiphertext<SIZE>)#1}
628 */
629 /**
630 A monomorphic instance of libcrux_ml_kem.types.as_ref_00
631 with const generics
632 - SIZE= 1088
633 */
libcrux_ml_kem_types_as_ref_00_24(libcrux_ml_kem_mlkem768_MlKem768Ciphertext * self)634 static inline Eurydice_slice libcrux_ml_kem_types_as_ref_00_24(
635 libcrux_ml_kem_mlkem768_MlKem768Ciphertext *self) {
636 return Eurydice_array_to_slice((size_t)1088U, self->value, uint8_t);
637 }
638
639 /**
640 Pad the `slice` with `0`s at the end.
641 */
642 /**
643 A monomorphic instance of libcrux_ml_kem.utils.into_padded_array
644 with const generics
645 - LEN= 1120
646 */
libcrux_ml_kem_utils_into_padded_array_ea0(Eurydice_slice slice,uint8_t ret[1120U])647 static KRML_MUSTINLINE void libcrux_ml_kem_utils_into_padded_array_ea0(
648 Eurydice_slice slice, uint8_t ret[1120U]) {
649 uint8_t out[1120U] = {0U};
650 uint8_t *uu____0 = out;
651 Eurydice_slice_copy(
652 Eurydice_array_to_subslice2(uu____0, (size_t)0U,
653 Eurydice_slice_len(slice, uint8_t), uint8_t),
654 slice, uint8_t);
655 memcpy(ret, out, (size_t)1120U * sizeof(uint8_t));
656 }
657
658 /**
659 Pad the `slice` with `0`s at the end.
660 */
661 /**
662 A monomorphic instance of libcrux_ml_kem.utils.into_padded_array
663 with const generics
664 - LEN= 64
665 */
libcrux_ml_kem_utils_into_padded_array_ea(Eurydice_slice slice,uint8_t ret[64U])666 static KRML_MUSTINLINE void libcrux_ml_kem_utils_into_padded_array_ea(
667 Eurydice_slice slice, uint8_t ret[64U]) {
668 uint8_t out[64U] = {0U};
669 uint8_t *uu____0 = out;
670 Eurydice_slice_copy(
671 Eurydice_array_to_subslice2(uu____0, (size_t)0U,
672 Eurydice_slice_len(slice, uint8_t), uint8_t),
673 slice, uint8_t);
674 memcpy(ret, out, (size_t)64U * sizeof(uint8_t));
675 }
676
677 /**
678 A monomorphic instance of core.result.Result
679 with types int16_t[16size_t], core_array_TryFromSliceError
680
681 */
682 typedef struct Result_c0_s {
683 Result_86_tags tag;
684 union {
685 int16_t case_Ok[16U];
686 TryFromSliceError case_Err;
687 } val;
688 } Result_c0;
689
690 /**
691 This function found in impl {core::result::Result<T, E>}
692 */
693 /**
694 A monomorphic instance of core.result.unwrap_41
695 with types int16_t[16size_t], core_array_TryFromSliceError
696
697 */
unwrap_41_f9(Result_c0 self,int16_t ret[16U])698 static inline void unwrap_41_f9(Result_c0 self, int16_t ret[16U]) {
699 if (self.tag == Ok) {
700 int16_t f0[16U];
701 memcpy(f0, self.val.case_Ok, (size_t)16U * sizeof(int16_t));
702 memcpy(ret, f0, (size_t)16U * sizeof(int16_t));
703 } else {
704 KRML_HOST_EPRINTF("KaRaMeL abort at %s:%d\n%s\n", __FILE__, __LINE__,
705 "unwrap not Ok");
706 KRML_HOST_EXIT(255U);
707 }
708 }
709
710 /**
711 A monomorphic instance of core.result.Result
712 with types uint8_t[8size_t], core_array_TryFromSliceError
713
714 */
715 typedef struct Result_56_s {
716 Result_86_tags tag;
717 union {
718 uint8_t case_Ok[8U];
719 TryFromSliceError case_Err;
720 } val;
721 } Result_56;
722
723 /**
724 This function found in impl {core::result::Result<T, E>}
725 */
726 /**
727 A monomorphic instance of core.result.unwrap_41
728 with types uint8_t[8size_t], core_array_TryFromSliceError
729
730 */
unwrap_41_ac(Result_56 self,uint8_t ret[8U])731 static inline void unwrap_41_ac(Result_56 self, uint8_t ret[8U]) {
732 if (self.tag == Ok) {
733 uint8_t f0[8U];
734 memcpy(f0, self.val.case_Ok, (size_t)8U * sizeof(uint8_t));
735 memcpy(ret, f0, (size_t)8U * sizeof(uint8_t));
736 } else {
737 KRML_HOST_EPRINTF("KaRaMeL abort at %s:%d\n%s\n", __FILE__, __LINE__,
738 "unwrap not Ok");
739 KRML_HOST_EXIT(255U);
740 }
741 }
742
743 typedef struct Eurydice_slice_uint8_t_x2_s {
744 Eurydice_slice fst;
745 Eurydice_slice snd;
746 } Eurydice_slice_uint8_t_x2;
747
748 typedef struct Eurydice_slice_uint8_t_1size_t__x2_s {
749 Eurydice_slice fst[1U];
750 Eurydice_slice snd[1U];
751 } Eurydice_slice_uint8_t_1size_t__x2;
752
753 #if defined(__cplusplus)
754 }
755 #endif
756
757 #define __libcrux_core_H_DEFINED
758 #endif
759
760 /* from libcrux/libcrux-ml-kem/cg/libcrux_ct_ops.h */
761 /*
762 * SPDX-FileCopyrightText: 2024 Cryspen Sarl <info@cryspen.com>
763 *
764 * SPDX-License-Identifier: MIT or Apache-2.0
765 *
766 * This code was generated with the following revisions:
767 * Charon: 6b5e110342a771a3e1c739b10294b1778e4be8b4
768 * Eurydice: 31be7d65ca5d6acdacfb33652e478d24dd85c1cb
769 * Karamel: 3205d3365ea2790b02368f79fcee38e38d0b5908
770 * F*: a32b316e521fa4f239b610ec8f1d15e78d62cbe8-dirty
771 * Libcrux: 4ad532b206174114dd4140b718e7794a28fc59ee
772 */
773
774 #ifndef __libcrux_ct_ops_H
775 #define __libcrux_ct_ops_H
776
777 #if defined(__cplusplus)
778 extern "C" {
779 #endif
780
781
782 /**
783 Return 1 if `value` is not zero and 0 otherwise.
784 */
libcrux_ml_kem_constant_time_ops_inz(uint8_t value)785 static inline uint8_t libcrux_ml_kem_constant_time_ops_inz(uint8_t value) {
786 uint16_t value0 = (uint16_t)value;
787 uint16_t result = (((uint32_t)value0 |
788 (uint32_t)core_num__u16_7__wrapping_add(~value0, 1U)) &
789 0xFFFFU) >>
790 8U &
791 1U;
792 return (uint8_t)result;
793 }
794
795 static KRML_NOINLINE uint8_t
libcrux_ml_kem_constant_time_ops_is_non_zero(uint8_t value)796 libcrux_ml_kem_constant_time_ops_is_non_zero(uint8_t value) {
797 return libcrux_ml_kem_constant_time_ops_inz(value);
798 }
799
800 /**
801 Return 1 if the bytes of `lhs` and `rhs` do not exactly
802 match and 0 otherwise.
803 */
libcrux_ml_kem_constant_time_ops_compare(Eurydice_slice lhs,Eurydice_slice rhs)804 static inline uint8_t libcrux_ml_kem_constant_time_ops_compare(
805 Eurydice_slice lhs, Eurydice_slice rhs) {
806 uint8_t r = 0U;
807 for (size_t i = (size_t)0U; i < Eurydice_slice_len(lhs, uint8_t); i++) {
808 size_t i0 = i;
809 r = (uint32_t)r |
810 ((uint32_t)Eurydice_slice_index(lhs, i0, uint8_t, uint8_t *) ^
811 (uint32_t)Eurydice_slice_index(rhs, i0, uint8_t, uint8_t *));
812 }
813 return libcrux_ml_kem_constant_time_ops_is_non_zero(r);
814 }
815
816 static KRML_NOINLINE uint8_t
libcrux_ml_kem_constant_time_ops_compare_ciphertexts_in_constant_time(Eurydice_slice lhs,Eurydice_slice rhs)817 libcrux_ml_kem_constant_time_ops_compare_ciphertexts_in_constant_time(
818 Eurydice_slice lhs, Eurydice_slice rhs) {
819 return libcrux_ml_kem_constant_time_ops_compare(lhs, rhs);
820 }
821
822 /**
823 If `selector` is not zero, return the bytes in `rhs`; return the bytes in
824 `lhs` otherwise.
825 */
libcrux_ml_kem_constant_time_ops_select_ct(Eurydice_slice lhs,Eurydice_slice rhs,uint8_t selector,uint8_t ret[32U])826 static inline void libcrux_ml_kem_constant_time_ops_select_ct(
827 Eurydice_slice lhs, Eurydice_slice rhs, uint8_t selector,
828 uint8_t ret[32U]) {
829 uint8_t mask = core_num__u8_6__wrapping_sub(
830 libcrux_ml_kem_constant_time_ops_is_non_zero(selector), 1U);
831 uint8_t out[32U] = {0U};
832 for (size_t i = (size_t)0U; i < LIBCRUX_ML_KEM_CONSTANTS_SHARED_SECRET_SIZE;
833 i++) {
834 size_t i0 = i;
835 out[i0] = ((uint32_t)Eurydice_slice_index(lhs, i0, uint8_t, uint8_t *) &
836 (uint32_t)mask) |
837 ((uint32_t)Eurydice_slice_index(rhs, i0, uint8_t, uint8_t *) &
838 (uint32_t)~mask);
839 }
840 memcpy(ret, out, (size_t)32U * sizeof(uint8_t));
841 }
842
843 static KRML_NOINLINE void
libcrux_ml_kem_constant_time_ops_select_shared_secret_in_constant_time(Eurydice_slice lhs,Eurydice_slice rhs,uint8_t selector,uint8_t ret[32U])844 libcrux_ml_kem_constant_time_ops_select_shared_secret_in_constant_time(
845 Eurydice_slice lhs, Eurydice_slice rhs, uint8_t selector,
846 uint8_t ret[32U]) {
847 libcrux_ml_kem_constant_time_ops_select_ct(lhs, rhs, selector, ret);
848 }
849
850 static inline void
libcrux_ml_kem_constant_time_ops_compare_ciphertexts_select_shared_secret_in_constant_time(Eurydice_slice lhs_c,Eurydice_slice rhs_c,Eurydice_slice lhs_s,Eurydice_slice rhs_s,uint8_t ret[32U])851 libcrux_ml_kem_constant_time_ops_compare_ciphertexts_select_shared_secret_in_constant_time(
852 Eurydice_slice lhs_c, Eurydice_slice rhs_c, Eurydice_slice lhs_s,
853 Eurydice_slice rhs_s, uint8_t ret[32U]) {
854 uint8_t selector =
855 libcrux_ml_kem_constant_time_ops_compare_ciphertexts_in_constant_time(
856 lhs_c, rhs_c);
857 uint8_t ret0[32U];
858 libcrux_ml_kem_constant_time_ops_select_shared_secret_in_constant_time(
859 lhs_s, rhs_s, selector, ret0);
860 memcpy(ret, ret0, (size_t)32U * sizeof(uint8_t));
861 }
862
863 #if defined(__cplusplus)
864 }
865 #endif
866
867 #define __libcrux_ct_ops_H_DEFINED
868 #endif
869
870 /* from libcrux/libcrux-ml-kem/cg/libcrux_sha3_portable.h */
871 /*
872 * SPDX-FileCopyrightText: 2024 Cryspen Sarl <info@cryspen.com>
873 *
874 * SPDX-License-Identifier: MIT or Apache-2.0
875 *
876 * This code was generated with the following revisions:
877 * Charon: 6b5e110342a771a3e1c739b10294b1778e4be8b4
878 * Eurydice: 31be7d65ca5d6acdacfb33652e478d24dd85c1cb
879 * Karamel: 3205d3365ea2790b02368f79fcee38e38d0b5908
880 * F*: a32b316e521fa4f239b610ec8f1d15e78d62cbe8-dirty
881 * Libcrux: 4ad532b206174114dd4140b718e7794a28fc59ee
882 */
883
884 #ifndef __libcrux_sha3_portable_H
885 #define __libcrux_sha3_portable_H
886
887 #if defined(__cplusplus)
888 extern "C" {
889 #endif
890
891
892 static const uint64_t libcrux_sha3_generic_keccak_ROUNDCONSTANTS[24U] = {
893 1ULL,
894 32898ULL,
895 9223372036854808714ULL,
896 9223372039002292224ULL,
897 32907ULL,
898 2147483649ULL,
899 9223372039002292353ULL,
900 9223372036854808585ULL,
901 138ULL,
902 136ULL,
903 2147516425ULL,
904 2147483658ULL,
905 2147516555ULL,
906 9223372036854775947ULL,
907 9223372036854808713ULL,
908 9223372036854808579ULL,
909 9223372036854808578ULL,
910 9223372036854775936ULL,
911 32778ULL,
912 9223372039002259466ULL,
913 9223372039002292353ULL,
914 9223372036854808704ULL,
915 2147483649ULL,
916 9223372039002292232ULL};
917
918 /**
919 This function found in impl {(libcrux_sha3::traits::internal::KeccakItem<1:
920 usize> for u64)}
921 */
libcrux_sha3_portable_keccak_zero_5a(void)922 static KRML_MUSTINLINE uint64_t libcrux_sha3_portable_keccak_zero_5a(void) {
923 return 0ULL;
924 }
925
libcrux_sha3_portable_keccak__veor5q_u64(uint64_t a,uint64_t b,uint64_t c,uint64_t d,uint64_t e)926 static KRML_MUSTINLINE uint64_t libcrux_sha3_portable_keccak__veor5q_u64(
927 uint64_t a, uint64_t b, uint64_t c, uint64_t d, uint64_t e) {
928 uint64_t ab = a ^ b;
929 uint64_t cd = c ^ d;
930 uint64_t abcd = ab ^ cd;
931 return abcd ^ e;
932 }
933
934 /**
935 This function found in impl {(libcrux_sha3::traits::internal::KeccakItem<1:
936 usize> for u64)}
937 */
libcrux_sha3_portable_keccak_xor5_5a(uint64_t a,uint64_t b,uint64_t c,uint64_t d,uint64_t e)938 static KRML_MUSTINLINE uint64_t libcrux_sha3_portable_keccak_xor5_5a(
939 uint64_t a, uint64_t b, uint64_t c, uint64_t d, uint64_t e) {
940 return libcrux_sha3_portable_keccak__veor5q_u64(a, b, c, d, e);
941 }
942
943 /**
944 A monomorphic instance of libcrux_sha3.portable_keccak.rotate_left
945 with const generics
946 - LEFT= 1
947 - RIGHT= 63
948 */
949 static KRML_MUSTINLINE uint64_t
libcrux_sha3_portable_keccak_rotate_left_cb(uint64_t x)950 libcrux_sha3_portable_keccak_rotate_left_cb(uint64_t x) {
951 return x << (uint32_t)(int32_t)1 | x >> (uint32_t)(int32_t)63;
952 }
953
954 static KRML_MUSTINLINE uint64_t
libcrux_sha3_portable_keccak__vrax1q_u64(uint64_t a,uint64_t b)955 libcrux_sha3_portable_keccak__vrax1q_u64(uint64_t a, uint64_t b) {
956 uint64_t uu____0 = a;
957 return uu____0 ^ libcrux_sha3_portable_keccak_rotate_left_cb(b);
958 }
959
960 /**
961 This function found in impl {(libcrux_sha3::traits::internal::KeccakItem<1:
962 usize> for u64)}
963 */
964 static KRML_MUSTINLINE uint64_t
libcrux_sha3_portable_keccak_rotate_left1_and_xor_5a(uint64_t a,uint64_t b)965 libcrux_sha3_portable_keccak_rotate_left1_and_xor_5a(uint64_t a, uint64_t b) {
966 return libcrux_sha3_portable_keccak__vrax1q_u64(a, b);
967 }
968
969 static KRML_MUSTINLINE uint64_t
libcrux_sha3_portable_keccak__vbcaxq_u64(uint64_t a,uint64_t b,uint64_t c)970 libcrux_sha3_portable_keccak__vbcaxq_u64(uint64_t a, uint64_t b, uint64_t c) {
971 return a ^ (b & ~c);
972 }
973
974 /**
975 This function found in impl {(libcrux_sha3::traits::internal::KeccakItem<1:
976 usize> for u64)}
977 */
libcrux_sha3_portable_keccak_and_not_xor_5a(uint64_t a,uint64_t b,uint64_t c)978 static KRML_MUSTINLINE uint64_t libcrux_sha3_portable_keccak_and_not_xor_5a(
979 uint64_t a, uint64_t b, uint64_t c) {
980 return libcrux_sha3_portable_keccak__vbcaxq_u64(a, b, c);
981 }
982
983 static KRML_MUSTINLINE uint64_t
libcrux_sha3_portable_keccak__veorq_n_u64(uint64_t a,uint64_t c)984 libcrux_sha3_portable_keccak__veorq_n_u64(uint64_t a, uint64_t c) {
985 return a ^ c;
986 }
987
988 /**
989 This function found in impl {(libcrux_sha3::traits::internal::KeccakItem<1:
990 usize> for u64)}
991 */
992 static KRML_MUSTINLINE uint64_t
libcrux_sha3_portable_keccak_xor_constant_5a(uint64_t a,uint64_t c)993 libcrux_sha3_portable_keccak_xor_constant_5a(uint64_t a, uint64_t c) {
994 return libcrux_sha3_portable_keccak__veorq_n_u64(a, c);
995 }
996
997 /**
998 This function found in impl {(libcrux_sha3::traits::internal::KeccakItem<1:
999 usize> for u64)}
1000 */
1001 static KRML_MUSTINLINE uint64_t
libcrux_sha3_portable_keccak_xor_5a(uint64_t a,uint64_t b)1002 libcrux_sha3_portable_keccak_xor_5a(uint64_t a, uint64_t b) {
1003 return a ^ b;
1004 }
1005
libcrux_sha3_portable_keccak_slice_1(Eurydice_slice a[1U],size_t start,size_t len,Eurydice_slice ret[1U])1006 static KRML_MUSTINLINE void libcrux_sha3_portable_keccak_slice_1(
1007 Eurydice_slice a[1U], size_t start, size_t len, Eurydice_slice ret[1U]) {
1008 ret[0U] = Eurydice_slice_subslice2(a[0U], start, start + len, uint8_t);
1009 }
1010
1011 /**
1012 This function found in impl {(libcrux_sha3::traits::internal::KeccakItem<1:
1013 usize> for u64)}
1014 */
libcrux_sha3_portable_keccak_slice_n_5a(Eurydice_slice a[1U],size_t start,size_t len,Eurydice_slice ret[1U])1015 static KRML_MUSTINLINE void libcrux_sha3_portable_keccak_slice_n_5a(
1016 Eurydice_slice a[1U], size_t start, size_t len, Eurydice_slice ret[1U]) {
1017 /* Passing arrays by value in Rust generates a copy in C */
1018 Eurydice_slice copy_of_a[1U];
1019 memcpy(copy_of_a, a, (size_t)1U * sizeof(Eurydice_slice));
1020 Eurydice_slice ret0[1U];
1021 libcrux_sha3_portable_keccak_slice_1(copy_of_a, start, len, ret0);
1022 memcpy(ret, ret0, (size_t)1U * sizeof(Eurydice_slice));
1023 }
1024
1025 static KRML_MUSTINLINE Eurydice_slice_uint8_t_1size_t__x2
libcrux_sha3_portable_keccak_split_at_mut_1(Eurydice_slice out[1U],size_t mid)1026 libcrux_sha3_portable_keccak_split_at_mut_1(Eurydice_slice out[1U],
1027 size_t mid) {
1028 Eurydice_slice_uint8_t_x2 uu____0 = Eurydice_slice_split_at_mut(
1029 out[0U], mid, uint8_t, Eurydice_slice_uint8_t_x2);
1030 Eurydice_slice out00 = uu____0.fst;
1031 Eurydice_slice out01 = uu____0.snd;
1032 Eurydice_slice_uint8_t_1size_t__x2 lit;
1033 lit.fst[0U] = out00;
1034 lit.snd[0U] = out01;
1035 return lit;
1036 }
1037
1038 /**
1039 This function found in impl {(libcrux_sha3::traits::internal::KeccakItem<1:
1040 usize> for u64)}
1041 */
1042 static KRML_MUSTINLINE Eurydice_slice_uint8_t_1size_t__x2
libcrux_sha3_portable_keccak_split_at_mut_n_5a(Eurydice_slice a[1U],size_t mid)1043 libcrux_sha3_portable_keccak_split_at_mut_n_5a(Eurydice_slice a[1U],
1044 size_t mid) {
1045 return libcrux_sha3_portable_keccak_split_at_mut_1(a, mid);
1046 }
1047
1048 /**
1049 A monomorphic instance of libcrux_sha3.generic_keccak.KeccakState
1050 with types uint64_t
1051 with const generics
1052 - $1size_t
1053 */
1054 typedef struct libcrux_sha3_generic_keccak_KeccakState_48_s {
1055 uint64_t st[5U][5U];
1056 } libcrux_sha3_generic_keccak_KeccakState_48;
1057
1058 /**
1059 Create a new Shake128 x4 state.
1060 */
1061 /**
1062 This function found in impl {libcrux_sha3::generic_keccak::KeccakState<T,
1063 N>[TraitClause@0]#1}
1064 */
1065 /**
1066 A monomorphic instance of libcrux_sha3.generic_keccak.new_1e
1067 with types uint64_t
1068 with const generics
1069 - N= 1
1070 */
1071 static KRML_MUSTINLINE libcrux_sha3_generic_keccak_KeccakState_48
libcrux_sha3_generic_keccak_new_1e_f4(void)1072 libcrux_sha3_generic_keccak_new_1e_f4(void) {
1073 libcrux_sha3_generic_keccak_KeccakState_48 lit;
1074 lit.st[0U][0U] = libcrux_sha3_portable_keccak_zero_5a();
1075 lit.st[0U][1U] = libcrux_sha3_portable_keccak_zero_5a();
1076 lit.st[0U][2U] = libcrux_sha3_portable_keccak_zero_5a();
1077 lit.st[0U][3U] = libcrux_sha3_portable_keccak_zero_5a();
1078 lit.st[0U][4U] = libcrux_sha3_portable_keccak_zero_5a();
1079 lit.st[1U][0U] = libcrux_sha3_portable_keccak_zero_5a();
1080 lit.st[1U][1U] = libcrux_sha3_portable_keccak_zero_5a();
1081 lit.st[1U][2U] = libcrux_sha3_portable_keccak_zero_5a();
1082 lit.st[1U][3U] = libcrux_sha3_portable_keccak_zero_5a();
1083 lit.st[1U][4U] = libcrux_sha3_portable_keccak_zero_5a();
1084 lit.st[2U][0U] = libcrux_sha3_portable_keccak_zero_5a();
1085 lit.st[2U][1U] = libcrux_sha3_portable_keccak_zero_5a();
1086 lit.st[2U][2U] = libcrux_sha3_portable_keccak_zero_5a();
1087 lit.st[2U][3U] = libcrux_sha3_portable_keccak_zero_5a();
1088 lit.st[2U][4U] = libcrux_sha3_portable_keccak_zero_5a();
1089 lit.st[3U][0U] = libcrux_sha3_portable_keccak_zero_5a();
1090 lit.st[3U][1U] = libcrux_sha3_portable_keccak_zero_5a();
1091 lit.st[3U][2U] = libcrux_sha3_portable_keccak_zero_5a();
1092 lit.st[3U][3U] = libcrux_sha3_portable_keccak_zero_5a();
1093 lit.st[3U][4U] = libcrux_sha3_portable_keccak_zero_5a();
1094 lit.st[4U][0U] = libcrux_sha3_portable_keccak_zero_5a();
1095 lit.st[4U][1U] = libcrux_sha3_portable_keccak_zero_5a();
1096 lit.st[4U][2U] = libcrux_sha3_portable_keccak_zero_5a();
1097 lit.st[4U][3U] = libcrux_sha3_portable_keccak_zero_5a();
1098 lit.st[4U][4U] = libcrux_sha3_portable_keccak_zero_5a();
1099 return lit;
1100 }
1101
1102 /**
1103 A monomorphic instance of libcrux_sha3.portable_keccak.load_block
1104 with const generics
1105 - RATE= 72
1106 */
libcrux_sha3_portable_keccak_load_block_2c(uint64_t (* s)[5U],Eurydice_slice blocks[1U])1107 static KRML_MUSTINLINE void libcrux_sha3_portable_keccak_load_block_2c(
1108 uint64_t (*s)[5U], Eurydice_slice blocks[1U]) {
1109 for (size_t i = (size_t)0U; i < (size_t)72U / (size_t)8U; i++) {
1110 size_t i0 = i;
1111 uint8_t uu____0[8U];
1112 Result_56 dst;
1113 Eurydice_slice_to_array2(
1114 &dst,
1115 Eurydice_slice_subslice2(blocks[0U], (size_t)8U * i0,
1116 (size_t)8U * i0 + (size_t)8U, uint8_t),
1117 Eurydice_slice, uint8_t[8U]);
1118 unwrap_41_ac(dst, uu____0);
1119 size_t uu____1 = i0 / (size_t)5U;
1120 size_t uu____2 = i0 % (size_t)5U;
1121 s[uu____1][uu____2] =
1122 s[uu____1][uu____2] ^ core_num__u64_9__from_le_bytes(uu____0);
1123 }
1124 }
1125
1126 /**
1127 This function found in impl {(libcrux_sha3::traits::internal::KeccakItem<1:
1128 usize> for u64)}
1129 */
1130 /**
1131 A monomorphic instance of libcrux_sha3.portable_keccak.load_block_5a
1132 with const generics
1133 - RATE= 72
1134 */
libcrux_sha3_portable_keccak_load_block_5a_b8(uint64_t (* a)[5U],Eurydice_slice b[1U])1135 static KRML_MUSTINLINE void libcrux_sha3_portable_keccak_load_block_5a_b8(
1136 uint64_t (*a)[5U], Eurydice_slice b[1U]) {
1137 uint64_t(*uu____0)[5U] = a;
1138 /* Passing arrays by value in Rust generates a copy in C */
1139 Eurydice_slice copy_of_b[1U];
1140 memcpy(copy_of_b, b, (size_t)1U * sizeof(Eurydice_slice));
1141 libcrux_sha3_portable_keccak_load_block_2c(uu____0, copy_of_b);
1142 }
1143
1144 /**
1145 A monomorphic instance of libcrux_sha3.portable_keccak.rotate_left
1146 with const generics
1147 - LEFT= 36
1148 - RIGHT= 28
1149 */
1150 static KRML_MUSTINLINE uint64_t
libcrux_sha3_portable_keccak_rotate_left_cb0(uint64_t x)1151 libcrux_sha3_portable_keccak_rotate_left_cb0(uint64_t x) {
1152 return x << (uint32_t)(int32_t)36 | x >> (uint32_t)(int32_t)28;
1153 }
1154
1155 /**
1156 A monomorphic instance of libcrux_sha3.portable_keccak._vxarq_u64
1157 with const generics
1158 - LEFT= 36
1159 - RIGHT= 28
1160 */
1161 static KRML_MUSTINLINE uint64_t
libcrux_sha3_portable_keccak__vxarq_u64_42(uint64_t a,uint64_t b)1162 libcrux_sha3_portable_keccak__vxarq_u64_42(uint64_t a, uint64_t b) {
1163 uint64_t ab = a ^ b;
1164 return libcrux_sha3_portable_keccak_rotate_left_cb0(ab);
1165 }
1166
1167 /**
1168 This function found in impl {(libcrux_sha3::traits::internal::KeccakItem<1:
1169 usize> for u64)}
1170 */
1171 /**
1172 A monomorphic instance of libcrux_sha3.portable_keccak.xor_and_rotate_5a
1173 with const generics
1174 - LEFT= 36
1175 - RIGHT= 28
1176 */
1177 static KRML_MUSTINLINE uint64_t
libcrux_sha3_portable_keccak_xor_and_rotate_5a_bb(uint64_t a,uint64_t b)1178 libcrux_sha3_portable_keccak_xor_and_rotate_5a_bb(uint64_t a, uint64_t b) {
1179 return libcrux_sha3_portable_keccak__vxarq_u64_42(a, b);
1180 }
1181
1182 /**
1183 A monomorphic instance of libcrux_sha3.portable_keccak.rotate_left
1184 with const generics
1185 - LEFT= 3
1186 - RIGHT= 61
1187 */
1188 static KRML_MUSTINLINE uint64_t
libcrux_sha3_portable_keccak_rotate_left_cb1(uint64_t x)1189 libcrux_sha3_portable_keccak_rotate_left_cb1(uint64_t x) {
1190 return x << (uint32_t)(int32_t)3 | x >> (uint32_t)(int32_t)61;
1191 }
1192
1193 /**
1194 A monomorphic instance of libcrux_sha3.portable_keccak._vxarq_u64
1195 with const generics
1196 - LEFT= 3
1197 - RIGHT= 61
1198 */
1199 static KRML_MUSTINLINE uint64_t
libcrux_sha3_portable_keccak__vxarq_u64_420(uint64_t a,uint64_t b)1200 libcrux_sha3_portable_keccak__vxarq_u64_420(uint64_t a, uint64_t b) {
1201 uint64_t ab = a ^ b;
1202 return libcrux_sha3_portable_keccak_rotate_left_cb1(ab);
1203 }
1204
1205 /**
1206 This function found in impl {(libcrux_sha3::traits::internal::KeccakItem<1:
1207 usize> for u64)}
1208 */
1209 /**
1210 A monomorphic instance of libcrux_sha3.portable_keccak.xor_and_rotate_5a
1211 with const generics
1212 - LEFT= 3
1213 - RIGHT= 61
1214 */
1215 static KRML_MUSTINLINE uint64_t
libcrux_sha3_portable_keccak_xor_and_rotate_5a_bb0(uint64_t a,uint64_t b)1216 libcrux_sha3_portable_keccak_xor_and_rotate_5a_bb0(uint64_t a, uint64_t b) {
1217 return libcrux_sha3_portable_keccak__vxarq_u64_420(a, b);
1218 }
1219
1220 /**
1221 A monomorphic instance of libcrux_sha3.portable_keccak.rotate_left
1222 with const generics
1223 - LEFT= 41
1224 - RIGHT= 23
1225 */
1226 static KRML_MUSTINLINE uint64_t
libcrux_sha3_portable_keccak_rotate_left_cb2(uint64_t x)1227 libcrux_sha3_portable_keccak_rotate_left_cb2(uint64_t x) {
1228 return x << (uint32_t)(int32_t)41 | x >> (uint32_t)(int32_t)23;
1229 }
1230
1231 /**
1232 A monomorphic instance of libcrux_sha3.portable_keccak._vxarq_u64
1233 with const generics
1234 - LEFT= 41
1235 - RIGHT= 23
1236 */
1237 static KRML_MUSTINLINE uint64_t
libcrux_sha3_portable_keccak__vxarq_u64_421(uint64_t a,uint64_t b)1238 libcrux_sha3_portable_keccak__vxarq_u64_421(uint64_t a, uint64_t b) {
1239 uint64_t ab = a ^ b;
1240 return libcrux_sha3_portable_keccak_rotate_left_cb2(ab);
1241 }
1242
1243 /**
1244 This function found in impl {(libcrux_sha3::traits::internal::KeccakItem<1:
1245 usize> for u64)}
1246 */
1247 /**
1248 A monomorphic instance of libcrux_sha3.portable_keccak.xor_and_rotate_5a
1249 with const generics
1250 - LEFT= 41
1251 - RIGHT= 23
1252 */
1253 static KRML_MUSTINLINE uint64_t
libcrux_sha3_portable_keccak_xor_and_rotate_5a_bb1(uint64_t a,uint64_t b)1254 libcrux_sha3_portable_keccak_xor_and_rotate_5a_bb1(uint64_t a, uint64_t b) {
1255 return libcrux_sha3_portable_keccak__vxarq_u64_421(a, b);
1256 }
1257
1258 /**
1259 A monomorphic instance of libcrux_sha3.portable_keccak.rotate_left
1260 with const generics
1261 - LEFT= 18
1262 - RIGHT= 46
1263 */
1264 static KRML_MUSTINLINE uint64_t
libcrux_sha3_portable_keccak_rotate_left_cb3(uint64_t x)1265 libcrux_sha3_portable_keccak_rotate_left_cb3(uint64_t x) {
1266 return x << (uint32_t)(int32_t)18 | x >> (uint32_t)(int32_t)46;
1267 }
1268
1269 /**
1270 A monomorphic instance of libcrux_sha3.portable_keccak._vxarq_u64
1271 with const generics
1272 - LEFT= 18
1273 - RIGHT= 46
1274 */
1275 static KRML_MUSTINLINE uint64_t
libcrux_sha3_portable_keccak__vxarq_u64_422(uint64_t a,uint64_t b)1276 libcrux_sha3_portable_keccak__vxarq_u64_422(uint64_t a, uint64_t b) {
1277 uint64_t ab = a ^ b;
1278 return libcrux_sha3_portable_keccak_rotate_left_cb3(ab);
1279 }
1280
1281 /**
1282 This function found in impl {(libcrux_sha3::traits::internal::KeccakItem<1:
1283 usize> for u64)}
1284 */
1285 /**
1286 A monomorphic instance of libcrux_sha3.portable_keccak.xor_and_rotate_5a
1287 with const generics
1288 - LEFT= 18
1289 - RIGHT= 46
1290 */
1291 static KRML_MUSTINLINE uint64_t
libcrux_sha3_portable_keccak_xor_and_rotate_5a_bb2(uint64_t a,uint64_t b)1292 libcrux_sha3_portable_keccak_xor_and_rotate_5a_bb2(uint64_t a, uint64_t b) {
1293 return libcrux_sha3_portable_keccak__vxarq_u64_422(a, b);
1294 }
1295
1296 /**
1297 A monomorphic instance of libcrux_sha3.portable_keccak._vxarq_u64
1298 with const generics
1299 - LEFT= 1
1300 - RIGHT= 63
1301 */
1302 static KRML_MUSTINLINE uint64_t
libcrux_sha3_portable_keccak__vxarq_u64_423(uint64_t a,uint64_t b)1303 libcrux_sha3_portable_keccak__vxarq_u64_423(uint64_t a, uint64_t b) {
1304 uint64_t ab = a ^ b;
1305 return libcrux_sha3_portable_keccak_rotate_left_cb(ab);
1306 }
1307
1308 /**
1309 This function found in impl {(libcrux_sha3::traits::internal::KeccakItem<1:
1310 usize> for u64)}
1311 */
1312 /**
1313 A monomorphic instance of libcrux_sha3.portable_keccak.xor_and_rotate_5a
1314 with const generics
1315 - LEFT= 1
1316 - RIGHT= 63
1317 */
1318 static KRML_MUSTINLINE uint64_t
libcrux_sha3_portable_keccak_xor_and_rotate_5a_bb3(uint64_t a,uint64_t b)1319 libcrux_sha3_portable_keccak_xor_and_rotate_5a_bb3(uint64_t a, uint64_t b) {
1320 return libcrux_sha3_portable_keccak__vxarq_u64_423(a, b);
1321 }
1322
1323 /**
1324 A monomorphic instance of libcrux_sha3.portable_keccak.rotate_left
1325 with const generics
1326 - LEFT= 44
1327 - RIGHT= 20
1328 */
1329 static KRML_MUSTINLINE uint64_t
libcrux_sha3_portable_keccak_rotate_left_cb4(uint64_t x)1330 libcrux_sha3_portable_keccak_rotate_left_cb4(uint64_t x) {
1331 return x << (uint32_t)(int32_t)44 | x >> (uint32_t)(int32_t)20;
1332 }
1333
1334 /**
1335 A monomorphic instance of libcrux_sha3.portable_keccak._vxarq_u64
1336 with const generics
1337 - LEFT= 44
1338 - RIGHT= 20
1339 */
1340 static KRML_MUSTINLINE uint64_t
libcrux_sha3_portable_keccak__vxarq_u64_424(uint64_t a,uint64_t b)1341 libcrux_sha3_portable_keccak__vxarq_u64_424(uint64_t a, uint64_t b) {
1342 uint64_t ab = a ^ b;
1343 return libcrux_sha3_portable_keccak_rotate_left_cb4(ab);
1344 }
1345
1346 /**
1347 This function found in impl {(libcrux_sha3::traits::internal::KeccakItem<1:
1348 usize> for u64)}
1349 */
1350 /**
1351 A monomorphic instance of libcrux_sha3.portable_keccak.xor_and_rotate_5a
1352 with const generics
1353 - LEFT= 44
1354 - RIGHT= 20
1355 */
1356 static KRML_MUSTINLINE uint64_t
libcrux_sha3_portable_keccak_xor_and_rotate_5a_bb4(uint64_t a,uint64_t b)1357 libcrux_sha3_portable_keccak_xor_and_rotate_5a_bb4(uint64_t a, uint64_t b) {
1358 return libcrux_sha3_portable_keccak__vxarq_u64_424(a, b);
1359 }
1360
1361 /**
1362 A monomorphic instance of libcrux_sha3.portable_keccak.rotate_left
1363 with const generics
1364 - LEFT= 10
1365 - RIGHT= 54
1366 */
1367 static KRML_MUSTINLINE uint64_t
libcrux_sha3_portable_keccak_rotate_left_cb5(uint64_t x)1368 libcrux_sha3_portable_keccak_rotate_left_cb5(uint64_t x) {
1369 return x << (uint32_t)(int32_t)10 | x >> (uint32_t)(int32_t)54;
1370 }
1371
1372 /**
1373 A monomorphic instance of libcrux_sha3.portable_keccak._vxarq_u64
1374 with const generics
1375 - LEFT= 10
1376 - RIGHT= 54
1377 */
1378 static KRML_MUSTINLINE uint64_t
libcrux_sha3_portable_keccak__vxarq_u64_425(uint64_t a,uint64_t b)1379 libcrux_sha3_portable_keccak__vxarq_u64_425(uint64_t a, uint64_t b) {
1380 uint64_t ab = a ^ b;
1381 return libcrux_sha3_portable_keccak_rotate_left_cb5(ab);
1382 }
1383
1384 /**
1385 This function found in impl {(libcrux_sha3::traits::internal::KeccakItem<1:
1386 usize> for u64)}
1387 */
1388 /**
1389 A monomorphic instance of libcrux_sha3.portable_keccak.xor_and_rotate_5a
1390 with const generics
1391 - LEFT= 10
1392 - RIGHT= 54
1393 */
1394 static KRML_MUSTINLINE uint64_t
libcrux_sha3_portable_keccak_xor_and_rotate_5a_bb5(uint64_t a,uint64_t b)1395 libcrux_sha3_portable_keccak_xor_and_rotate_5a_bb5(uint64_t a, uint64_t b) {
1396 return libcrux_sha3_portable_keccak__vxarq_u64_425(a, b);
1397 }
1398
1399 /**
1400 A monomorphic instance of libcrux_sha3.portable_keccak.rotate_left
1401 with const generics
1402 - LEFT= 45
1403 - RIGHT= 19
1404 */
1405 static KRML_MUSTINLINE uint64_t
libcrux_sha3_portable_keccak_rotate_left_cb6(uint64_t x)1406 libcrux_sha3_portable_keccak_rotate_left_cb6(uint64_t x) {
1407 return x << (uint32_t)(int32_t)45 | x >> (uint32_t)(int32_t)19;
1408 }
1409
1410 /**
1411 A monomorphic instance of libcrux_sha3.portable_keccak._vxarq_u64
1412 with const generics
1413 - LEFT= 45
1414 - RIGHT= 19
1415 */
1416 static KRML_MUSTINLINE uint64_t
libcrux_sha3_portable_keccak__vxarq_u64_426(uint64_t a,uint64_t b)1417 libcrux_sha3_portable_keccak__vxarq_u64_426(uint64_t a, uint64_t b) {
1418 uint64_t ab = a ^ b;
1419 return libcrux_sha3_portable_keccak_rotate_left_cb6(ab);
1420 }
1421
1422 /**
1423 This function found in impl {(libcrux_sha3::traits::internal::KeccakItem<1:
1424 usize> for u64)}
1425 */
1426 /**
1427 A monomorphic instance of libcrux_sha3.portable_keccak.xor_and_rotate_5a
1428 with const generics
1429 - LEFT= 45
1430 - RIGHT= 19
1431 */
1432 static KRML_MUSTINLINE uint64_t
libcrux_sha3_portable_keccak_xor_and_rotate_5a_bb6(uint64_t a,uint64_t b)1433 libcrux_sha3_portable_keccak_xor_and_rotate_5a_bb6(uint64_t a, uint64_t b) {
1434 return libcrux_sha3_portable_keccak__vxarq_u64_426(a, b);
1435 }
1436
1437 /**
1438 A monomorphic instance of libcrux_sha3.portable_keccak.rotate_left
1439 with const generics
1440 - LEFT= 2
1441 - RIGHT= 62
1442 */
1443 static KRML_MUSTINLINE uint64_t
libcrux_sha3_portable_keccak_rotate_left_cb7(uint64_t x)1444 libcrux_sha3_portable_keccak_rotate_left_cb7(uint64_t x) {
1445 return x << (uint32_t)(int32_t)2 | x >> (uint32_t)(int32_t)62;
1446 }
1447
1448 /**
1449 A monomorphic instance of libcrux_sha3.portable_keccak._vxarq_u64
1450 with const generics
1451 - LEFT= 2
1452 - RIGHT= 62
1453 */
1454 static KRML_MUSTINLINE uint64_t
libcrux_sha3_portable_keccak__vxarq_u64_427(uint64_t a,uint64_t b)1455 libcrux_sha3_portable_keccak__vxarq_u64_427(uint64_t a, uint64_t b) {
1456 uint64_t ab = a ^ b;
1457 return libcrux_sha3_portable_keccak_rotate_left_cb7(ab);
1458 }
1459
1460 /**
1461 This function found in impl {(libcrux_sha3::traits::internal::KeccakItem<1:
1462 usize> for u64)}
1463 */
1464 /**
1465 A monomorphic instance of libcrux_sha3.portable_keccak.xor_and_rotate_5a
1466 with const generics
1467 - LEFT= 2
1468 - RIGHT= 62
1469 */
1470 static KRML_MUSTINLINE uint64_t
libcrux_sha3_portable_keccak_xor_and_rotate_5a_bb7(uint64_t a,uint64_t b)1471 libcrux_sha3_portable_keccak_xor_and_rotate_5a_bb7(uint64_t a, uint64_t b) {
1472 return libcrux_sha3_portable_keccak__vxarq_u64_427(a, b);
1473 }
1474
1475 /**
1476 A monomorphic instance of libcrux_sha3.portable_keccak.rotate_left
1477 with const generics
1478 - LEFT= 62
1479 - RIGHT= 2
1480 */
1481 static KRML_MUSTINLINE uint64_t
libcrux_sha3_portable_keccak_rotate_left_cb8(uint64_t x)1482 libcrux_sha3_portable_keccak_rotate_left_cb8(uint64_t x) {
1483 return x << (uint32_t)(int32_t)62 | x >> (uint32_t)(int32_t)2;
1484 }
1485
1486 /**
1487 A monomorphic instance of libcrux_sha3.portable_keccak._vxarq_u64
1488 with const generics
1489 - LEFT= 62
1490 - RIGHT= 2
1491 */
1492 static KRML_MUSTINLINE uint64_t
libcrux_sha3_portable_keccak__vxarq_u64_428(uint64_t a,uint64_t b)1493 libcrux_sha3_portable_keccak__vxarq_u64_428(uint64_t a, uint64_t b) {
1494 uint64_t ab = a ^ b;
1495 return libcrux_sha3_portable_keccak_rotate_left_cb8(ab);
1496 }
1497
1498 /**
1499 This function found in impl {(libcrux_sha3::traits::internal::KeccakItem<1:
1500 usize> for u64)}
1501 */
1502 /**
1503 A monomorphic instance of libcrux_sha3.portable_keccak.xor_and_rotate_5a
1504 with const generics
1505 - LEFT= 62
1506 - RIGHT= 2
1507 */
1508 static KRML_MUSTINLINE uint64_t
libcrux_sha3_portable_keccak_xor_and_rotate_5a_bb8(uint64_t a,uint64_t b)1509 libcrux_sha3_portable_keccak_xor_and_rotate_5a_bb8(uint64_t a, uint64_t b) {
1510 return libcrux_sha3_portable_keccak__vxarq_u64_428(a, b);
1511 }
1512
1513 /**
1514 A monomorphic instance of libcrux_sha3.portable_keccak.rotate_left
1515 with const generics
1516 - LEFT= 6
1517 - RIGHT= 58
1518 */
1519 static KRML_MUSTINLINE uint64_t
libcrux_sha3_portable_keccak_rotate_left_cb9(uint64_t x)1520 libcrux_sha3_portable_keccak_rotate_left_cb9(uint64_t x) {
1521 return x << (uint32_t)(int32_t)6 | x >> (uint32_t)(int32_t)58;
1522 }
1523
1524 /**
1525 A monomorphic instance of libcrux_sha3.portable_keccak._vxarq_u64
1526 with const generics
1527 - LEFT= 6
1528 - RIGHT= 58
1529 */
1530 static KRML_MUSTINLINE uint64_t
libcrux_sha3_portable_keccak__vxarq_u64_429(uint64_t a,uint64_t b)1531 libcrux_sha3_portable_keccak__vxarq_u64_429(uint64_t a, uint64_t b) {
1532 uint64_t ab = a ^ b;
1533 return libcrux_sha3_portable_keccak_rotate_left_cb9(ab);
1534 }
1535
1536 /**
1537 This function found in impl {(libcrux_sha3::traits::internal::KeccakItem<1:
1538 usize> for u64)}
1539 */
1540 /**
1541 A monomorphic instance of libcrux_sha3.portable_keccak.xor_and_rotate_5a
1542 with const generics
1543 - LEFT= 6
1544 - RIGHT= 58
1545 */
1546 static KRML_MUSTINLINE uint64_t
libcrux_sha3_portable_keccak_xor_and_rotate_5a_bb9(uint64_t a,uint64_t b)1547 libcrux_sha3_portable_keccak_xor_and_rotate_5a_bb9(uint64_t a, uint64_t b) {
1548 return libcrux_sha3_portable_keccak__vxarq_u64_429(a, b);
1549 }
1550
1551 /**
1552 A monomorphic instance of libcrux_sha3.portable_keccak.rotate_left
1553 with const generics
1554 - LEFT= 43
1555 - RIGHT= 21
1556 */
1557 static KRML_MUSTINLINE uint64_t
libcrux_sha3_portable_keccak_rotate_left_cb10(uint64_t x)1558 libcrux_sha3_portable_keccak_rotate_left_cb10(uint64_t x) {
1559 return x << (uint32_t)(int32_t)43 | x >> (uint32_t)(int32_t)21;
1560 }
1561
1562 /**
1563 A monomorphic instance of libcrux_sha3.portable_keccak._vxarq_u64
1564 with const generics
1565 - LEFT= 43
1566 - RIGHT= 21
1567 */
1568 static KRML_MUSTINLINE uint64_t
libcrux_sha3_portable_keccak__vxarq_u64_4210(uint64_t a,uint64_t b)1569 libcrux_sha3_portable_keccak__vxarq_u64_4210(uint64_t a, uint64_t b) {
1570 uint64_t ab = a ^ b;
1571 return libcrux_sha3_portable_keccak_rotate_left_cb10(ab);
1572 }
1573
1574 /**
1575 This function found in impl {(libcrux_sha3::traits::internal::KeccakItem<1:
1576 usize> for u64)}
1577 */
1578 /**
1579 A monomorphic instance of libcrux_sha3.portable_keccak.xor_and_rotate_5a
1580 with const generics
1581 - LEFT= 43
1582 - RIGHT= 21
1583 */
1584 static KRML_MUSTINLINE uint64_t
libcrux_sha3_portable_keccak_xor_and_rotate_5a_bb10(uint64_t a,uint64_t b)1585 libcrux_sha3_portable_keccak_xor_and_rotate_5a_bb10(uint64_t a, uint64_t b) {
1586 return libcrux_sha3_portable_keccak__vxarq_u64_4210(a, b);
1587 }
1588
1589 /**
1590 A monomorphic instance of libcrux_sha3.portable_keccak.rotate_left
1591 with const generics
1592 - LEFT= 15
1593 - RIGHT= 49
1594 */
1595 static KRML_MUSTINLINE uint64_t
libcrux_sha3_portable_keccak_rotate_left_cb11(uint64_t x)1596 libcrux_sha3_portable_keccak_rotate_left_cb11(uint64_t x) {
1597 return x << (uint32_t)(int32_t)15 | x >> (uint32_t)(int32_t)49;
1598 }
1599
1600 /**
1601 A monomorphic instance of libcrux_sha3.portable_keccak._vxarq_u64
1602 with const generics
1603 - LEFT= 15
1604 - RIGHT= 49
1605 */
1606 static KRML_MUSTINLINE uint64_t
libcrux_sha3_portable_keccak__vxarq_u64_4211(uint64_t a,uint64_t b)1607 libcrux_sha3_portable_keccak__vxarq_u64_4211(uint64_t a, uint64_t b) {
1608 uint64_t ab = a ^ b;
1609 return libcrux_sha3_portable_keccak_rotate_left_cb11(ab);
1610 }
1611
1612 /**
1613 This function found in impl {(libcrux_sha3::traits::internal::KeccakItem<1:
1614 usize> for u64)}
1615 */
1616 /**
1617 A monomorphic instance of libcrux_sha3.portable_keccak.xor_and_rotate_5a
1618 with const generics
1619 - LEFT= 15
1620 - RIGHT= 49
1621 */
1622 static KRML_MUSTINLINE uint64_t
libcrux_sha3_portable_keccak_xor_and_rotate_5a_bb11(uint64_t a,uint64_t b)1623 libcrux_sha3_portable_keccak_xor_and_rotate_5a_bb11(uint64_t a, uint64_t b) {
1624 return libcrux_sha3_portable_keccak__vxarq_u64_4211(a, b);
1625 }
1626
1627 /**
1628 A monomorphic instance of libcrux_sha3.portable_keccak.rotate_left
1629 with const generics
1630 - LEFT= 61
1631 - RIGHT= 3
1632 */
1633 static KRML_MUSTINLINE uint64_t
libcrux_sha3_portable_keccak_rotate_left_cb12(uint64_t x)1634 libcrux_sha3_portable_keccak_rotate_left_cb12(uint64_t x) {
1635 return x << (uint32_t)(int32_t)61 | x >> (uint32_t)(int32_t)3;
1636 }
1637
1638 /**
1639 A monomorphic instance of libcrux_sha3.portable_keccak._vxarq_u64
1640 with const generics
1641 - LEFT= 61
1642 - RIGHT= 3
1643 */
1644 static KRML_MUSTINLINE uint64_t
libcrux_sha3_portable_keccak__vxarq_u64_4212(uint64_t a,uint64_t b)1645 libcrux_sha3_portable_keccak__vxarq_u64_4212(uint64_t a, uint64_t b) {
1646 uint64_t ab = a ^ b;
1647 return libcrux_sha3_portable_keccak_rotate_left_cb12(ab);
1648 }
1649
1650 /**
1651 This function found in impl {(libcrux_sha3::traits::internal::KeccakItem<1:
1652 usize> for u64)}
1653 */
1654 /**
1655 A monomorphic instance of libcrux_sha3.portable_keccak.xor_and_rotate_5a
1656 with const generics
1657 - LEFT= 61
1658 - RIGHT= 3
1659 */
1660 static KRML_MUSTINLINE uint64_t
libcrux_sha3_portable_keccak_xor_and_rotate_5a_bb12(uint64_t a,uint64_t b)1661 libcrux_sha3_portable_keccak_xor_and_rotate_5a_bb12(uint64_t a, uint64_t b) {
1662 return libcrux_sha3_portable_keccak__vxarq_u64_4212(a, b);
1663 }
1664
1665 /**
1666 A monomorphic instance of libcrux_sha3.portable_keccak.rotate_left
1667 with const generics
1668 - LEFT= 28
1669 - RIGHT= 36
1670 */
1671 static KRML_MUSTINLINE uint64_t
libcrux_sha3_portable_keccak_rotate_left_cb13(uint64_t x)1672 libcrux_sha3_portable_keccak_rotate_left_cb13(uint64_t x) {
1673 return x << (uint32_t)(int32_t)28 | x >> (uint32_t)(int32_t)36;
1674 }
1675
1676 /**
1677 A monomorphic instance of libcrux_sha3.portable_keccak._vxarq_u64
1678 with const generics
1679 - LEFT= 28
1680 - RIGHT= 36
1681 */
1682 static KRML_MUSTINLINE uint64_t
libcrux_sha3_portable_keccak__vxarq_u64_4213(uint64_t a,uint64_t b)1683 libcrux_sha3_portable_keccak__vxarq_u64_4213(uint64_t a, uint64_t b) {
1684 uint64_t ab = a ^ b;
1685 return libcrux_sha3_portable_keccak_rotate_left_cb13(ab);
1686 }
1687
1688 /**
1689 This function found in impl {(libcrux_sha3::traits::internal::KeccakItem<1:
1690 usize> for u64)}
1691 */
1692 /**
1693 A monomorphic instance of libcrux_sha3.portable_keccak.xor_and_rotate_5a
1694 with const generics
1695 - LEFT= 28
1696 - RIGHT= 36
1697 */
1698 static KRML_MUSTINLINE uint64_t
libcrux_sha3_portable_keccak_xor_and_rotate_5a_bb13(uint64_t a,uint64_t b)1699 libcrux_sha3_portable_keccak_xor_and_rotate_5a_bb13(uint64_t a, uint64_t b) {
1700 return libcrux_sha3_portable_keccak__vxarq_u64_4213(a, b);
1701 }
1702
1703 /**
1704 A monomorphic instance of libcrux_sha3.portable_keccak.rotate_left
1705 with const generics
1706 - LEFT= 55
1707 - RIGHT= 9
1708 */
1709 static KRML_MUSTINLINE uint64_t
libcrux_sha3_portable_keccak_rotate_left_cb14(uint64_t x)1710 libcrux_sha3_portable_keccak_rotate_left_cb14(uint64_t x) {
1711 return x << (uint32_t)(int32_t)55 | x >> (uint32_t)(int32_t)9;
1712 }
1713
1714 /**
1715 A monomorphic instance of libcrux_sha3.portable_keccak._vxarq_u64
1716 with const generics
1717 - LEFT= 55
1718 - RIGHT= 9
1719 */
1720 static KRML_MUSTINLINE uint64_t
libcrux_sha3_portable_keccak__vxarq_u64_4214(uint64_t a,uint64_t b)1721 libcrux_sha3_portable_keccak__vxarq_u64_4214(uint64_t a, uint64_t b) {
1722 uint64_t ab = a ^ b;
1723 return libcrux_sha3_portable_keccak_rotate_left_cb14(ab);
1724 }
1725
1726 /**
1727 This function found in impl {(libcrux_sha3::traits::internal::KeccakItem<1:
1728 usize> for u64)}
1729 */
1730 /**
1731 A monomorphic instance of libcrux_sha3.portable_keccak.xor_and_rotate_5a
1732 with const generics
1733 - LEFT= 55
1734 - RIGHT= 9
1735 */
1736 static KRML_MUSTINLINE uint64_t
libcrux_sha3_portable_keccak_xor_and_rotate_5a_bb14(uint64_t a,uint64_t b)1737 libcrux_sha3_portable_keccak_xor_and_rotate_5a_bb14(uint64_t a, uint64_t b) {
1738 return libcrux_sha3_portable_keccak__vxarq_u64_4214(a, b);
1739 }
1740
1741 /**
1742 A monomorphic instance of libcrux_sha3.portable_keccak.rotate_left
1743 with const generics
1744 - LEFT= 25
1745 - RIGHT= 39
1746 */
1747 static KRML_MUSTINLINE uint64_t
libcrux_sha3_portable_keccak_rotate_left_cb15(uint64_t x)1748 libcrux_sha3_portable_keccak_rotate_left_cb15(uint64_t x) {
1749 return x << (uint32_t)(int32_t)25 | x >> (uint32_t)(int32_t)39;
1750 }
1751
1752 /**
1753 A monomorphic instance of libcrux_sha3.portable_keccak._vxarq_u64
1754 with const generics
1755 - LEFT= 25
1756 - RIGHT= 39
1757 */
1758 static KRML_MUSTINLINE uint64_t
libcrux_sha3_portable_keccak__vxarq_u64_4215(uint64_t a,uint64_t b)1759 libcrux_sha3_portable_keccak__vxarq_u64_4215(uint64_t a, uint64_t b) {
1760 uint64_t ab = a ^ b;
1761 return libcrux_sha3_portable_keccak_rotate_left_cb15(ab);
1762 }
1763
1764 /**
1765 This function found in impl {(libcrux_sha3::traits::internal::KeccakItem<1:
1766 usize> for u64)}
1767 */
1768 /**
1769 A monomorphic instance of libcrux_sha3.portable_keccak.xor_and_rotate_5a
1770 with const generics
1771 - LEFT= 25
1772 - RIGHT= 39
1773 */
1774 static KRML_MUSTINLINE uint64_t
libcrux_sha3_portable_keccak_xor_and_rotate_5a_bb15(uint64_t a,uint64_t b)1775 libcrux_sha3_portable_keccak_xor_and_rotate_5a_bb15(uint64_t a, uint64_t b) {
1776 return libcrux_sha3_portable_keccak__vxarq_u64_4215(a, b);
1777 }
1778
1779 /**
1780 A monomorphic instance of libcrux_sha3.portable_keccak.rotate_left
1781 with const generics
1782 - LEFT= 21
1783 - RIGHT= 43
1784 */
1785 static KRML_MUSTINLINE uint64_t
libcrux_sha3_portable_keccak_rotate_left_cb16(uint64_t x)1786 libcrux_sha3_portable_keccak_rotate_left_cb16(uint64_t x) {
1787 return x << (uint32_t)(int32_t)21 | x >> (uint32_t)(int32_t)43;
1788 }
1789
1790 /**
1791 A monomorphic instance of libcrux_sha3.portable_keccak._vxarq_u64
1792 with const generics
1793 - LEFT= 21
1794 - RIGHT= 43
1795 */
1796 static KRML_MUSTINLINE uint64_t
libcrux_sha3_portable_keccak__vxarq_u64_4216(uint64_t a,uint64_t b)1797 libcrux_sha3_portable_keccak__vxarq_u64_4216(uint64_t a, uint64_t b) {
1798 uint64_t ab = a ^ b;
1799 return libcrux_sha3_portable_keccak_rotate_left_cb16(ab);
1800 }
1801
1802 /**
1803 This function found in impl {(libcrux_sha3::traits::internal::KeccakItem<1:
1804 usize> for u64)}
1805 */
1806 /**
1807 A monomorphic instance of libcrux_sha3.portable_keccak.xor_and_rotate_5a
1808 with const generics
1809 - LEFT= 21
1810 - RIGHT= 43
1811 */
1812 static KRML_MUSTINLINE uint64_t
libcrux_sha3_portable_keccak_xor_and_rotate_5a_bb16(uint64_t a,uint64_t b)1813 libcrux_sha3_portable_keccak_xor_and_rotate_5a_bb16(uint64_t a, uint64_t b) {
1814 return libcrux_sha3_portable_keccak__vxarq_u64_4216(a, b);
1815 }
1816
1817 /**
1818 A monomorphic instance of libcrux_sha3.portable_keccak.rotate_left
1819 with const generics
1820 - LEFT= 56
1821 - RIGHT= 8
1822 */
1823 static KRML_MUSTINLINE uint64_t
libcrux_sha3_portable_keccak_rotate_left_cb17(uint64_t x)1824 libcrux_sha3_portable_keccak_rotate_left_cb17(uint64_t x) {
1825 return x << (uint32_t)(int32_t)56 | x >> (uint32_t)(int32_t)8;
1826 }
1827
1828 /**
1829 A monomorphic instance of libcrux_sha3.portable_keccak._vxarq_u64
1830 with const generics
1831 - LEFT= 56
1832 - RIGHT= 8
1833 */
1834 static KRML_MUSTINLINE uint64_t
libcrux_sha3_portable_keccak__vxarq_u64_4217(uint64_t a,uint64_t b)1835 libcrux_sha3_portable_keccak__vxarq_u64_4217(uint64_t a, uint64_t b) {
1836 uint64_t ab = a ^ b;
1837 return libcrux_sha3_portable_keccak_rotate_left_cb17(ab);
1838 }
1839
1840 /**
1841 This function found in impl {(libcrux_sha3::traits::internal::KeccakItem<1:
1842 usize> for u64)}
1843 */
1844 /**
1845 A monomorphic instance of libcrux_sha3.portable_keccak.xor_and_rotate_5a
1846 with const generics
1847 - LEFT= 56
1848 - RIGHT= 8
1849 */
1850 static KRML_MUSTINLINE uint64_t
libcrux_sha3_portable_keccak_xor_and_rotate_5a_bb17(uint64_t a,uint64_t b)1851 libcrux_sha3_portable_keccak_xor_and_rotate_5a_bb17(uint64_t a, uint64_t b) {
1852 return libcrux_sha3_portable_keccak__vxarq_u64_4217(a, b);
1853 }
1854
1855 /**
1856 A monomorphic instance of libcrux_sha3.portable_keccak.rotate_left
1857 with const generics
1858 - LEFT= 27
1859 - RIGHT= 37
1860 */
1861 static KRML_MUSTINLINE uint64_t
libcrux_sha3_portable_keccak_rotate_left_cb18(uint64_t x)1862 libcrux_sha3_portable_keccak_rotate_left_cb18(uint64_t x) {
1863 return x << (uint32_t)(int32_t)27 | x >> (uint32_t)(int32_t)37;
1864 }
1865
1866 /**
1867 A monomorphic instance of libcrux_sha3.portable_keccak._vxarq_u64
1868 with const generics
1869 - LEFT= 27
1870 - RIGHT= 37
1871 */
1872 static KRML_MUSTINLINE uint64_t
libcrux_sha3_portable_keccak__vxarq_u64_4218(uint64_t a,uint64_t b)1873 libcrux_sha3_portable_keccak__vxarq_u64_4218(uint64_t a, uint64_t b) {
1874 uint64_t ab = a ^ b;
1875 return libcrux_sha3_portable_keccak_rotate_left_cb18(ab);
1876 }
1877
1878 /**
1879 This function found in impl {(libcrux_sha3::traits::internal::KeccakItem<1:
1880 usize> for u64)}
1881 */
1882 /**
1883 A monomorphic instance of libcrux_sha3.portable_keccak.xor_and_rotate_5a
1884 with const generics
1885 - LEFT= 27
1886 - RIGHT= 37
1887 */
1888 static KRML_MUSTINLINE uint64_t
libcrux_sha3_portable_keccak_xor_and_rotate_5a_bb18(uint64_t a,uint64_t b)1889 libcrux_sha3_portable_keccak_xor_and_rotate_5a_bb18(uint64_t a, uint64_t b) {
1890 return libcrux_sha3_portable_keccak__vxarq_u64_4218(a, b);
1891 }
1892
1893 /**
1894 A monomorphic instance of libcrux_sha3.portable_keccak.rotate_left
1895 with const generics
1896 - LEFT= 20
1897 - RIGHT= 44
1898 */
1899 static KRML_MUSTINLINE uint64_t
libcrux_sha3_portable_keccak_rotate_left_cb19(uint64_t x)1900 libcrux_sha3_portable_keccak_rotate_left_cb19(uint64_t x) {
1901 return x << (uint32_t)(int32_t)20 | x >> (uint32_t)(int32_t)44;
1902 }
1903
1904 /**
1905 A monomorphic instance of libcrux_sha3.portable_keccak._vxarq_u64
1906 with const generics
1907 - LEFT= 20
1908 - RIGHT= 44
1909 */
1910 static KRML_MUSTINLINE uint64_t
libcrux_sha3_portable_keccak__vxarq_u64_4219(uint64_t a,uint64_t b)1911 libcrux_sha3_portable_keccak__vxarq_u64_4219(uint64_t a, uint64_t b) {
1912 uint64_t ab = a ^ b;
1913 return libcrux_sha3_portable_keccak_rotate_left_cb19(ab);
1914 }
1915
1916 /**
1917 This function found in impl {(libcrux_sha3::traits::internal::KeccakItem<1:
1918 usize> for u64)}
1919 */
1920 /**
1921 A monomorphic instance of libcrux_sha3.portable_keccak.xor_and_rotate_5a
1922 with const generics
1923 - LEFT= 20
1924 - RIGHT= 44
1925 */
1926 static KRML_MUSTINLINE uint64_t
libcrux_sha3_portable_keccak_xor_and_rotate_5a_bb19(uint64_t a,uint64_t b)1927 libcrux_sha3_portable_keccak_xor_and_rotate_5a_bb19(uint64_t a, uint64_t b) {
1928 return libcrux_sha3_portable_keccak__vxarq_u64_4219(a, b);
1929 }
1930
1931 /**
1932 A monomorphic instance of libcrux_sha3.portable_keccak.rotate_left
1933 with const generics
1934 - LEFT= 39
1935 - RIGHT= 25
1936 */
1937 static KRML_MUSTINLINE uint64_t
libcrux_sha3_portable_keccak_rotate_left_cb20(uint64_t x)1938 libcrux_sha3_portable_keccak_rotate_left_cb20(uint64_t x) {
1939 return x << (uint32_t)(int32_t)39 | x >> (uint32_t)(int32_t)25;
1940 }
1941
1942 /**
1943 A monomorphic instance of libcrux_sha3.portable_keccak._vxarq_u64
1944 with const generics
1945 - LEFT= 39
1946 - RIGHT= 25
1947 */
1948 static KRML_MUSTINLINE uint64_t
libcrux_sha3_portable_keccak__vxarq_u64_4220(uint64_t a,uint64_t b)1949 libcrux_sha3_portable_keccak__vxarq_u64_4220(uint64_t a, uint64_t b) {
1950 uint64_t ab = a ^ b;
1951 return libcrux_sha3_portable_keccak_rotate_left_cb20(ab);
1952 }
1953
1954 /**
1955 This function found in impl {(libcrux_sha3::traits::internal::KeccakItem<1:
1956 usize> for u64)}
1957 */
1958 /**
1959 A monomorphic instance of libcrux_sha3.portable_keccak.xor_and_rotate_5a
1960 with const generics
1961 - LEFT= 39
1962 - RIGHT= 25
1963 */
1964 static KRML_MUSTINLINE uint64_t
libcrux_sha3_portable_keccak_xor_and_rotate_5a_bb20(uint64_t a,uint64_t b)1965 libcrux_sha3_portable_keccak_xor_and_rotate_5a_bb20(uint64_t a, uint64_t b) {
1966 return libcrux_sha3_portable_keccak__vxarq_u64_4220(a, b);
1967 }
1968
1969 /**
1970 A monomorphic instance of libcrux_sha3.portable_keccak.rotate_left
1971 with const generics
1972 - LEFT= 8
1973 - RIGHT= 56
1974 */
1975 static KRML_MUSTINLINE uint64_t
libcrux_sha3_portable_keccak_rotate_left_cb21(uint64_t x)1976 libcrux_sha3_portable_keccak_rotate_left_cb21(uint64_t x) {
1977 return x << (uint32_t)(int32_t)8 | x >> (uint32_t)(int32_t)56;
1978 }
1979
1980 /**
1981 A monomorphic instance of libcrux_sha3.portable_keccak._vxarq_u64
1982 with const generics
1983 - LEFT= 8
1984 - RIGHT= 56
1985 */
1986 static KRML_MUSTINLINE uint64_t
libcrux_sha3_portable_keccak__vxarq_u64_4221(uint64_t a,uint64_t b)1987 libcrux_sha3_portable_keccak__vxarq_u64_4221(uint64_t a, uint64_t b) {
1988 uint64_t ab = a ^ b;
1989 return libcrux_sha3_portable_keccak_rotate_left_cb21(ab);
1990 }
1991
1992 /**
1993 This function found in impl {(libcrux_sha3::traits::internal::KeccakItem<1:
1994 usize> for u64)}
1995 */
1996 /**
1997 A monomorphic instance of libcrux_sha3.portable_keccak.xor_and_rotate_5a
1998 with const generics
1999 - LEFT= 8
2000 - RIGHT= 56
2001 */
2002 static KRML_MUSTINLINE uint64_t
libcrux_sha3_portable_keccak_xor_and_rotate_5a_bb21(uint64_t a,uint64_t b)2003 libcrux_sha3_portable_keccak_xor_and_rotate_5a_bb21(uint64_t a, uint64_t b) {
2004 return libcrux_sha3_portable_keccak__vxarq_u64_4221(a, b);
2005 }
2006
2007 /**
2008 A monomorphic instance of libcrux_sha3.portable_keccak.rotate_left
2009 with const generics
2010 - LEFT= 14
2011 - RIGHT= 50
2012 */
2013 static KRML_MUSTINLINE uint64_t
libcrux_sha3_portable_keccak_rotate_left_cb22(uint64_t x)2014 libcrux_sha3_portable_keccak_rotate_left_cb22(uint64_t x) {
2015 return x << (uint32_t)(int32_t)14 | x >> (uint32_t)(int32_t)50;
2016 }
2017
2018 /**
2019 A monomorphic instance of libcrux_sha3.portable_keccak._vxarq_u64
2020 with const generics
2021 - LEFT= 14
2022 - RIGHT= 50
2023 */
2024 static KRML_MUSTINLINE uint64_t
libcrux_sha3_portable_keccak__vxarq_u64_4222(uint64_t a,uint64_t b)2025 libcrux_sha3_portable_keccak__vxarq_u64_4222(uint64_t a, uint64_t b) {
2026 uint64_t ab = a ^ b;
2027 return libcrux_sha3_portable_keccak_rotate_left_cb22(ab);
2028 }
2029
2030 /**
2031 This function found in impl {(libcrux_sha3::traits::internal::KeccakItem<1:
2032 usize> for u64)}
2033 */
2034 /**
2035 A monomorphic instance of libcrux_sha3.portable_keccak.xor_and_rotate_5a
2036 with const generics
2037 - LEFT= 14
2038 - RIGHT= 50
2039 */
2040 static KRML_MUSTINLINE uint64_t
libcrux_sha3_portable_keccak_xor_and_rotate_5a_bb22(uint64_t a,uint64_t b)2041 libcrux_sha3_portable_keccak_xor_and_rotate_5a_bb22(uint64_t a, uint64_t b) {
2042 return libcrux_sha3_portable_keccak__vxarq_u64_4222(a, b);
2043 }
2044
2045 /**
2046 A monomorphic instance of libcrux_sha3.generic_keccak.theta_rho
2047 with types uint64_t
2048 with const generics
2049 - N= 1
2050 */
libcrux_sha3_generic_keccak_theta_rho_16(libcrux_sha3_generic_keccak_KeccakState_48 * s)2051 static KRML_MUSTINLINE void libcrux_sha3_generic_keccak_theta_rho_16(
2052 libcrux_sha3_generic_keccak_KeccakState_48 *s) {
2053 uint64_t c[5U] = {
2054 libcrux_sha3_portable_keccak_xor5_5a(s->st[0U][0U], s->st[1U][0U],
2055 s->st[2U][0U], s->st[3U][0U],
2056 s->st[4U][0U]),
2057 libcrux_sha3_portable_keccak_xor5_5a(s->st[0U][1U], s->st[1U][1U],
2058 s->st[2U][1U], s->st[3U][1U],
2059 s->st[4U][1U]),
2060 libcrux_sha3_portable_keccak_xor5_5a(s->st[0U][2U], s->st[1U][2U],
2061 s->st[2U][2U], s->st[3U][2U],
2062 s->st[4U][2U]),
2063 libcrux_sha3_portable_keccak_xor5_5a(s->st[0U][3U], s->st[1U][3U],
2064 s->st[2U][3U], s->st[3U][3U],
2065 s->st[4U][3U]),
2066 libcrux_sha3_portable_keccak_xor5_5a(s->st[0U][4U], s->st[1U][4U],
2067 s->st[2U][4U], s->st[3U][4U],
2068 s->st[4U][4U])};
2069 uint64_t uu____0 = libcrux_sha3_portable_keccak_rotate_left1_and_xor_5a(
2070 c[((size_t)0U + (size_t)4U) % (size_t)5U],
2071 c[((size_t)0U + (size_t)1U) % (size_t)5U]);
2072 uint64_t uu____1 = libcrux_sha3_portable_keccak_rotate_left1_and_xor_5a(
2073 c[((size_t)1U + (size_t)4U) % (size_t)5U],
2074 c[((size_t)1U + (size_t)1U) % (size_t)5U]);
2075 uint64_t uu____2 = libcrux_sha3_portable_keccak_rotate_left1_and_xor_5a(
2076 c[((size_t)2U + (size_t)4U) % (size_t)5U],
2077 c[((size_t)2U + (size_t)1U) % (size_t)5U]);
2078 uint64_t uu____3 = libcrux_sha3_portable_keccak_rotate_left1_and_xor_5a(
2079 c[((size_t)3U + (size_t)4U) % (size_t)5U],
2080 c[((size_t)3U + (size_t)1U) % (size_t)5U]);
2081 uint64_t t[5U] = {uu____0, uu____1, uu____2, uu____3,
2082 libcrux_sha3_portable_keccak_rotate_left1_and_xor_5a(
2083 c[((size_t)4U + (size_t)4U) % (size_t)5U],
2084 c[((size_t)4U + (size_t)1U) % (size_t)5U])};
2085 s->st[0U][0U] = libcrux_sha3_portable_keccak_xor_5a(s->st[0U][0U], t[0U]);
2086 s->st[1U][0U] =
2087 libcrux_sha3_portable_keccak_xor_and_rotate_5a_bb(s->st[1U][0U], t[0U]);
2088 s->st[2U][0U] =
2089 libcrux_sha3_portable_keccak_xor_and_rotate_5a_bb0(s->st[2U][0U], t[0U]);
2090 s->st[3U][0U] =
2091 libcrux_sha3_portable_keccak_xor_and_rotate_5a_bb1(s->st[3U][0U], t[0U]);
2092 s->st[4U][0U] =
2093 libcrux_sha3_portable_keccak_xor_and_rotate_5a_bb2(s->st[4U][0U], t[0U]);
2094 s->st[0U][1U] =
2095 libcrux_sha3_portable_keccak_xor_and_rotate_5a_bb3(s->st[0U][1U], t[1U]);
2096 s->st[1U][1U] =
2097 libcrux_sha3_portable_keccak_xor_and_rotate_5a_bb4(s->st[1U][1U], t[1U]);
2098 s->st[2U][1U] =
2099 libcrux_sha3_portable_keccak_xor_and_rotate_5a_bb5(s->st[2U][1U], t[1U]);
2100 s->st[3U][1U] =
2101 libcrux_sha3_portable_keccak_xor_and_rotate_5a_bb6(s->st[3U][1U], t[1U]);
2102 s->st[4U][1U] =
2103 libcrux_sha3_portable_keccak_xor_and_rotate_5a_bb7(s->st[4U][1U], t[1U]);
2104 s->st[0U][2U] =
2105 libcrux_sha3_portable_keccak_xor_and_rotate_5a_bb8(s->st[0U][2U], t[2U]);
2106 s->st[1U][2U] =
2107 libcrux_sha3_portable_keccak_xor_and_rotate_5a_bb9(s->st[1U][2U], t[2U]);
2108 s->st[2U][2U] =
2109 libcrux_sha3_portable_keccak_xor_and_rotate_5a_bb10(s->st[2U][2U], t[2U]);
2110 s->st[3U][2U] =
2111 libcrux_sha3_portable_keccak_xor_and_rotate_5a_bb11(s->st[3U][2U], t[2U]);
2112 s->st[4U][2U] =
2113 libcrux_sha3_portable_keccak_xor_and_rotate_5a_bb12(s->st[4U][2U], t[2U]);
2114 s->st[0U][3U] =
2115 libcrux_sha3_portable_keccak_xor_and_rotate_5a_bb13(s->st[0U][3U], t[3U]);
2116 s->st[1U][3U] =
2117 libcrux_sha3_portable_keccak_xor_and_rotate_5a_bb14(s->st[1U][3U], t[3U]);
2118 s->st[2U][3U] =
2119 libcrux_sha3_portable_keccak_xor_and_rotate_5a_bb15(s->st[2U][3U], t[3U]);
2120 s->st[3U][3U] =
2121 libcrux_sha3_portable_keccak_xor_and_rotate_5a_bb16(s->st[3U][3U], t[3U]);
2122 s->st[4U][3U] =
2123 libcrux_sha3_portable_keccak_xor_and_rotate_5a_bb17(s->st[4U][3U], t[3U]);
2124 s->st[0U][4U] =
2125 libcrux_sha3_portable_keccak_xor_and_rotate_5a_bb18(s->st[0U][4U], t[4U]);
2126 s->st[1U][4U] =
2127 libcrux_sha3_portable_keccak_xor_and_rotate_5a_bb19(s->st[1U][4U], t[4U]);
2128 s->st[2U][4U] =
2129 libcrux_sha3_portable_keccak_xor_and_rotate_5a_bb20(s->st[2U][4U], t[4U]);
2130 s->st[3U][4U] =
2131 libcrux_sha3_portable_keccak_xor_and_rotate_5a_bb21(s->st[3U][4U], t[4U]);
2132 uint64_t uu____27 =
2133 libcrux_sha3_portable_keccak_xor_and_rotate_5a_bb22(s->st[4U][4U], t[4U]);
2134 s->st[4U][4U] = uu____27;
2135 }
2136
2137 /**
2138 A monomorphic instance of libcrux_sha3.generic_keccak.pi
2139 with types uint64_t
2140 with const generics
2141 - N= 1
2142 */
libcrux_sha3_generic_keccak_pi_1d(libcrux_sha3_generic_keccak_KeccakState_48 * s)2143 static KRML_MUSTINLINE void libcrux_sha3_generic_keccak_pi_1d(
2144 libcrux_sha3_generic_keccak_KeccakState_48 *s) {
2145 uint64_t old[5U][5U];
2146 memcpy(old, s->st, (size_t)5U * sizeof(uint64_t[5U]));
2147 s->st[0U][1U] = old[1U][1U];
2148 s->st[0U][2U] = old[2U][2U];
2149 s->st[0U][3U] = old[3U][3U];
2150 s->st[0U][4U] = old[4U][4U];
2151 s->st[1U][0U] = old[0U][3U];
2152 s->st[1U][1U] = old[1U][4U];
2153 s->st[1U][2U] = old[2U][0U];
2154 s->st[1U][3U] = old[3U][1U];
2155 s->st[1U][4U] = old[4U][2U];
2156 s->st[2U][0U] = old[0U][1U];
2157 s->st[2U][1U] = old[1U][2U];
2158 s->st[2U][2U] = old[2U][3U];
2159 s->st[2U][3U] = old[3U][4U];
2160 s->st[2U][4U] = old[4U][0U];
2161 s->st[3U][0U] = old[0U][4U];
2162 s->st[3U][1U] = old[1U][0U];
2163 s->st[3U][2U] = old[2U][1U];
2164 s->st[3U][3U] = old[3U][2U];
2165 s->st[3U][4U] = old[4U][3U];
2166 s->st[4U][0U] = old[0U][2U];
2167 s->st[4U][1U] = old[1U][3U];
2168 s->st[4U][2U] = old[2U][4U];
2169 s->st[4U][3U] = old[3U][0U];
2170 s->st[4U][4U] = old[4U][1U];
2171 }
2172
2173 /**
2174 A monomorphic instance of libcrux_sha3.generic_keccak.chi
2175 with types uint64_t
2176 with const generics
2177 - N= 1
2178 */
libcrux_sha3_generic_keccak_chi_12(libcrux_sha3_generic_keccak_KeccakState_48 * s)2179 static KRML_MUSTINLINE void libcrux_sha3_generic_keccak_chi_12(
2180 libcrux_sha3_generic_keccak_KeccakState_48 *s) {
2181 uint64_t old[5U][5U];
2182 memcpy(old, s->st, (size_t)5U * sizeof(uint64_t[5U]));
2183 for (size_t i0 = (size_t)0U; i0 < (size_t)5U; i0++) {
2184 size_t i1 = i0;
2185 for (size_t i = (size_t)0U; i < (size_t)5U; i++) {
2186 size_t j = i;
2187 s->st[i1][j] = libcrux_sha3_portable_keccak_and_not_xor_5a(
2188 s->st[i1][j], old[i1][(j + (size_t)2U) % (size_t)5U],
2189 old[i1][(j + (size_t)1U) % (size_t)5U]);
2190 }
2191 }
2192 }
2193
2194 /**
2195 A monomorphic instance of libcrux_sha3.generic_keccak.iota
2196 with types uint64_t
2197 with const generics
2198 - N= 1
2199 */
libcrux_sha3_generic_keccak_iota_62(libcrux_sha3_generic_keccak_KeccakState_48 * s,size_t i)2200 static KRML_MUSTINLINE void libcrux_sha3_generic_keccak_iota_62(
2201 libcrux_sha3_generic_keccak_KeccakState_48 *s, size_t i) {
2202 s->st[0U][0U] = libcrux_sha3_portable_keccak_xor_constant_5a(
2203 s->st[0U][0U], libcrux_sha3_generic_keccak_ROUNDCONSTANTS[i]);
2204 }
2205
2206 /**
2207 A monomorphic instance of libcrux_sha3.generic_keccak.keccakf1600
2208 with types uint64_t
2209 with const generics
2210 - N= 1
2211 */
libcrux_sha3_generic_keccak_keccakf1600_21(libcrux_sha3_generic_keccak_KeccakState_48 * s)2212 static KRML_MUSTINLINE void libcrux_sha3_generic_keccak_keccakf1600_21(
2213 libcrux_sha3_generic_keccak_KeccakState_48 *s) {
2214 for (size_t i = (size_t)0U; i < (size_t)24U; i++) {
2215 size_t i0 = i;
2216 libcrux_sha3_generic_keccak_theta_rho_16(s);
2217 libcrux_sha3_generic_keccak_pi_1d(s);
2218 libcrux_sha3_generic_keccak_chi_12(s);
2219 libcrux_sha3_generic_keccak_iota_62(s, i0);
2220 }
2221 }
2222
2223 /**
2224 A monomorphic instance of libcrux_sha3.generic_keccak.absorb_block
2225 with types uint64_t
2226 with const generics
2227 - N= 1
2228 - RATE= 72
2229 */
libcrux_sha3_generic_keccak_absorb_block_df(libcrux_sha3_generic_keccak_KeccakState_48 * s,Eurydice_slice blocks[1U])2230 static KRML_MUSTINLINE void libcrux_sha3_generic_keccak_absorb_block_df(
2231 libcrux_sha3_generic_keccak_KeccakState_48 *s, Eurydice_slice blocks[1U]) {
2232 uint64_t(*uu____0)[5U] = s->st;
2233 Eurydice_slice uu____1[1U];
2234 memcpy(uu____1, blocks, (size_t)1U * sizeof(Eurydice_slice));
2235 libcrux_sha3_portable_keccak_load_block_5a_b8(uu____0, uu____1);
2236 libcrux_sha3_generic_keccak_keccakf1600_21(s);
2237 }
2238
2239 /**
2240 A monomorphic instance of libcrux_sha3.portable_keccak.load_block_full
2241 with const generics
2242 - RATE= 72
2243 */
libcrux_sha3_portable_keccak_load_block_full_df(uint64_t (* s)[5U],uint8_t blocks[1U][200U])2244 static KRML_MUSTINLINE void libcrux_sha3_portable_keccak_load_block_full_df(
2245 uint64_t (*s)[5U], uint8_t blocks[1U][200U]) {
2246 Eurydice_slice buf[1U] = {
2247 Eurydice_array_to_slice((size_t)200U, blocks[0U], uint8_t)};
2248 libcrux_sha3_portable_keccak_load_block_2c(s, buf);
2249 }
2250
2251 /**
2252 This function found in impl {(libcrux_sha3::traits::internal::KeccakItem<1:
2253 usize> for u64)}
2254 */
2255 /**
2256 A monomorphic instance of libcrux_sha3.portable_keccak.load_block_full_5a
2257 with const generics
2258 - RATE= 72
2259 */
libcrux_sha3_portable_keccak_load_block_full_5a_d2(uint64_t (* a)[5U],uint8_t b[1U][200U])2260 static KRML_MUSTINLINE void libcrux_sha3_portable_keccak_load_block_full_5a_d2(
2261 uint64_t (*a)[5U], uint8_t b[1U][200U]) {
2262 uint64_t(*uu____0)[5U] = a;
2263 /* Passing arrays by value in Rust generates a copy in C */
2264 uint8_t copy_of_b[1U][200U];
2265 memcpy(copy_of_b, b, (size_t)1U * sizeof(uint8_t[200U]));
2266 libcrux_sha3_portable_keccak_load_block_full_df(uu____0, copy_of_b);
2267 }
2268
2269 /**
2270 A monomorphic instance of libcrux_sha3.generic_keccak.absorb_final
2271 with types uint64_t
2272 with const generics
2273 - N= 1
2274 - RATE= 72
2275 - DELIM= 6
2276 */
libcrux_sha3_generic_keccak_absorb_final_c7(libcrux_sha3_generic_keccak_KeccakState_48 * s,Eurydice_slice last[1U])2277 static KRML_MUSTINLINE void libcrux_sha3_generic_keccak_absorb_final_c7(
2278 libcrux_sha3_generic_keccak_KeccakState_48 *s, Eurydice_slice last[1U]) {
2279 size_t last_len = Eurydice_slice_len(last[0U], uint8_t);
2280 uint8_t blocks[1U][200U] = {{0U}};
2281 for (size_t i = (size_t)0U; i < (size_t)1U; i++) {
2282 size_t i0 = i;
2283 if (last_len > (size_t)0U) {
2284 Eurydice_slice uu____0 = Eurydice_array_to_subslice2(
2285 blocks[i0], (size_t)0U, last_len, uint8_t);
2286 Eurydice_slice_copy(uu____0, last[i0], uint8_t);
2287 }
2288 blocks[i0][last_len] = 6U;
2289 size_t uu____1 = i0;
2290 size_t uu____2 = (size_t)72U - (size_t)1U;
2291 blocks[uu____1][uu____2] = (uint32_t)blocks[uu____1][uu____2] | 128U;
2292 }
2293 uint64_t(*uu____3)[5U] = s->st;
2294 uint8_t uu____4[1U][200U];
2295 memcpy(uu____4, blocks, (size_t)1U * sizeof(uint8_t[200U]));
2296 libcrux_sha3_portable_keccak_load_block_full_5a_d2(uu____3, uu____4);
2297 libcrux_sha3_generic_keccak_keccakf1600_21(s);
2298 }
2299
2300 /**
2301 A monomorphic instance of libcrux_sha3.portable_keccak.store_block
2302 with const generics
2303 - RATE= 72
2304 */
libcrux_sha3_portable_keccak_store_block_58(uint64_t (* s)[5U],Eurydice_slice out[1U])2305 static KRML_MUSTINLINE void libcrux_sha3_portable_keccak_store_block_58(
2306 uint64_t (*s)[5U], Eurydice_slice out[1U]) {
2307 for (size_t i = (size_t)0U; i < (size_t)72U / (size_t)8U; i++) {
2308 size_t i0 = i;
2309 Eurydice_slice uu____0 = Eurydice_slice_subslice2(
2310 out[0U], (size_t)8U * i0, (size_t)8U * i0 + (size_t)8U, uint8_t);
2311 uint8_t ret[8U];
2312 core_num__u64_9__to_le_bytes(s[i0 / (size_t)5U][i0 % (size_t)5U], ret);
2313 Eurydice_slice_copy(
2314 uu____0, Eurydice_array_to_slice((size_t)8U, ret, uint8_t), uint8_t);
2315 }
2316 }
2317
2318 /**
2319 A monomorphic instance of libcrux_sha3.portable_keccak.store_block_full
2320 with const generics
2321 - RATE= 72
2322 */
libcrux_sha3_portable_keccak_store_block_full_2d(uint64_t (* s)[5U],uint8_t ret[1U][200U])2323 static KRML_MUSTINLINE void libcrux_sha3_portable_keccak_store_block_full_2d(
2324 uint64_t (*s)[5U], uint8_t ret[1U][200U]) {
2325 uint8_t out[200U] = {0U};
2326 Eurydice_slice buf[1U] = {
2327 Eurydice_array_to_slice((size_t)200U, out, uint8_t)};
2328 libcrux_sha3_portable_keccak_store_block_58(s, buf);
2329 /* Passing arrays by value in Rust generates a copy in C */
2330 uint8_t copy_of_out[200U];
2331 memcpy(copy_of_out, out, (size_t)200U * sizeof(uint8_t));
2332 memcpy(ret[0U], copy_of_out, (size_t)200U * sizeof(uint8_t));
2333 }
2334
2335 /**
2336 This function found in impl {(libcrux_sha3::traits::internal::KeccakItem<1:
2337 usize> for u64)}
2338 */
2339 /**
2340 A monomorphic instance of libcrux_sha3.portable_keccak.store_block_full_5a
2341 with const generics
2342 - RATE= 72
2343 */
libcrux_sha3_portable_keccak_store_block_full_5a_29(uint64_t (* a)[5U],uint8_t ret[1U][200U])2344 static KRML_MUSTINLINE void libcrux_sha3_portable_keccak_store_block_full_5a_29(
2345 uint64_t (*a)[5U], uint8_t ret[1U][200U]) {
2346 libcrux_sha3_portable_keccak_store_block_full_2d(a, ret);
2347 }
2348
2349 /**
2350 A monomorphic instance of libcrux_sha3.generic_keccak.squeeze_first_and_last
2351 with types uint64_t
2352 with const generics
2353 - N= 1
2354 - RATE= 72
2355 */
2356 static KRML_MUSTINLINE void
libcrux_sha3_generic_keccak_squeeze_first_and_last_c5(libcrux_sha3_generic_keccak_KeccakState_48 * s,Eurydice_slice out[1U])2357 libcrux_sha3_generic_keccak_squeeze_first_and_last_c5(
2358 libcrux_sha3_generic_keccak_KeccakState_48 *s, Eurydice_slice out[1U]) {
2359 uint8_t b[1U][200U];
2360 libcrux_sha3_portable_keccak_store_block_full_5a_29(s->st, b);
2361 for (size_t i = (size_t)0U; i < (size_t)1U; i++) {
2362 size_t i0 = i;
2363 Eurydice_slice uu____0 = out[i0];
2364 uint8_t *uu____1 = b[i0];
2365 core_ops_range_Range_b3 lit;
2366 lit.start = (size_t)0U;
2367 lit.end = Eurydice_slice_len(out[i0], uint8_t);
2368 Eurydice_slice_copy(
2369 uu____0,
2370 Eurydice_array_to_subslice((size_t)200U, uu____1, lit, uint8_t,
2371 core_ops_range_Range_b3),
2372 uint8_t);
2373 }
2374 }
2375
2376 /**
2377 This function found in impl {(libcrux_sha3::traits::internal::KeccakItem<1:
2378 usize> for u64)}
2379 */
2380 /**
2381 A monomorphic instance of libcrux_sha3.portable_keccak.store_block_5a
2382 with const generics
2383 - RATE= 72
2384 */
libcrux_sha3_portable_keccak_store_block_5a_59(uint64_t (* a)[5U],Eurydice_slice b[1U])2385 static KRML_MUSTINLINE void libcrux_sha3_portable_keccak_store_block_5a_59(
2386 uint64_t (*a)[5U], Eurydice_slice b[1U]) {
2387 libcrux_sha3_portable_keccak_store_block_58(a, b);
2388 }
2389
2390 /**
2391 A monomorphic instance of libcrux_sha3.generic_keccak.squeeze_first_block
2392 with types uint64_t
2393 with const generics
2394 - N= 1
2395 - RATE= 72
2396 */
libcrux_sha3_generic_keccak_squeeze_first_block_84(libcrux_sha3_generic_keccak_KeccakState_48 * s,Eurydice_slice out[1U])2397 static KRML_MUSTINLINE void libcrux_sha3_generic_keccak_squeeze_first_block_84(
2398 libcrux_sha3_generic_keccak_KeccakState_48 *s, Eurydice_slice out[1U]) {
2399 libcrux_sha3_portable_keccak_store_block_5a_59(s->st, out);
2400 }
2401
2402 /**
2403 A monomorphic instance of libcrux_sha3.generic_keccak.squeeze_next_block
2404 with types uint64_t
2405 with const generics
2406 - N= 1
2407 - RATE= 72
2408 */
libcrux_sha3_generic_keccak_squeeze_next_block_fc(libcrux_sha3_generic_keccak_KeccakState_48 * s,Eurydice_slice out[1U])2409 static KRML_MUSTINLINE void libcrux_sha3_generic_keccak_squeeze_next_block_fc(
2410 libcrux_sha3_generic_keccak_KeccakState_48 *s, Eurydice_slice out[1U]) {
2411 libcrux_sha3_generic_keccak_keccakf1600_21(s);
2412 libcrux_sha3_portable_keccak_store_block_5a_59(s->st, out);
2413 }
2414
2415 /**
2416 A monomorphic instance of libcrux_sha3.generic_keccak.squeeze_last
2417 with types uint64_t
2418 with const generics
2419 - N= 1
2420 - RATE= 72
2421 */
libcrux_sha3_generic_keccak_squeeze_last_cf(libcrux_sha3_generic_keccak_KeccakState_48 s,Eurydice_slice out[1U])2422 static KRML_MUSTINLINE void libcrux_sha3_generic_keccak_squeeze_last_cf(
2423 libcrux_sha3_generic_keccak_KeccakState_48 s, Eurydice_slice out[1U]) {
2424 libcrux_sha3_generic_keccak_keccakf1600_21(&s);
2425 uint8_t b[1U][200U];
2426 libcrux_sha3_portable_keccak_store_block_full_5a_29(s.st, b);
2427 for (size_t i = (size_t)0U; i < (size_t)1U; i++) {
2428 size_t i0 = i;
2429 Eurydice_slice uu____0 = out[i0];
2430 uint8_t *uu____1 = b[i0];
2431 core_ops_range_Range_b3 lit;
2432 lit.start = (size_t)0U;
2433 lit.end = Eurydice_slice_len(out[i0], uint8_t);
2434 Eurydice_slice_copy(
2435 uu____0,
2436 Eurydice_array_to_subslice((size_t)200U, uu____1, lit, uint8_t,
2437 core_ops_range_Range_b3),
2438 uint8_t);
2439 }
2440 }
2441
2442 /**
2443 A monomorphic instance of libcrux_sha3.generic_keccak.keccak
2444 with types uint64_t
2445 with const generics
2446 - N= 1
2447 - RATE= 72
2448 - DELIM= 6
2449 */
libcrux_sha3_generic_keccak_keccak_e9(Eurydice_slice data[1U],Eurydice_slice out[1U])2450 static KRML_MUSTINLINE void libcrux_sha3_generic_keccak_keccak_e9(
2451 Eurydice_slice data[1U], Eurydice_slice out[1U]) {
2452 libcrux_sha3_generic_keccak_KeccakState_48 s =
2453 libcrux_sha3_generic_keccak_new_1e_f4();
2454 for (size_t i = (size_t)0U;
2455 i < Eurydice_slice_len(data[0U], uint8_t) / (size_t)72U; i++) {
2456 size_t i0 = i;
2457 libcrux_sha3_generic_keccak_KeccakState_48 *uu____0 = &s;
2458 /* Passing arrays by value in Rust generates a copy in C */
2459 Eurydice_slice copy_of_data[1U];
2460 memcpy(copy_of_data, data, (size_t)1U * sizeof(Eurydice_slice));
2461 Eurydice_slice ret[1U];
2462 libcrux_sha3_portable_keccak_slice_n_5a(copy_of_data, i0 * (size_t)72U,
2463 (size_t)72U, ret);
2464 libcrux_sha3_generic_keccak_absorb_block_df(uu____0, ret);
2465 }
2466 size_t rem = Eurydice_slice_len(data[0U], uint8_t) % (size_t)72U;
2467 libcrux_sha3_generic_keccak_KeccakState_48 *uu____2 = &s;
2468 /* Passing arrays by value in Rust generates a copy in C */
2469 Eurydice_slice copy_of_data[1U];
2470 memcpy(copy_of_data, data, (size_t)1U * sizeof(Eurydice_slice));
2471 Eurydice_slice ret[1U];
2472 libcrux_sha3_portable_keccak_slice_n_5a(
2473 copy_of_data, Eurydice_slice_len(data[0U], uint8_t) - rem, rem, ret);
2474 libcrux_sha3_generic_keccak_absorb_final_c7(uu____2, ret);
2475 size_t outlen = Eurydice_slice_len(out[0U], uint8_t);
2476 size_t blocks = outlen / (size_t)72U;
2477 size_t last = outlen - outlen % (size_t)72U;
2478 if (blocks == (size_t)0U) {
2479 libcrux_sha3_generic_keccak_squeeze_first_and_last_c5(&s, out);
2480 } else {
2481 Eurydice_slice_uint8_t_1size_t__x2 uu____4 =
2482 libcrux_sha3_portable_keccak_split_at_mut_n_5a(out, (size_t)72U);
2483 Eurydice_slice o0[1U];
2484 memcpy(o0, uu____4.fst, (size_t)1U * sizeof(Eurydice_slice));
2485 Eurydice_slice o1[1U];
2486 memcpy(o1, uu____4.snd, (size_t)1U * sizeof(Eurydice_slice));
2487 libcrux_sha3_generic_keccak_squeeze_first_block_84(&s, o0);
2488 core_ops_range_Range_b3 iter =
2489 core_iter_traits_collect___core__iter__traits__collect__IntoIterator_for_I__1__into_iter(
2490 (CLITERAL(core_ops_range_Range_b3){.start = (size_t)1U,
2491 .end = blocks}),
2492 core_ops_range_Range_b3, core_ops_range_Range_b3);
2493 while (true) {
2494 if (core_iter_range___core__iter__traits__iterator__Iterator_for_core__ops__range__Range_A___6__next(
2495 &iter, size_t, Option_b3)
2496 .tag == None) {
2497 break;
2498 } else {
2499 Eurydice_slice_uint8_t_1size_t__x2 uu____5 =
2500 libcrux_sha3_portable_keccak_split_at_mut_n_5a(o1, (size_t)72U);
2501 Eurydice_slice o[1U];
2502 memcpy(o, uu____5.fst, (size_t)1U * sizeof(Eurydice_slice));
2503 Eurydice_slice orest[1U];
2504 memcpy(orest, uu____5.snd, (size_t)1U * sizeof(Eurydice_slice));
2505 libcrux_sha3_generic_keccak_squeeze_next_block_fc(&s, o);
2506 memcpy(o1, orest, (size_t)1U * sizeof(Eurydice_slice));
2507 }
2508 }
2509 if (last < outlen) {
2510 libcrux_sha3_generic_keccak_squeeze_last_cf(s, o1);
2511 }
2512 }
2513 }
2514
2515 /**
2516 A monomorphic instance of libcrux_sha3.portable.keccakx1
2517 with const generics
2518 - RATE= 72
2519 - DELIM= 6
2520 */
libcrux_sha3_portable_keccakx1_ce(Eurydice_slice data[1U],Eurydice_slice out[1U])2521 static KRML_MUSTINLINE void libcrux_sha3_portable_keccakx1_ce(
2522 Eurydice_slice data[1U], Eurydice_slice out[1U]) {
2523 /* Passing arrays by value in Rust generates a copy in C */
2524 Eurydice_slice copy_of_data[1U];
2525 memcpy(copy_of_data, data, (size_t)1U * sizeof(Eurydice_slice));
2526 libcrux_sha3_generic_keccak_keccak_e9(copy_of_data, out);
2527 }
2528
2529 /**
2530 A portable SHA3 512 implementation.
2531 */
libcrux_sha3_portable_sha512(Eurydice_slice digest,Eurydice_slice data)2532 static KRML_MUSTINLINE void libcrux_sha3_portable_sha512(Eurydice_slice digest,
2533 Eurydice_slice data) {
2534 Eurydice_slice buf0[1U] = {data};
2535 Eurydice_slice buf[1U] = {digest};
2536 libcrux_sha3_portable_keccakx1_ce(buf0, buf);
2537 }
2538
2539 /**
2540 A monomorphic instance of libcrux_sha3.portable_keccak.load_block
2541 with const generics
2542 - RATE= 136
2543 */
libcrux_sha3_portable_keccak_load_block_2c0(uint64_t (* s)[5U],Eurydice_slice blocks[1U])2544 static KRML_MUSTINLINE void libcrux_sha3_portable_keccak_load_block_2c0(
2545 uint64_t (*s)[5U], Eurydice_slice blocks[1U]) {
2546 for (size_t i = (size_t)0U; i < (size_t)136U / (size_t)8U; i++) {
2547 size_t i0 = i;
2548 uint8_t uu____0[8U];
2549 Result_56 dst;
2550 Eurydice_slice_to_array2(
2551 &dst,
2552 Eurydice_slice_subslice2(blocks[0U], (size_t)8U * i0,
2553 (size_t)8U * i0 + (size_t)8U, uint8_t),
2554 Eurydice_slice, uint8_t[8U]);
2555 unwrap_41_ac(dst, uu____0);
2556 size_t uu____1 = i0 / (size_t)5U;
2557 size_t uu____2 = i0 % (size_t)5U;
2558 s[uu____1][uu____2] =
2559 s[uu____1][uu____2] ^ core_num__u64_9__from_le_bytes(uu____0);
2560 }
2561 }
2562
2563 /**
2564 This function found in impl {(libcrux_sha3::traits::internal::KeccakItem<1:
2565 usize> for u64)}
2566 */
2567 /**
2568 A monomorphic instance of libcrux_sha3.portable_keccak.load_block_5a
2569 with const generics
2570 - RATE= 136
2571 */
libcrux_sha3_portable_keccak_load_block_5a_b80(uint64_t (* a)[5U],Eurydice_slice b[1U])2572 static KRML_MUSTINLINE void libcrux_sha3_portable_keccak_load_block_5a_b80(
2573 uint64_t (*a)[5U], Eurydice_slice b[1U]) {
2574 uint64_t(*uu____0)[5U] = a;
2575 /* Passing arrays by value in Rust generates a copy in C */
2576 Eurydice_slice copy_of_b[1U];
2577 memcpy(copy_of_b, b, (size_t)1U * sizeof(Eurydice_slice));
2578 libcrux_sha3_portable_keccak_load_block_2c0(uu____0, copy_of_b);
2579 }
2580
2581 /**
2582 A monomorphic instance of libcrux_sha3.generic_keccak.absorb_block
2583 with types uint64_t
2584 with const generics
2585 - N= 1
2586 - RATE= 136
2587 */
libcrux_sha3_generic_keccak_absorb_block_df0(libcrux_sha3_generic_keccak_KeccakState_48 * s,Eurydice_slice blocks[1U])2588 static KRML_MUSTINLINE void libcrux_sha3_generic_keccak_absorb_block_df0(
2589 libcrux_sha3_generic_keccak_KeccakState_48 *s, Eurydice_slice blocks[1U]) {
2590 uint64_t(*uu____0)[5U] = s->st;
2591 Eurydice_slice uu____1[1U];
2592 memcpy(uu____1, blocks, (size_t)1U * sizeof(Eurydice_slice));
2593 libcrux_sha3_portable_keccak_load_block_5a_b80(uu____0, uu____1);
2594 libcrux_sha3_generic_keccak_keccakf1600_21(s);
2595 }
2596
2597 /**
2598 A monomorphic instance of libcrux_sha3.portable_keccak.load_block_full
2599 with const generics
2600 - RATE= 136
2601 */
libcrux_sha3_portable_keccak_load_block_full_df0(uint64_t (* s)[5U],uint8_t blocks[1U][200U])2602 static KRML_MUSTINLINE void libcrux_sha3_portable_keccak_load_block_full_df0(
2603 uint64_t (*s)[5U], uint8_t blocks[1U][200U]) {
2604 Eurydice_slice buf[1U] = {
2605 Eurydice_array_to_slice((size_t)200U, blocks[0U], uint8_t)};
2606 libcrux_sha3_portable_keccak_load_block_2c0(s, buf);
2607 }
2608
2609 /**
2610 This function found in impl {(libcrux_sha3::traits::internal::KeccakItem<1:
2611 usize> for u64)}
2612 */
2613 /**
2614 A monomorphic instance of libcrux_sha3.portable_keccak.load_block_full_5a
2615 with const generics
2616 - RATE= 136
2617 */
libcrux_sha3_portable_keccak_load_block_full_5a_d20(uint64_t (* a)[5U],uint8_t b[1U][200U])2618 static KRML_MUSTINLINE void libcrux_sha3_portable_keccak_load_block_full_5a_d20(
2619 uint64_t (*a)[5U], uint8_t b[1U][200U]) {
2620 uint64_t(*uu____0)[5U] = a;
2621 /* Passing arrays by value in Rust generates a copy in C */
2622 uint8_t copy_of_b[1U][200U];
2623 memcpy(copy_of_b, b, (size_t)1U * sizeof(uint8_t[200U]));
2624 libcrux_sha3_portable_keccak_load_block_full_df0(uu____0, copy_of_b);
2625 }
2626
2627 /**
2628 A monomorphic instance of libcrux_sha3.generic_keccak.absorb_final
2629 with types uint64_t
2630 with const generics
2631 - N= 1
2632 - RATE= 136
2633 - DELIM= 6
2634 */
libcrux_sha3_generic_keccak_absorb_final_c70(libcrux_sha3_generic_keccak_KeccakState_48 * s,Eurydice_slice last[1U])2635 static KRML_MUSTINLINE void libcrux_sha3_generic_keccak_absorb_final_c70(
2636 libcrux_sha3_generic_keccak_KeccakState_48 *s, Eurydice_slice last[1U]) {
2637 size_t last_len = Eurydice_slice_len(last[0U], uint8_t);
2638 uint8_t blocks[1U][200U] = {{0U}};
2639 for (size_t i = (size_t)0U; i < (size_t)1U; i++) {
2640 size_t i0 = i;
2641 if (last_len > (size_t)0U) {
2642 Eurydice_slice uu____0 = Eurydice_array_to_subslice2(
2643 blocks[i0], (size_t)0U, last_len, uint8_t);
2644 Eurydice_slice_copy(uu____0, last[i0], uint8_t);
2645 }
2646 blocks[i0][last_len] = 6U;
2647 size_t uu____1 = i0;
2648 size_t uu____2 = (size_t)136U - (size_t)1U;
2649 blocks[uu____1][uu____2] = (uint32_t)blocks[uu____1][uu____2] | 128U;
2650 }
2651 uint64_t(*uu____3)[5U] = s->st;
2652 uint8_t uu____4[1U][200U];
2653 memcpy(uu____4, blocks, (size_t)1U * sizeof(uint8_t[200U]));
2654 libcrux_sha3_portable_keccak_load_block_full_5a_d20(uu____3, uu____4);
2655 libcrux_sha3_generic_keccak_keccakf1600_21(s);
2656 }
2657
2658 /**
2659 A monomorphic instance of libcrux_sha3.portable_keccak.store_block
2660 with const generics
2661 - RATE= 136
2662 */
libcrux_sha3_portable_keccak_store_block_580(uint64_t (* s)[5U],Eurydice_slice out[1U])2663 static KRML_MUSTINLINE void libcrux_sha3_portable_keccak_store_block_580(
2664 uint64_t (*s)[5U], Eurydice_slice out[1U]) {
2665 for (size_t i = (size_t)0U; i < (size_t)136U / (size_t)8U; i++) {
2666 size_t i0 = i;
2667 Eurydice_slice uu____0 = Eurydice_slice_subslice2(
2668 out[0U], (size_t)8U * i0, (size_t)8U * i0 + (size_t)8U, uint8_t);
2669 uint8_t ret[8U];
2670 core_num__u64_9__to_le_bytes(s[i0 / (size_t)5U][i0 % (size_t)5U], ret);
2671 Eurydice_slice_copy(
2672 uu____0, Eurydice_array_to_slice((size_t)8U, ret, uint8_t), uint8_t);
2673 }
2674 }
2675
2676 /**
2677 A monomorphic instance of libcrux_sha3.portable_keccak.store_block_full
2678 with const generics
2679 - RATE= 136
2680 */
libcrux_sha3_portable_keccak_store_block_full_2d0(uint64_t (* s)[5U],uint8_t ret[1U][200U])2681 static KRML_MUSTINLINE void libcrux_sha3_portable_keccak_store_block_full_2d0(
2682 uint64_t (*s)[5U], uint8_t ret[1U][200U]) {
2683 uint8_t out[200U] = {0U};
2684 Eurydice_slice buf[1U] = {
2685 Eurydice_array_to_slice((size_t)200U, out, uint8_t)};
2686 libcrux_sha3_portable_keccak_store_block_580(s, buf);
2687 /* Passing arrays by value in Rust generates a copy in C */
2688 uint8_t copy_of_out[200U];
2689 memcpy(copy_of_out, out, (size_t)200U * sizeof(uint8_t));
2690 memcpy(ret[0U], copy_of_out, (size_t)200U * sizeof(uint8_t));
2691 }
2692
2693 /**
2694 This function found in impl {(libcrux_sha3::traits::internal::KeccakItem<1:
2695 usize> for u64)}
2696 */
2697 /**
2698 A monomorphic instance of libcrux_sha3.portable_keccak.store_block_full_5a
2699 with const generics
2700 - RATE= 136
2701 */
2702 static KRML_MUSTINLINE void
libcrux_sha3_portable_keccak_store_block_full_5a_290(uint64_t (* a)[5U],uint8_t ret[1U][200U])2703 libcrux_sha3_portable_keccak_store_block_full_5a_290(uint64_t (*a)[5U],
2704 uint8_t ret[1U][200U]) {
2705 libcrux_sha3_portable_keccak_store_block_full_2d0(a, ret);
2706 }
2707
2708 /**
2709 A monomorphic instance of libcrux_sha3.generic_keccak.squeeze_first_and_last
2710 with types uint64_t
2711 with const generics
2712 - N= 1
2713 - RATE= 136
2714 */
2715 static KRML_MUSTINLINE void
libcrux_sha3_generic_keccak_squeeze_first_and_last_c50(libcrux_sha3_generic_keccak_KeccakState_48 * s,Eurydice_slice out[1U])2716 libcrux_sha3_generic_keccak_squeeze_first_and_last_c50(
2717 libcrux_sha3_generic_keccak_KeccakState_48 *s, Eurydice_slice out[1U]) {
2718 uint8_t b[1U][200U];
2719 libcrux_sha3_portable_keccak_store_block_full_5a_290(s->st, b);
2720 for (size_t i = (size_t)0U; i < (size_t)1U; i++) {
2721 size_t i0 = i;
2722 Eurydice_slice uu____0 = out[i0];
2723 uint8_t *uu____1 = b[i0];
2724 core_ops_range_Range_b3 lit;
2725 lit.start = (size_t)0U;
2726 lit.end = Eurydice_slice_len(out[i0], uint8_t);
2727 Eurydice_slice_copy(
2728 uu____0,
2729 Eurydice_array_to_subslice((size_t)200U, uu____1, lit, uint8_t,
2730 core_ops_range_Range_b3),
2731 uint8_t);
2732 }
2733 }
2734
2735 /**
2736 This function found in impl {(libcrux_sha3::traits::internal::KeccakItem<1:
2737 usize> for u64)}
2738 */
2739 /**
2740 A monomorphic instance of libcrux_sha3.portable_keccak.store_block_5a
2741 with const generics
2742 - RATE= 136
2743 */
libcrux_sha3_portable_keccak_store_block_5a_590(uint64_t (* a)[5U],Eurydice_slice b[1U])2744 static KRML_MUSTINLINE void libcrux_sha3_portable_keccak_store_block_5a_590(
2745 uint64_t (*a)[5U], Eurydice_slice b[1U]) {
2746 libcrux_sha3_portable_keccak_store_block_580(a, b);
2747 }
2748
2749 /**
2750 A monomorphic instance of libcrux_sha3.generic_keccak.squeeze_first_block
2751 with types uint64_t
2752 with const generics
2753 - N= 1
2754 - RATE= 136
2755 */
libcrux_sha3_generic_keccak_squeeze_first_block_840(libcrux_sha3_generic_keccak_KeccakState_48 * s,Eurydice_slice out[1U])2756 static KRML_MUSTINLINE void libcrux_sha3_generic_keccak_squeeze_first_block_840(
2757 libcrux_sha3_generic_keccak_KeccakState_48 *s, Eurydice_slice out[1U]) {
2758 libcrux_sha3_portable_keccak_store_block_5a_590(s->st, out);
2759 }
2760
2761 /**
2762 A monomorphic instance of libcrux_sha3.generic_keccak.squeeze_next_block
2763 with types uint64_t
2764 with const generics
2765 - N= 1
2766 - RATE= 136
2767 */
libcrux_sha3_generic_keccak_squeeze_next_block_fc0(libcrux_sha3_generic_keccak_KeccakState_48 * s,Eurydice_slice out[1U])2768 static KRML_MUSTINLINE void libcrux_sha3_generic_keccak_squeeze_next_block_fc0(
2769 libcrux_sha3_generic_keccak_KeccakState_48 *s, Eurydice_slice out[1U]) {
2770 libcrux_sha3_generic_keccak_keccakf1600_21(s);
2771 libcrux_sha3_portable_keccak_store_block_5a_590(s->st, out);
2772 }
2773
2774 /**
2775 A monomorphic instance of libcrux_sha3.generic_keccak.squeeze_last
2776 with types uint64_t
2777 with const generics
2778 - N= 1
2779 - RATE= 136
2780 */
libcrux_sha3_generic_keccak_squeeze_last_cf0(libcrux_sha3_generic_keccak_KeccakState_48 s,Eurydice_slice out[1U])2781 static KRML_MUSTINLINE void libcrux_sha3_generic_keccak_squeeze_last_cf0(
2782 libcrux_sha3_generic_keccak_KeccakState_48 s, Eurydice_slice out[1U]) {
2783 libcrux_sha3_generic_keccak_keccakf1600_21(&s);
2784 uint8_t b[1U][200U];
2785 libcrux_sha3_portable_keccak_store_block_full_5a_290(s.st, b);
2786 for (size_t i = (size_t)0U; i < (size_t)1U; i++) {
2787 size_t i0 = i;
2788 Eurydice_slice uu____0 = out[i0];
2789 uint8_t *uu____1 = b[i0];
2790 core_ops_range_Range_b3 lit;
2791 lit.start = (size_t)0U;
2792 lit.end = Eurydice_slice_len(out[i0], uint8_t);
2793 Eurydice_slice_copy(
2794 uu____0,
2795 Eurydice_array_to_subslice((size_t)200U, uu____1, lit, uint8_t,
2796 core_ops_range_Range_b3),
2797 uint8_t);
2798 }
2799 }
2800
2801 /**
2802 A monomorphic instance of libcrux_sha3.generic_keccak.keccak
2803 with types uint64_t
2804 with const generics
2805 - N= 1
2806 - RATE= 136
2807 - DELIM= 6
2808 */
libcrux_sha3_generic_keccak_keccak_e90(Eurydice_slice data[1U],Eurydice_slice out[1U])2809 static KRML_MUSTINLINE void libcrux_sha3_generic_keccak_keccak_e90(
2810 Eurydice_slice data[1U], Eurydice_slice out[1U]) {
2811 libcrux_sha3_generic_keccak_KeccakState_48 s =
2812 libcrux_sha3_generic_keccak_new_1e_f4();
2813 for (size_t i = (size_t)0U;
2814 i < Eurydice_slice_len(data[0U], uint8_t) / (size_t)136U; i++) {
2815 size_t i0 = i;
2816 libcrux_sha3_generic_keccak_KeccakState_48 *uu____0 = &s;
2817 /* Passing arrays by value in Rust generates a copy in C */
2818 Eurydice_slice copy_of_data[1U];
2819 memcpy(copy_of_data, data, (size_t)1U * sizeof(Eurydice_slice));
2820 Eurydice_slice ret[1U];
2821 libcrux_sha3_portable_keccak_slice_n_5a(copy_of_data, i0 * (size_t)136U,
2822 (size_t)136U, ret);
2823 libcrux_sha3_generic_keccak_absorb_block_df0(uu____0, ret);
2824 }
2825 size_t rem = Eurydice_slice_len(data[0U], uint8_t) % (size_t)136U;
2826 libcrux_sha3_generic_keccak_KeccakState_48 *uu____2 = &s;
2827 /* Passing arrays by value in Rust generates a copy in C */
2828 Eurydice_slice copy_of_data[1U];
2829 memcpy(copy_of_data, data, (size_t)1U * sizeof(Eurydice_slice));
2830 Eurydice_slice ret[1U];
2831 libcrux_sha3_portable_keccak_slice_n_5a(
2832 copy_of_data, Eurydice_slice_len(data[0U], uint8_t) - rem, rem, ret);
2833 libcrux_sha3_generic_keccak_absorb_final_c70(uu____2, ret);
2834 size_t outlen = Eurydice_slice_len(out[0U], uint8_t);
2835 size_t blocks = outlen / (size_t)136U;
2836 size_t last = outlen - outlen % (size_t)136U;
2837 if (blocks == (size_t)0U) {
2838 libcrux_sha3_generic_keccak_squeeze_first_and_last_c50(&s, out);
2839 } else {
2840 Eurydice_slice_uint8_t_1size_t__x2 uu____4 =
2841 libcrux_sha3_portable_keccak_split_at_mut_n_5a(out, (size_t)136U);
2842 Eurydice_slice o0[1U];
2843 memcpy(o0, uu____4.fst, (size_t)1U * sizeof(Eurydice_slice));
2844 Eurydice_slice o1[1U];
2845 memcpy(o1, uu____4.snd, (size_t)1U * sizeof(Eurydice_slice));
2846 libcrux_sha3_generic_keccak_squeeze_first_block_840(&s, o0);
2847 core_ops_range_Range_b3 iter =
2848 core_iter_traits_collect___core__iter__traits__collect__IntoIterator_for_I__1__into_iter(
2849 (CLITERAL(core_ops_range_Range_b3){.start = (size_t)1U,
2850 .end = blocks}),
2851 core_ops_range_Range_b3, core_ops_range_Range_b3);
2852 while (true) {
2853 if (core_iter_range___core__iter__traits__iterator__Iterator_for_core__ops__range__Range_A___6__next(
2854 &iter, size_t, Option_b3)
2855 .tag == None) {
2856 break;
2857 } else {
2858 Eurydice_slice_uint8_t_1size_t__x2 uu____5 =
2859 libcrux_sha3_portable_keccak_split_at_mut_n_5a(o1, (size_t)136U);
2860 Eurydice_slice o[1U];
2861 memcpy(o, uu____5.fst, (size_t)1U * sizeof(Eurydice_slice));
2862 Eurydice_slice orest[1U];
2863 memcpy(orest, uu____5.snd, (size_t)1U * sizeof(Eurydice_slice));
2864 libcrux_sha3_generic_keccak_squeeze_next_block_fc0(&s, o);
2865 memcpy(o1, orest, (size_t)1U * sizeof(Eurydice_slice));
2866 }
2867 }
2868 if (last < outlen) {
2869 libcrux_sha3_generic_keccak_squeeze_last_cf0(s, o1);
2870 }
2871 }
2872 }
2873
2874 /**
2875 A monomorphic instance of libcrux_sha3.portable.keccakx1
2876 with const generics
2877 - RATE= 136
2878 - DELIM= 6
2879 */
libcrux_sha3_portable_keccakx1_ce0(Eurydice_slice data[1U],Eurydice_slice out[1U])2880 static KRML_MUSTINLINE void libcrux_sha3_portable_keccakx1_ce0(
2881 Eurydice_slice data[1U], Eurydice_slice out[1U]) {
2882 /* Passing arrays by value in Rust generates a copy in C */
2883 Eurydice_slice copy_of_data[1U];
2884 memcpy(copy_of_data, data, (size_t)1U * sizeof(Eurydice_slice));
2885 libcrux_sha3_generic_keccak_keccak_e90(copy_of_data, out);
2886 }
2887
2888 /**
2889 A portable SHA3 256 implementation.
2890 */
libcrux_sha3_portable_sha256(Eurydice_slice digest,Eurydice_slice data)2891 static KRML_MUSTINLINE void libcrux_sha3_portable_sha256(Eurydice_slice digest,
2892 Eurydice_slice data) {
2893 Eurydice_slice buf0[1U] = {data};
2894 Eurydice_slice buf[1U] = {digest};
2895 libcrux_sha3_portable_keccakx1_ce0(buf0, buf);
2896 }
2897
2898 /**
2899 A monomorphic instance of libcrux_sha3.generic_keccak.absorb_final
2900 with types uint64_t
2901 with const generics
2902 - N= 1
2903 - RATE= 136
2904 - DELIM= 31
2905 */
libcrux_sha3_generic_keccak_absorb_final_c71(libcrux_sha3_generic_keccak_KeccakState_48 * s,Eurydice_slice last[1U])2906 static KRML_MUSTINLINE void libcrux_sha3_generic_keccak_absorb_final_c71(
2907 libcrux_sha3_generic_keccak_KeccakState_48 *s, Eurydice_slice last[1U]) {
2908 size_t last_len = Eurydice_slice_len(last[0U], uint8_t);
2909 uint8_t blocks[1U][200U] = {{0U}};
2910 for (size_t i = (size_t)0U; i < (size_t)1U; i++) {
2911 size_t i0 = i;
2912 if (last_len > (size_t)0U) {
2913 Eurydice_slice uu____0 = Eurydice_array_to_subslice2(
2914 blocks[i0], (size_t)0U, last_len, uint8_t);
2915 Eurydice_slice_copy(uu____0, last[i0], uint8_t);
2916 }
2917 blocks[i0][last_len] = 31U;
2918 size_t uu____1 = i0;
2919 size_t uu____2 = (size_t)136U - (size_t)1U;
2920 blocks[uu____1][uu____2] = (uint32_t)blocks[uu____1][uu____2] | 128U;
2921 }
2922 uint64_t(*uu____3)[5U] = s->st;
2923 uint8_t uu____4[1U][200U];
2924 memcpy(uu____4, blocks, (size_t)1U * sizeof(uint8_t[200U]));
2925 libcrux_sha3_portable_keccak_load_block_full_5a_d20(uu____3, uu____4);
2926 libcrux_sha3_generic_keccak_keccakf1600_21(s);
2927 }
2928
2929 /**
2930 A monomorphic instance of libcrux_sha3.generic_keccak.keccak
2931 with types uint64_t
2932 with const generics
2933 - N= 1
2934 - RATE= 136
2935 - DELIM= 31
2936 */
libcrux_sha3_generic_keccak_keccak_e91(Eurydice_slice data[1U],Eurydice_slice out[1U])2937 static KRML_MUSTINLINE void libcrux_sha3_generic_keccak_keccak_e91(
2938 Eurydice_slice data[1U], Eurydice_slice out[1U]) {
2939 libcrux_sha3_generic_keccak_KeccakState_48 s =
2940 libcrux_sha3_generic_keccak_new_1e_f4();
2941 for (size_t i = (size_t)0U;
2942 i < Eurydice_slice_len(data[0U], uint8_t) / (size_t)136U; i++) {
2943 size_t i0 = i;
2944 libcrux_sha3_generic_keccak_KeccakState_48 *uu____0 = &s;
2945 /* Passing arrays by value in Rust generates a copy in C */
2946 Eurydice_slice copy_of_data[1U];
2947 memcpy(copy_of_data, data, (size_t)1U * sizeof(Eurydice_slice));
2948 Eurydice_slice ret[1U];
2949 libcrux_sha3_portable_keccak_slice_n_5a(copy_of_data, i0 * (size_t)136U,
2950 (size_t)136U, ret);
2951 libcrux_sha3_generic_keccak_absorb_block_df0(uu____0, ret);
2952 }
2953 size_t rem = Eurydice_slice_len(data[0U], uint8_t) % (size_t)136U;
2954 libcrux_sha3_generic_keccak_KeccakState_48 *uu____2 = &s;
2955 /* Passing arrays by value in Rust generates a copy in C */
2956 Eurydice_slice copy_of_data[1U];
2957 memcpy(copy_of_data, data, (size_t)1U * sizeof(Eurydice_slice));
2958 Eurydice_slice ret[1U];
2959 libcrux_sha3_portable_keccak_slice_n_5a(
2960 copy_of_data, Eurydice_slice_len(data[0U], uint8_t) - rem, rem, ret);
2961 libcrux_sha3_generic_keccak_absorb_final_c71(uu____2, ret);
2962 size_t outlen = Eurydice_slice_len(out[0U], uint8_t);
2963 size_t blocks = outlen / (size_t)136U;
2964 size_t last = outlen - outlen % (size_t)136U;
2965 if (blocks == (size_t)0U) {
2966 libcrux_sha3_generic_keccak_squeeze_first_and_last_c50(&s, out);
2967 } else {
2968 Eurydice_slice_uint8_t_1size_t__x2 uu____4 =
2969 libcrux_sha3_portable_keccak_split_at_mut_n_5a(out, (size_t)136U);
2970 Eurydice_slice o0[1U];
2971 memcpy(o0, uu____4.fst, (size_t)1U * sizeof(Eurydice_slice));
2972 Eurydice_slice o1[1U];
2973 memcpy(o1, uu____4.snd, (size_t)1U * sizeof(Eurydice_slice));
2974 libcrux_sha3_generic_keccak_squeeze_first_block_840(&s, o0);
2975 core_ops_range_Range_b3 iter =
2976 core_iter_traits_collect___core__iter__traits__collect__IntoIterator_for_I__1__into_iter(
2977 (CLITERAL(core_ops_range_Range_b3){.start = (size_t)1U,
2978 .end = blocks}),
2979 core_ops_range_Range_b3, core_ops_range_Range_b3);
2980 while (true) {
2981 if (core_iter_range___core__iter__traits__iterator__Iterator_for_core__ops__range__Range_A___6__next(
2982 &iter, size_t, Option_b3)
2983 .tag == None) {
2984 break;
2985 } else {
2986 Eurydice_slice_uint8_t_1size_t__x2 uu____5 =
2987 libcrux_sha3_portable_keccak_split_at_mut_n_5a(o1, (size_t)136U);
2988 Eurydice_slice o[1U];
2989 memcpy(o, uu____5.fst, (size_t)1U * sizeof(Eurydice_slice));
2990 Eurydice_slice orest[1U];
2991 memcpy(orest, uu____5.snd, (size_t)1U * sizeof(Eurydice_slice));
2992 libcrux_sha3_generic_keccak_squeeze_next_block_fc0(&s, o);
2993 memcpy(o1, orest, (size_t)1U * sizeof(Eurydice_slice));
2994 }
2995 }
2996 if (last < outlen) {
2997 libcrux_sha3_generic_keccak_squeeze_last_cf0(s, o1);
2998 }
2999 }
3000 }
3001
3002 /**
3003 A monomorphic instance of libcrux_sha3.portable.keccakx1
3004 with const generics
3005 - RATE= 136
3006 - DELIM= 31
3007 */
libcrux_sha3_portable_keccakx1_ce1(Eurydice_slice data[1U],Eurydice_slice out[1U])3008 static KRML_MUSTINLINE void libcrux_sha3_portable_keccakx1_ce1(
3009 Eurydice_slice data[1U], Eurydice_slice out[1U]) {
3010 /* Passing arrays by value in Rust generates a copy in C */
3011 Eurydice_slice copy_of_data[1U];
3012 memcpy(copy_of_data, data, (size_t)1U * sizeof(Eurydice_slice));
3013 libcrux_sha3_generic_keccak_keccak_e91(copy_of_data, out);
3014 }
3015
3016 /**
3017 A portable SHAKE256 implementation.
3018 */
libcrux_sha3_portable_shake256(Eurydice_slice digest,Eurydice_slice data)3019 static KRML_MUSTINLINE void libcrux_sha3_portable_shake256(
3020 Eurydice_slice digest, Eurydice_slice data) {
3021 Eurydice_slice buf0[1U] = {data};
3022 Eurydice_slice buf[1U] = {digest};
3023 libcrux_sha3_portable_keccakx1_ce1(buf0, buf);
3024 }
3025
3026 typedef libcrux_sha3_generic_keccak_KeccakState_48
3027 libcrux_sha3_portable_KeccakState;
3028
3029 /**
3030 Create a new SHAKE-128 state object.
3031 */
3032 static KRML_MUSTINLINE libcrux_sha3_generic_keccak_KeccakState_48
libcrux_sha3_portable_incremental_shake128_init(void)3033 libcrux_sha3_portable_incremental_shake128_init(void) {
3034 return libcrux_sha3_generic_keccak_new_1e_f4();
3035 }
3036
3037 /**
3038 A monomorphic instance of libcrux_sha3.portable_keccak.load_block
3039 with const generics
3040 - RATE= 168
3041 */
libcrux_sha3_portable_keccak_load_block_2c1(uint64_t (* s)[5U],Eurydice_slice blocks[1U])3042 static KRML_MUSTINLINE void libcrux_sha3_portable_keccak_load_block_2c1(
3043 uint64_t (*s)[5U], Eurydice_slice blocks[1U]) {
3044 for (size_t i = (size_t)0U; i < (size_t)168U / (size_t)8U; i++) {
3045 size_t i0 = i;
3046 uint8_t uu____0[8U];
3047 Result_56 dst;
3048 Eurydice_slice_to_array2(
3049 &dst,
3050 Eurydice_slice_subslice2(blocks[0U], (size_t)8U * i0,
3051 (size_t)8U * i0 + (size_t)8U, uint8_t),
3052 Eurydice_slice, uint8_t[8U]);
3053 unwrap_41_ac(dst, uu____0);
3054 size_t uu____1 = i0 / (size_t)5U;
3055 size_t uu____2 = i0 % (size_t)5U;
3056 s[uu____1][uu____2] =
3057 s[uu____1][uu____2] ^ core_num__u64_9__from_le_bytes(uu____0);
3058 }
3059 }
3060
3061 /**
3062 A monomorphic instance of libcrux_sha3.portable_keccak.load_block_full
3063 with const generics
3064 - RATE= 168
3065 */
libcrux_sha3_portable_keccak_load_block_full_df1(uint64_t (* s)[5U],uint8_t blocks[1U][200U])3066 static KRML_MUSTINLINE void libcrux_sha3_portable_keccak_load_block_full_df1(
3067 uint64_t (*s)[5U], uint8_t blocks[1U][200U]) {
3068 Eurydice_slice buf[1U] = {
3069 Eurydice_array_to_slice((size_t)200U, blocks[0U], uint8_t)};
3070 libcrux_sha3_portable_keccak_load_block_2c1(s, buf);
3071 }
3072
3073 /**
3074 This function found in impl {(libcrux_sha3::traits::internal::KeccakItem<1:
3075 usize> for u64)}
3076 */
3077 /**
3078 A monomorphic instance of libcrux_sha3.portable_keccak.load_block_full_5a
3079 with const generics
3080 - RATE= 168
3081 */
libcrux_sha3_portable_keccak_load_block_full_5a_d21(uint64_t (* a)[5U],uint8_t b[1U][200U])3082 static KRML_MUSTINLINE void libcrux_sha3_portable_keccak_load_block_full_5a_d21(
3083 uint64_t (*a)[5U], uint8_t b[1U][200U]) {
3084 uint64_t(*uu____0)[5U] = a;
3085 /* Passing arrays by value in Rust generates a copy in C */
3086 uint8_t copy_of_b[1U][200U];
3087 memcpy(copy_of_b, b, (size_t)1U * sizeof(uint8_t[200U]));
3088 libcrux_sha3_portable_keccak_load_block_full_df1(uu____0, copy_of_b);
3089 }
3090
3091 /**
3092 A monomorphic instance of libcrux_sha3.generic_keccak.absorb_final
3093 with types uint64_t
3094 with const generics
3095 - N= 1
3096 - RATE= 168
3097 - DELIM= 31
3098 */
libcrux_sha3_generic_keccak_absorb_final_c72(libcrux_sha3_generic_keccak_KeccakState_48 * s,Eurydice_slice last[1U])3099 static KRML_MUSTINLINE void libcrux_sha3_generic_keccak_absorb_final_c72(
3100 libcrux_sha3_generic_keccak_KeccakState_48 *s, Eurydice_slice last[1U]) {
3101 size_t last_len = Eurydice_slice_len(last[0U], uint8_t);
3102 uint8_t blocks[1U][200U] = {{0U}};
3103 for (size_t i = (size_t)0U; i < (size_t)1U; i++) {
3104 size_t i0 = i;
3105 if (last_len > (size_t)0U) {
3106 Eurydice_slice uu____0 = Eurydice_array_to_subslice2(
3107 blocks[i0], (size_t)0U, last_len, uint8_t);
3108 Eurydice_slice_copy(uu____0, last[i0], uint8_t);
3109 }
3110 blocks[i0][last_len] = 31U;
3111 size_t uu____1 = i0;
3112 size_t uu____2 = (size_t)168U - (size_t)1U;
3113 blocks[uu____1][uu____2] = (uint32_t)blocks[uu____1][uu____2] | 128U;
3114 }
3115 uint64_t(*uu____3)[5U] = s->st;
3116 uint8_t uu____4[1U][200U];
3117 memcpy(uu____4, blocks, (size_t)1U * sizeof(uint8_t[200U]));
3118 libcrux_sha3_portable_keccak_load_block_full_5a_d21(uu____3, uu____4);
3119 libcrux_sha3_generic_keccak_keccakf1600_21(s);
3120 }
3121
3122 /**
3123 Absorb
3124 */
3125 static KRML_MUSTINLINE void
libcrux_sha3_portable_incremental_shake128_absorb_final(libcrux_sha3_generic_keccak_KeccakState_48 * s,Eurydice_slice data0)3126 libcrux_sha3_portable_incremental_shake128_absorb_final(
3127 libcrux_sha3_generic_keccak_KeccakState_48 *s, Eurydice_slice data0) {
3128 Eurydice_slice buf[1U] = {data0};
3129 libcrux_sha3_generic_keccak_absorb_final_c72(s, buf);
3130 }
3131
3132 /**
3133 A monomorphic instance of libcrux_sha3.portable_keccak.store_block
3134 with const generics
3135 - RATE= 168
3136 */
libcrux_sha3_portable_keccak_store_block_581(uint64_t (* s)[5U],Eurydice_slice out[1U])3137 static KRML_MUSTINLINE void libcrux_sha3_portable_keccak_store_block_581(
3138 uint64_t (*s)[5U], Eurydice_slice out[1U]) {
3139 for (size_t i = (size_t)0U; i < (size_t)168U / (size_t)8U; i++) {
3140 size_t i0 = i;
3141 Eurydice_slice uu____0 = Eurydice_slice_subslice2(
3142 out[0U], (size_t)8U * i0, (size_t)8U * i0 + (size_t)8U, uint8_t);
3143 uint8_t ret[8U];
3144 core_num__u64_9__to_le_bytes(s[i0 / (size_t)5U][i0 % (size_t)5U], ret);
3145 Eurydice_slice_copy(
3146 uu____0, Eurydice_array_to_slice((size_t)8U, ret, uint8_t), uint8_t);
3147 }
3148 }
3149
3150 /**
3151 This function found in impl {(libcrux_sha3::traits::internal::KeccakItem<1:
3152 usize> for u64)}
3153 */
3154 /**
3155 A monomorphic instance of libcrux_sha3.portable_keccak.store_block_5a
3156 with const generics
3157 - RATE= 168
3158 */
libcrux_sha3_portable_keccak_store_block_5a_591(uint64_t (* a)[5U],Eurydice_slice b[1U])3159 static KRML_MUSTINLINE void libcrux_sha3_portable_keccak_store_block_5a_591(
3160 uint64_t (*a)[5U], Eurydice_slice b[1U]) {
3161 libcrux_sha3_portable_keccak_store_block_581(a, b);
3162 }
3163
3164 /**
3165 A monomorphic instance of libcrux_sha3.generic_keccak.squeeze_next_block
3166 with types uint64_t
3167 with const generics
3168 - N= 1
3169 - RATE= 168
3170 */
libcrux_sha3_generic_keccak_squeeze_next_block_fc1(libcrux_sha3_generic_keccak_KeccakState_48 * s,Eurydice_slice out[1U])3171 static KRML_MUSTINLINE void libcrux_sha3_generic_keccak_squeeze_next_block_fc1(
3172 libcrux_sha3_generic_keccak_KeccakState_48 *s, Eurydice_slice out[1U]) {
3173 libcrux_sha3_generic_keccak_keccakf1600_21(s);
3174 libcrux_sha3_portable_keccak_store_block_5a_591(s->st, out);
3175 }
3176
3177 /**
3178 Squeeze another block
3179 */
3180 static KRML_MUSTINLINE void
libcrux_sha3_portable_incremental_shake128_squeeze_next_block(libcrux_sha3_generic_keccak_KeccakState_48 * s,Eurydice_slice out0)3181 libcrux_sha3_portable_incremental_shake128_squeeze_next_block(
3182 libcrux_sha3_generic_keccak_KeccakState_48 *s, Eurydice_slice out0) {
3183 Eurydice_slice buf[1U] = {out0};
3184 libcrux_sha3_generic_keccak_squeeze_next_block_fc1(s, buf);
3185 }
3186
3187 /**
3188 A monomorphic instance of libcrux_sha3.generic_keccak.squeeze_first_block
3189 with types uint64_t
3190 with const generics
3191 - N= 1
3192 - RATE= 168
3193 */
libcrux_sha3_generic_keccak_squeeze_first_block_841(libcrux_sha3_generic_keccak_KeccakState_48 * s,Eurydice_slice out[1U])3194 static KRML_MUSTINLINE void libcrux_sha3_generic_keccak_squeeze_first_block_841(
3195 libcrux_sha3_generic_keccak_KeccakState_48 *s, Eurydice_slice out[1U]) {
3196 libcrux_sha3_portable_keccak_store_block_5a_591(s->st, out);
3197 }
3198
3199 /**
3200 A monomorphic instance of libcrux_sha3.generic_keccak.squeeze_first_three_blocks
3201 with types uint64_t
3202 with const generics
3203 - N= 1
3204 - RATE= 168
3205 */
3206 static KRML_MUSTINLINE void
libcrux_sha3_generic_keccak_squeeze_first_three_blocks_cc(libcrux_sha3_generic_keccak_KeccakState_48 * s,Eurydice_slice out[1U])3207 libcrux_sha3_generic_keccak_squeeze_first_three_blocks_cc(
3208 libcrux_sha3_generic_keccak_KeccakState_48 *s, Eurydice_slice out[1U]) {
3209 Eurydice_slice_uint8_t_1size_t__x2 uu____0 =
3210 libcrux_sha3_portable_keccak_split_at_mut_n_5a(out, (size_t)168U);
3211 Eurydice_slice o0[1U];
3212 memcpy(o0, uu____0.fst, (size_t)1U * sizeof(Eurydice_slice));
3213 Eurydice_slice o10[1U];
3214 memcpy(o10, uu____0.snd, (size_t)1U * sizeof(Eurydice_slice));
3215 libcrux_sha3_generic_keccak_squeeze_first_block_841(s, o0);
3216 Eurydice_slice_uint8_t_1size_t__x2 uu____1 =
3217 libcrux_sha3_portable_keccak_split_at_mut_n_5a(o10, (size_t)168U);
3218 Eurydice_slice o1[1U];
3219 memcpy(o1, uu____1.fst, (size_t)1U * sizeof(Eurydice_slice));
3220 Eurydice_slice o2[1U];
3221 memcpy(o2, uu____1.snd, (size_t)1U * sizeof(Eurydice_slice));
3222 libcrux_sha3_generic_keccak_squeeze_next_block_fc1(s, o1);
3223 libcrux_sha3_generic_keccak_squeeze_next_block_fc1(s, o2);
3224 }
3225
3226 /**
3227 Squeeze three blocks
3228 */
3229 static KRML_MUSTINLINE void
libcrux_sha3_portable_incremental_shake128_squeeze_first_three_blocks(libcrux_sha3_generic_keccak_KeccakState_48 * s,Eurydice_slice out0)3230 libcrux_sha3_portable_incremental_shake128_squeeze_first_three_blocks(
3231 libcrux_sha3_generic_keccak_KeccakState_48 *s, Eurydice_slice out0) {
3232 Eurydice_slice buf[1U] = {out0};
3233 libcrux_sha3_generic_keccak_squeeze_first_three_blocks_cc(s, buf);
3234 }
3235
3236 #define libcrux_sha3_Sha224 0
3237 #define libcrux_sha3_Sha256 1
3238 #define libcrux_sha3_Sha384 2
3239 #define libcrux_sha3_Sha512 3
3240
3241 typedef uint8_t libcrux_sha3_Algorithm;
3242
3243 /**
3244 Returns the output size of a digest.
3245 */
libcrux_sha3_digest_size(libcrux_sha3_Algorithm mode)3246 static inline size_t libcrux_sha3_digest_size(libcrux_sha3_Algorithm mode) {
3247 size_t uu____0;
3248 switch (mode) {
3249 case libcrux_sha3_Sha224: {
3250 uu____0 = (size_t)28U;
3251 break;
3252 }
3253 case libcrux_sha3_Sha256: {
3254 uu____0 = (size_t)32U;
3255 break;
3256 }
3257 case libcrux_sha3_Sha384: {
3258 uu____0 = (size_t)48U;
3259 break;
3260 }
3261 case libcrux_sha3_Sha512: {
3262 uu____0 = (size_t)64U;
3263 break;
3264 }
3265 default: {
3266 KRML_HOST_EPRINTF("KaRaMeL incomplete match at %s:%d\n", __FILE__,
3267 __LINE__);
3268 KRML_HOST_EXIT(253U);
3269 }
3270 }
3271 return uu____0;
3272 }
3273
3274 /**
3275 A monomorphic instance of libcrux_sha3.portable_keccak.load_block
3276 with const generics
3277 - RATE= 144
3278 */
libcrux_sha3_portable_keccak_load_block_2c2(uint64_t (* s)[5U],Eurydice_slice blocks[1U])3279 static KRML_MUSTINLINE void libcrux_sha3_portable_keccak_load_block_2c2(
3280 uint64_t (*s)[5U], Eurydice_slice blocks[1U]) {
3281 for (size_t i = (size_t)0U; i < (size_t)144U / (size_t)8U; i++) {
3282 size_t i0 = i;
3283 uint8_t uu____0[8U];
3284 Result_56 dst;
3285 Eurydice_slice_to_array2(
3286 &dst,
3287 Eurydice_slice_subslice2(blocks[0U], (size_t)8U * i0,
3288 (size_t)8U * i0 + (size_t)8U, uint8_t),
3289 Eurydice_slice, uint8_t[8U]);
3290 unwrap_41_ac(dst, uu____0);
3291 size_t uu____1 = i0 / (size_t)5U;
3292 size_t uu____2 = i0 % (size_t)5U;
3293 s[uu____1][uu____2] =
3294 s[uu____1][uu____2] ^ core_num__u64_9__from_le_bytes(uu____0);
3295 }
3296 }
3297
3298 /**
3299 This function found in impl {(libcrux_sha3::traits::internal::KeccakItem<1:
3300 usize> for u64)}
3301 */
3302 /**
3303 A monomorphic instance of libcrux_sha3.portable_keccak.load_block_5a
3304 with const generics
3305 - RATE= 144
3306 */
libcrux_sha3_portable_keccak_load_block_5a_b81(uint64_t (* a)[5U],Eurydice_slice b[1U])3307 static KRML_MUSTINLINE void libcrux_sha3_portable_keccak_load_block_5a_b81(
3308 uint64_t (*a)[5U], Eurydice_slice b[1U]) {
3309 uint64_t(*uu____0)[5U] = a;
3310 /* Passing arrays by value in Rust generates a copy in C */
3311 Eurydice_slice copy_of_b[1U];
3312 memcpy(copy_of_b, b, (size_t)1U * sizeof(Eurydice_slice));
3313 libcrux_sha3_portable_keccak_load_block_2c2(uu____0, copy_of_b);
3314 }
3315
3316 /**
3317 A monomorphic instance of libcrux_sha3.generic_keccak.absorb_block
3318 with types uint64_t
3319 with const generics
3320 - N= 1
3321 - RATE= 144
3322 */
libcrux_sha3_generic_keccak_absorb_block_df1(libcrux_sha3_generic_keccak_KeccakState_48 * s,Eurydice_slice blocks[1U])3323 static KRML_MUSTINLINE void libcrux_sha3_generic_keccak_absorb_block_df1(
3324 libcrux_sha3_generic_keccak_KeccakState_48 *s, Eurydice_slice blocks[1U]) {
3325 uint64_t(*uu____0)[5U] = s->st;
3326 Eurydice_slice uu____1[1U];
3327 memcpy(uu____1, blocks, (size_t)1U * sizeof(Eurydice_slice));
3328 libcrux_sha3_portable_keccak_load_block_5a_b81(uu____0, uu____1);
3329 libcrux_sha3_generic_keccak_keccakf1600_21(s);
3330 }
3331
3332 /**
3333 A monomorphic instance of libcrux_sha3.portable_keccak.load_block_full
3334 with const generics
3335 - RATE= 144
3336 */
libcrux_sha3_portable_keccak_load_block_full_df2(uint64_t (* s)[5U],uint8_t blocks[1U][200U])3337 static KRML_MUSTINLINE void libcrux_sha3_portable_keccak_load_block_full_df2(
3338 uint64_t (*s)[5U], uint8_t blocks[1U][200U]) {
3339 Eurydice_slice buf[1U] = {
3340 Eurydice_array_to_slice((size_t)200U, blocks[0U], uint8_t)};
3341 libcrux_sha3_portable_keccak_load_block_2c2(s, buf);
3342 }
3343
3344 /**
3345 This function found in impl {(libcrux_sha3::traits::internal::KeccakItem<1:
3346 usize> for u64)}
3347 */
3348 /**
3349 A monomorphic instance of libcrux_sha3.portable_keccak.load_block_full_5a
3350 with const generics
3351 - RATE= 144
3352 */
libcrux_sha3_portable_keccak_load_block_full_5a_d22(uint64_t (* a)[5U],uint8_t b[1U][200U])3353 static KRML_MUSTINLINE void libcrux_sha3_portable_keccak_load_block_full_5a_d22(
3354 uint64_t (*a)[5U], uint8_t b[1U][200U]) {
3355 uint64_t(*uu____0)[5U] = a;
3356 /* Passing arrays by value in Rust generates a copy in C */
3357 uint8_t copy_of_b[1U][200U];
3358 memcpy(copy_of_b, b, (size_t)1U * sizeof(uint8_t[200U]));
3359 libcrux_sha3_portable_keccak_load_block_full_df2(uu____0, copy_of_b);
3360 }
3361
3362 /**
3363 A monomorphic instance of libcrux_sha3.generic_keccak.absorb_final
3364 with types uint64_t
3365 with const generics
3366 - N= 1
3367 - RATE= 144
3368 - DELIM= 6
3369 */
libcrux_sha3_generic_keccak_absorb_final_c73(libcrux_sha3_generic_keccak_KeccakState_48 * s,Eurydice_slice last[1U])3370 static KRML_MUSTINLINE void libcrux_sha3_generic_keccak_absorb_final_c73(
3371 libcrux_sha3_generic_keccak_KeccakState_48 *s, Eurydice_slice last[1U]) {
3372 size_t last_len = Eurydice_slice_len(last[0U], uint8_t);
3373 uint8_t blocks[1U][200U] = {{0U}};
3374 for (size_t i = (size_t)0U; i < (size_t)1U; i++) {
3375 size_t i0 = i;
3376 if (last_len > (size_t)0U) {
3377 Eurydice_slice uu____0 = Eurydice_array_to_subslice2(
3378 blocks[i0], (size_t)0U, last_len, uint8_t);
3379 Eurydice_slice_copy(uu____0, last[i0], uint8_t);
3380 }
3381 blocks[i0][last_len] = 6U;
3382 size_t uu____1 = i0;
3383 size_t uu____2 = (size_t)144U - (size_t)1U;
3384 blocks[uu____1][uu____2] = (uint32_t)blocks[uu____1][uu____2] | 128U;
3385 }
3386 uint64_t(*uu____3)[5U] = s->st;
3387 uint8_t uu____4[1U][200U];
3388 memcpy(uu____4, blocks, (size_t)1U * sizeof(uint8_t[200U]));
3389 libcrux_sha3_portable_keccak_load_block_full_5a_d22(uu____3, uu____4);
3390 libcrux_sha3_generic_keccak_keccakf1600_21(s);
3391 }
3392
3393 /**
3394 A monomorphic instance of libcrux_sha3.portable_keccak.store_block
3395 with const generics
3396 - RATE= 144
3397 */
libcrux_sha3_portable_keccak_store_block_582(uint64_t (* s)[5U],Eurydice_slice out[1U])3398 static KRML_MUSTINLINE void libcrux_sha3_portable_keccak_store_block_582(
3399 uint64_t (*s)[5U], Eurydice_slice out[1U]) {
3400 for (size_t i = (size_t)0U; i < (size_t)144U / (size_t)8U; i++) {
3401 size_t i0 = i;
3402 Eurydice_slice uu____0 = Eurydice_slice_subslice2(
3403 out[0U], (size_t)8U * i0, (size_t)8U * i0 + (size_t)8U, uint8_t);
3404 uint8_t ret[8U];
3405 core_num__u64_9__to_le_bytes(s[i0 / (size_t)5U][i0 % (size_t)5U], ret);
3406 Eurydice_slice_copy(
3407 uu____0, Eurydice_array_to_slice((size_t)8U, ret, uint8_t), uint8_t);
3408 }
3409 }
3410
3411 /**
3412 A monomorphic instance of libcrux_sha3.portable_keccak.store_block_full
3413 with const generics
3414 - RATE= 144
3415 */
libcrux_sha3_portable_keccak_store_block_full_2d1(uint64_t (* s)[5U],uint8_t ret[1U][200U])3416 static KRML_MUSTINLINE void libcrux_sha3_portable_keccak_store_block_full_2d1(
3417 uint64_t (*s)[5U], uint8_t ret[1U][200U]) {
3418 uint8_t out[200U] = {0U};
3419 Eurydice_slice buf[1U] = {
3420 Eurydice_array_to_slice((size_t)200U, out, uint8_t)};
3421 libcrux_sha3_portable_keccak_store_block_582(s, buf);
3422 /* Passing arrays by value in Rust generates a copy in C */
3423 uint8_t copy_of_out[200U];
3424 memcpy(copy_of_out, out, (size_t)200U * sizeof(uint8_t));
3425 memcpy(ret[0U], copy_of_out, (size_t)200U * sizeof(uint8_t));
3426 }
3427
3428 /**
3429 This function found in impl {(libcrux_sha3::traits::internal::KeccakItem<1:
3430 usize> for u64)}
3431 */
3432 /**
3433 A monomorphic instance of libcrux_sha3.portable_keccak.store_block_full_5a
3434 with const generics
3435 - RATE= 144
3436 */
3437 static KRML_MUSTINLINE void
libcrux_sha3_portable_keccak_store_block_full_5a_291(uint64_t (* a)[5U],uint8_t ret[1U][200U])3438 libcrux_sha3_portable_keccak_store_block_full_5a_291(uint64_t (*a)[5U],
3439 uint8_t ret[1U][200U]) {
3440 libcrux_sha3_portable_keccak_store_block_full_2d1(a, ret);
3441 }
3442
3443 /**
3444 A monomorphic instance of libcrux_sha3.generic_keccak.squeeze_first_and_last
3445 with types uint64_t
3446 with const generics
3447 - N= 1
3448 - RATE= 144
3449 */
3450 static KRML_MUSTINLINE void
libcrux_sha3_generic_keccak_squeeze_first_and_last_c51(libcrux_sha3_generic_keccak_KeccakState_48 * s,Eurydice_slice out[1U])3451 libcrux_sha3_generic_keccak_squeeze_first_and_last_c51(
3452 libcrux_sha3_generic_keccak_KeccakState_48 *s, Eurydice_slice out[1U]) {
3453 uint8_t b[1U][200U];
3454 libcrux_sha3_portable_keccak_store_block_full_5a_291(s->st, b);
3455 for (size_t i = (size_t)0U; i < (size_t)1U; i++) {
3456 size_t i0 = i;
3457 Eurydice_slice uu____0 = out[i0];
3458 uint8_t *uu____1 = b[i0];
3459 core_ops_range_Range_b3 lit;
3460 lit.start = (size_t)0U;
3461 lit.end = Eurydice_slice_len(out[i0], uint8_t);
3462 Eurydice_slice_copy(
3463 uu____0,
3464 Eurydice_array_to_subslice((size_t)200U, uu____1, lit, uint8_t,
3465 core_ops_range_Range_b3),
3466 uint8_t);
3467 }
3468 }
3469
3470 /**
3471 This function found in impl {(libcrux_sha3::traits::internal::KeccakItem<1:
3472 usize> for u64)}
3473 */
3474 /**
3475 A monomorphic instance of libcrux_sha3.portable_keccak.store_block_5a
3476 with const generics
3477 - RATE= 144
3478 */
libcrux_sha3_portable_keccak_store_block_5a_592(uint64_t (* a)[5U],Eurydice_slice b[1U])3479 static KRML_MUSTINLINE void libcrux_sha3_portable_keccak_store_block_5a_592(
3480 uint64_t (*a)[5U], Eurydice_slice b[1U]) {
3481 libcrux_sha3_portable_keccak_store_block_582(a, b);
3482 }
3483
3484 /**
3485 A monomorphic instance of libcrux_sha3.generic_keccak.squeeze_first_block
3486 with types uint64_t
3487 with const generics
3488 - N= 1
3489 - RATE= 144
3490 */
libcrux_sha3_generic_keccak_squeeze_first_block_842(libcrux_sha3_generic_keccak_KeccakState_48 * s,Eurydice_slice out[1U])3491 static KRML_MUSTINLINE void libcrux_sha3_generic_keccak_squeeze_first_block_842(
3492 libcrux_sha3_generic_keccak_KeccakState_48 *s, Eurydice_slice out[1U]) {
3493 libcrux_sha3_portable_keccak_store_block_5a_592(s->st, out);
3494 }
3495
3496 /**
3497 A monomorphic instance of libcrux_sha3.generic_keccak.squeeze_next_block
3498 with types uint64_t
3499 with const generics
3500 - N= 1
3501 - RATE= 144
3502 */
libcrux_sha3_generic_keccak_squeeze_next_block_fc2(libcrux_sha3_generic_keccak_KeccakState_48 * s,Eurydice_slice out[1U])3503 static KRML_MUSTINLINE void libcrux_sha3_generic_keccak_squeeze_next_block_fc2(
3504 libcrux_sha3_generic_keccak_KeccakState_48 *s, Eurydice_slice out[1U]) {
3505 libcrux_sha3_generic_keccak_keccakf1600_21(s);
3506 libcrux_sha3_portable_keccak_store_block_5a_592(s->st, out);
3507 }
3508
3509 /**
3510 A monomorphic instance of libcrux_sha3.generic_keccak.squeeze_last
3511 with types uint64_t
3512 with const generics
3513 - N= 1
3514 - RATE= 144
3515 */
libcrux_sha3_generic_keccak_squeeze_last_cf1(libcrux_sha3_generic_keccak_KeccakState_48 s,Eurydice_slice out[1U])3516 static KRML_MUSTINLINE void libcrux_sha3_generic_keccak_squeeze_last_cf1(
3517 libcrux_sha3_generic_keccak_KeccakState_48 s, Eurydice_slice out[1U]) {
3518 libcrux_sha3_generic_keccak_keccakf1600_21(&s);
3519 uint8_t b[1U][200U];
3520 libcrux_sha3_portable_keccak_store_block_full_5a_291(s.st, b);
3521 for (size_t i = (size_t)0U; i < (size_t)1U; i++) {
3522 size_t i0 = i;
3523 Eurydice_slice uu____0 = out[i0];
3524 uint8_t *uu____1 = b[i0];
3525 core_ops_range_Range_b3 lit;
3526 lit.start = (size_t)0U;
3527 lit.end = Eurydice_slice_len(out[i0], uint8_t);
3528 Eurydice_slice_copy(
3529 uu____0,
3530 Eurydice_array_to_subslice((size_t)200U, uu____1, lit, uint8_t,
3531 core_ops_range_Range_b3),
3532 uint8_t);
3533 }
3534 }
3535
3536 /**
3537 A monomorphic instance of libcrux_sha3.generic_keccak.keccak
3538 with types uint64_t
3539 with const generics
3540 - N= 1
3541 - RATE= 144
3542 - DELIM= 6
3543 */
libcrux_sha3_generic_keccak_keccak_e92(Eurydice_slice data[1U],Eurydice_slice out[1U])3544 static KRML_MUSTINLINE void libcrux_sha3_generic_keccak_keccak_e92(
3545 Eurydice_slice data[1U], Eurydice_slice out[1U]) {
3546 libcrux_sha3_generic_keccak_KeccakState_48 s =
3547 libcrux_sha3_generic_keccak_new_1e_f4();
3548 for (size_t i = (size_t)0U;
3549 i < Eurydice_slice_len(data[0U], uint8_t) / (size_t)144U; i++) {
3550 size_t i0 = i;
3551 libcrux_sha3_generic_keccak_KeccakState_48 *uu____0 = &s;
3552 /* Passing arrays by value in Rust generates a copy in C */
3553 Eurydice_slice copy_of_data[1U];
3554 memcpy(copy_of_data, data, (size_t)1U * sizeof(Eurydice_slice));
3555 Eurydice_slice ret[1U];
3556 libcrux_sha3_portable_keccak_slice_n_5a(copy_of_data, i0 * (size_t)144U,
3557 (size_t)144U, ret);
3558 libcrux_sha3_generic_keccak_absorb_block_df1(uu____0, ret);
3559 }
3560 size_t rem = Eurydice_slice_len(data[0U], uint8_t) % (size_t)144U;
3561 libcrux_sha3_generic_keccak_KeccakState_48 *uu____2 = &s;
3562 /* Passing arrays by value in Rust generates a copy in C */
3563 Eurydice_slice copy_of_data[1U];
3564 memcpy(copy_of_data, data, (size_t)1U * sizeof(Eurydice_slice));
3565 Eurydice_slice ret[1U];
3566 libcrux_sha3_portable_keccak_slice_n_5a(
3567 copy_of_data, Eurydice_slice_len(data[0U], uint8_t) - rem, rem, ret);
3568 libcrux_sha3_generic_keccak_absorb_final_c73(uu____2, ret);
3569 size_t outlen = Eurydice_slice_len(out[0U], uint8_t);
3570 size_t blocks = outlen / (size_t)144U;
3571 size_t last = outlen - outlen % (size_t)144U;
3572 if (blocks == (size_t)0U) {
3573 libcrux_sha3_generic_keccak_squeeze_first_and_last_c51(&s, out);
3574 } else {
3575 Eurydice_slice_uint8_t_1size_t__x2 uu____4 =
3576 libcrux_sha3_portable_keccak_split_at_mut_n_5a(out, (size_t)144U);
3577 Eurydice_slice o0[1U];
3578 memcpy(o0, uu____4.fst, (size_t)1U * sizeof(Eurydice_slice));
3579 Eurydice_slice o1[1U];
3580 memcpy(o1, uu____4.snd, (size_t)1U * sizeof(Eurydice_slice));
3581 libcrux_sha3_generic_keccak_squeeze_first_block_842(&s, o0);
3582 core_ops_range_Range_b3 iter =
3583 core_iter_traits_collect___core__iter__traits__collect__IntoIterator_for_I__1__into_iter(
3584 (CLITERAL(core_ops_range_Range_b3){.start = (size_t)1U,
3585 .end = blocks}),
3586 core_ops_range_Range_b3, core_ops_range_Range_b3);
3587 while (true) {
3588 if (core_iter_range___core__iter__traits__iterator__Iterator_for_core__ops__range__Range_A___6__next(
3589 &iter, size_t, Option_b3)
3590 .tag == None) {
3591 break;
3592 } else {
3593 Eurydice_slice_uint8_t_1size_t__x2 uu____5 =
3594 libcrux_sha3_portable_keccak_split_at_mut_n_5a(o1, (size_t)144U);
3595 Eurydice_slice o[1U];
3596 memcpy(o, uu____5.fst, (size_t)1U * sizeof(Eurydice_slice));
3597 Eurydice_slice orest[1U];
3598 memcpy(orest, uu____5.snd, (size_t)1U * sizeof(Eurydice_slice));
3599 libcrux_sha3_generic_keccak_squeeze_next_block_fc2(&s, o);
3600 memcpy(o1, orest, (size_t)1U * sizeof(Eurydice_slice));
3601 }
3602 }
3603 if (last < outlen) {
3604 libcrux_sha3_generic_keccak_squeeze_last_cf1(s, o1);
3605 }
3606 }
3607 }
3608
3609 /**
3610 A monomorphic instance of libcrux_sha3.portable.keccakx1
3611 with const generics
3612 - RATE= 144
3613 - DELIM= 6
3614 */
libcrux_sha3_portable_keccakx1_ce2(Eurydice_slice data[1U],Eurydice_slice out[1U])3615 static KRML_MUSTINLINE void libcrux_sha3_portable_keccakx1_ce2(
3616 Eurydice_slice data[1U], Eurydice_slice out[1U]) {
3617 /* Passing arrays by value in Rust generates a copy in C */
3618 Eurydice_slice copy_of_data[1U];
3619 memcpy(copy_of_data, data, (size_t)1U * sizeof(Eurydice_slice));
3620 libcrux_sha3_generic_keccak_keccak_e92(copy_of_data, out);
3621 }
3622
3623 /**
3624 A portable SHA3 224 implementation.
3625 */
libcrux_sha3_portable_sha224(Eurydice_slice digest,Eurydice_slice data)3626 static KRML_MUSTINLINE void libcrux_sha3_portable_sha224(Eurydice_slice digest,
3627 Eurydice_slice data) {
3628 Eurydice_slice buf0[1U] = {data};
3629 Eurydice_slice buf[1U] = {digest};
3630 libcrux_sha3_portable_keccakx1_ce2(buf0, buf);
3631 }
3632
3633 /**
3634 A monomorphic instance of libcrux_sha3.portable_keccak.load_block
3635 with const generics
3636 - RATE= 104
3637 */
libcrux_sha3_portable_keccak_load_block_2c3(uint64_t (* s)[5U],Eurydice_slice blocks[1U])3638 static KRML_MUSTINLINE void libcrux_sha3_portable_keccak_load_block_2c3(
3639 uint64_t (*s)[5U], Eurydice_slice blocks[1U]) {
3640 for (size_t i = (size_t)0U; i < (size_t)104U / (size_t)8U; i++) {
3641 size_t i0 = i;
3642 uint8_t uu____0[8U];
3643 Result_56 dst;
3644 Eurydice_slice_to_array2(
3645 &dst,
3646 Eurydice_slice_subslice2(blocks[0U], (size_t)8U * i0,
3647 (size_t)8U * i0 + (size_t)8U, uint8_t),
3648 Eurydice_slice, uint8_t[8U]);
3649 unwrap_41_ac(dst, uu____0);
3650 size_t uu____1 = i0 / (size_t)5U;
3651 size_t uu____2 = i0 % (size_t)5U;
3652 s[uu____1][uu____2] =
3653 s[uu____1][uu____2] ^ core_num__u64_9__from_le_bytes(uu____0);
3654 }
3655 }
3656
3657 /**
3658 This function found in impl {(libcrux_sha3::traits::internal::KeccakItem<1:
3659 usize> for u64)}
3660 */
3661 /**
3662 A monomorphic instance of libcrux_sha3.portable_keccak.load_block_5a
3663 with const generics
3664 - RATE= 104
3665 */
libcrux_sha3_portable_keccak_load_block_5a_b82(uint64_t (* a)[5U],Eurydice_slice b[1U])3666 static KRML_MUSTINLINE void libcrux_sha3_portable_keccak_load_block_5a_b82(
3667 uint64_t (*a)[5U], Eurydice_slice b[1U]) {
3668 uint64_t(*uu____0)[5U] = a;
3669 /* Passing arrays by value in Rust generates a copy in C */
3670 Eurydice_slice copy_of_b[1U];
3671 memcpy(copy_of_b, b, (size_t)1U * sizeof(Eurydice_slice));
3672 libcrux_sha3_portable_keccak_load_block_2c3(uu____0, copy_of_b);
3673 }
3674
3675 /**
3676 A monomorphic instance of libcrux_sha3.generic_keccak.absorb_block
3677 with types uint64_t
3678 with const generics
3679 - N= 1
3680 - RATE= 104
3681 */
libcrux_sha3_generic_keccak_absorb_block_df2(libcrux_sha3_generic_keccak_KeccakState_48 * s,Eurydice_slice blocks[1U])3682 static KRML_MUSTINLINE void libcrux_sha3_generic_keccak_absorb_block_df2(
3683 libcrux_sha3_generic_keccak_KeccakState_48 *s, Eurydice_slice blocks[1U]) {
3684 uint64_t(*uu____0)[5U] = s->st;
3685 Eurydice_slice uu____1[1U];
3686 memcpy(uu____1, blocks, (size_t)1U * sizeof(Eurydice_slice));
3687 libcrux_sha3_portable_keccak_load_block_5a_b82(uu____0, uu____1);
3688 libcrux_sha3_generic_keccak_keccakf1600_21(s);
3689 }
3690
3691 /**
3692 A monomorphic instance of libcrux_sha3.portable_keccak.load_block_full
3693 with const generics
3694 - RATE= 104
3695 */
libcrux_sha3_portable_keccak_load_block_full_df3(uint64_t (* s)[5U],uint8_t blocks[1U][200U])3696 static KRML_MUSTINLINE void libcrux_sha3_portable_keccak_load_block_full_df3(
3697 uint64_t (*s)[5U], uint8_t blocks[1U][200U]) {
3698 Eurydice_slice buf[1U] = {
3699 Eurydice_array_to_slice((size_t)200U, blocks[0U], uint8_t)};
3700 libcrux_sha3_portable_keccak_load_block_2c3(s, buf);
3701 }
3702
3703 /**
3704 This function found in impl {(libcrux_sha3::traits::internal::KeccakItem<1:
3705 usize> for u64)}
3706 */
3707 /**
3708 A monomorphic instance of libcrux_sha3.portable_keccak.load_block_full_5a
3709 with const generics
3710 - RATE= 104
3711 */
libcrux_sha3_portable_keccak_load_block_full_5a_d23(uint64_t (* a)[5U],uint8_t b[1U][200U])3712 static KRML_MUSTINLINE void libcrux_sha3_portable_keccak_load_block_full_5a_d23(
3713 uint64_t (*a)[5U], uint8_t b[1U][200U]) {
3714 uint64_t(*uu____0)[5U] = a;
3715 /* Passing arrays by value in Rust generates a copy in C */
3716 uint8_t copy_of_b[1U][200U];
3717 memcpy(copy_of_b, b, (size_t)1U * sizeof(uint8_t[200U]));
3718 libcrux_sha3_portable_keccak_load_block_full_df3(uu____0, copy_of_b);
3719 }
3720
3721 /**
3722 A monomorphic instance of libcrux_sha3.generic_keccak.absorb_final
3723 with types uint64_t
3724 with const generics
3725 - N= 1
3726 - RATE= 104
3727 - DELIM= 6
3728 */
libcrux_sha3_generic_keccak_absorb_final_c74(libcrux_sha3_generic_keccak_KeccakState_48 * s,Eurydice_slice last[1U])3729 static KRML_MUSTINLINE void libcrux_sha3_generic_keccak_absorb_final_c74(
3730 libcrux_sha3_generic_keccak_KeccakState_48 *s, Eurydice_slice last[1U]) {
3731 size_t last_len = Eurydice_slice_len(last[0U], uint8_t);
3732 uint8_t blocks[1U][200U] = {{0U}};
3733 for (size_t i = (size_t)0U; i < (size_t)1U; i++) {
3734 size_t i0 = i;
3735 if (last_len > (size_t)0U) {
3736 Eurydice_slice uu____0 = Eurydice_array_to_subslice2(
3737 blocks[i0], (size_t)0U, last_len, uint8_t);
3738 Eurydice_slice_copy(uu____0, last[i0], uint8_t);
3739 }
3740 blocks[i0][last_len] = 6U;
3741 size_t uu____1 = i0;
3742 size_t uu____2 = (size_t)104U - (size_t)1U;
3743 blocks[uu____1][uu____2] = (uint32_t)blocks[uu____1][uu____2] | 128U;
3744 }
3745 uint64_t(*uu____3)[5U] = s->st;
3746 uint8_t uu____4[1U][200U];
3747 memcpy(uu____4, blocks, (size_t)1U * sizeof(uint8_t[200U]));
3748 libcrux_sha3_portable_keccak_load_block_full_5a_d23(uu____3, uu____4);
3749 libcrux_sha3_generic_keccak_keccakf1600_21(s);
3750 }
3751
3752 /**
3753 A monomorphic instance of libcrux_sha3.portable_keccak.store_block
3754 with const generics
3755 - RATE= 104
3756 */
libcrux_sha3_portable_keccak_store_block_583(uint64_t (* s)[5U],Eurydice_slice out[1U])3757 static KRML_MUSTINLINE void libcrux_sha3_portable_keccak_store_block_583(
3758 uint64_t (*s)[5U], Eurydice_slice out[1U]) {
3759 for (size_t i = (size_t)0U; i < (size_t)104U / (size_t)8U; i++) {
3760 size_t i0 = i;
3761 Eurydice_slice uu____0 = Eurydice_slice_subslice2(
3762 out[0U], (size_t)8U * i0, (size_t)8U * i0 + (size_t)8U, uint8_t);
3763 uint8_t ret[8U];
3764 core_num__u64_9__to_le_bytes(s[i0 / (size_t)5U][i0 % (size_t)5U], ret);
3765 Eurydice_slice_copy(
3766 uu____0, Eurydice_array_to_slice((size_t)8U, ret, uint8_t), uint8_t);
3767 }
3768 }
3769
3770 /**
3771 A monomorphic instance of libcrux_sha3.portable_keccak.store_block_full
3772 with const generics
3773 - RATE= 104
3774 */
libcrux_sha3_portable_keccak_store_block_full_2d2(uint64_t (* s)[5U],uint8_t ret[1U][200U])3775 static KRML_MUSTINLINE void libcrux_sha3_portable_keccak_store_block_full_2d2(
3776 uint64_t (*s)[5U], uint8_t ret[1U][200U]) {
3777 uint8_t out[200U] = {0U};
3778 Eurydice_slice buf[1U] = {
3779 Eurydice_array_to_slice((size_t)200U, out, uint8_t)};
3780 libcrux_sha3_portable_keccak_store_block_583(s, buf);
3781 /* Passing arrays by value in Rust generates a copy in C */
3782 uint8_t copy_of_out[200U];
3783 memcpy(copy_of_out, out, (size_t)200U * sizeof(uint8_t));
3784 memcpy(ret[0U], copy_of_out, (size_t)200U * sizeof(uint8_t));
3785 }
3786
3787 /**
3788 This function found in impl {(libcrux_sha3::traits::internal::KeccakItem<1:
3789 usize> for u64)}
3790 */
3791 /**
3792 A monomorphic instance of libcrux_sha3.portable_keccak.store_block_full_5a
3793 with const generics
3794 - RATE= 104
3795 */
3796 static KRML_MUSTINLINE void
libcrux_sha3_portable_keccak_store_block_full_5a_292(uint64_t (* a)[5U],uint8_t ret[1U][200U])3797 libcrux_sha3_portable_keccak_store_block_full_5a_292(uint64_t (*a)[5U],
3798 uint8_t ret[1U][200U]) {
3799 libcrux_sha3_portable_keccak_store_block_full_2d2(a, ret);
3800 }
3801
3802 /**
3803 A monomorphic instance of libcrux_sha3.generic_keccak.squeeze_first_and_last
3804 with types uint64_t
3805 with const generics
3806 - N= 1
3807 - RATE= 104
3808 */
3809 static KRML_MUSTINLINE void
libcrux_sha3_generic_keccak_squeeze_first_and_last_c52(libcrux_sha3_generic_keccak_KeccakState_48 * s,Eurydice_slice out[1U])3810 libcrux_sha3_generic_keccak_squeeze_first_and_last_c52(
3811 libcrux_sha3_generic_keccak_KeccakState_48 *s, Eurydice_slice out[1U]) {
3812 uint8_t b[1U][200U];
3813 libcrux_sha3_portable_keccak_store_block_full_5a_292(s->st, b);
3814 for (size_t i = (size_t)0U; i < (size_t)1U; i++) {
3815 size_t i0 = i;
3816 Eurydice_slice uu____0 = out[i0];
3817 uint8_t *uu____1 = b[i0];
3818 core_ops_range_Range_b3 lit;
3819 lit.start = (size_t)0U;
3820 lit.end = Eurydice_slice_len(out[i0], uint8_t);
3821 Eurydice_slice_copy(
3822 uu____0,
3823 Eurydice_array_to_subslice((size_t)200U, uu____1, lit, uint8_t,
3824 core_ops_range_Range_b3),
3825 uint8_t);
3826 }
3827 }
3828
3829 /**
3830 This function found in impl {(libcrux_sha3::traits::internal::KeccakItem<1:
3831 usize> for u64)}
3832 */
3833 /**
3834 A monomorphic instance of libcrux_sha3.portable_keccak.store_block_5a
3835 with const generics
3836 - RATE= 104
3837 */
libcrux_sha3_portable_keccak_store_block_5a_593(uint64_t (* a)[5U],Eurydice_slice b[1U])3838 static KRML_MUSTINLINE void libcrux_sha3_portable_keccak_store_block_5a_593(
3839 uint64_t (*a)[5U], Eurydice_slice b[1U]) {
3840 libcrux_sha3_portable_keccak_store_block_583(a, b);
3841 }
3842
3843 /**
3844 A monomorphic instance of libcrux_sha3.generic_keccak.squeeze_first_block
3845 with types uint64_t
3846 with const generics
3847 - N= 1
3848 - RATE= 104
3849 */
libcrux_sha3_generic_keccak_squeeze_first_block_843(libcrux_sha3_generic_keccak_KeccakState_48 * s,Eurydice_slice out[1U])3850 static KRML_MUSTINLINE void libcrux_sha3_generic_keccak_squeeze_first_block_843(
3851 libcrux_sha3_generic_keccak_KeccakState_48 *s, Eurydice_slice out[1U]) {
3852 libcrux_sha3_portable_keccak_store_block_5a_593(s->st, out);
3853 }
3854
3855 /**
3856 A monomorphic instance of libcrux_sha3.generic_keccak.squeeze_next_block
3857 with types uint64_t
3858 with const generics
3859 - N= 1
3860 - RATE= 104
3861 */
libcrux_sha3_generic_keccak_squeeze_next_block_fc3(libcrux_sha3_generic_keccak_KeccakState_48 * s,Eurydice_slice out[1U])3862 static KRML_MUSTINLINE void libcrux_sha3_generic_keccak_squeeze_next_block_fc3(
3863 libcrux_sha3_generic_keccak_KeccakState_48 *s, Eurydice_slice out[1U]) {
3864 libcrux_sha3_generic_keccak_keccakf1600_21(s);
3865 libcrux_sha3_portable_keccak_store_block_5a_593(s->st, out);
3866 }
3867
3868 /**
3869 A monomorphic instance of libcrux_sha3.generic_keccak.squeeze_last
3870 with types uint64_t
3871 with const generics
3872 - N= 1
3873 - RATE= 104
3874 */
libcrux_sha3_generic_keccak_squeeze_last_cf2(libcrux_sha3_generic_keccak_KeccakState_48 s,Eurydice_slice out[1U])3875 static KRML_MUSTINLINE void libcrux_sha3_generic_keccak_squeeze_last_cf2(
3876 libcrux_sha3_generic_keccak_KeccakState_48 s, Eurydice_slice out[1U]) {
3877 libcrux_sha3_generic_keccak_keccakf1600_21(&s);
3878 uint8_t b[1U][200U];
3879 libcrux_sha3_portable_keccak_store_block_full_5a_292(s.st, b);
3880 for (size_t i = (size_t)0U; i < (size_t)1U; i++) {
3881 size_t i0 = i;
3882 Eurydice_slice uu____0 = out[i0];
3883 uint8_t *uu____1 = b[i0];
3884 core_ops_range_Range_b3 lit;
3885 lit.start = (size_t)0U;
3886 lit.end = Eurydice_slice_len(out[i0], uint8_t);
3887 Eurydice_slice_copy(
3888 uu____0,
3889 Eurydice_array_to_subslice((size_t)200U, uu____1, lit, uint8_t,
3890 core_ops_range_Range_b3),
3891 uint8_t);
3892 }
3893 }
3894
3895 /**
3896 A monomorphic instance of libcrux_sha3.generic_keccak.keccak
3897 with types uint64_t
3898 with const generics
3899 - N= 1
3900 - RATE= 104
3901 - DELIM= 6
3902 */
libcrux_sha3_generic_keccak_keccak_e93(Eurydice_slice data[1U],Eurydice_slice out[1U])3903 static KRML_MUSTINLINE void libcrux_sha3_generic_keccak_keccak_e93(
3904 Eurydice_slice data[1U], Eurydice_slice out[1U]) {
3905 libcrux_sha3_generic_keccak_KeccakState_48 s =
3906 libcrux_sha3_generic_keccak_new_1e_f4();
3907 for (size_t i = (size_t)0U;
3908 i < Eurydice_slice_len(data[0U], uint8_t) / (size_t)104U; i++) {
3909 size_t i0 = i;
3910 libcrux_sha3_generic_keccak_KeccakState_48 *uu____0 = &s;
3911 /* Passing arrays by value in Rust generates a copy in C */
3912 Eurydice_slice copy_of_data[1U];
3913 memcpy(copy_of_data, data, (size_t)1U * sizeof(Eurydice_slice));
3914 Eurydice_slice ret[1U];
3915 libcrux_sha3_portable_keccak_slice_n_5a(copy_of_data, i0 * (size_t)104U,
3916 (size_t)104U, ret);
3917 libcrux_sha3_generic_keccak_absorb_block_df2(uu____0, ret);
3918 }
3919 size_t rem = Eurydice_slice_len(data[0U], uint8_t) % (size_t)104U;
3920 libcrux_sha3_generic_keccak_KeccakState_48 *uu____2 = &s;
3921 /* Passing arrays by value in Rust generates a copy in C */
3922 Eurydice_slice copy_of_data[1U];
3923 memcpy(copy_of_data, data, (size_t)1U * sizeof(Eurydice_slice));
3924 Eurydice_slice ret[1U];
3925 libcrux_sha3_portable_keccak_slice_n_5a(
3926 copy_of_data, Eurydice_slice_len(data[0U], uint8_t) - rem, rem, ret);
3927 libcrux_sha3_generic_keccak_absorb_final_c74(uu____2, ret);
3928 size_t outlen = Eurydice_slice_len(out[0U], uint8_t);
3929 size_t blocks = outlen / (size_t)104U;
3930 size_t last = outlen - outlen % (size_t)104U;
3931 if (blocks == (size_t)0U) {
3932 libcrux_sha3_generic_keccak_squeeze_first_and_last_c52(&s, out);
3933 } else {
3934 Eurydice_slice_uint8_t_1size_t__x2 uu____4 =
3935 libcrux_sha3_portable_keccak_split_at_mut_n_5a(out, (size_t)104U);
3936 Eurydice_slice o0[1U];
3937 memcpy(o0, uu____4.fst, (size_t)1U * sizeof(Eurydice_slice));
3938 Eurydice_slice o1[1U];
3939 memcpy(o1, uu____4.snd, (size_t)1U * sizeof(Eurydice_slice));
3940 libcrux_sha3_generic_keccak_squeeze_first_block_843(&s, o0);
3941 core_ops_range_Range_b3 iter =
3942 core_iter_traits_collect___core__iter__traits__collect__IntoIterator_for_I__1__into_iter(
3943 (CLITERAL(core_ops_range_Range_b3){.start = (size_t)1U,
3944 .end = blocks}),
3945 core_ops_range_Range_b3, core_ops_range_Range_b3);
3946 while (true) {
3947 if (core_iter_range___core__iter__traits__iterator__Iterator_for_core__ops__range__Range_A___6__next(
3948 &iter, size_t, Option_b3)
3949 .tag == None) {
3950 break;
3951 } else {
3952 Eurydice_slice_uint8_t_1size_t__x2 uu____5 =
3953 libcrux_sha3_portable_keccak_split_at_mut_n_5a(o1, (size_t)104U);
3954 Eurydice_slice o[1U];
3955 memcpy(o, uu____5.fst, (size_t)1U * sizeof(Eurydice_slice));
3956 Eurydice_slice orest[1U];
3957 memcpy(orest, uu____5.snd, (size_t)1U * sizeof(Eurydice_slice));
3958 libcrux_sha3_generic_keccak_squeeze_next_block_fc3(&s, o);
3959 memcpy(o1, orest, (size_t)1U * sizeof(Eurydice_slice));
3960 }
3961 }
3962 if (last < outlen) {
3963 libcrux_sha3_generic_keccak_squeeze_last_cf2(s, o1);
3964 }
3965 }
3966 }
3967
3968 /**
3969 A monomorphic instance of libcrux_sha3.portable.keccakx1
3970 with const generics
3971 - RATE= 104
3972 - DELIM= 6
3973 */
libcrux_sha3_portable_keccakx1_ce3(Eurydice_slice data[1U],Eurydice_slice out[1U])3974 static KRML_MUSTINLINE void libcrux_sha3_portable_keccakx1_ce3(
3975 Eurydice_slice data[1U], Eurydice_slice out[1U]) {
3976 /* Passing arrays by value in Rust generates a copy in C */
3977 Eurydice_slice copy_of_data[1U];
3978 memcpy(copy_of_data, data, (size_t)1U * sizeof(Eurydice_slice));
3979 libcrux_sha3_generic_keccak_keccak_e93(copy_of_data, out);
3980 }
3981
3982 /**
3983 A portable SHA3 384 implementation.
3984 */
libcrux_sha3_portable_sha384(Eurydice_slice digest,Eurydice_slice data)3985 static KRML_MUSTINLINE void libcrux_sha3_portable_sha384(Eurydice_slice digest,
3986 Eurydice_slice data) {
3987 Eurydice_slice buf0[1U] = {data};
3988 Eurydice_slice buf[1U] = {digest};
3989 libcrux_sha3_portable_keccakx1_ce3(buf0, buf);
3990 }
3991
3992 /**
3993 SHA3 224
3994
3995 Preconditions:
3996 - `digest.len() == 28`
3997 */
libcrux_sha3_sha224_ema(Eurydice_slice digest,Eurydice_slice payload)3998 static KRML_MUSTINLINE void libcrux_sha3_sha224_ema(Eurydice_slice digest,
3999 Eurydice_slice payload) {
4000 libcrux_sha3_portable_sha224(digest, payload);
4001 }
4002
4003 /**
4004 SHA3 224
4005 */
libcrux_sha3_sha224(Eurydice_slice data,uint8_t ret[28U])4006 static KRML_MUSTINLINE void libcrux_sha3_sha224(Eurydice_slice data,
4007 uint8_t ret[28U]) {
4008 uint8_t out[28U] = {0U};
4009 libcrux_sha3_sha224_ema(Eurydice_array_to_slice((size_t)28U, out, uint8_t),
4010 data);
4011 memcpy(ret, out, (size_t)28U * sizeof(uint8_t));
4012 }
4013
4014 /**
4015 SHA3 256
4016 */
libcrux_sha3_sha256_ema(Eurydice_slice digest,Eurydice_slice payload)4017 static KRML_MUSTINLINE void libcrux_sha3_sha256_ema(Eurydice_slice digest,
4018 Eurydice_slice payload) {
4019 libcrux_sha3_portable_sha256(digest, payload);
4020 }
4021
4022 /**
4023 SHA3 256
4024 */
libcrux_sha3_sha256(Eurydice_slice data,uint8_t ret[32U])4025 static KRML_MUSTINLINE void libcrux_sha3_sha256(Eurydice_slice data,
4026 uint8_t ret[32U]) {
4027 uint8_t out[32U] = {0U};
4028 libcrux_sha3_sha256_ema(Eurydice_array_to_slice((size_t)32U, out, uint8_t),
4029 data);
4030 memcpy(ret, out, (size_t)32U * sizeof(uint8_t));
4031 }
4032
4033 /**
4034 SHA3 384
4035 */
libcrux_sha3_sha384_ema(Eurydice_slice digest,Eurydice_slice payload)4036 static KRML_MUSTINLINE void libcrux_sha3_sha384_ema(Eurydice_slice digest,
4037 Eurydice_slice payload) {
4038 libcrux_sha3_portable_sha384(digest, payload);
4039 }
4040
4041 /**
4042 SHA3 384
4043 */
libcrux_sha3_sha384(Eurydice_slice data,uint8_t ret[48U])4044 static KRML_MUSTINLINE void libcrux_sha3_sha384(Eurydice_slice data,
4045 uint8_t ret[48U]) {
4046 uint8_t out[48U] = {0U};
4047 libcrux_sha3_sha384_ema(Eurydice_array_to_slice((size_t)48U, out, uint8_t),
4048 data);
4049 memcpy(ret, out, (size_t)48U * sizeof(uint8_t));
4050 }
4051
4052 /**
4053 SHA3 512
4054 */
libcrux_sha3_sha512_ema(Eurydice_slice digest,Eurydice_slice payload)4055 static KRML_MUSTINLINE void libcrux_sha3_sha512_ema(Eurydice_slice digest,
4056 Eurydice_slice payload) {
4057 libcrux_sha3_portable_sha512(digest, payload);
4058 }
4059
4060 /**
4061 SHA3 512
4062 */
libcrux_sha3_sha512(Eurydice_slice data,uint8_t ret[64U])4063 static KRML_MUSTINLINE void libcrux_sha3_sha512(Eurydice_slice data,
4064 uint8_t ret[64U]) {
4065 uint8_t out[64U] = {0U};
4066 libcrux_sha3_sha512_ema(Eurydice_array_to_slice((size_t)64U, out, uint8_t),
4067 data);
4068 memcpy(ret, out, (size_t)64U * sizeof(uint8_t));
4069 }
4070
4071 /**
4072 This function found in impl {(libcrux_sha3::traits::internal::KeccakItem<1:
4073 usize> for u64)}
4074 */
4075 /**
4076 A monomorphic instance of libcrux_sha3.portable_keccak.load_block_5a
4077 with const generics
4078 - RATE= 168
4079 */
libcrux_sha3_portable_keccak_load_block_5a_b83(uint64_t (* a)[5U],Eurydice_slice b[1U])4080 static KRML_MUSTINLINE void libcrux_sha3_portable_keccak_load_block_5a_b83(
4081 uint64_t (*a)[5U], Eurydice_slice b[1U]) {
4082 uint64_t(*uu____0)[5U] = a;
4083 /* Passing arrays by value in Rust generates a copy in C */
4084 Eurydice_slice copy_of_b[1U];
4085 memcpy(copy_of_b, b, (size_t)1U * sizeof(Eurydice_slice));
4086 libcrux_sha3_portable_keccak_load_block_2c1(uu____0, copy_of_b);
4087 }
4088
4089 /**
4090 A monomorphic instance of libcrux_sha3.generic_keccak.absorb_block
4091 with types uint64_t
4092 with const generics
4093 - N= 1
4094 - RATE= 168
4095 */
libcrux_sha3_generic_keccak_absorb_block_df3(libcrux_sha3_generic_keccak_KeccakState_48 * s,Eurydice_slice blocks[1U])4096 static KRML_MUSTINLINE void libcrux_sha3_generic_keccak_absorb_block_df3(
4097 libcrux_sha3_generic_keccak_KeccakState_48 *s, Eurydice_slice blocks[1U]) {
4098 uint64_t(*uu____0)[5U] = s->st;
4099 Eurydice_slice uu____1[1U];
4100 memcpy(uu____1, blocks, (size_t)1U * sizeof(Eurydice_slice));
4101 libcrux_sha3_portable_keccak_load_block_5a_b83(uu____0, uu____1);
4102 libcrux_sha3_generic_keccak_keccakf1600_21(s);
4103 }
4104
4105 /**
4106 A monomorphic instance of libcrux_sha3.portable_keccak.store_block_full
4107 with const generics
4108 - RATE= 168
4109 */
libcrux_sha3_portable_keccak_store_block_full_2d3(uint64_t (* s)[5U],uint8_t ret[1U][200U])4110 static KRML_MUSTINLINE void libcrux_sha3_portable_keccak_store_block_full_2d3(
4111 uint64_t (*s)[5U], uint8_t ret[1U][200U]) {
4112 uint8_t out[200U] = {0U};
4113 Eurydice_slice buf[1U] = {
4114 Eurydice_array_to_slice((size_t)200U, out, uint8_t)};
4115 libcrux_sha3_portable_keccak_store_block_581(s, buf);
4116 /* Passing arrays by value in Rust generates a copy in C */
4117 uint8_t copy_of_out[200U];
4118 memcpy(copy_of_out, out, (size_t)200U * sizeof(uint8_t));
4119 memcpy(ret[0U], copy_of_out, (size_t)200U * sizeof(uint8_t));
4120 }
4121
4122 /**
4123 This function found in impl {(libcrux_sha3::traits::internal::KeccakItem<1:
4124 usize> for u64)}
4125 */
4126 /**
4127 A monomorphic instance of libcrux_sha3.portable_keccak.store_block_full_5a
4128 with const generics
4129 - RATE= 168
4130 */
4131 static KRML_MUSTINLINE void
libcrux_sha3_portable_keccak_store_block_full_5a_293(uint64_t (* a)[5U],uint8_t ret[1U][200U])4132 libcrux_sha3_portable_keccak_store_block_full_5a_293(uint64_t (*a)[5U],
4133 uint8_t ret[1U][200U]) {
4134 libcrux_sha3_portable_keccak_store_block_full_2d3(a, ret);
4135 }
4136
4137 /**
4138 A monomorphic instance of libcrux_sha3.generic_keccak.squeeze_first_and_last
4139 with types uint64_t
4140 with const generics
4141 - N= 1
4142 - RATE= 168
4143 */
4144 static KRML_MUSTINLINE void
libcrux_sha3_generic_keccak_squeeze_first_and_last_c53(libcrux_sha3_generic_keccak_KeccakState_48 * s,Eurydice_slice out[1U])4145 libcrux_sha3_generic_keccak_squeeze_first_and_last_c53(
4146 libcrux_sha3_generic_keccak_KeccakState_48 *s, Eurydice_slice out[1U]) {
4147 uint8_t b[1U][200U];
4148 libcrux_sha3_portable_keccak_store_block_full_5a_293(s->st, b);
4149 for (size_t i = (size_t)0U; i < (size_t)1U; i++) {
4150 size_t i0 = i;
4151 Eurydice_slice uu____0 = out[i0];
4152 uint8_t *uu____1 = b[i0];
4153 core_ops_range_Range_b3 lit;
4154 lit.start = (size_t)0U;
4155 lit.end = Eurydice_slice_len(out[i0], uint8_t);
4156 Eurydice_slice_copy(
4157 uu____0,
4158 Eurydice_array_to_subslice((size_t)200U, uu____1, lit, uint8_t,
4159 core_ops_range_Range_b3),
4160 uint8_t);
4161 }
4162 }
4163
4164 /**
4165 A monomorphic instance of libcrux_sha3.generic_keccak.squeeze_last
4166 with types uint64_t
4167 with const generics
4168 - N= 1
4169 - RATE= 168
4170 */
libcrux_sha3_generic_keccak_squeeze_last_cf3(libcrux_sha3_generic_keccak_KeccakState_48 s,Eurydice_slice out[1U])4171 static KRML_MUSTINLINE void libcrux_sha3_generic_keccak_squeeze_last_cf3(
4172 libcrux_sha3_generic_keccak_KeccakState_48 s, Eurydice_slice out[1U]) {
4173 libcrux_sha3_generic_keccak_keccakf1600_21(&s);
4174 uint8_t b[1U][200U];
4175 libcrux_sha3_portable_keccak_store_block_full_5a_293(s.st, b);
4176 for (size_t i = (size_t)0U; i < (size_t)1U; i++) {
4177 size_t i0 = i;
4178 Eurydice_slice uu____0 = out[i0];
4179 uint8_t *uu____1 = b[i0];
4180 core_ops_range_Range_b3 lit;
4181 lit.start = (size_t)0U;
4182 lit.end = Eurydice_slice_len(out[i0], uint8_t);
4183 Eurydice_slice_copy(
4184 uu____0,
4185 Eurydice_array_to_subslice((size_t)200U, uu____1, lit, uint8_t,
4186 core_ops_range_Range_b3),
4187 uint8_t);
4188 }
4189 }
4190
4191 /**
4192 A monomorphic instance of libcrux_sha3.generic_keccak.keccak
4193 with types uint64_t
4194 with const generics
4195 - N= 1
4196 - RATE= 168
4197 - DELIM= 31
4198 */
libcrux_sha3_generic_keccak_keccak_e94(Eurydice_slice data[1U],Eurydice_slice out[1U])4199 static KRML_MUSTINLINE void libcrux_sha3_generic_keccak_keccak_e94(
4200 Eurydice_slice data[1U], Eurydice_slice out[1U]) {
4201 libcrux_sha3_generic_keccak_KeccakState_48 s =
4202 libcrux_sha3_generic_keccak_new_1e_f4();
4203 for (size_t i = (size_t)0U;
4204 i < Eurydice_slice_len(data[0U], uint8_t) / (size_t)168U; i++) {
4205 size_t i0 = i;
4206 libcrux_sha3_generic_keccak_KeccakState_48 *uu____0 = &s;
4207 /* Passing arrays by value in Rust generates a copy in C */
4208 Eurydice_slice copy_of_data[1U];
4209 memcpy(copy_of_data, data, (size_t)1U * sizeof(Eurydice_slice));
4210 Eurydice_slice ret[1U];
4211 libcrux_sha3_portable_keccak_slice_n_5a(copy_of_data, i0 * (size_t)168U,
4212 (size_t)168U, ret);
4213 libcrux_sha3_generic_keccak_absorb_block_df3(uu____0, ret);
4214 }
4215 size_t rem = Eurydice_slice_len(data[0U], uint8_t) % (size_t)168U;
4216 libcrux_sha3_generic_keccak_KeccakState_48 *uu____2 = &s;
4217 /* Passing arrays by value in Rust generates a copy in C */
4218 Eurydice_slice copy_of_data[1U];
4219 memcpy(copy_of_data, data, (size_t)1U * sizeof(Eurydice_slice));
4220 Eurydice_slice ret[1U];
4221 libcrux_sha3_portable_keccak_slice_n_5a(
4222 copy_of_data, Eurydice_slice_len(data[0U], uint8_t) - rem, rem, ret);
4223 libcrux_sha3_generic_keccak_absorb_final_c72(uu____2, ret);
4224 size_t outlen = Eurydice_slice_len(out[0U], uint8_t);
4225 size_t blocks = outlen / (size_t)168U;
4226 size_t last = outlen - outlen % (size_t)168U;
4227 if (blocks == (size_t)0U) {
4228 libcrux_sha3_generic_keccak_squeeze_first_and_last_c53(&s, out);
4229 } else {
4230 Eurydice_slice_uint8_t_1size_t__x2 uu____4 =
4231 libcrux_sha3_portable_keccak_split_at_mut_n_5a(out, (size_t)168U);
4232 Eurydice_slice o0[1U];
4233 memcpy(o0, uu____4.fst, (size_t)1U * sizeof(Eurydice_slice));
4234 Eurydice_slice o1[1U];
4235 memcpy(o1, uu____4.snd, (size_t)1U * sizeof(Eurydice_slice));
4236 libcrux_sha3_generic_keccak_squeeze_first_block_841(&s, o0);
4237 core_ops_range_Range_b3 iter =
4238 core_iter_traits_collect___core__iter__traits__collect__IntoIterator_for_I__1__into_iter(
4239 (CLITERAL(core_ops_range_Range_b3){.start = (size_t)1U,
4240 .end = blocks}),
4241 core_ops_range_Range_b3, core_ops_range_Range_b3);
4242 while (true) {
4243 if (core_iter_range___core__iter__traits__iterator__Iterator_for_core__ops__range__Range_A___6__next(
4244 &iter, size_t, Option_b3)
4245 .tag == None) {
4246 break;
4247 } else {
4248 Eurydice_slice_uint8_t_1size_t__x2 uu____5 =
4249 libcrux_sha3_portable_keccak_split_at_mut_n_5a(o1, (size_t)168U);
4250 Eurydice_slice o[1U];
4251 memcpy(o, uu____5.fst, (size_t)1U * sizeof(Eurydice_slice));
4252 Eurydice_slice orest[1U];
4253 memcpy(orest, uu____5.snd, (size_t)1U * sizeof(Eurydice_slice));
4254 libcrux_sha3_generic_keccak_squeeze_next_block_fc1(&s, o);
4255 memcpy(o1, orest, (size_t)1U * sizeof(Eurydice_slice));
4256 }
4257 }
4258 if (last < outlen) {
4259 libcrux_sha3_generic_keccak_squeeze_last_cf3(s, o1);
4260 }
4261 }
4262 }
4263
4264 /**
4265 A monomorphic instance of libcrux_sha3.portable.keccakx1
4266 with const generics
4267 - RATE= 168
4268 - DELIM= 31
4269 */
libcrux_sha3_portable_keccakx1_ce4(Eurydice_slice data[1U],Eurydice_slice out[1U])4270 static KRML_MUSTINLINE void libcrux_sha3_portable_keccakx1_ce4(
4271 Eurydice_slice data[1U], Eurydice_slice out[1U]) {
4272 /* Passing arrays by value in Rust generates a copy in C */
4273 Eurydice_slice copy_of_data[1U];
4274 memcpy(copy_of_data, data, (size_t)1U * sizeof(Eurydice_slice));
4275 libcrux_sha3_generic_keccak_keccak_e94(copy_of_data, out);
4276 }
4277
4278 /**
4279 A portable SHAKE128 implementation.
4280 */
libcrux_sha3_portable_shake128(Eurydice_slice digest,Eurydice_slice data)4281 static KRML_MUSTINLINE void libcrux_sha3_portable_shake128(
4282 Eurydice_slice digest, Eurydice_slice data) {
4283 Eurydice_slice buf0[1U] = {data};
4284 Eurydice_slice buf[1U] = {digest};
4285 libcrux_sha3_portable_keccakx1_ce4(buf0, buf);
4286 }
4287
4288 /**
4289 SHAKE 128
4290
4291 Writes `out.len()` bytes.
4292 */
libcrux_sha3_shake128_ema(Eurydice_slice out,Eurydice_slice data)4293 static KRML_MUSTINLINE void libcrux_sha3_shake128_ema(Eurydice_slice out,
4294 Eurydice_slice data) {
4295 libcrux_sha3_portable_shake128(out, data);
4296 }
4297
4298 /**
4299 SHAKE 256
4300
4301 Writes `out.len()` bytes.
4302 */
libcrux_sha3_shake256_ema(Eurydice_slice out,Eurydice_slice data)4303 static KRML_MUSTINLINE void libcrux_sha3_shake256_ema(Eurydice_slice out,
4304 Eurydice_slice data) {
4305 libcrux_sha3_portable_shake256(out, data);
4306 }
4307
4308 static const size_t libcrux_sha3_generic_keccak__PI[24U] = {
4309 (size_t)6U, (size_t)12U, (size_t)18U, (size_t)24U, (size_t)3U,
4310 (size_t)9U, (size_t)10U, (size_t)16U, (size_t)22U, (size_t)1U,
4311 (size_t)7U, (size_t)13U, (size_t)19U, (size_t)20U, (size_t)4U,
4312 (size_t)5U, (size_t)11U, (size_t)17U, (size_t)23U, (size_t)2U,
4313 (size_t)8U, (size_t)14U, (size_t)15U, (size_t)21U};
4314
4315 static const size_t libcrux_sha3_generic_keccak__ROTC[24U] = {
4316 (size_t)1U, (size_t)62U, (size_t)28U, (size_t)27U, (size_t)36U,
4317 (size_t)44U, (size_t)6U, (size_t)55U, (size_t)20U, (size_t)3U,
4318 (size_t)10U, (size_t)43U, (size_t)25U, (size_t)39U, (size_t)41U,
4319 (size_t)45U, (size_t)15U, (size_t)21U, (size_t)8U, (size_t)18U,
4320 (size_t)2U, (size_t)61U, (size_t)56U, (size_t)14U};
4321
4322 /**
4323 A portable SHA3 224 implementation.
4324 */
libcrux_sha3_neon_sha224(Eurydice_slice digest,Eurydice_slice data)4325 static KRML_MUSTINLINE void libcrux_sha3_neon_sha224(Eurydice_slice digest,
4326 Eurydice_slice data) {
4327 KRML_HOST_EPRINTF("KaRaMeL abort at %s:%d\n%s\n", __FILE__, __LINE__,
4328 "panic!");
4329 KRML_HOST_EXIT(255U);
4330 }
4331
4332 /**
4333 A portable SHA3 256 implementation.
4334 */
libcrux_sha3_neon_sha256(Eurydice_slice digest,Eurydice_slice data)4335 static KRML_MUSTINLINE void libcrux_sha3_neon_sha256(Eurydice_slice digest,
4336 Eurydice_slice data) {
4337 KRML_HOST_EPRINTF("KaRaMeL abort at %s:%d\n%s\n", __FILE__, __LINE__,
4338 "panic!");
4339 KRML_HOST_EXIT(255U);
4340 }
4341
4342 /**
4343 A portable SHA3 384 implementation.
4344 */
libcrux_sha3_neon_sha384(Eurydice_slice digest,Eurydice_slice data)4345 static KRML_MUSTINLINE void libcrux_sha3_neon_sha384(Eurydice_slice digest,
4346 Eurydice_slice data) {
4347 KRML_HOST_EPRINTF("KaRaMeL abort at %s:%d\n%s\n", __FILE__, __LINE__,
4348 "panic!");
4349 KRML_HOST_EXIT(255U);
4350 }
4351
4352 /**
4353 A portable SHA3 512 implementation.
4354 */
libcrux_sha3_neon_sha512(Eurydice_slice digest,Eurydice_slice data)4355 static KRML_MUSTINLINE void libcrux_sha3_neon_sha512(Eurydice_slice digest,
4356 Eurydice_slice data) {
4357 KRML_HOST_EPRINTF("KaRaMeL abort at %s:%d\n%s\n", __FILE__, __LINE__,
4358 "panic!");
4359 KRML_HOST_EXIT(255U);
4360 }
4361
4362 /**
4363 Run SHAKE256 on both inputs in parallel.
4364
4365 Writes the two results into `out0` and `out1`
4366 */
libcrux_sha3_neon_x2_shake256(Eurydice_slice input0,Eurydice_slice input1,Eurydice_slice out0,Eurydice_slice out1)4367 static KRML_MUSTINLINE void libcrux_sha3_neon_x2_shake256(Eurydice_slice input0,
4368 Eurydice_slice input1,
4369 Eurydice_slice out0,
4370 Eurydice_slice out1) {
4371 KRML_HOST_EPRINTF("KaRaMeL abort at %s:%d\n%s\n", __FILE__, __LINE__,
4372 "panic!");
4373 KRML_HOST_EXIT(255U);
4374 }
4375
4376 typedef struct libcrux_sha3_neon_x2_incremental_KeccakState_s {
4377 libcrux_sha3_generic_keccak_KeccakState_48 state[2U];
4378 } libcrux_sha3_neon_x2_incremental_KeccakState;
4379
4380 /**
4381 Initialise the `KeccakState2`.
4382 */
4383 static KRML_MUSTINLINE libcrux_sha3_neon_x2_incremental_KeccakState
libcrux_sha3_neon_x2_incremental_shake128_init(void)4384 libcrux_sha3_neon_x2_incremental_shake128_init(void) {
4385 KRML_HOST_EPRINTF("KaRaMeL abort at %s:%d\n%s\n", __FILE__, __LINE__,
4386 "panic!");
4387 KRML_HOST_EXIT(255U);
4388 }
4389
4390 /**
4391 Shake128 absorb `data0` and `data1` in the [`KeccakState`] `s`.
4392 */
4393 static KRML_MUSTINLINE void
libcrux_sha3_neon_x2_incremental_shake128_absorb_final(libcrux_sha3_neon_x2_incremental_KeccakState * s,Eurydice_slice data0,Eurydice_slice data1)4394 libcrux_sha3_neon_x2_incremental_shake128_absorb_final(
4395 libcrux_sha3_neon_x2_incremental_KeccakState *s, Eurydice_slice data0,
4396 Eurydice_slice data1) {
4397 KRML_HOST_EPRINTF("KaRaMeL abort at %s:%d\n%s\n", __FILE__, __LINE__,
4398 "panic!");
4399 KRML_HOST_EXIT(255U);
4400 }
4401
4402 /**
4403 Squeeze 2 times the first three blocks in parallel in the
4404 [`KeccakState`] and return the output in `out0` and `out1`.
4405 */
4406 static KRML_MUSTINLINE void
libcrux_sha3_neon_x2_incremental_shake128_squeeze_first_three_blocks(libcrux_sha3_neon_x2_incremental_KeccakState * s,Eurydice_slice out0,Eurydice_slice out1)4407 libcrux_sha3_neon_x2_incremental_shake128_squeeze_first_three_blocks(
4408 libcrux_sha3_neon_x2_incremental_KeccakState *s, Eurydice_slice out0,
4409 Eurydice_slice out1) {
4410 KRML_HOST_EPRINTF("KaRaMeL abort at %s:%d\n%s\n", __FILE__, __LINE__,
4411 "panic!");
4412 KRML_HOST_EXIT(255U);
4413 }
4414
4415 /**
4416 Squeeze 2 times the next block in parallel in the
4417 [`KeccakState`] and return the output in `out0` and `out1`.
4418 */
4419 static KRML_MUSTINLINE void
libcrux_sha3_neon_x2_incremental_shake128_squeeze_next_block(libcrux_sha3_neon_x2_incremental_KeccakState * s,Eurydice_slice out0,Eurydice_slice out1)4420 libcrux_sha3_neon_x2_incremental_shake128_squeeze_next_block(
4421 libcrux_sha3_neon_x2_incremental_KeccakState *s, Eurydice_slice out0,
4422 Eurydice_slice out1) {
4423 KRML_HOST_EPRINTF("KaRaMeL abort at %s:%d\n%s\n", __FILE__, __LINE__,
4424 "panic!");
4425 KRML_HOST_EXIT(255U);
4426 }
4427
4428 /**
4429 A monomorphic instance of libcrux_sha3.generic_keccak.squeeze_first_five_blocks
4430 with types uint64_t
4431 with const generics
4432 - N= 1
4433 - RATE= 168
4434 */
4435 static KRML_MUSTINLINE void
libcrux_sha3_generic_keccak_squeeze_first_five_blocks_4f(libcrux_sha3_generic_keccak_KeccakState_48 * s,Eurydice_slice out[1U])4436 libcrux_sha3_generic_keccak_squeeze_first_five_blocks_4f(
4437 libcrux_sha3_generic_keccak_KeccakState_48 *s, Eurydice_slice out[1U]) {
4438 Eurydice_slice_uint8_t_1size_t__x2 uu____0 =
4439 libcrux_sha3_portable_keccak_split_at_mut_n_5a(out, (size_t)168U);
4440 Eurydice_slice o0[1U];
4441 memcpy(o0, uu____0.fst, (size_t)1U * sizeof(Eurydice_slice));
4442 Eurydice_slice o10[1U];
4443 memcpy(o10, uu____0.snd, (size_t)1U * sizeof(Eurydice_slice));
4444 libcrux_sha3_generic_keccak_squeeze_first_block_841(s, o0);
4445 Eurydice_slice_uint8_t_1size_t__x2 uu____1 =
4446 libcrux_sha3_portable_keccak_split_at_mut_n_5a(o10, (size_t)168U);
4447 Eurydice_slice o1[1U];
4448 memcpy(o1, uu____1.fst, (size_t)1U * sizeof(Eurydice_slice));
4449 Eurydice_slice o20[1U];
4450 memcpy(o20, uu____1.snd, (size_t)1U * sizeof(Eurydice_slice));
4451 libcrux_sha3_generic_keccak_squeeze_next_block_fc1(s, o1);
4452 Eurydice_slice_uint8_t_1size_t__x2 uu____2 =
4453 libcrux_sha3_portable_keccak_split_at_mut_n_5a(o20, (size_t)168U);
4454 Eurydice_slice o2[1U];
4455 memcpy(o2, uu____2.fst, (size_t)1U * sizeof(Eurydice_slice));
4456 Eurydice_slice o30[1U];
4457 memcpy(o30, uu____2.snd, (size_t)1U * sizeof(Eurydice_slice));
4458 libcrux_sha3_generic_keccak_squeeze_next_block_fc1(s, o2);
4459 Eurydice_slice_uint8_t_1size_t__x2 uu____3 =
4460 libcrux_sha3_portable_keccak_split_at_mut_n_5a(o30, (size_t)168U);
4461 Eurydice_slice o3[1U];
4462 memcpy(o3, uu____3.fst, (size_t)1U * sizeof(Eurydice_slice));
4463 Eurydice_slice o4[1U];
4464 memcpy(o4, uu____3.snd, (size_t)1U * sizeof(Eurydice_slice));
4465 libcrux_sha3_generic_keccak_squeeze_next_block_fc1(s, o3);
4466 libcrux_sha3_generic_keccak_squeeze_next_block_fc1(s, o4);
4467 }
4468
4469 /**
4470 Squeeze five blocks
4471 */
4472 static KRML_MUSTINLINE void
libcrux_sha3_portable_incremental_shake128_squeeze_first_five_blocks(libcrux_sha3_generic_keccak_KeccakState_48 * s,Eurydice_slice out0)4473 libcrux_sha3_portable_incremental_shake128_squeeze_first_five_blocks(
4474 libcrux_sha3_generic_keccak_KeccakState_48 *s, Eurydice_slice out0) {
4475 Eurydice_slice buf[1U] = {out0};
4476 libcrux_sha3_generic_keccak_squeeze_first_five_blocks_4f(s, buf);
4477 }
4478
4479 /**
4480 Absorb some data for SHAKE-256 for the last time
4481 */
4482 static KRML_MUSTINLINE void
libcrux_sha3_portable_incremental_shake256_absorb_final(libcrux_sha3_generic_keccak_KeccakState_48 * s,Eurydice_slice data)4483 libcrux_sha3_portable_incremental_shake256_absorb_final(
4484 libcrux_sha3_generic_keccak_KeccakState_48 *s, Eurydice_slice data) {
4485 Eurydice_slice buf[1U] = {data};
4486 libcrux_sha3_generic_keccak_absorb_final_c71(s, buf);
4487 }
4488
4489 /**
4490 Create a new SHAKE-256 state object.
4491 */
4492 static KRML_MUSTINLINE libcrux_sha3_generic_keccak_KeccakState_48
libcrux_sha3_portable_incremental_shake256_init(void)4493 libcrux_sha3_portable_incremental_shake256_init(void) {
4494 return libcrux_sha3_generic_keccak_new_1e_f4();
4495 }
4496
4497 /**
4498 Squeeze the first SHAKE-256 block
4499 */
4500 static KRML_MUSTINLINE void
libcrux_sha3_portable_incremental_shake256_squeeze_first_block(libcrux_sha3_generic_keccak_KeccakState_48 * s,Eurydice_slice out)4501 libcrux_sha3_portable_incremental_shake256_squeeze_first_block(
4502 libcrux_sha3_generic_keccak_KeccakState_48 *s, Eurydice_slice out) {
4503 Eurydice_slice buf[1U] = {out};
4504 libcrux_sha3_generic_keccak_squeeze_first_block_840(s, buf);
4505 }
4506
4507 /**
4508 Squeeze the next SHAKE-256 block
4509 */
4510 static KRML_MUSTINLINE void
libcrux_sha3_portable_incremental_shake256_squeeze_next_block(libcrux_sha3_generic_keccak_KeccakState_48 * s,Eurydice_slice out)4511 libcrux_sha3_portable_incremental_shake256_squeeze_next_block(
4512 libcrux_sha3_generic_keccak_KeccakState_48 *s, Eurydice_slice out) {
4513 Eurydice_slice buf[1U] = {out};
4514 libcrux_sha3_generic_keccak_squeeze_next_block_fc0(s, buf);
4515 }
4516
4517 /**
4518 A monomorphic instance of libcrux_sha3.generic_keccak.KeccakXofState
4519 with types uint64_t
4520 with const generics
4521 - $1size_t
4522 - $136size_t
4523 */
4524 typedef struct libcrux_sha3_generic_keccak_KeccakXofState_4f_s {
4525 libcrux_sha3_generic_keccak_KeccakState_48 inner;
4526 uint8_t buf[1U][136U];
4527 size_t buf_len;
4528 bool sponge;
4529 } libcrux_sha3_generic_keccak_KeccakXofState_4f;
4530
4531 typedef libcrux_sha3_generic_keccak_KeccakXofState_4f
4532 libcrux_sha3_portable_incremental_Shake256Absorb;
4533
4534 /**
4535 Consume the internal buffer and the required amount of the input to pad to
4536 `RATE`.
4537
4538 Returns the `consumed` bytes from `inputs` if there's enough buffered
4539 content to consume, and `0` otherwise.
4540 If `consumed > 0` is returned, `self.buf` contains a full block to be
4541 loaded.
4542 */
4543 /**
4544 This function found in impl {libcrux_sha3::generic_keccak::KeccakXofState<STATE,
4545 PARALLEL_LANES, RATE>[TraitClause@0]#2}
4546 */
4547 /**
4548 A monomorphic instance of libcrux_sha3.generic_keccak.fill_buffer_9d
4549 with types uint64_t
4550 with const generics
4551 - PARALLEL_LANES= 1
4552 - RATE= 136
4553 */
libcrux_sha3_generic_keccak_fill_buffer_9d_b0(libcrux_sha3_generic_keccak_KeccakXofState_4f * self,Eurydice_slice inputs[1U])4554 static inline size_t libcrux_sha3_generic_keccak_fill_buffer_9d_b0(
4555 libcrux_sha3_generic_keccak_KeccakXofState_4f *self,
4556 Eurydice_slice inputs[1U]) {
4557 size_t input_len = Eurydice_slice_len(inputs[0U], uint8_t);
4558 size_t consumed = (size_t)0U;
4559 if (self->buf_len > (size_t)0U) {
4560 if (self->buf_len + input_len >= (size_t)136U) {
4561 consumed = (size_t)136U - self->buf_len;
4562 for (size_t i = (size_t)0U; i < (size_t)1U; i++) {
4563 size_t i0 = i;
4564 Eurydice_slice uu____0 = Eurydice_array_to_subslice_from(
4565 (size_t)136U, self->buf[i0], self->buf_len, uint8_t, size_t);
4566 Eurydice_slice_copy(
4567 uu____0,
4568 Eurydice_slice_subslice_to(inputs[i0], consumed, uint8_t, size_t),
4569 uint8_t);
4570 }
4571 self->buf_len = self->buf_len + consumed;
4572 }
4573 }
4574 return consumed;
4575 }
4576
4577 /**
4578 This function found in impl {libcrux_sha3::generic_keccak::KeccakXofState<STATE,
4579 PARALLEL_LANES, RATE>[TraitClause@0]#2}
4580 */
4581 /**
4582 A monomorphic instance of libcrux_sha3.generic_keccak.absorb_full_9d
4583 with types uint64_t
4584 with const generics
4585 - PARALLEL_LANES= 1
4586 - RATE= 136
4587 */
libcrux_sha3_generic_keccak_absorb_full_9d_f8(libcrux_sha3_generic_keccak_KeccakXofState_4f * self,Eurydice_slice inputs[1U])4588 static inline size_t libcrux_sha3_generic_keccak_absorb_full_9d_f8(
4589 libcrux_sha3_generic_keccak_KeccakXofState_4f *self,
4590 Eurydice_slice inputs[1U]) {
4591 libcrux_sha3_generic_keccak_KeccakXofState_4f *uu____0 = self;
4592 /* Passing arrays by value in Rust generates a copy in C */
4593 Eurydice_slice copy_of_inputs0[1U];
4594 memcpy(copy_of_inputs0, inputs, (size_t)1U * sizeof(Eurydice_slice));
4595 size_t input_consumed =
4596 libcrux_sha3_generic_keccak_fill_buffer_9d_b0(uu____0, copy_of_inputs0);
4597 if (input_consumed > (size_t)0U) {
4598 Eurydice_slice borrowed[1U];
4599 for (size_t i = (size_t)0U; i < (size_t)1U; i++) {
4600 uint8_t buf[136U] = {0U};
4601 borrowed[i] = core_array___Array_T__N__23__as_slice(
4602 (size_t)136U, buf, uint8_t, Eurydice_slice);
4603 }
4604 for (size_t i = (size_t)0U; i < (size_t)1U; i++) {
4605 size_t i0 = i;
4606 borrowed[i0] =
4607 Eurydice_array_to_slice((size_t)136U, self->buf[i0], uint8_t);
4608 }
4609 uint64_t(*uu____2)[5U] = self->inner.st;
4610 Eurydice_slice uu____3[1U];
4611 memcpy(uu____3, borrowed, (size_t)1U * sizeof(Eurydice_slice));
4612 libcrux_sha3_portable_keccak_load_block_5a_b80(uu____2, uu____3);
4613 libcrux_sha3_generic_keccak_keccakf1600_21(&self->inner);
4614 self->buf_len = (size_t)0U;
4615 }
4616 size_t input_to_consume =
4617 Eurydice_slice_len(inputs[0U], uint8_t) - input_consumed;
4618 size_t num_blocks = input_to_consume / (size_t)136U;
4619 size_t remainder = input_to_consume % (size_t)136U;
4620 for (size_t i = (size_t)0U; i < num_blocks; i++) {
4621 size_t i0 = i;
4622 uint64_t(*uu____4)[5U] = self->inner.st;
4623 /* Passing arrays by value in Rust generates a copy in C */
4624 Eurydice_slice copy_of_inputs[1U];
4625 memcpy(copy_of_inputs, inputs, (size_t)1U * sizeof(Eurydice_slice));
4626 Eurydice_slice ret[1U];
4627 libcrux_sha3_portable_keccak_slice_n_5a(
4628 copy_of_inputs, input_consumed + i0 * (size_t)136U, (size_t)136U, ret);
4629 libcrux_sha3_portable_keccak_load_block_5a_b80(uu____4, ret);
4630 libcrux_sha3_generic_keccak_keccakf1600_21(&self->inner);
4631 }
4632 return remainder;
4633 }
4634
4635 /**
4636 Absorb
4637
4638 This function takes any number of bytes to absorb and buffers if it's not
4639 enough. The function assumes that all input slices in `blocks` have the same
4640 length.
4641
4642 Only a multiple of `RATE` blocks are absorbed.
4643 For the remaining bytes [`absorb_final`] needs to be called.
4644
4645 This works best with relatively small `inputs`.
4646 */
4647 /**
4648 This function found in impl {libcrux_sha3::generic_keccak::KeccakXofState<STATE,
4649 PARALLEL_LANES, RATE>[TraitClause@0]#2}
4650 */
4651 /**
4652 A monomorphic instance of libcrux_sha3.generic_keccak.absorb_9d
4653 with types uint64_t
4654 with const generics
4655 - PARALLEL_LANES= 1
4656 - RATE= 136
4657 */
libcrux_sha3_generic_keccak_absorb_9d_7b(libcrux_sha3_generic_keccak_KeccakXofState_4f * self,Eurydice_slice inputs[1U])4658 static KRML_MUSTINLINE void libcrux_sha3_generic_keccak_absorb_9d_7b(
4659 libcrux_sha3_generic_keccak_KeccakXofState_4f *self,
4660 Eurydice_slice inputs[1U]) {
4661 libcrux_sha3_generic_keccak_KeccakXofState_4f *uu____0 = self;
4662 /* Passing arrays by value in Rust generates a copy in C */
4663 Eurydice_slice copy_of_inputs[1U];
4664 memcpy(copy_of_inputs, inputs, (size_t)1U * sizeof(Eurydice_slice));
4665 size_t input_remainder_len =
4666 libcrux_sha3_generic_keccak_absorb_full_9d_f8(uu____0, copy_of_inputs);
4667 if (input_remainder_len > (size_t)0U) {
4668 size_t input_len = Eurydice_slice_len(inputs[0U], uint8_t);
4669 for (size_t i = (size_t)0U; i < (size_t)1U; i++) {
4670 size_t i0 = i;
4671 Eurydice_slice uu____2 = Eurydice_array_to_subslice2(
4672 self->buf[i0], self->buf_len, self->buf_len + input_remainder_len,
4673 uint8_t);
4674 Eurydice_slice_copy(
4675 uu____2,
4676 Eurydice_slice_subslice_from(
4677 inputs[i0], input_len - input_remainder_len, uint8_t, size_t),
4678 uint8_t);
4679 }
4680 self->buf_len = self->buf_len + input_remainder_len;
4681 }
4682 }
4683
4684 /**
4685 Shake256 absorb
4686 */
4687 /**
4688 This function found in impl
4689 {(libcrux_sha3::portable::incremental::XofAbsorb<136: usize> for
4690 libcrux_sha3::portable::incremental::Shake256Absorb)#2}
4691 */
libcrux_sha3_portable_incremental_absorb_7d(libcrux_sha3_generic_keccak_KeccakXofState_4f * self,Eurydice_slice input)4692 static inline void libcrux_sha3_portable_incremental_absorb_7d(
4693 libcrux_sha3_generic_keccak_KeccakXofState_4f *self, Eurydice_slice input) {
4694 Eurydice_slice buf[1U] = {input};
4695 libcrux_sha3_generic_keccak_absorb_9d_7b(self, buf);
4696 }
4697
4698 typedef libcrux_sha3_generic_keccak_KeccakXofState_4f
4699 libcrux_sha3_portable_incremental_Shake256Squeeze;
4700
4701 /**
4702 Absorb a final block.
4703
4704 The `inputs` block may be empty. Everything in the `inputs` block beyond
4705 `RATE` bytes is ignored.
4706 */
4707 /**
4708 This function found in impl {libcrux_sha3::generic_keccak::KeccakXofState<STATE,
4709 PARALLEL_LANES, RATE>[TraitClause@0]#2}
4710 */
4711 /**
4712 A monomorphic instance of libcrux_sha3.generic_keccak.absorb_final_9d
4713 with types uint64_t
4714 with const generics
4715 - PARALLEL_LANES= 1
4716 - RATE= 136
4717 - DELIMITER= 31
4718 */
libcrux_sha3_generic_keccak_absorb_final_9d_25(libcrux_sha3_generic_keccak_KeccakXofState_4f * self,Eurydice_slice inputs[1U])4719 static KRML_MUSTINLINE void libcrux_sha3_generic_keccak_absorb_final_9d_25(
4720 libcrux_sha3_generic_keccak_KeccakXofState_4f *self,
4721 Eurydice_slice inputs[1U]) {
4722 libcrux_sha3_generic_keccak_KeccakXofState_4f *uu____0 = self;
4723 /* Passing arrays by value in Rust generates a copy in C */
4724 Eurydice_slice copy_of_inputs[1U];
4725 memcpy(copy_of_inputs, inputs, (size_t)1U * sizeof(Eurydice_slice));
4726 size_t input_remainder_len =
4727 libcrux_sha3_generic_keccak_absorb_full_9d_f8(uu____0, copy_of_inputs);
4728 size_t input_len = Eurydice_slice_len(inputs[0U], uint8_t);
4729 uint8_t blocks[1U][200U] = {{0U}};
4730 for (size_t i = (size_t)0U; i < (size_t)1U; i++) {
4731 size_t i0 = i;
4732 if (self->buf_len > (size_t)0U) {
4733 Eurydice_slice uu____2 = Eurydice_array_to_subslice2(
4734 blocks[i0], (size_t)0U, self->buf_len, uint8_t);
4735 Eurydice_slice_copy(uu____2,
4736 Eurydice_array_to_subslice2(self->buf[i0], (size_t)0U,
4737 self->buf_len, uint8_t),
4738 uint8_t);
4739 }
4740 if (input_remainder_len > (size_t)0U) {
4741 Eurydice_slice uu____3 = Eurydice_array_to_subslice2(
4742 blocks[i0], self->buf_len, self->buf_len + input_remainder_len,
4743 uint8_t);
4744 Eurydice_slice_copy(
4745 uu____3,
4746 Eurydice_slice_subslice_from(
4747 inputs[i0], input_len - input_remainder_len, uint8_t, size_t),
4748 uint8_t);
4749 }
4750 blocks[i0][self->buf_len + input_remainder_len] = 31U;
4751 size_t uu____4 = i0;
4752 size_t uu____5 = (size_t)136U - (size_t)1U;
4753 blocks[uu____4][uu____5] = (uint32_t)blocks[uu____4][uu____5] | 128U;
4754 }
4755 uint64_t(*uu____6)[5U] = self->inner.st;
4756 uint8_t uu____7[1U][200U];
4757 memcpy(uu____7, blocks, (size_t)1U * sizeof(uint8_t[200U]));
4758 libcrux_sha3_portable_keccak_load_block_full_5a_d20(uu____6, uu____7);
4759 libcrux_sha3_generic_keccak_keccakf1600_21(&self->inner);
4760 }
4761
4762 /**
4763 Shake256 absorb final
4764 */
4765 /**
4766 This function found in impl
4767 {(libcrux_sha3::portable::incremental::XofAbsorb<136: usize> for
4768 libcrux_sha3::portable::incremental::Shake256Absorb)#2}
4769 */
4770 static inline libcrux_sha3_generic_keccak_KeccakXofState_4f
libcrux_sha3_portable_incremental_absorb_final_7d(libcrux_sha3_generic_keccak_KeccakXofState_4f self,Eurydice_slice input)4771 libcrux_sha3_portable_incremental_absorb_final_7d(
4772 libcrux_sha3_generic_keccak_KeccakXofState_4f self, Eurydice_slice input) {
4773 Eurydice_slice buf[1U] = {input};
4774 libcrux_sha3_generic_keccak_absorb_final_9d_25(&self, buf);
4775 return self;
4776 }
4777
4778 /**
4779 An all zero block
4780 */
4781 /**
4782 This function found in impl {libcrux_sha3::generic_keccak::KeccakXofState<STATE,
4783 PARALLEL_LANES, RATE>[TraitClause@0]#2}
4784 */
4785 /**
4786 A monomorphic instance of libcrux_sha3.generic_keccak.zero_block_9d
4787 with types uint64_t
4788 with const generics
4789 - PARALLEL_LANES= 1
4790 - RATE= 136
4791 */
libcrux_sha3_generic_keccak_zero_block_9d_e6(uint8_t ret[136U])4792 static inline void libcrux_sha3_generic_keccak_zero_block_9d_e6(
4793 uint8_t ret[136U]) {
4794 ret[0U] = 0U;
4795 ret[1U] = 0U;
4796 ret[2U] = 0U;
4797 ret[3U] = 0U;
4798 ret[4U] = 0U;
4799 ret[5U] = 0U;
4800 ret[6U] = 0U;
4801 ret[7U] = 0U;
4802 ret[8U] = 0U;
4803 ret[9U] = 0U;
4804 ret[10U] = 0U;
4805 ret[11U] = 0U;
4806 ret[12U] = 0U;
4807 ret[13U] = 0U;
4808 ret[14U] = 0U;
4809 ret[15U] = 0U;
4810 ret[16U] = 0U;
4811 ret[17U] = 0U;
4812 ret[18U] = 0U;
4813 ret[19U] = 0U;
4814 ret[20U] = 0U;
4815 ret[21U] = 0U;
4816 ret[22U] = 0U;
4817 ret[23U] = 0U;
4818 ret[24U] = 0U;
4819 ret[25U] = 0U;
4820 ret[26U] = 0U;
4821 ret[27U] = 0U;
4822 ret[28U] = 0U;
4823 ret[29U] = 0U;
4824 ret[30U] = 0U;
4825 ret[31U] = 0U;
4826 ret[32U] = 0U;
4827 ret[33U] = 0U;
4828 ret[34U] = 0U;
4829 ret[35U] = 0U;
4830 ret[36U] = 0U;
4831 ret[37U] = 0U;
4832 ret[38U] = 0U;
4833 ret[39U] = 0U;
4834 ret[40U] = 0U;
4835 ret[41U] = 0U;
4836 ret[42U] = 0U;
4837 ret[43U] = 0U;
4838 ret[44U] = 0U;
4839 ret[45U] = 0U;
4840 ret[46U] = 0U;
4841 ret[47U] = 0U;
4842 ret[48U] = 0U;
4843 ret[49U] = 0U;
4844 ret[50U] = 0U;
4845 ret[51U] = 0U;
4846 ret[52U] = 0U;
4847 ret[53U] = 0U;
4848 ret[54U] = 0U;
4849 ret[55U] = 0U;
4850 ret[56U] = 0U;
4851 ret[57U] = 0U;
4852 ret[58U] = 0U;
4853 ret[59U] = 0U;
4854 ret[60U] = 0U;
4855 ret[61U] = 0U;
4856 ret[62U] = 0U;
4857 ret[63U] = 0U;
4858 ret[64U] = 0U;
4859 ret[65U] = 0U;
4860 ret[66U] = 0U;
4861 ret[67U] = 0U;
4862 ret[68U] = 0U;
4863 ret[69U] = 0U;
4864 ret[70U] = 0U;
4865 ret[71U] = 0U;
4866 ret[72U] = 0U;
4867 ret[73U] = 0U;
4868 ret[74U] = 0U;
4869 ret[75U] = 0U;
4870 ret[76U] = 0U;
4871 ret[77U] = 0U;
4872 ret[78U] = 0U;
4873 ret[79U] = 0U;
4874 ret[80U] = 0U;
4875 ret[81U] = 0U;
4876 ret[82U] = 0U;
4877 ret[83U] = 0U;
4878 ret[84U] = 0U;
4879 ret[85U] = 0U;
4880 ret[86U] = 0U;
4881 ret[87U] = 0U;
4882 ret[88U] = 0U;
4883 ret[89U] = 0U;
4884 ret[90U] = 0U;
4885 ret[91U] = 0U;
4886 ret[92U] = 0U;
4887 ret[93U] = 0U;
4888 ret[94U] = 0U;
4889 ret[95U] = 0U;
4890 ret[96U] = 0U;
4891 ret[97U] = 0U;
4892 ret[98U] = 0U;
4893 ret[99U] = 0U;
4894 ret[100U] = 0U;
4895 ret[101U] = 0U;
4896 ret[102U] = 0U;
4897 ret[103U] = 0U;
4898 ret[104U] = 0U;
4899 ret[105U] = 0U;
4900 ret[106U] = 0U;
4901 ret[107U] = 0U;
4902 ret[108U] = 0U;
4903 ret[109U] = 0U;
4904 ret[110U] = 0U;
4905 ret[111U] = 0U;
4906 ret[112U] = 0U;
4907 ret[113U] = 0U;
4908 ret[114U] = 0U;
4909 ret[115U] = 0U;
4910 ret[116U] = 0U;
4911 ret[117U] = 0U;
4912 ret[118U] = 0U;
4913 ret[119U] = 0U;
4914 ret[120U] = 0U;
4915 ret[121U] = 0U;
4916 ret[122U] = 0U;
4917 ret[123U] = 0U;
4918 ret[124U] = 0U;
4919 ret[125U] = 0U;
4920 ret[126U] = 0U;
4921 ret[127U] = 0U;
4922 ret[128U] = 0U;
4923 ret[129U] = 0U;
4924 ret[130U] = 0U;
4925 ret[131U] = 0U;
4926 ret[132U] = 0U;
4927 ret[133U] = 0U;
4928 ret[134U] = 0U;
4929 ret[135U] = 0U;
4930 }
4931
4932 /**
4933 Generate a new keccak xof state.
4934 */
4935 /**
4936 This function found in impl {libcrux_sha3::generic_keccak::KeccakXofState<STATE,
4937 PARALLEL_LANES, RATE>[TraitClause@0]#2}
4938 */
4939 /**
4940 A monomorphic instance of libcrux_sha3.generic_keccak.new_9d
4941 with types uint64_t
4942 with const generics
4943 - PARALLEL_LANES= 1
4944 - RATE= 136
4945 */
4946 static inline libcrux_sha3_generic_keccak_KeccakXofState_4f
libcrux_sha3_generic_keccak_new_9d_7e(void)4947 libcrux_sha3_generic_keccak_new_9d_7e(void) {
4948 libcrux_sha3_generic_keccak_KeccakXofState_4f lit;
4949 lit.inner = libcrux_sha3_generic_keccak_new_1e_f4();
4950 uint8_t ret[136U];
4951 libcrux_sha3_generic_keccak_zero_block_9d_e6(ret);
4952 memcpy(lit.buf[0U], ret, (size_t)136U * sizeof(uint8_t));
4953 lit.buf_len = (size_t)0U;
4954 lit.sponge = false;
4955 return lit;
4956 }
4957
4958 /**
4959 Shake256 new state
4960 */
4961 /**
4962 This function found in impl
4963 {(libcrux_sha3::portable::incremental::XofAbsorb<136: usize> for
4964 libcrux_sha3::portable::incremental::Shake256Absorb)#2}
4965 */
4966 static inline libcrux_sha3_generic_keccak_KeccakXofState_4f
libcrux_sha3_portable_incremental_new_7d(void)4967 libcrux_sha3_portable_incremental_new_7d(void) {
4968 return libcrux_sha3_generic_keccak_new_9d_7e();
4969 }
4970
4971 /**
4972 A monomorphic instance of libcrux_sha3.generic_keccak.KeccakXofState
4973 with types uint64_t
4974 with const generics
4975 - $1size_t
4976 - $168size_t
4977 */
4978 typedef struct libcrux_sha3_generic_keccak_KeccakXofState_78_s {
4979 libcrux_sha3_generic_keccak_KeccakState_48 inner;
4980 uint8_t buf[1U][168U];
4981 size_t buf_len;
4982 bool sponge;
4983 } libcrux_sha3_generic_keccak_KeccakXofState_78;
4984
4985 typedef libcrux_sha3_generic_keccak_KeccakXofState_78
4986 libcrux_sha3_portable_incremental_Shake128Absorb;
4987
4988 /**
4989 Consume the internal buffer and the required amount of the input to pad to
4990 `RATE`.
4991
4992 Returns the `consumed` bytes from `inputs` if there's enough buffered
4993 content to consume, and `0` otherwise.
4994 If `consumed > 0` is returned, `self.buf` contains a full block to be
4995 loaded.
4996 */
4997 /**
4998 This function found in impl {libcrux_sha3::generic_keccak::KeccakXofState<STATE,
4999 PARALLEL_LANES, RATE>[TraitClause@0]#2}
5000 */
5001 /**
5002 A monomorphic instance of libcrux_sha3.generic_keccak.fill_buffer_9d
5003 with types uint64_t
5004 with const generics
5005 - PARALLEL_LANES= 1
5006 - RATE= 168
5007 */
libcrux_sha3_generic_keccak_fill_buffer_9d_b00(libcrux_sha3_generic_keccak_KeccakXofState_78 * self,Eurydice_slice inputs[1U])5008 static inline size_t libcrux_sha3_generic_keccak_fill_buffer_9d_b00(
5009 libcrux_sha3_generic_keccak_KeccakXofState_78 *self,
5010 Eurydice_slice inputs[1U]) {
5011 size_t input_len = Eurydice_slice_len(inputs[0U], uint8_t);
5012 size_t consumed = (size_t)0U;
5013 if (self->buf_len > (size_t)0U) {
5014 if (self->buf_len + input_len >= (size_t)168U) {
5015 consumed = (size_t)168U - self->buf_len;
5016 for (size_t i = (size_t)0U; i < (size_t)1U; i++) {
5017 size_t i0 = i;
5018 Eurydice_slice uu____0 = Eurydice_array_to_subslice_from(
5019 (size_t)168U, self->buf[i0], self->buf_len, uint8_t, size_t);
5020 Eurydice_slice_copy(
5021 uu____0,
5022 Eurydice_slice_subslice_to(inputs[i0], consumed, uint8_t, size_t),
5023 uint8_t);
5024 }
5025 self->buf_len = self->buf_len + consumed;
5026 }
5027 }
5028 return consumed;
5029 }
5030
5031 /**
5032 This function found in impl {libcrux_sha3::generic_keccak::KeccakXofState<STATE,
5033 PARALLEL_LANES, RATE>[TraitClause@0]#2}
5034 */
5035 /**
5036 A monomorphic instance of libcrux_sha3.generic_keccak.absorb_full_9d
5037 with types uint64_t
5038 with const generics
5039 - PARALLEL_LANES= 1
5040 - RATE= 168
5041 */
libcrux_sha3_generic_keccak_absorb_full_9d_f80(libcrux_sha3_generic_keccak_KeccakXofState_78 * self,Eurydice_slice inputs[1U])5042 static inline size_t libcrux_sha3_generic_keccak_absorb_full_9d_f80(
5043 libcrux_sha3_generic_keccak_KeccakXofState_78 *self,
5044 Eurydice_slice inputs[1U]) {
5045 libcrux_sha3_generic_keccak_KeccakXofState_78 *uu____0 = self;
5046 /* Passing arrays by value in Rust generates a copy in C */
5047 Eurydice_slice copy_of_inputs0[1U];
5048 memcpy(copy_of_inputs0, inputs, (size_t)1U * sizeof(Eurydice_slice));
5049 size_t input_consumed =
5050 libcrux_sha3_generic_keccak_fill_buffer_9d_b00(uu____0, copy_of_inputs0);
5051 if (input_consumed > (size_t)0U) {
5052 Eurydice_slice borrowed[1U];
5053 for (size_t i = (size_t)0U; i < (size_t)1U; i++) {
5054 uint8_t buf[168U] = {0U};
5055 borrowed[i] = core_array___Array_T__N__23__as_slice(
5056 (size_t)168U, buf, uint8_t, Eurydice_slice);
5057 }
5058 for (size_t i = (size_t)0U; i < (size_t)1U; i++) {
5059 size_t i0 = i;
5060 borrowed[i0] =
5061 Eurydice_array_to_slice((size_t)168U, self->buf[i0], uint8_t);
5062 }
5063 uint64_t(*uu____2)[5U] = self->inner.st;
5064 Eurydice_slice uu____3[1U];
5065 memcpy(uu____3, borrowed, (size_t)1U * sizeof(Eurydice_slice));
5066 libcrux_sha3_portable_keccak_load_block_5a_b83(uu____2, uu____3);
5067 libcrux_sha3_generic_keccak_keccakf1600_21(&self->inner);
5068 self->buf_len = (size_t)0U;
5069 }
5070 size_t input_to_consume =
5071 Eurydice_slice_len(inputs[0U], uint8_t) - input_consumed;
5072 size_t num_blocks = input_to_consume / (size_t)168U;
5073 size_t remainder = input_to_consume % (size_t)168U;
5074 for (size_t i = (size_t)0U; i < num_blocks; i++) {
5075 size_t i0 = i;
5076 uint64_t(*uu____4)[5U] = self->inner.st;
5077 /* Passing arrays by value in Rust generates a copy in C */
5078 Eurydice_slice copy_of_inputs[1U];
5079 memcpy(copy_of_inputs, inputs, (size_t)1U * sizeof(Eurydice_slice));
5080 Eurydice_slice ret[1U];
5081 libcrux_sha3_portable_keccak_slice_n_5a(
5082 copy_of_inputs, input_consumed + i0 * (size_t)168U, (size_t)168U, ret);
5083 libcrux_sha3_portable_keccak_load_block_5a_b83(uu____4, ret);
5084 libcrux_sha3_generic_keccak_keccakf1600_21(&self->inner);
5085 }
5086 return remainder;
5087 }
5088
5089 /**
5090 Absorb
5091
5092 This function takes any number of bytes to absorb and buffers if it's not
5093 enough. The function assumes that all input slices in `blocks` have the same
5094 length.
5095
5096 Only a multiple of `RATE` blocks are absorbed.
5097 For the remaining bytes [`absorb_final`] needs to be called.
5098
5099 This works best with relatively small `inputs`.
5100 */
5101 /**
5102 This function found in impl {libcrux_sha3::generic_keccak::KeccakXofState<STATE,
5103 PARALLEL_LANES, RATE>[TraitClause@0]#2}
5104 */
5105 /**
5106 A monomorphic instance of libcrux_sha3.generic_keccak.absorb_9d
5107 with types uint64_t
5108 with const generics
5109 - PARALLEL_LANES= 1
5110 - RATE= 168
5111 */
libcrux_sha3_generic_keccak_absorb_9d_7b0(libcrux_sha3_generic_keccak_KeccakXofState_78 * self,Eurydice_slice inputs[1U])5112 static KRML_MUSTINLINE void libcrux_sha3_generic_keccak_absorb_9d_7b0(
5113 libcrux_sha3_generic_keccak_KeccakXofState_78 *self,
5114 Eurydice_slice inputs[1U]) {
5115 libcrux_sha3_generic_keccak_KeccakXofState_78 *uu____0 = self;
5116 /* Passing arrays by value in Rust generates a copy in C */
5117 Eurydice_slice copy_of_inputs[1U];
5118 memcpy(copy_of_inputs, inputs, (size_t)1U * sizeof(Eurydice_slice));
5119 size_t input_remainder_len =
5120 libcrux_sha3_generic_keccak_absorb_full_9d_f80(uu____0, copy_of_inputs);
5121 if (input_remainder_len > (size_t)0U) {
5122 size_t input_len = Eurydice_slice_len(inputs[0U], uint8_t);
5123 for (size_t i = (size_t)0U; i < (size_t)1U; i++) {
5124 size_t i0 = i;
5125 Eurydice_slice uu____2 = Eurydice_array_to_subslice2(
5126 self->buf[i0], self->buf_len, self->buf_len + input_remainder_len,
5127 uint8_t);
5128 Eurydice_slice_copy(
5129 uu____2,
5130 Eurydice_slice_subslice_from(
5131 inputs[i0], input_len - input_remainder_len, uint8_t, size_t),
5132 uint8_t);
5133 }
5134 self->buf_len = self->buf_len + input_remainder_len;
5135 }
5136 }
5137
5138 /**
5139 This function found in impl
5140 {(libcrux_sha3::portable::incremental::XofAbsorb<168: usize> for
5141 libcrux_sha3::portable::incremental::Shake128Absorb)}
5142 */
libcrux_sha3_portable_incremental_absorb_1c(libcrux_sha3_generic_keccak_KeccakXofState_78 * self,Eurydice_slice input)5143 static inline void libcrux_sha3_portable_incremental_absorb_1c(
5144 libcrux_sha3_generic_keccak_KeccakXofState_78 *self, Eurydice_slice input) {
5145 Eurydice_slice buf[1U] = {input};
5146 libcrux_sha3_generic_keccak_absorb_9d_7b0(self, buf);
5147 }
5148
5149 typedef libcrux_sha3_generic_keccak_KeccakXofState_78
5150 libcrux_sha3_portable_incremental_Shake128Squeeze;
5151
5152 /**
5153 Absorb a final block.
5154
5155 The `inputs` block may be empty. Everything in the `inputs` block beyond
5156 `RATE` bytes is ignored.
5157 */
5158 /**
5159 This function found in impl {libcrux_sha3::generic_keccak::KeccakXofState<STATE,
5160 PARALLEL_LANES, RATE>[TraitClause@0]#2}
5161 */
5162 /**
5163 A monomorphic instance of libcrux_sha3.generic_keccak.absorb_final_9d
5164 with types uint64_t
5165 with const generics
5166 - PARALLEL_LANES= 1
5167 - RATE= 168
5168 - DELIMITER= 31
5169 */
libcrux_sha3_generic_keccak_absorb_final_9d_250(libcrux_sha3_generic_keccak_KeccakXofState_78 * self,Eurydice_slice inputs[1U])5170 static KRML_MUSTINLINE void libcrux_sha3_generic_keccak_absorb_final_9d_250(
5171 libcrux_sha3_generic_keccak_KeccakXofState_78 *self,
5172 Eurydice_slice inputs[1U]) {
5173 libcrux_sha3_generic_keccak_KeccakXofState_78 *uu____0 = self;
5174 /* Passing arrays by value in Rust generates a copy in C */
5175 Eurydice_slice copy_of_inputs[1U];
5176 memcpy(copy_of_inputs, inputs, (size_t)1U * sizeof(Eurydice_slice));
5177 size_t input_remainder_len =
5178 libcrux_sha3_generic_keccak_absorb_full_9d_f80(uu____0, copy_of_inputs);
5179 size_t input_len = Eurydice_slice_len(inputs[0U], uint8_t);
5180 uint8_t blocks[1U][200U] = {{0U}};
5181 for (size_t i = (size_t)0U; i < (size_t)1U; i++) {
5182 size_t i0 = i;
5183 if (self->buf_len > (size_t)0U) {
5184 Eurydice_slice uu____2 = Eurydice_array_to_subslice2(
5185 blocks[i0], (size_t)0U, self->buf_len, uint8_t);
5186 Eurydice_slice_copy(uu____2,
5187 Eurydice_array_to_subslice2(self->buf[i0], (size_t)0U,
5188 self->buf_len, uint8_t),
5189 uint8_t);
5190 }
5191 if (input_remainder_len > (size_t)0U) {
5192 Eurydice_slice uu____3 = Eurydice_array_to_subslice2(
5193 blocks[i0], self->buf_len, self->buf_len + input_remainder_len,
5194 uint8_t);
5195 Eurydice_slice_copy(
5196 uu____3,
5197 Eurydice_slice_subslice_from(
5198 inputs[i0], input_len - input_remainder_len, uint8_t, size_t),
5199 uint8_t);
5200 }
5201 blocks[i0][self->buf_len + input_remainder_len] = 31U;
5202 size_t uu____4 = i0;
5203 size_t uu____5 = (size_t)168U - (size_t)1U;
5204 blocks[uu____4][uu____5] = (uint32_t)blocks[uu____4][uu____5] | 128U;
5205 }
5206 uint64_t(*uu____6)[5U] = self->inner.st;
5207 uint8_t uu____7[1U][200U];
5208 memcpy(uu____7, blocks, (size_t)1U * sizeof(uint8_t[200U]));
5209 libcrux_sha3_portable_keccak_load_block_full_5a_d21(uu____6, uu____7);
5210 libcrux_sha3_generic_keccak_keccakf1600_21(&self->inner);
5211 }
5212
5213 /**
5214 This function found in impl
5215 {(libcrux_sha3::portable::incremental::XofAbsorb<168: usize> for
5216 libcrux_sha3::portable::incremental::Shake128Absorb)}
5217 */
5218 static inline libcrux_sha3_generic_keccak_KeccakXofState_78
libcrux_sha3_portable_incremental_absorb_final_1c(libcrux_sha3_generic_keccak_KeccakXofState_78 self,Eurydice_slice input)5219 libcrux_sha3_portable_incremental_absorb_final_1c(
5220 libcrux_sha3_generic_keccak_KeccakXofState_78 self, Eurydice_slice input) {
5221 Eurydice_slice buf[1U] = {input};
5222 libcrux_sha3_generic_keccak_absorb_final_9d_250(&self, buf);
5223 return self;
5224 }
5225
5226 /**
5227 An all zero block
5228 */
5229 /**
5230 This function found in impl {libcrux_sha3::generic_keccak::KeccakXofState<STATE,
5231 PARALLEL_LANES, RATE>[TraitClause@0]#2}
5232 */
5233 /**
5234 A monomorphic instance of libcrux_sha3.generic_keccak.zero_block_9d
5235 with types uint64_t
5236 with const generics
5237 - PARALLEL_LANES= 1
5238 - RATE= 168
5239 */
libcrux_sha3_generic_keccak_zero_block_9d_e60(uint8_t ret[168U])5240 static inline void libcrux_sha3_generic_keccak_zero_block_9d_e60(
5241 uint8_t ret[168U]) {
5242 ret[0U] = 0U;
5243 ret[1U] = 0U;
5244 ret[2U] = 0U;
5245 ret[3U] = 0U;
5246 ret[4U] = 0U;
5247 ret[5U] = 0U;
5248 ret[6U] = 0U;
5249 ret[7U] = 0U;
5250 ret[8U] = 0U;
5251 ret[9U] = 0U;
5252 ret[10U] = 0U;
5253 ret[11U] = 0U;
5254 ret[12U] = 0U;
5255 ret[13U] = 0U;
5256 ret[14U] = 0U;
5257 ret[15U] = 0U;
5258 ret[16U] = 0U;
5259 ret[17U] = 0U;
5260 ret[18U] = 0U;
5261 ret[19U] = 0U;
5262 ret[20U] = 0U;
5263 ret[21U] = 0U;
5264 ret[22U] = 0U;
5265 ret[23U] = 0U;
5266 ret[24U] = 0U;
5267 ret[25U] = 0U;
5268 ret[26U] = 0U;
5269 ret[27U] = 0U;
5270 ret[28U] = 0U;
5271 ret[29U] = 0U;
5272 ret[30U] = 0U;
5273 ret[31U] = 0U;
5274 ret[32U] = 0U;
5275 ret[33U] = 0U;
5276 ret[34U] = 0U;
5277 ret[35U] = 0U;
5278 ret[36U] = 0U;
5279 ret[37U] = 0U;
5280 ret[38U] = 0U;
5281 ret[39U] = 0U;
5282 ret[40U] = 0U;
5283 ret[41U] = 0U;
5284 ret[42U] = 0U;
5285 ret[43U] = 0U;
5286 ret[44U] = 0U;
5287 ret[45U] = 0U;
5288 ret[46U] = 0U;
5289 ret[47U] = 0U;
5290 ret[48U] = 0U;
5291 ret[49U] = 0U;
5292 ret[50U] = 0U;
5293 ret[51U] = 0U;
5294 ret[52U] = 0U;
5295 ret[53U] = 0U;
5296 ret[54U] = 0U;
5297 ret[55U] = 0U;
5298 ret[56U] = 0U;
5299 ret[57U] = 0U;
5300 ret[58U] = 0U;
5301 ret[59U] = 0U;
5302 ret[60U] = 0U;
5303 ret[61U] = 0U;
5304 ret[62U] = 0U;
5305 ret[63U] = 0U;
5306 ret[64U] = 0U;
5307 ret[65U] = 0U;
5308 ret[66U] = 0U;
5309 ret[67U] = 0U;
5310 ret[68U] = 0U;
5311 ret[69U] = 0U;
5312 ret[70U] = 0U;
5313 ret[71U] = 0U;
5314 ret[72U] = 0U;
5315 ret[73U] = 0U;
5316 ret[74U] = 0U;
5317 ret[75U] = 0U;
5318 ret[76U] = 0U;
5319 ret[77U] = 0U;
5320 ret[78U] = 0U;
5321 ret[79U] = 0U;
5322 ret[80U] = 0U;
5323 ret[81U] = 0U;
5324 ret[82U] = 0U;
5325 ret[83U] = 0U;
5326 ret[84U] = 0U;
5327 ret[85U] = 0U;
5328 ret[86U] = 0U;
5329 ret[87U] = 0U;
5330 ret[88U] = 0U;
5331 ret[89U] = 0U;
5332 ret[90U] = 0U;
5333 ret[91U] = 0U;
5334 ret[92U] = 0U;
5335 ret[93U] = 0U;
5336 ret[94U] = 0U;
5337 ret[95U] = 0U;
5338 ret[96U] = 0U;
5339 ret[97U] = 0U;
5340 ret[98U] = 0U;
5341 ret[99U] = 0U;
5342 ret[100U] = 0U;
5343 ret[101U] = 0U;
5344 ret[102U] = 0U;
5345 ret[103U] = 0U;
5346 ret[104U] = 0U;
5347 ret[105U] = 0U;
5348 ret[106U] = 0U;
5349 ret[107U] = 0U;
5350 ret[108U] = 0U;
5351 ret[109U] = 0U;
5352 ret[110U] = 0U;
5353 ret[111U] = 0U;
5354 ret[112U] = 0U;
5355 ret[113U] = 0U;
5356 ret[114U] = 0U;
5357 ret[115U] = 0U;
5358 ret[116U] = 0U;
5359 ret[117U] = 0U;
5360 ret[118U] = 0U;
5361 ret[119U] = 0U;
5362 ret[120U] = 0U;
5363 ret[121U] = 0U;
5364 ret[122U] = 0U;
5365 ret[123U] = 0U;
5366 ret[124U] = 0U;
5367 ret[125U] = 0U;
5368 ret[126U] = 0U;
5369 ret[127U] = 0U;
5370 ret[128U] = 0U;
5371 ret[129U] = 0U;
5372 ret[130U] = 0U;
5373 ret[131U] = 0U;
5374 ret[132U] = 0U;
5375 ret[133U] = 0U;
5376 ret[134U] = 0U;
5377 ret[135U] = 0U;
5378 ret[136U] = 0U;
5379 ret[137U] = 0U;
5380 ret[138U] = 0U;
5381 ret[139U] = 0U;
5382 ret[140U] = 0U;
5383 ret[141U] = 0U;
5384 ret[142U] = 0U;
5385 ret[143U] = 0U;
5386 ret[144U] = 0U;
5387 ret[145U] = 0U;
5388 ret[146U] = 0U;
5389 ret[147U] = 0U;
5390 ret[148U] = 0U;
5391 ret[149U] = 0U;
5392 ret[150U] = 0U;
5393 ret[151U] = 0U;
5394 ret[152U] = 0U;
5395 ret[153U] = 0U;
5396 ret[154U] = 0U;
5397 ret[155U] = 0U;
5398 ret[156U] = 0U;
5399 ret[157U] = 0U;
5400 ret[158U] = 0U;
5401 ret[159U] = 0U;
5402 ret[160U] = 0U;
5403 ret[161U] = 0U;
5404 ret[162U] = 0U;
5405 ret[163U] = 0U;
5406 ret[164U] = 0U;
5407 ret[165U] = 0U;
5408 ret[166U] = 0U;
5409 ret[167U] = 0U;
5410 }
5411
5412 /**
5413 Generate a new keccak xof state.
5414 */
5415 /**
5416 This function found in impl {libcrux_sha3::generic_keccak::KeccakXofState<STATE,
5417 PARALLEL_LANES, RATE>[TraitClause@0]#2}
5418 */
5419 /**
5420 A monomorphic instance of libcrux_sha3.generic_keccak.new_9d
5421 with types uint64_t
5422 with const generics
5423 - PARALLEL_LANES= 1
5424 - RATE= 168
5425 */
5426 static inline libcrux_sha3_generic_keccak_KeccakXofState_78
libcrux_sha3_generic_keccak_new_9d_7e0(void)5427 libcrux_sha3_generic_keccak_new_9d_7e0(void) {
5428 libcrux_sha3_generic_keccak_KeccakXofState_78 lit;
5429 lit.inner = libcrux_sha3_generic_keccak_new_1e_f4();
5430 uint8_t ret[168U];
5431 libcrux_sha3_generic_keccak_zero_block_9d_e60(ret);
5432 memcpy(lit.buf[0U], ret, (size_t)168U * sizeof(uint8_t));
5433 lit.buf_len = (size_t)0U;
5434 lit.sponge = false;
5435 return lit;
5436 }
5437
5438 /**
5439 This function found in impl
5440 {(libcrux_sha3::portable::incremental::XofAbsorb<168: usize> for
5441 libcrux_sha3::portable::incremental::Shake128Absorb)}
5442 */
5443 static inline libcrux_sha3_generic_keccak_KeccakXofState_78
libcrux_sha3_portable_incremental_new_1c(void)5444 libcrux_sha3_portable_incremental_new_1c(void) {
5445 return libcrux_sha3_generic_keccak_new_9d_7e0();
5446 }
5447
5448 /**
5449 `out` has the exact size we want here. It must be less than or equal to `RATE`.
5450 */
5451 /**
5452 This function found in impl {(libcrux_sha3::traits::internal::KeccakItem<1:
5453 usize> for u64)}
5454 */
5455 /**
5456 A monomorphic instance of libcrux_sha3.portable_keccak.store_5a
5457 with const generics
5458 - RATE= 136
5459 */
libcrux_sha3_portable_keccak_store_5a_1c(uint64_t (* state)[5U],Eurydice_slice out[1U])5460 static KRML_MUSTINLINE void libcrux_sha3_portable_keccak_store_5a_1c(
5461 uint64_t (*state)[5U], Eurydice_slice out[1U]) {
5462 size_t num_full_blocks = Eurydice_slice_len(out[0U], uint8_t) / (size_t)8U;
5463 size_t last_block_len = Eurydice_slice_len(out[0U], uint8_t) % (size_t)8U;
5464 for (size_t i = (size_t)0U; i < num_full_blocks; i++) {
5465 size_t i0 = i;
5466 Eurydice_slice uu____0 = Eurydice_slice_subslice2(
5467 out[0U], i0 * (size_t)8U, i0 * (size_t)8U + (size_t)8U, uint8_t);
5468 uint8_t ret[8U];
5469 core_num__u64_9__to_le_bytes(state[i0 / (size_t)5U][i0 % (size_t)5U], ret);
5470 Eurydice_slice_copy(
5471 uu____0, Eurydice_array_to_slice((size_t)8U, ret, uint8_t), uint8_t);
5472 }
5473 if (last_block_len != (size_t)0U) {
5474 Eurydice_slice uu____1 = Eurydice_slice_subslice2(
5475 out[0U], num_full_blocks * (size_t)8U,
5476 num_full_blocks * (size_t)8U + last_block_len, uint8_t);
5477 uint8_t ret[8U];
5478 core_num__u64_9__to_le_bytes(
5479 state[num_full_blocks / (size_t)5U][num_full_blocks % (size_t)5U], ret);
5480 Eurydice_slice_copy(
5481 uu____1,
5482 Eurydice_array_to_subslice2(ret, (size_t)0U, last_block_len, uint8_t),
5483 uint8_t);
5484 }
5485 }
5486
5487 /**
5488 Squeeze `N` x `LEN` bytes.
5489 */
5490 /**
5491 This function found in impl {libcrux_sha3::generic_keccak::KeccakXofState<STATE,
5492 PARALLEL_LANES, RATE>[TraitClause@0]#2}
5493 */
5494 /**
5495 A monomorphic instance of libcrux_sha3.generic_keccak.squeeze_9d
5496 with types uint64_t
5497 with const generics
5498 - PARALLEL_LANES= 1
5499 - RATE= 136
5500 */
libcrux_sha3_generic_keccak_squeeze_9d_96(libcrux_sha3_generic_keccak_KeccakXofState_4f * self,Eurydice_slice out[1U])5501 static KRML_MUSTINLINE void libcrux_sha3_generic_keccak_squeeze_9d_96(
5502 libcrux_sha3_generic_keccak_KeccakXofState_4f *self,
5503 Eurydice_slice out[1U]) {
5504 if (self->sponge) {
5505 libcrux_sha3_generic_keccak_keccakf1600_21(&self->inner);
5506 }
5507 size_t out_len = Eurydice_slice_len(out[0U], uint8_t);
5508 size_t blocks = out_len / (size_t)136U;
5509 size_t last = out_len - out_len % (size_t)136U;
5510 size_t mid;
5511 if ((size_t)136U >= out_len) {
5512 mid = out_len;
5513 } else {
5514 mid = (size_t)136U;
5515 }
5516 Eurydice_slice_uint8_t_1size_t__x2 uu____0 =
5517 libcrux_sha3_portable_keccak_split_at_mut_n_5a(out, mid);
5518 Eurydice_slice out00[1U];
5519 memcpy(out00, uu____0.fst, (size_t)1U * sizeof(Eurydice_slice));
5520 Eurydice_slice out_rest[1U];
5521 memcpy(out_rest, uu____0.snd, (size_t)1U * sizeof(Eurydice_slice));
5522 libcrux_sha3_portable_keccak_store_5a_1c(self->inner.st, out00);
5523 core_ops_range_Range_b3 iter =
5524 core_iter_traits_collect___core__iter__traits__collect__IntoIterator_for_I__1__into_iter(
5525 (CLITERAL(core_ops_range_Range_b3){.start = (size_t)1U,
5526 .end = blocks}),
5527 core_ops_range_Range_b3, core_ops_range_Range_b3);
5528 while (true) {
5529 if (core_iter_range___core__iter__traits__iterator__Iterator_for_core__ops__range__Range_A___6__next(
5530 &iter, size_t, Option_b3)
5531 .tag == None) {
5532 break;
5533 } else {
5534 Eurydice_slice_uint8_t_1size_t__x2 uu____1 =
5535 libcrux_sha3_portable_keccak_split_at_mut_n_5a(out_rest,
5536 (size_t)136U);
5537 Eurydice_slice out0[1U];
5538 memcpy(out0, uu____1.fst, (size_t)1U * sizeof(Eurydice_slice));
5539 Eurydice_slice tmp[1U];
5540 memcpy(tmp, uu____1.snd, (size_t)1U * sizeof(Eurydice_slice));
5541 libcrux_sha3_generic_keccak_keccakf1600_21(&self->inner);
5542 libcrux_sha3_portable_keccak_store_5a_1c(self->inner.st, out0);
5543 memcpy(out_rest, tmp, (size_t)1U * sizeof(Eurydice_slice));
5544 }
5545 }
5546 if (last < out_len) {
5547 libcrux_sha3_generic_keccak_keccakf1600_21(&self->inner);
5548 libcrux_sha3_portable_keccak_store_5a_1c(self->inner.st, out_rest);
5549 }
5550 self->sponge = true;
5551 }
5552
5553 /**
5554 Shake256 squeeze
5555 */
5556 /**
5557 This function found in impl
5558 {(libcrux_sha3::portable::incremental::XofSqueeze<136: usize> for
5559 libcrux_sha3::portable::incremental::Shake256Squeeze)#3}
5560 */
libcrux_sha3_portable_incremental_squeeze_8a(libcrux_sha3_generic_keccak_KeccakXofState_4f * self,Eurydice_slice out)5561 static inline void libcrux_sha3_portable_incremental_squeeze_8a(
5562 libcrux_sha3_generic_keccak_KeccakXofState_4f *self, Eurydice_slice out) {
5563 Eurydice_slice buf[1U] = {out};
5564 libcrux_sha3_generic_keccak_squeeze_9d_96(self, buf);
5565 }
5566
5567 /**
5568 `out` has the exact size we want here. It must be less than or equal to `RATE`.
5569 */
5570 /**
5571 This function found in impl {(libcrux_sha3::traits::internal::KeccakItem<1:
5572 usize> for u64)}
5573 */
5574 /**
5575 A monomorphic instance of libcrux_sha3.portable_keccak.store_5a
5576 with const generics
5577 - RATE= 168
5578 */
libcrux_sha3_portable_keccak_store_5a_1c0(uint64_t (* state)[5U],Eurydice_slice out[1U])5579 static KRML_MUSTINLINE void libcrux_sha3_portable_keccak_store_5a_1c0(
5580 uint64_t (*state)[5U], Eurydice_slice out[1U]) {
5581 size_t num_full_blocks = Eurydice_slice_len(out[0U], uint8_t) / (size_t)8U;
5582 size_t last_block_len = Eurydice_slice_len(out[0U], uint8_t) % (size_t)8U;
5583 for (size_t i = (size_t)0U; i < num_full_blocks; i++) {
5584 size_t i0 = i;
5585 Eurydice_slice uu____0 = Eurydice_slice_subslice2(
5586 out[0U], i0 * (size_t)8U, i0 * (size_t)8U + (size_t)8U, uint8_t);
5587 uint8_t ret[8U];
5588 core_num__u64_9__to_le_bytes(state[i0 / (size_t)5U][i0 % (size_t)5U], ret);
5589 Eurydice_slice_copy(
5590 uu____0, Eurydice_array_to_slice((size_t)8U, ret, uint8_t), uint8_t);
5591 }
5592 if (last_block_len != (size_t)0U) {
5593 Eurydice_slice uu____1 = Eurydice_slice_subslice2(
5594 out[0U], num_full_blocks * (size_t)8U,
5595 num_full_blocks * (size_t)8U + last_block_len, uint8_t);
5596 uint8_t ret[8U];
5597 core_num__u64_9__to_le_bytes(
5598 state[num_full_blocks / (size_t)5U][num_full_blocks % (size_t)5U], ret);
5599 Eurydice_slice_copy(
5600 uu____1,
5601 Eurydice_array_to_subslice2(ret, (size_t)0U, last_block_len, uint8_t),
5602 uint8_t);
5603 }
5604 }
5605
5606 /**
5607 Squeeze `N` x `LEN` bytes.
5608 */
5609 /**
5610 This function found in impl {libcrux_sha3::generic_keccak::KeccakXofState<STATE,
5611 PARALLEL_LANES, RATE>[TraitClause@0]#2}
5612 */
5613 /**
5614 A monomorphic instance of libcrux_sha3.generic_keccak.squeeze_9d
5615 with types uint64_t
5616 with const generics
5617 - PARALLEL_LANES= 1
5618 - RATE= 168
5619 */
libcrux_sha3_generic_keccak_squeeze_9d_960(libcrux_sha3_generic_keccak_KeccakXofState_78 * self,Eurydice_slice out[1U])5620 static KRML_MUSTINLINE void libcrux_sha3_generic_keccak_squeeze_9d_960(
5621 libcrux_sha3_generic_keccak_KeccakXofState_78 *self,
5622 Eurydice_slice out[1U]) {
5623 if (self->sponge) {
5624 libcrux_sha3_generic_keccak_keccakf1600_21(&self->inner);
5625 }
5626 size_t out_len = Eurydice_slice_len(out[0U], uint8_t);
5627 size_t blocks = out_len / (size_t)168U;
5628 size_t last = out_len - out_len % (size_t)168U;
5629 size_t mid;
5630 if ((size_t)168U >= out_len) {
5631 mid = out_len;
5632 } else {
5633 mid = (size_t)168U;
5634 }
5635 Eurydice_slice_uint8_t_1size_t__x2 uu____0 =
5636 libcrux_sha3_portable_keccak_split_at_mut_n_5a(out, mid);
5637 Eurydice_slice out00[1U];
5638 memcpy(out00, uu____0.fst, (size_t)1U * sizeof(Eurydice_slice));
5639 Eurydice_slice out_rest[1U];
5640 memcpy(out_rest, uu____0.snd, (size_t)1U * sizeof(Eurydice_slice));
5641 libcrux_sha3_portable_keccak_store_5a_1c0(self->inner.st, out00);
5642 core_ops_range_Range_b3 iter =
5643 core_iter_traits_collect___core__iter__traits__collect__IntoIterator_for_I__1__into_iter(
5644 (CLITERAL(core_ops_range_Range_b3){.start = (size_t)1U,
5645 .end = blocks}),
5646 core_ops_range_Range_b3, core_ops_range_Range_b3);
5647 while (true) {
5648 if (core_iter_range___core__iter__traits__iterator__Iterator_for_core__ops__range__Range_A___6__next(
5649 &iter, size_t, Option_b3)
5650 .tag == None) {
5651 break;
5652 } else {
5653 Eurydice_slice_uint8_t_1size_t__x2 uu____1 =
5654 libcrux_sha3_portable_keccak_split_at_mut_n_5a(out_rest,
5655 (size_t)168U);
5656 Eurydice_slice out0[1U];
5657 memcpy(out0, uu____1.fst, (size_t)1U * sizeof(Eurydice_slice));
5658 Eurydice_slice tmp[1U];
5659 memcpy(tmp, uu____1.snd, (size_t)1U * sizeof(Eurydice_slice));
5660 libcrux_sha3_generic_keccak_keccakf1600_21(&self->inner);
5661 libcrux_sha3_portable_keccak_store_5a_1c0(self->inner.st, out0);
5662 memcpy(out_rest, tmp, (size_t)1U * sizeof(Eurydice_slice));
5663 }
5664 }
5665 if (last < out_len) {
5666 libcrux_sha3_generic_keccak_keccakf1600_21(&self->inner);
5667 libcrux_sha3_portable_keccak_store_5a_1c0(self->inner.st, out_rest);
5668 }
5669 self->sponge = true;
5670 }
5671
5672 /**
5673 Shake128 squeeze
5674 */
5675 /**
5676 This function found in impl
5677 {(libcrux_sha3::portable::incremental::XofSqueeze<168: usize> for
5678 libcrux_sha3::portable::incremental::Shake128Squeeze)#1}
5679 */
libcrux_sha3_portable_incremental_squeeze_10(libcrux_sha3_generic_keccak_KeccakXofState_78 * self,Eurydice_slice out)5680 static inline void libcrux_sha3_portable_incremental_squeeze_10(
5681 libcrux_sha3_generic_keccak_KeccakXofState_78 *self, Eurydice_slice out) {
5682 Eurydice_slice buf[1U] = {out};
5683 libcrux_sha3_generic_keccak_squeeze_9d_960(self, buf);
5684 }
5685
5686 /**
5687 This function found in impl {(core::clone::Clone for
5688 libcrux_sha3::portable::KeccakState)}
5689 */
5690 static inline libcrux_sha3_generic_keccak_KeccakState_48
libcrux_sha3_portable_clone_3d(libcrux_sha3_generic_keccak_KeccakState_48 * self)5691 libcrux_sha3_portable_clone_3d(
5692 libcrux_sha3_generic_keccak_KeccakState_48 *self) {
5693 return self[0U];
5694 }
5695
5696 /**
5697 This function found in impl {(core::convert::From<libcrux_sha3::Algorithm> for
5698 u32)#1}
5699 */
libcrux_sha3_from_eb(libcrux_sha3_Algorithm v)5700 static inline uint32_t libcrux_sha3_from_eb(libcrux_sha3_Algorithm v) {
5701 uint32_t uu____0;
5702 switch (v) {
5703 case libcrux_sha3_Sha224: {
5704 uu____0 = 1U;
5705 break;
5706 }
5707 case libcrux_sha3_Sha256: {
5708 uu____0 = 2U;
5709 break;
5710 }
5711 case libcrux_sha3_Sha384: {
5712 uu____0 = 3U;
5713 break;
5714 }
5715 case libcrux_sha3_Sha512: {
5716 uu____0 = 4U;
5717 break;
5718 }
5719 default: {
5720 KRML_HOST_EPRINTF("KaRaMeL incomplete match at %s:%d\n", __FILE__,
5721 __LINE__);
5722 KRML_HOST_EXIT(253U);
5723 }
5724 }
5725 return uu____0;
5726 }
5727
5728 /**
5729 This function found in impl {(core::convert::From<u32> for
5730 libcrux_sha3::Algorithm)}
5731 */
libcrux_sha3_from_2d(uint32_t v)5732 static inline libcrux_sha3_Algorithm libcrux_sha3_from_2d(uint32_t v) {
5733 libcrux_sha3_Algorithm uu____0;
5734 switch (v) {
5735 case 1U: {
5736 uu____0 = libcrux_sha3_Sha224;
5737 break;
5738 }
5739 case 2U: {
5740 uu____0 = libcrux_sha3_Sha256;
5741 break;
5742 }
5743 case 3U: {
5744 uu____0 = libcrux_sha3_Sha384;
5745 break;
5746 }
5747 case 4U: {
5748 uu____0 = libcrux_sha3_Sha512;
5749 break;
5750 }
5751 default: {
5752 KRML_HOST_EPRINTF("KaRaMeL abort at %s:%d\n%s\n", __FILE__, __LINE__,
5753 "panic!");
5754 KRML_HOST_EXIT(255U);
5755 }
5756 }
5757 return uu____0;
5758 }
5759
5760 typedef uint8_t libcrux_sha3_Sha3_512Digest[64U];
5761
5762 typedef uint8_t libcrux_sha3_Sha3_384Digest[48U];
5763
5764 typedef uint8_t libcrux_sha3_Sha3_256Digest[32U];
5765
5766 typedef uint8_t libcrux_sha3_Sha3_224Digest[28U];
5767
5768 #if defined(__cplusplus)
5769 }
5770 #endif
5771
5772 #define __libcrux_sha3_portable_H_DEFINED
5773 #endif
5774
5775 /* from libcrux/libcrux-ml-kem/cg/libcrux_mlkem768_portable.h */
5776 /*
5777 * SPDX-FileCopyrightText: 2024 Cryspen Sarl <info@cryspen.com>
5778 *
5779 * SPDX-License-Identifier: MIT or Apache-2.0
5780 *
5781 * This code was generated with the following revisions:
5782 * Charon: 6b5e110342a771a3e1c739b10294b1778e4be8b4
5783 * Eurydice: 31be7d65ca5d6acdacfb33652e478d24dd85c1cb
5784 * Karamel: 3205d3365ea2790b02368f79fcee38e38d0b5908
5785 * F*: a32b316e521fa4f239b610ec8f1d15e78d62cbe8-dirty
5786 * Libcrux: 4ad532b206174114dd4140b718e7794a28fc59ee
5787 */
5788
5789 #ifndef __libcrux_mlkem768_portable_H
5790 #define __libcrux_mlkem768_portable_H
5791
5792 #if defined(__cplusplus)
5793 extern "C" {
5794 #endif
5795
5796
5797 #define LIBCRUX_ML_KEM_HASH_FUNCTIONS_BLOCK_SIZE ((size_t)168U)
5798
5799 #define LIBCRUX_ML_KEM_HASH_FUNCTIONS_THREE_BLOCKS \
5800 (LIBCRUX_ML_KEM_HASH_FUNCTIONS_BLOCK_SIZE * (size_t)3U)
5801
libcrux_ml_kem_hash_functions_portable_G(Eurydice_slice input,uint8_t ret[64U])5802 static KRML_MUSTINLINE void libcrux_ml_kem_hash_functions_portable_G(
5803 Eurydice_slice input, uint8_t ret[64U]) {
5804 uint8_t digest[64U] = {0U};
5805 libcrux_sha3_portable_sha512(
5806 Eurydice_array_to_slice((size_t)64U, digest, uint8_t), input);
5807 memcpy(ret, digest, (size_t)64U * sizeof(uint8_t));
5808 }
5809
libcrux_ml_kem_hash_functions_portable_H(Eurydice_slice input,uint8_t ret[32U])5810 static KRML_MUSTINLINE void libcrux_ml_kem_hash_functions_portable_H(
5811 Eurydice_slice input, uint8_t ret[32U]) {
5812 uint8_t digest[32U] = {0U};
5813 libcrux_sha3_portable_sha256(
5814 Eurydice_array_to_slice((size_t)32U, digest, uint8_t), input);
5815 memcpy(ret, digest, (size_t)32U * sizeof(uint8_t));
5816 }
5817
5818 #define LIBCRUX_ML_KEM_IND_CCA_ENCAPS_SEED_SIZE \
5819 (LIBCRUX_ML_KEM_CONSTANTS_SHARED_SECRET_SIZE)
5820
5821 #define LIBCRUX_ML_KEM_IND_CCA_KEY_GENERATION_SEED_SIZE \
5822 (LIBCRUX_ML_KEM_CONSTANTS_CPA_PKE_KEY_GENERATION_SEED_SIZE + \
5823 LIBCRUX_ML_KEM_CONSTANTS_SHARED_SECRET_SIZE)
5824
5825 typedef uint8_t libcrux_ml_kem_ind_cca_MlKemSharedSecret[32U];
5826
5827 static const int16_t libcrux_ml_kem_polynomial_ZETAS_TIMES_MONTGOMERY_R[128U] =
5828 {(int16_t)-1044, (int16_t)-758, (int16_t)-359, (int16_t)-1517,
5829 (int16_t)1493, (int16_t)1422, (int16_t)287, (int16_t)202,
5830 (int16_t)-171, (int16_t)622, (int16_t)1577, (int16_t)182,
5831 (int16_t)962, (int16_t)-1202, (int16_t)-1474, (int16_t)1468,
5832 (int16_t)573, (int16_t)-1325, (int16_t)264, (int16_t)383,
5833 (int16_t)-829, (int16_t)1458, (int16_t)-1602, (int16_t)-130,
5834 (int16_t)-681, (int16_t)1017, (int16_t)732, (int16_t)608,
5835 (int16_t)-1542, (int16_t)411, (int16_t)-205, (int16_t)-1571,
5836 (int16_t)1223, (int16_t)652, (int16_t)-552, (int16_t)1015,
5837 (int16_t)-1293, (int16_t)1491, (int16_t)-282, (int16_t)-1544,
5838 (int16_t)516, (int16_t)-8, (int16_t)-320, (int16_t)-666,
5839 (int16_t)-1618, (int16_t)-1162, (int16_t)126, (int16_t)1469,
5840 (int16_t)-853, (int16_t)-90, (int16_t)-271, (int16_t)830,
5841 (int16_t)107, (int16_t)-1421, (int16_t)-247, (int16_t)-951,
5842 (int16_t)-398, (int16_t)961, (int16_t)-1508, (int16_t)-725,
5843 (int16_t)448, (int16_t)-1065, (int16_t)677, (int16_t)-1275,
5844 (int16_t)-1103, (int16_t)430, (int16_t)555, (int16_t)843,
5845 (int16_t)-1251, (int16_t)871, (int16_t)1550, (int16_t)105,
5846 (int16_t)422, (int16_t)587, (int16_t)177, (int16_t)-235,
5847 (int16_t)-291, (int16_t)-460, (int16_t)1574, (int16_t)1653,
5848 (int16_t)-246, (int16_t)778, (int16_t)1159, (int16_t)-147,
5849 (int16_t)-777, (int16_t)1483, (int16_t)-602, (int16_t)1119,
5850 (int16_t)-1590, (int16_t)644, (int16_t)-872, (int16_t)349,
5851 (int16_t)418, (int16_t)329, (int16_t)-156, (int16_t)-75,
5852 (int16_t)817, (int16_t)1097, (int16_t)603, (int16_t)610,
5853 (int16_t)1322, (int16_t)-1285, (int16_t)-1465, (int16_t)384,
5854 (int16_t)-1215, (int16_t)-136, (int16_t)1218, (int16_t)-1335,
5855 (int16_t)-874, (int16_t)220, (int16_t)-1187, (int16_t)-1659,
5856 (int16_t)-1185, (int16_t)-1530, (int16_t)-1278, (int16_t)794,
5857 (int16_t)-1510, (int16_t)-854, (int16_t)-870, (int16_t)478,
5858 (int16_t)-108, (int16_t)-308, (int16_t)996, (int16_t)991,
5859 (int16_t)958, (int16_t)-1460, (int16_t)1522, (int16_t)1628};
5860
5861 #define LIBCRUX_ML_KEM_VECTOR_TRAITS_FIELD_ELEMENTS_IN_VECTOR ((size_t)16U)
5862
5863 #define LIBCRUX_ML_KEM_POLYNOMIAL_VECTORS_IN_RING_ELEMENT \
5864 (LIBCRUX_ML_KEM_CONSTANTS_COEFFICIENTS_IN_RING_ELEMENT / \
5865 LIBCRUX_ML_KEM_VECTOR_TRAITS_FIELD_ELEMENTS_IN_VECTOR)
5866
5867 #define LIBCRUX_ML_KEM_VECTOR_TRAITS_FIELD_MODULUS ((int16_t)3329)
5868
5869 #define LIBCRUX_ML_KEM_VECTOR_TRAITS_MONTGOMERY_R_SQUARED_MOD_FIELD_MODULUS \
5870 ((int16_t)1353)
5871
5872 #define LIBCRUX_ML_KEM_VECTOR_TRAITS_INVERSE_OF_MODULUS_MOD_MONTGOMERY_R \
5873 (62209U)
5874
5875 typedef struct libcrux_ml_kem_vector_portable_vector_type_PortableVector_s {
5876 int16_t elements[16U];
5877 } libcrux_ml_kem_vector_portable_vector_type_PortableVector;
5878
5879 static KRML_MUSTINLINE libcrux_ml_kem_vector_portable_vector_type_PortableVector
libcrux_ml_kem_vector_portable_vector_type_from_i16_array(Eurydice_slice array)5880 libcrux_ml_kem_vector_portable_vector_type_from_i16_array(
5881 Eurydice_slice array) {
5882 libcrux_ml_kem_vector_portable_vector_type_PortableVector lit;
5883 int16_t ret[16U];
5884 Result_c0 dst;
5885 Eurydice_slice_to_array2(
5886 &dst, Eurydice_slice_subslice2(array, (size_t)0U, (size_t)16U, int16_t),
5887 Eurydice_slice, int16_t[16U]);
5888 unwrap_41_f9(dst, ret);
5889 memcpy(lit.elements, ret, (size_t)16U * sizeof(int16_t));
5890 return lit;
5891 }
5892
5893 /**
5894 This function found in impl {(libcrux_ml_kem::vector::traits::Operations for
5895 libcrux_ml_kem::vector::portable::vector_type::PortableVector)}
5896 */
5897 static inline libcrux_ml_kem_vector_portable_vector_type_PortableVector
libcrux_ml_kem_vector_portable_from_i16_array_0d(Eurydice_slice array)5898 libcrux_ml_kem_vector_portable_from_i16_array_0d(Eurydice_slice array) {
5899 return libcrux_ml_kem_vector_portable_vector_type_from_i16_array(array);
5900 }
5901
5902 typedef struct uint8_t_x11_s {
5903 uint8_t fst;
5904 uint8_t snd;
5905 uint8_t thd;
5906 uint8_t f3;
5907 uint8_t f4;
5908 uint8_t f5;
5909 uint8_t f6;
5910 uint8_t f7;
5911 uint8_t f8;
5912 uint8_t f9;
5913 uint8_t f10;
5914 } uint8_t_x11;
5915
5916 static KRML_MUSTINLINE uint8_t_x11
libcrux_ml_kem_vector_portable_serialize_serialize_11_int(Eurydice_slice v)5917 libcrux_ml_kem_vector_portable_serialize_serialize_11_int(Eurydice_slice v) {
5918 uint8_t r0 = (uint8_t)Eurydice_slice_index(v, (size_t)0U, int16_t, int16_t *);
5919 uint8_t r1 = (uint32_t)(uint8_t)(Eurydice_slice_index(v, (size_t)1U, int16_t,
5920 int16_t *) &
5921 (int16_t)31)
5922 << 3U |
5923 (uint32_t)(uint8_t)(Eurydice_slice_index(v, (size_t)0U, int16_t,
5924 int16_t *) >>
5925 8U);
5926 uint8_t r2 = (uint32_t)(uint8_t)(Eurydice_slice_index(v, (size_t)2U, int16_t,
5927 int16_t *) &
5928 (int16_t)3)
5929 << 6U |
5930 (uint32_t)(uint8_t)(Eurydice_slice_index(v, (size_t)1U, int16_t,
5931 int16_t *) >>
5932 5U);
5933 uint8_t r3 =
5934 (uint8_t)(Eurydice_slice_index(v, (size_t)2U, int16_t, int16_t *) >> 2U &
5935 (int16_t)255);
5936 uint8_t r4 = (uint32_t)(uint8_t)(Eurydice_slice_index(v, (size_t)3U, int16_t,
5937 int16_t *) &
5938 (int16_t)127)
5939 << 1U |
5940 (uint32_t)(uint8_t)(Eurydice_slice_index(v, (size_t)2U, int16_t,
5941 int16_t *) >>
5942 10U);
5943 uint8_t r5 = (uint32_t)(uint8_t)(Eurydice_slice_index(v, (size_t)4U, int16_t,
5944 int16_t *) &
5945 (int16_t)15)
5946 << 4U |
5947 (uint32_t)(uint8_t)(Eurydice_slice_index(v, (size_t)3U, int16_t,
5948 int16_t *) >>
5949 7U);
5950 uint8_t r6 = (uint32_t)(uint8_t)(Eurydice_slice_index(v, (size_t)5U, int16_t,
5951 int16_t *) &
5952 (int16_t)1)
5953 << 7U |
5954 (uint32_t)(uint8_t)(Eurydice_slice_index(v, (size_t)4U, int16_t,
5955 int16_t *) >>
5956 4U);
5957 uint8_t r7 =
5958 (uint8_t)(Eurydice_slice_index(v, (size_t)5U, int16_t, int16_t *) >> 1U &
5959 (int16_t)255);
5960 uint8_t r8 = (uint32_t)(uint8_t)(Eurydice_slice_index(v, (size_t)6U, int16_t,
5961 int16_t *) &
5962 (int16_t)63)
5963 << 2U |
5964 (uint32_t)(uint8_t)(Eurydice_slice_index(v, (size_t)5U, int16_t,
5965 int16_t *) >>
5966 9U);
5967 uint8_t r9 = (uint32_t)(uint8_t)(Eurydice_slice_index(v, (size_t)7U, int16_t,
5968 int16_t *) &
5969 (int16_t)7)
5970 << 5U |
5971 (uint32_t)(uint8_t)(Eurydice_slice_index(v, (size_t)6U, int16_t,
5972 int16_t *) >>
5973 6U);
5974 uint8_t r10 =
5975 (uint8_t)(Eurydice_slice_index(v, (size_t)7U, int16_t, int16_t *) >> 3U);
5976 return (CLITERAL(uint8_t_x11){.fst = r0,
5977 .snd = r1,
5978 .thd = r2,
5979 .f3 = r3,
5980 .f4 = r4,
5981 .f5 = r5,
5982 .f6 = r6,
5983 .f7 = r7,
5984 .f8 = r8,
5985 .f9 = r9,
5986 .f10 = r10});
5987 }
5988
5989 static KRML_MUSTINLINE void
libcrux_ml_kem_vector_portable_serialize_serialize_11(libcrux_ml_kem_vector_portable_vector_type_PortableVector v,uint8_t ret[22U])5990 libcrux_ml_kem_vector_portable_serialize_serialize_11(
5991 libcrux_ml_kem_vector_portable_vector_type_PortableVector v,
5992 uint8_t ret[22U]) {
5993 uint8_t_x11 r0_10 = libcrux_ml_kem_vector_portable_serialize_serialize_11_int(
5994 Eurydice_array_to_subslice2(v.elements, (size_t)0U, (size_t)8U, int16_t));
5995 uint8_t_x11 r11_21 =
5996 libcrux_ml_kem_vector_portable_serialize_serialize_11_int(
5997 Eurydice_array_to_subslice2(v.elements, (size_t)8U, (size_t)16U,
5998 int16_t));
5999 uint8_t result[22U] = {0U};
6000 result[0U] = r0_10.fst;
6001 result[1U] = r0_10.snd;
6002 result[2U] = r0_10.thd;
6003 result[3U] = r0_10.f3;
6004 result[4U] = r0_10.f4;
6005 result[5U] = r0_10.f5;
6006 result[6U] = r0_10.f6;
6007 result[7U] = r0_10.f7;
6008 result[8U] = r0_10.f8;
6009 result[9U] = r0_10.f9;
6010 result[10U] = r0_10.f10;
6011 result[11U] = r11_21.fst;
6012 result[12U] = r11_21.snd;
6013 result[13U] = r11_21.thd;
6014 result[14U] = r11_21.f3;
6015 result[15U] = r11_21.f4;
6016 result[16U] = r11_21.f5;
6017 result[17U] = r11_21.f6;
6018 result[18U] = r11_21.f7;
6019 result[19U] = r11_21.f8;
6020 result[20U] = r11_21.f9;
6021 result[21U] = r11_21.f10;
6022 memcpy(ret, result, (size_t)22U * sizeof(uint8_t));
6023 }
6024
6025 /**
6026 This function found in impl {(libcrux_ml_kem::vector::traits::Operations for
6027 libcrux_ml_kem::vector::portable::vector_type::PortableVector)}
6028 */
libcrux_ml_kem_vector_portable_serialize_11_0d(libcrux_ml_kem_vector_portable_vector_type_PortableVector a,uint8_t ret[22U])6029 static inline void libcrux_ml_kem_vector_portable_serialize_11_0d(
6030 libcrux_ml_kem_vector_portable_vector_type_PortableVector a,
6031 uint8_t ret[22U]) {
6032 libcrux_ml_kem_vector_portable_serialize_serialize_11(a, ret);
6033 }
6034
6035 typedef struct int16_t_x8_s {
6036 int16_t fst;
6037 int16_t snd;
6038 int16_t thd;
6039 int16_t f3;
6040 int16_t f4;
6041 int16_t f5;
6042 int16_t f6;
6043 int16_t f7;
6044 } int16_t_x8;
6045
6046 static KRML_MUSTINLINE int16_t_x8
libcrux_ml_kem_vector_portable_serialize_deserialize_11_int(Eurydice_slice bytes)6047 libcrux_ml_kem_vector_portable_serialize_deserialize_11_int(
6048 Eurydice_slice bytes) {
6049 int16_t r0 =
6050 ((int16_t)Eurydice_slice_index(bytes, (size_t)1U, uint8_t, uint8_t *) &
6051 (int16_t)7)
6052 << 8U |
6053 (int16_t)Eurydice_slice_index(bytes, (size_t)0U, uint8_t, uint8_t *);
6054 int16_t r1 =
6055 ((int16_t)Eurydice_slice_index(bytes, (size_t)2U, uint8_t, uint8_t *) &
6056 (int16_t)63)
6057 << 5U |
6058 (int16_t)Eurydice_slice_index(bytes, (size_t)1U, uint8_t, uint8_t *) >>
6059 3U;
6060 int16_t r2 =
6061 (((int16_t)Eurydice_slice_index(bytes, (size_t)4U, uint8_t, uint8_t *) &
6062 (int16_t)1)
6063 << 10U |
6064 (int16_t)Eurydice_slice_index(bytes, (size_t)3U, uint8_t, uint8_t *)
6065 << 2U) |
6066 (int16_t)Eurydice_slice_index(bytes, (size_t)2U, uint8_t, uint8_t *) >>
6067 6U;
6068 int16_t r3 =
6069 ((int16_t)Eurydice_slice_index(bytes, (size_t)5U, uint8_t, uint8_t *) &
6070 (int16_t)15)
6071 << 7U |
6072 (int16_t)Eurydice_slice_index(bytes, (size_t)4U, uint8_t, uint8_t *) >>
6073 1U;
6074 int16_t r4 =
6075 ((int16_t)Eurydice_slice_index(bytes, (size_t)6U, uint8_t, uint8_t *) &
6076 (int16_t)127)
6077 << 4U |
6078 (int16_t)Eurydice_slice_index(bytes, (size_t)5U, uint8_t, uint8_t *) >>
6079 4U;
6080 int16_t r5 =
6081 (((int16_t)Eurydice_slice_index(bytes, (size_t)8U, uint8_t, uint8_t *) &
6082 (int16_t)3)
6083 << 9U |
6084 (int16_t)Eurydice_slice_index(bytes, (size_t)7U, uint8_t, uint8_t *)
6085 << 1U) |
6086 (int16_t)Eurydice_slice_index(bytes, (size_t)6U, uint8_t, uint8_t *) >>
6087 7U;
6088 int16_t r6 =
6089 ((int16_t)Eurydice_slice_index(bytes, (size_t)9U, uint8_t, uint8_t *) &
6090 (int16_t)31)
6091 << 6U |
6092 (int16_t)Eurydice_slice_index(bytes, (size_t)8U, uint8_t, uint8_t *) >>
6093 2U;
6094 int16_t r7 =
6095 (int16_t)Eurydice_slice_index(bytes, (size_t)10U, uint8_t, uint8_t *)
6096 << 3U |
6097 (int16_t)Eurydice_slice_index(bytes, (size_t)9U, uint8_t, uint8_t *) >>
6098 5U;
6099 return (CLITERAL(int16_t_x8){.fst = r0,
6100 .snd = r1,
6101 .thd = r2,
6102 .f3 = r3,
6103 .f4 = r4,
6104 .f5 = r5,
6105 .f6 = r6,
6106 .f7 = r7});
6107 }
6108
6109 static KRML_MUSTINLINE libcrux_ml_kem_vector_portable_vector_type_PortableVector
libcrux_ml_kem_vector_portable_vector_type_zero(void)6110 libcrux_ml_kem_vector_portable_vector_type_zero(void) {
6111 libcrux_ml_kem_vector_portable_vector_type_PortableVector lit;
6112 lit.elements[0U] = (int16_t)0;
6113 lit.elements[1U] = (int16_t)0;
6114 lit.elements[2U] = (int16_t)0;
6115 lit.elements[3U] = (int16_t)0;
6116 lit.elements[4U] = (int16_t)0;
6117 lit.elements[5U] = (int16_t)0;
6118 lit.elements[6U] = (int16_t)0;
6119 lit.elements[7U] = (int16_t)0;
6120 lit.elements[8U] = (int16_t)0;
6121 lit.elements[9U] = (int16_t)0;
6122 lit.elements[10U] = (int16_t)0;
6123 lit.elements[11U] = (int16_t)0;
6124 lit.elements[12U] = (int16_t)0;
6125 lit.elements[13U] = (int16_t)0;
6126 lit.elements[14U] = (int16_t)0;
6127 lit.elements[15U] = (int16_t)0;
6128 return lit;
6129 }
6130
6131 static KRML_MUSTINLINE libcrux_ml_kem_vector_portable_vector_type_PortableVector
libcrux_ml_kem_vector_portable_serialize_deserialize_11(Eurydice_slice bytes)6132 libcrux_ml_kem_vector_portable_serialize_deserialize_11(Eurydice_slice bytes) {
6133 int16_t_x8 v0_7 = libcrux_ml_kem_vector_portable_serialize_deserialize_11_int(
6134 Eurydice_slice_subslice2(bytes, (size_t)0U, (size_t)11U, uint8_t));
6135 int16_t_x8 v8_15 =
6136 libcrux_ml_kem_vector_portable_serialize_deserialize_11_int(
6137 Eurydice_slice_subslice2(bytes, (size_t)11U, (size_t)22U, uint8_t));
6138 libcrux_ml_kem_vector_portable_vector_type_PortableVector v =
6139 libcrux_ml_kem_vector_portable_vector_type_zero();
6140 v.elements[0U] = v0_7.fst;
6141 v.elements[1U] = v0_7.snd;
6142 v.elements[2U] = v0_7.thd;
6143 v.elements[3U] = v0_7.f3;
6144 v.elements[4U] = v0_7.f4;
6145 v.elements[5U] = v0_7.f5;
6146 v.elements[6U] = v0_7.f6;
6147 v.elements[7U] = v0_7.f7;
6148 v.elements[8U] = v8_15.fst;
6149 v.elements[9U] = v8_15.snd;
6150 v.elements[10U] = v8_15.thd;
6151 v.elements[11U] = v8_15.f3;
6152 v.elements[12U] = v8_15.f4;
6153 v.elements[13U] = v8_15.f5;
6154 v.elements[14U] = v8_15.f6;
6155 v.elements[15U] = v8_15.f7;
6156 return v;
6157 }
6158
6159 /**
6160 This function found in impl {(libcrux_ml_kem::vector::traits::Operations for
6161 libcrux_ml_kem::vector::portable::vector_type::PortableVector)}
6162 */
6163 static inline libcrux_ml_kem_vector_portable_vector_type_PortableVector
libcrux_ml_kem_vector_portable_deserialize_11_0d(Eurydice_slice a)6164 libcrux_ml_kem_vector_portable_deserialize_11_0d(Eurydice_slice a) {
6165 return libcrux_ml_kem_vector_portable_serialize_deserialize_11(a);
6166 }
6167
6168 static KRML_MUSTINLINE void
libcrux_ml_kem_vector_portable_vector_type_to_i16_array(libcrux_ml_kem_vector_portable_vector_type_PortableVector x,int16_t ret[16U])6169 libcrux_ml_kem_vector_portable_vector_type_to_i16_array(
6170 libcrux_ml_kem_vector_portable_vector_type_PortableVector x,
6171 int16_t ret[16U]) {
6172 memcpy(ret, x.elements, (size_t)16U * sizeof(int16_t));
6173 }
6174
6175 /**
6176 This function found in impl {(libcrux_ml_kem::vector::traits::Operations for
6177 libcrux_ml_kem::vector::portable::vector_type::PortableVector)}
6178 */
libcrux_ml_kem_vector_portable_to_i16_array_0d(libcrux_ml_kem_vector_portable_vector_type_PortableVector x,int16_t ret[16U])6179 static inline void libcrux_ml_kem_vector_portable_to_i16_array_0d(
6180 libcrux_ml_kem_vector_portable_vector_type_PortableVector x,
6181 int16_t ret[16U]) {
6182 libcrux_ml_kem_vector_portable_vector_type_to_i16_array(x, ret);
6183 }
6184
6185 static const uint8_t
6186 libcrux_ml_kem_vector_rej_sample_table_REJECTION_SAMPLE_SHUFFLE_TABLE
6187 [256U][16U] = {{255U, 255U, 255U, 255U, 255U, 255U, 255U, 255U, 255U,
6188 255U, 255U, 255U, 255U, 255U, 255U, 255U},
6189 {0U, 1U, 255U, 255U, 255U, 255U, 255U, 255U, 255U, 255U,
6190 255U, 255U, 255U, 255U, 255U, 255U},
6191 {2U, 3U, 255U, 255U, 255U, 255U, 255U, 255U, 255U, 255U,
6192 255U, 255U, 255U, 255U, 255U, 255U},
6193 {0U, 1U, 2U, 3U, 255U, 255U, 255U, 255U, 255U, 255U,
6194 255U, 255U, 255U, 255U, 255U, 255U},
6195 {4U, 5U, 255U, 255U, 255U, 255U, 255U, 255U, 255U, 255U,
6196 255U, 255U, 255U, 255U, 255U, 255U},
6197 {0U, 1U, 4U, 5U, 255U, 255U, 255U, 255U, 255U, 255U,
6198 255U, 255U, 255U, 255U, 255U, 255U},
6199 {2U, 3U, 4U, 5U, 255U, 255U, 255U, 255U, 255U, 255U,
6200 255U, 255U, 255U, 255U, 255U, 255U},
6201 {0U, 1U, 2U, 3U, 4U, 5U, 255U, 255U, 255U, 255U, 255U,
6202 255U, 255U, 255U, 255U, 255U},
6203 {6U, 7U, 255U, 255U, 255U, 255U, 255U, 255U, 255U, 255U,
6204 255U, 255U, 255U, 255U, 255U, 255U},
6205 {0U, 1U, 6U, 7U, 255U, 255U, 255U, 255U, 255U, 255U,
6206 255U, 255U, 255U, 255U, 255U, 255U},
6207 {2U, 3U, 6U, 7U, 255U, 255U, 255U, 255U, 255U, 255U,
6208 255U, 255U, 255U, 255U, 255U, 255U},
6209 {0U, 1U, 2U, 3U, 6U, 7U, 255U, 255U, 255U, 255U, 255U,
6210 255U, 255U, 255U, 255U, 255U},
6211 {4U, 5U, 6U, 7U, 255U, 255U, 255U, 255U, 255U, 255U,
6212 255U, 255U, 255U, 255U, 255U, 255U},
6213 {0U, 1U, 4U, 5U, 6U, 7U, 255U, 255U, 255U, 255U, 255U,
6214 255U, 255U, 255U, 255U, 255U},
6215 {2U, 3U, 4U, 5U, 6U, 7U, 255U, 255U, 255U, 255U, 255U,
6216 255U, 255U, 255U, 255U, 255U},
6217 {0U, 1U, 2U, 3U, 4U, 5U, 6U, 7U, 255U, 255U, 255U, 255U,
6218 255U, 255U, 255U, 255U},
6219 {8U, 9U, 255U, 255U, 255U, 255U, 255U, 255U, 255U, 255U,
6220 255U, 255U, 255U, 255U, 255U, 255U},
6221 {0U, 1U, 8U, 9U, 255U, 255U, 255U, 255U, 255U, 255U,
6222 255U, 255U, 255U, 255U, 255U, 255U},
6223 {2U, 3U, 8U, 9U, 255U, 255U, 255U, 255U, 255U, 255U,
6224 255U, 255U, 255U, 255U, 255U, 255U},
6225 {0U, 1U, 2U, 3U, 8U, 9U, 255U, 255U, 255U, 255U, 255U,
6226 255U, 255U, 255U, 255U, 255U},
6227 {4U, 5U, 8U, 9U, 255U, 255U, 255U, 255U, 255U, 255U,
6228 255U, 255U, 255U, 255U, 255U, 255U},
6229 {0U, 1U, 4U, 5U, 8U, 9U, 255U, 255U, 255U, 255U, 255U,
6230 255U, 255U, 255U, 255U, 255U},
6231 {2U, 3U, 4U, 5U, 8U, 9U, 255U, 255U, 255U, 255U, 255U,
6232 255U, 255U, 255U, 255U, 255U},
6233 {0U, 1U, 2U, 3U, 4U, 5U, 8U, 9U, 255U, 255U, 255U, 255U,
6234 255U, 255U, 255U, 255U},
6235 {6U, 7U, 8U, 9U, 255U, 255U, 255U, 255U, 255U, 255U,
6236 255U, 255U, 255U, 255U, 255U, 255U},
6237 {0U, 1U, 6U, 7U, 8U, 9U, 255U, 255U, 255U, 255U, 255U,
6238 255U, 255U, 255U, 255U, 255U},
6239 {2U, 3U, 6U, 7U, 8U, 9U, 255U, 255U, 255U, 255U, 255U,
6240 255U, 255U, 255U, 255U, 255U},
6241 {0U, 1U, 2U, 3U, 6U, 7U, 8U, 9U, 255U, 255U, 255U, 255U,
6242 255U, 255U, 255U, 255U},
6243 {4U, 5U, 6U, 7U, 8U, 9U, 255U, 255U, 255U, 255U, 255U,
6244 255U, 255U, 255U, 255U, 255U},
6245 {0U, 1U, 4U, 5U, 6U, 7U, 8U, 9U, 255U, 255U, 255U, 255U,
6246 255U, 255U, 255U, 255U},
6247 {2U, 3U, 4U, 5U, 6U, 7U, 8U, 9U, 255U, 255U, 255U, 255U,
6248 255U, 255U, 255U, 255U},
6249 {0U, 1U, 2U, 3U, 4U, 5U, 6U, 7U, 8U, 9U, 255U, 255U,
6250 255U, 255U, 255U, 255U},
6251 {10U, 11U, 255U, 255U, 255U, 255U, 255U, 255U, 255U,
6252 255U, 255U, 255U, 255U, 255U, 255U, 255U},
6253 {0U, 1U, 10U, 11U, 255U, 255U, 255U, 255U, 255U, 255U,
6254 255U, 255U, 255U, 255U, 255U, 255U},
6255 {2U, 3U, 10U, 11U, 255U, 255U, 255U, 255U, 255U, 255U,
6256 255U, 255U, 255U, 255U, 255U, 255U},
6257 {0U, 1U, 2U, 3U, 10U, 11U, 255U, 255U, 255U, 255U, 255U,
6258 255U, 255U, 255U, 255U, 255U},
6259 {4U, 5U, 10U, 11U, 255U, 255U, 255U, 255U, 255U, 255U,
6260 255U, 255U, 255U, 255U, 255U, 255U},
6261 {0U, 1U, 4U, 5U, 10U, 11U, 255U, 255U, 255U, 255U, 255U,
6262 255U, 255U, 255U, 255U, 255U},
6263 {2U, 3U, 4U, 5U, 10U, 11U, 255U, 255U, 255U, 255U, 255U,
6264 255U, 255U, 255U, 255U, 255U},
6265 {0U, 1U, 2U, 3U, 4U, 5U, 10U, 11U, 255U, 255U, 255U,
6266 255U, 255U, 255U, 255U, 255U},
6267 {6U, 7U, 10U, 11U, 255U, 255U, 255U, 255U, 255U, 255U,
6268 255U, 255U, 255U, 255U, 255U, 255U},
6269 {0U, 1U, 6U, 7U, 10U, 11U, 255U, 255U, 255U, 255U, 255U,
6270 255U, 255U, 255U, 255U, 255U},
6271 {2U, 3U, 6U, 7U, 10U, 11U, 255U, 255U, 255U, 255U, 255U,
6272 255U, 255U, 255U, 255U, 255U},
6273 {0U, 1U, 2U, 3U, 6U, 7U, 10U, 11U, 255U, 255U, 255U,
6274 255U, 255U, 255U, 255U, 255U},
6275 {4U, 5U, 6U, 7U, 10U, 11U, 255U, 255U, 255U, 255U, 255U,
6276 255U, 255U, 255U, 255U, 255U},
6277 {0U, 1U, 4U, 5U, 6U, 7U, 10U, 11U, 255U, 255U, 255U,
6278 255U, 255U, 255U, 255U, 255U},
6279 {2U, 3U, 4U, 5U, 6U, 7U, 10U, 11U, 255U, 255U, 255U,
6280 255U, 255U, 255U, 255U, 255U},
6281 {0U, 1U, 2U, 3U, 4U, 5U, 6U, 7U, 10U, 11U, 255U, 255U,
6282 255U, 255U, 255U, 255U},
6283 {8U, 9U, 10U, 11U, 255U, 255U, 255U, 255U, 255U, 255U,
6284 255U, 255U, 255U, 255U, 255U, 255U},
6285 {0U, 1U, 8U, 9U, 10U, 11U, 255U, 255U, 255U, 255U, 255U,
6286 255U, 255U, 255U, 255U, 255U},
6287 {2U, 3U, 8U, 9U, 10U, 11U, 255U, 255U, 255U, 255U, 255U,
6288 255U, 255U, 255U, 255U, 255U},
6289 {0U, 1U, 2U, 3U, 8U, 9U, 10U, 11U, 255U, 255U, 255U,
6290 255U, 255U, 255U, 255U, 255U},
6291 {4U, 5U, 8U, 9U, 10U, 11U, 255U, 255U, 255U, 255U, 255U,
6292 255U, 255U, 255U, 255U, 255U},
6293 {0U, 1U, 4U, 5U, 8U, 9U, 10U, 11U, 255U, 255U, 255U,
6294 255U, 255U, 255U, 255U, 255U},
6295 {2U, 3U, 4U, 5U, 8U, 9U, 10U, 11U, 255U, 255U, 255U,
6296 255U, 255U, 255U, 255U, 255U},
6297 {0U, 1U, 2U, 3U, 4U, 5U, 8U, 9U, 10U, 11U, 255U, 255U,
6298 255U, 255U, 255U, 255U},
6299 {6U, 7U, 8U, 9U, 10U, 11U, 255U, 255U, 255U, 255U, 255U,
6300 255U, 255U, 255U, 255U, 255U},
6301 {0U, 1U, 6U, 7U, 8U, 9U, 10U, 11U, 255U, 255U, 255U,
6302 255U, 255U, 255U, 255U, 255U},
6303 {2U, 3U, 6U, 7U, 8U, 9U, 10U, 11U, 255U, 255U, 255U,
6304 255U, 255U, 255U, 255U, 255U},
6305 {0U, 1U, 2U, 3U, 6U, 7U, 8U, 9U, 10U, 11U, 255U, 255U,
6306 255U, 255U, 255U, 255U},
6307 {4U, 5U, 6U, 7U, 8U, 9U, 10U, 11U, 255U, 255U, 255U,
6308 255U, 255U, 255U, 255U, 255U},
6309 {0U, 1U, 4U, 5U, 6U, 7U, 8U, 9U, 10U, 11U, 255U, 255U,
6310 255U, 255U, 255U, 255U},
6311 {2U, 3U, 4U, 5U, 6U, 7U, 8U, 9U, 10U, 11U, 255U, 255U,
6312 255U, 255U, 255U, 255U},
6313 {0U, 1U, 2U, 3U, 4U, 5U, 6U, 7U, 8U, 9U, 10U, 11U, 255U,
6314 255U, 255U, 255U},
6315 {12U, 13U, 255U, 255U, 255U, 255U, 255U, 255U, 255U,
6316 255U, 255U, 255U, 255U, 255U, 255U, 255U},
6317 {0U, 1U, 12U, 13U, 255U, 255U, 255U, 255U, 255U, 255U,
6318 255U, 255U, 255U, 255U, 255U, 255U},
6319 {2U, 3U, 12U, 13U, 255U, 255U, 255U, 255U, 255U, 255U,
6320 255U, 255U, 255U, 255U, 255U, 255U},
6321 {0U, 1U, 2U, 3U, 12U, 13U, 255U, 255U, 255U, 255U, 255U,
6322 255U, 255U, 255U, 255U, 255U},
6323 {4U, 5U, 12U, 13U, 255U, 255U, 255U, 255U, 255U, 255U,
6324 255U, 255U, 255U, 255U, 255U, 255U},
6325 {0U, 1U, 4U, 5U, 12U, 13U, 255U, 255U, 255U, 255U, 255U,
6326 255U, 255U, 255U, 255U, 255U},
6327 {2U, 3U, 4U, 5U, 12U, 13U, 255U, 255U, 255U, 255U, 255U,
6328 255U, 255U, 255U, 255U, 255U},
6329 {0U, 1U, 2U, 3U, 4U, 5U, 12U, 13U, 255U, 255U, 255U,
6330 255U, 255U, 255U, 255U, 255U},
6331 {6U, 7U, 12U, 13U, 255U, 255U, 255U, 255U, 255U, 255U,
6332 255U, 255U, 255U, 255U, 255U, 255U},
6333 {0U, 1U, 6U, 7U, 12U, 13U, 255U, 255U, 255U, 255U, 255U,
6334 255U, 255U, 255U, 255U, 255U},
6335 {2U, 3U, 6U, 7U, 12U, 13U, 255U, 255U, 255U, 255U, 255U,
6336 255U, 255U, 255U, 255U, 255U},
6337 {0U, 1U, 2U, 3U, 6U, 7U, 12U, 13U, 255U, 255U, 255U,
6338 255U, 255U, 255U, 255U, 255U},
6339 {4U, 5U, 6U, 7U, 12U, 13U, 255U, 255U, 255U, 255U, 255U,
6340 255U, 255U, 255U, 255U, 255U},
6341 {0U, 1U, 4U, 5U, 6U, 7U, 12U, 13U, 255U, 255U, 255U,
6342 255U, 255U, 255U, 255U, 255U},
6343 {2U, 3U, 4U, 5U, 6U, 7U, 12U, 13U, 255U, 255U, 255U,
6344 255U, 255U, 255U, 255U, 255U},
6345 {0U, 1U, 2U, 3U, 4U, 5U, 6U, 7U, 12U, 13U, 255U, 255U,
6346 255U, 255U, 255U, 255U},
6347 {8U, 9U, 12U, 13U, 255U, 255U, 255U, 255U, 255U, 255U,
6348 255U, 255U, 255U, 255U, 255U, 255U},
6349 {0U, 1U, 8U, 9U, 12U, 13U, 255U, 255U, 255U, 255U, 255U,
6350 255U, 255U, 255U, 255U, 255U},
6351 {2U, 3U, 8U, 9U, 12U, 13U, 255U, 255U, 255U, 255U, 255U,
6352 255U, 255U, 255U, 255U, 255U},
6353 {0U, 1U, 2U, 3U, 8U, 9U, 12U, 13U, 255U, 255U, 255U,
6354 255U, 255U, 255U, 255U, 255U},
6355 {4U, 5U, 8U, 9U, 12U, 13U, 255U, 255U, 255U, 255U, 255U,
6356 255U, 255U, 255U, 255U, 255U},
6357 {0U, 1U, 4U, 5U, 8U, 9U, 12U, 13U, 255U, 255U, 255U,
6358 255U, 255U, 255U, 255U, 255U},
6359 {2U, 3U, 4U, 5U, 8U, 9U, 12U, 13U, 255U, 255U, 255U,
6360 255U, 255U, 255U, 255U, 255U},
6361 {0U, 1U, 2U, 3U, 4U, 5U, 8U, 9U, 12U, 13U, 255U, 255U,
6362 255U, 255U, 255U, 255U},
6363 {6U, 7U, 8U, 9U, 12U, 13U, 255U, 255U, 255U, 255U, 255U,
6364 255U, 255U, 255U, 255U, 255U},
6365 {0U, 1U, 6U, 7U, 8U, 9U, 12U, 13U, 255U, 255U, 255U,
6366 255U, 255U, 255U, 255U, 255U},
6367 {2U, 3U, 6U, 7U, 8U, 9U, 12U, 13U, 255U, 255U, 255U,
6368 255U, 255U, 255U, 255U, 255U},
6369 {0U, 1U, 2U, 3U, 6U, 7U, 8U, 9U, 12U, 13U, 255U, 255U,
6370 255U, 255U, 255U, 255U},
6371 {4U, 5U, 6U, 7U, 8U, 9U, 12U, 13U, 255U, 255U, 255U,
6372 255U, 255U, 255U, 255U, 255U},
6373 {0U, 1U, 4U, 5U, 6U, 7U, 8U, 9U, 12U, 13U, 255U, 255U,
6374 255U, 255U, 255U, 255U},
6375 {2U, 3U, 4U, 5U, 6U, 7U, 8U, 9U, 12U, 13U, 255U, 255U,
6376 255U, 255U, 255U, 255U},
6377 {0U, 1U, 2U, 3U, 4U, 5U, 6U, 7U, 8U, 9U, 12U, 13U, 255U,
6378 255U, 255U, 255U},
6379 {10U, 11U, 12U, 13U, 255U, 255U, 255U, 255U, 255U, 255U,
6380 255U, 255U, 255U, 255U, 255U, 255U},
6381 {0U, 1U, 10U, 11U, 12U, 13U, 255U, 255U, 255U, 255U,
6382 255U, 255U, 255U, 255U, 255U, 255U},
6383 {2U, 3U, 10U, 11U, 12U, 13U, 255U, 255U, 255U, 255U,
6384 255U, 255U, 255U, 255U, 255U, 255U},
6385 {0U, 1U, 2U, 3U, 10U, 11U, 12U, 13U, 255U, 255U, 255U,
6386 255U, 255U, 255U, 255U, 255U},
6387 {4U, 5U, 10U, 11U, 12U, 13U, 255U, 255U, 255U, 255U,
6388 255U, 255U, 255U, 255U, 255U, 255U},
6389 {0U, 1U, 4U, 5U, 10U, 11U, 12U, 13U, 255U, 255U, 255U,
6390 255U, 255U, 255U, 255U, 255U},
6391 {2U, 3U, 4U, 5U, 10U, 11U, 12U, 13U, 255U, 255U, 255U,
6392 255U, 255U, 255U, 255U, 255U},
6393 {0U, 1U, 2U, 3U, 4U, 5U, 10U, 11U, 12U, 13U, 255U, 255U,
6394 255U, 255U, 255U, 255U},
6395 {6U, 7U, 10U, 11U, 12U, 13U, 255U, 255U, 255U, 255U,
6396 255U, 255U, 255U, 255U, 255U, 255U},
6397 {0U, 1U, 6U, 7U, 10U, 11U, 12U, 13U, 255U, 255U, 255U,
6398 255U, 255U, 255U, 255U, 255U},
6399 {2U, 3U, 6U, 7U, 10U, 11U, 12U, 13U, 255U, 255U, 255U,
6400 255U, 255U, 255U, 255U, 255U},
6401 {0U, 1U, 2U, 3U, 6U, 7U, 10U, 11U, 12U, 13U, 255U, 255U,
6402 255U, 255U, 255U, 255U},
6403 {4U, 5U, 6U, 7U, 10U, 11U, 12U, 13U, 255U, 255U, 255U,
6404 255U, 255U, 255U, 255U, 255U},
6405 {0U, 1U, 4U, 5U, 6U, 7U, 10U, 11U, 12U, 13U, 255U, 255U,
6406 255U, 255U, 255U, 255U},
6407 {2U, 3U, 4U, 5U, 6U, 7U, 10U, 11U, 12U, 13U, 255U, 255U,
6408 255U, 255U, 255U, 255U},
6409 {0U, 1U, 2U, 3U, 4U, 5U, 6U, 7U, 10U, 11U, 12U, 13U,
6410 255U, 255U, 255U, 255U},
6411 {8U, 9U, 10U, 11U, 12U, 13U, 255U, 255U, 255U, 255U,
6412 255U, 255U, 255U, 255U, 255U, 255U},
6413 {0U, 1U, 8U, 9U, 10U, 11U, 12U, 13U, 255U, 255U, 255U,
6414 255U, 255U, 255U, 255U, 255U},
6415 {2U, 3U, 8U, 9U, 10U, 11U, 12U, 13U, 255U, 255U, 255U,
6416 255U, 255U, 255U, 255U, 255U},
6417 {0U, 1U, 2U, 3U, 8U, 9U, 10U, 11U, 12U, 13U, 255U, 255U,
6418 255U, 255U, 255U, 255U},
6419 {4U, 5U, 8U, 9U, 10U, 11U, 12U, 13U, 255U, 255U, 255U,
6420 255U, 255U, 255U, 255U, 255U},
6421 {0U, 1U, 4U, 5U, 8U, 9U, 10U, 11U, 12U, 13U, 255U, 255U,
6422 255U, 255U, 255U, 255U},
6423 {2U, 3U, 4U, 5U, 8U, 9U, 10U, 11U, 12U, 13U, 255U, 255U,
6424 255U, 255U, 255U, 255U},
6425 {0U, 1U, 2U, 3U, 4U, 5U, 8U, 9U, 10U, 11U, 12U, 13U,
6426 255U, 255U, 255U, 255U},
6427 {6U, 7U, 8U, 9U, 10U, 11U, 12U, 13U, 255U, 255U, 255U,
6428 255U, 255U, 255U, 255U, 255U},
6429 {0U, 1U, 6U, 7U, 8U, 9U, 10U, 11U, 12U, 13U, 255U, 255U,
6430 255U, 255U, 255U, 255U},
6431 {2U, 3U, 6U, 7U, 8U, 9U, 10U, 11U, 12U, 13U, 255U, 255U,
6432 255U, 255U, 255U, 255U},
6433 {0U, 1U, 2U, 3U, 6U, 7U, 8U, 9U, 10U, 11U, 12U, 13U,
6434 255U, 255U, 255U, 255U},
6435 {4U, 5U, 6U, 7U, 8U, 9U, 10U, 11U, 12U, 13U, 255U, 255U,
6436 255U, 255U, 255U, 255U},
6437 {0U, 1U, 4U, 5U, 6U, 7U, 8U, 9U, 10U, 11U, 12U, 13U,
6438 255U, 255U, 255U, 255U},
6439 {2U, 3U, 4U, 5U, 6U, 7U, 8U, 9U, 10U, 11U, 12U, 13U,
6440 255U, 255U, 255U, 255U},
6441 {0U, 1U, 2U, 3U, 4U, 5U, 6U, 7U, 8U, 9U, 10U, 11U, 12U,
6442 13U, 255U, 255U},
6443 {14U, 15U, 255U, 255U, 255U, 255U, 255U, 255U, 255U,
6444 255U, 255U, 255U, 255U, 255U, 255U, 255U},
6445 {0U, 1U, 14U, 15U, 255U, 255U, 255U, 255U, 255U, 255U,
6446 255U, 255U, 255U, 255U, 255U, 255U},
6447 {2U, 3U, 14U, 15U, 255U, 255U, 255U, 255U, 255U, 255U,
6448 255U, 255U, 255U, 255U, 255U, 255U},
6449 {0U, 1U, 2U, 3U, 14U, 15U, 255U, 255U, 255U, 255U, 255U,
6450 255U, 255U, 255U, 255U, 255U},
6451 {4U, 5U, 14U, 15U, 255U, 255U, 255U, 255U, 255U, 255U,
6452 255U, 255U, 255U, 255U, 255U, 255U},
6453 {0U, 1U, 4U, 5U, 14U, 15U, 255U, 255U, 255U, 255U, 255U,
6454 255U, 255U, 255U, 255U, 255U},
6455 {2U, 3U, 4U, 5U, 14U, 15U, 255U, 255U, 255U, 255U, 255U,
6456 255U, 255U, 255U, 255U, 255U},
6457 {0U, 1U, 2U, 3U, 4U, 5U, 14U, 15U, 255U, 255U, 255U,
6458 255U, 255U, 255U, 255U, 255U},
6459 {6U, 7U, 14U, 15U, 255U, 255U, 255U, 255U, 255U, 255U,
6460 255U, 255U, 255U, 255U, 255U, 255U},
6461 {0U, 1U, 6U, 7U, 14U, 15U, 255U, 255U, 255U, 255U, 255U,
6462 255U, 255U, 255U, 255U, 255U},
6463 {2U, 3U, 6U, 7U, 14U, 15U, 255U, 255U, 255U, 255U, 255U,
6464 255U, 255U, 255U, 255U, 255U},
6465 {0U, 1U, 2U, 3U, 6U, 7U, 14U, 15U, 255U, 255U, 255U,
6466 255U, 255U, 255U, 255U, 255U},
6467 {4U, 5U, 6U, 7U, 14U, 15U, 255U, 255U, 255U, 255U, 255U,
6468 255U, 255U, 255U, 255U, 255U},
6469 {0U, 1U, 4U, 5U, 6U, 7U, 14U, 15U, 255U, 255U, 255U,
6470 255U, 255U, 255U, 255U, 255U},
6471 {2U, 3U, 4U, 5U, 6U, 7U, 14U, 15U, 255U, 255U, 255U,
6472 255U, 255U, 255U, 255U, 255U},
6473 {0U, 1U, 2U, 3U, 4U, 5U, 6U, 7U, 14U, 15U, 255U, 255U,
6474 255U, 255U, 255U, 255U},
6475 {8U, 9U, 14U, 15U, 255U, 255U, 255U, 255U, 255U, 255U,
6476 255U, 255U, 255U, 255U, 255U, 255U},
6477 {0U, 1U, 8U, 9U, 14U, 15U, 255U, 255U, 255U, 255U, 255U,
6478 255U, 255U, 255U, 255U, 255U},
6479 {2U, 3U, 8U, 9U, 14U, 15U, 255U, 255U, 255U, 255U, 255U,
6480 255U, 255U, 255U, 255U, 255U},
6481 {0U, 1U, 2U, 3U, 8U, 9U, 14U, 15U, 255U, 255U, 255U,
6482 255U, 255U, 255U, 255U, 255U},
6483 {4U, 5U, 8U, 9U, 14U, 15U, 255U, 255U, 255U, 255U, 255U,
6484 255U, 255U, 255U, 255U, 255U},
6485 {0U, 1U, 4U, 5U, 8U, 9U, 14U, 15U, 255U, 255U, 255U,
6486 255U, 255U, 255U, 255U, 255U},
6487 {2U, 3U, 4U, 5U, 8U, 9U, 14U, 15U, 255U, 255U, 255U,
6488 255U, 255U, 255U, 255U, 255U},
6489 {0U, 1U, 2U, 3U, 4U, 5U, 8U, 9U, 14U, 15U, 255U, 255U,
6490 255U, 255U, 255U, 255U},
6491 {6U, 7U, 8U, 9U, 14U, 15U, 255U, 255U, 255U, 255U, 255U,
6492 255U, 255U, 255U, 255U, 255U},
6493 {0U, 1U, 6U, 7U, 8U, 9U, 14U, 15U, 255U, 255U, 255U,
6494 255U, 255U, 255U, 255U, 255U},
6495 {2U, 3U, 6U, 7U, 8U, 9U, 14U, 15U, 255U, 255U, 255U,
6496 255U, 255U, 255U, 255U, 255U},
6497 {0U, 1U, 2U, 3U, 6U, 7U, 8U, 9U, 14U, 15U, 255U, 255U,
6498 255U, 255U, 255U, 255U},
6499 {4U, 5U, 6U, 7U, 8U, 9U, 14U, 15U, 255U, 255U, 255U,
6500 255U, 255U, 255U, 255U, 255U},
6501 {0U, 1U, 4U, 5U, 6U, 7U, 8U, 9U, 14U, 15U, 255U, 255U,
6502 255U, 255U, 255U, 255U},
6503 {2U, 3U, 4U, 5U, 6U, 7U, 8U, 9U, 14U, 15U, 255U, 255U,
6504 255U, 255U, 255U, 255U},
6505 {0U, 1U, 2U, 3U, 4U, 5U, 6U, 7U, 8U, 9U, 14U, 15U, 255U,
6506 255U, 255U, 255U},
6507 {10U, 11U, 14U, 15U, 255U, 255U, 255U, 255U, 255U, 255U,
6508 255U, 255U, 255U, 255U, 255U, 255U},
6509 {0U, 1U, 10U, 11U, 14U, 15U, 255U, 255U, 255U, 255U,
6510 255U, 255U, 255U, 255U, 255U, 255U},
6511 {2U, 3U, 10U, 11U, 14U, 15U, 255U, 255U, 255U, 255U,
6512 255U, 255U, 255U, 255U, 255U, 255U},
6513 {0U, 1U, 2U, 3U, 10U, 11U, 14U, 15U, 255U, 255U, 255U,
6514 255U, 255U, 255U, 255U, 255U},
6515 {4U, 5U, 10U, 11U, 14U, 15U, 255U, 255U, 255U, 255U,
6516 255U, 255U, 255U, 255U, 255U, 255U},
6517 {0U, 1U, 4U, 5U, 10U, 11U, 14U, 15U, 255U, 255U, 255U,
6518 255U, 255U, 255U, 255U, 255U},
6519 {2U, 3U, 4U, 5U, 10U, 11U, 14U, 15U, 255U, 255U, 255U,
6520 255U, 255U, 255U, 255U, 255U},
6521 {0U, 1U, 2U, 3U, 4U, 5U, 10U, 11U, 14U, 15U, 255U, 255U,
6522 255U, 255U, 255U, 255U},
6523 {6U, 7U, 10U, 11U, 14U, 15U, 255U, 255U, 255U, 255U,
6524 255U, 255U, 255U, 255U, 255U, 255U},
6525 {0U, 1U, 6U, 7U, 10U, 11U, 14U, 15U, 255U, 255U, 255U,
6526 255U, 255U, 255U, 255U, 255U},
6527 {2U, 3U, 6U, 7U, 10U, 11U, 14U, 15U, 255U, 255U, 255U,
6528 255U, 255U, 255U, 255U, 255U},
6529 {0U, 1U, 2U, 3U, 6U, 7U, 10U, 11U, 14U, 15U, 255U, 255U,
6530 255U, 255U, 255U, 255U},
6531 {4U, 5U, 6U, 7U, 10U, 11U, 14U, 15U, 255U, 255U, 255U,
6532 255U, 255U, 255U, 255U, 255U},
6533 {0U, 1U, 4U, 5U, 6U, 7U, 10U, 11U, 14U, 15U, 255U, 255U,
6534 255U, 255U, 255U, 255U},
6535 {2U, 3U, 4U, 5U, 6U, 7U, 10U, 11U, 14U, 15U, 255U, 255U,
6536 255U, 255U, 255U, 255U},
6537 {0U, 1U, 2U, 3U, 4U, 5U, 6U, 7U, 10U, 11U, 14U, 15U,
6538 255U, 255U, 255U, 255U},
6539 {8U, 9U, 10U, 11U, 14U, 15U, 255U, 255U, 255U, 255U,
6540 255U, 255U, 255U, 255U, 255U, 255U},
6541 {0U, 1U, 8U, 9U, 10U, 11U, 14U, 15U, 255U, 255U, 255U,
6542 255U, 255U, 255U, 255U, 255U},
6543 {2U, 3U, 8U, 9U, 10U, 11U, 14U, 15U, 255U, 255U, 255U,
6544 255U, 255U, 255U, 255U, 255U},
6545 {0U, 1U, 2U, 3U, 8U, 9U, 10U, 11U, 14U, 15U, 255U, 255U,
6546 255U, 255U, 255U, 255U},
6547 {4U, 5U, 8U, 9U, 10U, 11U, 14U, 15U, 255U, 255U, 255U,
6548 255U, 255U, 255U, 255U, 255U},
6549 {0U, 1U, 4U, 5U, 8U, 9U, 10U, 11U, 14U, 15U, 255U, 255U,
6550 255U, 255U, 255U, 255U},
6551 {2U, 3U, 4U, 5U, 8U, 9U, 10U, 11U, 14U, 15U, 255U, 255U,
6552 255U, 255U, 255U, 255U},
6553 {0U, 1U, 2U, 3U, 4U, 5U, 8U, 9U, 10U, 11U, 14U, 15U,
6554 255U, 255U, 255U, 255U},
6555 {6U, 7U, 8U, 9U, 10U, 11U, 14U, 15U, 255U, 255U, 255U,
6556 255U, 255U, 255U, 255U, 255U},
6557 {0U, 1U, 6U, 7U, 8U, 9U, 10U, 11U, 14U, 15U, 255U, 255U,
6558 255U, 255U, 255U, 255U},
6559 {2U, 3U, 6U, 7U, 8U, 9U, 10U, 11U, 14U, 15U, 255U, 255U,
6560 255U, 255U, 255U, 255U},
6561 {0U, 1U, 2U, 3U, 6U, 7U, 8U, 9U, 10U, 11U, 14U, 15U,
6562 255U, 255U, 255U, 255U},
6563 {4U, 5U, 6U, 7U, 8U, 9U, 10U, 11U, 14U, 15U, 255U, 255U,
6564 255U, 255U, 255U, 255U},
6565 {0U, 1U, 4U, 5U, 6U, 7U, 8U, 9U, 10U, 11U, 14U, 15U,
6566 255U, 255U, 255U, 255U},
6567 {2U, 3U, 4U, 5U, 6U, 7U, 8U, 9U, 10U, 11U, 14U, 15U,
6568 255U, 255U, 255U, 255U},
6569 {0U, 1U, 2U, 3U, 4U, 5U, 6U, 7U, 8U, 9U, 10U, 11U, 14U,
6570 15U, 255U, 255U},
6571 {12U, 13U, 14U, 15U, 255U, 255U, 255U, 255U, 255U, 255U,
6572 255U, 255U, 255U, 255U, 255U, 255U},
6573 {0U, 1U, 12U, 13U, 14U, 15U, 255U, 255U, 255U, 255U,
6574 255U, 255U, 255U, 255U, 255U, 255U},
6575 {2U, 3U, 12U, 13U, 14U, 15U, 255U, 255U, 255U, 255U,
6576 255U, 255U, 255U, 255U, 255U, 255U},
6577 {0U, 1U, 2U, 3U, 12U, 13U, 14U, 15U, 255U, 255U, 255U,
6578 255U, 255U, 255U, 255U, 255U},
6579 {4U, 5U, 12U, 13U, 14U, 15U, 255U, 255U, 255U, 255U,
6580 255U, 255U, 255U, 255U, 255U, 255U},
6581 {0U, 1U, 4U, 5U, 12U, 13U, 14U, 15U, 255U, 255U, 255U,
6582 255U, 255U, 255U, 255U, 255U},
6583 {2U, 3U, 4U, 5U, 12U, 13U, 14U, 15U, 255U, 255U, 255U,
6584 255U, 255U, 255U, 255U, 255U},
6585 {0U, 1U, 2U, 3U, 4U, 5U, 12U, 13U, 14U, 15U, 255U, 255U,
6586 255U, 255U, 255U, 255U},
6587 {6U, 7U, 12U, 13U, 14U, 15U, 255U, 255U, 255U, 255U,
6588 255U, 255U, 255U, 255U, 255U, 255U},
6589 {0U, 1U, 6U, 7U, 12U, 13U, 14U, 15U, 255U, 255U, 255U,
6590 255U, 255U, 255U, 255U, 255U},
6591 {2U, 3U, 6U, 7U, 12U, 13U, 14U, 15U, 255U, 255U, 255U,
6592 255U, 255U, 255U, 255U, 255U},
6593 {0U, 1U, 2U, 3U, 6U, 7U, 12U, 13U, 14U, 15U, 255U, 255U,
6594 255U, 255U, 255U, 255U},
6595 {4U, 5U, 6U, 7U, 12U, 13U, 14U, 15U, 255U, 255U, 255U,
6596 255U, 255U, 255U, 255U, 255U},
6597 {0U, 1U, 4U, 5U, 6U, 7U, 12U, 13U, 14U, 15U, 255U, 255U,
6598 255U, 255U, 255U, 255U},
6599 {2U, 3U, 4U, 5U, 6U, 7U, 12U, 13U, 14U, 15U, 255U, 255U,
6600 255U, 255U, 255U, 255U},
6601 {0U, 1U, 2U, 3U, 4U, 5U, 6U, 7U, 12U, 13U, 14U, 15U,
6602 255U, 255U, 255U, 255U},
6603 {8U, 9U, 12U, 13U, 14U, 15U, 255U, 255U, 255U, 255U,
6604 255U, 255U, 255U, 255U, 255U, 255U},
6605 {0U, 1U, 8U, 9U, 12U, 13U, 14U, 15U, 255U, 255U, 255U,
6606 255U, 255U, 255U, 255U, 255U},
6607 {2U, 3U, 8U, 9U, 12U, 13U, 14U, 15U, 255U, 255U, 255U,
6608 255U, 255U, 255U, 255U, 255U},
6609 {0U, 1U, 2U, 3U, 8U, 9U, 12U, 13U, 14U, 15U, 255U, 255U,
6610 255U, 255U, 255U, 255U},
6611 {4U, 5U, 8U, 9U, 12U, 13U, 14U, 15U, 255U, 255U, 255U,
6612 255U, 255U, 255U, 255U, 255U},
6613 {0U, 1U, 4U, 5U, 8U, 9U, 12U, 13U, 14U, 15U, 255U, 255U,
6614 255U, 255U, 255U, 255U},
6615 {2U, 3U, 4U, 5U, 8U, 9U, 12U, 13U, 14U, 15U, 255U, 255U,
6616 255U, 255U, 255U, 255U},
6617 {0U, 1U, 2U, 3U, 4U, 5U, 8U, 9U, 12U, 13U, 14U, 15U,
6618 255U, 255U, 255U, 255U},
6619 {6U, 7U, 8U, 9U, 12U, 13U, 14U, 15U, 255U, 255U, 255U,
6620 255U, 255U, 255U, 255U, 255U},
6621 {0U, 1U, 6U, 7U, 8U, 9U, 12U, 13U, 14U, 15U, 255U, 255U,
6622 255U, 255U, 255U, 255U},
6623 {2U, 3U, 6U, 7U, 8U, 9U, 12U, 13U, 14U, 15U, 255U, 255U,
6624 255U, 255U, 255U, 255U},
6625 {0U, 1U, 2U, 3U, 6U, 7U, 8U, 9U, 12U, 13U, 14U, 15U,
6626 255U, 255U, 255U, 255U},
6627 {4U, 5U, 6U, 7U, 8U, 9U, 12U, 13U, 14U, 15U, 255U, 255U,
6628 255U, 255U, 255U, 255U},
6629 {0U, 1U, 4U, 5U, 6U, 7U, 8U, 9U, 12U, 13U, 14U, 15U,
6630 255U, 255U, 255U, 255U},
6631 {2U, 3U, 4U, 5U, 6U, 7U, 8U, 9U, 12U, 13U, 14U, 15U,
6632 255U, 255U, 255U, 255U},
6633 {0U, 1U, 2U, 3U, 4U, 5U, 6U, 7U, 8U, 9U, 12U, 13U, 14U,
6634 15U, 255U, 255U},
6635 {10U, 11U, 12U, 13U, 14U, 15U, 255U, 255U, 255U, 255U,
6636 255U, 255U, 255U, 255U, 255U, 255U},
6637 {0U, 1U, 10U, 11U, 12U, 13U, 14U, 15U, 255U, 255U, 255U,
6638 255U, 255U, 255U, 255U, 255U},
6639 {2U, 3U, 10U, 11U, 12U, 13U, 14U, 15U, 255U, 255U, 255U,
6640 255U, 255U, 255U, 255U, 255U},
6641 {0U, 1U, 2U, 3U, 10U, 11U, 12U, 13U, 14U, 15U, 255U,
6642 255U, 255U, 255U, 255U, 255U},
6643 {4U, 5U, 10U, 11U, 12U, 13U, 14U, 15U, 255U, 255U, 255U,
6644 255U, 255U, 255U, 255U, 255U},
6645 {0U, 1U, 4U, 5U, 10U, 11U, 12U, 13U, 14U, 15U, 255U,
6646 255U, 255U, 255U, 255U, 255U},
6647 {2U, 3U, 4U, 5U, 10U, 11U, 12U, 13U, 14U, 15U, 255U,
6648 255U, 255U, 255U, 255U, 255U},
6649 {0U, 1U, 2U, 3U, 4U, 5U, 10U, 11U, 12U, 13U, 14U, 15U,
6650 255U, 255U, 255U, 255U},
6651 {6U, 7U, 10U, 11U, 12U, 13U, 14U, 15U, 255U, 255U, 255U,
6652 255U, 255U, 255U, 255U, 255U},
6653 {0U, 1U, 6U, 7U, 10U, 11U, 12U, 13U, 14U, 15U, 255U,
6654 255U, 255U, 255U, 255U, 255U},
6655 {2U, 3U, 6U, 7U, 10U, 11U, 12U, 13U, 14U, 15U, 255U,
6656 255U, 255U, 255U, 255U, 255U},
6657 {0U, 1U, 2U, 3U, 6U, 7U, 10U, 11U, 12U, 13U, 14U, 15U,
6658 255U, 255U, 255U, 255U},
6659 {4U, 5U, 6U, 7U, 10U, 11U, 12U, 13U, 14U, 15U, 255U,
6660 255U, 255U, 255U, 255U, 255U},
6661 {0U, 1U, 4U, 5U, 6U, 7U, 10U, 11U, 12U, 13U, 14U, 15U,
6662 255U, 255U, 255U, 255U},
6663 {2U, 3U, 4U, 5U, 6U, 7U, 10U, 11U, 12U, 13U, 14U, 15U,
6664 255U, 255U, 255U, 255U},
6665 {0U, 1U, 2U, 3U, 4U, 5U, 6U, 7U, 10U, 11U, 12U, 13U, 14U,
6666 15U, 255U, 255U},
6667 {8U, 9U, 10U, 11U, 12U, 13U, 14U, 15U, 255U, 255U, 255U,
6668 255U, 255U, 255U, 255U, 255U},
6669 {0U, 1U, 8U, 9U, 10U, 11U, 12U, 13U, 14U, 15U, 255U,
6670 255U, 255U, 255U, 255U, 255U},
6671 {2U, 3U, 8U, 9U, 10U, 11U, 12U, 13U, 14U, 15U, 255U,
6672 255U, 255U, 255U, 255U, 255U},
6673 {0U, 1U, 2U, 3U, 8U, 9U, 10U, 11U, 12U, 13U, 14U, 15U,
6674 255U, 255U, 255U, 255U},
6675 {4U, 5U, 8U, 9U, 10U, 11U, 12U, 13U, 14U, 15U, 255U,
6676 255U, 255U, 255U, 255U, 255U},
6677 {0U, 1U, 4U, 5U, 8U, 9U, 10U, 11U, 12U, 13U, 14U, 15U,
6678 255U, 255U, 255U, 255U},
6679 {2U, 3U, 4U, 5U, 8U, 9U, 10U, 11U, 12U, 13U, 14U, 15U,
6680 255U, 255U, 255U, 255U},
6681 {0U, 1U, 2U, 3U, 4U, 5U, 8U, 9U, 10U, 11U, 12U, 13U, 14U,
6682 15U, 255U, 255U},
6683 {6U, 7U, 8U, 9U, 10U, 11U, 12U, 13U, 14U, 15U, 255U,
6684 255U, 255U, 255U, 255U, 255U},
6685 {0U, 1U, 6U, 7U, 8U, 9U, 10U, 11U, 12U, 13U, 14U, 15U,
6686 255U, 255U, 255U, 255U},
6687 {2U, 3U, 6U, 7U, 8U, 9U, 10U, 11U, 12U, 13U, 14U, 15U,
6688 255U, 255U, 255U, 255U},
6689 {0U, 1U, 2U, 3U, 6U, 7U, 8U, 9U, 10U, 11U, 12U, 13U, 14U,
6690 15U, 255U, 255U},
6691 {4U, 5U, 6U, 7U, 8U, 9U, 10U, 11U, 12U, 13U, 14U, 15U,
6692 255U, 255U, 255U, 255U},
6693 {0U, 1U, 4U, 5U, 6U, 7U, 8U, 9U, 10U, 11U, 12U, 13U, 14U,
6694 15U, 255U, 255U},
6695 {2U, 3U, 4U, 5U, 6U, 7U, 8U, 9U, 10U, 11U, 12U, 13U, 14U,
6696 15U, 255U, 255U},
6697 {0U, 1U, 2U, 3U, 4U, 5U, 6U, 7U, 8U, 9U, 10U, 11U, 12U,
6698 13U, 14U, 15U}};
6699
6700 /**
6701 This function found in impl {(libcrux_ml_kem::vector::traits::Operations for
6702 libcrux_ml_kem::vector::portable::vector_type::PortableVector)}
6703 */
6704 static inline libcrux_ml_kem_vector_portable_vector_type_PortableVector
libcrux_ml_kem_vector_portable_ZERO_0d(void)6705 libcrux_ml_kem_vector_portable_ZERO_0d(void) {
6706 return libcrux_ml_kem_vector_portable_vector_type_zero();
6707 }
6708
6709 static KRML_MUSTINLINE libcrux_ml_kem_vector_portable_vector_type_PortableVector
libcrux_ml_kem_vector_portable_arithmetic_add(libcrux_ml_kem_vector_portable_vector_type_PortableVector lhs,libcrux_ml_kem_vector_portable_vector_type_PortableVector * rhs)6710 libcrux_ml_kem_vector_portable_arithmetic_add(
6711 libcrux_ml_kem_vector_portable_vector_type_PortableVector lhs,
6712 libcrux_ml_kem_vector_portable_vector_type_PortableVector *rhs) {
6713 for (size_t i = (size_t)0U;
6714 i < LIBCRUX_ML_KEM_VECTOR_TRAITS_FIELD_ELEMENTS_IN_VECTOR; i++) {
6715 size_t i0 = i;
6716 size_t uu____0 = i0;
6717 lhs.elements[uu____0] = lhs.elements[uu____0] + rhs->elements[i0];
6718 }
6719 return lhs;
6720 }
6721
6722 /**
6723 This function found in impl {(libcrux_ml_kem::vector::traits::Operations for
6724 libcrux_ml_kem::vector::portable::vector_type::PortableVector)}
6725 */
6726 static inline libcrux_ml_kem_vector_portable_vector_type_PortableVector
libcrux_ml_kem_vector_portable_add_0d(libcrux_ml_kem_vector_portable_vector_type_PortableVector lhs,libcrux_ml_kem_vector_portable_vector_type_PortableVector * rhs)6727 libcrux_ml_kem_vector_portable_add_0d(
6728 libcrux_ml_kem_vector_portable_vector_type_PortableVector lhs,
6729 libcrux_ml_kem_vector_portable_vector_type_PortableVector *rhs) {
6730 return libcrux_ml_kem_vector_portable_arithmetic_add(lhs, rhs);
6731 }
6732
6733 static KRML_MUSTINLINE libcrux_ml_kem_vector_portable_vector_type_PortableVector
libcrux_ml_kem_vector_portable_arithmetic_sub(libcrux_ml_kem_vector_portable_vector_type_PortableVector lhs,libcrux_ml_kem_vector_portable_vector_type_PortableVector * rhs)6734 libcrux_ml_kem_vector_portable_arithmetic_sub(
6735 libcrux_ml_kem_vector_portable_vector_type_PortableVector lhs,
6736 libcrux_ml_kem_vector_portable_vector_type_PortableVector *rhs) {
6737 for (size_t i = (size_t)0U;
6738 i < LIBCRUX_ML_KEM_VECTOR_TRAITS_FIELD_ELEMENTS_IN_VECTOR; i++) {
6739 size_t i0 = i;
6740 size_t uu____0 = i0;
6741 lhs.elements[uu____0] = lhs.elements[uu____0] - rhs->elements[i0];
6742 }
6743 return lhs;
6744 }
6745
6746 /**
6747 This function found in impl {(libcrux_ml_kem::vector::traits::Operations for
6748 libcrux_ml_kem::vector::portable::vector_type::PortableVector)}
6749 */
6750 static inline libcrux_ml_kem_vector_portable_vector_type_PortableVector
libcrux_ml_kem_vector_portable_sub_0d(libcrux_ml_kem_vector_portable_vector_type_PortableVector lhs,libcrux_ml_kem_vector_portable_vector_type_PortableVector * rhs)6751 libcrux_ml_kem_vector_portable_sub_0d(
6752 libcrux_ml_kem_vector_portable_vector_type_PortableVector lhs,
6753 libcrux_ml_kem_vector_portable_vector_type_PortableVector *rhs) {
6754 return libcrux_ml_kem_vector_portable_arithmetic_sub(lhs, rhs);
6755 }
6756
6757 static KRML_MUSTINLINE libcrux_ml_kem_vector_portable_vector_type_PortableVector
libcrux_ml_kem_vector_portable_arithmetic_multiply_by_constant(libcrux_ml_kem_vector_portable_vector_type_PortableVector v,int16_t c)6758 libcrux_ml_kem_vector_portable_arithmetic_multiply_by_constant(
6759 libcrux_ml_kem_vector_portable_vector_type_PortableVector v, int16_t c) {
6760 for (size_t i = (size_t)0U;
6761 i < LIBCRUX_ML_KEM_VECTOR_TRAITS_FIELD_ELEMENTS_IN_VECTOR; i++) {
6762 size_t i0 = i;
6763 size_t uu____0 = i0;
6764 v.elements[uu____0] = v.elements[uu____0] * c;
6765 }
6766 return v;
6767 }
6768
6769 /**
6770 This function found in impl {(libcrux_ml_kem::vector::traits::Operations for
6771 libcrux_ml_kem::vector::portable::vector_type::PortableVector)}
6772 */
6773 static inline libcrux_ml_kem_vector_portable_vector_type_PortableVector
libcrux_ml_kem_vector_portable_multiply_by_constant_0d(libcrux_ml_kem_vector_portable_vector_type_PortableVector v,int16_t c)6774 libcrux_ml_kem_vector_portable_multiply_by_constant_0d(
6775 libcrux_ml_kem_vector_portable_vector_type_PortableVector v, int16_t c) {
6776 return libcrux_ml_kem_vector_portable_arithmetic_multiply_by_constant(v, c);
6777 }
6778
6779 static KRML_MUSTINLINE libcrux_ml_kem_vector_portable_vector_type_PortableVector
libcrux_ml_kem_vector_portable_arithmetic_bitwise_and_with_constant(libcrux_ml_kem_vector_portable_vector_type_PortableVector v,int16_t c)6780 libcrux_ml_kem_vector_portable_arithmetic_bitwise_and_with_constant(
6781 libcrux_ml_kem_vector_portable_vector_type_PortableVector v, int16_t c) {
6782 for (size_t i = (size_t)0U;
6783 i < LIBCRUX_ML_KEM_VECTOR_TRAITS_FIELD_ELEMENTS_IN_VECTOR; i++) {
6784 size_t i0 = i;
6785 size_t uu____0 = i0;
6786 v.elements[uu____0] = v.elements[uu____0] & c;
6787 }
6788 return v;
6789 }
6790
6791 /**
6792 This function found in impl {(libcrux_ml_kem::vector::traits::Operations for
6793 libcrux_ml_kem::vector::portable::vector_type::PortableVector)}
6794 */
6795 static inline libcrux_ml_kem_vector_portable_vector_type_PortableVector
libcrux_ml_kem_vector_portable_bitwise_and_with_constant_0d(libcrux_ml_kem_vector_portable_vector_type_PortableVector v,int16_t c)6796 libcrux_ml_kem_vector_portable_bitwise_and_with_constant_0d(
6797 libcrux_ml_kem_vector_portable_vector_type_PortableVector v, int16_t c) {
6798 return libcrux_ml_kem_vector_portable_arithmetic_bitwise_and_with_constant(v,
6799 c);
6800 }
6801
6802 static KRML_MUSTINLINE libcrux_ml_kem_vector_portable_vector_type_PortableVector
libcrux_ml_kem_vector_portable_arithmetic_cond_subtract_3329(libcrux_ml_kem_vector_portable_vector_type_PortableVector v)6803 libcrux_ml_kem_vector_portable_arithmetic_cond_subtract_3329(
6804 libcrux_ml_kem_vector_portable_vector_type_PortableVector v) {
6805 core_ops_range_Range_b3 iter =
6806 core_iter_traits_collect___core__iter__traits__collect__IntoIterator_for_I__1__into_iter(
6807 (CLITERAL(core_ops_range_Range_b3){
6808 .start = (size_t)0U,
6809 .end = LIBCRUX_ML_KEM_VECTOR_TRAITS_FIELD_ELEMENTS_IN_VECTOR}),
6810 core_ops_range_Range_b3, core_ops_range_Range_b3);
6811 while (true) {
6812 Option_b3 uu____0 =
6813 core_iter_range___core__iter__traits__iterator__Iterator_for_core__ops__range__Range_A___6__next(
6814 &iter, size_t, Option_b3);
6815 if (!(uu____0.tag == None)) {
6816 size_t i = uu____0.f0;
6817 if (v.elements[i] >= (int16_t)3329) {
6818 size_t uu____1 = i;
6819 v.elements[uu____1] = v.elements[uu____1] - (int16_t)3329;
6820 }
6821 continue;
6822 }
6823 return v;
6824 }
6825 }
6826
6827 /**
6828 This function found in impl {(libcrux_ml_kem::vector::traits::Operations for
6829 libcrux_ml_kem::vector::portable::vector_type::PortableVector)}
6830 */
6831 static inline libcrux_ml_kem_vector_portable_vector_type_PortableVector
libcrux_ml_kem_vector_portable_cond_subtract_3329_0d(libcrux_ml_kem_vector_portable_vector_type_PortableVector v)6832 libcrux_ml_kem_vector_portable_cond_subtract_3329_0d(
6833 libcrux_ml_kem_vector_portable_vector_type_PortableVector v) {
6834 return libcrux_ml_kem_vector_portable_arithmetic_cond_subtract_3329(v);
6835 }
6836
6837 #define LIBCRUX_ML_KEM_VECTOR_PORTABLE_ARITHMETIC_BARRETT_MULTIPLIER \
6838 ((int32_t)20159)
6839
6840 #define LIBCRUX_ML_KEM_VECTOR_PORTABLE_ARITHMETIC_BARRETT_SHIFT ((int32_t)26)
6841
6842 #define LIBCRUX_ML_KEM_VECTOR_PORTABLE_ARITHMETIC_BARRETT_R \
6843 ((int32_t)1 << (uint32_t) \
6844 LIBCRUX_ML_KEM_VECTOR_PORTABLE_ARITHMETIC_BARRETT_SHIFT)
6845
6846 /**
6847 Signed Barrett Reduction
6848
6849 Given an input `value`, `barrett_reduce` outputs a representative `result`
6850 such that:
6851
6852 - result ≡ value (mod FIELD_MODULUS)
6853 - the absolute value of `result` is bound as follows:
6854
6855 `|result| ≤ FIELD_MODULUS / 2 · (|value|/BARRETT_R + 1)
6856
6857 In particular, if `|value| < BARRETT_R`, then `|result| < FIELD_MODULUS`.
6858 */
6859 static inline int16_t
libcrux_ml_kem_vector_portable_arithmetic_barrett_reduce_element(int16_t value)6860 libcrux_ml_kem_vector_portable_arithmetic_barrett_reduce_element(
6861 int16_t value) {
6862 int32_t t = (int32_t)value *
6863 LIBCRUX_ML_KEM_VECTOR_PORTABLE_ARITHMETIC_BARRETT_MULTIPLIER +
6864 (LIBCRUX_ML_KEM_VECTOR_PORTABLE_ARITHMETIC_BARRETT_R >> 1U);
6865 int16_t quotient =
6866 (int16_t)(t >>
6867 (uint32_t)
6868 LIBCRUX_ML_KEM_VECTOR_PORTABLE_ARITHMETIC_BARRETT_SHIFT);
6869 return value - quotient * LIBCRUX_ML_KEM_VECTOR_TRAITS_FIELD_MODULUS;
6870 }
6871
6872 static KRML_MUSTINLINE libcrux_ml_kem_vector_portable_vector_type_PortableVector
libcrux_ml_kem_vector_portable_arithmetic_barrett_reduce(libcrux_ml_kem_vector_portable_vector_type_PortableVector v)6873 libcrux_ml_kem_vector_portable_arithmetic_barrett_reduce(
6874 libcrux_ml_kem_vector_portable_vector_type_PortableVector v) {
6875 for (size_t i = (size_t)0U;
6876 i < LIBCRUX_ML_KEM_VECTOR_TRAITS_FIELD_ELEMENTS_IN_VECTOR; i++) {
6877 size_t i0 = i;
6878 v.elements[i0] =
6879 libcrux_ml_kem_vector_portable_arithmetic_barrett_reduce_element(
6880 v.elements[i0]);
6881 }
6882 return v;
6883 }
6884
6885 /**
6886 This function found in impl {(libcrux_ml_kem::vector::traits::Operations for
6887 libcrux_ml_kem::vector::portable::vector_type::PortableVector)}
6888 */
6889 static inline libcrux_ml_kem_vector_portable_vector_type_PortableVector
libcrux_ml_kem_vector_portable_barrett_reduce_0d(libcrux_ml_kem_vector_portable_vector_type_PortableVector v)6890 libcrux_ml_kem_vector_portable_barrett_reduce_0d(
6891 libcrux_ml_kem_vector_portable_vector_type_PortableVector v) {
6892 return libcrux_ml_kem_vector_portable_arithmetic_barrett_reduce(v);
6893 }
6894
6895 #define LIBCRUX_ML_KEM_VECTOR_PORTABLE_ARITHMETIC_MONTGOMERY_SHIFT (16U)
6896
6897 #define LIBCRUX_ML_KEM_VECTOR_PORTABLE_ARITHMETIC_MONTGOMERY_R \
6898 ((int32_t)1 << (uint32_t) \
6899 LIBCRUX_ML_KEM_VECTOR_PORTABLE_ARITHMETIC_MONTGOMERY_SHIFT)
6900
6901 /**
6902 Signed Montgomery Reduction
6903
6904 Given an input `value`, `montgomery_reduce` outputs a representative `o`
6905 such that:
6906
6907 - o ≡ value · MONTGOMERY_R^(-1) (mod FIELD_MODULUS)
6908 - the absolute value of `o` is bound as follows:
6909
6910 `|result| ≤ (|value| / MONTGOMERY_R) + (FIELD_MODULUS / 2)
6911
6912 In particular, if `|value| ≤ FIELD_MODULUS * MONTGOMERY_R`, then `|o| < (3 ·
6913 FIELD_MODULUS) / 2`.
6914 */
6915 static inline int16_t
libcrux_ml_kem_vector_portable_arithmetic_montgomery_reduce_element(int32_t value)6916 libcrux_ml_kem_vector_portable_arithmetic_montgomery_reduce_element(
6917 int32_t value) {
6918 int32_t k =
6919 (int32_t)(int16_t)value *
6920 (int32_t)LIBCRUX_ML_KEM_VECTOR_TRAITS_INVERSE_OF_MODULUS_MOD_MONTGOMERY_R;
6921 int32_t k_times_modulus =
6922 (int32_t)(int16_t)k * (int32_t)LIBCRUX_ML_KEM_VECTOR_TRAITS_FIELD_MODULUS;
6923 int16_t c =
6924 (int16_t)(k_times_modulus >>
6925 (uint32_t)
6926 LIBCRUX_ML_KEM_VECTOR_PORTABLE_ARITHMETIC_MONTGOMERY_SHIFT);
6927 int16_t value_high =
6928 (int16_t)(value >>
6929 (uint32_t)
6930 LIBCRUX_ML_KEM_VECTOR_PORTABLE_ARITHMETIC_MONTGOMERY_SHIFT);
6931 return value_high - c;
6932 }
6933
6934 /**
6935 If `fe` is some field element 'x' of the Kyber field and `fer` is congruent to
6936 `y · MONTGOMERY_R`, this procedure outputs a value that is congruent to
6937 `x · y`, as follows:
6938
6939 `fe · fer ≡ x · y · MONTGOMERY_R (mod FIELD_MODULUS)`
6940
6941 `montgomery_reduce` takes the value `x · y · MONTGOMERY_R` and outputs a
6942 representative `x · y · MONTGOMERY_R * MONTGOMERY_R^{-1} ≡ x · y (mod
6943 FIELD_MODULUS)`.
6944 */
6945 static KRML_MUSTINLINE int16_t
libcrux_ml_kem_vector_portable_arithmetic_montgomery_multiply_fe_by_fer(int16_t fe,int16_t fer)6946 libcrux_ml_kem_vector_portable_arithmetic_montgomery_multiply_fe_by_fer(
6947 int16_t fe, int16_t fer) {
6948 return libcrux_ml_kem_vector_portable_arithmetic_montgomery_reduce_element(
6949 (int32_t)fe * (int32_t)fer);
6950 }
6951
6952 static KRML_MUSTINLINE libcrux_ml_kem_vector_portable_vector_type_PortableVector
libcrux_ml_kem_vector_portable_arithmetic_montgomery_multiply_by_constant(libcrux_ml_kem_vector_portable_vector_type_PortableVector v,int16_t c)6953 libcrux_ml_kem_vector_portable_arithmetic_montgomery_multiply_by_constant(
6954 libcrux_ml_kem_vector_portable_vector_type_PortableVector v, int16_t c) {
6955 for (size_t i = (size_t)0U;
6956 i < LIBCRUX_ML_KEM_VECTOR_TRAITS_FIELD_ELEMENTS_IN_VECTOR; i++) {
6957 size_t i0 = i;
6958 v.elements[i0] =
6959 libcrux_ml_kem_vector_portable_arithmetic_montgomery_multiply_fe_by_fer(
6960 v.elements[i0], c);
6961 }
6962 return v;
6963 }
6964
6965 /**
6966 This function found in impl {(libcrux_ml_kem::vector::traits::Operations for
6967 libcrux_ml_kem::vector::portable::vector_type::PortableVector)}
6968 */
6969 static inline libcrux_ml_kem_vector_portable_vector_type_PortableVector
libcrux_ml_kem_vector_portable_montgomery_multiply_by_constant_0d(libcrux_ml_kem_vector_portable_vector_type_PortableVector v,int16_t r)6970 libcrux_ml_kem_vector_portable_montgomery_multiply_by_constant_0d(
6971 libcrux_ml_kem_vector_portable_vector_type_PortableVector v, int16_t r) {
6972 return libcrux_ml_kem_vector_portable_arithmetic_montgomery_multiply_by_constant(
6973 v, r);
6974 }
6975
6976 /**
6977 The `compress_*` functions implement the `Compress` function specified in the
6978 NIST FIPS 203 standard (Page 18, Expression 4.5), which is defined as:
6979
6980 ```plaintext
6981 Compress_d: ℤq -> ℤ_{2ᵈ}
6982 Compress_d(x) = ⌈(2ᵈ/q)·x⌋
6983 ```
6984
6985 Since `⌈x⌋ = ⌊x + 1/2⌋` we have:
6986
6987 ```plaintext
6988 Compress_d(x) = ⌊(2ᵈ/q)·x + 1/2⌋
6989 = ⌊(2^{d+1}·x + q) / 2q⌋
6990 ```
6991
6992 For further information about the function implementations, consult the
6993 `implementation_notes.pdf` document in this directory.
6994
6995 The NIST FIPS 203 standard can be found at
6996 <https://csrc.nist.gov/pubs/fips/203/ipd>.
6997 */
6998 static inline uint8_t
libcrux_ml_kem_vector_portable_compress_compress_message_coefficient(uint16_t fe)6999 libcrux_ml_kem_vector_portable_compress_compress_message_coefficient(
7000 uint16_t fe) {
7001 int16_t shifted = (int16_t)1664 - (int16_t)fe;
7002 int16_t mask = shifted >> 15U;
7003 int16_t shifted_to_positive = mask ^ shifted;
7004 int16_t shifted_positive_in_range = shifted_to_positive - (int16_t)832;
7005 return (uint8_t)(shifted_positive_in_range >> 15U & (int16_t)1);
7006 }
7007
7008 static KRML_MUSTINLINE libcrux_ml_kem_vector_portable_vector_type_PortableVector
libcrux_ml_kem_vector_portable_compress_compress_1(libcrux_ml_kem_vector_portable_vector_type_PortableVector v)7009 libcrux_ml_kem_vector_portable_compress_compress_1(
7010 libcrux_ml_kem_vector_portable_vector_type_PortableVector v) {
7011 for (size_t i = (size_t)0U;
7012 i < LIBCRUX_ML_KEM_VECTOR_TRAITS_FIELD_ELEMENTS_IN_VECTOR; i++) {
7013 size_t i0 = i;
7014 v.elements[i0] = (int16_t)
7015 libcrux_ml_kem_vector_portable_compress_compress_message_coefficient(
7016 (uint16_t)v.elements[i0]);
7017 }
7018 return v;
7019 }
7020
7021 /**
7022 This function found in impl {(libcrux_ml_kem::vector::traits::Operations for
7023 libcrux_ml_kem::vector::portable::vector_type::PortableVector)}
7024 */
7025 static inline libcrux_ml_kem_vector_portable_vector_type_PortableVector
libcrux_ml_kem_vector_portable_compress_1_0d(libcrux_ml_kem_vector_portable_vector_type_PortableVector v)7026 libcrux_ml_kem_vector_portable_compress_1_0d(
7027 libcrux_ml_kem_vector_portable_vector_type_PortableVector v) {
7028 return libcrux_ml_kem_vector_portable_compress_compress_1(v);
7029 }
7030
7031 static KRML_MUSTINLINE uint32_t
libcrux_ml_kem_vector_portable_arithmetic_get_n_least_significant_bits(uint8_t n,uint32_t value)7032 libcrux_ml_kem_vector_portable_arithmetic_get_n_least_significant_bits(
7033 uint8_t n, uint32_t value) {
7034 return value & ((1U << (uint32_t)n) - 1U);
7035 }
7036
7037 static inline int16_t
libcrux_ml_kem_vector_portable_compress_compress_ciphertext_coefficient(uint8_t coefficient_bits,uint16_t fe)7038 libcrux_ml_kem_vector_portable_compress_compress_ciphertext_coefficient(
7039 uint8_t coefficient_bits, uint16_t fe) {
7040 uint64_t compressed = (uint64_t)fe << (uint32_t)coefficient_bits;
7041 compressed = compressed + 1664ULL;
7042 compressed = compressed * 10321340ULL;
7043 compressed = compressed >> 35U;
7044 return (int16_t)
7045 libcrux_ml_kem_vector_portable_arithmetic_get_n_least_significant_bits(
7046 coefficient_bits, (uint32_t)compressed);
7047 }
7048
libcrux_ml_kem_vector_portable_ntt_ntt_step(libcrux_ml_kem_vector_portable_vector_type_PortableVector * v,int16_t zeta,size_t i,size_t j)7049 static KRML_MUSTINLINE void libcrux_ml_kem_vector_portable_ntt_ntt_step(
7050 libcrux_ml_kem_vector_portable_vector_type_PortableVector *v, int16_t zeta,
7051 size_t i, size_t j) {
7052 int16_t t =
7053 libcrux_ml_kem_vector_portable_arithmetic_montgomery_multiply_fe_by_fer(
7054 v->elements[j], zeta);
7055 v->elements[j] = v->elements[i] - t;
7056 v->elements[i] = v->elements[i] + t;
7057 }
7058
7059 static KRML_MUSTINLINE libcrux_ml_kem_vector_portable_vector_type_PortableVector
libcrux_ml_kem_vector_portable_ntt_ntt_layer_1_step(libcrux_ml_kem_vector_portable_vector_type_PortableVector v,int16_t zeta0,int16_t zeta1,int16_t zeta2,int16_t zeta3)7060 libcrux_ml_kem_vector_portable_ntt_ntt_layer_1_step(
7061 libcrux_ml_kem_vector_portable_vector_type_PortableVector v, int16_t zeta0,
7062 int16_t zeta1, int16_t zeta2, int16_t zeta3) {
7063 libcrux_ml_kem_vector_portable_ntt_ntt_step(&v, zeta0, (size_t)0U,
7064 (size_t)2U);
7065 libcrux_ml_kem_vector_portable_ntt_ntt_step(&v, zeta0, (size_t)1U,
7066 (size_t)3U);
7067 libcrux_ml_kem_vector_portable_ntt_ntt_step(&v, zeta1, (size_t)4U,
7068 (size_t)6U);
7069 libcrux_ml_kem_vector_portable_ntt_ntt_step(&v, zeta1, (size_t)5U,
7070 (size_t)7U);
7071 libcrux_ml_kem_vector_portable_ntt_ntt_step(&v, zeta2, (size_t)8U,
7072 (size_t)10U);
7073 libcrux_ml_kem_vector_portable_ntt_ntt_step(&v, zeta2, (size_t)9U,
7074 (size_t)11U);
7075 libcrux_ml_kem_vector_portable_ntt_ntt_step(&v, zeta3, (size_t)12U,
7076 (size_t)14U);
7077 libcrux_ml_kem_vector_portable_ntt_ntt_step(&v, zeta3, (size_t)13U,
7078 (size_t)15U);
7079 return v;
7080 }
7081
7082 /**
7083 This function found in impl {(libcrux_ml_kem::vector::traits::Operations for
7084 libcrux_ml_kem::vector::portable::vector_type::PortableVector)}
7085 */
7086 static inline libcrux_ml_kem_vector_portable_vector_type_PortableVector
libcrux_ml_kem_vector_portable_ntt_layer_1_step_0d(libcrux_ml_kem_vector_portable_vector_type_PortableVector a,int16_t zeta0,int16_t zeta1,int16_t zeta2,int16_t zeta3)7087 libcrux_ml_kem_vector_portable_ntt_layer_1_step_0d(
7088 libcrux_ml_kem_vector_portable_vector_type_PortableVector a, int16_t zeta0,
7089 int16_t zeta1, int16_t zeta2, int16_t zeta3) {
7090 return libcrux_ml_kem_vector_portable_ntt_ntt_layer_1_step(a, zeta0, zeta1,
7091 zeta2, zeta3);
7092 }
7093
7094 static KRML_MUSTINLINE libcrux_ml_kem_vector_portable_vector_type_PortableVector
libcrux_ml_kem_vector_portable_ntt_ntt_layer_2_step(libcrux_ml_kem_vector_portable_vector_type_PortableVector v,int16_t zeta0,int16_t zeta1)7095 libcrux_ml_kem_vector_portable_ntt_ntt_layer_2_step(
7096 libcrux_ml_kem_vector_portable_vector_type_PortableVector v, int16_t zeta0,
7097 int16_t zeta1) {
7098 libcrux_ml_kem_vector_portable_ntt_ntt_step(&v, zeta0, (size_t)0U,
7099 (size_t)4U);
7100 libcrux_ml_kem_vector_portable_ntt_ntt_step(&v, zeta0, (size_t)1U,
7101 (size_t)5U);
7102 libcrux_ml_kem_vector_portable_ntt_ntt_step(&v, zeta0, (size_t)2U,
7103 (size_t)6U);
7104 libcrux_ml_kem_vector_portable_ntt_ntt_step(&v, zeta0, (size_t)3U,
7105 (size_t)7U);
7106 libcrux_ml_kem_vector_portable_ntt_ntt_step(&v, zeta1, (size_t)8U,
7107 (size_t)12U);
7108 libcrux_ml_kem_vector_portable_ntt_ntt_step(&v, zeta1, (size_t)9U,
7109 (size_t)13U);
7110 libcrux_ml_kem_vector_portable_ntt_ntt_step(&v, zeta1, (size_t)10U,
7111 (size_t)14U);
7112 libcrux_ml_kem_vector_portable_ntt_ntt_step(&v, zeta1, (size_t)11U,
7113 (size_t)15U);
7114 return v;
7115 }
7116
7117 /**
7118 This function found in impl {(libcrux_ml_kem::vector::traits::Operations for
7119 libcrux_ml_kem::vector::portable::vector_type::PortableVector)}
7120 */
7121 static inline libcrux_ml_kem_vector_portable_vector_type_PortableVector
libcrux_ml_kem_vector_portable_ntt_layer_2_step_0d(libcrux_ml_kem_vector_portable_vector_type_PortableVector a,int16_t zeta0,int16_t zeta1)7122 libcrux_ml_kem_vector_portable_ntt_layer_2_step_0d(
7123 libcrux_ml_kem_vector_portable_vector_type_PortableVector a, int16_t zeta0,
7124 int16_t zeta1) {
7125 return libcrux_ml_kem_vector_portable_ntt_ntt_layer_2_step(a, zeta0, zeta1);
7126 }
7127
7128 static KRML_MUSTINLINE libcrux_ml_kem_vector_portable_vector_type_PortableVector
libcrux_ml_kem_vector_portable_ntt_ntt_layer_3_step(libcrux_ml_kem_vector_portable_vector_type_PortableVector v,int16_t zeta)7129 libcrux_ml_kem_vector_portable_ntt_ntt_layer_3_step(
7130 libcrux_ml_kem_vector_portable_vector_type_PortableVector v, int16_t zeta) {
7131 libcrux_ml_kem_vector_portable_ntt_ntt_step(&v, zeta, (size_t)0U, (size_t)8U);
7132 libcrux_ml_kem_vector_portable_ntt_ntt_step(&v, zeta, (size_t)1U, (size_t)9U);
7133 libcrux_ml_kem_vector_portable_ntt_ntt_step(&v, zeta, (size_t)2U,
7134 (size_t)10U);
7135 libcrux_ml_kem_vector_portable_ntt_ntt_step(&v, zeta, (size_t)3U,
7136 (size_t)11U);
7137 libcrux_ml_kem_vector_portable_ntt_ntt_step(&v, zeta, (size_t)4U,
7138 (size_t)12U);
7139 libcrux_ml_kem_vector_portable_ntt_ntt_step(&v, zeta, (size_t)5U,
7140 (size_t)13U);
7141 libcrux_ml_kem_vector_portable_ntt_ntt_step(&v, zeta, (size_t)6U,
7142 (size_t)14U);
7143 libcrux_ml_kem_vector_portable_ntt_ntt_step(&v, zeta, (size_t)7U,
7144 (size_t)15U);
7145 return v;
7146 }
7147
7148 /**
7149 This function found in impl {(libcrux_ml_kem::vector::traits::Operations for
7150 libcrux_ml_kem::vector::portable::vector_type::PortableVector)}
7151 */
7152 static inline libcrux_ml_kem_vector_portable_vector_type_PortableVector
libcrux_ml_kem_vector_portable_ntt_layer_3_step_0d(libcrux_ml_kem_vector_portable_vector_type_PortableVector a,int16_t zeta)7153 libcrux_ml_kem_vector_portable_ntt_layer_3_step_0d(
7154 libcrux_ml_kem_vector_portable_vector_type_PortableVector a, int16_t zeta) {
7155 return libcrux_ml_kem_vector_portable_ntt_ntt_layer_3_step(a, zeta);
7156 }
7157
libcrux_ml_kem_vector_portable_ntt_inv_ntt_step(libcrux_ml_kem_vector_portable_vector_type_PortableVector * v,int16_t zeta,size_t i,size_t j)7158 static KRML_MUSTINLINE void libcrux_ml_kem_vector_portable_ntt_inv_ntt_step(
7159 libcrux_ml_kem_vector_portable_vector_type_PortableVector *v, int16_t zeta,
7160 size_t i, size_t j) {
7161 int16_t a_minus_b = v->elements[j] - v->elements[i];
7162 v->elements[i] =
7163 libcrux_ml_kem_vector_portable_arithmetic_barrett_reduce_element(
7164 v->elements[i] + v->elements[j]);
7165 v->elements[j] =
7166 libcrux_ml_kem_vector_portable_arithmetic_montgomery_multiply_fe_by_fer(
7167 a_minus_b, zeta);
7168 }
7169
7170 static KRML_MUSTINLINE libcrux_ml_kem_vector_portable_vector_type_PortableVector
libcrux_ml_kem_vector_portable_ntt_inv_ntt_layer_1_step(libcrux_ml_kem_vector_portable_vector_type_PortableVector v,int16_t zeta0,int16_t zeta1,int16_t zeta2,int16_t zeta3)7171 libcrux_ml_kem_vector_portable_ntt_inv_ntt_layer_1_step(
7172 libcrux_ml_kem_vector_portable_vector_type_PortableVector v, int16_t zeta0,
7173 int16_t zeta1, int16_t zeta2, int16_t zeta3) {
7174 libcrux_ml_kem_vector_portable_ntt_inv_ntt_step(&v, zeta0, (size_t)0U,
7175 (size_t)2U);
7176 libcrux_ml_kem_vector_portable_ntt_inv_ntt_step(&v, zeta0, (size_t)1U,
7177 (size_t)3U);
7178 libcrux_ml_kem_vector_portable_ntt_inv_ntt_step(&v, zeta1, (size_t)4U,
7179 (size_t)6U);
7180 libcrux_ml_kem_vector_portable_ntt_inv_ntt_step(&v, zeta1, (size_t)5U,
7181 (size_t)7U);
7182 libcrux_ml_kem_vector_portable_ntt_inv_ntt_step(&v, zeta2, (size_t)8U,
7183 (size_t)10U);
7184 libcrux_ml_kem_vector_portable_ntt_inv_ntt_step(&v, zeta2, (size_t)9U,
7185 (size_t)11U);
7186 libcrux_ml_kem_vector_portable_ntt_inv_ntt_step(&v, zeta3, (size_t)12U,
7187 (size_t)14U);
7188 libcrux_ml_kem_vector_portable_ntt_inv_ntt_step(&v, zeta3, (size_t)13U,
7189 (size_t)15U);
7190 return v;
7191 }
7192
7193 /**
7194 This function found in impl {(libcrux_ml_kem::vector::traits::Operations for
7195 libcrux_ml_kem::vector::portable::vector_type::PortableVector)}
7196 */
7197 static inline libcrux_ml_kem_vector_portable_vector_type_PortableVector
libcrux_ml_kem_vector_portable_inv_ntt_layer_1_step_0d(libcrux_ml_kem_vector_portable_vector_type_PortableVector a,int16_t zeta0,int16_t zeta1,int16_t zeta2,int16_t zeta3)7198 libcrux_ml_kem_vector_portable_inv_ntt_layer_1_step_0d(
7199 libcrux_ml_kem_vector_portable_vector_type_PortableVector a, int16_t zeta0,
7200 int16_t zeta1, int16_t zeta2, int16_t zeta3) {
7201 return libcrux_ml_kem_vector_portable_ntt_inv_ntt_layer_1_step(
7202 a, zeta0, zeta1, zeta2, zeta3);
7203 }
7204
7205 static KRML_MUSTINLINE libcrux_ml_kem_vector_portable_vector_type_PortableVector
libcrux_ml_kem_vector_portable_ntt_inv_ntt_layer_2_step(libcrux_ml_kem_vector_portable_vector_type_PortableVector v,int16_t zeta0,int16_t zeta1)7206 libcrux_ml_kem_vector_portable_ntt_inv_ntt_layer_2_step(
7207 libcrux_ml_kem_vector_portable_vector_type_PortableVector v, int16_t zeta0,
7208 int16_t zeta1) {
7209 libcrux_ml_kem_vector_portable_ntt_inv_ntt_step(&v, zeta0, (size_t)0U,
7210 (size_t)4U);
7211 libcrux_ml_kem_vector_portable_ntt_inv_ntt_step(&v, zeta0, (size_t)1U,
7212 (size_t)5U);
7213 libcrux_ml_kem_vector_portable_ntt_inv_ntt_step(&v, zeta0, (size_t)2U,
7214 (size_t)6U);
7215 libcrux_ml_kem_vector_portable_ntt_inv_ntt_step(&v, zeta0, (size_t)3U,
7216 (size_t)7U);
7217 libcrux_ml_kem_vector_portable_ntt_inv_ntt_step(&v, zeta1, (size_t)8U,
7218 (size_t)12U);
7219 libcrux_ml_kem_vector_portable_ntt_inv_ntt_step(&v, zeta1, (size_t)9U,
7220 (size_t)13U);
7221 libcrux_ml_kem_vector_portable_ntt_inv_ntt_step(&v, zeta1, (size_t)10U,
7222 (size_t)14U);
7223 libcrux_ml_kem_vector_portable_ntt_inv_ntt_step(&v, zeta1, (size_t)11U,
7224 (size_t)15U);
7225 return v;
7226 }
7227
7228 /**
7229 This function found in impl {(libcrux_ml_kem::vector::traits::Operations for
7230 libcrux_ml_kem::vector::portable::vector_type::PortableVector)}
7231 */
7232 static inline libcrux_ml_kem_vector_portable_vector_type_PortableVector
libcrux_ml_kem_vector_portable_inv_ntt_layer_2_step_0d(libcrux_ml_kem_vector_portable_vector_type_PortableVector a,int16_t zeta0,int16_t zeta1)7233 libcrux_ml_kem_vector_portable_inv_ntt_layer_2_step_0d(
7234 libcrux_ml_kem_vector_portable_vector_type_PortableVector a, int16_t zeta0,
7235 int16_t zeta1) {
7236 return libcrux_ml_kem_vector_portable_ntt_inv_ntt_layer_2_step(a, zeta0,
7237 zeta1);
7238 }
7239
7240 static KRML_MUSTINLINE libcrux_ml_kem_vector_portable_vector_type_PortableVector
libcrux_ml_kem_vector_portable_ntt_inv_ntt_layer_3_step(libcrux_ml_kem_vector_portable_vector_type_PortableVector v,int16_t zeta)7241 libcrux_ml_kem_vector_portable_ntt_inv_ntt_layer_3_step(
7242 libcrux_ml_kem_vector_portable_vector_type_PortableVector v, int16_t zeta) {
7243 libcrux_ml_kem_vector_portable_ntt_inv_ntt_step(&v, zeta, (size_t)0U,
7244 (size_t)8U);
7245 libcrux_ml_kem_vector_portable_ntt_inv_ntt_step(&v, zeta, (size_t)1U,
7246 (size_t)9U);
7247 libcrux_ml_kem_vector_portable_ntt_inv_ntt_step(&v, zeta, (size_t)2U,
7248 (size_t)10U);
7249 libcrux_ml_kem_vector_portable_ntt_inv_ntt_step(&v, zeta, (size_t)3U,
7250 (size_t)11U);
7251 libcrux_ml_kem_vector_portable_ntt_inv_ntt_step(&v, zeta, (size_t)4U,
7252 (size_t)12U);
7253 libcrux_ml_kem_vector_portable_ntt_inv_ntt_step(&v, zeta, (size_t)5U,
7254 (size_t)13U);
7255 libcrux_ml_kem_vector_portable_ntt_inv_ntt_step(&v, zeta, (size_t)6U,
7256 (size_t)14U);
7257 libcrux_ml_kem_vector_portable_ntt_inv_ntt_step(&v, zeta, (size_t)7U,
7258 (size_t)15U);
7259 return v;
7260 }
7261
7262 /**
7263 This function found in impl {(libcrux_ml_kem::vector::traits::Operations for
7264 libcrux_ml_kem::vector::portable::vector_type::PortableVector)}
7265 */
7266 static inline libcrux_ml_kem_vector_portable_vector_type_PortableVector
libcrux_ml_kem_vector_portable_inv_ntt_layer_3_step_0d(libcrux_ml_kem_vector_portable_vector_type_PortableVector a,int16_t zeta)7267 libcrux_ml_kem_vector_portable_inv_ntt_layer_3_step_0d(
7268 libcrux_ml_kem_vector_portable_vector_type_PortableVector a, int16_t zeta) {
7269 return libcrux_ml_kem_vector_portable_ntt_inv_ntt_layer_3_step(a, zeta);
7270 }
7271
7272 /**
7273 Compute the product of two Kyber binomials with respect to the
7274 modulus `X² - zeta`.
7275
7276 This function almost implements <strong>Algorithm 11</strong> of the
7277 NIST FIPS 203 standard, which is reproduced below:
7278
7279 ```plaintext
7280 Input: a₀, a₁, b₀, b₁ ∈ ℤq.
7281 Input: γ ∈ ℤq.
7282 Output: c₀, c₁ ∈ ℤq.
7283
7284 c₀ ← a₀·b₀ + a₁·b₁·γ
7285 c₁ ← a₀·b₁ + a₁·b₀
7286 return c₀, c₁
7287 ```
7288 We say "almost" because the coefficients output by this function are in
7289 the Montgomery domain (unlike in the specification).
7290
7291 The NIST FIPS 203 standard can be found at
7292 <https://csrc.nist.gov/pubs/fips/203/ipd>.
7293 */
7294 static KRML_MUSTINLINE void
libcrux_ml_kem_vector_portable_ntt_ntt_multiply_binomials(libcrux_ml_kem_vector_portable_vector_type_PortableVector * a,libcrux_ml_kem_vector_portable_vector_type_PortableVector * b,int16_t zeta,size_t i,size_t j,libcrux_ml_kem_vector_portable_vector_type_PortableVector * out)7295 libcrux_ml_kem_vector_portable_ntt_ntt_multiply_binomials(
7296 libcrux_ml_kem_vector_portable_vector_type_PortableVector *a,
7297 libcrux_ml_kem_vector_portable_vector_type_PortableVector *b, int16_t zeta,
7298 size_t i, size_t j,
7299 libcrux_ml_kem_vector_portable_vector_type_PortableVector *out) {
7300 int16_t o0 = libcrux_ml_kem_vector_portable_arithmetic_montgomery_reduce_element(
7301 (int32_t)a->elements[i] * (int32_t)b->elements[i] +
7302 (int32_t)
7303 libcrux_ml_kem_vector_portable_arithmetic_montgomery_reduce_element(
7304 (int32_t)a->elements[j] * (int32_t)b->elements[j]) *
7305 (int32_t)zeta);
7306 int16_t o1 =
7307 libcrux_ml_kem_vector_portable_arithmetic_montgomery_reduce_element(
7308 (int32_t)a->elements[i] * (int32_t)b->elements[j] +
7309 (int32_t)a->elements[j] * (int32_t)b->elements[i]);
7310 out->elements[i] = o0;
7311 out->elements[j] = o1;
7312 }
7313
7314 static KRML_MUSTINLINE libcrux_ml_kem_vector_portable_vector_type_PortableVector
libcrux_ml_kem_vector_portable_ntt_ntt_multiply(libcrux_ml_kem_vector_portable_vector_type_PortableVector * lhs,libcrux_ml_kem_vector_portable_vector_type_PortableVector * rhs,int16_t zeta0,int16_t zeta1,int16_t zeta2,int16_t zeta3)7315 libcrux_ml_kem_vector_portable_ntt_ntt_multiply(
7316 libcrux_ml_kem_vector_portable_vector_type_PortableVector *lhs,
7317 libcrux_ml_kem_vector_portable_vector_type_PortableVector *rhs,
7318 int16_t zeta0, int16_t zeta1, int16_t zeta2, int16_t zeta3) {
7319 libcrux_ml_kem_vector_portable_vector_type_PortableVector out =
7320 libcrux_ml_kem_vector_portable_vector_type_zero();
7321 libcrux_ml_kem_vector_portable_ntt_ntt_multiply_binomials(
7322 lhs, rhs, zeta0, (size_t)0U, (size_t)1U, &out);
7323 libcrux_ml_kem_vector_portable_ntt_ntt_multiply_binomials(
7324 lhs, rhs, -zeta0, (size_t)2U, (size_t)3U, &out);
7325 libcrux_ml_kem_vector_portable_ntt_ntt_multiply_binomials(
7326 lhs, rhs, zeta1, (size_t)4U, (size_t)5U, &out);
7327 libcrux_ml_kem_vector_portable_ntt_ntt_multiply_binomials(
7328 lhs, rhs, -zeta1, (size_t)6U, (size_t)7U, &out);
7329 libcrux_ml_kem_vector_portable_ntt_ntt_multiply_binomials(
7330 lhs, rhs, zeta2, (size_t)8U, (size_t)9U, &out);
7331 libcrux_ml_kem_vector_portable_ntt_ntt_multiply_binomials(
7332 lhs, rhs, -zeta2, (size_t)10U, (size_t)11U, &out);
7333 libcrux_ml_kem_vector_portable_ntt_ntt_multiply_binomials(
7334 lhs, rhs, zeta3, (size_t)12U, (size_t)13U, &out);
7335 libcrux_ml_kem_vector_portable_ntt_ntt_multiply_binomials(
7336 lhs, rhs, -zeta3, (size_t)14U, (size_t)15U, &out);
7337 return out;
7338 }
7339
7340 /**
7341 This function found in impl {(libcrux_ml_kem::vector::traits::Operations for
7342 libcrux_ml_kem::vector::portable::vector_type::PortableVector)}
7343 */
7344 static inline libcrux_ml_kem_vector_portable_vector_type_PortableVector
libcrux_ml_kem_vector_portable_ntt_multiply_0d(libcrux_ml_kem_vector_portable_vector_type_PortableVector * lhs,libcrux_ml_kem_vector_portable_vector_type_PortableVector * rhs,int16_t zeta0,int16_t zeta1,int16_t zeta2,int16_t zeta3)7345 libcrux_ml_kem_vector_portable_ntt_multiply_0d(
7346 libcrux_ml_kem_vector_portable_vector_type_PortableVector *lhs,
7347 libcrux_ml_kem_vector_portable_vector_type_PortableVector *rhs,
7348 int16_t zeta0, int16_t zeta1, int16_t zeta2, int16_t zeta3) {
7349 return libcrux_ml_kem_vector_portable_ntt_ntt_multiply(lhs, rhs, zeta0, zeta1,
7350 zeta2, zeta3);
7351 }
7352
7353 static KRML_MUSTINLINE void
libcrux_ml_kem_vector_portable_serialize_serialize_1(libcrux_ml_kem_vector_portable_vector_type_PortableVector v,uint8_t ret[2U])7354 libcrux_ml_kem_vector_portable_serialize_serialize_1(
7355 libcrux_ml_kem_vector_portable_vector_type_PortableVector v,
7356 uint8_t ret[2U]) {
7357 uint8_t result[2U] = {0U};
7358 for (size_t i = (size_t)0U; i < (size_t)8U; i++) {
7359 size_t i0 = i;
7360 size_t uu____0 = (size_t)0U;
7361 result[uu____0] = (uint32_t)result[uu____0] |
7362 (uint32_t)(uint8_t)v.elements[i0] << (uint32_t)i0;
7363 }
7364 for (size_t i = (size_t)8U; i < (size_t)16U; i++) {
7365 size_t i0 = i;
7366 size_t uu____1 = (size_t)1U;
7367 result[uu____1] =
7368 (uint32_t)result[uu____1] | (uint32_t)(uint8_t)v.elements[i0]
7369 << (uint32_t)(i0 - (size_t)8U);
7370 }
7371 memcpy(ret, result, (size_t)2U * sizeof(uint8_t));
7372 }
7373
7374 /**
7375 This function found in impl {(libcrux_ml_kem::vector::traits::Operations for
7376 libcrux_ml_kem::vector::portable::vector_type::PortableVector)}
7377 */
libcrux_ml_kem_vector_portable_serialize_1_0d(libcrux_ml_kem_vector_portable_vector_type_PortableVector a,uint8_t ret[2U])7378 static inline void libcrux_ml_kem_vector_portable_serialize_1_0d(
7379 libcrux_ml_kem_vector_portable_vector_type_PortableVector a,
7380 uint8_t ret[2U]) {
7381 libcrux_ml_kem_vector_portable_serialize_serialize_1(a, ret);
7382 }
7383
7384 static KRML_MUSTINLINE libcrux_ml_kem_vector_portable_vector_type_PortableVector
libcrux_ml_kem_vector_portable_serialize_deserialize_1(Eurydice_slice v)7385 libcrux_ml_kem_vector_portable_serialize_deserialize_1(Eurydice_slice v) {
7386 libcrux_ml_kem_vector_portable_vector_type_PortableVector result =
7387 libcrux_ml_kem_vector_portable_vector_type_zero();
7388 for (size_t i = (size_t)0U; i < (size_t)8U; i++) {
7389 size_t i0 = i;
7390 result.elements[i0] = (int16_t)((uint32_t)Eurydice_slice_index(
7391 v, (size_t)0U, uint8_t, uint8_t *) >>
7392 (uint32_t)i0 &
7393 1U);
7394 }
7395 for (size_t i = (size_t)8U;
7396 i < LIBCRUX_ML_KEM_VECTOR_TRAITS_FIELD_ELEMENTS_IN_VECTOR; i++) {
7397 size_t i0 = i;
7398 result.elements[i0] = (int16_t)((uint32_t)Eurydice_slice_index(
7399 v, (size_t)1U, uint8_t, uint8_t *) >>
7400 (uint32_t)(i0 - (size_t)8U) &
7401 1U);
7402 }
7403 return result;
7404 }
7405
7406 /**
7407 This function found in impl {(libcrux_ml_kem::vector::traits::Operations for
7408 libcrux_ml_kem::vector::portable::vector_type::PortableVector)}
7409 */
7410 static inline libcrux_ml_kem_vector_portable_vector_type_PortableVector
libcrux_ml_kem_vector_portable_deserialize_1_0d(Eurydice_slice a)7411 libcrux_ml_kem_vector_portable_deserialize_1_0d(Eurydice_slice a) {
7412 return libcrux_ml_kem_vector_portable_serialize_deserialize_1(a);
7413 }
7414
7415 typedef struct uint8_t_x4_s {
7416 uint8_t fst;
7417 uint8_t snd;
7418 uint8_t thd;
7419 uint8_t f3;
7420 } uint8_t_x4;
7421
7422 static KRML_MUSTINLINE uint8_t_x4
libcrux_ml_kem_vector_portable_serialize_serialize_4_int(Eurydice_slice v)7423 libcrux_ml_kem_vector_portable_serialize_serialize_4_int(Eurydice_slice v) {
7424 uint8_t result0 =
7425 (uint32_t)(uint8_t)Eurydice_slice_index(v, (size_t)1U, int16_t, int16_t *)
7426 << 4U |
7427 (uint32_t)(uint8_t)Eurydice_slice_index(v, (size_t)0U, int16_t,
7428 int16_t *);
7429 uint8_t result1 =
7430 (uint32_t)(uint8_t)Eurydice_slice_index(v, (size_t)3U, int16_t, int16_t *)
7431 << 4U |
7432 (uint32_t)(uint8_t)Eurydice_slice_index(v, (size_t)2U, int16_t,
7433 int16_t *);
7434 uint8_t result2 =
7435 (uint32_t)(uint8_t)Eurydice_slice_index(v, (size_t)5U, int16_t, int16_t *)
7436 << 4U |
7437 (uint32_t)(uint8_t)Eurydice_slice_index(v, (size_t)4U, int16_t,
7438 int16_t *);
7439 uint8_t result3 =
7440 (uint32_t)(uint8_t)Eurydice_slice_index(v, (size_t)7U, int16_t, int16_t *)
7441 << 4U |
7442 (uint32_t)(uint8_t)Eurydice_slice_index(v, (size_t)6U, int16_t,
7443 int16_t *);
7444 return (CLITERAL(uint8_t_x4){
7445 .fst = result0, .snd = result1, .thd = result2, .f3 = result3});
7446 }
7447
7448 static KRML_MUSTINLINE void
libcrux_ml_kem_vector_portable_serialize_serialize_4(libcrux_ml_kem_vector_portable_vector_type_PortableVector v,uint8_t ret[8U])7449 libcrux_ml_kem_vector_portable_serialize_serialize_4(
7450 libcrux_ml_kem_vector_portable_vector_type_PortableVector v,
7451 uint8_t ret[8U]) {
7452 uint8_t_x4 result0_3 =
7453 libcrux_ml_kem_vector_portable_serialize_serialize_4_int(
7454 Eurydice_array_to_subslice2(v.elements, (size_t)0U, (size_t)8U,
7455 int16_t));
7456 uint8_t_x4 result4_7 =
7457 libcrux_ml_kem_vector_portable_serialize_serialize_4_int(
7458 Eurydice_array_to_subslice2(v.elements, (size_t)8U, (size_t)16U,
7459 int16_t));
7460 uint8_t result[8U] = {0U};
7461 result[0U] = result0_3.fst;
7462 result[1U] = result0_3.snd;
7463 result[2U] = result0_3.thd;
7464 result[3U] = result0_3.f3;
7465 result[4U] = result4_7.fst;
7466 result[5U] = result4_7.snd;
7467 result[6U] = result4_7.thd;
7468 result[7U] = result4_7.f3;
7469 memcpy(ret, result, (size_t)8U * sizeof(uint8_t));
7470 }
7471
7472 /**
7473 This function found in impl {(libcrux_ml_kem::vector::traits::Operations for
7474 libcrux_ml_kem::vector::portable::vector_type::PortableVector)}
7475 */
libcrux_ml_kem_vector_portable_serialize_4_0d(libcrux_ml_kem_vector_portable_vector_type_PortableVector a,uint8_t ret[8U])7476 static inline void libcrux_ml_kem_vector_portable_serialize_4_0d(
7477 libcrux_ml_kem_vector_portable_vector_type_PortableVector a,
7478 uint8_t ret[8U]) {
7479 libcrux_ml_kem_vector_portable_serialize_serialize_4(a, ret);
7480 }
7481
7482 static KRML_MUSTINLINE int16_t_x8
libcrux_ml_kem_vector_portable_serialize_deserialize_4_int(Eurydice_slice bytes)7483 libcrux_ml_kem_vector_portable_serialize_deserialize_4_int(
7484 Eurydice_slice bytes) {
7485 int16_t v0 = (int16_t)((uint32_t)Eurydice_slice_index(bytes, (size_t)0U,
7486 uint8_t, uint8_t *) &
7487 15U);
7488 int16_t v1 = (int16_t)((uint32_t)Eurydice_slice_index(bytes, (size_t)0U,
7489 uint8_t, uint8_t *) >>
7490 4U &
7491 15U);
7492 int16_t v2 = (int16_t)((uint32_t)Eurydice_slice_index(bytes, (size_t)1U,
7493 uint8_t, uint8_t *) &
7494 15U);
7495 int16_t v3 = (int16_t)((uint32_t)Eurydice_slice_index(bytes, (size_t)1U,
7496 uint8_t, uint8_t *) >>
7497 4U &
7498 15U);
7499 int16_t v4 = (int16_t)((uint32_t)Eurydice_slice_index(bytes, (size_t)2U,
7500 uint8_t, uint8_t *) &
7501 15U);
7502 int16_t v5 = (int16_t)((uint32_t)Eurydice_slice_index(bytes, (size_t)2U,
7503 uint8_t, uint8_t *) >>
7504 4U &
7505 15U);
7506 int16_t v6 = (int16_t)((uint32_t)Eurydice_slice_index(bytes, (size_t)3U,
7507 uint8_t, uint8_t *) &
7508 15U);
7509 int16_t v7 = (int16_t)((uint32_t)Eurydice_slice_index(bytes, (size_t)3U,
7510 uint8_t, uint8_t *) >>
7511 4U &
7512 15U);
7513 return (CLITERAL(int16_t_x8){.fst = v0,
7514 .snd = v1,
7515 .thd = v2,
7516 .f3 = v3,
7517 .f4 = v4,
7518 .f5 = v5,
7519 .f6 = v6,
7520 .f7 = v7});
7521 }
7522
7523 static KRML_MUSTINLINE libcrux_ml_kem_vector_portable_vector_type_PortableVector
libcrux_ml_kem_vector_portable_serialize_deserialize_4(Eurydice_slice bytes)7524 libcrux_ml_kem_vector_portable_serialize_deserialize_4(Eurydice_slice bytes) {
7525 int16_t_x8 v0_7 = libcrux_ml_kem_vector_portable_serialize_deserialize_4_int(
7526 Eurydice_slice_subslice2(bytes, (size_t)0U, (size_t)4U, uint8_t));
7527 int16_t_x8 v8_15 = libcrux_ml_kem_vector_portable_serialize_deserialize_4_int(
7528 Eurydice_slice_subslice2(bytes, (size_t)4U, (size_t)8U, uint8_t));
7529 libcrux_ml_kem_vector_portable_vector_type_PortableVector v =
7530 libcrux_ml_kem_vector_portable_vector_type_zero();
7531 v.elements[0U] = v0_7.fst;
7532 v.elements[1U] = v0_7.snd;
7533 v.elements[2U] = v0_7.thd;
7534 v.elements[3U] = v0_7.f3;
7535 v.elements[4U] = v0_7.f4;
7536 v.elements[5U] = v0_7.f5;
7537 v.elements[6U] = v0_7.f6;
7538 v.elements[7U] = v0_7.f7;
7539 v.elements[8U] = v8_15.fst;
7540 v.elements[9U] = v8_15.snd;
7541 v.elements[10U] = v8_15.thd;
7542 v.elements[11U] = v8_15.f3;
7543 v.elements[12U] = v8_15.f4;
7544 v.elements[13U] = v8_15.f5;
7545 v.elements[14U] = v8_15.f6;
7546 v.elements[15U] = v8_15.f7;
7547 return v;
7548 }
7549
7550 /**
7551 This function found in impl {(libcrux_ml_kem::vector::traits::Operations for
7552 libcrux_ml_kem::vector::portable::vector_type::PortableVector)}
7553 */
7554 static inline libcrux_ml_kem_vector_portable_vector_type_PortableVector
libcrux_ml_kem_vector_portable_deserialize_4_0d(Eurydice_slice a)7555 libcrux_ml_kem_vector_portable_deserialize_4_0d(Eurydice_slice a) {
7556 return libcrux_ml_kem_vector_portable_serialize_deserialize_4(a);
7557 }
7558
7559 typedef struct uint8_t_x5_s {
7560 uint8_t fst;
7561 uint8_t snd;
7562 uint8_t thd;
7563 uint8_t f3;
7564 uint8_t f4;
7565 } uint8_t_x5;
7566
7567 static KRML_MUSTINLINE uint8_t_x5
libcrux_ml_kem_vector_portable_serialize_serialize_5_int(Eurydice_slice v)7568 libcrux_ml_kem_vector_portable_serialize_serialize_5_int(Eurydice_slice v) {
7569 uint8_t r0 =
7570 (uint8_t)(Eurydice_slice_index(v, (size_t)0U, int16_t, int16_t *) |
7571 Eurydice_slice_index(v, (size_t)1U, int16_t, int16_t *) << 5U);
7572 uint8_t r1 =
7573 (uint8_t)((Eurydice_slice_index(v, (size_t)1U, int16_t, int16_t *) >> 3U |
7574 Eurydice_slice_index(v, (size_t)2U, int16_t, int16_t *)
7575 << 2U) |
7576 Eurydice_slice_index(v, (size_t)3U, int16_t, int16_t *) << 7U);
7577 uint8_t r2 =
7578 (uint8_t)(Eurydice_slice_index(v, (size_t)3U, int16_t, int16_t *) >> 1U |
7579 Eurydice_slice_index(v, (size_t)4U, int16_t, int16_t *) << 4U);
7580 uint8_t r3 =
7581 (uint8_t)((Eurydice_slice_index(v, (size_t)4U, int16_t, int16_t *) >> 4U |
7582 Eurydice_slice_index(v, (size_t)5U, int16_t, int16_t *)
7583 << 1U) |
7584 Eurydice_slice_index(v, (size_t)6U, int16_t, int16_t *) << 6U);
7585 uint8_t r4 =
7586 (uint8_t)(Eurydice_slice_index(v, (size_t)6U, int16_t, int16_t *) >> 2U |
7587 Eurydice_slice_index(v, (size_t)7U, int16_t, int16_t *) << 3U);
7588 return (CLITERAL(uint8_t_x5){
7589 .fst = r0, .snd = r1, .thd = r2, .f3 = r3, .f4 = r4});
7590 }
7591
7592 static KRML_MUSTINLINE void
libcrux_ml_kem_vector_portable_serialize_serialize_5(libcrux_ml_kem_vector_portable_vector_type_PortableVector v,uint8_t ret[10U])7593 libcrux_ml_kem_vector_portable_serialize_serialize_5(
7594 libcrux_ml_kem_vector_portable_vector_type_PortableVector v,
7595 uint8_t ret[10U]) {
7596 uint8_t_x5 r0_4 = libcrux_ml_kem_vector_portable_serialize_serialize_5_int(
7597 Eurydice_array_to_subslice2(v.elements, (size_t)0U, (size_t)8U, int16_t));
7598 uint8_t_x5 r5_9 = libcrux_ml_kem_vector_portable_serialize_serialize_5_int(
7599 Eurydice_array_to_subslice2(v.elements, (size_t)8U, (size_t)16U,
7600 int16_t));
7601 uint8_t result[10U] = {0U};
7602 result[0U] = r0_4.fst;
7603 result[1U] = r0_4.snd;
7604 result[2U] = r0_4.thd;
7605 result[3U] = r0_4.f3;
7606 result[4U] = r0_4.f4;
7607 result[5U] = r5_9.fst;
7608 result[6U] = r5_9.snd;
7609 result[7U] = r5_9.thd;
7610 result[8U] = r5_9.f3;
7611 result[9U] = r5_9.f4;
7612 memcpy(ret, result, (size_t)10U * sizeof(uint8_t));
7613 }
7614
7615 /**
7616 This function found in impl {(libcrux_ml_kem::vector::traits::Operations for
7617 libcrux_ml_kem::vector::portable::vector_type::PortableVector)}
7618 */
libcrux_ml_kem_vector_portable_serialize_5_0d(libcrux_ml_kem_vector_portable_vector_type_PortableVector a,uint8_t ret[10U])7619 static inline void libcrux_ml_kem_vector_portable_serialize_5_0d(
7620 libcrux_ml_kem_vector_portable_vector_type_PortableVector a,
7621 uint8_t ret[10U]) {
7622 libcrux_ml_kem_vector_portable_serialize_serialize_5(a, ret);
7623 }
7624
7625 static KRML_MUSTINLINE int16_t_x8
libcrux_ml_kem_vector_portable_serialize_deserialize_5_int(Eurydice_slice bytes)7626 libcrux_ml_kem_vector_portable_serialize_deserialize_5_int(
7627 Eurydice_slice bytes) {
7628 int16_t v0 = (int16_t)((uint32_t)Eurydice_slice_index(bytes, (size_t)0U,
7629 uint8_t, uint8_t *) &
7630 31U);
7631 int16_t v1 = (int16_t)(((uint32_t)Eurydice_slice_index(bytes, (size_t)1U,
7632 uint8_t, uint8_t *) &
7633 3U) << 3U |
7634 (uint32_t)Eurydice_slice_index(bytes, (size_t)0U,
7635 uint8_t, uint8_t *) >>
7636 5U);
7637 int16_t v2 = (int16_t)((uint32_t)Eurydice_slice_index(bytes, (size_t)1U,
7638 uint8_t, uint8_t *) >>
7639 2U &
7640 31U);
7641 int16_t v3 = (int16_t)(((uint32_t)Eurydice_slice_index(bytes, (size_t)2U,
7642 uint8_t, uint8_t *) &
7643 15U)
7644 << 1U |
7645 (uint32_t)Eurydice_slice_index(bytes, (size_t)1U,
7646 uint8_t, uint8_t *) >>
7647 7U);
7648 int16_t v4 = (int16_t)(((uint32_t)Eurydice_slice_index(bytes, (size_t)3U,
7649 uint8_t, uint8_t *) &
7650 1U) << 4U |
7651 (uint32_t)Eurydice_slice_index(bytes, (size_t)2U,
7652 uint8_t, uint8_t *) >>
7653 4U);
7654 int16_t v5 = (int16_t)((uint32_t)Eurydice_slice_index(bytes, (size_t)3U,
7655 uint8_t, uint8_t *) >>
7656 1U &
7657 31U);
7658 int16_t v6 = (int16_t)(((uint32_t)Eurydice_slice_index(bytes, (size_t)4U,
7659 uint8_t, uint8_t *) &
7660 7U) << 2U |
7661 (uint32_t)Eurydice_slice_index(bytes, (size_t)3U,
7662 uint8_t, uint8_t *) >>
7663 6U);
7664 int16_t v7 = (int16_t)((uint32_t)Eurydice_slice_index(bytes, (size_t)4U,
7665 uint8_t, uint8_t *) >>
7666 3U);
7667 return (CLITERAL(int16_t_x8){.fst = v0,
7668 .snd = v1,
7669 .thd = v2,
7670 .f3 = v3,
7671 .f4 = v4,
7672 .f5 = v5,
7673 .f6 = v6,
7674 .f7 = v7});
7675 }
7676
7677 static KRML_MUSTINLINE libcrux_ml_kem_vector_portable_vector_type_PortableVector
libcrux_ml_kem_vector_portable_serialize_deserialize_5(Eurydice_slice bytes)7678 libcrux_ml_kem_vector_portable_serialize_deserialize_5(Eurydice_slice bytes) {
7679 int16_t_x8 v0_7 = libcrux_ml_kem_vector_portable_serialize_deserialize_5_int(
7680 Eurydice_slice_subslice2(bytes, (size_t)0U, (size_t)5U, uint8_t));
7681 int16_t_x8 v8_15 = libcrux_ml_kem_vector_portable_serialize_deserialize_5_int(
7682 Eurydice_slice_subslice2(bytes, (size_t)5U, (size_t)10U, uint8_t));
7683 libcrux_ml_kem_vector_portable_vector_type_PortableVector v =
7684 libcrux_ml_kem_vector_portable_vector_type_zero();
7685 v.elements[0U] = v0_7.fst;
7686 v.elements[1U] = v0_7.snd;
7687 v.elements[2U] = v0_7.thd;
7688 v.elements[3U] = v0_7.f3;
7689 v.elements[4U] = v0_7.f4;
7690 v.elements[5U] = v0_7.f5;
7691 v.elements[6U] = v0_7.f6;
7692 v.elements[7U] = v0_7.f7;
7693 v.elements[8U] = v8_15.fst;
7694 v.elements[9U] = v8_15.snd;
7695 v.elements[10U] = v8_15.thd;
7696 v.elements[11U] = v8_15.f3;
7697 v.elements[12U] = v8_15.f4;
7698 v.elements[13U] = v8_15.f5;
7699 v.elements[14U] = v8_15.f6;
7700 v.elements[15U] = v8_15.f7;
7701 return v;
7702 }
7703
7704 /**
7705 This function found in impl {(libcrux_ml_kem::vector::traits::Operations for
7706 libcrux_ml_kem::vector::portable::vector_type::PortableVector)}
7707 */
7708 static inline libcrux_ml_kem_vector_portable_vector_type_PortableVector
libcrux_ml_kem_vector_portable_deserialize_5_0d(Eurydice_slice a)7709 libcrux_ml_kem_vector_portable_deserialize_5_0d(Eurydice_slice a) {
7710 return libcrux_ml_kem_vector_portable_serialize_deserialize_5(a);
7711 }
7712
7713 static KRML_MUSTINLINE uint8_t_x5
libcrux_ml_kem_vector_portable_serialize_serialize_10_int(Eurydice_slice v)7714 libcrux_ml_kem_vector_portable_serialize_serialize_10_int(Eurydice_slice v) {
7715 uint8_t r0 =
7716 (uint8_t)(Eurydice_slice_index(v, (size_t)0U, int16_t, int16_t *) &
7717 (int16_t)255);
7718 uint8_t r1 = (uint32_t)(uint8_t)(Eurydice_slice_index(v, (size_t)1U, int16_t,
7719 int16_t *) &
7720 (int16_t)63)
7721 << 2U |
7722 (uint32_t)(uint8_t)(Eurydice_slice_index(v, (size_t)0U, int16_t,
7723 int16_t *) >>
7724 8U &
7725 (int16_t)3);
7726 uint8_t r2 = (uint32_t)(uint8_t)(Eurydice_slice_index(v, (size_t)2U, int16_t,
7727 int16_t *) &
7728 (int16_t)15)
7729 << 4U |
7730 (uint32_t)(uint8_t)(Eurydice_slice_index(v, (size_t)1U, int16_t,
7731 int16_t *) >>
7732 6U &
7733 (int16_t)15);
7734 uint8_t r3 = (uint32_t)(uint8_t)(Eurydice_slice_index(v, (size_t)3U, int16_t,
7735 int16_t *) &
7736 (int16_t)3)
7737 << 6U |
7738 (uint32_t)(uint8_t)(Eurydice_slice_index(v, (size_t)2U, int16_t,
7739 int16_t *) >>
7740 4U &
7741 (int16_t)63);
7742 uint8_t r4 =
7743 (uint8_t)(Eurydice_slice_index(v, (size_t)3U, int16_t, int16_t *) >> 2U &
7744 (int16_t)255);
7745 return (CLITERAL(uint8_t_x5){
7746 .fst = r0, .snd = r1, .thd = r2, .f3 = r3, .f4 = r4});
7747 }
7748
7749 static KRML_MUSTINLINE void
libcrux_ml_kem_vector_portable_serialize_serialize_10(libcrux_ml_kem_vector_portable_vector_type_PortableVector v,uint8_t ret[20U])7750 libcrux_ml_kem_vector_portable_serialize_serialize_10(
7751 libcrux_ml_kem_vector_portable_vector_type_PortableVector v,
7752 uint8_t ret[20U]) {
7753 uint8_t_x5 r0_4 = libcrux_ml_kem_vector_portable_serialize_serialize_10_int(
7754 Eurydice_array_to_subslice2(v.elements, (size_t)0U, (size_t)4U, int16_t));
7755 uint8_t_x5 r5_9 = libcrux_ml_kem_vector_portable_serialize_serialize_10_int(
7756 Eurydice_array_to_subslice2(v.elements, (size_t)4U, (size_t)8U, int16_t));
7757 uint8_t_x5 r10_14 = libcrux_ml_kem_vector_portable_serialize_serialize_10_int(
7758 Eurydice_array_to_subslice2(v.elements, (size_t)8U, (size_t)12U,
7759 int16_t));
7760 uint8_t_x5 r15_19 = libcrux_ml_kem_vector_portable_serialize_serialize_10_int(
7761 Eurydice_array_to_subslice2(v.elements, (size_t)12U, (size_t)16U,
7762 int16_t));
7763 uint8_t result[20U] = {0U};
7764 result[0U] = r0_4.fst;
7765 result[1U] = r0_4.snd;
7766 result[2U] = r0_4.thd;
7767 result[3U] = r0_4.f3;
7768 result[4U] = r0_4.f4;
7769 result[5U] = r5_9.fst;
7770 result[6U] = r5_9.snd;
7771 result[7U] = r5_9.thd;
7772 result[8U] = r5_9.f3;
7773 result[9U] = r5_9.f4;
7774 result[10U] = r10_14.fst;
7775 result[11U] = r10_14.snd;
7776 result[12U] = r10_14.thd;
7777 result[13U] = r10_14.f3;
7778 result[14U] = r10_14.f4;
7779 result[15U] = r15_19.fst;
7780 result[16U] = r15_19.snd;
7781 result[17U] = r15_19.thd;
7782 result[18U] = r15_19.f3;
7783 result[19U] = r15_19.f4;
7784 memcpy(ret, result, (size_t)20U * sizeof(uint8_t));
7785 }
7786
7787 /**
7788 This function found in impl {(libcrux_ml_kem::vector::traits::Operations for
7789 libcrux_ml_kem::vector::portable::vector_type::PortableVector)}
7790 */
libcrux_ml_kem_vector_portable_serialize_10_0d(libcrux_ml_kem_vector_portable_vector_type_PortableVector a,uint8_t ret[20U])7791 static inline void libcrux_ml_kem_vector_portable_serialize_10_0d(
7792 libcrux_ml_kem_vector_portable_vector_type_PortableVector a,
7793 uint8_t ret[20U]) {
7794 libcrux_ml_kem_vector_portable_serialize_serialize_10(a, ret);
7795 }
7796
7797 static KRML_MUSTINLINE int16_t_x8
libcrux_ml_kem_vector_portable_serialize_deserialize_10_int(Eurydice_slice bytes)7798 libcrux_ml_kem_vector_portable_serialize_deserialize_10_int(
7799 Eurydice_slice bytes) {
7800 int16_t r0 =
7801 ((int16_t)Eurydice_slice_index(bytes, (size_t)1U, uint8_t, uint8_t *) &
7802 (int16_t)3)
7803 << 8U |
7804 ((int16_t)Eurydice_slice_index(bytes, (size_t)0U, uint8_t, uint8_t *) &
7805 (int16_t)255);
7806 int16_t r1 =
7807 ((int16_t)Eurydice_slice_index(bytes, (size_t)2U, uint8_t, uint8_t *) &
7808 (int16_t)15)
7809 << 6U |
7810 (int16_t)Eurydice_slice_index(bytes, (size_t)1U, uint8_t, uint8_t *) >>
7811 2U;
7812 int16_t r2 =
7813 ((int16_t)Eurydice_slice_index(bytes, (size_t)3U, uint8_t, uint8_t *) &
7814 (int16_t)63)
7815 << 4U |
7816 (int16_t)Eurydice_slice_index(bytes, (size_t)2U, uint8_t, uint8_t *) >>
7817 4U;
7818 int16_t r3 =
7819 (int16_t)Eurydice_slice_index(bytes, (size_t)4U, uint8_t, uint8_t *)
7820 << 2U |
7821 (int16_t)Eurydice_slice_index(bytes, (size_t)3U, uint8_t, uint8_t *) >>
7822 6U;
7823 int16_t r4 =
7824 ((int16_t)Eurydice_slice_index(bytes, (size_t)6U, uint8_t, uint8_t *) &
7825 (int16_t)3)
7826 << 8U |
7827 ((int16_t)Eurydice_slice_index(bytes, (size_t)5U, uint8_t, uint8_t *) &
7828 (int16_t)255);
7829 int16_t r5 =
7830 ((int16_t)Eurydice_slice_index(bytes, (size_t)7U, uint8_t, uint8_t *) &
7831 (int16_t)15)
7832 << 6U |
7833 (int16_t)Eurydice_slice_index(bytes, (size_t)6U, uint8_t, uint8_t *) >>
7834 2U;
7835 int16_t r6 =
7836 ((int16_t)Eurydice_slice_index(bytes, (size_t)8U, uint8_t, uint8_t *) &
7837 (int16_t)63)
7838 << 4U |
7839 (int16_t)Eurydice_slice_index(bytes, (size_t)7U, uint8_t, uint8_t *) >>
7840 4U;
7841 int16_t r7 =
7842 (int16_t)Eurydice_slice_index(bytes, (size_t)9U, uint8_t, uint8_t *)
7843 << 2U |
7844 (int16_t)Eurydice_slice_index(bytes, (size_t)8U, uint8_t, uint8_t *) >>
7845 6U;
7846 return (CLITERAL(int16_t_x8){.fst = r0,
7847 .snd = r1,
7848 .thd = r2,
7849 .f3 = r3,
7850 .f4 = r4,
7851 .f5 = r5,
7852 .f6 = r6,
7853 .f7 = r7});
7854 }
7855
7856 static KRML_MUSTINLINE libcrux_ml_kem_vector_portable_vector_type_PortableVector
libcrux_ml_kem_vector_portable_serialize_deserialize_10(Eurydice_slice bytes)7857 libcrux_ml_kem_vector_portable_serialize_deserialize_10(Eurydice_slice bytes) {
7858 int16_t_x8 v0_7 = libcrux_ml_kem_vector_portable_serialize_deserialize_10_int(
7859 Eurydice_slice_subslice2(bytes, (size_t)0U, (size_t)10U, uint8_t));
7860 int16_t_x8 v8_15 =
7861 libcrux_ml_kem_vector_portable_serialize_deserialize_10_int(
7862 Eurydice_slice_subslice2(bytes, (size_t)10U, (size_t)20U, uint8_t));
7863 libcrux_ml_kem_vector_portable_vector_type_PortableVector v =
7864 libcrux_ml_kem_vector_portable_vector_type_zero();
7865 v.elements[0U] = v0_7.fst;
7866 v.elements[1U] = v0_7.snd;
7867 v.elements[2U] = v0_7.thd;
7868 v.elements[3U] = v0_7.f3;
7869 v.elements[4U] = v0_7.f4;
7870 v.elements[5U] = v0_7.f5;
7871 v.elements[6U] = v0_7.f6;
7872 v.elements[7U] = v0_7.f7;
7873 v.elements[8U] = v8_15.fst;
7874 v.elements[9U] = v8_15.snd;
7875 v.elements[10U] = v8_15.thd;
7876 v.elements[11U] = v8_15.f3;
7877 v.elements[12U] = v8_15.f4;
7878 v.elements[13U] = v8_15.f5;
7879 v.elements[14U] = v8_15.f6;
7880 v.elements[15U] = v8_15.f7;
7881 return v;
7882 }
7883
7884 /**
7885 This function found in impl {(libcrux_ml_kem::vector::traits::Operations for
7886 libcrux_ml_kem::vector::portable::vector_type::PortableVector)}
7887 */
7888 static inline libcrux_ml_kem_vector_portable_vector_type_PortableVector
libcrux_ml_kem_vector_portable_deserialize_10_0d(Eurydice_slice a)7889 libcrux_ml_kem_vector_portable_deserialize_10_0d(Eurydice_slice a) {
7890 return libcrux_ml_kem_vector_portable_serialize_deserialize_10(a);
7891 }
7892
7893 typedef struct uint8_t_x3_s {
7894 uint8_t fst;
7895 uint8_t snd;
7896 uint8_t thd;
7897 } uint8_t_x3;
7898
7899 static KRML_MUSTINLINE uint8_t_x3
libcrux_ml_kem_vector_portable_serialize_serialize_12_int(Eurydice_slice v)7900 libcrux_ml_kem_vector_portable_serialize_serialize_12_int(Eurydice_slice v) {
7901 uint8_t r0 =
7902 (uint8_t)(Eurydice_slice_index(v, (size_t)0U, int16_t, int16_t *) &
7903 (int16_t)255);
7904 uint8_t r1 =
7905 (uint8_t)(Eurydice_slice_index(v, (size_t)0U, int16_t, int16_t *) >> 8U |
7906 (Eurydice_slice_index(v, (size_t)1U, int16_t, int16_t *) &
7907 (int16_t)15)
7908 << 4U);
7909 uint8_t r2 =
7910 (uint8_t)(Eurydice_slice_index(v, (size_t)1U, int16_t, int16_t *) >> 4U &
7911 (int16_t)255);
7912 return (CLITERAL(uint8_t_x3){.fst = r0, .snd = r1, .thd = r2});
7913 }
7914
7915 static KRML_MUSTINLINE void
libcrux_ml_kem_vector_portable_serialize_serialize_12(libcrux_ml_kem_vector_portable_vector_type_PortableVector v,uint8_t ret[24U])7916 libcrux_ml_kem_vector_portable_serialize_serialize_12(
7917 libcrux_ml_kem_vector_portable_vector_type_PortableVector v,
7918 uint8_t ret[24U]) {
7919 uint8_t_x3 r0_2 = libcrux_ml_kem_vector_portable_serialize_serialize_12_int(
7920 Eurydice_array_to_subslice2(v.elements, (size_t)0U, (size_t)2U, int16_t));
7921 uint8_t_x3 r3_5 = libcrux_ml_kem_vector_portable_serialize_serialize_12_int(
7922 Eurydice_array_to_subslice2(v.elements, (size_t)2U, (size_t)4U, int16_t));
7923 uint8_t_x3 r6_8 = libcrux_ml_kem_vector_portable_serialize_serialize_12_int(
7924 Eurydice_array_to_subslice2(v.elements, (size_t)4U, (size_t)6U, int16_t));
7925 uint8_t_x3 r9_11 = libcrux_ml_kem_vector_portable_serialize_serialize_12_int(
7926 Eurydice_array_to_subslice2(v.elements, (size_t)6U, (size_t)8U, int16_t));
7927 uint8_t_x3 r12_14 = libcrux_ml_kem_vector_portable_serialize_serialize_12_int(
7928 Eurydice_array_to_subslice2(v.elements, (size_t)8U, (size_t)10U,
7929 int16_t));
7930 uint8_t_x3 r15_17 = libcrux_ml_kem_vector_portable_serialize_serialize_12_int(
7931 Eurydice_array_to_subslice2(v.elements, (size_t)10U, (size_t)12U,
7932 int16_t));
7933 uint8_t_x3 r18_20 = libcrux_ml_kem_vector_portable_serialize_serialize_12_int(
7934 Eurydice_array_to_subslice2(v.elements, (size_t)12U, (size_t)14U,
7935 int16_t));
7936 uint8_t_x3 r21_23 = libcrux_ml_kem_vector_portable_serialize_serialize_12_int(
7937 Eurydice_array_to_subslice2(v.elements, (size_t)14U, (size_t)16U,
7938 int16_t));
7939 uint8_t result[24U] = {0U};
7940 result[0U] = r0_2.fst;
7941 result[1U] = r0_2.snd;
7942 result[2U] = r0_2.thd;
7943 result[3U] = r3_5.fst;
7944 result[4U] = r3_5.snd;
7945 result[5U] = r3_5.thd;
7946 result[6U] = r6_8.fst;
7947 result[7U] = r6_8.snd;
7948 result[8U] = r6_8.thd;
7949 result[9U] = r9_11.fst;
7950 result[10U] = r9_11.snd;
7951 result[11U] = r9_11.thd;
7952 result[12U] = r12_14.fst;
7953 result[13U] = r12_14.snd;
7954 result[14U] = r12_14.thd;
7955 result[15U] = r15_17.fst;
7956 result[16U] = r15_17.snd;
7957 result[17U] = r15_17.thd;
7958 result[18U] = r18_20.fst;
7959 result[19U] = r18_20.snd;
7960 result[20U] = r18_20.thd;
7961 result[21U] = r21_23.fst;
7962 result[22U] = r21_23.snd;
7963 result[23U] = r21_23.thd;
7964 memcpy(ret, result, (size_t)24U * sizeof(uint8_t));
7965 }
7966
7967 /**
7968 This function found in impl {(libcrux_ml_kem::vector::traits::Operations for
7969 libcrux_ml_kem::vector::portable::vector_type::PortableVector)}
7970 */
libcrux_ml_kem_vector_portable_serialize_12_0d(libcrux_ml_kem_vector_portable_vector_type_PortableVector a,uint8_t ret[24U])7971 static inline void libcrux_ml_kem_vector_portable_serialize_12_0d(
7972 libcrux_ml_kem_vector_portable_vector_type_PortableVector a,
7973 uint8_t ret[24U]) {
7974 libcrux_ml_kem_vector_portable_serialize_serialize_12(a, ret);
7975 }
7976
7977 typedef struct int16_t_x2_s {
7978 int16_t fst;
7979 int16_t snd;
7980 } int16_t_x2;
7981
7982 static KRML_MUSTINLINE int16_t_x2
libcrux_ml_kem_vector_portable_serialize_deserialize_12_int(Eurydice_slice bytes)7983 libcrux_ml_kem_vector_portable_serialize_deserialize_12_int(
7984 Eurydice_slice bytes) {
7985 int16_t byte0 =
7986 (int16_t)Eurydice_slice_index(bytes, (size_t)0U, uint8_t, uint8_t *);
7987 int16_t byte1 =
7988 (int16_t)Eurydice_slice_index(bytes, (size_t)1U, uint8_t, uint8_t *);
7989 int16_t byte2 =
7990 (int16_t)Eurydice_slice_index(bytes, (size_t)2U, uint8_t, uint8_t *);
7991 int16_t r0 = (byte1 & (int16_t)15) << 8U | (byte0 & (int16_t)255);
7992 int16_t r1 = byte2 << 4U | (byte1 >> 4U & (int16_t)15);
7993 return (CLITERAL(int16_t_x2){.fst = r0, .snd = r1});
7994 }
7995
7996 static KRML_MUSTINLINE libcrux_ml_kem_vector_portable_vector_type_PortableVector
libcrux_ml_kem_vector_portable_serialize_deserialize_12(Eurydice_slice bytes)7997 libcrux_ml_kem_vector_portable_serialize_deserialize_12(Eurydice_slice bytes) {
7998 int16_t_x2 v0_1 = libcrux_ml_kem_vector_portable_serialize_deserialize_12_int(
7999 Eurydice_slice_subslice2(bytes, (size_t)0U, (size_t)3U, uint8_t));
8000 int16_t_x2 v2_3 = libcrux_ml_kem_vector_portable_serialize_deserialize_12_int(
8001 Eurydice_slice_subslice2(bytes, (size_t)3U, (size_t)6U, uint8_t));
8002 int16_t_x2 v4_5 = libcrux_ml_kem_vector_portable_serialize_deserialize_12_int(
8003 Eurydice_slice_subslice2(bytes, (size_t)6U, (size_t)9U, uint8_t));
8004 int16_t_x2 v6_7 = libcrux_ml_kem_vector_portable_serialize_deserialize_12_int(
8005 Eurydice_slice_subslice2(bytes, (size_t)9U, (size_t)12U, uint8_t));
8006 int16_t_x2 v8_9 = libcrux_ml_kem_vector_portable_serialize_deserialize_12_int(
8007 Eurydice_slice_subslice2(bytes, (size_t)12U, (size_t)15U, uint8_t));
8008 int16_t_x2 v10_11 =
8009 libcrux_ml_kem_vector_portable_serialize_deserialize_12_int(
8010 Eurydice_slice_subslice2(bytes, (size_t)15U, (size_t)18U, uint8_t));
8011 int16_t_x2 v12_13 =
8012 libcrux_ml_kem_vector_portable_serialize_deserialize_12_int(
8013 Eurydice_slice_subslice2(bytes, (size_t)18U, (size_t)21U, uint8_t));
8014 int16_t_x2 v14_15 =
8015 libcrux_ml_kem_vector_portable_serialize_deserialize_12_int(
8016 Eurydice_slice_subslice2(bytes, (size_t)21U, (size_t)24U, uint8_t));
8017 libcrux_ml_kem_vector_portable_vector_type_PortableVector re =
8018 libcrux_ml_kem_vector_portable_vector_type_zero();
8019 re.elements[0U] = v0_1.fst;
8020 re.elements[1U] = v0_1.snd;
8021 re.elements[2U] = v2_3.fst;
8022 re.elements[3U] = v2_3.snd;
8023 re.elements[4U] = v4_5.fst;
8024 re.elements[5U] = v4_5.snd;
8025 re.elements[6U] = v6_7.fst;
8026 re.elements[7U] = v6_7.snd;
8027 re.elements[8U] = v8_9.fst;
8028 re.elements[9U] = v8_9.snd;
8029 re.elements[10U] = v10_11.fst;
8030 re.elements[11U] = v10_11.snd;
8031 re.elements[12U] = v12_13.fst;
8032 re.elements[13U] = v12_13.snd;
8033 re.elements[14U] = v14_15.fst;
8034 re.elements[15U] = v14_15.snd;
8035 return re;
8036 }
8037
8038 /**
8039 This function found in impl {(libcrux_ml_kem::vector::traits::Operations for
8040 libcrux_ml_kem::vector::portable::vector_type::PortableVector)}
8041 */
8042 static inline libcrux_ml_kem_vector_portable_vector_type_PortableVector
libcrux_ml_kem_vector_portable_deserialize_12_0d(Eurydice_slice a)8043 libcrux_ml_kem_vector_portable_deserialize_12_0d(Eurydice_slice a) {
8044 return libcrux_ml_kem_vector_portable_serialize_deserialize_12(a);
8045 }
8046
8047 static KRML_MUSTINLINE size_t
libcrux_ml_kem_vector_portable_sampling_rej_sample(Eurydice_slice a,Eurydice_slice result)8048 libcrux_ml_kem_vector_portable_sampling_rej_sample(Eurydice_slice a,
8049 Eurydice_slice result) {
8050 size_t sampled = (size_t)0U;
8051 for (size_t i = (size_t)0U; i < Eurydice_slice_len(a, uint8_t) / (size_t)3U;
8052 i++) {
8053 size_t i0 = i;
8054 int16_t b1 = (int16_t)Eurydice_slice_index(a, i0 * (size_t)3U + (size_t)0U,
8055 uint8_t, uint8_t *);
8056 int16_t b2 = (int16_t)Eurydice_slice_index(a, i0 * (size_t)3U + (size_t)1U,
8057 uint8_t, uint8_t *);
8058 int16_t b3 = (int16_t)Eurydice_slice_index(a, i0 * (size_t)3U + (size_t)2U,
8059 uint8_t, uint8_t *);
8060 int16_t d1 = (b2 & (int16_t)15) << 8U | b1;
8061 int16_t d2 = b3 << 4U | b2 >> 4U;
8062 bool uu____0;
8063 int16_t uu____1;
8064 bool uu____2;
8065 size_t uu____3;
8066 int16_t uu____4;
8067 size_t uu____5;
8068 int16_t uu____6;
8069 if (d1 < LIBCRUX_ML_KEM_VECTOR_TRAITS_FIELD_MODULUS) {
8070 if (sampled < (size_t)16U) {
8071 Eurydice_slice_index(result, sampled, int16_t, int16_t *) = d1;
8072 sampled++;
8073 uu____1 = d2;
8074 uu____6 = LIBCRUX_ML_KEM_VECTOR_TRAITS_FIELD_MODULUS;
8075 uu____0 = uu____1 < uu____6;
8076 if (uu____0) {
8077 uu____3 = sampled;
8078 uu____2 = uu____3 < (size_t)16U;
8079 if (uu____2) {
8080 uu____4 = d2;
8081 uu____5 = sampled;
8082 Eurydice_slice_index(result, uu____5, int16_t, int16_t *) = uu____4;
8083 sampled++;
8084 continue;
8085 }
8086 }
8087 continue;
8088 }
8089 }
8090 uu____1 = d2;
8091 uu____6 = LIBCRUX_ML_KEM_VECTOR_TRAITS_FIELD_MODULUS;
8092 uu____0 = uu____1 < uu____6;
8093 if (uu____0) {
8094 uu____3 = sampled;
8095 uu____2 = uu____3 < (size_t)16U;
8096 if (uu____2) {
8097 uu____4 = d2;
8098 uu____5 = sampled;
8099 Eurydice_slice_index(result, uu____5, int16_t, int16_t *) = uu____4;
8100 sampled++;
8101 continue;
8102 }
8103 }
8104 }
8105 return sampled;
8106 }
8107
8108 /**
8109 This function found in impl {(libcrux_ml_kem::vector::traits::Operations for
8110 libcrux_ml_kem::vector::portable::vector_type::PortableVector)}
8111 */
libcrux_ml_kem_vector_portable_rej_sample_0d(Eurydice_slice a,Eurydice_slice out)8112 static inline size_t libcrux_ml_kem_vector_portable_rej_sample_0d(
8113 Eurydice_slice a, Eurydice_slice out) {
8114 return libcrux_ml_kem_vector_portable_sampling_rej_sample(a, out);
8115 }
8116
8117 #define LIBCRUX_ML_KEM_MLKEM768_VECTOR_U_COMPRESSION_FACTOR_768 ((size_t)10U)
8118
8119 #define LIBCRUX_ML_KEM_MLKEM768_C1_BLOCK_SIZE_768 \
8120 (LIBCRUX_ML_KEM_CONSTANTS_COEFFICIENTS_IN_RING_ELEMENT * \
8121 LIBCRUX_ML_KEM_MLKEM768_VECTOR_U_COMPRESSION_FACTOR_768 / (size_t)8U)
8122
8123 #define LIBCRUX_ML_KEM_MLKEM768_RANK_768 ((size_t)3U)
8124
8125 #define LIBCRUX_ML_KEM_MLKEM768_C1_SIZE_768 \
8126 (LIBCRUX_ML_KEM_MLKEM768_C1_BLOCK_SIZE_768 * LIBCRUX_ML_KEM_MLKEM768_RANK_768)
8127
8128 #define LIBCRUX_ML_KEM_MLKEM768_VECTOR_V_COMPRESSION_FACTOR_768 ((size_t)4U)
8129
8130 #define LIBCRUX_ML_KEM_MLKEM768_C2_SIZE_768 \
8131 (LIBCRUX_ML_KEM_CONSTANTS_COEFFICIENTS_IN_RING_ELEMENT * \
8132 LIBCRUX_ML_KEM_MLKEM768_VECTOR_V_COMPRESSION_FACTOR_768 / (size_t)8U)
8133
8134 #define LIBCRUX_ML_KEM_MLKEM768_CPA_PKE_CIPHERTEXT_SIZE_768 \
8135 (LIBCRUX_ML_KEM_MLKEM768_C1_SIZE_768 + LIBCRUX_ML_KEM_MLKEM768_C2_SIZE_768)
8136
8137 #define LIBCRUX_ML_KEM_MLKEM768_T_AS_NTT_ENCODED_SIZE_768 \
8138 (LIBCRUX_ML_KEM_MLKEM768_RANK_768 * \
8139 LIBCRUX_ML_KEM_CONSTANTS_COEFFICIENTS_IN_RING_ELEMENT * \
8140 LIBCRUX_ML_KEM_CONSTANTS_BITS_PER_COEFFICIENT / (size_t)8U)
8141
8142 #define LIBCRUX_ML_KEM_MLKEM768_CPA_PKE_PUBLIC_KEY_SIZE_768 \
8143 (LIBCRUX_ML_KEM_MLKEM768_T_AS_NTT_ENCODED_SIZE_768 + (size_t)32U)
8144
8145 #define LIBCRUX_ML_KEM_MLKEM768_CPA_PKE_SECRET_KEY_SIZE_768 \
8146 (LIBCRUX_ML_KEM_MLKEM768_RANK_768 * \
8147 LIBCRUX_ML_KEM_CONSTANTS_COEFFICIENTS_IN_RING_ELEMENT * \
8148 LIBCRUX_ML_KEM_CONSTANTS_BITS_PER_COEFFICIENT / (size_t)8U)
8149
8150 #define LIBCRUX_ML_KEM_MLKEM768_ETA1 ((size_t)2U)
8151
8152 #define LIBCRUX_ML_KEM_MLKEM768_ETA1_RANDOMNESS_SIZE \
8153 (LIBCRUX_ML_KEM_MLKEM768_ETA1 * (size_t)64U)
8154
8155 #define LIBCRUX_ML_KEM_MLKEM768_ETA2 ((size_t)2U)
8156
8157 #define LIBCRUX_ML_KEM_MLKEM768_ETA2_RANDOMNESS_SIZE \
8158 (LIBCRUX_ML_KEM_MLKEM768_ETA2 * (size_t)64U)
8159
8160 #define LIBCRUX_ML_KEM_MLKEM768_IMPLICIT_REJECTION_HASH_INPUT_SIZE \
8161 (LIBCRUX_ML_KEM_CONSTANTS_SHARED_SECRET_SIZE + \
8162 LIBCRUX_ML_KEM_MLKEM768_CPA_PKE_CIPHERTEXT_SIZE_768)
8163
8164 typedef libcrux_ml_kem_types_MlKemPrivateKey_55
8165 libcrux_ml_kem_mlkem768_MlKem768PrivateKey;
8166
8167 typedef libcrux_ml_kem_types_MlKemPublicKey_15
8168 libcrux_ml_kem_mlkem768_MlKem768PublicKey;
8169
8170 #define LIBCRUX_ML_KEM_MLKEM768_RANKED_BYTES_PER_RING_ELEMENT_768 \
8171 (LIBCRUX_ML_KEM_MLKEM768_RANK_768 * \
8172 LIBCRUX_ML_KEM_CONSTANTS_BITS_PER_RING_ELEMENT / (size_t)8U)
8173
8174 #define LIBCRUX_ML_KEM_MLKEM768_SECRET_KEY_SIZE_768 \
8175 (LIBCRUX_ML_KEM_MLKEM768_CPA_PKE_SECRET_KEY_SIZE_768 + \
8176 LIBCRUX_ML_KEM_MLKEM768_CPA_PKE_PUBLIC_KEY_SIZE_768 + \
8177 LIBCRUX_ML_KEM_CONSTANTS_H_DIGEST_SIZE + \
8178 LIBCRUX_ML_KEM_CONSTANTS_SHARED_SECRET_SIZE)
8179
8180 /**
8181 A monomorphic instance of libcrux_ml_kem.polynomial.PolynomialRingElement
8182 with types libcrux_ml_kem_vector_portable_vector_type_PortableVector
8183
8184 */
8185 typedef struct libcrux_ml_kem_polynomial_PolynomialRingElement_f0_s {
8186 libcrux_ml_kem_vector_portable_vector_type_PortableVector coefficients[16U];
8187 } libcrux_ml_kem_polynomial_PolynomialRingElement_f0;
8188
8189 /**
8190 This function found in impl
8191 {libcrux_ml_kem::polynomial::PolynomialRingElement<Vector>[TraitClause@0]}
8192 */
8193 /**
8194 A monomorphic instance of libcrux_ml_kem.polynomial.ZERO_89
8195 with types libcrux_ml_kem_vector_portable_vector_type_PortableVector
8196 with const generics
8197
8198 */
8199 static inline libcrux_ml_kem_polynomial_PolynomialRingElement_f0
libcrux_ml_kem_polynomial_ZERO_89_ea(void)8200 libcrux_ml_kem_polynomial_ZERO_89_ea(void) {
8201 libcrux_ml_kem_polynomial_PolynomialRingElement_f0 lit;
8202 lit.coefficients[0U] = libcrux_ml_kem_vector_portable_ZERO_0d();
8203 lit.coefficients[1U] = libcrux_ml_kem_vector_portable_ZERO_0d();
8204 lit.coefficients[2U] = libcrux_ml_kem_vector_portable_ZERO_0d();
8205 lit.coefficients[3U] = libcrux_ml_kem_vector_portable_ZERO_0d();
8206 lit.coefficients[4U] = libcrux_ml_kem_vector_portable_ZERO_0d();
8207 lit.coefficients[5U] = libcrux_ml_kem_vector_portable_ZERO_0d();
8208 lit.coefficients[6U] = libcrux_ml_kem_vector_portable_ZERO_0d();
8209 lit.coefficients[7U] = libcrux_ml_kem_vector_portable_ZERO_0d();
8210 lit.coefficients[8U] = libcrux_ml_kem_vector_portable_ZERO_0d();
8211 lit.coefficients[9U] = libcrux_ml_kem_vector_portable_ZERO_0d();
8212 lit.coefficients[10U] = libcrux_ml_kem_vector_portable_ZERO_0d();
8213 lit.coefficients[11U] = libcrux_ml_kem_vector_portable_ZERO_0d();
8214 lit.coefficients[12U] = libcrux_ml_kem_vector_portable_ZERO_0d();
8215 lit.coefficients[13U] = libcrux_ml_kem_vector_portable_ZERO_0d();
8216 lit.coefficients[14U] = libcrux_ml_kem_vector_portable_ZERO_0d();
8217 lit.coefficients[15U] = libcrux_ml_kem_vector_portable_ZERO_0d();
8218 return lit;
8219 }
8220
8221 /**
8222 A monomorphic instance of libcrux_ml_kem.ind_cpa.deserialize_secret_key.closure
8223 with types libcrux_ml_kem_vector_portable_vector_type_PortableVector
8224 with const generics
8225 - K= 3
8226 */
8227 static inline libcrux_ml_kem_polynomial_PolynomialRingElement_f0
libcrux_ml_kem_ind_cpa_deserialize_secret_key_closure_6b(size_t _)8228 libcrux_ml_kem_ind_cpa_deserialize_secret_key_closure_6b(size_t _) {
8229 return libcrux_ml_kem_polynomial_ZERO_89_ea();
8230 }
8231
8232 /**
8233 A monomorphic instance of
8234 libcrux_ml_kem.serialize.deserialize_to_uncompressed_ring_element with types
8235 libcrux_ml_kem_vector_portable_vector_type_PortableVector with const generics
8236
8237 */
8238 static KRML_MUSTINLINE libcrux_ml_kem_polynomial_PolynomialRingElement_f0
libcrux_ml_kem_serialize_deserialize_to_uncompressed_ring_element_af(Eurydice_slice serialized)8239 libcrux_ml_kem_serialize_deserialize_to_uncompressed_ring_element_af(
8240 Eurydice_slice serialized) {
8241 libcrux_ml_kem_polynomial_PolynomialRingElement_f0 re =
8242 libcrux_ml_kem_polynomial_ZERO_89_ea();
8243 for (size_t i = (size_t)0U;
8244 i < Eurydice_slice_len(serialized, uint8_t) / (size_t)24U; i++) {
8245 size_t i0 = i;
8246 Eurydice_slice bytes = Eurydice_slice_subslice2(
8247 serialized, i0 * (size_t)24U, i0 * (size_t)24U + (size_t)24U, uint8_t);
8248 libcrux_ml_kem_vector_portable_vector_type_PortableVector uu____0 =
8249 libcrux_ml_kem_vector_portable_deserialize_12_0d(bytes);
8250 re.coefficients[i0] = uu____0;
8251 }
8252 return re;
8253 }
8254
8255 /**
8256 Call [`deserialize_to_uncompressed_ring_element`] for each ring element.
8257 */
8258 /**
8259 A monomorphic instance of libcrux_ml_kem.ind_cpa.deserialize_secret_key
8260 with types libcrux_ml_kem_vector_portable_vector_type_PortableVector
8261 with const generics
8262 - K= 3
8263 */
libcrux_ml_kem_ind_cpa_deserialize_secret_key_24(Eurydice_slice secret_key,libcrux_ml_kem_polynomial_PolynomialRingElement_f0 ret[3U])8264 static KRML_MUSTINLINE void libcrux_ml_kem_ind_cpa_deserialize_secret_key_24(
8265 Eurydice_slice secret_key,
8266 libcrux_ml_kem_polynomial_PolynomialRingElement_f0 ret[3U]) {
8267 libcrux_ml_kem_polynomial_PolynomialRingElement_f0 secret_as_ntt[3U];
8268 for (size_t i = (size_t)0U; i < (size_t)3U; i++) {
8269 secret_as_ntt[i] = libcrux_ml_kem_polynomial_ZERO_89_ea();
8270 }
8271 for (size_t i = (size_t)0U;
8272 i < Eurydice_slice_len(secret_key, uint8_t) /
8273 LIBCRUX_ML_KEM_CONSTANTS_BYTES_PER_RING_ELEMENT;
8274 i++) {
8275 size_t i0 = i;
8276 Eurydice_slice secret_bytes = Eurydice_slice_subslice2(
8277 secret_key, i0 * LIBCRUX_ML_KEM_CONSTANTS_BYTES_PER_RING_ELEMENT,
8278 i0 * LIBCRUX_ML_KEM_CONSTANTS_BYTES_PER_RING_ELEMENT +
8279 LIBCRUX_ML_KEM_CONSTANTS_BYTES_PER_RING_ELEMENT,
8280 uint8_t);
8281 libcrux_ml_kem_polynomial_PolynomialRingElement_f0 uu____0 =
8282 libcrux_ml_kem_serialize_deserialize_to_uncompressed_ring_element_af(
8283 secret_bytes);
8284 secret_as_ntt[i0] = uu____0;
8285 }
8286 memcpy(
8287 ret, secret_as_ntt,
8288 (size_t)3U * sizeof(libcrux_ml_kem_polynomial_PolynomialRingElement_f0));
8289 }
8290
8291 /**
8292 A monomorphic instance of
8293 libcrux_ml_kem.ind_cpa.unpacked.IndCpaPrivateKeyUnpacked with types
8294 libcrux_ml_kem_vector_portable_vector_type_PortableVector with const generics
8295 - $3size_t
8296 */
8297 typedef struct libcrux_ml_kem_ind_cpa_unpacked_IndCpaPrivateKeyUnpacked_f8_s {
8298 libcrux_ml_kem_polynomial_PolynomialRingElement_f0 secret_as_ntt[3U];
8299 } libcrux_ml_kem_ind_cpa_unpacked_IndCpaPrivateKeyUnpacked_f8;
8300
8301 /**
8302 A monomorphic instance of
8303 libcrux_ml_kem.ind_cpa.deserialize_then_decompress_u.closure with types
8304 libcrux_ml_kem_vector_portable_vector_type_PortableVector with const generics
8305 - K= 3
8306 - CIPHERTEXT_SIZE= 1088
8307 - U_COMPRESSION_FACTOR= 10
8308 */
8309 static inline libcrux_ml_kem_polynomial_PolynomialRingElement_f0
libcrux_ml_kem_ind_cpa_deserialize_then_decompress_u_closure_7c(size_t _)8310 libcrux_ml_kem_ind_cpa_deserialize_then_decompress_u_closure_7c(size_t _) {
8311 return libcrux_ml_kem_polynomial_ZERO_89_ea();
8312 }
8313
8314 /**
8315 A monomorphic instance of
8316 libcrux_ml_kem.vector.portable.compress.decompress_ciphertext_coefficient with
8317 const generics
8318 - COEFFICIENT_BITS= 10
8319 */
8320 static KRML_MUSTINLINE libcrux_ml_kem_vector_portable_vector_type_PortableVector
libcrux_ml_kem_vector_portable_compress_decompress_ciphertext_coefficient_6b(libcrux_ml_kem_vector_portable_vector_type_PortableVector v)8321 libcrux_ml_kem_vector_portable_compress_decompress_ciphertext_coefficient_6b(
8322 libcrux_ml_kem_vector_portable_vector_type_PortableVector v) {
8323 for (size_t i = (size_t)0U;
8324 i < LIBCRUX_ML_KEM_VECTOR_TRAITS_FIELD_ELEMENTS_IN_VECTOR; i++) {
8325 size_t i0 = i;
8326 int32_t decompressed = (int32_t)v.elements[i0] *
8327 (int32_t)LIBCRUX_ML_KEM_VECTOR_TRAITS_FIELD_MODULUS;
8328 decompressed = (decompressed << 1U) + ((int32_t)1 << (uint32_t)(int32_t)10);
8329 decompressed = decompressed >> (uint32_t)((int32_t)10 + (int32_t)1);
8330 v.elements[i0] = (int16_t)decompressed;
8331 }
8332 return v;
8333 }
8334
8335 /**
8336 This function found in impl {(libcrux_ml_kem::vector::traits::Operations for
8337 libcrux_ml_kem::vector::portable::vector_type::PortableVector)}
8338 */
8339 /**
8340 A monomorphic instance of
8341 libcrux_ml_kem.vector.portable.decompress_ciphertext_coefficient_0d with const
8342 generics
8343 - COEFFICIENT_BITS= 10
8344 */
8345 static inline libcrux_ml_kem_vector_portable_vector_type_PortableVector
libcrux_ml_kem_vector_portable_decompress_ciphertext_coefficient_0d_5a(libcrux_ml_kem_vector_portable_vector_type_PortableVector v)8346 libcrux_ml_kem_vector_portable_decompress_ciphertext_coefficient_0d_5a(
8347 libcrux_ml_kem_vector_portable_vector_type_PortableVector v) {
8348 return libcrux_ml_kem_vector_portable_compress_decompress_ciphertext_coefficient_6b(
8349 v);
8350 }
8351
8352 /**
8353 A monomorphic instance of
8354 libcrux_ml_kem.serialize.deserialize_then_decompress_10 with types
8355 libcrux_ml_kem_vector_portable_vector_type_PortableVector with const generics
8356
8357 */
8358 static KRML_MUSTINLINE libcrux_ml_kem_polynomial_PolynomialRingElement_f0
libcrux_ml_kem_serialize_deserialize_then_decompress_10_2c(Eurydice_slice serialized)8359 libcrux_ml_kem_serialize_deserialize_then_decompress_10_2c(
8360 Eurydice_slice serialized) {
8361 libcrux_ml_kem_polynomial_PolynomialRingElement_f0 re =
8362 libcrux_ml_kem_polynomial_ZERO_89_ea();
8363 for (size_t i = (size_t)0U;
8364 i < Eurydice_slice_len(serialized, uint8_t) / (size_t)20U; i++) {
8365 size_t i0 = i;
8366 Eurydice_slice bytes = Eurydice_slice_subslice2(
8367 serialized, i0 * (size_t)20U, i0 * (size_t)20U + (size_t)20U, uint8_t);
8368 libcrux_ml_kem_vector_portable_vector_type_PortableVector coefficient =
8369 libcrux_ml_kem_vector_portable_deserialize_10_0d(bytes);
8370 libcrux_ml_kem_vector_portable_vector_type_PortableVector uu____0 =
8371 libcrux_ml_kem_vector_portable_decompress_ciphertext_coefficient_0d_5a(
8372 coefficient);
8373 re.coefficients[i0] = uu____0;
8374 }
8375 return re;
8376 }
8377
8378 /**
8379 A monomorphic instance of
8380 libcrux_ml_kem.vector.portable.compress.decompress_ciphertext_coefficient with
8381 const generics
8382 - COEFFICIENT_BITS= 11
8383 */
8384 static KRML_MUSTINLINE libcrux_ml_kem_vector_portable_vector_type_PortableVector
libcrux_ml_kem_vector_portable_compress_decompress_ciphertext_coefficient_6b0(libcrux_ml_kem_vector_portable_vector_type_PortableVector v)8385 libcrux_ml_kem_vector_portable_compress_decompress_ciphertext_coefficient_6b0(
8386 libcrux_ml_kem_vector_portable_vector_type_PortableVector v) {
8387 for (size_t i = (size_t)0U;
8388 i < LIBCRUX_ML_KEM_VECTOR_TRAITS_FIELD_ELEMENTS_IN_VECTOR; i++) {
8389 size_t i0 = i;
8390 int32_t decompressed = (int32_t)v.elements[i0] *
8391 (int32_t)LIBCRUX_ML_KEM_VECTOR_TRAITS_FIELD_MODULUS;
8392 decompressed = (decompressed << 1U) + ((int32_t)1 << (uint32_t)(int32_t)11);
8393 decompressed = decompressed >> (uint32_t)((int32_t)11 + (int32_t)1);
8394 v.elements[i0] = (int16_t)decompressed;
8395 }
8396 return v;
8397 }
8398
8399 /**
8400 This function found in impl {(libcrux_ml_kem::vector::traits::Operations for
8401 libcrux_ml_kem::vector::portable::vector_type::PortableVector)}
8402 */
8403 /**
8404 A monomorphic instance of
8405 libcrux_ml_kem.vector.portable.decompress_ciphertext_coefficient_0d with const
8406 generics
8407 - COEFFICIENT_BITS= 11
8408 */
8409 static inline libcrux_ml_kem_vector_portable_vector_type_PortableVector
libcrux_ml_kem_vector_portable_decompress_ciphertext_coefficient_0d_5a0(libcrux_ml_kem_vector_portable_vector_type_PortableVector v)8410 libcrux_ml_kem_vector_portable_decompress_ciphertext_coefficient_0d_5a0(
8411 libcrux_ml_kem_vector_portable_vector_type_PortableVector v) {
8412 return libcrux_ml_kem_vector_portable_compress_decompress_ciphertext_coefficient_6b0(
8413 v);
8414 }
8415
8416 /**
8417 A monomorphic instance of
8418 libcrux_ml_kem.serialize.deserialize_then_decompress_11 with types
8419 libcrux_ml_kem_vector_portable_vector_type_PortableVector with const generics
8420
8421 */
8422 static KRML_MUSTINLINE libcrux_ml_kem_polynomial_PolynomialRingElement_f0
libcrux_ml_kem_serialize_deserialize_then_decompress_11_8d(Eurydice_slice serialized)8423 libcrux_ml_kem_serialize_deserialize_then_decompress_11_8d(
8424 Eurydice_slice serialized) {
8425 libcrux_ml_kem_polynomial_PolynomialRingElement_f0 re =
8426 libcrux_ml_kem_polynomial_ZERO_89_ea();
8427 for (size_t i = (size_t)0U;
8428 i < Eurydice_slice_len(serialized, uint8_t) / (size_t)22U; i++) {
8429 size_t i0 = i;
8430 Eurydice_slice bytes = Eurydice_slice_subslice2(
8431 serialized, i0 * (size_t)22U, i0 * (size_t)22U + (size_t)22U, uint8_t);
8432 libcrux_ml_kem_vector_portable_vector_type_PortableVector coefficient =
8433 libcrux_ml_kem_vector_portable_deserialize_11_0d(bytes);
8434 libcrux_ml_kem_vector_portable_vector_type_PortableVector uu____0 =
8435 libcrux_ml_kem_vector_portable_decompress_ciphertext_coefficient_0d_5a0(
8436 coefficient);
8437 re.coefficients[i0] = uu____0;
8438 }
8439 return re;
8440 }
8441
8442 /**
8443 A monomorphic instance of
8444 libcrux_ml_kem.serialize.deserialize_then_decompress_ring_element_u with types
8445 libcrux_ml_kem_vector_portable_vector_type_PortableVector with const generics
8446 - COMPRESSION_FACTOR= 10
8447 */
8448 static KRML_MUSTINLINE libcrux_ml_kem_polynomial_PolynomialRingElement_f0
libcrux_ml_kem_serialize_deserialize_then_decompress_ring_element_u_34(Eurydice_slice serialized)8449 libcrux_ml_kem_serialize_deserialize_then_decompress_ring_element_u_34(
8450 Eurydice_slice serialized) {
8451 return libcrux_ml_kem_serialize_deserialize_then_decompress_10_2c(serialized);
8452 }
8453
8454 typedef struct libcrux_ml_kem_vector_portable_vector_type_PortableVector_x2_s {
8455 libcrux_ml_kem_vector_portable_vector_type_PortableVector fst;
8456 libcrux_ml_kem_vector_portable_vector_type_PortableVector snd;
8457 } libcrux_ml_kem_vector_portable_vector_type_PortableVector_x2;
8458
8459 /**
8460 A monomorphic instance of libcrux_ml_kem.vector.traits.montgomery_multiply_fe
8461 with types libcrux_ml_kem_vector_portable_vector_type_PortableVector
8462 with const generics
8463
8464 */
8465 static inline libcrux_ml_kem_vector_portable_vector_type_PortableVector
libcrux_ml_kem_vector_traits_montgomery_multiply_fe_67(libcrux_ml_kem_vector_portable_vector_type_PortableVector v,int16_t fer)8466 libcrux_ml_kem_vector_traits_montgomery_multiply_fe_67(
8467 libcrux_ml_kem_vector_portable_vector_type_PortableVector v, int16_t fer) {
8468 return libcrux_ml_kem_vector_portable_montgomery_multiply_by_constant_0d(v,
8469 fer);
8470 }
8471
8472 /**
8473 A monomorphic instance of libcrux_ml_kem.ntt.ntt_layer_int_vec_step
8474 with types libcrux_ml_kem_vector_portable_vector_type_PortableVector
8475 with const generics
8476
8477 */
8478 static KRML_MUSTINLINE
8479 libcrux_ml_kem_vector_portable_vector_type_PortableVector_x2
libcrux_ml_kem_ntt_ntt_layer_int_vec_step_0c(libcrux_ml_kem_vector_portable_vector_type_PortableVector a,libcrux_ml_kem_vector_portable_vector_type_PortableVector b,int16_t zeta_r)8480 libcrux_ml_kem_ntt_ntt_layer_int_vec_step_0c(
8481 libcrux_ml_kem_vector_portable_vector_type_PortableVector a,
8482 libcrux_ml_kem_vector_portable_vector_type_PortableVector b,
8483 int16_t zeta_r) {
8484 libcrux_ml_kem_vector_portable_vector_type_PortableVector t =
8485 libcrux_ml_kem_vector_traits_montgomery_multiply_fe_67(b, zeta_r);
8486 b = libcrux_ml_kem_vector_portable_sub_0d(a, &t);
8487 a = libcrux_ml_kem_vector_portable_add_0d(a, &t);
8488 return (
8489 CLITERAL(libcrux_ml_kem_vector_portable_vector_type_PortableVector_x2){
8490 .fst = a, .snd = b});
8491 }
8492
8493 /**
8494 A monomorphic instance of libcrux_ml_kem.ntt.ntt_at_layer_4_plus
8495 with types libcrux_ml_kem_vector_portable_vector_type_PortableVector
8496 with const generics
8497
8498 */
libcrux_ml_kem_ntt_ntt_at_layer_4_plus_51(size_t * zeta_i,libcrux_ml_kem_polynomial_PolynomialRingElement_f0 * re,size_t layer,size_t _initial_coefficient_bound)8499 static KRML_MUSTINLINE void libcrux_ml_kem_ntt_ntt_at_layer_4_plus_51(
8500 size_t *zeta_i, libcrux_ml_kem_polynomial_PolynomialRingElement_f0 *re,
8501 size_t layer, size_t _initial_coefficient_bound) {
8502 size_t step = (size_t)1U << (uint32_t)layer;
8503 for (size_t i0 = (size_t)0U; i0 < (size_t)128U >> (uint32_t)layer; i0++) {
8504 size_t round = i0;
8505 zeta_i[0U] = zeta_i[0U] + (size_t)1U;
8506 size_t offset = round * step * (size_t)2U;
8507 size_t offset_vec = offset / (size_t)16U;
8508 size_t step_vec = step / (size_t)16U;
8509 for (size_t i = offset_vec; i < offset_vec + step_vec; i++) {
8510 size_t j = i;
8511 libcrux_ml_kem_vector_portable_vector_type_PortableVector_x2 uu____0 =
8512 libcrux_ml_kem_ntt_ntt_layer_int_vec_step_0c(
8513 re->coefficients[j], re->coefficients[j + step_vec],
8514 libcrux_ml_kem_polynomial_ZETAS_TIMES_MONTGOMERY_R[zeta_i[0U]]);
8515 libcrux_ml_kem_vector_portable_vector_type_PortableVector x = uu____0.fst;
8516 libcrux_ml_kem_vector_portable_vector_type_PortableVector y = uu____0.snd;
8517 re->coefficients[j] = x;
8518 re->coefficients[j + step_vec] = y;
8519 }
8520 }
8521 }
8522
8523 /**
8524 A monomorphic instance of libcrux_ml_kem.ntt.ntt_at_layer_3
8525 with types libcrux_ml_kem_vector_portable_vector_type_PortableVector
8526 with const generics
8527
8528 */
libcrux_ml_kem_ntt_ntt_at_layer_3_fd(size_t * zeta_i,libcrux_ml_kem_polynomial_PolynomialRingElement_f0 * re,size_t _layer,size_t _initial_coefficient_bound)8529 static KRML_MUSTINLINE void libcrux_ml_kem_ntt_ntt_at_layer_3_fd(
8530 size_t *zeta_i, libcrux_ml_kem_polynomial_PolynomialRingElement_f0 *re,
8531 size_t _layer, size_t _initial_coefficient_bound) {
8532 for (size_t i = (size_t)0U; i < (size_t)16U; i++) {
8533 size_t round = i;
8534 zeta_i[0U] = zeta_i[0U] + (size_t)1U;
8535 libcrux_ml_kem_vector_portable_vector_type_PortableVector uu____0 =
8536 libcrux_ml_kem_vector_portable_ntt_layer_3_step_0d(
8537 re->coefficients[round],
8538 libcrux_ml_kem_polynomial_ZETAS_TIMES_MONTGOMERY_R[zeta_i[0U]]);
8539 re->coefficients[round] = uu____0;
8540 }
8541 }
8542
8543 /**
8544 A monomorphic instance of libcrux_ml_kem.ntt.ntt_at_layer_2
8545 with types libcrux_ml_kem_vector_portable_vector_type_PortableVector
8546 with const generics
8547
8548 */
libcrux_ml_kem_ntt_ntt_at_layer_2_ad(size_t * zeta_i,libcrux_ml_kem_polynomial_PolynomialRingElement_f0 * re,size_t _layer,size_t _initial_coefficient_bound)8549 static KRML_MUSTINLINE void libcrux_ml_kem_ntt_ntt_at_layer_2_ad(
8550 size_t *zeta_i, libcrux_ml_kem_polynomial_PolynomialRingElement_f0 *re,
8551 size_t _layer, size_t _initial_coefficient_bound) {
8552 for (size_t i = (size_t)0U; i < (size_t)16U; i++) {
8553 size_t round = i;
8554 zeta_i[0U] = zeta_i[0U] + (size_t)1U;
8555 re->coefficients[round] =
8556 libcrux_ml_kem_vector_portable_ntt_layer_2_step_0d(
8557 re->coefficients[round],
8558 libcrux_ml_kem_polynomial_ZETAS_TIMES_MONTGOMERY_R[zeta_i[0U]],
8559 libcrux_ml_kem_polynomial_ZETAS_TIMES_MONTGOMERY_R[zeta_i[0U] +
8560 (size_t)1U]);
8561 zeta_i[0U] = zeta_i[0U] + (size_t)1U;
8562 }
8563 }
8564
8565 /**
8566 A monomorphic instance of libcrux_ml_kem.ntt.ntt_at_layer_1
8567 with types libcrux_ml_kem_vector_portable_vector_type_PortableVector
8568 with const generics
8569
8570 */
libcrux_ml_kem_ntt_ntt_at_layer_1_a2(size_t * zeta_i,libcrux_ml_kem_polynomial_PolynomialRingElement_f0 * re,size_t _layer,size_t _initial_coefficient_bound)8571 static KRML_MUSTINLINE void libcrux_ml_kem_ntt_ntt_at_layer_1_a2(
8572 size_t *zeta_i, libcrux_ml_kem_polynomial_PolynomialRingElement_f0 *re,
8573 size_t _layer, size_t _initial_coefficient_bound) {
8574 for (size_t i = (size_t)0U; i < (size_t)16U; i++) {
8575 size_t round = i;
8576 zeta_i[0U] = zeta_i[0U] + (size_t)1U;
8577 re->coefficients[round] =
8578 libcrux_ml_kem_vector_portable_ntt_layer_1_step_0d(
8579 re->coefficients[round],
8580 libcrux_ml_kem_polynomial_ZETAS_TIMES_MONTGOMERY_R[zeta_i[0U]],
8581 libcrux_ml_kem_polynomial_ZETAS_TIMES_MONTGOMERY_R[zeta_i[0U] +
8582 (size_t)1U],
8583 libcrux_ml_kem_polynomial_ZETAS_TIMES_MONTGOMERY_R[zeta_i[0U] +
8584 (size_t)2U],
8585 libcrux_ml_kem_polynomial_ZETAS_TIMES_MONTGOMERY_R[zeta_i[0U] +
8586 (size_t)3U]);
8587 zeta_i[0U] = zeta_i[0U] + (size_t)3U;
8588 }
8589 }
8590
8591 /**
8592 This function found in impl
8593 {libcrux_ml_kem::polynomial::PolynomialRingElement<Vector>[TraitClause@0]}
8594 */
8595 /**
8596 A monomorphic instance of libcrux_ml_kem.polynomial.poly_barrett_reduce_89
8597 with types libcrux_ml_kem_vector_portable_vector_type_PortableVector
8598 with const generics
8599
8600 */
libcrux_ml_kem_polynomial_poly_barrett_reduce_89_8b(libcrux_ml_kem_polynomial_PolynomialRingElement_f0 * self)8601 static KRML_MUSTINLINE void libcrux_ml_kem_polynomial_poly_barrett_reduce_89_8b(
8602 libcrux_ml_kem_polynomial_PolynomialRingElement_f0 *self) {
8603 for (size_t i = (size_t)0U;
8604 i < LIBCRUX_ML_KEM_POLYNOMIAL_VECTORS_IN_RING_ELEMENT; i++) {
8605 size_t i0 = i;
8606 libcrux_ml_kem_vector_portable_vector_type_PortableVector uu____0 =
8607 libcrux_ml_kem_vector_portable_barrett_reduce_0d(
8608 self->coefficients[i0]);
8609 self->coefficients[i0] = uu____0;
8610 }
8611 }
8612
8613 /**
8614 A monomorphic instance of libcrux_ml_kem.ntt.ntt_vector_u
8615 with types libcrux_ml_kem_vector_portable_vector_type_PortableVector
8616 with const generics
8617 - VECTOR_U_COMPRESSION_FACTOR= 10
8618 */
libcrux_ml_kem_ntt_ntt_vector_u_9f(libcrux_ml_kem_polynomial_PolynomialRingElement_f0 * re)8619 static KRML_MUSTINLINE void libcrux_ml_kem_ntt_ntt_vector_u_9f(
8620 libcrux_ml_kem_polynomial_PolynomialRingElement_f0 *re) {
8621 size_t zeta_i = (size_t)0U;
8622 libcrux_ml_kem_ntt_ntt_at_layer_4_plus_51(&zeta_i, re, (size_t)7U,
8623 (size_t)3328U);
8624 libcrux_ml_kem_ntt_ntt_at_layer_4_plus_51(&zeta_i, re, (size_t)6U,
8625 (size_t)3328U);
8626 libcrux_ml_kem_ntt_ntt_at_layer_4_plus_51(&zeta_i, re, (size_t)5U,
8627 (size_t)3328U);
8628 libcrux_ml_kem_ntt_ntt_at_layer_4_plus_51(&zeta_i, re, (size_t)4U,
8629 (size_t)3328U);
8630 libcrux_ml_kem_ntt_ntt_at_layer_3_fd(&zeta_i, re, (size_t)3U, (size_t)3328U);
8631 libcrux_ml_kem_ntt_ntt_at_layer_2_ad(&zeta_i, re, (size_t)2U, (size_t)3328U);
8632 libcrux_ml_kem_ntt_ntt_at_layer_1_a2(&zeta_i, re, (size_t)1U, (size_t)3328U);
8633 libcrux_ml_kem_polynomial_poly_barrett_reduce_89_8b(re);
8634 }
8635
8636 /**
8637 Call [`deserialize_then_decompress_ring_element_u`] on each ring element
8638 in the `ciphertext`.
8639 */
8640 /**
8641 A monomorphic instance of libcrux_ml_kem.ind_cpa.deserialize_then_decompress_u
8642 with types libcrux_ml_kem_vector_portable_vector_type_PortableVector
8643 with const generics
8644 - K= 3
8645 - CIPHERTEXT_SIZE= 1088
8646 - U_COMPRESSION_FACTOR= 10
8647 */
8648 static KRML_MUSTINLINE void
libcrux_ml_kem_ind_cpa_deserialize_then_decompress_u_f4(uint8_t * ciphertext,libcrux_ml_kem_polynomial_PolynomialRingElement_f0 ret[3U])8649 libcrux_ml_kem_ind_cpa_deserialize_then_decompress_u_f4(
8650 uint8_t *ciphertext,
8651 libcrux_ml_kem_polynomial_PolynomialRingElement_f0 ret[3U]) {
8652 libcrux_ml_kem_polynomial_PolynomialRingElement_f0 u_as_ntt[3U];
8653 for (size_t i = (size_t)0U; i < (size_t)3U; i++) {
8654 u_as_ntt[i] = libcrux_ml_kem_polynomial_ZERO_89_ea();
8655 }
8656 for (size_t i = (size_t)0U;
8657 i < Eurydice_slice_len(
8658 Eurydice_array_to_slice((size_t)1088U, ciphertext, uint8_t),
8659 uint8_t) /
8660 (LIBCRUX_ML_KEM_CONSTANTS_COEFFICIENTS_IN_RING_ELEMENT *
8661 (size_t)10U / (size_t)8U);
8662 i++) {
8663 size_t i0 = i;
8664 Eurydice_slice u_bytes = Eurydice_array_to_subslice2(
8665 ciphertext,
8666 i0 * (LIBCRUX_ML_KEM_CONSTANTS_COEFFICIENTS_IN_RING_ELEMENT *
8667 (size_t)10U / (size_t)8U),
8668 i0 * (LIBCRUX_ML_KEM_CONSTANTS_COEFFICIENTS_IN_RING_ELEMENT *
8669 (size_t)10U / (size_t)8U) +
8670 LIBCRUX_ML_KEM_CONSTANTS_COEFFICIENTS_IN_RING_ELEMENT *
8671 (size_t)10U / (size_t)8U,
8672 uint8_t);
8673 u_as_ntt[i0] =
8674 libcrux_ml_kem_serialize_deserialize_then_decompress_ring_element_u_34(
8675 u_bytes);
8676 libcrux_ml_kem_ntt_ntt_vector_u_9f(&u_as_ntt[i0]);
8677 }
8678 memcpy(
8679 ret, u_as_ntt,
8680 (size_t)3U * sizeof(libcrux_ml_kem_polynomial_PolynomialRingElement_f0));
8681 }
8682
8683 /**
8684 A monomorphic instance of
8685 libcrux_ml_kem.vector.portable.compress.decompress_ciphertext_coefficient with
8686 const generics
8687 - COEFFICIENT_BITS= 4
8688 */
8689 static KRML_MUSTINLINE libcrux_ml_kem_vector_portable_vector_type_PortableVector
libcrux_ml_kem_vector_portable_compress_decompress_ciphertext_coefficient_6b1(libcrux_ml_kem_vector_portable_vector_type_PortableVector v)8690 libcrux_ml_kem_vector_portable_compress_decompress_ciphertext_coefficient_6b1(
8691 libcrux_ml_kem_vector_portable_vector_type_PortableVector v) {
8692 for (size_t i = (size_t)0U;
8693 i < LIBCRUX_ML_KEM_VECTOR_TRAITS_FIELD_ELEMENTS_IN_VECTOR; i++) {
8694 size_t i0 = i;
8695 int32_t decompressed = (int32_t)v.elements[i0] *
8696 (int32_t)LIBCRUX_ML_KEM_VECTOR_TRAITS_FIELD_MODULUS;
8697 decompressed = (decompressed << 1U) + ((int32_t)1 << (uint32_t)(int32_t)4);
8698 decompressed = decompressed >> (uint32_t)((int32_t)4 + (int32_t)1);
8699 v.elements[i0] = (int16_t)decompressed;
8700 }
8701 return v;
8702 }
8703
8704 /**
8705 This function found in impl {(libcrux_ml_kem::vector::traits::Operations for
8706 libcrux_ml_kem::vector::portable::vector_type::PortableVector)}
8707 */
8708 /**
8709 A monomorphic instance of
8710 libcrux_ml_kem.vector.portable.decompress_ciphertext_coefficient_0d with const
8711 generics
8712 - COEFFICIENT_BITS= 4
8713 */
8714 static inline libcrux_ml_kem_vector_portable_vector_type_PortableVector
libcrux_ml_kem_vector_portable_decompress_ciphertext_coefficient_0d_5a1(libcrux_ml_kem_vector_portable_vector_type_PortableVector v)8715 libcrux_ml_kem_vector_portable_decompress_ciphertext_coefficient_0d_5a1(
8716 libcrux_ml_kem_vector_portable_vector_type_PortableVector v) {
8717 return libcrux_ml_kem_vector_portable_compress_decompress_ciphertext_coefficient_6b1(
8718 v);
8719 }
8720
8721 /**
8722 A monomorphic instance of libcrux_ml_kem.serialize.deserialize_then_decompress_4
8723 with types libcrux_ml_kem_vector_portable_vector_type_PortableVector
8724 with const generics
8725
8726 */
8727 static KRML_MUSTINLINE libcrux_ml_kem_polynomial_PolynomialRingElement_f0
libcrux_ml_kem_serialize_deserialize_then_decompress_4_41(Eurydice_slice serialized)8728 libcrux_ml_kem_serialize_deserialize_then_decompress_4_41(
8729 Eurydice_slice serialized) {
8730 libcrux_ml_kem_polynomial_PolynomialRingElement_f0 re =
8731 libcrux_ml_kem_polynomial_ZERO_89_ea();
8732 for (size_t i = (size_t)0U;
8733 i < Eurydice_slice_len(serialized, uint8_t) / (size_t)8U; i++) {
8734 size_t i0 = i;
8735 Eurydice_slice bytes = Eurydice_slice_subslice2(
8736 serialized, i0 * (size_t)8U, i0 * (size_t)8U + (size_t)8U, uint8_t);
8737 libcrux_ml_kem_vector_portable_vector_type_PortableVector coefficient =
8738 libcrux_ml_kem_vector_portable_deserialize_4_0d(bytes);
8739 libcrux_ml_kem_vector_portable_vector_type_PortableVector uu____0 =
8740 libcrux_ml_kem_vector_portable_decompress_ciphertext_coefficient_0d_5a1(
8741 coefficient);
8742 re.coefficients[i0] = uu____0;
8743 }
8744 return re;
8745 }
8746
8747 /**
8748 A monomorphic instance of
8749 libcrux_ml_kem.vector.portable.compress.decompress_ciphertext_coefficient with
8750 const generics
8751 - COEFFICIENT_BITS= 5
8752 */
8753 static KRML_MUSTINLINE libcrux_ml_kem_vector_portable_vector_type_PortableVector
libcrux_ml_kem_vector_portable_compress_decompress_ciphertext_coefficient_6b2(libcrux_ml_kem_vector_portable_vector_type_PortableVector v)8754 libcrux_ml_kem_vector_portable_compress_decompress_ciphertext_coefficient_6b2(
8755 libcrux_ml_kem_vector_portable_vector_type_PortableVector v) {
8756 for (size_t i = (size_t)0U;
8757 i < LIBCRUX_ML_KEM_VECTOR_TRAITS_FIELD_ELEMENTS_IN_VECTOR; i++) {
8758 size_t i0 = i;
8759 int32_t decompressed = (int32_t)v.elements[i0] *
8760 (int32_t)LIBCRUX_ML_KEM_VECTOR_TRAITS_FIELD_MODULUS;
8761 decompressed = (decompressed << 1U) + ((int32_t)1 << (uint32_t)(int32_t)5);
8762 decompressed = decompressed >> (uint32_t)((int32_t)5 + (int32_t)1);
8763 v.elements[i0] = (int16_t)decompressed;
8764 }
8765 return v;
8766 }
8767
8768 /**
8769 This function found in impl {(libcrux_ml_kem::vector::traits::Operations for
8770 libcrux_ml_kem::vector::portable::vector_type::PortableVector)}
8771 */
8772 /**
8773 A monomorphic instance of
8774 libcrux_ml_kem.vector.portable.decompress_ciphertext_coefficient_0d with const
8775 generics
8776 - COEFFICIENT_BITS= 5
8777 */
8778 static inline libcrux_ml_kem_vector_portable_vector_type_PortableVector
libcrux_ml_kem_vector_portable_decompress_ciphertext_coefficient_0d_5a2(libcrux_ml_kem_vector_portable_vector_type_PortableVector v)8779 libcrux_ml_kem_vector_portable_decompress_ciphertext_coefficient_0d_5a2(
8780 libcrux_ml_kem_vector_portable_vector_type_PortableVector v) {
8781 return libcrux_ml_kem_vector_portable_compress_decompress_ciphertext_coefficient_6b2(
8782 v);
8783 }
8784
8785 /**
8786 A monomorphic instance of libcrux_ml_kem.serialize.deserialize_then_decompress_5
8787 with types libcrux_ml_kem_vector_portable_vector_type_PortableVector
8788 with const generics
8789
8790 */
8791 static KRML_MUSTINLINE libcrux_ml_kem_polynomial_PolynomialRingElement_f0
libcrux_ml_kem_serialize_deserialize_then_decompress_5_4e(Eurydice_slice serialized)8792 libcrux_ml_kem_serialize_deserialize_then_decompress_5_4e(
8793 Eurydice_slice serialized) {
8794 libcrux_ml_kem_polynomial_PolynomialRingElement_f0 re =
8795 libcrux_ml_kem_polynomial_ZERO_89_ea();
8796 for (size_t i = (size_t)0U;
8797 i < Eurydice_slice_len(serialized, uint8_t) / (size_t)10U; i++) {
8798 size_t i0 = i;
8799 Eurydice_slice bytes = Eurydice_slice_subslice2(
8800 serialized, i0 * (size_t)10U, i0 * (size_t)10U + (size_t)10U, uint8_t);
8801 re.coefficients[i0] =
8802 libcrux_ml_kem_vector_portable_deserialize_5_0d(bytes);
8803 libcrux_ml_kem_vector_portable_vector_type_PortableVector uu____1 =
8804 libcrux_ml_kem_vector_portable_decompress_ciphertext_coefficient_0d_5a2(
8805 re.coefficients[i0]);
8806 re.coefficients[i0] = uu____1;
8807 }
8808 return re;
8809 }
8810
8811 /**
8812 A monomorphic instance of
8813 libcrux_ml_kem.serialize.deserialize_then_decompress_ring_element_v with types
8814 libcrux_ml_kem_vector_portable_vector_type_PortableVector with const generics
8815 - COMPRESSION_FACTOR= 4
8816 */
8817 static KRML_MUSTINLINE libcrux_ml_kem_polynomial_PolynomialRingElement_f0
libcrux_ml_kem_serialize_deserialize_then_decompress_ring_element_v_56(Eurydice_slice serialized)8818 libcrux_ml_kem_serialize_deserialize_then_decompress_ring_element_v_56(
8819 Eurydice_slice serialized) {
8820 return libcrux_ml_kem_serialize_deserialize_then_decompress_4_41(serialized);
8821 }
8822
8823 /**
8824 Given two `KyberPolynomialRingElement`s in their NTT representations,
8825 compute their product. Given two polynomials in the NTT domain `f^` and `ĵ`,
8826 the `iᵗʰ` coefficient of the product `k̂` is determined by the calculation:
8827
8828 ```plaintext
8829 ĥ[2·i] + ĥ[2·i + 1]X = (f^[2·i] + f^[2·i + 1]X)·(ĝ[2·i] + ĝ[2·i + 1]X) mod (X²
8830 - ζ^(2·BitRev₇(i) + 1))
8831 ```
8832
8833 This function almost implements <strong>Algorithm 10</strong> of the
8834 NIST FIPS 203 standard, which is reproduced below:
8835
8836 ```plaintext
8837 Input: Two arrays fˆ ∈ ℤ₂₅₆ and ĝ ∈ ℤ₂₅₆.
8838 Output: An array ĥ ∈ ℤq.
8839
8840 for(i ← 0; i < 128; i++)
8841 (ĥ[2i], ĥ[2i+1]) ← BaseCaseMultiply(fˆ[2i], fˆ[2i+1], ĝ[2i], ĝ[2i+1],
8842 ζ^(2·BitRev₇(i) + 1)) end for return ĥ
8843 ```
8844 We say "almost" because the coefficients of the ring element output by
8845 this function are in the Montgomery domain.
8846
8847 The NIST FIPS 203 standard can be found at
8848 <https://csrc.nist.gov/pubs/fips/203/ipd>.
8849 */
8850 /**
8851 This function found in impl
8852 {libcrux_ml_kem::polynomial::PolynomialRingElement<Vector>[TraitClause@0]}
8853 */
8854 /**
8855 A monomorphic instance of libcrux_ml_kem.polynomial.ntt_multiply_89
8856 with types libcrux_ml_kem_vector_portable_vector_type_PortableVector
8857 with const generics
8858
8859 */
8860 static KRML_MUSTINLINE libcrux_ml_kem_polynomial_PolynomialRingElement_f0
libcrux_ml_kem_polynomial_ntt_multiply_89_2a(libcrux_ml_kem_polynomial_PolynomialRingElement_f0 * self,libcrux_ml_kem_polynomial_PolynomialRingElement_f0 * rhs)8861 libcrux_ml_kem_polynomial_ntt_multiply_89_2a(
8862 libcrux_ml_kem_polynomial_PolynomialRingElement_f0 *self,
8863 libcrux_ml_kem_polynomial_PolynomialRingElement_f0 *rhs) {
8864 libcrux_ml_kem_polynomial_PolynomialRingElement_f0 out =
8865 libcrux_ml_kem_polynomial_ZERO_89_ea();
8866 for (size_t i = (size_t)0U;
8867 i < LIBCRUX_ML_KEM_POLYNOMIAL_VECTORS_IN_RING_ELEMENT; i++) {
8868 size_t i0 = i;
8869 libcrux_ml_kem_vector_portable_vector_type_PortableVector uu____0 =
8870 libcrux_ml_kem_vector_portable_ntt_multiply_0d(
8871 &self->coefficients[i0], &rhs->coefficients[i0],
8872 libcrux_ml_kem_polynomial_ZETAS_TIMES_MONTGOMERY_R[(size_t)64U +
8873 (size_t)4U * i0],
8874 libcrux_ml_kem_polynomial_ZETAS_TIMES_MONTGOMERY_R[(size_t)64U +
8875 (size_t)4U * i0 +
8876 (size_t)1U],
8877 libcrux_ml_kem_polynomial_ZETAS_TIMES_MONTGOMERY_R[(size_t)64U +
8878 (size_t)4U * i0 +
8879 (size_t)2U],
8880 libcrux_ml_kem_polynomial_ZETAS_TIMES_MONTGOMERY_R[(size_t)64U +
8881 (size_t)4U * i0 +
8882 (size_t)3U]);
8883 out.coefficients[i0] = uu____0;
8884 }
8885 return out;
8886 }
8887
8888 /**
8889 Given two polynomial ring elements `lhs` and `rhs`, compute the pointwise
8890 sum of their constituent coefficients.
8891 */
8892 /**
8893 This function found in impl
8894 {libcrux_ml_kem::polynomial::PolynomialRingElement<Vector>[TraitClause@0]}
8895 */
8896 /**
8897 A monomorphic instance of libcrux_ml_kem.polynomial.add_to_ring_element_89
8898 with types libcrux_ml_kem_vector_portable_vector_type_PortableVector
8899 with const generics
8900 - K= 3
8901 */
libcrux_ml_kem_polynomial_add_to_ring_element_89_84(libcrux_ml_kem_polynomial_PolynomialRingElement_f0 * self,libcrux_ml_kem_polynomial_PolynomialRingElement_f0 * rhs)8902 static KRML_MUSTINLINE void libcrux_ml_kem_polynomial_add_to_ring_element_89_84(
8903 libcrux_ml_kem_polynomial_PolynomialRingElement_f0 *self,
8904 libcrux_ml_kem_polynomial_PolynomialRingElement_f0 *rhs) {
8905 for (size_t i = (size_t)0U;
8906 i < Eurydice_slice_len(
8907 Eurydice_array_to_slice(
8908 (size_t)16U, self->coefficients,
8909 libcrux_ml_kem_vector_portable_vector_type_PortableVector),
8910 libcrux_ml_kem_vector_portable_vector_type_PortableVector);
8911 i++) {
8912 size_t i0 = i;
8913 libcrux_ml_kem_vector_portable_vector_type_PortableVector uu____0 =
8914 libcrux_ml_kem_vector_portable_add_0d(self->coefficients[i0],
8915 &rhs->coefficients[i0]);
8916 self->coefficients[i0] = uu____0;
8917 }
8918 }
8919
8920 /**
8921 A monomorphic instance of libcrux_ml_kem.invert_ntt.invert_ntt_at_layer_1
8922 with types libcrux_ml_kem_vector_portable_vector_type_PortableVector
8923 with const generics
8924
8925 */
libcrux_ml_kem_invert_ntt_invert_ntt_at_layer_1_83(size_t * zeta_i,libcrux_ml_kem_polynomial_PolynomialRingElement_f0 * re,size_t _layer)8926 static KRML_MUSTINLINE void libcrux_ml_kem_invert_ntt_invert_ntt_at_layer_1_83(
8927 size_t *zeta_i, libcrux_ml_kem_polynomial_PolynomialRingElement_f0 *re,
8928 size_t _layer) {
8929 for (size_t i = (size_t)0U; i < (size_t)16U; i++) {
8930 size_t round = i;
8931 zeta_i[0U] = zeta_i[0U] - (size_t)1U;
8932 re->coefficients[round] =
8933 libcrux_ml_kem_vector_portable_inv_ntt_layer_1_step_0d(
8934 re->coefficients[round],
8935 libcrux_ml_kem_polynomial_ZETAS_TIMES_MONTGOMERY_R[zeta_i[0U]],
8936 libcrux_ml_kem_polynomial_ZETAS_TIMES_MONTGOMERY_R[zeta_i[0U] -
8937 (size_t)1U],
8938 libcrux_ml_kem_polynomial_ZETAS_TIMES_MONTGOMERY_R[zeta_i[0U] -
8939 (size_t)2U],
8940 libcrux_ml_kem_polynomial_ZETAS_TIMES_MONTGOMERY_R[zeta_i[0U] -
8941 (size_t)3U]);
8942 zeta_i[0U] = zeta_i[0U] - (size_t)3U;
8943 }
8944 }
8945
8946 /**
8947 A monomorphic instance of libcrux_ml_kem.invert_ntt.invert_ntt_at_layer_2
8948 with types libcrux_ml_kem_vector_portable_vector_type_PortableVector
8949 with const generics
8950
8951 */
libcrux_ml_kem_invert_ntt_invert_ntt_at_layer_2_c3(size_t * zeta_i,libcrux_ml_kem_polynomial_PolynomialRingElement_f0 * re,size_t _layer)8952 static KRML_MUSTINLINE void libcrux_ml_kem_invert_ntt_invert_ntt_at_layer_2_c3(
8953 size_t *zeta_i, libcrux_ml_kem_polynomial_PolynomialRingElement_f0 *re,
8954 size_t _layer) {
8955 for (size_t i = (size_t)0U; i < (size_t)16U; i++) {
8956 size_t round = i;
8957 zeta_i[0U] = zeta_i[0U] - (size_t)1U;
8958 re->coefficients[round] =
8959 libcrux_ml_kem_vector_portable_inv_ntt_layer_2_step_0d(
8960 re->coefficients[round],
8961 libcrux_ml_kem_polynomial_ZETAS_TIMES_MONTGOMERY_R[zeta_i[0U]],
8962 libcrux_ml_kem_polynomial_ZETAS_TIMES_MONTGOMERY_R[zeta_i[0U] -
8963 (size_t)1U]);
8964 zeta_i[0U] = zeta_i[0U] - (size_t)1U;
8965 }
8966 }
8967
8968 /**
8969 A monomorphic instance of libcrux_ml_kem.invert_ntt.invert_ntt_at_layer_3
8970 with types libcrux_ml_kem_vector_portable_vector_type_PortableVector
8971 with const generics
8972
8973 */
libcrux_ml_kem_invert_ntt_invert_ntt_at_layer_3_68(size_t * zeta_i,libcrux_ml_kem_polynomial_PolynomialRingElement_f0 * re,size_t _layer)8974 static KRML_MUSTINLINE void libcrux_ml_kem_invert_ntt_invert_ntt_at_layer_3_68(
8975 size_t *zeta_i, libcrux_ml_kem_polynomial_PolynomialRingElement_f0 *re,
8976 size_t _layer) {
8977 for (size_t i = (size_t)0U; i < (size_t)16U; i++) {
8978 size_t round = i;
8979 zeta_i[0U] = zeta_i[0U] - (size_t)1U;
8980 libcrux_ml_kem_vector_portable_vector_type_PortableVector uu____0 =
8981 libcrux_ml_kem_vector_portable_inv_ntt_layer_3_step_0d(
8982 re->coefficients[round],
8983 libcrux_ml_kem_polynomial_ZETAS_TIMES_MONTGOMERY_R[zeta_i[0U]]);
8984 re->coefficients[round] = uu____0;
8985 }
8986 }
8987
8988 /**
8989 A monomorphic instance of
8990 libcrux_ml_kem.invert_ntt.inv_ntt_layer_int_vec_step_reduce with types
8991 libcrux_ml_kem_vector_portable_vector_type_PortableVector with const generics
8992
8993 */
8994 static KRML_MUSTINLINE
8995 libcrux_ml_kem_vector_portable_vector_type_PortableVector_x2
libcrux_ml_kem_invert_ntt_inv_ntt_layer_int_vec_step_reduce_65(libcrux_ml_kem_vector_portable_vector_type_PortableVector a,libcrux_ml_kem_vector_portable_vector_type_PortableVector b,int16_t zeta_r)8996 libcrux_ml_kem_invert_ntt_inv_ntt_layer_int_vec_step_reduce_65(
8997 libcrux_ml_kem_vector_portable_vector_type_PortableVector a,
8998 libcrux_ml_kem_vector_portable_vector_type_PortableVector b,
8999 int16_t zeta_r) {
9000 libcrux_ml_kem_vector_portable_vector_type_PortableVector a_minus_b =
9001 libcrux_ml_kem_vector_portable_sub_0d(b, &a);
9002 a = libcrux_ml_kem_vector_portable_barrett_reduce_0d(
9003 libcrux_ml_kem_vector_portable_add_0d(a, &b));
9004 b = libcrux_ml_kem_vector_traits_montgomery_multiply_fe_67(a_minus_b, zeta_r);
9005 return (
9006 CLITERAL(libcrux_ml_kem_vector_portable_vector_type_PortableVector_x2){
9007 .fst = a, .snd = b});
9008 }
9009
9010 /**
9011 A monomorphic instance of libcrux_ml_kem.invert_ntt.invert_ntt_at_layer_4_plus
9012 with types libcrux_ml_kem_vector_portable_vector_type_PortableVector
9013 with const generics
9014
9015 */
9016 static KRML_MUSTINLINE void
libcrux_ml_kem_invert_ntt_invert_ntt_at_layer_4_plus_6e(size_t * zeta_i,libcrux_ml_kem_polynomial_PolynomialRingElement_f0 * re,size_t layer)9017 libcrux_ml_kem_invert_ntt_invert_ntt_at_layer_4_plus_6e(
9018 size_t *zeta_i, libcrux_ml_kem_polynomial_PolynomialRingElement_f0 *re,
9019 size_t layer) {
9020 size_t step = (size_t)1U << (uint32_t)layer;
9021 for (size_t i0 = (size_t)0U; i0 < (size_t)128U >> (uint32_t)layer; i0++) {
9022 size_t round = i0;
9023 zeta_i[0U] = zeta_i[0U] - (size_t)1U;
9024 size_t offset = round * step * (size_t)2U;
9025 size_t offset_vec =
9026 offset / LIBCRUX_ML_KEM_VECTOR_TRAITS_FIELD_ELEMENTS_IN_VECTOR;
9027 size_t step_vec =
9028 step / LIBCRUX_ML_KEM_VECTOR_TRAITS_FIELD_ELEMENTS_IN_VECTOR;
9029 for (size_t i = offset_vec; i < offset_vec + step_vec; i++) {
9030 size_t j = i;
9031 libcrux_ml_kem_vector_portable_vector_type_PortableVector_x2 uu____0 =
9032 libcrux_ml_kem_invert_ntt_inv_ntt_layer_int_vec_step_reduce_65(
9033 re->coefficients[j], re->coefficients[j + step_vec],
9034 libcrux_ml_kem_polynomial_ZETAS_TIMES_MONTGOMERY_R[zeta_i[0U]]);
9035 libcrux_ml_kem_vector_portable_vector_type_PortableVector x = uu____0.fst;
9036 libcrux_ml_kem_vector_portable_vector_type_PortableVector y = uu____0.snd;
9037 re->coefficients[j] = x;
9038 re->coefficients[j + step_vec] = y;
9039 }
9040 }
9041 }
9042
9043 /**
9044 A monomorphic instance of libcrux_ml_kem.invert_ntt.invert_ntt_montgomery
9045 with types libcrux_ml_kem_vector_portable_vector_type_PortableVector
9046 with const generics
9047 - K= 3
9048 */
libcrux_ml_kem_invert_ntt_invert_ntt_montgomery_f6(libcrux_ml_kem_polynomial_PolynomialRingElement_f0 * re)9049 static KRML_MUSTINLINE void libcrux_ml_kem_invert_ntt_invert_ntt_montgomery_f6(
9050 libcrux_ml_kem_polynomial_PolynomialRingElement_f0 *re) {
9051 size_t zeta_i =
9052 LIBCRUX_ML_KEM_CONSTANTS_COEFFICIENTS_IN_RING_ELEMENT / (size_t)2U;
9053 libcrux_ml_kem_invert_ntt_invert_ntt_at_layer_1_83(&zeta_i, re, (size_t)1U);
9054 libcrux_ml_kem_invert_ntt_invert_ntt_at_layer_2_c3(&zeta_i, re, (size_t)2U);
9055 libcrux_ml_kem_invert_ntt_invert_ntt_at_layer_3_68(&zeta_i, re, (size_t)3U);
9056 libcrux_ml_kem_invert_ntt_invert_ntt_at_layer_4_plus_6e(&zeta_i, re,
9057 (size_t)4U);
9058 libcrux_ml_kem_invert_ntt_invert_ntt_at_layer_4_plus_6e(&zeta_i, re,
9059 (size_t)5U);
9060 libcrux_ml_kem_invert_ntt_invert_ntt_at_layer_4_plus_6e(&zeta_i, re,
9061 (size_t)6U);
9062 libcrux_ml_kem_invert_ntt_invert_ntt_at_layer_4_plus_6e(&zeta_i, re,
9063 (size_t)7U);
9064 libcrux_ml_kem_polynomial_poly_barrett_reduce_89_8b(re);
9065 }
9066
9067 /**
9068 This function found in impl
9069 {libcrux_ml_kem::polynomial::PolynomialRingElement<Vector>[TraitClause@0]}
9070 */
9071 /**
9072 A monomorphic instance of libcrux_ml_kem.polynomial.subtract_reduce_89
9073 with types libcrux_ml_kem_vector_portable_vector_type_PortableVector
9074 with const generics
9075
9076 */
9077 static KRML_MUSTINLINE libcrux_ml_kem_polynomial_PolynomialRingElement_f0
libcrux_ml_kem_polynomial_subtract_reduce_89_d4(libcrux_ml_kem_polynomial_PolynomialRingElement_f0 * self,libcrux_ml_kem_polynomial_PolynomialRingElement_f0 b)9078 libcrux_ml_kem_polynomial_subtract_reduce_89_d4(
9079 libcrux_ml_kem_polynomial_PolynomialRingElement_f0 *self,
9080 libcrux_ml_kem_polynomial_PolynomialRingElement_f0 b) {
9081 for (size_t i = (size_t)0U;
9082 i < LIBCRUX_ML_KEM_POLYNOMIAL_VECTORS_IN_RING_ELEMENT; i++) {
9083 size_t i0 = i;
9084 libcrux_ml_kem_vector_portable_vector_type_PortableVector
9085 coefficient_normal_form =
9086 libcrux_ml_kem_vector_portable_montgomery_multiply_by_constant_0d(
9087 b.coefficients[i0], (int16_t)1441);
9088 libcrux_ml_kem_vector_portable_vector_type_PortableVector uu____0 =
9089 libcrux_ml_kem_vector_portable_barrett_reduce_0d(
9090 libcrux_ml_kem_vector_portable_sub_0d(self->coefficients[i0],
9091 &coefficient_normal_form));
9092 b.coefficients[i0] = uu____0;
9093 }
9094 return b;
9095 }
9096
9097 /**
9098 The following functions compute various expressions involving
9099 vectors and matrices. The computation of these expressions has been
9100 abstracted away into these functions in order to save on loop iterations.
9101 Compute v − InverseNTT(sᵀ ◦ NTT(u))
9102 */
9103 /**
9104 A monomorphic instance of libcrux_ml_kem.matrix.compute_message
9105 with types libcrux_ml_kem_vector_portable_vector_type_PortableVector
9106 with const generics
9107 - K= 3
9108 */
9109 static KRML_MUSTINLINE libcrux_ml_kem_polynomial_PolynomialRingElement_f0
libcrux_ml_kem_matrix_compute_message_b3(libcrux_ml_kem_polynomial_PolynomialRingElement_f0 * v,libcrux_ml_kem_polynomial_PolynomialRingElement_f0 * secret_as_ntt,libcrux_ml_kem_polynomial_PolynomialRingElement_f0 * u_as_ntt)9110 libcrux_ml_kem_matrix_compute_message_b3(
9111 libcrux_ml_kem_polynomial_PolynomialRingElement_f0 *v,
9112 libcrux_ml_kem_polynomial_PolynomialRingElement_f0 *secret_as_ntt,
9113 libcrux_ml_kem_polynomial_PolynomialRingElement_f0 *u_as_ntt) {
9114 libcrux_ml_kem_polynomial_PolynomialRingElement_f0 result =
9115 libcrux_ml_kem_polynomial_ZERO_89_ea();
9116 for (size_t i = (size_t)0U; i < (size_t)3U; i++) {
9117 size_t i0 = i;
9118 libcrux_ml_kem_polynomial_PolynomialRingElement_f0 product =
9119 libcrux_ml_kem_polynomial_ntt_multiply_89_2a(&secret_as_ntt[i0],
9120 &u_as_ntt[i0]);
9121 libcrux_ml_kem_polynomial_add_to_ring_element_89_84(&result, &product);
9122 }
9123 libcrux_ml_kem_invert_ntt_invert_ntt_montgomery_f6(&result);
9124 result = libcrux_ml_kem_polynomial_subtract_reduce_89_d4(v, result);
9125 return result;
9126 }
9127
9128 /**
9129 A monomorphic instance of libcrux_ml_kem.vector.portable.arithmetic.shift_right
9130 with const generics
9131 - SHIFT_BY= 15
9132 */
9133 static KRML_MUSTINLINE libcrux_ml_kem_vector_portable_vector_type_PortableVector
libcrux_ml_kem_vector_portable_arithmetic_shift_right_94(libcrux_ml_kem_vector_portable_vector_type_PortableVector v)9134 libcrux_ml_kem_vector_portable_arithmetic_shift_right_94(
9135 libcrux_ml_kem_vector_portable_vector_type_PortableVector v) {
9136 for (size_t i = (size_t)0U;
9137 i < LIBCRUX_ML_KEM_VECTOR_TRAITS_FIELD_ELEMENTS_IN_VECTOR; i++) {
9138 size_t i0 = i;
9139 v.elements[i0] = v.elements[i0] >> (uint32_t)(int32_t)15;
9140 }
9141 return v;
9142 }
9143
9144 /**
9145 This function found in impl {(libcrux_ml_kem::vector::traits::Operations for
9146 libcrux_ml_kem::vector::portable::vector_type::PortableVector)}
9147 */
9148 /**
9149 A monomorphic instance of libcrux_ml_kem.vector.portable.shift_right_0d
9150 with const generics
9151 - SHIFT_BY= 15
9152 */
9153 static inline libcrux_ml_kem_vector_portable_vector_type_PortableVector
libcrux_ml_kem_vector_portable_shift_right_0d_19(libcrux_ml_kem_vector_portable_vector_type_PortableVector v)9154 libcrux_ml_kem_vector_portable_shift_right_0d_19(
9155 libcrux_ml_kem_vector_portable_vector_type_PortableVector v) {
9156 return libcrux_ml_kem_vector_portable_arithmetic_shift_right_94(v);
9157 }
9158
9159 /**
9160 A monomorphic instance of
9161 libcrux_ml_kem.vector.traits.to_unsigned_representative with types
9162 libcrux_ml_kem_vector_portable_vector_type_PortableVector with const generics
9163
9164 */
9165 static inline libcrux_ml_kem_vector_portable_vector_type_PortableVector
libcrux_ml_kem_vector_traits_to_unsigned_representative_db(libcrux_ml_kem_vector_portable_vector_type_PortableVector a)9166 libcrux_ml_kem_vector_traits_to_unsigned_representative_db(
9167 libcrux_ml_kem_vector_portable_vector_type_PortableVector a) {
9168 libcrux_ml_kem_vector_portable_vector_type_PortableVector t =
9169 libcrux_ml_kem_vector_portable_shift_right_0d_19(a);
9170 libcrux_ml_kem_vector_portable_vector_type_PortableVector fm =
9171 libcrux_ml_kem_vector_portable_bitwise_and_with_constant_0d(
9172 t, LIBCRUX_ML_KEM_VECTOR_TRAITS_FIELD_MODULUS);
9173 return libcrux_ml_kem_vector_portable_add_0d(a, &fm);
9174 }
9175
9176 /**
9177 A monomorphic instance of
9178 libcrux_ml_kem.serialize.compress_then_serialize_message with types
9179 libcrux_ml_kem_vector_portable_vector_type_PortableVector with const generics
9180
9181 */
9182 static KRML_MUSTINLINE void
libcrux_ml_kem_serialize_compress_then_serialize_message_aa(libcrux_ml_kem_polynomial_PolynomialRingElement_f0 re,uint8_t ret[32U])9183 libcrux_ml_kem_serialize_compress_then_serialize_message_aa(
9184 libcrux_ml_kem_polynomial_PolynomialRingElement_f0 re, uint8_t ret[32U]) {
9185 uint8_t serialized[32U] = {0U};
9186 for (size_t i = (size_t)0U; i < (size_t)16U; i++) {
9187 size_t i0 = i;
9188 libcrux_ml_kem_vector_portable_vector_type_PortableVector coefficient =
9189 libcrux_ml_kem_vector_traits_to_unsigned_representative_db(
9190 re.coefficients[i0]);
9191 libcrux_ml_kem_vector_portable_vector_type_PortableVector
9192 coefficient_compressed =
9193 libcrux_ml_kem_vector_portable_compress_1_0d(coefficient);
9194 uint8_t bytes[2U];
9195 libcrux_ml_kem_vector_portable_serialize_1_0d(coefficient_compressed,
9196 bytes);
9197 Eurydice_slice uu____0 = Eurydice_array_to_subslice2(
9198 serialized, (size_t)2U * i0, (size_t)2U * i0 + (size_t)2U, uint8_t);
9199 Eurydice_slice_copy(
9200 uu____0, Eurydice_array_to_slice((size_t)2U, bytes, uint8_t), uint8_t);
9201 }
9202 memcpy(ret, serialized, (size_t)32U * sizeof(uint8_t));
9203 }
9204
9205 /**
9206 This function implements <strong>Algorithm 14</strong> of the
9207 NIST FIPS 203 specification; this is the Kyber CPA-PKE decryption algorithm.
9208
9209 Algorithm 14 is reproduced below:
9210
9211 ```plaintext
9212 Input: decryption key dkₚₖₑ ∈ ^{384k}.
9213 Input: ciphertext c ∈ ^{32(dᵤk + dᵥ)}.
9214 Output: message m ∈ ^{32}.
9215
9216 c₁ ← c[0 : 32dᵤk]
9217 c₂ ← c[32dᵤk : 32(dᵤk + dᵥ)]
9218 u ← Decompress_{dᵤ}(ByteDecode_{dᵤ}(c₁))
9219 v ← Decompress_{dᵥ}(ByteDecode_{dᵥ}(c₂))
9220 ŝ ← ByteDecode₁₂(dkₚₖₑ)
9221 w ← v - NTT-¹(ŝᵀ ◦ NTT(u))
9222 m ← ByteEncode₁(Compress₁(w))
9223 return m
9224 ```
9225
9226 The NIST FIPS 203 standard can be found at
9227 <https://csrc.nist.gov/pubs/fips/203/ipd>.
9228 */
9229 /**
9230 A monomorphic instance of libcrux_ml_kem.ind_cpa.decrypt_unpacked
9231 with types libcrux_ml_kem_vector_portable_vector_type_PortableVector
9232 with const generics
9233 - K= 3
9234 - CIPHERTEXT_SIZE= 1088
9235 - VECTOR_U_ENCODED_SIZE= 960
9236 - U_COMPRESSION_FACTOR= 10
9237 - V_COMPRESSION_FACTOR= 4
9238 */
libcrux_ml_kem_ind_cpa_decrypt_unpacked_6d(libcrux_ml_kem_ind_cpa_unpacked_IndCpaPrivateKeyUnpacked_f8 * secret_key,uint8_t * ciphertext,uint8_t ret[32U])9239 static inline void libcrux_ml_kem_ind_cpa_decrypt_unpacked_6d(
9240 libcrux_ml_kem_ind_cpa_unpacked_IndCpaPrivateKeyUnpacked_f8 *secret_key,
9241 uint8_t *ciphertext, uint8_t ret[32U]) {
9242 libcrux_ml_kem_polynomial_PolynomialRingElement_f0 u_as_ntt[3U];
9243 libcrux_ml_kem_ind_cpa_deserialize_then_decompress_u_f4(ciphertext, u_as_ntt);
9244 libcrux_ml_kem_polynomial_PolynomialRingElement_f0 v =
9245 libcrux_ml_kem_serialize_deserialize_then_decompress_ring_element_v_56(
9246 Eurydice_array_to_subslice_from((size_t)1088U, ciphertext,
9247 (size_t)960U, uint8_t, size_t));
9248 libcrux_ml_kem_polynomial_PolynomialRingElement_f0 message =
9249 libcrux_ml_kem_matrix_compute_message_b3(&v, secret_key->secret_as_ntt,
9250 u_as_ntt);
9251 uint8_t ret0[32U];
9252 libcrux_ml_kem_serialize_compress_then_serialize_message_aa(message, ret0);
9253 memcpy(ret, ret0, (size_t)32U * sizeof(uint8_t));
9254 }
9255
9256 /**
9257 A monomorphic instance of libcrux_ml_kem.ind_cpa.decrypt
9258 with types libcrux_ml_kem_vector_portable_vector_type_PortableVector
9259 with const generics
9260 - K= 3
9261 - CIPHERTEXT_SIZE= 1088
9262 - VECTOR_U_ENCODED_SIZE= 960
9263 - U_COMPRESSION_FACTOR= 10
9264 - V_COMPRESSION_FACTOR= 4
9265 */
libcrux_ml_kem_ind_cpa_decrypt_43(Eurydice_slice secret_key,uint8_t * ciphertext,uint8_t ret[32U])9266 static inline void libcrux_ml_kem_ind_cpa_decrypt_43(Eurydice_slice secret_key,
9267 uint8_t *ciphertext,
9268 uint8_t ret[32U]) {
9269 libcrux_ml_kem_polynomial_PolynomialRingElement_f0 secret_as_ntt[3U];
9270 libcrux_ml_kem_ind_cpa_deserialize_secret_key_24(secret_key, secret_as_ntt);
9271 /* Passing arrays by value in Rust generates a copy in C */
9272 libcrux_ml_kem_polynomial_PolynomialRingElement_f0 copy_of_secret_as_ntt[3U];
9273 memcpy(
9274 copy_of_secret_as_ntt, secret_as_ntt,
9275 (size_t)3U * sizeof(libcrux_ml_kem_polynomial_PolynomialRingElement_f0));
9276 libcrux_ml_kem_ind_cpa_unpacked_IndCpaPrivateKeyUnpacked_f8
9277 secret_key_unpacked;
9278 memcpy(
9279 secret_key_unpacked.secret_as_ntt, copy_of_secret_as_ntt,
9280 (size_t)3U * sizeof(libcrux_ml_kem_polynomial_PolynomialRingElement_f0));
9281 uint8_t ret0[32U];
9282 libcrux_ml_kem_ind_cpa_decrypt_unpacked_6d(&secret_key_unpacked, ciphertext,
9283 ret0);
9284 memcpy(ret, ret0, (size_t)32U * sizeof(uint8_t));
9285 }
9286
9287 /**
9288 This function found in impl {(libcrux_ml_kem::hash_functions::Hash<K> for
9289 libcrux_ml_kem::hash_functions::portable::PortableHash<K>)}
9290 */
9291 /**
9292 A monomorphic instance of libcrux_ml_kem.hash_functions.portable.G_f1
9293 with const generics
9294 - K= 3
9295 */
libcrux_ml_kem_hash_functions_portable_G_f1_e4(Eurydice_slice input,uint8_t ret[64U])9296 static KRML_MUSTINLINE void libcrux_ml_kem_hash_functions_portable_G_f1_e4(
9297 Eurydice_slice input, uint8_t ret[64U]) {
9298 libcrux_ml_kem_hash_functions_portable_G(input, ret);
9299 }
9300
9301 /**
9302 A monomorphic instance of libcrux_ml_kem.hash_functions.portable.PRF
9303 with const generics
9304 - LEN= 32
9305 */
libcrux_ml_kem_hash_functions_portable_PRF_2b(Eurydice_slice input,uint8_t ret[32U])9306 static KRML_MUSTINLINE void libcrux_ml_kem_hash_functions_portable_PRF_2b(
9307 Eurydice_slice input, uint8_t ret[32U]) {
9308 uint8_t digest[32U] = {0U};
9309 libcrux_sha3_portable_shake256(
9310 Eurydice_array_to_slice((size_t)32U, digest, uint8_t), input);
9311 memcpy(ret, digest, (size_t)32U * sizeof(uint8_t));
9312 }
9313
9314 /**
9315 This function found in impl {(libcrux_ml_kem::hash_functions::Hash<K> for
9316 libcrux_ml_kem::hash_functions::portable::PortableHash<K>)}
9317 */
9318 /**
9319 A monomorphic instance of libcrux_ml_kem.hash_functions.portable.PRF_f1
9320 with const generics
9321 - K= 3
9322 - LEN= 32
9323 */
libcrux_ml_kem_hash_functions_portable_PRF_f1_ee(Eurydice_slice input,uint8_t ret[32U])9324 static KRML_MUSTINLINE void libcrux_ml_kem_hash_functions_portable_PRF_f1_ee(
9325 Eurydice_slice input, uint8_t ret[32U]) {
9326 libcrux_ml_kem_hash_functions_portable_PRF_2b(input, ret);
9327 }
9328
9329 /**
9330 A monomorphic instance of
9331 libcrux_ml_kem.serialize.deserialize_ring_elements_reduced.closure with types
9332 libcrux_ml_kem_vector_portable_vector_type_PortableVector with const generics
9333 - PUBLIC_KEY_SIZE= 1152
9334 - K= 3
9335 */
9336 static inline libcrux_ml_kem_polynomial_PolynomialRingElement_f0
libcrux_ml_kem_serialize_deserialize_ring_elements_reduced_closure_cd(size_t _i)9337 libcrux_ml_kem_serialize_deserialize_ring_elements_reduced_closure_cd(
9338 size_t _i) {
9339 return libcrux_ml_kem_polynomial_ZERO_89_ea();
9340 }
9341
9342 /**
9343 Only use with public values.
9344
9345 This MUST NOT be used with secret inputs, like its caller
9346 `deserialize_ring_elements_reduced`.
9347 */
9348 /**
9349 A monomorphic instance of
9350 libcrux_ml_kem.serialize.deserialize_to_reduced_ring_element with types
9351 libcrux_ml_kem_vector_portable_vector_type_PortableVector with const generics
9352
9353 */
9354 static KRML_MUSTINLINE libcrux_ml_kem_polynomial_PolynomialRingElement_f0
libcrux_ml_kem_serialize_deserialize_to_reduced_ring_element_4c(Eurydice_slice serialized)9355 libcrux_ml_kem_serialize_deserialize_to_reduced_ring_element_4c(
9356 Eurydice_slice serialized) {
9357 libcrux_ml_kem_polynomial_PolynomialRingElement_f0 re =
9358 libcrux_ml_kem_polynomial_ZERO_89_ea();
9359 for (size_t i = (size_t)0U;
9360 i < Eurydice_slice_len(serialized, uint8_t) / (size_t)24U; i++) {
9361 size_t i0 = i;
9362 Eurydice_slice bytes = Eurydice_slice_subslice2(
9363 serialized, i0 * (size_t)24U, i0 * (size_t)24U + (size_t)24U, uint8_t);
9364 libcrux_ml_kem_vector_portable_vector_type_PortableVector coefficient =
9365 libcrux_ml_kem_vector_portable_deserialize_12_0d(bytes);
9366 libcrux_ml_kem_vector_portable_vector_type_PortableVector uu____0 =
9367 libcrux_ml_kem_vector_portable_cond_subtract_3329_0d(coefficient);
9368 re.coefficients[i0] = uu____0;
9369 }
9370 return re;
9371 }
9372
9373 /**
9374 This function deserializes ring elements and reduces the result by the field
9375 modulus.
9376
9377 This function MUST NOT be used on secret inputs.
9378 */
9379 /**
9380 A monomorphic instance of
9381 libcrux_ml_kem.serialize.deserialize_ring_elements_reduced with types
9382 libcrux_ml_kem_vector_portable_vector_type_PortableVector with const generics
9383 - PUBLIC_KEY_SIZE= 1152
9384 - K= 3
9385 */
9386 static KRML_MUSTINLINE void
libcrux_ml_kem_serialize_deserialize_ring_elements_reduced_33(Eurydice_slice public_key,libcrux_ml_kem_polynomial_PolynomialRingElement_f0 ret[3U])9387 libcrux_ml_kem_serialize_deserialize_ring_elements_reduced_33(
9388 Eurydice_slice public_key,
9389 libcrux_ml_kem_polynomial_PolynomialRingElement_f0 ret[3U]) {
9390 libcrux_ml_kem_polynomial_PolynomialRingElement_f0 deserialized_pk[3U];
9391 for (size_t i = (size_t)0U; i < (size_t)3U; i++) {
9392 deserialized_pk[i] = libcrux_ml_kem_polynomial_ZERO_89_ea();
9393 }
9394 for (size_t i = (size_t)0U;
9395 i < Eurydice_slice_len(public_key, uint8_t) /
9396 LIBCRUX_ML_KEM_CONSTANTS_BYTES_PER_RING_ELEMENT;
9397 i++) {
9398 size_t i0 = i;
9399 Eurydice_slice ring_element = Eurydice_slice_subslice2(
9400 public_key, i0 * LIBCRUX_ML_KEM_CONSTANTS_BYTES_PER_RING_ELEMENT,
9401 i0 * LIBCRUX_ML_KEM_CONSTANTS_BYTES_PER_RING_ELEMENT +
9402 LIBCRUX_ML_KEM_CONSTANTS_BYTES_PER_RING_ELEMENT,
9403 uint8_t);
9404 libcrux_ml_kem_polynomial_PolynomialRingElement_f0 uu____0 =
9405 libcrux_ml_kem_serialize_deserialize_to_reduced_ring_element_4c(
9406 ring_element);
9407 deserialized_pk[i0] = uu____0;
9408 }
9409 memcpy(
9410 ret, deserialized_pk,
9411 (size_t)3U * sizeof(libcrux_ml_kem_polynomial_PolynomialRingElement_f0));
9412 }
9413
9414 /**
9415 A monomorphic instance of libcrux_ml_kem.matrix.sample_matrix_A.closure.closure
9416 with types libcrux_ml_kem_vector_portable_vector_type_PortableVector,
9417 libcrux_ml_kem_hash_functions_portable_PortableHash[[$3size_t]] with const
9418 generics
9419 - K= 3
9420 */
9421 static inline libcrux_ml_kem_polynomial_PolynomialRingElement_f0
libcrux_ml_kem_matrix_sample_matrix_A_closure_closure_78(size_t _j)9422 libcrux_ml_kem_matrix_sample_matrix_A_closure_closure_78(size_t _j) {
9423 return libcrux_ml_kem_polynomial_ZERO_89_ea();
9424 }
9425
9426 /**
9427 A monomorphic instance of libcrux_ml_kem.matrix.sample_matrix_A.closure
9428 with types libcrux_ml_kem_vector_portable_vector_type_PortableVector,
9429 libcrux_ml_kem_hash_functions_portable_PortableHash[[$3size_t]] with const
9430 generics
9431 - K= 3
9432 */
libcrux_ml_kem_matrix_sample_matrix_A_closure_4b(size_t _i,libcrux_ml_kem_polynomial_PolynomialRingElement_f0 ret[3U])9433 static inline void libcrux_ml_kem_matrix_sample_matrix_A_closure_4b(
9434 size_t _i, libcrux_ml_kem_polynomial_PolynomialRingElement_f0 ret[3U]) {
9435 for (size_t i = (size_t)0U; i < (size_t)3U; i++) {
9436 ret[i] = libcrux_ml_kem_polynomial_ZERO_89_ea();
9437 }
9438 }
9439
9440 /**
9441 A monomorphic instance of libcrux_ml_kem.hash_functions.portable.PortableHash
9442 with const generics
9443 - $3size_t
9444 */
9445 typedef struct libcrux_ml_kem_hash_functions_portable_PortableHash_58_s {
9446 libcrux_sha3_generic_keccak_KeccakState_48 shake128_state[3U];
9447 } libcrux_ml_kem_hash_functions_portable_PortableHash_58;
9448
9449 /**
9450 A monomorphic instance of
9451 libcrux_ml_kem.hash_functions.portable.shake128_init_absorb with const generics
9452 - K= 3
9453 */
9454 static KRML_MUSTINLINE libcrux_ml_kem_hash_functions_portable_PortableHash_58
libcrux_ml_kem_hash_functions_portable_shake128_init_absorb_b7(uint8_t input[3U][34U])9455 libcrux_ml_kem_hash_functions_portable_shake128_init_absorb_b7(
9456 uint8_t input[3U][34U]) {
9457 libcrux_sha3_generic_keccak_KeccakState_48 shake128_state[3U];
9458 for (size_t i = (size_t)0U; i < (size_t)3U; i++) {
9459 shake128_state[i] = libcrux_sha3_portable_incremental_shake128_init();
9460 }
9461 for (size_t i = (size_t)0U; i < (size_t)3U; i++) {
9462 size_t i0 = i;
9463 libcrux_sha3_portable_incremental_shake128_absorb_final(
9464 &shake128_state[i0],
9465 Eurydice_array_to_slice((size_t)34U, input[i0], uint8_t));
9466 }
9467 /* Passing arrays by value in Rust generates a copy in C */
9468 libcrux_sha3_generic_keccak_KeccakState_48 copy_of_shake128_state[3U];
9469 memcpy(copy_of_shake128_state, shake128_state,
9470 (size_t)3U * sizeof(libcrux_sha3_generic_keccak_KeccakState_48));
9471 libcrux_ml_kem_hash_functions_portable_PortableHash_58 lit;
9472 memcpy(lit.shake128_state, copy_of_shake128_state,
9473 (size_t)3U * sizeof(libcrux_sha3_generic_keccak_KeccakState_48));
9474 return lit;
9475 }
9476
9477 /**
9478 This function found in impl {(libcrux_ml_kem::hash_functions::Hash<K> for
9479 libcrux_ml_kem::hash_functions::portable::PortableHash<K>)}
9480 */
9481 /**
9482 A monomorphic instance of
9483 libcrux_ml_kem.hash_functions.portable.shake128_init_absorb_f1 with const
9484 generics
9485 - K= 3
9486 */
9487 static KRML_MUSTINLINE libcrux_ml_kem_hash_functions_portable_PortableHash_58
libcrux_ml_kem_hash_functions_portable_shake128_init_absorb_f1_8c(uint8_t input[3U][34U])9488 libcrux_ml_kem_hash_functions_portable_shake128_init_absorb_f1_8c(
9489 uint8_t input[3U][34U]) {
9490 /* Passing arrays by value in Rust generates a copy in C */
9491 uint8_t copy_of_input[3U][34U];
9492 memcpy(copy_of_input, input, (size_t)3U * sizeof(uint8_t[34U]));
9493 return libcrux_ml_kem_hash_functions_portable_shake128_init_absorb_b7(
9494 copy_of_input);
9495 }
9496
9497 /**
9498 A monomorphic instance of
9499 libcrux_ml_kem.hash_functions.portable.shake128_squeeze_three_blocks with const
9500 generics
9501 - K= 3
9502 */
9503 static KRML_MUSTINLINE void
libcrux_ml_kem_hash_functions_portable_shake128_squeeze_three_blocks_ca(libcrux_ml_kem_hash_functions_portable_PortableHash_58 * st,uint8_t ret[3U][504U])9504 libcrux_ml_kem_hash_functions_portable_shake128_squeeze_three_blocks_ca(
9505 libcrux_ml_kem_hash_functions_portable_PortableHash_58 *st,
9506 uint8_t ret[3U][504U]) {
9507 uint8_t out[3U][504U] = {{0U}};
9508 for (size_t i = (size_t)0U; i < (size_t)3U; i++) {
9509 size_t i0 = i;
9510 libcrux_sha3_portable_incremental_shake128_squeeze_first_three_blocks(
9511 &st->shake128_state[i0],
9512 Eurydice_array_to_slice((size_t)504U, out[i0], uint8_t));
9513 }
9514 memcpy(ret, out, (size_t)3U * sizeof(uint8_t[504U]));
9515 }
9516
9517 /**
9518 This function found in impl {(libcrux_ml_kem::hash_functions::Hash<K> for
9519 libcrux_ml_kem::hash_functions::portable::PortableHash<K>)}
9520 */
9521 /**
9522 A monomorphic instance of
9523 libcrux_ml_kem.hash_functions.portable.shake128_squeeze_three_blocks_f1 with
9524 const generics
9525 - K= 3
9526 */
9527 static KRML_MUSTINLINE void
libcrux_ml_kem_hash_functions_portable_shake128_squeeze_three_blocks_f1_69(libcrux_ml_kem_hash_functions_portable_PortableHash_58 * self,uint8_t ret[3U][504U])9528 libcrux_ml_kem_hash_functions_portable_shake128_squeeze_three_blocks_f1_69(
9529 libcrux_ml_kem_hash_functions_portable_PortableHash_58 *self,
9530 uint8_t ret[3U][504U]) {
9531 libcrux_ml_kem_hash_functions_portable_shake128_squeeze_three_blocks_ca(self,
9532 ret);
9533 }
9534
9535 /**
9536 If `bytes` contains a set of uniformly random bytes, this function
9537 uniformly samples a ring element `â` that is treated as being the NTT
9538 representation of the corresponding polynomial `a`.
9539
9540 Since rejection sampling is used, it is possible the supplied bytes are
9541 not enough to sample the element, in which case an `Err` is returned and the
9542 caller must try again with a fresh set of bytes.
9543
9544 This function <strong>partially</strong> implements <strong>Algorithm
9545 6</strong> of the NIST FIPS 203 standard, We say "partially" because this
9546 implementation only accepts a finite set of bytes as input and returns an error
9547 if the set is not enough; Algorithm 6 of the FIPS 203 standard on the other
9548 hand samples from an infinite stream of bytes until the ring element is filled.
9549 Algorithm 6 is reproduced below:
9550
9551 ```plaintext
9552 Input: byte stream B ∈ *.
9553 Output: array â ∈ ℤ₂₅₆.
9554
9555 i ← 0
9556 j ← 0
9557 while j < 256 do
9558 d₁ ← B[i] + 256·(B[i+1] mod 16)
9559 d₂ ← ⌊B[i+1]/16⌋ + 16·B[i+2]
9560 if d₁ < q then
9561 â[j] ← d₁
9562 j ← j + 1
9563 end if
9564 if d₂ < q and j < 256 then
9565 â[j] ← d₂
9566 j ← j + 1
9567 end if
9568 i ← i + 3
9569 end while
9570 return â
9571 ```
9572
9573 The NIST FIPS 203 standard can be found at
9574 <https://csrc.nist.gov/pubs/fips/203/ipd>.
9575 */
9576 /**
9577 A monomorphic instance of
9578 libcrux_ml_kem.sampling.sample_from_uniform_distribution_next with types
9579 libcrux_ml_kem_vector_portable_vector_type_PortableVector with const generics
9580 - K= 3
9581 - N= 504
9582 */
9583 static KRML_MUSTINLINE bool
libcrux_ml_kem_sampling_sample_from_uniform_distribution_next_db(uint8_t randomness[3U][504U],size_t * sampled_coefficients,int16_t (* out)[272U])9584 libcrux_ml_kem_sampling_sample_from_uniform_distribution_next_db(
9585 uint8_t randomness[3U][504U], size_t *sampled_coefficients,
9586 int16_t (*out)[272U]) {
9587 for (size_t i0 = (size_t)0U; i0 < (size_t)3U; i0++) {
9588 size_t i1 = i0;
9589 for (size_t i = (size_t)0U; i < (size_t)504U / (size_t)24U; i++) {
9590 size_t r = i;
9591 if (sampled_coefficients[i1] <
9592 LIBCRUX_ML_KEM_CONSTANTS_COEFFICIENTS_IN_RING_ELEMENT) {
9593 Eurydice_slice uu____0 =
9594 Eurydice_array_to_subslice2(randomness[i1], r * (size_t)24U,
9595 r * (size_t)24U + (size_t)24U, uint8_t);
9596 size_t sampled = libcrux_ml_kem_vector_portable_rej_sample_0d(
9597 uu____0, Eurydice_array_to_subslice2(
9598 out[i1], sampled_coefficients[i1],
9599 sampled_coefficients[i1] + (size_t)16U, int16_t));
9600 size_t uu____1 = i1;
9601 sampled_coefficients[uu____1] = sampled_coefficients[uu____1] + sampled;
9602 }
9603 }
9604 }
9605 bool done = true;
9606 for (size_t i = (size_t)0U; i < (size_t)3U; i++) {
9607 size_t i0 = i;
9608 if (sampled_coefficients[i0] >=
9609 LIBCRUX_ML_KEM_CONSTANTS_COEFFICIENTS_IN_RING_ELEMENT) {
9610 sampled_coefficients[i0] =
9611 LIBCRUX_ML_KEM_CONSTANTS_COEFFICIENTS_IN_RING_ELEMENT;
9612 } else {
9613 done = false;
9614 }
9615 }
9616 return done;
9617 }
9618
9619 /**
9620 A monomorphic instance of
9621 libcrux_ml_kem.hash_functions.portable.shake128_squeeze_block with const
9622 generics
9623 - K= 3
9624 */
9625 static KRML_MUSTINLINE void
libcrux_ml_kem_hash_functions_portable_shake128_squeeze_block_dd(libcrux_ml_kem_hash_functions_portable_PortableHash_58 * st,uint8_t ret[3U][168U])9626 libcrux_ml_kem_hash_functions_portable_shake128_squeeze_block_dd(
9627 libcrux_ml_kem_hash_functions_portable_PortableHash_58 *st,
9628 uint8_t ret[3U][168U]) {
9629 uint8_t out[3U][168U] = {{0U}};
9630 for (size_t i = (size_t)0U; i < (size_t)3U; i++) {
9631 size_t i0 = i;
9632 libcrux_sha3_portable_incremental_shake128_squeeze_next_block(
9633 &st->shake128_state[i0],
9634 Eurydice_array_to_slice((size_t)168U, out[i0], uint8_t));
9635 }
9636 memcpy(ret, out, (size_t)3U * sizeof(uint8_t[168U]));
9637 }
9638
9639 /**
9640 This function found in impl {(libcrux_ml_kem::hash_functions::Hash<K> for
9641 libcrux_ml_kem::hash_functions::portable::PortableHash<K>)}
9642 */
9643 /**
9644 A monomorphic instance of
9645 libcrux_ml_kem.hash_functions.portable.shake128_squeeze_block_f1 with const
9646 generics
9647 - K= 3
9648 */
9649 static KRML_MUSTINLINE void
libcrux_ml_kem_hash_functions_portable_shake128_squeeze_block_f1_60(libcrux_ml_kem_hash_functions_portable_PortableHash_58 * self,uint8_t ret[3U][168U])9650 libcrux_ml_kem_hash_functions_portable_shake128_squeeze_block_f1_60(
9651 libcrux_ml_kem_hash_functions_portable_PortableHash_58 *self,
9652 uint8_t ret[3U][168U]) {
9653 libcrux_ml_kem_hash_functions_portable_shake128_squeeze_block_dd(self, ret);
9654 }
9655
9656 /**
9657 If `bytes` contains a set of uniformly random bytes, this function
9658 uniformly samples a ring element `â` that is treated as being the NTT
9659 representation of the corresponding polynomial `a`.
9660
9661 Since rejection sampling is used, it is possible the supplied bytes are
9662 not enough to sample the element, in which case an `Err` is returned and the
9663 caller must try again with a fresh set of bytes.
9664
9665 This function <strong>partially</strong> implements <strong>Algorithm
9666 6</strong> of the NIST FIPS 203 standard, We say "partially" because this
9667 implementation only accepts a finite set of bytes as input and returns an error
9668 if the set is not enough; Algorithm 6 of the FIPS 203 standard on the other
9669 hand samples from an infinite stream of bytes until the ring element is filled.
9670 Algorithm 6 is reproduced below:
9671
9672 ```plaintext
9673 Input: byte stream B ∈ *.
9674 Output: array â ∈ ℤ₂₅₆.
9675
9676 i ← 0
9677 j ← 0
9678 while j < 256 do
9679 d₁ ← B[i] + 256·(B[i+1] mod 16)
9680 d₂ ← ⌊B[i+1]/16⌋ + 16·B[i+2]
9681 if d₁ < q then
9682 â[j] ← d₁
9683 j ← j + 1
9684 end if
9685 if d₂ < q and j < 256 then
9686 â[j] ← d₂
9687 j ← j + 1
9688 end if
9689 i ← i + 3
9690 end while
9691 return â
9692 ```
9693
9694 The NIST FIPS 203 standard can be found at
9695 <https://csrc.nist.gov/pubs/fips/203/ipd>.
9696 */
9697 /**
9698 A monomorphic instance of
9699 libcrux_ml_kem.sampling.sample_from_uniform_distribution_next with types
9700 libcrux_ml_kem_vector_portable_vector_type_PortableVector with const generics
9701 - K= 3
9702 - N= 168
9703 */
9704 static KRML_MUSTINLINE bool
libcrux_ml_kem_sampling_sample_from_uniform_distribution_next_db0(uint8_t randomness[3U][168U],size_t * sampled_coefficients,int16_t (* out)[272U])9705 libcrux_ml_kem_sampling_sample_from_uniform_distribution_next_db0(
9706 uint8_t randomness[3U][168U], size_t *sampled_coefficients,
9707 int16_t (*out)[272U]) {
9708 for (size_t i0 = (size_t)0U; i0 < (size_t)3U; i0++) {
9709 size_t i1 = i0;
9710 for (size_t i = (size_t)0U; i < (size_t)168U / (size_t)24U; i++) {
9711 size_t r = i;
9712 if (sampled_coefficients[i1] <
9713 LIBCRUX_ML_KEM_CONSTANTS_COEFFICIENTS_IN_RING_ELEMENT) {
9714 Eurydice_slice uu____0 =
9715 Eurydice_array_to_subslice2(randomness[i1], r * (size_t)24U,
9716 r * (size_t)24U + (size_t)24U, uint8_t);
9717 size_t sampled = libcrux_ml_kem_vector_portable_rej_sample_0d(
9718 uu____0, Eurydice_array_to_subslice2(
9719 out[i1], sampled_coefficients[i1],
9720 sampled_coefficients[i1] + (size_t)16U, int16_t));
9721 size_t uu____1 = i1;
9722 sampled_coefficients[uu____1] = sampled_coefficients[uu____1] + sampled;
9723 }
9724 }
9725 }
9726 bool done = true;
9727 for (size_t i = (size_t)0U; i < (size_t)3U; i++) {
9728 size_t i0 = i;
9729 if (sampled_coefficients[i0] >=
9730 LIBCRUX_ML_KEM_CONSTANTS_COEFFICIENTS_IN_RING_ELEMENT) {
9731 sampled_coefficients[i0] =
9732 LIBCRUX_ML_KEM_CONSTANTS_COEFFICIENTS_IN_RING_ELEMENT;
9733 } else {
9734 done = false;
9735 }
9736 }
9737 return done;
9738 }
9739
9740 /**
9741 This function found in impl
9742 {libcrux_ml_kem::polynomial::PolynomialRingElement<Vector>[TraitClause@0]}
9743 */
9744 /**
9745 A monomorphic instance of libcrux_ml_kem.polynomial.from_i16_array_89
9746 with types libcrux_ml_kem_vector_portable_vector_type_PortableVector
9747 with const generics
9748
9749 */
9750 static KRML_MUSTINLINE libcrux_ml_kem_polynomial_PolynomialRingElement_f0
libcrux_ml_kem_polynomial_from_i16_array_89_c1(Eurydice_slice a)9751 libcrux_ml_kem_polynomial_from_i16_array_89_c1(Eurydice_slice a) {
9752 libcrux_ml_kem_polynomial_PolynomialRingElement_f0 result =
9753 libcrux_ml_kem_polynomial_ZERO_89_ea();
9754 for (size_t i = (size_t)0U;
9755 i < LIBCRUX_ML_KEM_POLYNOMIAL_VECTORS_IN_RING_ELEMENT; i++) {
9756 size_t i0 = i;
9757 libcrux_ml_kem_vector_portable_vector_type_PortableVector uu____0 =
9758 libcrux_ml_kem_vector_portable_from_i16_array_0d(
9759 Eurydice_slice_subslice2(a, i0 * (size_t)16U,
9760 (i0 + (size_t)1U) * (size_t)16U, int16_t));
9761 result.coefficients[i0] = uu____0;
9762 }
9763 return result;
9764 }
9765
9766 /**
9767 A monomorphic instance of libcrux_ml_kem.sampling.sample_from_xof.closure
9768 with types libcrux_ml_kem_vector_portable_vector_type_PortableVector,
9769 libcrux_ml_kem_hash_functions_portable_PortableHash[[$3size_t]] with const
9770 generics
9771 - K= 3
9772 */
9773 static inline libcrux_ml_kem_polynomial_PolynomialRingElement_f0
libcrux_ml_kem_sampling_sample_from_xof_closure_04(int16_t s[272U])9774 libcrux_ml_kem_sampling_sample_from_xof_closure_04(int16_t s[272U]) {
9775 return libcrux_ml_kem_polynomial_from_i16_array_89_c1(
9776 Eurydice_array_to_subslice2(s, (size_t)0U, (size_t)256U, int16_t));
9777 }
9778
9779 /**
9780 A monomorphic instance of libcrux_ml_kem.sampling.sample_from_xof
9781 with types libcrux_ml_kem_vector_portable_vector_type_PortableVector,
9782 libcrux_ml_kem_hash_functions_portable_PortableHash[[$3size_t]] with const
9783 generics
9784 - K= 3
9785 */
libcrux_ml_kem_sampling_sample_from_xof_3f(uint8_t seeds[3U][34U],libcrux_ml_kem_polynomial_PolynomialRingElement_f0 ret[3U])9786 static KRML_MUSTINLINE void libcrux_ml_kem_sampling_sample_from_xof_3f(
9787 uint8_t seeds[3U][34U],
9788 libcrux_ml_kem_polynomial_PolynomialRingElement_f0 ret[3U]) {
9789 size_t sampled_coefficients[3U] = {0U};
9790 int16_t out[3U][272U] = {{0U}};
9791 /* Passing arrays by value in Rust generates a copy in C */
9792 uint8_t copy_of_seeds[3U][34U];
9793 memcpy(copy_of_seeds, seeds, (size_t)3U * sizeof(uint8_t[34U]));
9794 libcrux_ml_kem_hash_functions_portable_PortableHash_58 xof_state =
9795 libcrux_ml_kem_hash_functions_portable_shake128_init_absorb_f1_8c(
9796 copy_of_seeds);
9797 uint8_t randomness0[3U][504U];
9798 libcrux_ml_kem_hash_functions_portable_shake128_squeeze_three_blocks_f1_69(
9799 &xof_state, randomness0);
9800 /* Passing arrays by value in Rust generates a copy in C */
9801 uint8_t copy_of_randomness0[3U][504U];
9802 memcpy(copy_of_randomness0, randomness0, (size_t)3U * sizeof(uint8_t[504U]));
9803 bool done = libcrux_ml_kem_sampling_sample_from_uniform_distribution_next_db(
9804 copy_of_randomness0, sampled_coefficients, out);
9805 while (true) {
9806 if (done) {
9807 break;
9808 } else {
9809 uint8_t randomness[3U][168U];
9810 libcrux_ml_kem_hash_functions_portable_shake128_squeeze_block_f1_60(
9811 &xof_state, randomness);
9812 /* Passing arrays by value in Rust generates a copy in C */
9813 uint8_t copy_of_randomness[3U][168U];
9814 memcpy(copy_of_randomness, randomness,
9815 (size_t)3U * sizeof(uint8_t[168U]));
9816 done = libcrux_ml_kem_sampling_sample_from_uniform_distribution_next_db0(
9817 copy_of_randomness, sampled_coefficients, out);
9818 }
9819 }
9820 /* Passing arrays by value in Rust generates a copy in C */
9821 int16_t copy_of_out[3U][272U];
9822 memcpy(copy_of_out, out, (size_t)3U * sizeof(int16_t[272U]));
9823 libcrux_ml_kem_polynomial_PolynomialRingElement_f0 ret0[3U];
9824 for (size_t i = (size_t)0U; i < (size_t)3U; i++) {
9825 ret0[i] =
9826 libcrux_ml_kem_sampling_sample_from_xof_closure_04(copy_of_out[i]);
9827 }
9828 memcpy(
9829 ret, ret0,
9830 (size_t)3U * sizeof(libcrux_ml_kem_polynomial_PolynomialRingElement_f0));
9831 }
9832
9833 /**
9834 A monomorphic instance of libcrux_ml_kem.matrix.sample_matrix_A
9835 with types libcrux_ml_kem_vector_portable_vector_type_PortableVector,
9836 libcrux_ml_kem_hash_functions_portable_PortableHash[[$3size_t]] with const
9837 generics
9838 - K= 3
9839 */
libcrux_ml_kem_matrix_sample_matrix_A_38(uint8_t seed[34U],bool transpose,libcrux_ml_kem_polynomial_PolynomialRingElement_f0 ret[3U][3U])9840 static KRML_MUSTINLINE void libcrux_ml_kem_matrix_sample_matrix_A_38(
9841 uint8_t seed[34U], bool transpose,
9842 libcrux_ml_kem_polynomial_PolynomialRingElement_f0 ret[3U][3U]) {
9843 libcrux_ml_kem_polynomial_PolynomialRingElement_f0 A_transpose[3U][3U];
9844 for (size_t i = (size_t)0U; i < (size_t)3U; i++) {
9845 libcrux_ml_kem_matrix_sample_matrix_A_closure_4b(i, A_transpose[i]);
9846 }
9847 for (size_t i0 = (size_t)0U; i0 < (size_t)3U; i0++) {
9848 size_t i1 = i0;
9849 /* Passing arrays by value in Rust generates a copy in C */
9850 uint8_t copy_of_seed[34U];
9851 memcpy(copy_of_seed, seed, (size_t)34U * sizeof(uint8_t));
9852 uint8_t seeds[3U][34U];
9853 for (size_t i = (size_t)0U; i < (size_t)3U; i++) {
9854 memcpy(seeds[i], copy_of_seed, (size_t)34U * sizeof(uint8_t));
9855 }
9856 for (size_t i = (size_t)0U; i < (size_t)3U; i++) {
9857 size_t j = i;
9858 seeds[j][32U] = (uint8_t)i1;
9859 seeds[j][33U] = (uint8_t)j;
9860 }
9861 /* Passing arrays by value in Rust generates a copy in C */
9862 uint8_t copy_of_seeds[3U][34U];
9863 memcpy(copy_of_seeds, seeds, (size_t)3U * sizeof(uint8_t[34U]));
9864 libcrux_ml_kem_polynomial_PolynomialRingElement_f0 sampled[3U];
9865 libcrux_ml_kem_sampling_sample_from_xof_3f(copy_of_seeds, sampled);
9866 for (size_t i = (size_t)0U;
9867 i < Eurydice_slice_len(
9868 Eurydice_array_to_slice(
9869 (size_t)3U, sampled,
9870 libcrux_ml_kem_polynomial_PolynomialRingElement_f0),
9871 libcrux_ml_kem_polynomial_PolynomialRingElement_f0);
9872 i++) {
9873 size_t j = i;
9874 libcrux_ml_kem_polynomial_PolynomialRingElement_f0 sample = sampled[j];
9875 if (transpose) {
9876 A_transpose[j][i1] = sample;
9877 } else {
9878 A_transpose[i1][j] = sample;
9879 }
9880 }
9881 }
9882 memcpy(ret, A_transpose,
9883 (size_t)3U *
9884 sizeof(libcrux_ml_kem_polynomial_PolynomialRingElement_f0[3U]));
9885 }
9886
9887 /**
9888 A monomorphic instance of K.
9889 with types libcrux_ml_kem_polynomial_PolynomialRingElement
9890 libcrux_ml_kem_vector_portable_vector_type_PortableVector[3size_t], uint8_t
9891
9892 */
9893 typedef struct tuple_b0_s {
9894 libcrux_ml_kem_polynomial_PolynomialRingElement_f0 fst[3U];
9895 uint8_t snd;
9896 } tuple_b0;
9897
9898 /**
9899 A monomorphic instance of
9900 libcrux_ml_kem.ind_cpa.sample_vector_cbd_then_ntt.closure with types
9901 libcrux_ml_kem_vector_portable_vector_type_PortableVector,
9902 libcrux_ml_kem_hash_functions_portable_PortableHash[[$3size_t]] with const
9903 generics
9904 - K= 3
9905 - ETA= 2
9906 - ETA_RANDOMNESS_SIZE= 128
9907 */
9908 static inline libcrux_ml_kem_polynomial_PolynomialRingElement_f0
libcrux_ml_kem_ind_cpa_sample_vector_cbd_then_ntt_closure_f7(size_t _i)9909 libcrux_ml_kem_ind_cpa_sample_vector_cbd_then_ntt_closure_f7(size_t _i) {
9910 return libcrux_ml_kem_polynomial_ZERO_89_ea();
9911 }
9912
9913 /**
9914 A monomorphic instance of libcrux_ml_kem.hash_functions.portable.PRFxN
9915 with const generics
9916 - K= 3
9917 - LEN= 128
9918 */
libcrux_ml_kem_hash_functions_portable_PRFxN_c5(uint8_t (* input)[33U],uint8_t ret[3U][128U])9919 static KRML_MUSTINLINE void libcrux_ml_kem_hash_functions_portable_PRFxN_c5(
9920 uint8_t (*input)[33U], uint8_t ret[3U][128U]) {
9921 uint8_t out[3U][128U] = {{0U}};
9922 for (size_t i = (size_t)0U; i < (size_t)3U; i++) {
9923 size_t i0 = i;
9924 libcrux_sha3_portable_shake256(
9925 Eurydice_array_to_slice((size_t)128U, out[i0], uint8_t),
9926 Eurydice_array_to_slice((size_t)33U, input[i0], uint8_t));
9927 }
9928 memcpy(ret, out, (size_t)3U * sizeof(uint8_t[128U]));
9929 }
9930
9931 /**
9932 This function found in impl {(libcrux_ml_kem::hash_functions::Hash<K> for
9933 libcrux_ml_kem::hash_functions::portable::PortableHash<K>)}
9934 */
9935 /**
9936 A monomorphic instance of libcrux_ml_kem.hash_functions.portable.PRFxN_f1
9937 with const generics
9938 - K= 3
9939 - LEN= 128
9940 */
libcrux_ml_kem_hash_functions_portable_PRFxN_f1_93(uint8_t (* input)[33U],uint8_t ret[3U][128U])9941 static KRML_MUSTINLINE void libcrux_ml_kem_hash_functions_portable_PRFxN_f1_93(
9942 uint8_t (*input)[33U], uint8_t ret[3U][128U]) {
9943 libcrux_ml_kem_hash_functions_portable_PRFxN_c5(input, ret);
9944 }
9945
9946 /**
9947 Given a series of uniformly random bytes in `randomness`, for some number
9948 `eta`, the `sample_from_binomial_distribution_{eta}` functions sample a ring
9949 element from a binomial distribution centered at 0 that uses two sets of `eta`
9950 coin flips. If, for example, `eta = ETA`, each ring coefficient is a value `v`
9951 such such that `v ∈ {-ETA, -ETA + 1, ..., 0, ..., ETA + 1, ETA}` and:
9952
9953 ```plaintext
9954 - If v < 0, Pr[v] = Pr[-v]
9955 - If v >= 0, Pr[v] = BINOMIAL_COEFFICIENT(2 * ETA; ETA - v) / 2 ^ (2 * ETA)
9956 ```
9957
9958 The values `v < 0` are mapped to the appropriate `KyberFieldElement`.
9959
9960 The expected value is:
9961
9962 ```plaintext
9963 E[X] = (-ETA)Pr[-ETA] + (-(ETA - 1))Pr[-(ETA - 1)] + ... + (ETA - 1)Pr[ETA - 1]
9964 + (ETA)Pr[ETA] = 0 since Pr[-v] = Pr[v] when v < 0.
9965 ```
9966
9967 And the variance is:
9968
9969 ```plaintext
9970 Var(X) = E[(X - E[X])^2]
9971 = E[X^2]
9972 = sum_(v=-ETA to ETA)v^2 * (BINOMIAL_COEFFICIENT(2 * ETA; ETA - v) /
9973 2^(2 * ETA)) = ETA / 2
9974 ```
9975
9976 This function implements <strong>Algorithm 7</strong> of the NIST FIPS 203
9977 standard, which is reproduced below:
9978
9979 ```plaintext
9980 Input: byte array B ∈ ^{64η}.
9981 Output: array f ∈ ℤ₂₅₆.
9982
9983 b ← BytesToBits(B)
9984 for (i ← 0; i < 256; i++)
9985 x ← ∑(j=0 to η - 1) b[2iη + j]
9986 y ← ∑(j=0 to η - 1) b[2iη + η + j]
9987 f[i] ← x−y mod q
9988 end for
9989 return f
9990 ```
9991
9992 The NIST FIPS 203 standard can be found at
9993 <https://csrc.nist.gov/pubs/fips/203/ipd>.
9994 */
9995 /**
9996 A monomorphic instance of
9997 libcrux_ml_kem.sampling.sample_from_binomial_distribution_2 with types
9998 libcrux_ml_kem_vector_portable_vector_type_PortableVector with const generics
9999
10000 */
10001 static KRML_MUSTINLINE libcrux_ml_kem_polynomial_PolynomialRingElement_f0
libcrux_ml_kem_sampling_sample_from_binomial_distribution_2_85(Eurydice_slice randomness)10002 libcrux_ml_kem_sampling_sample_from_binomial_distribution_2_85(
10003 Eurydice_slice randomness) {
10004 int16_t sampled_i16s[256U] = {0U};
10005 for (size_t i0 = (size_t)0U;
10006 i0 < Eurydice_slice_len(randomness, uint8_t) / (size_t)4U; i0++) {
10007 size_t chunk_number = i0;
10008 Eurydice_slice byte_chunk = Eurydice_slice_subslice2(
10009 randomness, chunk_number * (size_t)4U,
10010 chunk_number * (size_t)4U + (size_t)4U, uint8_t);
10011 uint32_t random_bits_as_u32 =
10012 (((uint32_t)Eurydice_slice_index(byte_chunk, (size_t)0U, uint8_t,
10013 uint8_t *) |
10014 (uint32_t)Eurydice_slice_index(byte_chunk, (size_t)1U, uint8_t,
10015 uint8_t *)
10016 << 8U) |
10017 (uint32_t)Eurydice_slice_index(byte_chunk, (size_t)2U, uint8_t,
10018 uint8_t *)
10019 << 16U) |
10020 (uint32_t)Eurydice_slice_index(byte_chunk, (size_t)3U, uint8_t,
10021 uint8_t *)
10022 << 24U;
10023 uint32_t even_bits = random_bits_as_u32 & 1431655765U;
10024 uint32_t odd_bits = random_bits_as_u32 >> 1U & 1431655765U;
10025 uint32_t coin_toss_outcomes = even_bits + odd_bits;
10026 for (uint32_t i = 0U; i < CORE_NUM__U32_8__BITS / 4U; i++) {
10027 uint32_t outcome_set = i;
10028 uint32_t outcome_set0 = outcome_set * 4U;
10029 int16_t outcome_1 =
10030 (int16_t)(coin_toss_outcomes >> (uint32_t)outcome_set0 & 3U);
10031 int16_t outcome_2 =
10032 (int16_t)(coin_toss_outcomes >> (uint32_t)(outcome_set0 + 2U) & 3U);
10033 size_t offset = (size_t)(outcome_set0 >> 2U);
10034 sampled_i16s[(size_t)8U * chunk_number + offset] = outcome_1 - outcome_2;
10035 }
10036 }
10037 return libcrux_ml_kem_polynomial_from_i16_array_89_c1(
10038 Eurydice_array_to_slice((size_t)256U, sampled_i16s, int16_t));
10039 }
10040
10041 /**
10042 A monomorphic instance of
10043 libcrux_ml_kem.sampling.sample_from_binomial_distribution_3 with types
10044 libcrux_ml_kem_vector_portable_vector_type_PortableVector with const generics
10045
10046 */
10047 static KRML_MUSTINLINE libcrux_ml_kem_polynomial_PolynomialRingElement_f0
libcrux_ml_kem_sampling_sample_from_binomial_distribution_3_eb(Eurydice_slice randomness)10048 libcrux_ml_kem_sampling_sample_from_binomial_distribution_3_eb(
10049 Eurydice_slice randomness) {
10050 int16_t sampled_i16s[256U] = {0U};
10051 for (size_t i0 = (size_t)0U;
10052 i0 < Eurydice_slice_len(randomness, uint8_t) / (size_t)3U; i0++) {
10053 size_t chunk_number = i0;
10054 Eurydice_slice byte_chunk = Eurydice_slice_subslice2(
10055 randomness, chunk_number * (size_t)3U,
10056 chunk_number * (size_t)3U + (size_t)3U, uint8_t);
10057 uint32_t random_bits_as_u24 =
10058 ((uint32_t)Eurydice_slice_index(byte_chunk, (size_t)0U, uint8_t,
10059 uint8_t *) |
10060 (uint32_t)Eurydice_slice_index(byte_chunk, (size_t)1U, uint8_t,
10061 uint8_t *)
10062 << 8U) |
10063 (uint32_t)Eurydice_slice_index(byte_chunk, (size_t)2U, uint8_t,
10064 uint8_t *)
10065 << 16U;
10066 uint32_t first_bits = random_bits_as_u24 & 2396745U;
10067 uint32_t second_bits = random_bits_as_u24 >> 1U & 2396745U;
10068 uint32_t third_bits = random_bits_as_u24 >> 2U & 2396745U;
10069 uint32_t coin_toss_outcomes = first_bits + second_bits + third_bits;
10070 for (int32_t i = (int32_t)0; i < (int32_t)24 / (int32_t)6; i++) {
10071 int32_t outcome_set = i;
10072 int32_t outcome_set0 = outcome_set * (int32_t)6;
10073 int16_t outcome_1 =
10074 (int16_t)(coin_toss_outcomes >> (uint32_t)outcome_set0 & 7U);
10075 int16_t outcome_2 = (int16_t)(coin_toss_outcomes >>
10076 (uint32_t)(outcome_set0 + (int32_t)3) &
10077 7U);
10078 size_t offset = (size_t)(outcome_set0 / (int32_t)6);
10079 sampled_i16s[(size_t)4U * chunk_number + offset] = outcome_1 - outcome_2;
10080 }
10081 }
10082 return libcrux_ml_kem_polynomial_from_i16_array_89_c1(
10083 Eurydice_array_to_slice((size_t)256U, sampled_i16s, int16_t));
10084 }
10085
10086 /**
10087 A monomorphic instance of
10088 libcrux_ml_kem.sampling.sample_from_binomial_distribution with types
10089 libcrux_ml_kem_vector_portable_vector_type_PortableVector with const generics
10090 - ETA= 2
10091 */
10092 static KRML_MUSTINLINE libcrux_ml_kem_polynomial_PolynomialRingElement_f0
libcrux_ml_kem_sampling_sample_from_binomial_distribution_c6(Eurydice_slice randomness)10093 libcrux_ml_kem_sampling_sample_from_binomial_distribution_c6(
10094 Eurydice_slice randomness) {
10095 return libcrux_ml_kem_sampling_sample_from_binomial_distribution_2_85(
10096 randomness);
10097 }
10098
10099 /**
10100 A monomorphic instance of libcrux_ml_kem.ntt.ntt_at_layer_7
10101 with types libcrux_ml_kem_vector_portable_vector_type_PortableVector
10102 with const generics
10103
10104 */
libcrux_ml_kem_ntt_ntt_at_layer_7_f4(libcrux_ml_kem_polynomial_PolynomialRingElement_f0 * re)10105 static KRML_MUSTINLINE void libcrux_ml_kem_ntt_ntt_at_layer_7_f4(
10106 libcrux_ml_kem_polynomial_PolynomialRingElement_f0 *re) {
10107 size_t step = LIBCRUX_ML_KEM_POLYNOMIAL_VECTORS_IN_RING_ELEMENT / (size_t)2U;
10108 for (size_t i = (size_t)0U; i < step; i++) {
10109 size_t j = i;
10110 libcrux_ml_kem_vector_portable_vector_type_PortableVector t =
10111 libcrux_ml_kem_vector_portable_multiply_by_constant_0d(
10112 re->coefficients[j + step], (int16_t)-1600);
10113 re->coefficients[j + step] =
10114 libcrux_ml_kem_vector_portable_sub_0d(re->coefficients[j], &t);
10115 libcrux_ml_kem_vector_portable_vector_type_PortableVector uu____1 =
10116 libcrux_ml_kem_vector_portable_add_0d(re->coefficients[j], &t);
10117 re->coefficients[j] = uu____1;
10118 }
10119 }
10120
10121 /**
10122 A monomorphic instance of libcrux_ml_kem.ntt.ntt_binomially_sampled_ring_element
10123 with types libcrux_ml_kem_vector_portable_vector_type_PortableVector
10124 with const generics
10125
10126 */
10127 static KRML_MUSTINLINE void
libcrux_ml_kem_ntt_ntt_binomially_sampled_ring_element_0f(libcrux_ml_kem_polynomial_PolynomialRingElement_f0 * re)10128 libcrux_ml_kem_ntt_ntt_binomially_sampled_ring_element_0f(
10129 libcrux_ml_kem_polynomial_PolynomialRingElement_f0 *re) {
10130 libcrux_ml_kem_ntt_ntt_at_layer_7_f4(re);
10131 size_t zeta_i = (size_t)1U;
10132 libcrux_ml_kem_ntt_ntt_at_layer_4_plus_51(&zeta_i, re, (size_t)6U,
10133 (size_t)3U);
10134 libcrux_ml_kem_ntt_ntt_at_layer_4_plus_51(&zeta_i, re, (size_t)5U,
10135 (size_t)3U);
10136 libcrux_ml_kem_ntt_ntt_at_layer_4_plus_51(&zeta_i, re, (size_t)4U,
10137 (size_t)3U);
10138 libcrux_ml_kem_ntt_ntt_at_layer_3_fd(&zeta_i, re, (size_t)3U, (size_t)3U);
10139 libcrux_ml_kem_ntt_ntt_at_layer_2_ad(&zeta_i, re, (size_t)2U, (size_t)3U);
10140 libcrux_ml_kem_ntt_ntt_at_layer_1_a2(&zeta_i, re, (size_t)1U, (size_t)3U);
10141 libcrux_ml_kem_polynomial_poly_barrett_reduce_89_8b(re);
10142 }
10143
10144 /**
10145 Sample a vector of ring elements from a centered binomial distribution and
10146 convert them into their NTT representations.
10147 */
10148 /**
10149 A monomorphic instance of libcrux_ml_kem.ind_cpa.sample_vector_cbd_then_ntt
10150 with types libcrux_ml_kem_vector_portable_vector_type_PortableVector,
10151 libcrux_ml_kem_hash_functions_portable_PortableHash[[$3size_t]] with const
10152 generics
10153 - K= 3
10154 - ETA= 2
10155 - ETA_RANDOMNESS_SIZE= 128
10156 */
10157 static KRML_MUSTINLINE tuple_b0
libcrux_ml_kem_ind_cpa_sample_vector_cbd_then_ntt_fc(uint8_t prf_input[33U],uint8_t domain_separator)10158 libcrux_ml_kem_ind_cpa_sample_vector_cbd_then_ntt_fc(uint8_t prf_input[33U],
10159 uint8_t domain_separator) {
10160 libcrux_ml_kem_polynomial_PolynomialRingElement_f0 re_as_ntt[3U];
10161 for (size_t i = (size_t)0U; i < (size_t)3U; i++) {
10162 re_as_ntt[i] = libcrux_ml_kem_polynomial_ZERO_89_ea();
10163 }
10164 /* Passing arrays by value in Rust generates a copy in C */
10165 uint8_t copy_of_prf_input[33U];
10166 memcpy(copy_of_prf_input, prf_input, (size_t)33U * sizeof(uint8_t));
10167 uint8_t prf_inputs[3U][33U];
10168 for (size_t i = (size_t)0U; i < (size_t)3U; i++) {
10169 memcpy(prf_inputs[i], copy_of_prf_input, (size_t)33U * sizeof(uint8_t));
10170 }
10171 for (size_t i = (size_t)0U; i < (size_t)3U; i++) {
10172 size_t i0 = i;
10173 prf_inputs[i0][32U] = domain_separator;
10174 domain_separator = (uint32_t)domain_separator + 1U;
10175 }
10176 uint8_t prf_outputs[3U][128U];
10177 libcrux_ml_kem_hash_functions_portable_PRFxN_f1_93(prf_inputs, prf_outputs);
10178 for (size_t i = (size_t)0U; i < (size_t)3U; i++) {
10179 size_t i0 = i;
10180 re_as_ntt[i0] =
10181 libcrux_ml_kem_sampling_sample_from_binomial_distribution_c6(
10182 Eurydice_array_to_slice((size_t)128U, prf_outputs[i0], uint8_t));
10183 libcrux_ml_kem_ntt_ntt_binomially_sampled_ring_element_0f(&re_as_ntt[i0]);
10184 }
10185 /* Passing arrays by value in Rust generates a copy in C */
10186 libcrux_ml_kem_polynomial_PolynomialRingElement_f0 copy_of_re_as_ntt[3U];
10187 memcpy(
10188 copy_of_re_as_ntt, re_as_ntt,
10189 (size_t)3U * sizeof(libcrux_ml_kem_polynomial_PolynomialRingElement_f0));
10190 tuple_b0 lit;
10191 memcpy(
10192 lit.fst, copy_of_re_as_ntt,
10193 (size_t)3U * sizeof(libcrux_ml_kem_polynomial_PolynomialRingElement_f0));
10194 lit.snd = domain_separator;
10195 return lit;
10196 }
10197
10198 /**
10199 A monomorphic instance of libcrux_ml_kem.ind_cpa.sample_ring_element_cbd.closure
10200 with types libcrux_ml_kem_vector_portable_vector_type_PortableVector,
10201 libcrux_ml_kem_hash_functions_portable_PortableHash[[$3size_t]] with const
10202 generics
10203 - K= 3
10204 - ETA2_RANDOMNESS_SIZE= 128
10205 - ETA2= 2
10206 */
10207 static inline libcrux_ml_kem_polynomial_PolynomialRingElement_f0
libcrux_ml_kem_ind_cpa_sample_ring_element_cbd_closure_77(size_t _i)10208 libcrux_ml_kem_ind_cpa_sample_ring_element_cbd_closure_77(size_t _i) {
10209 return libcrux_ml_kem_polynomial_ZERO_89_ea();
10210 }
10211
10212 /**
10213 Sample a vector of ring elements from a centered binomial distribution.
10214 */
10215 /**
10216 A monomorphic instance of libcrux_ml_kem.ind_cpa.sample_ring_element_cbd
10217 with types libcrux_ml_kem_vector_portable_vector_type_PortableVector,
10218 libcrux_ml_kem_hash_functions_portable_PortableHash[[$3size_t]] with const
10219 generics
10220 - K= 3
10221 - ETA2_RANDOMNESS_SIZE= 128
10222 - ETA2= 2
10223 */
10224 static KRML_MUSTINLINE tuple_b0
libcrux_ml_kem_ind_cpa_sample_ring_element_cbd_ac(uint8_t prf_input[33U],uint8_t domain_separator)10225 libcrux_ml_kem_ind_cpa_sample_ring_element_cbd_ac(uint8_t prf_input[33U],
10226 uint8_t domain_separator) {
10227 libcrux_ml_kem_polynomial_PolynomialRingElement_f0 error_1[3U];
10228 for (size_t i = (size_t)0U; i < (size_t)3U; i++) {
10229 error_1[i] = libcrux_ml_kem_polynomial_ZERO_89_ea();
10230 }
10231 /* Passing arrays by value in Rust generates a copy in C */
10232 uint8_t copy_of_prf_input[33U];
10233 memcpy(copy_of_prf_input, prf_input, (size_t)33U * sizeof(uint8_t));
10234 uint8_t prf_inputs[3U][33U];
10235 for (size_t i = (size_t)0U; i < (size_t)3U; i++) {
10236 memcpy(prf_inputs[i], copy_of_prf_input, (size_t)33U * sizeof(uint8_t));
10237 }
10238 for (size_t i = (size_t)0U; i < (size_t)3U; i++) {
10239 size_t i0 = i;
10240 prf_inputs[i0][32U] = domain_separator;
10241 domain_separator = (uint32_t)domain_separator + 1U;
10242 }
10243 uint8_t prf_outputs[3U][128U];
10244 libcrux_ml_kem_hash_functions_portable_PRFxN_f1_93(prf_inputs, prf_outputs);
10245 for (size_t i = (size_t)0U; i < (size_t)3U; i++) {
10246 size_t i0 = i;
10247 libcrux_ml_kem_polynomial_PolynomialRingElement_f0 uu____1 =
10248 libcrux_ml_kem_sampling_sample_from_binomial_distribution_c6(
10249 Eurydice_array_to_slice((size_t)128U, prf_outputs[i0], uint8_t));
10250 error_1[i0] = uu____1;
10251 }
10252 /* Passing arrays by value in Rust generates a copy in C */
10253 libcrux_ml_kem_polynomial_PolynomialRingElement_f0 copy_of_error_1[3U];
10254 memcpy(
10255 copy_of_error_1, error_1,
10256 (size_t)3U * sizeof(libcrux_ml_kem_polynomial_PolynomialRingElement_f0));
10257 tuple_b0 lit;
10258 memcpy(
10259 lit.fst, copy_of_error_1,
10260 (size_t)3U * sizeof(libcrux_ml_kem_polynomial_PolynomialRingElement_f0));
10261 lit.snd = domain_separator;
10262 return lit;
10263 }
10264
10265 /**
10266 A monomorphic instance of libcrux_ml_kem.hash_functions.portable.PRF
10267 with const generics
10268 - LEN= 128
10269 */
libcrux_ml_kem_hash_functions_portable_PRF_2b0(Eurydice_slice input,uint8_t ret[128U])10270 static KRML_MUSTINLINE void libcrux_ml_kem_hash_functions_portable_PRF_2b0(
10271 Eurydice_slice input, uint8_t ret[128U]) {
10272 uint8_t digest[128U] = {0U};
10273 libcrux_sha3_portable_shake256(
10274 Eurydice_array_to_slice((size_t)128U, digest, uint8_t), input);
10275 memcpy(ret, digest, (size_t)128U * sizeof(uint8_t));
10276 }
10277
10278 /**
10279 This function found in impl {(libcrux_ml_kem::hash_functions::Hash<K> for
10280 libcrux_ml_kem::hash_functions::portable::PortableHash<K>)}
10281 */
10282 /**
10283 A monomorphic instance of libcrux_ml_kem.hash_functions.portable.PRF_f1
10284 with const generics
10285 - K= 3
10286 - LEN= 128
10287 */
libcrux_ml_kem_hash_functions_portable_PRF_f1_ee0(Eurydice_slice input,uint8_t ret[128U])10288 static KRML_MUSTINLINE void libcrux_ml_kem_hash_functions_portable_PRF_f1_ee0(
10289 Eurydice_slice input, uint8_t ret[128U]) {
10290 libcrux_ml_kem_hash_functions_portable_PRF_2b0(input, ret);
10291 }
10292
10293 /**
10294 A monomorphic instance of libcrux_ml_kem.matrix.compute_vector_u.closure
10295 with types libcrux_ml_kem_vector_portable_vector_type_PortableVector
10296 with const generics
10297 - K= 3
10298 */
10299 static inline libcrux_ml_kem_polynomial_PolynomialRingElement_f0
libcrux_ml_kem_matrix_compute_vector_u_closure_d6(size_t _i)10300 libcrux_ml_kem_matrix_compute_vector_u_closure_d6(size_t _i) {
10301 return libcrux_ml_kem_polynomial_ZERO_89_ea();
10302 }
10303
10304 /**
10305 This function found in impl
10306 {libcrux_ml_kem::polynomial::PolynomialRingElement<Vector>[TraitClause@0]}
10307 */
10308 /**
10309 A monomorphic instance of libcrux_ml_kem.polynomial.add_error_reduce_89
10310 with types libcrux_ml_kem_vector_portable_vector_type_PortableVector
10311 with const generics
10312
10313 */
libcrux_ml_kem_polynomial_add_error_reduce_89_38(libcrux_ml_kem_polynomial_PolynomialRingElement_f0 * self,libcrux_ml_kem_polynomial_PolynomialRingElement_f0 * error)10314 static KRML_MUSTINLINE void libcrux_ml_kem_polynomial_add_error_reduce_89_38(
10315 libcrux_ml_kem_polynomial_PolynomialRingElement_f0 *self,
10316 libcrux_ml_kem_polynomial_PolynomialRingElement_f0 *error) {
10317 for (size_t i = (size_t)0U;
10318 i < LIBCRUX_ML_KEM_POLYNOMIAL_VECTORS_IN_RING_ELEMENT; i++) {
10319 size_t j = i;
10320 libcrux_ml_kem_vector_portable_vector_type_PortableVector
10321 coefficient_normal_form =
10322 libcrux_ml_kem_vector_portable_montgomery_multiply_by_constant_0d(
10323 self->coefficients[j], (int16_t)1441);
10324 libcrux_ml_kem_vector_portable_vector_type_PortableVector uu____0 =
10325 libcrux_ml_kem_vector_portable_barrett_reduce_0d(
10326 libcrux_ml_kem_vector_portable_add_0d(coefficient_normal_form,
10327 &error->coefficients[j]));
10328 self->coefficients[j] = uu____0;
10329 }
10330 }
10331
10332 /**
10333 Compute u := InvertNTT(Aᵀ ◦ r̂) + e₁
10334 */
10335 /**
10336 A monomorphic instance of libcrux_ml_kem.matrix.compute_vector_u
10337 with types libcrux_ml_kem_vector_portable_vector_type_PortableVector
10338 with const generics
10339 - K= 3
10340 */
libcrux_ml_kem_matrix_compute_vector_u_59(libcrux_ml_kem_polynomial_PolynomialRingElement_f0 (* a_as_ntt)[3U],libcrux_ml_kem_polynomial_PolynomialRingElement_f0 * r_as_ntt,libcrux_ml_kem_polynomial_PolynomialRingElement_f0 * error_1,libcrux_ml_kem_polynomial_PolynomialRingElement_f0 ret[3U])10341 static KRML_MUSTINLINE void libcrux_ml_kem_matrix_compute_vector_u_59(
10342 libcrux_ml_kem_polynomial_PolynomialRingElement_f0 (*a_as_ntt)[3U],
10343 libcrux_ml_kem_polynomial_PolynomialRingElement_f0 *r_as_ntt,
10344 libcrux_ml_kem_polynomial_PolynomialRingElement_f0 *error_1,
10345 libcrux_ml_kem_polynomial_PolynomialRingElement_f0 ret[3U]) {
10346 libcrux_ml_kem_polynomial_PolynomialRingElement_f0 result[3U];
10347 for (size_t i = (size_t)0U; i < (size_t)3U; i++) {
10348 result[i] = libcrux_ml_kem_polynomial_ZERO_89_ea();
10349 }
10350 for (size_t i0 = (size_t)0U;
10351 i0 < Eurydice_slice_len(
10352 Eurydice_array_to_slice(
10353 (size_t)3U, a_as_ntt,
10354 libcrux_ml_kem_polynomial_PolynomialRingElement_f0[3U]),
10355 libcrux_ml_kem_polynomial_PolynomialRingElement_f0[3U]);
10356 i0++) {
10357 size_t i1 = i0;
10358 libcrux_ml_kem_polynomial_PolynomialRingElement_f0 *row = a_as_ntt[i1];
10359 for (size_t i = (size_t)0U;
10360 i < Eurydice_slice_len(
10361 Eurydice_array_to_slice(
10362 (size_t)3U, row,
10363 libcrux_ml_kem_polynomial_PolynomialRingElement_f0),
10364 libcrux_ml_kem_polynomial_PolynomialRingElement_f0);
10365 i++) {
10366 size_t j = i;
10367 libcrux_ml_kem_polynomial_PolynomialRingElement_f0 *a_element = &row[j];
10368 libcrux_ml_kem_polynomial_PolynomialRingElement_f0 product =
10369 libcrux_ml_kem_polynomial_ntt_multiply_89_2a(a_element, &r_as_ntt[j]);
10370 libcrux_ml_kem_polynomial_add_to_ring_element_89_84(&result[i1],
10371 &product);
10372 }
10373 libcrux_ml_kem_invert_ntt_invert_ntt_montgomery_f6(&result[i1]);
10374 libcrux_ml_kem_polynomial_add_error_reduce_89_38(&result[i1], &error_1[i1]);
10375 }
10376 memcpy(
10377 ret, result,
10378 (size_t)3U * sizeof(libcrux_ml_kem_polynomial_PolynomialRingElement_f0));
10379 }
10380
10381 /**
10382 A monomorphic instance of libcrux_ml_kem.vector.traits.decompress_1
10383 with types libcrux_ml_kem_vector_portable_vector_type_PortableVector
10384 with const generics
10385
10386 */
10387 static inline libcrux_ml_kem_vector_portable_vector_type_PortableVector
libcrux_ml_kem_vector_traits_decompress_1_63(libcrux_ml_kem_vector_portable_vector_type_PortableVector v)10388 libcrux_ml_kem_vector_traits_decompress_1_63(
10389 libcrux_ml_kem_vector_portable_vector_type_PortableVector v) {
10390 libcrux_ml_kem_vector_portable_vector_type_PortableVector uu____0 =
10391 libcrux_ml_kem_vector_portable_ZERO_0d();
10392 return libcrux_ml_kem_vector_portable_bitwise_and_with_constant_0d(
10393 libcrux_ml_kem_vector_portable_sub_0d(uu____0, &v), (int16_t)1665);
10394 }
10395
10396 /**
10397 A monomorphic instance of
10398 libcrux_ml_kem.serialize.deserialize_then_decompress_message with types
10399 libcrux_ml_kem_vector_portable_vector_type_PortableVector with const generics
10400
10401 */
10402 static KRML_MUSTINLINE libcrux_ml_kem_polynomial_PolynomialRingElement_f0
libcrux_ml_kem_serialize_deserialize_then_decompress_message_0d(uint8_t serialized[32U])10403 libcrux_ml_kem_serialize_deserialize_then_decompress_message_0d(
10404 uint8_t serialized[32U]) {
10405 libcrux_ml_kem_polynomial_PolynomialRingElement_f0 re =
10406 libcrux_ml_kem_polynomial_ZERO_89_ea();
10407 for (size_t i = (size_t)0U; i < (size_t)16U; i++) {
10408 size_t i0 = i;
10409 libcrux_ml_kem_vector_portable_vector_type_PortableVector
10410 coefficient_compressed =
10411 libcrux_ml_kem_vector_portable_deserialize_1_0d(
10412 Eurydice_array_to_subslice2(serialized, (size_t)2U * i0,
10413 (size_t)2U * i0 + (size_t)2U,
10414 uint8_t));
10415 libcrux_ml_kem_vector_portable_vector_type_PortableVector uu____0 =
10416 libcrux_ml_kem_vector_traits_decompress_1_63(coefficient_compressed);
10417 re.coefficients[i0] = uu____0;
10418 }
10419 return re;
10420 }
10421
10422 /**
10423 This function found in impl
10424 {libcrux_ml_kem::polynomial::PolynomialRingElement<Vector>[TraitClause@0]}
10425 */
10426 /**
10427 A monomorphic instance of libcrux_ml_kem.polynomial.add_message_error_reduce_89
10428 with types libcrux_ml_kem_vector_portable_vector_type_PortableVector
10429 with const generics
10430
10431 */
10432 static KRML_MUSTINLINE libcrux_ml_kem_polynomial_PolynomialRingElement_f0
libcrux_ml_kem_polynomial_add_message_error_reduce_89_ea(libcrux_ml_kem_polynomial_PolynomialRingElement_f0 * self,libcrux_ml_kem_polynomial_PolynomialRingElement_f0 * message,libcrux_ml_kem_polynomial_PolynomialRingElement_f0 result)10433 libcrux_ml_kem_polynomial_add_message_error_reduce_89_ea(
10434 libcrux_ml_kem_polynomial_PolynomialRingElement_f0 *self,
10435 libcrux_ml_kem_polynomial_PolynomialRingElement_f0 *message,
10436 libcrux_ml_kem_polynomial_PolynomialRingElement_f0 result) {
10437 for (size_t i = (size_t)0U;
10438 i < LIBCRUX_ML_KEM_POLYNOMIAL_VECTORS_IN_RING_ELEMENT; i++) {
10439 size_t i0 = i;
10440 libcrux_ml_kem_vector_portable_vector_type_PortableVector
10441 coefficient_normal_form =
10442 libcrux_ml_kem_vector_portable_montgomery_multiply_by_constant_0d(
10443 result.coefficients[i0], (int16_t)1441);
10444 libcrux_ml_kem_vector_portable_vector_type_PortableVector tmp =
10445 libcrux_ml_kem_vector_portable_add_0d(self->coefficients[i0],
10446 &message->coefficients[i0]);
10447 libcrux_ml_kem_vector_portable_vector_type_PortableVector tmp0 =
10448 libcrux_ml_kem_vector_portable_add_0d(coefficient_normal_form, &tmp);
10449 libcrux_ml_kem_vector_portable_vector_type_PortableVector uu____0 =
10450 libcrux_ml_kem_vector_portable_barrett_reduce_0d(tmp0);
10451 result.coefficients[i0] = uu____0;
10452 }
10453 return result;
10454 }
10455
10456 /**
10457 Compute InverseNTT(tᵀ ◦ r̂) + e₂ + message
10458 */
10459 /**
10460 A monomorphic instance of libcrux_ml_kem.matrix.compute_ring_element_v
10461 with types libcrux_ml_kem_vector_portable_vector_type_PortableVector
10462 with const generics
10463 - K= 3
10464 */
10465 static KRML_MUSTINLINE libcrux_ml_kem_polynomial_PolynomialRingElement_f0
libcrux_ml_kem_matrix_compute_ring_element_v_54(libcrux_ml_kem_polynomial_PolynomialRingElement_f0 * t_as_ntt,libcrux_ml_kem_polynomial_PolynomialRingElement_f0 * r_as_ntt,libcrux_ml_kem_polynomial_PolynomialRingElement_f0 * error_2,libcrux_ml_kem_polynomial_PolynomialRingElement_f0 * message)10466 libcrux_ml_kem_matrix_compute_ring_element_v_54(
10467 libcrux_ml_kem_polynomial_PolynomialRingElement_f0 *t_as_ntt,
10468 libcrux_ml_kem_polynomial_PolynomialRingElement_f0 *r_as_ntt,
10469 libcrux_ml_kem_polynomial_PolynomialRingElement_f0 *error_2,
10470 libcrux_ml_kem_polynomial_PolynomialRingElement_f0 *message) {
10471 libcrux_ml_kem_polynomial_PolynomialRingElement_f0 result =
10472 libcrux_ml_kem_polynomial_ZERO_89_ea();
10473 for (size_t i = (size_t)0U; i < (size_t)3U; i++) {
10474 size_t i0 = i;
10475 libcrux_ml_kem_polynomial_PolynomialRingElement_f0 product =
10476 libcrux_ml_kem_polynomial_ntt_multiply_89_2a(&t_as_ntt[i0],
10477 &r_as_ntt[i0]);
10478 libcrux_ml_kem_polynomial_add_to_ring_element_89_84(&result, &product);
10479 }
10480 libcrux_ml_kem_invert_ntt_invert_ntt_montgomery_f6(&result);
10481 result = libcrux_ml_kem_polynomial_add_message_error_reduce_89_ea(
10482 error_2, message, result);
10483 return result;
10484 }
10485
10486 /**
10487 A monomorphic instance of libcrux_ml_kem.vector.portable.compress.compress
10488 with const generics
10489 - COEFFICIENT_BITS= 10
10490 */
10491 static KRML_MUSTINLINE libcrux_ml_kem_vector_portable_vector_type_PortableVector
libcrux_ml_kem_vector_portable_compress_compress_02(libcrux_ml_kem_vector_portable_vector_type_PortableVector v)10492 libcrux_ml_kem_vector_portable_compress_compress_02(
10493 libcrux_ml_kem_vector_portable_vector_type_PortableVector v) {
10494 for (size_t i = (size_t)0U;
10495 i < LIBCRUX_ML_KEM_VECTOR_TRAITS_FIELD_ELEMENTS_IN_VECTOR; i++) {
10496 size_t i0 = i;
10497 int16_t uu____0 =
10498 libcrux_ml_kem_vector_portable_compress_compress_ciphertext_coefficient(
10499 (uint8_t)(int32_t)10, (uint16_t)v.elements[i0]);
10500 v.elements[i0] = uu____0;
10501 }
10502 return v;
10503 }
10504
10505 /**
10506 This function found in impl {(libcrux_ml_kem::vector::traits::Operations for
10507 libcrux_ml_kem::vector::portable::vector_type::PortableVector)}
10508 */
10509 /**
10510 A monomorphic instance of libcrux_ml_kem.vector.portable.compress_0d
10511 with const generics
10512 - COEFFICIENT_BITS= 10
10513 */
10514 static inline libcrux_ml_kem_vector_portable_vector_type_PortableVector
libcrux_ml_kem_vector_portable_compress_0d_28(libcrux_ml_kem_vector_portable_vector_type_PortableVector v)10515 libcrux_ml_kem_vector_portable_compress_0d_28(
10516 libcrux_ml_kem_vector_portable_vector_type_PortableVector v) {
10517 return libcrux_ml_kem_vector_portable_compress_compress_02(v);
10518 }
10519
10520 /**
10521 A monomorphic instance of libcrux_ml_kem.serialize.compress_then_serialize_10
10522 with types libcrux_ml_kem_vector_portable_vector_type_PortableVector
10523 with const generics
10524 - OUT_LEN= 320
10525 */
10526 static KRML_MUSTINLINE void
libcrux_ml_kem_serialize_compress_then_serialize_10_fc(libcrux_ml_kem_polynomial_PolynomialRingElement_f0 * re,uint8_t ret[320U])10527 libcrux_ml_kem_serialize_compress_then_serialize_10_fc(
10528 libcrux_ml_kem_polynomial_PolynomialRingElement_f0 *re, uint8_t ret[320U]) {
10529 uint8_t serialized[320U] = {0U};
10530 for (size_t i = (size_t)0U;
10531 i < LIBCRUX_ML_KEM_POLYNOMIAL_VECTORS_IN_RING_ELEMENT; i++) {
10532 size_t i0 = i;
10533 libcrux_ml_kem_vector_portable_vector_type_PortableVector coefficient =
10534 libcrux_ml_kem_vector_portable_compress_0d_28(
10535 libcrux_ml_kem_vector_traits_to_unsigned_representative_db(
10536 re->coefficients[i0]));
10537 uint8_t bytes[20U];
10538 libcrux_ml_kem_vector_portable_serialize_10_0d(coefficient, bytes);
10539 Eurydice_slice uu____0 = Eurydice_array_to_subslice2(
10540 serialized, (size_t)20U * i0, (size_t)20U * i0 + (size_t)20U, uint8_t);
10541 Eurydice_slice_copy(
10542 uu____0, Eurydice_array_to_slice((size_t)20U, bytes, uint8_t), uint8_t);
10543 }
10544 memcpy(ret, serialized, (size_t)320U * sizeof(uint8_t));
10545 }
10546
10547 /**
10548 A monomorphic instance of libcrux_ml_kem.vector.portable.compress.compress
10549 with const generics
10550 - COEFFICIENT_BITS= 11
10551 */
10552 static KRML_MUSTINLINE libcrux_ml_kem_vector_portable_vector_type_PortableVector
libcrux_ml_kem_vector_portable_compress_compress_020(libcrux_ml_kem_vector_portable_vector_type_PortableVector v)10553 libcrux_ml_kem_vector_portable_compress_compress_020(
10554 libcrux_ml_kem_vector_portable_vector_type_PortableVector v) {
10555 for (size_t i = (size_t)0U;
10556 i < LIBCRUX_ML_KEM_VECTOR_TRAITS_FIELD_ELEMENTS_IN_VECTOR; i++) {
10557 size_t i0 = i;
10558 int16_t uu____0 =
10559 libcrux_ml_kem_vector_portable_compress_compress_ciphertext_coefficient(
10560 (uint8_t)(int32_t)11, (uint16_t)v.elements[i0]);
10561 v.elements[i0] = uu____0;
10562 }
10563 return v;
10564 }
10565
10566 /**
10567 This function found in impl {(libcrux_ml_kem::vector::traits::Operations for
10568 libcrux_ml_kem::vector::portable::vector_type::PortableVector)}
10569 */
10570 /**
10571 A monomorphic instance of libcrux_ml_kem.vector.portable.compress_0d
10572 with const generics
10573 - COEFFICIENT_BITS= 11
10574 */
10575 static inline libcrux_ml_kem_vector_portable_vector_type_PortableVector
libcrux_ml_kem_vector_portable_compress_0d_280(libcrux_ml_kem_vector_portable_vector_type_PortableVector v)10576 libcrux_ml_kem_vector_portable_compress_0d_280(
10577 libcrux_ml_kem_vector_portable_vector_type_PortableVector v) {
10578 return libcrux_ml_kem_vector_portable_compress_compress_020(v);
10579 }
10580
10581 /**
10582 A monomorphic instance of libcrux_ml_kem.serialize.compress_then_serialize_11
10583 with types libcrux_ml_kem_vector_portable_vector_type_PortableVector
10584 with const generics
10585 - OUT_LEN= 320
10586 */
10587 static KRML_MUSTINLINE void
libcrux_ml_kem_serialize_compress_then_serialize_11_e1(libcrux_ml_kem_polynomial_PolynomialRingElement_f0 * re,uint8_t ret[320U])10588 libcrux_ml_kem_serialize_compress_then_serialize_11_e1(
10589 libcrux_ml_kem_polynomial_PolynomialRingElement_f0 *re, uint8_t ret[320U]) {
10590 uint8_t serialized[320U] = {0U};
10591 for (size_t i = (size_t)0U;
10592 i < LIBCRUX_ML_KEM_POLYNOMIAL_VECTORS_IN_RING_ELEMENT; i++) {
10593 size_t i0 = i;
10594 libcrux_ml_kem_vector_portable_vector_type_PortableVector coefficient =
10595 libcrux_ml_kem_vector_portable_compress_0d_280(
10596 libcrux_ml_kem_vector_traits_to_unsigned_representative_db(
10597 re->coefficients[i0]));
10598 uint8_t bytes[22U];
10599 libcrux_ml_kem_vector_portable_serialize_11_0d(coefficient, bytes);
10600 Eurydice_slice uu____0 = Eurydice_array_to_subslice2(
10601 serialized, (size_t)22U * i0, (size_t)22U * i0 + (size_t)22U, uint8_t);
10602 Eurydice_slice_copy(
10603 uu____0, Eurydice_array_to_slice((size_t)22U, bytes, uint8_t), uint8_t);
10604 }
10605 memcpy(ret, serialized, (size_t)320U * sizeof(uint8_t));
10606 }
10607
10608 /**
10609 A monomorphic instance of
10610 libcrux_ml_kem.serialize.compress_then_serialize_ring_element_u with types
10611 libcrux_ml_kem_vector_portable_vector_type_PortableVector with const generics
10612 - COMPRESSION_FACTOR= 10
10613 - OUT_LEN= 320
10614 */
10615 static KRML_MUSTINLINE void
libcrux_ml_kem_serialize_compress_then_serialize_ring_element_u_5f(libcrux_ml_kem_polynomial_PolynomialRingElement_f0 * re,uint8_t ret[320U])10616 libcrux_ml_kem_serialize_compress_then_serialize_ring_element_u_5f(
10617 libcrux_ml_kem_polynomial_PolynomialRingElement_f0 *re, uint8_t ret[320U]) {
10618 uint8_t uu____0[320U];
10619 libcrux_ml_kem_serialize_compress_then_serialize_10_fc(re, uu____0);
10620 memcpy(ret, uu____0, (size_t)320U * sizeof(uint8_t));
10621 }
10622
10623 /**
10624 Call [`compress_then_serialize_ring_element_u`] on each ring element.
10625 */
10626 /**
10627 A monomorphic instance of libcrux_ml_kem.ind_cpa.compress_then_serialize_u
10628 with types libcrux_ml_kem_vector_portable_vector_type_PortableVector
10629 with const generics
10630 - K= 3
10631 - OUT_LEN= 960
10632 - COMPRESSION_FACTOR= 10
10633 - BLOCK_LEN= 320
10634 */
libcrux_ml_kem_ind_cpa_compress_then_serialize_u_a7(libcrux_ml_kem_polynomial_PolynomialRingElement_f0 input[3U],Eurydice_slice out)10635 static inline void libcrux_ml_kem_ind_cpa_compress_then_serialize_u_a7(
10636 libcrux_ml_kem_polynomial_PolynomialRingElement_f0 input[3U],
10637 Eurydice_slice out) {
10638 for (size_t i = (size_t)0U;
10639 i < Eurydice_slice_len(
10640 Eurydice_array_to_slice(
10641 (size_t)3U, input,
10642 libcrux_ml_kem_polynomial_PolynomialRingElement_f0),
10643 libcrux_ml_kem_polynomial_PolynomialRingElement_f0);
10644 i++) {
10645 size_t i0 = i;
10646 libcrux_ml_kem_polynomial_PolynomialRingElement_f0 re = input[i0];
10647 Eurydice_slice uu____0 = Eurydice_slice_subslice2(
10648 out, i0 * ((size_t)960U / (size_t)3U),
10649 (i0 + (size_t)1U) * ((size_t)960U / (size_t)3U), uint8_t);
10650 uint8_t ret[320U];
10651 libcrux_ml_kem_serialize_compress_then_serialize_ring_element_u_5f(&re,
10652 ret);
10653 Eurydice_slice_copy(
10654 uu____0, Eurydice_array_to_slice((size_t)320U, ret, uint8_t), uint8_t);
10655 }
10656 }
10657
10658 /**
10659 A monomorphic instance of libcrux_ml_kem.vector.portable.compress.compress
10660 with const generics
10661 - COEFFICIENT_BITS= 4
10662 */
10663 static KRML_MUSTINLINE libcrux_ml_kem_vector_portable_vector_type_PortableVector
libcrux_ml_kem_vector_portable_compress_compress_021(libcrux_ml_kem_vector_portable_vector_type_PortableVector v)10664 libcrux_ml_kem_vector_portable_compress_compress_021(
10665 libcrux_ml_kem_vector_portable_vector_type_PortableVector v) {
10666 for (size_t i = (size_t)0U;
10667 i < LIBCRUX_ML_KEM_VECTOR_TRAITS_FIELD_ELEMENTS_IN_VECTOR; i++) {
10668 size_t i0 = i;
10669 int16_t uu____0 =
10670 libcrux_ml_kem_vector_portable_compress_compress_ciphertext_coefficient(
10671 (uint8_t)(int32_t)4, (uint16_t)v.elements[i0]);
10672 v.elements[i0] = uu____0;
10673 }
10674 return v;
10675 }
10676
10677 /**
10678 This function found in impl {(libcrux_ml_kem::vector::traits::Operations for
10679 libcrux_ml_kem::vector::portable::vector_type::PortableVector)}
10680 */
10681 /**
10682 A monomorphic instance of libcrux_ml_kem.vector.portable.compress_0d
10683 with const generics
10684 - COEFFICIENT_BITS= 4
10685 */
10686 static inline libcrux_ml_kem_vector_portable_vector_type_PortableVector
libcrux_ml_kem_vector_portable_compress_0d_281(libcrux_ml_kem_vector_portable_vector_type_PortableVector v)10687 libcrux_ml_kem_vector_portable_compress_0d_281(
10688 libcrux_ml_kem_vector_portable_vector_type_PortableVector v) {
10689 return libcrux_ml_kem_vector_portable_compress_compress_021(v);
10690 }
10691
10692 /**
10693 A monomorphic instance of libcrux_ml_kem.serialize.compress_then_serialize_4
10694 with types libcrux_ml_kem_vector_portable_vector_type_PortableVector
10695 with const generics
10696
10697 */
10698 static KRML_MUSTINLINE void
libcrux_ml_kem_serialize_compress_then_serialize_4_9a(libcrux_ml_kem_polynomial_PolynomialRingElement_f0 re,Eurydice_slice serialized)10699 libcrux_ml_kem_serialize_compress_then_serialize_4_9a(
10700 libcrux_ml_kem_polynomial_PolynomialRingElement_f0 re,
10701 Eurydice_slice serialized) {
10702 for (size_t i = (size_t)0U;
10703 i < LIBCRUX_ML_KEM_POLYNOMIAL_VECTORS_IN_RING_ELEMENT; i++) {
10704 size_t i0 = i;
10705 libcrux_ml_kem_vector_portable_vector_type_PortableVector coefficient =
10706 libcrux_ml_kem_vector_portable_compress_0d_281(
10707 libcrux_ml_kem_vector_traits_to_unsigned_representative_db(
10708 re.coefficients[i0]));
10709 uint8_t bytes[8U];
10710 libcrux_ml_kem_vector_portable_serialize_4_0d(coefficient, bytes);
10711 Eurydice_slice_copy(
10712 Eurydice_slice_subslice2(serialized, (size_t)8U * i0,
10713 (size_t)8U * i0 + (size_t)8U, uint8_t),
10714 Eurydice_array_to_slice((size_t)8U, bytes, uint8_t), uint8_t);
10715 }
10716 }
10717
10718 /**
10719 A monomorphic instance of libcrux_ml_kem.vector.portable.compress.compress
10720 with const generics
10721 - COEFFICIENT_BITS= 5
10722 */
10723 static KRML_MUSTINLINE libcrux_ml_kem_vector_portable_vector_type_PortableVector
libcrux_ml_kem_vector_portable_compress_compress_022(libcrux_ml_kem_vector_portable_vector_type_PortableVector v)10724 libcrux_ml_kem_vector_portable_compress_compress_022(
10725 libcrux_ml_kem_vector_portable_vector_type_PortableVector v) {
10726 for (size_t i = (size_t)0U;
10727 i < LIBCRUX_ML_KEM_VECTOR_TRAITS_FIELD_ELEMENTS_IN_VECTOR; i++) {
10728 size_t i0 = i;
10729 int16_t uu____0 =
10730 libcrux_ml_kem_vector_portable_compress_compress_ciphertext_coefficient(
10731 (uint8_t)(int32_t)5, (uint16_t)v.elements[i0]);
10732 v.elements[i0] = uu____0;
10733 }
10734 return v;
10735 }
10736
10737 /**
10738 This function found in impl {(libcrux_ml_kem::vector::traits::Operations for
10739 libcrux_ml_kem::vector::portable::vector_type::PortableVector)}
10740 */
10741 /**
10742 A monomorphic instance of libcrux_ml_kem.vector.portable.compress_0d
10743 with const generics
10744 - COEFFICIENT_BITS= 5
10745 */
10746 static inline libcrux_ml_kem_vector_portable_vector_type_PortableVector
libcrux_ml_kem_vector_portable_compress_0d_282(libcrux_ml_kem_vector_portable_vector_type_PortableVector v)10747 libcrux_ml_kem_vector_portable_compress_0d_282(
10748 libcrux_ml_kem_vector_portable_vector_type_PortableVector v) {
10749 return libcrux_ml_kem_vector_portable_compress_compress_022(v);
10750 }
10751
10752 /**
10753 A monomorphic instance of libcrux_ml_kem.serialize.compress_then_serialize_5
10754 with types libcrux_ml_kem_vector_portable_vector_type_PortableVector
10755 with const generics
10756
10757 */
10758 static KRML_MUSTINLINE void
libcrux_ml_kem_serialize_compress_then_serialize_5_1f(libcrux_ml_kem_polynomial_PolynomialRingElement_f0 re,Eurydice_slice serialized)10759 libcrux_ml_kem_serialize_compress_then_serialize_5_1f(
10760 libcrux_ml_kem_polynomial_PolynomialRingElement_f0 re,
10761 Eurydice_slice serialized) {
10762 for (size_t i = (size_t)0U;
10763 i < LIBCRUX_ML_KEM_POLYNOMIAL_VECTORS_IN_RING_ELEMENT; i++) {
10764 size_t i0 = i;
10765 libcrux_ml_kem_vector_portable_vector_type_PortableVector coefficients =
10766 libcrux_ml_kem_vector_portable_compress_0d_282(
10767 libcrux_ml_kem_vector_traits_to_unsigned_representative_db(
10768 re.coefficients[i0]));
10769 uint8_t bytes[10U];
10770 libcrux_ml_kem_vector_portable_serialize_5_0d(coefficients, bytes);
10771 Eurydice_slice_copy(
10772 Eurydice_slice_subslice2(serialized, (size_t)10U * i0,
10773 (size_t)10U * i0 + (size_t)10U, uint8_t),
10774 Eurydice_array_to_slice((size_t)10U, bytes, uint8_t), uint8_t);
10775 }
10776 }
10777
10778 /**
10779 A monomorphic instance of
10780 libcrux_ml_kem.serialize.compress_then_serialize_ring_element_v with types
10781 libcrux_ml_kem_vector_portable_vector_type_PortableVector with const generics
10782 - COMPRESSION_FACTOR= 4
10783 - OUT_LEN= 128
10784 */
10785 static KRML_MUSTINLINE void
libcrux_ml_kem_serialize_compress_then_serialize_ring_element_v_4e(libcrux_ml_kem_polynomial_PolynomialRingElement_f0 re,Eurydice_slice out)10786 libcrux_ml_kem_serialize_compress_then_serialize_ring_element_v_4e(
10787 libcrux_ml_kem_polynomial_PolynomialRingElement_f0 re, Eurydice_slice out) {
10788 libcrux_ml_kem_serialize_compress_then_serialize_4_9a(re, out);
10789 }
10790
10791 /**
10792 A monomorphic instance of libcrux_ml_kem.ind_cpa.encrypt
10793 with types libcrux_ml_kem_vector_portable_vector_type_PortableVector,
10794 libcrux_ml_kem_hash_functions_portable_PortableHash[[$3size_t]] with const
10795 generics
10796 - K= 3
10797 - CIPHERTEXT_SIZE= 1088
10798 - T_AS_NTT_ENCODED_SIZE= 1152
10799 - C1_LEN= 960
10800 - C2_LEN= 128
10801 - U_COMPRESSION_FACTOR= 10
10802 - V_COMPRESSION_FACTOR= 4
10803 - BLOCK_LEN= 320
10804 - ETA1= 2
10805 - ETA1_RANDOMNESS_SIZE= 128
10806 - ETA2= 2
10807 - ETA2_RANDOMNESS_SIZE= 128
10808 */
libcrux_ml_kem_ind_cpa_encrypt_60(Eurydice_slice public_key,uint8_t message[32U],Eurydice_slice randomness,uint8_t ret[1088U])10809 static inline void libcrux_ml_kem_ind_cpa_encrypt_60(Eurydice_slice public_key,
10810 uint8_t message[32U],
10811 Eurydice_slice randomness,
10812 uint8_t ret[1088U]) {
10813 libcrux_ml_kem_polynomial_PolynomialRingElement_f0 t_as_ntt[3U];
10814 libcrux_ml_kem_serialize_deserialize_ring_elements_reduced_33(
10815 Eurydice_slice_subslice_to(public_key, (size_t)1152U, uint8_t, size_t),
10816 t_as_ntt);
10817 Eurydice_slice seed =
10818 Eurydice_slice_subslice_from(public_key, (size_t)1152U, uint8_t, size_t);
10819 libcrux_ml_kem_polynomial_PolynomialRingElement_f0 A[3U][3U];
10820 uint8_t ret0[34U];
10821 libcrux_ml_kem_utils_into_padded_array_ea1(seed, ret0);
10822 libcrux_ml_kem_matrix_sample_matrix_A_38(ret0, false, A);
10823 uint8_t prf_input[33U];
10824 libcrux_ml_kem_utils_into_padded_array_ea2(randomness, prf_input);
10825 /* Passing arrays by value in Rust generates a copy in C */
10826 uint8_t copy_of_prf_input0[33U];
10827 memcpy(copy_of_prf_input0, prf_input, (size_t)33U * sizeof(uint8_t));
10828 tuple_b0 uu____1 = libcrux_ml_kem_ind_cpa_sample_vector_cbd_then_ntt_fc(
10829 copy_of_prf_input0, 0U);
10830 libcrux_ml_kem_polynomial_PolynomialRingElement_f0 r_as_ntt[3U];
10831 memcpy(
10832 r_as_ntt, uu____1.fst,
10833 (size_t)3U * sizeof(libcrux_ml_kem_polynomial_PolynomialRingElement_f0));
10834 uint8_t domain_separator0 = uu____1.snd;
10835 /* Passing arrays by value in Rust generates a copy in C */
10836 uint8_t copy_of_prf_input[33U];
10837 memcpy(copy_of_prf_input, prf_input, (size_t)33U * sizeof(uint8_t));
10838 tuple_b0 uu____3 = libcrux_ml_kem_ind_cpa_sample_ring_element_cbd_ac(
10839 copy_of_prf_input, domain_separator0);
10840 libcrux_ml_kem_polynomial_PolynomialRingElement_f0 error_1[3U];
10841 memcpy(
10842 error_1, uu____3.fst,
10843 (size_t)3U * sizeof(libcrux_ml_kem_polynomial_PolynomialRingElement_f0));
10844 uint8_t domain_separator = uu____3.snd;
10845 prf_input[32U] = domain_separator;
10846 uint8_t prf_output[128U];
10847 libcrux_ml_kem_hash_functions_portable_PRF_f1_ee0(
10848 Eurydice_array_to_slice((size_t)33U, prf_input, uint8_t), prf_output);
10849 libcrux_ml_kem_polynomial_PolynomialRingElement_f0 error_2 =
10850 libcrux_ml_kem_sampling_sample_from_binomial_distribution_c6(
10851 Eurydice_array_to_slice((size_t)128U, prf_output, uint8_t));
10852 libcrux_ml_kem_polynomial_PolynomialRingElement_f0 u[3U];
10853 libcrux_ml_kem_matrix_compute_vector_u_59(A, r_as_ntt, error_1, u);
10854 /* Passing arrays by value in Rust generates a copy in C */
10855 uint8_t copy_of_message[32U];
10856 memcpy(copy_of_message, message, (size_t)32U * sizeof(uint8_t));
10857 libcrux_ml_kem_polynomial_PolynomialRingElement_f0 message_as_ring_element =
10858 libcrux_ml_kem_serialize_deserialize_then_decompress_message_0d(
10859 copy_of_message);
10860 libcrux_ml_kem_polynomial_PolynomialRingElement_f0 v =
10861 libcrux_ml_kem_matrix_compute_ring_element_v_54(
10862 t_as_ntt, r_as_ntt, &error_2, &message_as_ring_element);
10863 uint8_t ciphertext[1088U] = {0U};
10864 libcrux_ml_kem_polynomial_PolynomialRingElement_f0 uu____5[3U];
10865 memcpy(
10866 uu____5, u,
10867 (size_t)3U * sizeof(libcrux_ml_kem_polynomial_PolynomialRingElement_f0));
10868 libcrux_ml_kem_ind_cpa_compress_then_serialize_u_a7(
10869 uu____5, Eurydice_array_to_subslice2(ciphertext, (size_t)0U, (size_t)960U,
10870 uint8_t));
10871 libcrux_ml_kem_polynomial_PolynomialRingElement_f0 uu____6 = v;
10872 libcrux_ml_kem_serialize_compress_then_serialize_ring_element_v_4e(
10873 uu____6, Eurydice_array_to_subslice_from((size_t)1088U, ciphertext,
10874 (size_t)960U, uint8_t, size_t));
10875 memcpy(ret, ciphertext, (size_t)1088U * sizeof(uint8_t));
10876 }
10877
10878 /**
10879 This function found in impl {(libcrux_ml_kem::variant::Variant for
10880 libcrux_ml_kem::variant::MlKem)#1}
10881 */
10882 /**
10883 A monomorphic instance of libcrux_ml_kem.variant.kdf_d8
10884 with types libcrux_ml_kem_hash_functions_portable_PortableHash[[$3size_t]]
10885 with const generics
10886 - K= 3
10887 - CIPHERTEXT_SIZE= 1088
10888 */
libcrux_ml_kem_variant_kdf_d8_41(Eurydice_slice shared_secret,libcrux_ml_kem_mlkem768_MlKem768Ciphertext * _,uint8_t ret[32U])10889 static KRML_MUSTINLINE void libcrux_ml_kem_variant_kdf_d8_41(
10890 Eurydice_slice shared_secret, libcrux_ml_kem_mlkem768_MlKem768Ciphertext *_,
10891 uint8_t ret[32U]) {
10892 uint8_t out[32U] = {0U};
10893 Eurydice_slice_copy(Eurydice_array_to_slice((size_t)32U, out, uint8_t),
10894 shared_secret, uint8_t);
10895 memcpy(ret, out, (size_t)32U * sizeof(uint8_t));
10896 }
10897
10898 /**
10899 A monomorphic instance of libcrux_ml_kem.ind_cca.decapsulate
10900 with types libcrux_ml_kem_vector_portable_vector_type_PortableVector,
10901 libcrux_ml_kem_hash_functions_portable_PortableHash[[$3size_t]],
10902 libcrux_ml_kem_variant_MlKem with const generics
10903 - K= 3
10904 - SECRET_KEY_SIZE= 2400
10905 - CPA_SECRET_KEY_SIZE= 1152
10906 - PUBLIC_KEY_SIZE= 1184
10907 - CIPHERTEXT_SIZE= 1088
10908 - T_AS_NTT_ENCODED_SIZE= 1152
10909 - C1_SIZE= 960
10910 - C2_SIZE= 128
10911 - VECTOR_U_COMPRESSION_FACTOR= 10
10912 - VECTOR_V_COMPRESSION_FACTOR= 4
10913 - C1_BLOCK_SIZE= 320
10914 - ETA1= 2
10915 - ETA1_RANDOMNESS_SIZE= 128
10916 - ETA2= 2
10917 - ETA2_RANDOMNESS_SIZE= 128
10918 - IMPLICIT_REJECTION_HASH_INPUT_SIZE= 1120
10919 */
libcrux_ml_kem_ind_cca_decapsulate_70(libcrux_ml_kem_types_MlKemPrivateKey_55 * private_key,libcrux_ml_kem_mlkem768_MlKem768Ciphertext * ciphertext,uint8_t ret[32U])10920 static inline void libcrux_ml_kem_ind_cca_decapsulate_70(
10921 libcrux_ml_kem_types_MlKemPrivateKey_55 *private_key,
10922 libcrux_ml_kem_mlkem768_MlKem768Ciphertext *ciphertext, uint8_t ret[32U]) {
10923 Eurydice_slice_uint8_t_x2 uu____0 = Eurydice_slice_split_at(
10924 Eurydice_array_to_slice((size_t)2400U, private_key->value, uint8_t),
10925 (size_t)1152U, uint8_t, Eurydice_slice_uint8_t_x2);
10926 Eurydice_slice ind_cpa_secret_key = uu____0.fst;
10927 Eurydice_slice secret_key0 = uu____0.snd;
10928 Eurydice_slice_uint8_t_x2 uu____1 = Eurydice_slice_split_at(
10929 secret_key0, (size_t)1184U, uint8_t, Eurydice_slice_uint8_t_x2);
10930 Eurydice_slice ind_cpa_public_key = uu____1.fst;
10931 Eurydice_slice secret_key = uu____1.snd;
10932 Eurydice_slice_uint8_t_x2 uu____2 = Eurydice_slice_split_at(
10933 secret_key, LIBCRUX_ML_KEM_CONSTANTS_H_DIGEST_SIZE, uint8_t,
10934 Eurydice_slice_uint8_t_x2);
10935 Eurydice_slice ind_cpa_public_key_hash = uu____2.fst;
10936 Eurydice_slice implicit_rejection_value = uu____2.snd;
10937 uint8_t decrypted[32U];
10938 libcrux_ml_kem_ind_cpa_decrypt_43(ind_cpa_secret_key, ciphertext->value,
10939 decrypted);
10940 uint8_t to_hash0[64U];
10941 libcrux_ml_kem_utils_into_padded_array_ea(
10942 Eurydice_array_to_slice((size_t)32U, decrypted, uint8_t), to_hash0);
10943 Eurydice_slice_copy(
10944 Eurydice_array_to_subslice_from(
10945 (size_t)64U, to_hash0, LIBCRUX_ML_KEM_CONSTANTS_SHARED_SECRET_SIZE,
10946 uint8_t, size_t),
10947 ind_cpa_public_key_hash, uint8_t);
10948 uint8_t hashed[64U];
10949 libcrux_ml_kem_hash_functions_portable_G_f1_e4(
10950 Eurydice_array_to_slice((size_t)64U, to_hash0, uint8_t), hashed);
10951 Eurydice_slice_uint8_t_x2 uu____3 = Eurydice_slice_split_at(
10952 Eurydice_array_to_slice((size_t)64U, hashed, uint8_t),
10953 LIBCRUX_ML_KEM_CONSTANTS_SHARED_SECRET_SIZE, uint8_t,
10954 Eurydice_slice_uint8_t_x2);
10955 Eurydice_slice shared_secret0 = uu____3.fst;
10956 Eurydice_slice pseudorandomness = uu____3.snd;
10957 uint8_t to_hash[1120U];
10958 libcrux_ml_kem_utils_into_padded_array_ea0(implicit_rejection_value, to_hash);
10959 Eurydice_slice uu____4 = Eurydice_array_to_subslice_from(
10960 (size_t)1120U, to_hash, LIBCRUX_ML_KEM_CONSTANTS_SHARED_SECRET_SIZE,
10961 uint8_t, size_t);
10962 Eurydice_slice_copy(uu____4, libcrux_ml_kem_types_as_ref_00_24(ciphertext),
10963 uint8_t);
10964 uint8_t implicit_rejection_shared_secret0[32U];
10965 libcrux_ml_kem_hash_functions_portable_PRF_f1_ee(
10966 Eurydice_array_to_slice((size_t)1120U, to_hash, uint8_t),
10967 implicit_rejection_shared_secret0);
10968 Eurydice_slice uu____5 = ind_cpa_public_key;
10969 /* Passing arrays by value in Rust generates a copy in C */
10970 uint8_t copy_of_decrypted[32U];
10971 memcpy(copy_of_decrypted, decrypted, (size_t)32U * sizeof(uint8_t));
10972 uint8_t expected_ciphertext[1088U];
10973 libcrux_ml_kem_ind_cpa_encrypt_60(uu____5, copy_of_decrypted,
10974 pseudorandomness, expected_ciphertext);
10975 uint8_t implicit_rejection_shared_secret[32U];
10976 libcrux_ml_kem_variant_kdf_d8_41(
10977 Eurydice_array_to_slice((size_t)32U, implicit_rejection_shared_secret0,
10978 uint8_t),
10979 ciphertext, implicit_rejection_shared_secret);
10980 uint8_t shared_secret[32U];
10981 libcrux_ml_kem_variant_kdf_d8_41(shared_secret0, ciphertext, shared_secret);
10982 uint8_t ret0[32U];
10983 libcrux_ml_kem_constant_time_ops_compare_ciphertexts_select_shared_secret_in_constant_time(
10984 libcrux_ml_kem_types_as_ref_00_24(ciphertext),
10985 Eurydice_array_to_slice((size_t)1088U, expected_ciphertext, uint8_t),
10986 Eurydice_array_to_slice((size_t)32U, shared_secret, uint8_t),
10987 Eurydice_array_to_slice((size_t)32U, implicit_rejection_shared_secret,
10988 uint8_t),
10989 ret0);
10990 memcpy(ret, ret0, (size_t)32U * sizeof(uint8_t));
10991 }
10992
10993 /**
10994 Portable decapsulate
10995 */
10996 /**
10997 A monomorphic instance of
10998 libcrux_ml_kem.ind_cca.instantiations.portable.decapsulate with const generics
10999 - K= 3
11000 - SECRET_KEY_SIZE= 2400
11001 - CPA_SECRET_KEY_SIZE= 1152
11002 - PUBLIC_KEY_SIZE= 1184
11003 - CIPHERTEXT_SIZE= 1088
11004 - T_AS_NTT_ENCODED_SIZE= 1152
11005 - C1_SIZE= 960
11006 - C2_SIZE= 128
11007 - VECTOR_U_COMPRESSION_FACTOR= 10
11008 - VECTOR_V_COMPRESSION_FACTOR= 4
11009 - C1_BLOCK_SIZE= 320
11010 - ETA1= 2
11011 - ETA1_RANDOMNESS_SIZE= 128
11012 - ETA2= 2
11013 - ETA2_RANDOMNESS_SIZE= 128
11014 - IMPLICIT_REJECTION_HASH_INPUT_SIZE= 1120
11015 */
11016 static inline void
libcrux_ml_kem_ind_cca_instantiations_portable_decapsulate_2e(libcrux_ml_kem_types_MlKemPrivateKey_55 * private_key,libcrux_ml_kem_mlkem768_MlKem768Ciphertext * ciphertext,uint8_t ret[32U])11017 libcrux_ml_kem_ind_cca_instantiations_portable_decapsulate_2e(
11018 libcrux_ml_kem_types_MlKemPrivateKey_55 *private_key,
11019 libcrux_ml_kem_mlkem768_MlKem768Ciphertext *ciphertext, uint8_t ret[32U]) {
11020 libcrux_ml_kem_ind_cca_decapsulate_70(private_key, ciphertext, ret);
11021 }
11022
11023 /**
11024 Decapsulate ML-KEM 768
11025
11026 Generates an [`MlKemSharedSecret`].
11027 The input is a reference to an [`MlKem768PrivateKey`] and an
11028 [`MlKem768Ciphertext`].
11029 */
libcrux_ml_kem_mlkem768_portable_decapsulate(libcrux_ml_kem_types_MlKemPrivateKey_55 * private_key,libcrux_ml_kem_mlkem768_MlKem768Ciphertext * ciphertext,uint8_t ret[32U])11030 static inline void libcrux_ml_kem_mlkem768_portable_decapsulate(
11031 libcrux_ml_kem_types_MlKemPrivateKey_55 *private_key,
11032 libcrux_ml_kem_mlkem768_MlKem768Ciphertext *ciphertext, uint8_t ret[32U]) {
11033 libcrux_ml_kem_ind_cca_instantiations_portable_decapsulate_2e(
11034 private_key, ciphertext, ret);
11035 }
11036
11037 /**
11038 This function found in impl {(libcrux_ml_kem::variant::Variant for
11039 libcrux_ml_kem::variant::MlKem)#1}
11040 */
11041 /**
11042 A monomorphic instance of libcrux_ml_kem.variant.entropy_preprocess_d8
11043 with types libcrux_ml_kem_hash_functions_portable_PortableHash[[$3size_t]]
11044 with const generics
11045 - K= 3
11046 */
libcrux_ml_kem_variant_entropy_preprocess_d8_63(Eurydice_slice randomness,uint8_t ret[32U])11047 static KRML_MUSTINLINE void libcrux_ml_kem_variant_entropy_preprocess_d8_63(
11048 Eurydice_slice randomness, uint8_t ret[32U]) {
11049 uint8_t out[32U] = {0U};
11050 Eurydice_slice_copy(Eurydice_array_to_slice((size_t)32U, out, uint8_t),
11051 randomness, uint8_t);
11052 memcpy(ret, out, (size_t)32U * sizeof(uint8_t));
11053 }
11054
11055 /**
11056 This function found in impl {(libcrux_ml_kem::hash_functions::Hash<K> for
11057 libcrux_ml_kem::hash_functions::portable::PortableHash<K>)}
11058 */
11059 /**
11060 A monomorphic instance of libcrux_ml_kem.hash_functions.portable.H_f1
11061 with const generics
11062 - K= 3
11063 */
libcrux_ml_kem_hash_functions_portable_H_f1_1a(Eurydice_slice input,uint8_t ret[32U])11064 static KRML_MUSTINLINE void libcrux_ml_kem_hash_functions_portable_H_f1_1a(
11065 Eurydice_slice input, uint8_t ret[32U]) {
11066 libcrux_ml_kem_hash_functions_portable_H(input, ret);
11067 }
11068
11069 /**
11070 A monomorphic instance of libcrux_ml_kem.ind_cca.encapsulate
11071 with types libcrux_ml_kem_vector_portable_vector_type_PortableVector,
11072 libcrux_ml_kem_hash_functions_portable_PortableHash[[$3size_t]],
11073 libcrux_ml_kem_variant_MlKem with const generics
11074 - K= 3
11075 - CIPHERTEXT_SIZE= 1088
11076 - PUBLIC_KEY_SIZE= 1184
11077 - T_AS_NTT_ENCODED_SIZE= 1152
11078 - C1_SIZE= 960
11079 - C2_SIZE= 128
11080 - VECTOR_U_COMPRESSION_FACTOR= 10
11081 - VECTOR_V_COMPRESSION_FACTOR= 4
11082 - VECTOR_U_BLOCK_LEN= 320
11083 - ETA1= 2
11084 - ETA1_RANDOMNESS_SIZE= 128
11085 - ETA2= 2
11086 - ETA2_RANDOMNESS_SIZE= 128
11087 */
libcrux_ml_kem_ind_cca_encapsulate_cd(libcrux_ml_kem_types_MlKemPublicKey_15 * public_key,uint8_t randomness[32U])11088 static inline tuple_3c libcrux_ml_kem_ind_cca_encapsulate_cd(
11089 libcrux_ml_kem_types_MlKemPublicKey_15 *public_key,
11090 uint8_t randomness[32U]) {
11091 uint8_t randomness0[32U];
11092 libcrux_ml_kem_variant_entropy_preprocess_d8_63(
11093 Eurydice_array_to_slice((size_t)32U, randomness, uint8_t), randomness0);
11094 uint8_t to_hash[64U];
11095 libcrux_ml_kem_utils_into_padded_array_ea(
11096 Eurydice_array_to_slice((size_t)32U, randomness0, uint8_t), to_hash);
11097 Eurydice_slice uu____0 = Eurydice_array_to_subslice_from(
11098 (size_t)64U, to_hash, LIBCRUX_ML_KEM_CONSTANTS_H_DIGEST_SIZE, uint8_t,
11099 size_t);
11100 uint8_t ret[32U];
11101 libcrux_ml_kem_hash_functions_portable_H_f1_1a(
11102 Eurydice_array_to_slice((size_t)1184U,
11103 libcrux_ml_kem_types_as_slice_cb_50(public_key),
11104 uint8_t),
11105 ret);
11106 Eurydice_slice_copy(
11107 uu____0, Eurydice_array_to_slice((size_t)32U, ret, uint8_t), uint8_t);
11108 uint8_t hashed[64U];
11109 libcrux_ml_kem_hash_functions_portable_G_f1_e4(
11110 Eurydice_array_to_slice((size_t)64U, to_hash, uint8_t), hashed);
11111 Eurydice_slice_uint8_t_x2 uu____1 = Eurydice_slice_split_at(
11112 Eurydice_array_to_slice((size_t)64U, hashed, uint8_t),
11113 LIBCRUX_ML_KEM_CONSTANTS_SHARED_SECRET_SIZE, uint8_t,
11114 Eurydice_slice_uint8_t_x2);
11115 Eurydice_slice shared_secret = uu____1.fst;
11116 Eurydice_slice pseudorandomness = uu____1.snd;
11117 Eurydice_slice uu____2 = Eurydice_array_to_slice(
11118 (size_t)1184U, libcrux_ml_kem_types_as_slice_cb_50(public_key), uint8_t);
11119 /* Passing arrays by value in Rust generates a copy in C */
11120 uint8_t copy_of_randomness[32U];
11121 memcpy(copy_of_randomness, randomness0, (size_t)32U * sizeof(uint8_t));
11122 uint8_t ciphertext[1088U];
11123 libcrux_ml_kem_ind_cpa_encrypt_60(uu____2, copy_of_randomness,
11124 pseudorandomness, ciphertext);
11125 /* Passing arrays by value in Rust generates a copy in C */
11126 uint8_t copy_of_ciphertext[1088U];
11127 memcpy(copy_of_ciphertext, ciphertext, (size_t)1088U * sizeof(uint8_t));
11128 libcrux_ml_kem_mlkem768_MlKem768Ciphertext ciphertext0 =
11129 libcrux_ml_kem_types_from_01_9f(copy_of_ciphertext);
11130 uint8_t shared_secret_array[32U];
11131 libcrux_ml_kem_variant_kdf_d8_41(shared_secret, &ciphertext0,
11132 shared_secret_array);
11133 libcrux_ml_kem_mlkem768_MlKem768Ciphertext uu____5 = ciphertext0;
11134 /* Passing arrays by value in Rust generates a copy in C */
11135 uint8_t copy_of_shared_secret_array[32U];
11136 memcpy(copy_of_shared_secret_array, shared_secret_array,
11137 (size_t)32U * sizeof(uint8_t));
11138 tuple_3c lit;
11139 lit.fst = uu____5;
11140 memcpy(lit.snd, copy_of_shared_secret_array, (size_t)32U * sizeof(uint8_t));
11141 return lit;
11142 }
11143
11144 /**
11145 A monomorphic instance of
11146 libcrux_ml_kem.ind_cca.instantiations.portable.encapsulate with const generics
11147 - K= 3
11148 - CIPHERTEXT_SIZE= 1088
11149 - PUBLIC_KEY_SIZE= 1184
11150 - T_AS_NTT_ENCODED_SIZE= 1152
11151 - C1_SIZE= 960
11152 - C2_SIZE= 128
11153 - VECTOR_U_COMPRESSION_FACTOR= 10
11154 - VECTOR_V_COMPRESSION_FACTOR= 4
11155 - VECTOR_U_BLOCK_LEN= 320
11156 - ETA1= 2
11157 - ETA1_RANDOMNESS_SIZE= 128
11158 - ETA2= 2
11159 - ETA2_RANDOMNESS_SIZE= 128
11160 */
11161 static inline tuple_3c
libcrux_ml_kem_ind_cca_instantiations_portable_encapsulate_c6(libcrux_ml_kem_types_MlKemPublicKey_15 * public_key,uint8_t randomness[32U])11162 libcrux_ml_kem_ind_cca_instantiations_portable_encapsulate_c6(
11163 libcrux_ml_kem_types_MlKemPublicKey_15 *public_key,
11164 uint8_t randomness[32U]) {
11165 libcrux_ml_kem_types_MlKemPublicKey_15 *uu____0 = public_key;
11166 /* Passing arrays by value in Rust generates a copy in C */
11167 uint8_t copy_of_randomness[32U];
11168 memcpy(copy_of_randomness, randomness, (size_t)32U * sizeof(uint8_t));
11169 return libcrux_ml_kem_ind_cca_encapsulate_cd(uu____0, copy_of_randomness);
11170 }
11171
11172 /**
11173 Encapsulate ML-KEM 768
11174
11175 Generates an ([`MlKem768Ciphertext`], [`MlKemSharedSecret`]) tuple.
11176 The input is a reference to an [`MlKem768PublicKey`] and [`SHARED_SECRET_SIZE`]
11177 bytes of `randomness`.
11178 */
libcrux_ml_kem_mlkem768_portable_encapsulate(libcrux_ml_kem_types_MlKemPublicKey_15 * public_key,uint8_t randomness[32U])11179 static inline tuple_3c libcrux_ml_kem_mlkem768_portable_encapsulate(
11180 libcrux_ml_kem_types_MlKemPublicKey_15 *public_key,
11181 uint8_t randomness[32U]) {
11182 libcrux_ml_kem_types_MlKemPublicKey_15 *uu____0 = public_key;
11183 /* Passing arrays by value in Rust generates a copy in C */
11184 uint8_t copy_of_randomness[32U];
11185 memcpy(copy_of_randomness, randomness, (size_t)32U * sizeof(uint8_t));
11186 return libcrux_ml_kem_ind_cca_instantiations_portable_encapsulate_c6(
11187 uu____0, copy_of_randomness);
11188 }
11189
11190 /**
11191 This function found in impl {(libcrux_ml_kem::variant::Variant for
11192 libcrux_ml_kem::variant::MlKem)#1}
11193 */
11194 /**
11195 A monomorphic instance of libcrux_ml_kem.variant.cpa_keygen_seed_d8
11196 with types libcrux_ml_kem_hash_functions_portable_PortableHash[[$3size_t]]
11197 with const generics
11198 - K= 3
11199 */
libcrux_ml_kem_variant_cpa_keygen_seed_d8_0e(Eurydice_slice key_generation_seed,uint8_t ret[64U])11200 static KRML_MUSTINLINE void libcrux_ml_kem_variant_cpa_keygen_seed_d8_0e(
11201 Eurydice_slice key_generation_seed, uint8_t ret[64U]) {
11202 uint8_t seed[33U] = {0U};
11203 Eurydice_slice_copy(
11204 Eurydice_array_to_subslice2(
11205 seed, (size_t)0U,
11206 LIBCRUX_ML_KEM_CONSTANTS_CPA_PKE_KEY_GENERATION_SEED_SIZE, uint8_t),
11207 key_generation_seed, uint8_t);
11208 seed[LIBCRUX_ML_KEM_CONSTANTS_CPA_PKE_KEY_GENERATION_SEED_SIZE] =
11209 (uint8_t)(size_t)3U;
11210 uint8_t ret0[64U];
11211 libcrux_ml_kem_hash_functions_portable_G_f1_e4(
11212 Eurydice_array_to_slice((size_t)33U, seed, uint8_t), ret0);
11213 memcpy(ret, ret0, (size_t)64U * sizeof(uint8_t));
11214 }
11215
11216 /**
11217 A monomorphic instance of libcrux_ml_kem.matrix.compute_As_plus_e.closure
11218 with types libcrux_ml_kem_vector_portable_vector_type_PortableVector
11219 with const generics
11220 - K= 3
11221 */
11222 static inline libcrux_ml_kem_polynomial_PolynomialRingElement_f0
libcrux_ml_kem_matrix_compute_As_plus_e_closure_87(size_t _i)11223 libcrux_ml_kem_matrix_compute_As_plus_e_closure_87(size_t _i) {
11224 return libcrux_ml_kem_polynomial_ZERO_89_ea();
11225 }
11226
11227 /**
11228 A monomorphic instance of libcrux_ml_kem.vector.traits.to_standard_domain
11229 with types libcrux_ml_kem_vector_portable_vector_type_PortableVector
11230 with const generics
11231
11232 */
11233 static inline libcrux_ml_kem_vector_portable_vector_type_PortableVector
libcrux_ml_kem_vector_traits_to_standard_domain_59(libcrux_ml_kem_vector_portable_vector_type_PortableVector v)11234 libcrux_ml_kem_vector_traits_to_standard_domain_59(
11235 libcrux_ml_kem_vector_portable_vector_type_PortableVector v) {
11236 return libcrux_ml_kem_vector_portable_montgomery_multiply_by_constant_0d(
11237 v, LIBCRUX_ML_KEM_VECTOR_TRAITS_MONTGOMERY_R_SQUARED_MOD_FIELD_MODULUS);
11238 }
11239
11240 /**
11241 This function found in impl
11242 {libcrux_ml_kem::polynomial::PolynomialRingElement<Vector>[TraitClause@0]}
11243 */
11244 /**
11245 A monomorphic instance of libcrux_ml_kem.polynomial.add_standard_error_reduce_89
11246 with types libcrux_ml_kem_vector_portable_vector_type_PortableVector
11247 with const generics
11248
11249 */
11250 static KRML_MUSTINLINE void
libcrux_ml_kem_polynomial_add_standard_error_reduce_89_03(libcrux_ml_kem_polynomial_PolynomialRingElement_f0 * self,libcrux_ml_kem_polynomial_PolynomialRingElement_f0 * error)11251 libcrux_ml_kem_polynomial_add_standard_error_reduce_89_03(
11252 libcrux_ml_kem_polynomial_PolynomialRingElement_f0 *self,
11253 libcrux_ml_kem_polynomial_PolynomialRingElement_f0 *error) {
11254 for (size_t i = (size_t)0U;
11255 i < LIBCRUX_ML_KEM_POLYNOMIAL_VECTORS_IN_RING_ELEMENT; i++) {
11256 size_t j = i;
11257 libcrux_ml_kem_vector_portable_vector_type_PortableVector
11258 coefficient_normal_form =
11259 libcrux_ml_kem_vector_traits_to_standard_domain_59(
11260 self->coefficients[j]);
11261 libcrux_ml_kem_vector_portable_vector_type_PortableVector uu____0 =
11262 libcrux_ml_kem_vector_portable_barrett_reduce_0d(
11263 libcrux_ml_kem_vector_portable_add_0d(coefficient_normal_form,
11264 &error->coefficients[j]));
11265 self->coefficients[j] = uu____0;
11266 }
11267 }
11268
11269 /**
11270 Compute  ◦ ŝ + ê
11271 */
11272 /**
11273 A monomorphic instance of libcrux_ml_kem.matrix.compute_As_plus_e
11274 with types libcrux_ml_kem_vector_portable_vector_type_PortableVector
11275 with const generics
11276 - K= 3
11277 */
libcrux_ml_kem_matrix_compute_As_plus_e_60(libcrux_ml_kem_polynomial_PolynomialRingElement_f0 (* matrix_A)[3U],libcrux_ml_kem_polynomial_PolynomialRingElement_f0 * s_as_ntt,libcrux_ml_kem_polynomial_PolynomialRingElement_f0 * error_as_ntt,libcrux_ml_kem_polynomial_PolynomialRingElement_f0 ret[3U])11278 static KRML_MUSTINLINE void libcrux_ml_kem_matrix_compute_As_plus_e_60(
11279 libcrux_ml_kem_polynomial_PolynomialRingElement_f0 (*matrix_A)[3U],
11280 libcrux_ml_kem_polynomial_PolynomialRingElement_f0 *s_as_ntt,
11281 libcrux_ml_kem_polynomial_PolynomialRingElement_f0 *error_as_ntt,
11282 libcrux_ml_kem_polynomial_PolynomialRingElement_f0 ret[3U]) {
11283 libcrux_ml_kem_polynomial_PolynomialRingElement_f0 result[3U];
11284 for (size_t i = (size_t)0U; i < (size_t)3U; i++) {
11285 result[i] = libcrux_ml_kem_polynomial_ZERO_89_ea();
11286 }
11287 for (size_t i0 = (size_t)0U;
11288 i0 < Eurydice_slice_len(
11289 Eurydice_array_to_slice(
11290 (size_t)3U, matrix_A,
11291 libcrux_ml_kem_polynomial_PolynomialRingElement_f0[3U]),
11292 libcrux_ml_kem_polynomial_PolynomialRingElement_f0[3U]);
11293 i0++) {
11294 size_t i1 = i0;
11295 libcrux_ml_kem_polynomial_PolynomialRingElement_f0 *row = matrix_A[i1];
11296 for (size_t i = (size_t)0U;
11297 i < Eurydice_slice_len(
11298 Eurydice_array_to_slice(
11299 (size_t)3U, row,
11300 libcrux_ml_kem_polynomial_PolynomialRingElement_f0),
11301 libcrux_ml_kem_polynomial_PolynomialRingElement_f0);
11302 i++) {
11303 size_t j = i;
11304 libcrux_ml_kem_polynomial_PolynomialRingElement_f0 *matrix_element =
11305 &row[j];
11306 libcrux_ml_kem_polynomial_PolynomialRingElement_f0 product =
11307 libcrux_ml_kem_polynomial_ntt_multiply_89_2a(matrix_element,
11308 &s_as_ntt[j]);
11309 libcrux_ml_kem_polynomial_add_to_ring_element_89_84(&result[i1],
11310 &product);
11311 }
11312 libcrux_ml_kem_polynomial_add_standard_error_reduce_89_03(
11313 &result[i1], &error_as_ntt[i1]);
11314 }
11315 memcpy(
11316 ret, result,
11317 (size_t)3U * sizeof(libcrux_ml_kem_polynomial_PolynomialRingElement_f0));
11318 }
11319
11320 /**
11321 A monomorphic instance of
11322 libcrux_ml_kem.serialize.serialize_uncompressed_ring_element with types
11323 libcrux_ml_kem_vector_portable_vector_type_PortableVector with const generics
11324
11325 */
11326 static KRML_MUSTINLINE void
libcrux_ml_kem_serialize_serialize_uncompressed_ring_element_5b(libcrux_ml_kem_polynomial_PolynomialRingElement_f0 * re,uint8_t ret[384U])11327 libcrux_ml_kem_serialize_serialize_uncompressed_ring_element_5b(
11328 libcrux_ml_kem_polynomial_PolynomialRingElement_f0 *re, uint8_t ret[384U]) {
11329 uint8_t serialized[384U] = {0U};
11330 for (size_t i = (size_t)0U;
11331 i < LIBCRUX_ML_KEM_POLYNOMIAL_VECTORS_IN_RING_ELEMENT; i++) {
11332 size_t i0 = i;
11333 libcrux_ml_kem_vector_portable_vector_type_PortableVector coefficient =
11334 libcrux_ml_kem_vector_traits_to_unsigned_representative_db(
11335 re->coefficients[i0]);
11336 uint8_t bytes[24U];
11337 libcrux_ml_kem_vector_portable_serialize_12_0d(coefficient, bytes);
11338 Eurydice_slice uu____0 = Eurydice_array_to_subslice2(
11339 serialized, (size_t)24U * i0, (size_t)24U * i0 + (size_t)24U, uint8_t);
11340 Eurydice_slice_copy(
11341 uu____0, Eurydice_array_to_slice((size_t)24U, bytes, uint8_t), uint8_t);
11342 }
11343 memcpy(ret, serialized, (size_t)384U * sizeof(uint8_t));
11344 }
11345
11346 /**
11347 Call [`serialize_uncompressed_ring_element`] for each ring element.
11348 */
11349 /**
11350 A monomorphic instance of libcrux_ml_kem.ind_cpa.serialize_secret_key
11351 with types libcrux_ml_kem_vector_portable_vector_type_PortableVector
11352 with const generics
11353 - K= 3
11354 - OUT_LEN= 1152
11355 */
libcrux_ml_kem_ind_cpa_serialize_secret_key_b5(libcrux_ml_kem_polynomial_PolynomialRingElement_f0 * key,uint8_t ret[1152U])11356 static KRML_MUSTINLINE void libcrux_ml_kem_ind_cpa_serialize_secret_key_b5(
11357 libcrux_ml_kem_polynomial_PolynomialRingElement_f0 *key,
11358 uint8_t ret[1152U]) {
11359 uint8_t out[1152U] = {0U};
11360 for (size_t i = (size_t)0U;
11361 i < Eurydice_slice_len(
11362 Eurydice_array_to_slice(
11363 (size_t)3U, key,
11364 libcrux_ml_kem_polynomial_PolynomialRingElement_f0),
11365 libcrux_ml_kem_polynomial_PolynomialRingElement_f0);
11366 i++) {
11367 size_t i0 = i;
11368 libcrux_ml_kem_polynomial_PolynomialRingElement_f0 re = key[i0];
11369 Eurydice_slice uu____0 = Eurydice_array_to_subslice2(
11370 out, i0 * LIBCRUX_ML_KEM_CONSTANTS_BYTES_PER_RING_ELEMENT,
11371 (i0 + (size_t)1U) * LIBCRUX_ML_KEM_CONSTANTS_BYTES_PER_RING_ELEMENT,
11372 uint8_t);
11373 uint8_t ret0[384U];
11374 libcrux_ml_kem_serialize_serialize_uncompressed_ring_element_5b(&re, ret0);
11375 Eurydice_slice_copy(
11376 uu____0, Eurydice_array_to_slice((size_t)384U, ret0, uint8_t), uint8_t);
11377 }
11378 memcpy(ret, out, (size_t)1152U * sizeof(uint8_t));
11379 }
11380
11381 /**
11382 Concatenate `t` and `ρ` into the public key.
11383 */
11384 /**
11385 A monomorphic instance of libcrux_ml_kem.ind_cpa.serialize_public_key
11386 with types libcrux_ml_kem_vector_portable_vector_type_PortableVector
11387 with const generics
11388 - K= 3
11389 - RANKED_BYTES_PER_RING_ELEMENT= 1152
11390 - PUBLIC_KEY_SIZE= 1184
11391 */
libcrux_ml_kem_ind_cpa_serialize_public_key_79(libcrux_ml_kem_polynomial_PolynomialRingElement_f0 * t_as_ntt,Eurydice_slice seed_for_a,uint8_t ret[1184U])11392 static KRML_MUSTINLINE void libcrux_ml_kem_ind_cpa_serialize_public_key_79(
11393 libcrux_ml_kem_polynomial_PolynomialRingElement_f0 *t_as_ntt,
11394 Eurydice_slice seed_for_a, uint8_t ret[1184U]) {
11395 uint8_t public_key_serialized[1184U] = {0U};
11396 Eurydice_slice uu____0 = Eurydice_array_to_subslice2(
11397 public_key_serialized, (size_t)0U, (size_t)1152U, uint8_t);
11398 uint8_t ret0[1152U];
11399 libcrux_ml_kem_ind_cpa_serialize_secret_key_b5(t_as_ntt, ret0);
11400 Eurydice_slice_copy(
11401 uu____0, Eurydice_array_to_slice((size_t)1152U, ret0, uint8_t), uint8_t);
11402 Eurydice_slice_copy(
11403 Eurydice_array_to_subslice_from((size_t)1184U, public_key_serialized,
11404 (size_t)1152U, uint8_t, size_t),
11405 seed_for_a, uint8_t);
11406 memcpy(ret, public_key_serialized, (size_t)1184U * sizeof(uint8_t));
11407 }
11408
11409 /**
11410 A monomorphic instance of libcrux_ml_kem.ind_cpa.generate_keypair
11411 with types libcrux_ml_kem_vector_portable_vector_type_PortableVector,
11412 libcrux_ml_kem_hash_functions_portable_PortableHash[[$3size_t]],
11413 libcrux_ml_kem_variant_MlKem with const generics
11414 - K= 3
11415 - PRIVATE_KEY_SIZE= 1152
11416 - PUBLIC_KEY_SIZE= 1184
11417 - RANKED_BYTES_PER_RING_ELEMENT= 1152
11418 - ETA1= 2
11419 - ETA1_RANDOMNESS_SIZE= 128
11420 */
11421 static inline libcrux_ml_kem_utils_extraction_helper_Keypair768
libcrux_ml_kem_ind_cpa_generate_keypair_fc(Eurydice_slice key_generation_seed)11422 libcrux_ml_kem_ind_cpa_generate_keypair_fc(Eurydice_slice key_generation_seed) {
11423 uint8_t hashed[64U];
11424 libcrux_ml_kem_variant_cpa_keygen_seed_d8_0e(key_generation_seed, hashed);
11425 Eurydice_slice_uint8_t_x2 uu____0 = Eurydice_slice_split_at(
11426 Eurydice_array_to_slice((size_t)64U, hashed, uint8_t), (size_t)32U,
11427 uint8_t, Eurydice_slice_uint8_t_x2);
11428 Eurydice_slice seed_for_A0 = uu____0.fst;
11429 Eurydice_slice seed_for_secret_and_error = uu____0.snd;
11430 libcrux_ml_kem_polynomial_PolynomialRingElement_f0 A_transpose[3U][3U];
11431 uint8_t ret[34U];
11432 libcrux_ml_kem_utils_into_padded_array_ea1(seed_for_A0, ret);
11433 libcrux_ml_kem_matrix_sample_matrix_A_38(ret, true, A_transpose);
11434 uint8_t prf_input[33U];
11435 libcrux_ml_kem_utils_into_padded_array_ea2(seed_for_secret_and_error,
11436 prf_input);
11437 /* Passing arrays by value in Rust generates a copy in C */
11438 uint8_t copy_of_prf_input0[33U];
11439 memcpy(copy_of_prf_input0, prf_input, (size_t)33U * sizeof(uint8_t));
11440 tuple_b0 uu____2 = libcrux_ml_kem_ind_cpa_sample_vector_cbd_then_ntt_fc(
11441 copy_of_prf_input0, 0U);
11442 libcrux_ml_kem_polynomial_PolynomialRingElement_f0 secret_as_ntt[3U];
11443 memcpy(
11444 secret_as_ntt, uu____2.fst,
11445 (size_t)3U * sizeof(libcrux_ml_kem_polynomial_PolynomialRingElement_f0));
11446 uint8_t domain_separator = uu____2.snd;
11447 /* Passing arrays by value in Rust generates a copy in C */
11448 uint8_t copy_of_prf_input[33U];
11449 memcpy(copy_of_prf_input, prf_input, (size_t)33U * sizeof(uint8_t));
11450 libcrux_ml_kem_polynomial_PolynomialRingElement_f0 error_as_ntt[3U];
11451 memcpy(
11452 error_as_ntt,
11453 libcrux_ml_kem_ind_cpa_sample_vector_cbd_then_ntt_fc(copy_of_prf_input,
11454 domain_separator)
11455 .fst,
11456 (size_t)3U * sizeof(libcrux_ml_kem_polynomial_PolynomialRingElement_f0));
11457 libcrux_ml_kem_polynomial_PolynomialRingElement_f0 t_as_ntt[3U];
11458 libcrux_ml_kem_matrix_compute_As_plus_e_60(A_transpose, secret_as_ntt,
11459 error_as_ntt, t_as_ntt);
11460 uint8_t seed_for_A[32U];
11461 Result_00 dst;
11462 Eurydice_slice_to_array2(&dst, seed_for_A0, Eurydice_slice, uint8_t[32U]);
11463 unwrap_41_83(dst, seed_for_A);
11464 uint8_t public_key_serialized[1184U];
11465 libcrux_ml_kem_ind_cpa_serialize_public_key_79(
11466 t_as_ntt, Eurydice_array_to_slice((size_t)32U, seed_for_A, uint8_t),
11467 public_key_serialized);
11468 uint8_t secret_key_serialized[1152U];
11469 libcrux_ml_kem_ind_cpa_serialize_secret_key_b5(secret_as_ntt,
11470 secret_key_serialized);
11471 /* Passing arrays by value in Rust generates a copy in C */
11472 uint8_t copy_of_secret_key_serialized[1152U];
11473 memcpy(copy_of_secret_key_serialized, secret_key_serialized,
11474 (size_t)1152U * sizeof(uint8_t));
11475 /* Passing arrays by value in Rust generates a copy in C */
11476 uint8_t copy_of_public_key_serialized[1184U];
11477 memcpy(copy_of_public_key_serialized, public_key_serialized,
11478 (size_t)1184U * sizeof(uint8_t));
11479 libcrux_ml_kem_utils_extraction_helper_Keypair768 lit;
11480 memcpy(lit.fst, copy_of_secret_key_serialized,
11481 (size_t)1152U * sizeof(uint8_t));
11482 memcpy(lit.snd, copy_of_public_key_serialized,
11483 (size_t)1184U * sizeof(uint8_t));
11484 return lit;
11485 }
11486
11487 /**
11488 Serialize the secret key.
11489 */
11490 /**
11491 A monomorphic instance of libcrux_ml_kem.ind_cca.serialize_kem_secret_key
11492 with types libcrux_ml_kem_hash_functions_portable_PortableHash[[$3size_t]]
11493 with const generics
11494 - K= 3
11495 - SERIALIZED_KEY_LEN= 2400
11496 */
libcrux_ml_kem_ind_cca_serialize_kem_secret_key_48(Eurydice_slice private_key,Eurydice_slice public_key,Eurydice_slice implicit_rejection_value,uint8_t ret[2400U])11497 static KRML_MUSTINLINE void libcrux_ml_kem_ind_cca_serialize_kem_secret_key_48(
11498 Eurydice_slice private_key, Eurydice_slice public_key,
11499 Eurydice_slice implicit_rejection_value, uint8_t ret[2400U]) {
11500 uint8_t out[2400U] = {0U};
11501 size_t pointer = (size_t)0U;
11502 uint8_t *uu____0 = out;
11503 size_t uu____1 = pointer;
11504 size_t uu____2 = pointer;
11505 Eurydice_slice_copy(
11506 Eurydice_array_to_subslice2(
11507 uu____0, uu____1, uu____2 + Eurydice_slice_len(private_key, uint8_t),
11508 uint8_t),
11509 private_key, uint8_t);
11510 pointer = pointer + Eurydice_slice_len(private_key, uint8_t);
11511 uint8_t *uu____3 = out;
11512 size_t uu____4 = pointer;
11513 size_t uu____5 = pointer;
11514 Eurydice_slice_copy(
11515 Eurydice_array_to_subslice2(
11516 uu____3, uu____4, uu____5 + Eurydice_slice_len(public_key, uint8_t),
11517 uint8_t),
11518 public_key, uint8_t);
11519 pointer = pointer + Eurydice_slice_len(public_key, uint8_t);
11520 Eurydice_slice uu____6 = Eurydice_array_to_subslice2(
11521 out, pointer, pointer + LIBCRUX_ML_KEM_CONSTANTS_H_DIGEST_SIZE, uint8_t);
11522 uint8_t ret0[32U];
11523 libcrux_ml_kem_hash_functions_portable_H_f1_1a(public_key, ret0);
11524 Eurydice_slice_copy(
11525 uu____6, Eurydice_array_to_slice((size_t)32U, ret0, uint8_t), uint8_t);
11526 pointer = pointer + LIBCRUX_ML_KEM_CONSTANTS_H_DIGEST_SIZE;
11527 uint8_t *uu____7 = out;
11528 size_t uu____8 = pointer;
11529 size_t uu____9 = pointer;
11530 Eurydice_slice_copy(
11531 Eurydice_array_to_subslice2(
11532 uu____7, uu____8,
11533 uu____9 + Eurydice_slice_len(implicit_rejection_value, uint8_t),
11534 uint8_t),
11535 implicit_rejection_value, uint8_t);
11536 memcpy(ret, out, (size_t)2400U * sizeof(uint8_t));
11537 }
11538
11539 /**
11540 Packed API
11541
11542 Generate a key pair.
11543
11544 Depending on the `Vector` and `Hasher` used, this requires different hardware
11545 features
11546 */
11547 /**
11548 A monomorphic instance of libcrux_ml_kem.ind_cca.generate_keypair
11549 with types libcrux_ml_kem_vector_portable_vector_type_PortableVector,
11550 libcrux_ml_kem_hash_functions_portable_PortableHash[[$3size_t]],
11551 libcrux_ml_kem_variant_MlKem with const generics
11552 - K= 3
11553 - CPA_PRIVATE_KEY_SIZE= 1152
11554 - PRIVATE_KEY_SIZE= 2400
11555 - PUBLIC_KEY_SIZE= 1184
11556 - BYTES_PER_RING_ELEMENT= 1152
11557 - ETA1= 2
11558 - ETA1_RANDOMNESS_SIZE= 128
11559 */
11560 static inline libcrux_ml_kem_mlkem768_MlKem768KeyPair
libcrux_ml_kem_ind_cca_generate_keypair_8c(uint8_t randomness[64U])11561 libcrux_ml_kem_ind_cca_generate_keypair_8c(uint8_t randomness[64U]) {
11562 Eurydice_slice ind_cpa_keypair_randomness = Eurydice_array_to_subslice2(
11563 randomness, (size_t)0U,
11564 LIBCRUX_ML_KEM_CONSTANTS_CPA_PKE_KEY_GENERATION_SEED_SIZE, uint8_t);
11565 Eurydice_slice implicit_rejection_value = Eurydice_array_to_subslice_from(
11566 (size_t)64U, randomness,
11567 LIBCRUX_ML_KEM_CONSTANTS_CPA_PKE_KEY_GENERATION_SEED_SIZE, uint8_t,
11568 size_t);
11569 libcrux_ml_kem_utils_extraction_helper_Keypair768 uu____0 =
11570 libcrux_ml_kem_ind_cpa_generate_keypair_fc(ind_cpa_keypair_randomness);
11571 uint8_t ind_cpa_private_key[1152U];
11572 memcpy(ind_cpa_private_key, uu____0.fst, (size_t)1152U * sizeof(uint8_t));
11573 uint8_t public_key[1184U];
11574 memcpy(public_key, uu____0.snd, (size_t)1184U * sizeof(uint8_t));
11575 uint8_t secret_key_serialized[2400U];
11576 libcrux_ml_kem_ind_cca_serialize_kem_secret_key_48(
11577 Eurydice_array_to_slice((size_t)1152U, ind_cpa_private_key, uint8_t),
11578 Eurydice_array_to_slice((size_t)1184U, public_key, uint8_t),
11579 implicit_rejection_value, secret_key_serialized);
11580 /* Passing arrays by value in Rust generates a copy in C */
11581 uint8_t copy_of_secret_key_serialized[2400U];
11582 memcpy(copy_of_secret_key_serialized, secret_key_serialized,
11583 (size_t)2400U * sizeof(uint8_t));
11584 libcrux_ml_kem_types_MlKemPrivateKey_55 private_key =
11585 libcrux_ml_kem_types_from_05_f2(copy_of_secret_key_serialized);
11586 libcrux_ml_kem_types_MlKemPrivateKey_55 uu____2 = private_key;
11587 /* Passing arrays by value in Rust generates a copy in C */
11588 uint8_t copy_of_public_key[1184U];
11589 memcpy(copy_of_public_key, public_key, (size_t)1184U * sizeof(uint8_t));
11590 return libcrux_ml_kem_types_from_17_35(
11591 uu____2, libcrux_ml_kem_types_from_b6_da(copy_of_public_key));
11592 }
11593
11594 /**
11595 Portable generate key pair.
11596 */
11597 /**
11598 A monomorphic instance of
11599 libcrux_ml_kem.ind_cca.instantiations.portable.generate_keypair with const
11600 generics
11601 - K= 3
11602 - CPA_PRIVATE_KEY_SIZE= 1152
11603 - PRIVATE_KEY_SIZE= 2400
11604 - PUBLIC_KEY_SIZE= 1184
11605 - BYTES_PER_RING_ELEMENT= 1152
11606 - ETA1= 2
11607 - ETA1_RANDOMNESS_SIZE= 128
11608 */
11609 static inline libcrux_ml_kem_mlkem768_MlKem768KeyPair
libcrux_ml_kem_ind_cca_instantiations_portable_generate_keypair_d5(uint8_t randomness[64U])11610 libcrux_ml_kem_ind_cca_instantiations_portable_generate_keypair_d5(
11611 uint8_t randomness[64U]) {
11612 /* Passing arrays by value in Rust generates a copy in C */
11613 uint8_t copy_of_randomness[64U];
11614 memcpy(copy_of_randomness, randomness, (size_t)64U * sizeof(uint8_t));
11615 return libcrux_ml_kem_ind_cca_generate_keypair_8c(copy_of_randomness);
11616 }
11617
11618 /**
11619 Generate ML-KEM 768 Key Pair
11620 */
11621 static inline libcrux_ml_kem_mlkem768_MlKem768KeyPair
libcrux_ml_kem_mlkem768_portable_generate_key_pair(uint8_t randomness[64U])11622 libcrux_ml_kem_mlkem768_portable_generate_key_pair(uint8_t randomness[64U]) {
11623 /* Passing arrays by value in Rust generates a copy in C */
11624 uint8_t copy_of_randomness[64U];
11625 memcpy(copy_of_randomness, randomness, (size_t)64U * sizeof(uint8_t));
11626 return libcrux_ml_kem_ind_cca_instantiations_portable_generate_keypair_d5(
11627 copy_of_randomness);
11628 }
11629
11630 /**
11631 This function found in impl {(libcrux_ml_kem::variant::Variant for
11632 libcrux_ml_kem::variant::Kyber)}
11633 */
11634 /**
11635 A monomorphic instance of libcrux_ml_kem.variant.kdf_33
11636 with types libcrux_ml_kem_hash_functions_portable_PortableHash[[$3size_t]]
11637 with const generics
11638 - K= 3
11639 - CIPHERTEXT_SIZE= 1088
11640 */
libcrux_ml_kem_variant_kdf_33_f0(Eurydice_slice shared_secret,libcrux_ml_kem_mlkem768_MlKem768Ciphertext * ciphertext,uint8_t ret[32U])11641 static KRML_MUSTINLINE void libcrux_ml_kem_variant_kdf_33_f0(
11642 Eurydice_slice shared_secret,
11643 libcrux_ml_kem_mlkem768_MlKem768Ciphertext *ciphertext, uint8_t ret[32U]) {
11644 uint8_t kdf_input[64U];
11645 libcrux_ml_kem_utils_into_padded_array_ea(shared_secret, kdf_input);
11646 Eurydice_slice uu____0 = Eurydice_array_to_subslice_from(
11647 (size_t)64U, kdf_input, LIBCRUX_ML_KEM_CONSTANTS_H_DIGEST_SIZE, uint8_t,
11648 size_t);
11649 uint8_t ret0[32U];
11650 libcrux_ml_kem_hash_functions_portable_H_f1_1a(
11651 Eurydice_array_to_slice((size_t)1088U,
11652 libcrux_ml_kem_types_as_slice_d4_1d(ciphertext),
11653 uint8_t),
11654 ret0);
11655 Eurydice_slice_copy(
11656 uu____0, Eurydice_array_to_slice((size_t)32U, ret0, uint8_t), uint8_t);
11657 uint8_t ret1[32U];
11658 libcrux_ml_kem_hash_functions_portable_PRF_f1_ee(
11659 Eurydice_array_to_slice((size_t)64U, kdf_input, uint8_t), ret1);
11660 memcpy(ret, ret1, (size_t)32U * sizeof(uint8_t));
11661 }
11662
11663 /**
11664 A monomorphic instance of libcrux_ml_kem.ind_cca.decapsulate
11665 with types libcrux_ml_kem_vector_portable_vector_type_PortableVector,
11666 libcrux_ml_kem_hash_functions_portable_PortableHash[[$3size_t]],
11667 libcrux_ml_kem_variant_Kyber with const generics
11668 - K= 3
11669 - SECRET_KEY_SIZE= 2400
11670 - CPA_SECRET_KEY_SIZE= 1152
11671 - PUBLIC_KEY_SIZE= 1184
11672 - CIPHERTEXT_SIZE= 1088
11673 - T_AS_NTT_ENCODED_SIZE= 1152
11674 - C1_SIZE= 960
11675 - C2_SIZE= 128
11676 - VECTOR_U_COMPRESSION_FACTOR= 10
11677 - VECTOR_V_COMPRESSION_FACTOR= 4
11678 - C1_BLOCK_SIZE= 320
11679 - ETA1= 2
11680 - ETA1_RANDOMNESS_SIZE= 128
11681 - ETA2= 2
11682 - ETA2_RANDOMNESS_SIZE= 128
11683 - IMPLICIT_REJECTION_HASH_INPUT_SIZE= 1120
11684 */
libcrux_ml_kem_ind_cca_decapsulate_700(libcrux_ml_kem_types_MlKemPrivateKey_55 * private_key,libcrux_ml_kem_mlkem768_MlKem768Ciphertext * ciphertext,uint8_t ret[32U])11685 static inline void libcrux_ml_kem_ind_cca_decapsulate_700(
11686 libcrux_ml_kem_types_MlKemPrivateKey_55 *private_key,
11687 libcrux_ml_kem_mlkem768_MlKem768Ciphertext *ciphertext, uint8_t ret[32U]) {
11688 Eurydice_slice_uint8_t_x2 uu____0 = Eurydice_slice_split_at(
11689 Eurydice_array_to_slice((size_t)2400U, private_key->value, uint8_t),
11690 (size_t)1152U, uint8_t, Eurydice_slice_uint8_t_x2);
11691 Eurydice_slice ind_cpa_secret_key = uu____0.fst;
11692 Eurydice_slice secret_key0 = uu____0.snd;
11693 Eurydice_slice_uint8_t_x2 uu____1 = Eurydice_slice_split_at(
11694 secret_key0, (size_t)1184U, uint8_t, Eurydice_slice_uint8_t_x2);
11695 Eurydice_slice ind_cpa_public_key = uu____1.fst;
11696 Eurydice_slice secret_key = uu____1.snd;
11697 Eurydice_slice_uint8_t_x2 uu____2 = Eurydice_slice_split_at(
11698 secret_key, LIBCRUX_ML_KEM_CONSTANTS_H_DIGEST_SIZE, uint8_t,
11699 Eurydice_slice_uint8_t_x2);
11700 Eurydice_slice ind_cpa_public_key_hash = uu____2.fst;
11701 Eurydice_slice implicit_rejection_value = uu____2.snd;
11702 uint8_t decrypted[32U];
11703 libcrux_ml_kem_ind_cpa_decrypt_43(ind_cpa_secret_key, ciphertext->value,
11704 decrypted);
11705 uint8_t to_hash0[64U];
11706 libcrux_ml_kem_utils_into_padded_array_ea(
11707 Eurydice_array_to_slice((size_t)32U, decrypted, uint8_t), to_hash0);
11708 Eurydice_slice_copy(
11709 Eurydice_array_to_subslice_from(
11710 (size_t)64U, to_hash0, LIBCRUX_ML_KEM_CONSTANTS_SHARED_SECRET_SIZE,
11711 uint8_t, size_t),
11712 ind_cpa_public_key_hash, uint8_t);
11713 uint8_t hashed[64U];
11714 libcrux_ml_kem_hash_functions_portable_G_f1_e4(
11715 Eurydice_array_to_slice((size_t)64U, to_hash0, uint8_t), hashed);
11716 Eurydice_slice_uint8_t_x2 uu____3 = Eurydice_slice_split_at(
11717 Eurydice_array_to_slice((size_t)64U, hashed, uint8_t),
11718 LIBCRUX_ML_KEM_CONSTANTS_SHARED_SECRET_SIZE, uint8_t,
11719 Eurydice_slice_uint8_t_x2);
11720 Eurydice_slice shared_secret0 = uu____3.fst;
11721 Eurydice_slice pseudorandomness = uu____3.snd;
11722 uint8_t to_hash[1120U];
11723 libcrux_ml_kem_utils_into_padded_array_ea0(implicit_rejection_value, to_hash);
11724 Eurydice_slice uu____4 = Eurydice_array_to_subslice_from(
11725 (size_t)1120U, to_hash, LIBCRUX_ML_KEM_CONSTANTS_SHARED_SECRET_SIZE,
11726 uint8_t, size_t);
11727 Eurydice_slice_copy(uu____4, libcrux_ml_kem_types_as_ref_00_24(ciphertext),
11728 uint8_t);
11729 uint8_t implicit_rejection_shared_secret0[32U];
11730 libcrux_ml_kem_hash_functions_portable_PRF_f1_ee(
11731 Eurydice_array_to_slice((size_t)1120U, to_hash, uint8_t),
11732 implicit_rejection_shared_secret0);
11733 Eurydice_slice uu____5 = ind_cpa_public_key;
11734 /* Passing arrays by value in Rust generates a copy in C */
11735 uint8_t copy_of_decrypted[32U];
11736 memcpy(copy_of_decrypted, decrypted, (size_t)32U * sizeof(uint8_t));
11737 uint8_t expected_ciphertext[1088U];
11738 libcrux_ml_kem_ind_cpa_encrypt_60(uu____5, copy_of_decrypted,
11739 pseudorandomness, expected_ciphertext);
11740 uint8_t implicit_rejection_shared_secret[32U];
11741 libcrux_ml_kem_variant_kdf_33_f0(
11742 Eurydice_array_to_slice((size_t)32U, implicit_rejection_shared_secret0,
11743 uint8_t),
11744 ciphertext, implicit_rejection_shared_secret);
11745 uint8_t shared_secret[32U];
11746 libcrux_ml_kem_variant_kdf_33_f0(shared_secret0, ciphertext, shared_secret);
11747 uint8_t ret0[32U];
11748 libcrux_ml_kem_constant_time_ops_compare_ciphertexts_select_shared_secret_in_constant_time(
11749 libcrux_ml_kem_types_as_ref_00_24(ciphertext),
11750 Eurydice_array_to_slice((size_t)1088U, expected_ciphertext, uint8_t),
11751 Eurydice_array_to_slice((size_t)32U, shared_secret, uint8_t),
11752 Eurydice_array_to_slice((size_t)32U, implicit_rejection_shared_secret,
11753 uint8_t),
11754 ret0);
11755 memcpy(ret, ret0, (size_t)32U * sizeof(uint8_t));
11756 }
11757
11758 /**
11759 Portable decapsulate
11760 */
11761 /**
11762 A monomorphic instance of
11763 libcrux_ml_kem.ind_cca.instantiations.portable.kyber_decapsulate with const
11764 generics
11765 - K= 3
11766 - SECRET_KEY_SIZE= 2400
11767 - CPA_SECRET_KEY_SIZE= 1152
11768 - PUBLIC_KEY_SIZE= 1184
11769 - CIPHERTEXT_SIZE= 1088
11770 - T_AS_NTT_ENCODED_SIZE= 1152
11771 - C1_SIZE= 960
11772 - C2_SIZE= 128
11773 - VECTOR_U_COMPRESSION_FACTOR= 10
11774 - VECTOR_V_COMPRESSION_FACTOR= 4
11775 - C1_BLOCK_SIZE= 320
11776 - ETA1= 2
11777 - ETA1_RANDOMNESS_SIZE= 128
11778 - ETA2= 2
11779 - ETA2_RANDOMNESS_SIZE= 128
11780 - IMPLICIT_REJECTION_HASH_INPUT_SIZE= 1120
11781 */
11782 static inline void
libcrux_ml_kem_ind_cca_instantiations_portable_kyber_decapsulate_fc(libcrux_ml_kem_types_MlKemPrivateKey_55 * private_key,libcrux_ml_kem_mlkem768_MlKem768Ciphertext * ciphertext,uint8_t ret[32U])11783 libcrux_ml_kem_ind_cca_instantiations_portable_kyber_decapsulate_fc(
11784 libcrux_ml_kem_types_MlKemPrivateKey_55 *private_key,
11785 libcrux_ml_kem_mlkem768_MlKem768Ciphertext *ciphertext, uint8_t ret[32U]) {
11786 libcrux_ml_kem_ind_cca_decapsulate_700(private_key, ciphertext, ret);
11787 }
11788
11789 /**
11790 Decapsulate Kyber 768
11791
11792 Generates an [`MlKemSharedSecret`].
11793 The input is a reference to an [`MlKem768PrivateKey`] and an
11794 [`MlKem768Ciphertext`].
11795 */
libcrux_ml_kem_mlkem768_portable_kyber_decapsulate(libcrux_ml_kem_types_MlKemPrivateKey_55 * private_key,libcrux_ml_kem_mlkem768_MlKem768Ciphertext * ciphertext,uint8_t ret[32U])11796 static inline void libcrux_ml_kem_mlkem768_portable_kyber_decapsulate(
11797 libcrux_ml_kem_types_MlKemPrivateKey_55 *private_key,
11798 libcrux_ml_kem_mlkem768_MlKem768Ciphertext *ciphertext, uint8_t ret[32U]) {
11799 libcrux_ml_kem_ind_cca_instantiations_portable_kyber_decapsulate_fc(
11800 private_key, ciphertext, ret);
11801 }
11802
11803 /**
11804 This function found in impl {(libcrux_ml_kem::variant::Variant for
11805 libcrux_ml_kem::variant::Kyber)}
11806 */
11807 /**
11808 A monomorphic instance of libcrux_ml_kem.variant.entropy_preprocess_33
11809 with types libcrux_ml_kem_hash_functions_portable_PortableHash[[$3size_t]]
11810 with const generics
11811 - K= 3
11812 */
libcrux_ml_kem_variant_entropy_preprocess_33_8a(Eurydice_slice randomness,uint8_t ret[32U])11813 static KRML_MUSTINLINE void libcrux_ml_kem_variant_entropy_preprocess_33_8a(
11814 Eurydice_slice randomness, uint8_t ret[32U]) {
11815 libcrux_ml_kem_hash_functions_portable_H_f1_1a(randomness, ret);
11816 }
11817
11818 /**
11819 A monomorphic instance of libcrux_ml_kem.ind_cca.encapsulate
11820 with types libcrux_ml_kem_vector_portable_vector_type_PortableVector,
11821 libcrux_ml_kem_hash_functions_portable_PortableHash[[$3size_t]],
11822 libcrux_ml_kem_variant_Kyber with const generics
11823 - K= 3
11824 - CIPHERTEXT_SIZE= 1088
11825 - PUBLIC_KEY_SIZE= 1184
11826 - T_AS_NTT_ENCODED_SIZE= 1152
11827 - C1_SIZE= 960
11828 - C2_SIZE= 128
11829 - VECTOR_U_COMPRESSION_FACTOR= 10
11830 - VECTOR_V_COMPRESSION_FACTOR= 4
11831 - VECTOR_U_BLOCK_LEN= 320
11832 - ETA1= 2
11833 - ETA1_RANDOMNESS_SIZE= 128
11834 - ETA2= 2
11835 - ETA2_RANDOMNESS_SIZE= 128
11836 */
libcrux_ml_kem_ind_cca_encapsulate_cd0(libcrux_ml_kem_types_MlKemPublicKey_15 * public_key,uint8_t randomness[32U])11837 static inline tuple_3c libcrux_ml_kem_ind_cca_encapsulate_cd0(
11838 libcrux_ml_kem_types_MlKemPublicKey_15 *public_key,
11839 uint8_t randomness[32U]) {
11840 uint8_t randomness0[32U];
11841 libcrux_ml_kem_variant_entropy_preprocess_33_8a(
11842 Eurydice_array_to_slice((size_t)32U, randomness, uint8_t), randomness0);
11843 uint8_t to_hash[64U];
11844 libcrux_ml_kem_utils_into_padded_array_ea(
11845 Eurydice_array_to_slice((size_t)32U, randomness0, uint8_t), to_hash);
11846 Eurydice_slice uu____0 = Eurydice_array_to_subslice_from(
11847 (size_t)64U, to_hash, LIBCRUX_ML_KEM_CONSTANTS_H_DIGEST_SIZE, uint8_t,
11848 size_t);
11849 uint8_t ret[32U];
11850 libcrux_ml_kem_hash_functions_portable_H_f1_1a(
11851 Eurydice_array_to_slice((size_t)1184U,
11852 libcrux_ml_kem_types_as_slice_cb_50(public_key),
11853 uint8_t),
11854 ret);
11855 Eurydice_slice_copy(
11856 uu____0, Eurydice_array_to_slice((size_t)32U, ret, uint8_t), uint8_t);
11857 uint8_t hashed[64U];
11858 libcrux_ml_kem_hash_functions_portable_G_f1_e4(
11859 Eurydice_array_to_slice((size_t)64U, to_hash, uint8_t), hashed);
11860 Eurydice_slice_uint8_t_x2 uu____1 = Eurydice_slice_split_at(
11861 Eurydice_array_to_slice((size_t)64U, hashed, uint8_t),
11862 LIBCRUX_ML_KEM_CONSTANTS_SHARED_SECRET_SIZE, uint8_t,
11863 Eurydice_slice_uint8_t_x2);
11864 Eurydice_slice shared_secret = uu____1.fst;
11865 Eurydice_slice pseudorandomness = uu____1.snd;
11866 Eurydice_slice uu____2 = Eurydice_array_to_slice(
11867 (size_t)1184U, libcrux_ml_kem_types_as_slice_cb_50(public_key), uint8_t);
11868 /* Passing arrays by value in Rust generates a copy in C */
11869 uint8_t copy_of_randomness[32U];
11870 memcpy(copy_of_randomness, randomness0, (size_t)32U * sizeof(uint8_t));
11871 uint8_t ciphertext[1088U];
11872 libcrux_ml_kem_ind_cpa_encrypt_60(uu____2, copy_of_randomness,
11873 pseudorandomness, ciphertext);
11874 /* Passing arrays by value in Rust generates a copy in C */
11875 uint8_t copy_of_ciphertext[1088U];
11876 memcpy(copy_of_ciphertext, ciphertext, (size_t)1088U * sizeof(uint8_t));
11877 libcrux_ml_kem_mlkem768_MlKem768Ciphertext ciphertext0 =
11878 libcrux_ml_kem_types_from_01_9f(copy_of_ciphertext);
11879 uint8_t shared_secret_array[32U];
11880 libcrux_ml_kem_variant_kdf_33_f0(shared_secret, &ciphertext0,
11881 shared_secret_array);
11882 libcrux_ml_kem_mlkem768_MlKem768Ciphertext uu____5 = ciphertext0;
11883 /* Passing arrays by value in Rust generates a copy in C */
11884 uint8_t copy_of_shared_secret_array[32U];
11885 memcpy(copy_of_shared_secret_array, shared_secret_array,
11886 (size_t)32U * sizeof(uint8_t));
11887 tuple_3c lit;
11888 lit.fst = uu____5;
11889 memcpy(lit.snd, copy_of_shared_secret_array, (size_t)32U * sizeof(uint8_t));
11890 return lit;
11891 }
11892
11893 /**
11894 Portable encapsulate
11895 */
11896 /**
11897 A monomorphic instance of
11898 libcrux_ml_kem.ind_cca.instantiations.portable.kyber_encapsulate with const
11899 generics
11900 - K= 3
11901 - CIPHERTEXT_SIZE= 1088
11902 - PUBLIC_KEY_SIZE= 1184
11903 - T_AS_NTT_ENCODED_SIZE= 1152
11904 - C1_SIZE= 960
11905 - C2_SIZE= 128
11906 - VECTOR_U_COMPRESSION_FACTOR= 10
11907 - VECTOR_V_COMPRESSION_FACTOR= 4
11908 - VECTOR_U_BLOCK_LEN= 320
11909 - ETA1= 2
11910 - ETA1_RANDOMNESS_SIZE= 128
11911 - ETA2= 2
11912 - ETA2_RANDOMNESS_SIZE= 128
11913 */
11914 static inline tuple_3c
libcrux_ml_kem_ind_cca_instantiations_portable_kyber_encapsulate_7a(libcrux_ml_kem_types_MlKemPublicKey_15 * public_key,uint8_t randomness[32U])11915 libcrux_ml_kem_ind_cca_instantiations_portable_kyber_encapsulate_7a(
11916 libcrux_ml_kem_types_MlKemPublicKey_15 *public_key,
11917 uint8_t randomness[32U]) {
11918 libcrux_ml_kem_types_MlKemPublicKey_15 *uu____0 = public_key;
11919 /* Passing arrays by value in Rust generates a copy in C */
11920 uint8_t copy_of_randomness[32U];
11921 memcpy(copy_of_randomness, randomness, (size_t)32U * sizeof(uint8_t));
11922 return libcrux_ml_kem_ind_cca_encapsulate_cd0(uu____0, copy_of_randomness);
11923 }
11924
11925 /**
11926 Encapsulate Kyber 768
11927
11928 Generates an ([`MlKem768Ciphertext`], [`MlKemSharedSecret`]) tuple.
11929 The input is a reference to an [`MlKem768PublicKey`] and [`SHARED_SECRET_SIZE`]
11930 bytes of `randomness`.
11931 */
libcrux_ml_kem_mlkem768_portable_kyber_encapsulate(libcrux_ml_kem_types_MlKemPublicKey_15 * public_key,uint8_t randomness[32U])11932 static inline tuple_3c libcrux_ml_kem_mlkem768_portable_kyber_encapsulate(
11933 libcrux_ml_kem_types_MlKemPublicKey_15 *public_key,
11934 uint8_t randomness[32U]) {
11935 libcrux_ml_kem_types_MlKemPublicKey_15 *uu____0 = public_key;
11936 /* Passing arrays by value in Rust generates a copy in C */
11937 uint8_t copy_of_randomness[32U];
11938 memcpy(copy_of_randomness, randomness, (size_t)32U * sizeof(uint8_t));
11939 return libcrux_ml_kem_ind_cca_instantiations_portable_kyber_encapsulate_7a(
11940 uu____0, copy_of_randomness);
11941 }
11942
11943 /**
11944 This function found in impl {(libcrux_ml_kem::variant::Variant for
11945 libcrux_ml_kem::variant::Kyber)}
11946 */
11947 /**
11948 A monomorphic instance of libcrux_ml_kem.variant.cpa_keygen_seed_33
11949 with types libcrux_ml_kem_hash_functions_portable_PortableHash[[$3size_t]]
11950 with const generics
11951 - K= 3
11952 */
libcrux_ml_kem_variant_cpa_keygen_seed_33_b6(Eurydice_slice key_generation_seed,uint8_t ret[64U])11953 static KRML_MUSTINLINE void libcrux_ml_kem_variant_cpa_keygen_seed_33_b6(
11954 Eurydice_slice key_generation_seed, uint8_t ret[64U]) {
11955 libcrux_ml_kem_hash_functions_portable_G_f1_e4(key_generation_seed, ret);
11956 }
11957
11958 /**
11959 A monomorphic instance of libcrux_ml_kem.ind_cpa.generate_keypair
11960 with types libcrux_ml_kem_vector_portable_vector_type_PortableVector,
11961 libcrux_ml_kem_hash_functions_portable_PortableHash[[$3size_t]],
11962 libcrux_ml_kem_variant_Kyber with const generics
11963 - K= 3
11964 - PRIVATE_KEY_SIZE= 1152
11965 - PUBLIC_KEY_SIZE= 1184
11966 - RANKED_BYTES_PER_RING_ELEMENT= 1152
11967 - ETA1= 2
11968 - ETA1_RANDOMNESS_SIZE= 128
11969 */
11970 static inline libcrux_ml_kem_utils_extraction_helper_Keypair768
libcrux_ml_kem_ind_cpa_generate_keypair_fc0(Eurydice_slice key_generation_seed)11971 libcrux_ml_kem_ind_cpa_generate_keypair_fc0(
11972 Eurydice_slice key_generation_seed) {
11973 uint8_t hashed[64U];
11974 libcrux_ml_kem_variant_cpa_keygen_seed_33_b6(key_generation_seed, hashed);
11975 Eurydice_slice_uint8_t_x2 uu____0 = Eurydice_slice_split_at(
11976 Eurydice_array_to_slice((size_t)64U, hashed, uint8_t), (size_t)32U,
11977 uint8_t, Eurydice_slice_uint8_t_x2);
11978 Eurydice_slice seed_for_A0 = uu____0.fst;
11979 Eurydice_slice seed_for_secret_and_error = uu____0.snd;
11980 libcrux_ml_kem_polynomial_PolynomialRingElement_f0 A_transpose[3U][3U];
11981 uint8_t ret[34U];
11982 libcrux_ml_kem_utils_into_padded_array_ea1(seed_for_A0, ret);
11983 libcrux_ml_kem_matrix_sample_matrix_A_38(ret, true, A_transpose);
11984 uint8_t prf_input[33U];
11985 libcrux_ml_kem_utils_into_padded_array_ea2(seed_for_secret_and_error,
11986 prf_input);
11987 /* Passing arrays by value in Rust generates a copy in C */
11988 uint8_t copy_of_prf_input0[33U];
11989 memcpy(copy_of_prf_input0, prf_input, (size_t)33U * sizeof(uint8_t));
11990 tuple_b0 uu____2 = libcrux_ml_kem_ind_cpa_sample_vector_cbd_then_ntt_fc(
11991 copy_of_prf_input0, 0U);
11992 libcrux_ml_kem_polynomial_PolynomialRingElement_f0 secret_as_ntt[3U];
11993 memcpy(
11994 secret_as_ntt, uu____2.fst,
11995 (size_t)3U * sizeof(libcrux_ml_kem_polynomial_PolynomialRingElement_f0));
11996 uint8_t domain_separator = uu____2.snd;
11997 /* Passing arrays by value in Rust generates a copy in C */
11998 uint8_t copy_of_prf_input[33U];
11999 memcpy(copy_of_prf_input, prf_input, (size_t)33U * sizeof(uint8_t));
12000 libcrux_ml_kem_polynomial_PolynomialRingElement_f0 error_as_ntt[3U];
12001 memcpy(
12002 error_as_ntt,
12003 libcrux_ml_kem_ind_cpa_sample_vector_cbd_then_ntt_fc(copy_of_prf_input,
12004 domain_separator)
12005 .fst,
12006 (size_t)3U * sizeof(libcrux_ml_kem_polynomial_PolynomialRingElement_f0));
12007 libcrux_ml_kem_polynomial_PolynomialRingElement_f0 t_as_ntt[3U];
12008 libcrux_ml_kem_matrix_compute_As_plus_e_60(A_transpose, secret_as_ntt,
12009 error_as_ntt, t_as_ntt);
12010 uint8_t seed_for_A[32U];
12011 Result_00 dst;
12012 Eurydice_slice_to_array2(&dst, seed_for_A0, Eurydice_slice, uint8_t[32U]);
12013 unwrap_41_83(dst, seed_for_A);
12014 uint8_t public_key_serialized[1184U];
12015 libcrux_ml_kem_ind_cpa_serialize_public_key_79(
12016 t_as_ntt, Eurydice_array_to_slice((size_t)32U, seed_for_A, uint8_t),
12017 public_key_serialized);
12018 uint8_t secret_key_serialized[1152U];
12019 libcrux_ml_kem_ind_cpa_serialize_secret_key_b5(secret_as_ntt,
12020 secret_key_serialized);
12021 /* Passing arrays by value in Rust generates a copy in C */
12022 uint8_t copy_of_secret_key_serialized[1152U];
12023 memcpy(copy_of_secret_key_serialized, secret_key_serialized,
12024 (size_t)1152U * sizeof(uint8_t));
12025 /* Passing arrays by value in Rust generates a copy in C */
12026 uint8_t copy_of_public_key_serialized[1184U];
12027 memcpy(copy_of_public_key_serialized, public_key_serialized,
12028 (size_t)1184U * sizeof(uint8_t));
12029 libcrux_ml_kem_utils_extraction_helper_Keypair768 lit;
12030 memcpy(lit.fst, copy_of_secret_key_serialized,
12031 (size_t)1152U * sizeof(uint8_t));
12032 memcpy(lit.snd, copy_of_public_key_serialized,
12033 (size_t)1184U * sizeof(uint8_t));
12034 return lit;
12035 }
12036
12037 /**
12038 Packed API
12039
12040 Generate a key pair.
12041
12042 Depending on the `Vector` and `Hasher` used, this requires different hardware
12043 features
12044 */
12045 /**
12046 A monomorphic instance of libcrux_ml_kem.ind_cca.generate_keypair
12047 with types libcrux_ml_kem_vector_portable_vector_type_PortableVector,
12048 libcrux_ml_kem_hash_functions_portable_PortableHash[[$3size_t]],
12049 libcrux_ml_kem_variant_Kyber with const generics
12050 - K= 3
12051 - CPA_PRIVATE_KEY_SIZE= 1152
12052 - PRIVATE_KEY_SIZE= 2400
12053 - PUBLIC_KEY_SIZE= 1184
12054 - BYTES_PER_RING_ELEMENT= 1152
12055 - ETA1= 2
12056 - ETA1_RANDOMNESS_SIZE= 128
12057 */
12058 static inline libcrux_ml_kem_mlkem768_MlKem768KeyPair
libcrux_ml_kem_ind_cca_generate_keypair_8c0(uint8_t randomness[64U])12059 libcrux_ml_kem_ind_cca_generate_keypair_8c0(uint8_t randomness[64U]) {
12060 Eurydice_slice ind_cpa_keypair_randomness = Eurydice_array_to_subslice2(
12061 randomness, (size_t)0U,
12062 LIBCRUX_ML_KEM_CONSTANTS_CPA_PKE_KEY_GENERATION_SEED_SIZE, uint8_t);
12063 Eurydice_slice implicit_rejection_value = Eurydice_array_to_subslice_from(
12064 (size_t)64U, randomness,
12065 LIBCRUX_ML_KEM_CONSTANTS_CPA_PKE_KEY_GENERATION_SEED_SIZE, uint8_t,
12066 size_t);
12067 libcrux_ml_kem_utils_extraction_helper_Keypair768 uu____0 =
12068 libcrux_ml_kem_ind_cpa_generate_keypair_fc0(ind_cpa_keypair_randomness);
12069 uint8_t ind_cpa_private_key[1152U];
12070 memcpy(ind_cpa_private_key, uu____0.fst, (size_t)1152U * sizeof(uint8_t));
12071 uint8_t public_key[1184U];
12072 memcpy(public_key, uu____0.snd, (size_t)1184U * sizeof(uint8_t));
12073 uint8_t secret_key_serialized[2400U];
12074 libcrux_ml_kem_ind_cca_serialize_kem_secret_key_48(
12075 Eurydice_array_to_slice((size_t)1152U, ind_cpa_private_key, uint8_t),
12076 Eurydice_array_to_slice((size_t)1184U, public_key, uint8_t),
12077 implicit_rejection_value, secret_key_serialized);
12078 /* Passing arrays by value in Rust generates a copy in C */
12079 uint8_t copy_of_secret_key_serialized[2400U];
12080 memcpy(copy_of_secret_key_serialized, secret_key_serialized,
12081 (size_t)2400U * sizeof(uint8_t));
12082 libcrux_ml_kem_types_MlKemPrivateKey_55 private_key =
12083 libcrux_ml_kem_types_from_05_f2(copy_of_secret_key_serialized);
12084 libcrux_ml_kem_types_MlKemPrivateKey_55 uu____2 = private_key;
12085 /* Passing arrays by value in Rust generates a copy in C */
12086 uint8_t copy_of_public_key[1184U];
12087 memcpy(copy_of_public_key, public_key, (size_t)1184U * sizeof(uint8_t));
12088 return libcrux_ml_kem_types_from_17_35(
12089 uu____2, libcrux_ml_kem_types_from_b6_da(copy_of_public_key));
12090 }
12091
12092 /**
12093 A monomorphic instance of
12094 libcrux_ml_kem.ind_cca.instantiations.portable.kyber_generate_keypair with const
12095 generics
12096 - K= 3
12097 - CPA_PRIVATE_KEY_SIZE= 1152
12098 - PRIVATE_KEY_SIZE= 2400
12099 - PUBLIC_KEY_SIZE= 1184
12100 - BYTES_PER_RING_ELEMENT= 1152
12101 - ETA1= 2
12102 - ETA1_RANDOMNESS_SIZE= 128
12103 */
12104 static inline libcrux_ml_kem_mlkem768_MlKem768KeyPair
libcrux_ml_kem_ind_cca_instantiations_portable_kyber_generate_keypair_9b(uint8_t randomness[64U])12105 libcrux_ml_kem_ind_cca_instantiations_portable_kyber_generate_keypair_9b(
12106 uint8_t randomness[64U]) {
12107 /* Passing arrays by value in Rust generates a copy in C */
12108 uint8_t copy_of_randomness[64U];
12109 memcpy(copy_of_randomness, randomness, (size_t)64U * sizeof(uint8_t));
12110 return libcrux_ml_kem_ind_cca_generate_keypair_8c0(copy_of_randomness);
12111 }
12112
12113 /**
12114 Generate Kyber 768 Key Pair
12115 */
12116 static inline libcrux_ml_kem_mlkem768_MlKem768KeyPair
libcrux_ml_kem_mlkem768_portable_kyber_generate_key_pair(uint8_t randomness[64U])12117 libcrux_ml_kem_mlkem768_portable_kyber_generate_key_pair(
12118 uint8_t randomness[64U]) {
12119 /* Passing arrays by value in Rust generates a copy in C */
12120 uint8_t copy_of_randomness[64U];
12121 memcpy(copy_of_randomness, randomness, (size_t)64U * sizeof(uint8_t));
12122 return libcrux_ml_kem_ind_cca_instantiations_portable_kyber_generate_keypair_9b(
12123 copy_of_randomness);
12124 }
12125
12126 /**
12127 Validate an ML-KEM private key.
12128
12129 This implements the Hash check in 7.3 3.
12130 Note that the size checks in 7.2 1 and 2 are covered by the `SECRET_KEY_SIZE`
12131 and `CIPHERTEXT_SIZE` in the `private_key` and `ciphertext` types.
12132 */
12133 /**
12134 A monomorphic instance of libcrux_ml_kem.ind_cca.validate_private_key
12135 with types libcrux_ml_kem_hash_functions_portable_PortableHash[[$3size_t]]
12136 with const generics
12137 - K= 3
12138 - SECRET_KEY_SIZE= 2400
12139 - CIPHERTEXT_SIZE= 1088
12140 */
libcrux_ml_kem_ind_cca_validate_private_key_e7(libcrux_ml_kem_types_MlKemPrivateKey_55 * private_key,libcrux_ml_kem_mlkem768_MlKem768Ciphertext * _ciphertext)12141 static KRML_MUSTINLINE bool libcrux_ml_kem_ind_cca_validate_private_key_e7(
12142 libcrux_ml_kem_types_MlKemPrivateKey_55 *private_key,
12143 libcrux_ml_kem_mlkem768_MlKem768Ciphertext *_ciphertext) {
12144 uint8_t t[32U];
12145 libcrux_ml_kem_hash_functions_portable_H_f1_1a(
12146 Eurydice_array_to_subslice2(private_key->value, (size_t)384U * (size_t)3U,
12147 (size_t)768U * (size_t)3U + (size_t)32U,
12148 uint8_t),
12149 t);
12150 Eurydice_slice expected = Eurydice_array_to_subslice2(
12151 private_key->value, (size_t)768U * (size_t)3U + (size_t)32U,
12152 (size_t)768U * (size_t)3U + (size_t)64U, uint8_t);
12153 return core_array_equality___core__cmp__PartialEq__0___Slice_U____for__Array_T__N___3__eq(
12154 (size_t)32U, t, &expected, uint8_t, uint8_t, bool);
12155 }
12156
12157 /**
12158 Portable private key validation
12159 */
12160 /**
12161 A monomorphic instance of
12162 libcrux_ml_kem.ind_cca.instantiations.portable.validate_private_key with const
12163 generics
12164 - K= 3
12165 - SECRET_KEY_SIZE= 2400
12166 - CIPHERTEXT_SIZE= 1088
12167 */
12168 static KRML_MUSTINLINE bool
libcrux_ml_kem_ind_cca_instantiations_portable_validate_private_key_9c(libcrux_ml_kem_types_MlKemPrivateKey_55 * private_key,libcrux_ml_kem_mlkem768_MlKem768Ciphertext * ciphertext)12169 libcrux_ml_kem_ind_cca_instantiations_portable_validate_private_key_9c(
12170 libcrux_ml_kem_types_MlKemPrivateKey_55 *private_key,
12171 libcrux_ml_kem_mlkem768_MlKem768Ciphertext *ciphertext) {
12172 return libcrux_ml_kem_ind_cca_validate_private_key_e7(private_key,
12173 ciphertext);
12174 }
12175
12176 /**
12177 Validate a private key.
12178
12179 Returns `true` if valid, and `false` otherwise.
12180 */
libcrux_ml_kem_mlkem768_portable_validate_private_key(libcrux_ml_kem_types_MlKemPrivateKey_55 * private_key,libcrux_ml_kem_mlkem768_MlKem768Ciphertext * ciphertext)12181 static inline bool libcrux_ml_kem_mlkem768_portable_validate_private_key(
12182 libcrux_ml_kem_types_MlKemPrivateKey_55 *private_key,
12183 libcrux_ml_kem_mlkem768_MlKem768Ciphertext *ciphertext) {
12184 return libcrux_ml_kem_ind_cca_instantiations_portable_validate_private_key_9c(
12185 private_key, ciphertext);
12186 }
12187
12188 /**
12189 A monomorphic instance of
12190 libcrux_ml_kem.serialize.deserialize_ring_elements_reduced.closure with types
12191 libcrux_ml_kem_vector_portable_vector_type_PortableVector with const generics
12192 - PUBLIC_KEY_SIZE= 1184
12193 - K= 3
12194 */
12195 static inline libcrux_ml_kem_polynomial_PolynomialRingElement_f0
libcrux_ml_kem_serialize_deserialize_ring_elements_reduced_closure_cd0(size_t _i)12196 libcrux_ml_kem_serialize_deserialize_ring_elements_reduced_closure_cd0(
12197 size_t _i) {
12198 return libcrux_ml_kem_polynomial_ZERO_89_ea();
12199 }
12200
12201 /**
12202 This function deserializes ring elements and reduces the result by the field
12203 modulus.
12204
12205 This function MUST NOT be used on secret inputs.
12206 */
12207 /**
12208 A monomorphic instance of
12209 libcrux_ml_kem.serialize.deserialize_ring_elements_reduced with types
12210 libcrux_ml_kem_vector_portable_vector_type_PortableVector with const generics
12211 - PUBLIC_KEY_SIZE= 1184
12212 - K= 3
12213 */
12214 static KRML_MUSTINLINE void
libcrux_ml_kem_serialize_deserialize_ring_elements_reduced_330(Eurydice_slice public_key,libcrux_ml_kem_polynomial_PolynomialRingElement_f0 ret[3U])12215 libcrux_ml_kem_serialize_deserialize_ring_elements_reduced_330(
12216 Eurydice_slice public_key,
12217 libcrux_ml_kem_polynomial_PolynomialRingElement_f0 ret[3U]) {
12218 libcrux_ml_kem_polynomial_PolynomialRingElement_f0 deserialized_pk[3U];
12219 for (size_t i = (size_t)0U; i < (size_t)3U; i++) {
12220 deserialized_pk[i] = libcrux_ml_kem_polynomial_ZERO_89_ea();
12221 }
12222 for (size_t i = (size_t)0U;
12223 i < Eurydice_slice_len(public_key, uint8_t) /
12224 LIBCRUX_ML_KEM_CONSTANTS_BYTES_PER_RING_ELEMENT;
12225 i++) {
12226 size_t i0 = i;
12227 Eurydice_slice ring_element = Eurydice_slice_subslice2(
12228 public_key, i0 * LIBCRUX_ML_KEM_CONSTANTS_BYTES_PER_RING_ELEMENT,
12229 i0 * LIBCRUX_ML_KEM_CONSTANTS_BYTES_PER_RING_ELEMENT +
12230 LIBCRUX_ML_KEM_CONSTANTS_BYTES_PER_RING_ELEMENT,
12231 uint8_t);
12232 libcrux_ml_kem_polynomial_PolynomialRingElement_f0 uu____0 =
12233 libcrux_ml_kem_serialize_deserialize_to_reduced_ring_element_4c(
12234 ring_element);
12235 deserialized_pk[i0] = uu____0;
12236 }
12237 memcpy(
12238 ret, deserialized_pk,
12239 (size_t)3U * sizeof(libcrux_ml_kem_polynomial_PolynomialRingElement_f0));
12240 }
12241
12242 /**
12243 Validate an ML-KEM public key.
12244
12245 This implements the Modulus check in 7.2 2.
12246 Note that the size check in 7.2 1 is covered by the `PUBLIC_KEY_SIZE` in the
12247 `public_key` type.
12248 */
12249 /**
12250 A monomorphic instance of libcrux_ml_kem.ind_cca.validate_public_key
12251 with types libcrux_ml_kem_vector_portable_vector_type_PortableVector
12252 with const generics
12253 - K= 3
12254 - RANKED_BYTES_PER_RING_ELEMENT= 1152
12255 - PUBLIC_KEY_SIZE= 1184
12256 */
libcrux_ml_kem_ind_cca_validate_public_key_19(uint8_t * public_key)12257 static KRML_MUSTINLINE bool libcrux_ml_kem_ind_cca_validate_public_key_19(
12258 uint8_t *public_key) {
12259 libcrux_ml_kem_polynomial_PolynomialRingElement_f0 deserialized_pk[3U];
12260 libcrux_ml_kem_serialize_deserialize_ring_elements_reduced_330(
12261 Eurydice_array_to_subslice_to((size_t)1184U, public_key, (size_t)1152U,
12262 uint8_t, size_t),
12263 deserialized_pk);
12264 libcrux_ml_kem_polynomial_PolynomialRingElement_f0 *uu____0 = deserialized_pk;
12265 uint8_t public_key_serialized[1184U];
12266 libcrux_ml_kem_ind_cpa_serialize_public_key_79(
12267 uu____0,
12268 Eurydice_array_to_subslice_from((size_t)1184U, public_key, (size_t)1152U,
12269 uint8_t, size_t),
12270 public_key_serialized);
12271 return core_array_equality___core__cmp__PartialEq__Array_U__N___for__Array_T__N____eq(
12272 (size_t)1184U, public_key, public_key_serialized, uint8_t, uint8_t, bool);
12273 }
12274
12275 /**
12276 Portable public key validation
12277 */
12278 /**
12279 A monomorphic instance of
12280 libcrux_ml_kem.ind_cca.instantiations.portable.validate_public_key with const
12281 generics
12282 - K= 3
12283 - RANKED_BYTES_PER_RING_ELEMENT= 1152
12284 - PUBLIC_KEY_SIZE= 1184
12285 */
12286 static KRML_MUSTINLINE bool
libcrux_ml_kem_ind_cca_instantiations_portable_validate_public_key_4b(uint8_t * public_key)12287 libcrux_ml_kem_ind_cca_instantiations_portable_validate_public_key_4b(
12288 uint8_t *public_key) {
12289 return libcrux_ml_kem_ind_cca_validate_public_key_19(public_key);
12290 }
12291
12292 /**
12293 Validate a public key.
12294
12295 Returns `true` if valid, and `false` otherwise.
12296 */
libcrux_ml_kem_mlkem768_portable_validate_public_key(libcrux_ml_kem_types_MlKemPublicKey_15 * public_key)12297 static inline bool libcrux_ml_kem_mlkem768_portable_validate_public_key(
12298 libcrux_ml_kem_types_MlKemPublicKey_15 *public_key) {
12299 return libcrux_ml_kem_ind_cca_instantiations_portable_validate_public_key_4b(
12300 public_key->value);
12301 }
12302
12303 /**
12304 This function found in impl {(core::clone::Clone for
12305 libcrux_ml_kem::vector::portable::vector_type::PortableVector)}
12306 */
12307 static inline libcrux_ml_kem_vector_portable_vector_type_PortableVector
libcrux_ml_kem_vector_portable_vector_type_clone_3b(libcrux_ml_kem_vector_portable_vector_type_PortableVector * self)12308 libcrux_ml_kem_vector_portable_vector_type_clone_3b(
12309 libcrux_ml_kem_vector_portable_vector_type_PortableVector *self) {
12310 return self[0U];
12311 }
12312
12313 typedef int16_t libcrux_ml_kem_vector_portable_vector_type_FieldElement;
12314
12315 typedef int16_t
12316 libcrux_ml_kem_vector_portable_arithmetic_MontgomeryFieldElement;
12317
12318 typedef int16_t
12319 libcrux_ml_kem_vector_portable_arithmetic_FieldElementTimesMontgomeryR;
12320
12321 #if defined(__cplusplus)
12322 }
12323 #endif
12324
12325 #define __libcrux_mlkem768_portable_H_DEFINED
12326 #endif
12327
12328
12329 /* rename some types to be a bit more ergonomic */
12330 #define libcrux_mlkem768_keypair libcrux_ml_kem_mlkem768_MlKem768KeyPair_s
12331 #define libcrux_mlkem768_pk_valid_result Option_92_s
12332 #define libcrux_mlkem768_pk libcrux_ml_kem_types_MlKemPublicKey_15_s
12333 #define libcrux_mlkem768_sk libcrux_ml_kem_types_MlKemPrivateKey_55_s
12334 #define libcrux_mlkem768_ciphertext libcrux_ml_kem_mlkem768_MlKem768Ciphertext_s
12335 #define libcrux_mlkem768_enc_result tuple_3c_s
12336 /* defines for PRNG inputs */
12337 #define LIBCRUX_ML_KEM_KEY_PAIR_PRNG_LEN 64
12338 #define LIBCRUX_ML_KEM_ENC_PRNG_LEN 32
12339