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