Coverage Report

Created: 2025-11-05 06:16

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/nss/lib/freebl/verified/eurydice_glue.h
Line
Count
Source
1
#pragma once
2
3
#include <inttypes.h>
4
#include <stdbool.h>
5
#include <stdio.h>
6
#include <stdlib.h>
7
#include <string.h>
8
9
#ifdef _MSC_VER
10
// For __popcnt
11
#include <intrin.h>
12
#endif
13
14
#include "krml/internal/target.h"
15
#include "krml/lowstar_endianness.h"
16
17
// C++ HELPERS
18
19
#if defined(__cplusplus)
20
21
#ifndef KRML_HOST_EPRINTF
22
#define KRML_HOST_EPRINTF(...) fprintf(stderr, __VA_ARGS__)
23
#endif
24
25
#include <utility>
26
27
#ifndef __cpp_lib_type_identity
28
template <class T>
29
struct type_identity {
30
    using type = T
31
};
32
33
template <class T>
34
using type_identity_t = typename type_identity<T>::type;
35
#else
36
using std::type_identity_t;
37
#endif
38
39
#define KRML_UNION_CONSTRUCTOR(T)                              \
40
    template <typename V>                                      \
41
    constexpr T(int t, V U::*m, type_identity_t<V> v) : tag(t) \
42
    {                                                          \
43
        val.*m = std::move(v);                                 \
44
    }                                                          \
45
    T() = default;
46
47
#endif
48
49
// GENERAL-PURPOSE STUFF
50
51
#define LowStar_Ignore_ignore(e, t, _ret_t) ((void)e)
52
53
#define EURYDICE_ASSERT(test, msg)                                                  \
54
    do {                                                                            \
55
        if (!(test)) {                                                              \
56
            fprintf(stderr, "assertion \"%s\" failed: file \"%s\", line %d\n", msg, \
57
                    __FILE__, __LINE__);                                            \
58
            exit(255);                                                              \
59
        }                                                                           \
60
    } while (0)
61
62
// SLICES, ARRAYS, ETC.
63
64
// We represent a slice as a pair of an (untyped) pointer, along with the length
65
// of the slice, i.e. the number of elements in the slice (this is NOT the
66
// number of bytes). This design choice has two important consequences.
67
// - if you need to use `ptr`, you MUST cast it to a proper type *before*
68
//   performing pointer arithmetic on it (remember that C desugars pointer
69
//   arithmetic based on the type of the address)
70
// - if you need to use `len` for a C style function (e.g. memcpy, memcmp), you
71
//   need to multiply it by sizeof t, where t is the type of the elements.
72
//
73
// Empty slices have `len == 0` and `ptr` always needs to be a valid pointer
74
// that is not NULL (otherwise the construction in EURYDICE_SLICE computes `NULL
75
// + start`).
76
typedef struct {
77
    void *ptr;
78
    size_t len;
79
} Eurydice_slice;
80
81
#if defined(__cplusplus)
82
#define KRML_CLITERAL(type) type
83
#else
84
1.21G
#define KRML_CLITERAL(type) (type)
85
#endif
86
87
#if defined(__cplusplus) && defined(__cpp_designated_initializers) || \
88
    !(defined(__cplusplus))
89
#define EURYDICE_CFIELD(X) X
90
#else
91
#define EURYDICE_CFIELD(X)
92
#endif
93
94
// Helper macro to create a slice out of a pointer x, a start index in x
95
// (included), and an end index in x (excluded). The argument x must be suitably
96
// cast to something that can decay (see remark above about how pointer
97
// arithmetic works in C), meaning either pointer or array type.
98
#define EURYDICE_SLICE(x, start, end) \
99
29.7M
    (KRML_CLITERAL(Eurydice_slice){ (void *)(x + start), end - start })
100
101
// Slice length
102
#define EURYDICE_SLICE_LEN(s, _) (s).len
103
30.9M
#define Eurydice_slice_len(s, _) (s).len
104
105
// This macro is a pain because in case the dereferenced element type is an
106
// array, you cannot simply write `t x` as it would yield `int[4] x` instead,
107
// which is NOT correct C syntax, so we add a dedicated phase in Eurydice that
108
// adds an extra argument to this macro at the last minute so that we have the
109
// correct type of *pointers* to elements.
110
161M
#define Eurydice_slice_index(s, i, t, t_ptr_t) (((t_ptr_t)s.ptr)[i])
111
112
// The following functions get sub slices from a slice.
113
114
#define Eurydice_slice_subslice(s, r, t, _0, _1) \
115
    EURYDICE_SLICE((t *)s.ptr, r.start, r.end)
116
117
// Variant for when the start and end indices are statically known (i.e., the
118
// range argument `r` is a literal).
119
#define Eurydice_slice_subslice2(s, start, end, t) \
120
    EURYDICE_SLICE((t *)s.ptr, (start), (end))
121
122
#define Eurydice_slice_subslice_to(s, subslice_end_pos, t, _0, _1) \
123
658
    EURYDICE_SLICE((t *)s.ptr, 0, subslice_end_pos)
124
125
#define Eurydice_slice_subslice_from(s, subslice_start_pos, t, _0, _1) \
126
658
    EURYDICE_SLICE((t *)s.ptr, subslice_start_pos, s.len)
127
128
#define Eurydice_array_to_slice(end, x, t) \
129
454k
    EURYDICE_SLICE(x, 0,                   \
130
454k
                   end) /* x is already at an array type, no need for cast */
131
#define Eurydice_array_to_subslice(_arraylen, x, r, t, _0, _1) \
132
    EURYDICE_SLICE((t *)x, r.start, r.end)
133
134
// Same as above, variant for when start and end are statically known
135
#define Eurydice_array_to_subslice2(x, start, end, t) \
136
    EURYDICE_SLICE((t *)x, (start), (end))
137
138
// Same as above, variant for when start and end are statically known
139
#define Eurydice_array_to_subslice3(x, start, end, t_ptr) \
140
11.5M
    EURYDICE_SLICE((t_ptr)x, (start), (end))
141
142
#define Eurydice_array_repeat(dst, len, init, t) \
143
    ERROR "should've been desugared"
144
145
// The following functions convert an array into a slice.
146
147
#define Eurydice_array_to_subslice_to(_size, x, r, t, _range_t, _0) \
148
730
    EURYDICE_SLICE((t *)x, 0, r)
149
#define Eurydice_array_to_subslice_from(size, x, r, t, _range_t, _0) \
150
16.3k
    EURYDICE_SLICE((t *)x, r, size)
151
152
// Copy a slice with memcopy
153
#define Eurydice_slice_copy(dst, src, t) \
154
12.1M
    memcpy(dst.ptr, src.ptr, dst.len * sizeof(t))
155
156
#define core_array___Array_T__N___as_slice(len_, ptr_, t, _ret_t) \
157
0
    KRML_CLITERAL(Eurydice_slice) { ptr_, len_ }
158
159
#define core_array__core__clone__Clone_for__Array_T__N___clone( \
160
    len, src, dst, elem_type, _ret_t)                           \
161
    (memcpy(dst, src, len * sizeof(elem_type)))
162
#define TryFromSliceError uint8_t
163
#define core_array_TryFromSliceError uint8_t
164
165
730
#define Eurydice_array_eq(sz, a1, a2, t) (memcmp(a1, a2, sz * sizeof(t)) == 0)
166
167
// core::cmp::PartialEq<&0 (@Slice<U>)> for @Array<T, N>
168
#define Eurydice_array_eq_slice(sz, a1, s2, t, _) \
169
106
    (memcmp(a1, (s2)->ptr, sz * sizeof(t)) == 0)
170
171
#define core_array_equality___core__cmp__PartialEq__Array_U__N___for__Array_T__N____eq( \
172
    sz, a1, a2, t, _, _ret_t)                                                           \
173
    Eurydice_array_eq(sz, a1, a2, t, _)
174
#define core_array_equality___core__cmp__PartialEq__0___Slice_U____for__Array_T__N___3__eq( \
175
    sz, a1, a2, t, _, _ret_t)                                                               \
176
    Eurydice_array_eq(sz, a1, ((a2)->ptr), t, _)
177
178
#define Eurydice_slice_split_at(slice, mid, element_type, ret_t)              \
179
15.1k
    KRML_CLITERAL(ret_t)                                                      \
180
15.1k
    {                                                                         \
181
15.1k
        EURYDICE_CFIELD(.fst =)                                               \
182
15.1k
        EURYDICE_SLICE((element_type *)(slice).ptr, 0, mid),                  \
183
15.1k
            EURYDICE_CFIELD(.snd =)                                           \
184
15.1k
                EURYDICE_SLICE((element_type *)(slice).ptr, mid, (slice).len) \
185
15.1k
    }
186
187
#define Eurydice_slice_split_at_mut(slice, mid, element_type, ret_t)       \
188
    KRML_CLITERAL(ret_t)                                                   \
189
    {                                                                      \
190
        EURYDICE_CFIELD(.fst =)                                            \
191
        KRML_CLITERAL(Eurydice_slice){ EURYDICE_CFIELD(.ptr =)(slice.ptr), \
192
                                       EURYDICE_CFIELD(.len =) mid },      \
193
            EURYDICE_CFIELD(.snd =) KRML_CLITERAL(Eurydice_slice)          \
194
        {                                                                  \
195
            EURYDICE_CFIELD(.ptr =)                                        \
196
            ((char *)slice.ptr + mid * sizeof(element_type)),              \
197
                EURYDICE_CFIELD(.len =)(slice.len - mid)                   \
198
        }                                                                  \
199
    }
200
201
// Conversion of slice to an array, rewritten (by Eurydice) to name the
202
// destination array, since arrays are not values in C.
203
// N.B.: see note in karamel/lib/Inlining.ml if you change this.
204
#define Eurydice_slice_to_array2(dst, src, _0, t_arr, _1)                   \
205
10.4M
    Eurydice_slice_to_array3(&(dst)->tag, (char *)&(dst)->val.case_Ok, src, \
206
10.4M
                             sizeof(t_arr))
207
208
static inline void
209
Eurydice_slice_to_array3(uint8_t *dst_tag, char *dst_ok,
210
                         Eurydice_slice src, size_t sz)
211
10.4M
{
212
10.4M
    *dst_tag = 0;
213
10.4M
    memcpy(dst_ok, src.ptr, sz);
214
10.4M
}
Unexecuted instantiation: kyber.c:Eurydice_slice_to_array3
Unexecuted instantiation: libcrux_mlkem768_portable.c:Eurydice_slice_to_array3
Unexecuted instantiation: libcrux_mlkem1024_portable.c:Eurydice_slice_to_array3
libcrux_mlkem_portable.c:Eurydice_slice_to_array3
Line
Count
Source
211
3.64M
{
212
3.64M
    *dst_tag = 0;
213
3.64M
    memcpy(dst_ok, src.ptr, sz);
214
3.64M
}
Unexecuted instantiation: libcrux_core.c:Eurydice_slice_to_array3
libcrux_sha3_portable.c:Eurydice_slice_to_array3
Line
Count
Source
211
6.84M
{
212
6.84M
    *dst_tag = 0;
213
6.84M
    memcpy(dst_ok, src.ptr, sz);
214
6.84M
}
215
216
// SUPPORT FOR DSTs (Dynamically-Sized Types)
217
218
// A DST is a fat pointer that keeps tracks of the size of it flexible array
219
// member. Slices are a specific case of DSTs, where [T; N] implements
220
// Unsize<[T]>, meaning an array of statically known size can be converted to a
221
// fat pointer, i.e. a slice.
222
//
223
// Unlike slices, DSTs have a built-in definition that gets monomorphized, of
224
// the form:
225
//
226
// typedef struct {
227
//   T *ptr;
228
//   size_t len; // number of elements
229
// } Eurydice_dst;
230
//
231
// Furthermore, T = T0<[U0]> where `struct T0<U: ?Sized>`, where the `U` is the
232
// last field. This means that there are two monomorphizations of T0 in the
233
// program. One is `T0<[V; N]>`
234
// -- this is directly converted to a Eurydice_dst via suitable codegen (no
235
// macro). The other is `T = T0<[U]>`, where `[U]` gets emitted to
236
// `Eurydice_derefed_slice`, a type that only appears in that precise situation
237
// and is thus defined to give rise to a flexible array member.
238
239
typedef char Eurydice_derefed_slice[];
240
241
#define Eurydice_slice_of_dst(fam_ptr, len_, t, _) \
242
    ((Eurydice_slice){ .ptr = (void *)(fam_ptr), .len = len_ })
243
244
#define Eurydice_slice_of_boxed_array(ptr_, len_, t, _) \
245
    ((Eurydice_slice){ .ptr = (void *)(ptr_), .len = len_ })
246
247
// CORE STUFF (conversions, endianness, ...)
248
249
// We slap extern "C" on declarations that intend to implement a prototype
250
// generated by Eurydice, because Eurydice prototypes are always emitted within
251
// an extern "C" block, UNLESS you use -fcxx17-compat, in which case, you must
252
// pass -DKRML_CXX17_COMPAT="" to your C++ compiler.
253
#if defined(__cplusplus) && !defined(KRML_CXX17_COMPAT)
254
extern "C" {
255
#endif
256
257
static inline void
258
core_num__u32__to_be_bytes(uint32_t src, uint8_t dst[4])
259
0
{
260
0
    // TODO: why not store32_be?
261
0
    uint32_t x = htobe32(src);
262
0
    memcpy(dst, &x, 4);
263
0
}
Unexecuted instantiation: kyber.c:core_num__u32__to_be_bytes
Unexecuted instantiation: libcrux_mlkem768_portable.c:core_num__u32__to_be_bytes
Unexecuted instantiation: libcrux_mlkem1024_portable.c:core_num__u32__to_be_bytes
Unexecuted instantiation: libcrux_mlkem_portable.c:core_num__u32__to_be_bytes
Unexecuted instantiation: libcrux_core.c:core_num__u32__to_be_bytes
Unexecuted instantiation: libcrux_sha3_portable.c:core_num__u32__to_be_bytes
264
265
static inline void
266
core_num__u32__to_le_bytes(uint32_t src, uint8_t dst[4])
267
0
{
268
0
    store32_le(dst, src);
269
0
}
Unexecuted instantiation: kyber.c:core_num__u32__to_le_bytes
Unexecuted instantiation: libcrux_mlkem768_portable.c:core_num__u32__to_le_bytes
Unexecuted instantiation: libcrux_mlkem1024_portable.c:core_num__u32__to_le_bytes
Unexecuted instantiation: libcrux_mlkem_portable.c:core_num__u32__to_le_bytes
Unexecuted instantiation: libcrux_core.c:core_num__u32__to_le_bytes
Unexecuted instantiation: libcrux_sha3_portable.c:core_num__u32__to_le_bytes
270
271
static inline uint32_t
272
core_num__u32__from_le_bytes(uint8_t buf[4])
273
0
{
274
0
    return load32_le(buf);
275
0
}
Unexecuted instantiation: kyber.c:core_num__u32__from_le_bytes
Unexecuted instantiation: libcrux_mlkem768_portable.c:core_num__u32__from_le_bytes
Unexecuted instantiation: libcrux_mlkem1024_portable.c:core_num__u32__from_le_bytes
Unexecuted instantiation: libcrux_mlkem_portable.c:core_num__u32__from_le_bytes
Unexecuted instantiation: libcrux_core.c:core_num__u32__from_le_bytes
Unexecuted instantiation: libcrux_sha3_portable.c:core_num__u32__from_le_bytes
276
277
static inline void
278
core_num__u64__to_le_bytes(uint64_t v, uint8_t buf[8])
279
10.2M
{
280
10.2M
    store64_le(buf, v);
281
10.2M
}
Unexecuted instantiation: kyber.c:core_num__u64__to_le_bytes
Unexecuted instantiation: libcrux_mlkem768_portable.c:core_num__u64__to_le_bytes
Unexecuted instantiation: libcrux_mlkem1024_portable.c:core_num__u64__to_le_bytes
Unexecuted instantiation: libcrux_mlkem_portable.c:core_num__u64__to_le_bytes
Unexecuted instantiation: libcrux_core.c:core_num__u64__to_le_bytes
libcrux_sha3_portable.c:core_num__u64__to_le_bytes
Line
Count
Source
279
10.2M
{
280
    store64_le(buf, v);
281
10.2M
}
282
283
static inline uint64_t
284
core_num__u64__from_le_bytes(uint8_t buf[8])
285
6.84M
{
286
6.84M
    return load64_le(buf);
287
6.84M
}
Unexecuted instantiation: kyber.c:core_num__u64__from_le_bytes
Unexecuted instantiation: libcrux_mlkem768_portable.c:core_num__u64__from_le_bytes
Unexecuted instantiation: libcrux_mlkem1024_portable.c:core_num__u64__from_le_bytes
Unexecuted instantiation: libcrux_mlkem_portable.c:core_num__u64__from_le_bytes
Unexecuted instantiation: libcrux_core.c:core_num__u64__from_le_bytes
libcrux_sha3_portable.c:core_num__u64__from_le_bytes
Line
Count
Source
285
6.84M
{
286
    return load64_le(buf);
287
6.84M
}
288
289
static inline int64_t
290
core_convert_num___core__convert__From_i32__for_i64___from(int32_t x)
291
0
{
292
0
    return x;
293
0
}
Unexecuted instantiation: kyber.c:core_convert_num___core__convert__From_i32__for_i64___from
Unexecuted instantiation: libcrux_mlkem768_portable.c:core_convert_num___core__convert__From_i32__for_i64___from
Unexecuted instantiation: libcrux_mlkem1024_portable.c:core_convert_num___core__convert__From_i32__for_i64___from
Unexecuted instantiation: libcrux_mlkem_portable.c:core_convert_num___core__convert__From_i32__for_i64___from
Unexecuted instantiation: libcrux_core.c:core_convert_num___core__convert__From_i32__for_i64___from
Unexecuted instantiation: libcrux_sha3_portable.c:core_convert_num___core__convert__From_i32__for_i64___from
294
295
static inline uint64_t
296
core_convert_num___core__convert__From_u8__for_u64___from(uint8_t x)
297
0
{
298
0
    return x;
299
0
}
Unexecuted instantiation: kyber.c:core_convert_num___core__convert__From_u8__for_u64___from
Unexecuted instantiation: libcrux_mlkem768_portable.c:core_convert_num___core__convert__From_u8__for_u64___from
Unexecuted instantiation: libcrux_mlkem1024_portable.c:core_convert_num___core__convert__From_u8__for_u64___from
Unexecuted instantiation: libcrux_mlkem_portable.c:core_convert_num___core__convert__From_u8__for_u64___from
Unexecuted instantiation: libcrux_core.c:core_convert_num___core__convert__From_u8__for_u64___from
Unexecuted instantiation: libcrux_sha3_portable.c:core_convert_num___core__convert__From_u8__for_u64___from
300
301
static inline uint64_t
302
core_convert_num___core__convert__From_u16__for_u64___from(uint16_t x)
303
0
{
304
0
    return x;
305
0
}
Unexecuted instantiation: kyber.c:core_convert_num___core__convert__From_u16__for_u64___from
Unexecuted instantiation: libcrux_mlkem768_portable.c:core_convert_num___core__convert__From_u16__for_u64___from
Unexecuted instantiation: libcrux_mlkem1024_portable.c:core_convert_num___core__convert__From_u16__for_u64___from
Unexecuted instantiation: libcrux_mlkem_portable.c:core_convert_num___core__convert__From_u16__for_u64___from
Unexecuted instantiation: libcrux_core.c:core_convert_num___core__convert__From_u16__for_u64___from
Unexecuted instantiation: libcrux_sha3_portable.c:core_convert_num___core__convert__From_u16__for_u64___from
306
307
static inline size_t
308
core_convert_num___core__convert__From_u16__for_usize___from(uint16_t x)
309
0
{
310
0
    return x;
311
0
}
Unexecuted instantiation: kyber.c:core_convert_num___core__convert__From_u16__for_usize___from
Unexecuted instantiation: libcrux_mlkem768_portable.c:core_convert_num___core__convert__From_u16__for_usize___from
Unexecuted instantiation: libcrux_mlkem1024_portable.c:core_convert_num___core__convert__From_u16__for_usize___from
Unexecuted instantiation: libcrux_mlkem_portable.c:core_convert_num___core__convert__From_u16__for_usize___from
Unexecuted instantiation: libcrux_core.c:core_convert_num___core__convert__From_u16__for_usize___from
Unexecuted instantiation: libcrux_sha3_portable.c:core_convert_num___core__convert__From_u16__for_usize___from
312
313
static inline uint32_t
314
core_num__u8__count_ones(uint8_t x0)
315
0
{
316
0
#ifdef _MSC_VER
317
0
    return __popcnt(x0);
318
0
#else
319
0
    return __builtin_popcount(x0);
320
0
#endif
321
0
}
Unexecuted instantiation: kyber.c:core_num__u8__count_ones
Unexecuted instantiation: libcrux_mlkem768_portable.c:core_num__u8__count_ones
Unexecuted instantiation: libcrux_mlkem1024_portable.c:core_num__u8__count_ones
Unexecuted instantiation: libcrux_mlkem_portable.c:core_num__u8__count_ones
Unexecuted instantiation: libcrux_core.c:core_num__u8__count_ones
Unexecuted instantiation: libcrux_sha3_portable.c:core_num__u8__count_ones
322
323
static inline uint32_t
324
core_num__i32__count_ones(int32_t x0)
325
0
{
326
0
#ifdef _MSC_VER
327
0
    return __popcnt(x0);
328
0
#else
329
0
    return __builtin_popcount(x0);
330
0
#endif
331
0
}
Unexecuted instantiation: kyber.c:core_num__i32__count_ones
Unexecuted instantiation: libcrux_mlkem768_portable.c:core_num__i32__count_ones
Unexecuted instantiation: libcrux_mlkem1024_portable.c:core_num__i32__count_ones
Unexecuted instantiation: libcrux_mlkem_portable.c:core_num__i32__count_ones
Unexecuted instantiation: libcrux_core.c:core_num__i32__count_ones
Unexecuted instantiation: libcrux_sha3_portable.c:core_num__i32__count_ones
332
333
static inline size_t
334
core_cmp_impls___core__cmp__Ord_for_usize___min(size_t a,
335
                                                size_t b)
336
0
{
337
0
    if (a <= b)
338
0
        return a;
339
0
    else
340
0
        return b;
341
0
}
Unexecuted instantiation: kyber.c:core_cmp_impls___core__cmp__Ord_for_usize___min
Unexecuted instantiation: libcrux_mlkem768_portable.c:core_cmp_impls___core__cmp__Ord_for_usize___min
Unexecuted instantiation: libcrux_mlkem1024_portable.c:core_cmp_impls___core__cmp__Ord_for_usize___min
Unexecuted instantiation: libcrux_mlkem_portable.c:core_cmp_impls___core__cmp__Ord_for_usize___min
Unexecuted instantiation: libcrux_core.c:core_cmp_impls___core__cmp__Ord_for_usize___min
Unexecuted instantiation: libcrux_sha3_portable.c:core_cmp_impls___core__cmp__Ord_for_usize___min
342
343
// unsigned overflow wraparound semantics in C
344
static inline uint16_t
345
core_num__u16__wrapping_add(uint16_t x, uint16_t y)
346
212
{
347
212
    return x + y;
348
212
}
Unexecuted instantiation: kyber.c:core_num__u16__wrapping_add
Unexecuted instantiation: libcrux_mlkem768_portable.c:core_num__u16__wrapping_add
Unexecuted instantiation: libcrux_mlkem1024_portable.c:core_num__u16__wrapping_add
Unexecuted instantiation: libcrux_mlkem_portable.c:core_num__u16__wrapping_add
libcrux_core.c:core_num__u16__wrapping_add
Line
Count
Source
346
212
{
347
212
    return x + y;
348
212
}
Unexecuted instantiation: libcrux_sha3_portable.c:core_num__u16__wrapping_add
349
static inline uint8_t
350
core_num__u8__wrapping_sub(uint8_t x, uint8_t y)
351
106
{
352
106
    return x - y;
353
106
}
Unexecuted instantiation: kyber.c:core_num__u8__wrapping_sub
Unexecuted instantiation: libcrux_mlkem768_portable.c:core_num__u8__wrapping_sub
Unexecuted instantiation: libcrux_mlkem1024_portable.c:core_num__u8__wrapping_sub
Unexecuted instantiation: libcrux_mlkem_portable.c:core_num__u8__wrapping_sub
libcrux_core.c:core_num__u8__wrapping_sub
Line
Count
Source
351
106
{
352
106
    return x - y;
353
106
}
Unexecuted instantiation: libcrux_sha3_portable.c:core_num__u8__wrapping_sub
354
static inline uint64_t
355
core_num__u64__rotate_left(uint64_t x0, uint32_t x1)
356
453M
{
357
453M
    return (x0 << x1 | x0 >> (64 - x1));
358
453M
}
Unexecuted instantiation: kyber.c:core_num__u64__rotate_left
Unexecuted instantiation: libcrux_mlkem768_portable.c:core_num__u64__rotate_left
Unexecuted instantiation: libcrux_mlkem1024_portable.c:core_num__u64__rotate_left
Unexecuted instantiation: libcrux_mlkem_portable.c:core_num__u64__rotate_left
Unexecuted instantiation: libcrux_core.c:core_num__u64__rotate_left
libcrux_sha3_portable.c:core_num__u64__rotate_left
Line
Count
Source
356
453M
{
357
453M
    return (x0 << x1 | x0 >> (64 - x1));
358
453M
}
359
360
static inline void
361
core_ops_arith__i32__add_assign(int32_t *x0, int32_t *x1)
362
0
{
363
0
    *x0 = *x0 + *x1;
364
0
}
Unexecuted instantiation: kyber.c:core_ops_arith__i32__add_assign
Unexecuted instantiation: libcrux_mlkem768_portable.c:core_ops_arith__i32__add_assign
Unexecuted instantiation: libcrux_mlkem1024_portable.c:core_ops_arith__i32__add_assign
Unexecuted instantiation: libcrux_mlkem_portable.c:core_ops_arith__i32__add_assign
Unexecuted instantiation: libcrux_core.c:core_ops_arith__i32__add_assign
Unexecuted instantiation: libcrux_sha3_portable.c:core_ops_arith__i32__add_assign
365
366
static inline uint8_t
367
Eurydice_bitand_pv_u8(uint8_t *p, uint8_t v)
368
0
{
369
0
    return (*p) & v;
370
0
}
Unexecuted instantiation: kyber.c:Eurydice_bitand_pv_u8
Unexecuted instantiation: libcrux_mlkem768_portable.c:Eurydice_bitand_pv_u8
Unexecuted instantiation: libcrux_mlkem1024_portable.c:Eurydice_bitand_pv_u8
Unexecuted instantiation: libcrux_mlkem_portable.c:Eurydice_bitand_pv_u8
Unexecuted instantiation: libcrux_core.c:Eurydice_bitand_pv_u8
Unexecuted instantiation: libcrux_sha3_portable.c:Eurydice_bitand_pv_u8
371
static inline uint8_t
372
Eurydice_shr_pv_u8(uint8_t *p, int32_t v)
373
0
{
374
0
    return (*p) >> v;
375
0
}
Unexecuted instantiation: kyber.c:Eurydice_shr_pv_u8
Unexecuted instantiation: libcrux_mlkem768_portable.c:Eurydice_shr_pv_u8
Unexecuted instantiation: libcrux_mlkem1024_portable.c:Eurydice_shr_pv_u8
Unexecuted instantiation: libcrux_mlkem_portable.c:Eurydice_shr_pv_u8
Unexecuted instantiation: libcrux_core.c:Eurydice_shr_pv_u8
Unexecuted instantiation: libcrux_sha3_portable.c:Eurydice_shr_pv_u8
376
static inline uint32_t
377
Eurydice_min_u32(uint32_t x, uint32_t y)
378
0
{
379
0
    return x < y ? x : y;
380
0
}
Unexecuted instantiation: kyber.c:Eurydice_min_u32
Unexecuted instantiation: libcrux_mlkem768_portable.c:Eurydice_min_u32
Unexecuted instantiation: libcrux_mlkem1024_portable.c:Eurydice_min_u32
Unexecuted instantiation: libcrux_mlkem_portable.c:Eurydice_min_u32
Unexecuted instantiation: libcrux_core.c:Eurydice_min_u32
Unexecuted instantiation: libcrux_sha3_portable.c:Eurydice_min_u32
381
382
static inline uint8_t
383
core_ops_bit___core__ops__bit__BitAnd_u8__u8__for___a__u8___46__bitand(
384
    uint8_t *x0, uint8_t x1)
385
0
{
386
0
    return Eurydice_bitand_pv_u8(x0, x1);
387
0
}
Unexecuted instantiation: kyber.c:core_ops_bit___core__ops__bit__BitAnd_u8__u8__for___a__u8___46__bitand
Unexecuted instantiation: libcrux_mlkem768_portable.c:core_ops_bit___core__ops__bit__BitAnd_u8__u8__for___a__u8___46__bitand
Unexecuted instantiation: libcrux_mlkem1024_portable.c:core_ops_bit___core__ops__bit__BitAnd_u8__u8__for___a__u8___46__bitand
Unexecuted instantiation: libcrux_mlkem_portable.c:core_ops_bit___core__ops__bit__BitAnd_u8__u8__for___a__u8___46__bitand
Unexecuted instantiation: libcrux_core.c:core_ops_bit___core__ops__bit__BitAnd_u8__u8__for___a__u8___46__bitand
Unexecuted instantiation: libcrux_sha3_portable.c:core_ops_bit___core__ops__bit__BitAnd_u8__u8__for___a__u8___46__bitand
388
389
static inline uint8_t
390
core_ops_bit___core__ops__bit__Shr_i32__u8__for___a__u8___792__shr(uint8_t *x0,
391
                                                                   int32_t x1)
392
0
{
393
0
    return Eurydice_shr_pv_u8(x0, x1);
394
0
}
Unexecuted instantiation: kyber.c:core_ops_bit___core__ops__bit__Shr_i32__u8__for___a__u8___792__shr
Unexecuted instantiation: libcrux_mlkem768_portable.c:core_ops_bit___core__ops__bit__Shr_i32__u8__for___a__u8___792__shr
Unexecuted instantiation: libcrux_mlkem1024_portable.c:core_ops_bit___core__ops__bit__Shr_i32__u8__for___a__u8___792__shr
Unexecuted instantiation: libcrux_mlkem_portable.c:core_ops_bit___core__ops__bit__Shr_i32__u8__for___a__u8___792__shr
Unexecuted instantiation: libcrux_core.c:core_ops_bit___core__ops__bit__Shr_i32__u8__for___a__u8___792__shr
Unexecuted instantiation: libcrux_sha3_portable.c:core_ops_bit___core__ops__bit__Shr_i32__u8__for___a__u8___792__shr
395
396
#define core_num_nonzero_private_NonZeroUsizeInner size_t
397
static inline core_num_nonzero_private_NonZeroUsizeInner
398
core_num_nonzero_private___core__clone__Clone_for_core__num__nonzero__private__NonZeroUsizeInner__26__clone(
399
    core_num_nonzero_private_NonZeroUsizeInner *x0)
400
0
{
401
0
    return *x0;
402
0
}
Unexecuted instantiation: kyber.c:core_num_nonzero_private___core__clone__Clone_for_core__num__nonzero__private__NonZeroUsizeInner__26__clone
Unexecuted instantiation: libcrux_mlkem768_portable.c:core_num_nonzero_private___core__clone__Clone_for_core__num__nonzero__private__NonZeroUsizeInner__26__clone
Unexecuted instantiation: libcrux_mlkem1024_portable.c:core_num_nonzero_private___core__clone__Clone_for_core__num__nonzero__private__NonZeroUsizeInner__26__clone
Unexecuted instantiation: libcrux_mlkem_portable.c:core_num_nonzero_private___core__clone__Clone_for_core__num__nonzero__private__NonZeroUsizeInner__26__clone
Unexecuted instantiation: libcrux_core.c:core_num_nonzero_private___core__clone__Clone_for_core__num__nonzero__private__NonZeroUsizeInner__26__clone
Unexecuted instantiation: libcrux_sha3_portable.c:core_num_nonzero_private___core__clone__Clone_for_core__num__nonzero__private__NonZeroUsizeInner__26__clone
403
404
#if defined(__cplusplus) && !defined(KRML_CXX17_COMPAT)
405
}
406
#endif
407
408
// ITERATORS
409
410
#define Eurydice_range_iter_next(iter_ptr, t, ret_t)          \
411
    (((iter_ptr)->start >= (iter_ptr)->end)                   \
412
         ? (KRML_CLITERAL(ret_t){ EURYDICE_CFIELD(.tag =) 0,  \
413
                                  EURYDICE_CFIELD(.f0 =) 0 }) \
414
         : (KRML_CLITERAL(ret_t){ EURYDICE_CFIELD(.tag =) 1,  \
415
                                  EURYDICE_CFIELD(.f0 =)(iter_ptr)->start++ }))
416
417
#define core_iter_range___core__iter__traits__iterator__Iterator_A__for_core__ops__range__Range_A__TraitClause_0___6__next \
418
    Eurydice_range_iter_next
419
420
// See note in karamel/lib/Inlining.ml if you change this
421
#define Eurydice_into_iter(x, t, _ret_t, _) (x)
422
#define core_iter_traits_collect___core__iter__traits__collect__IntoIterator_Clause1_Item__I__for_I__1__into_iter \
423
    Eurydice_into_iter
424
425
typedef struct {
426
    Eurydice_slice slice;
427
    size_t chunk_size;
428
} Eurydice_chunks;
429
430
// Can't use macros Eurydice_slice_subslice_{to,from} because they require a
431
// type, and this static inline function cannot receive a type as an argument.
432
// Instead, we receive the element size and use it to peform manual offset
433
// computations rather than going through the macros.
434
static inline Eurydice_slice
435
chunk_next(Eurydice_chunks *chunks,
436
           size_t element_size)
437
0
{
438
0
    size_t chunk_size = chunks->slice.len >= chunks->chunk_size
439
0
                            ? chunks->chunk_size
440
0
                            : chunks->slice.len;
441
0
    Eurydice_slice curr_chunk;
442
0
    curr_chunk.ptr = chunks->slice.ptr;
443
0
    curr_chunk.len = chunk_size;
444
0
    chunks->slice.ptr = (char *)(chunks->slice.ptr) + chunk_size * element_size;
445
0
    chunks->slice.len = chunks->slice.len - chunk_size;
446
0
    return curr_chunk;
447
0
}
Unexecuted instantiation: kyber.c:chunk_next
Unexecuted instantiation: libcrux_mlkem768_portable.c:chunk_next
Unexecuted instantiation: libcrux_mlkem1024_portable.c:chunk_next
Unexecuted instantiation: libcrux_mlkem_portable.c:chunk_next
Unexecuted instantiation: libcrux_core.c:chunk_next
Unexecuted instantiation: libcrux_sha3_portable.c:chunk_next
448
449
// using it anyway??
450
#define Eurydice_slice_subslice3(s, start, end, t_ptr) \
451
17.6M
    EURYDICE_SLICE((t_ptr)s.ptr, (start), (end))
452
453
#define core_slice___Slice_T___chunks(slice_, sz_, t, _ret_t) \
454
    ((Eurydice_chunks){ .slice = slice_, .chunk_size = sz_ })
455
#define core_slice___Slice_T___chunks_exact(slice_, sz_, t, _ret_t)             \
456
    ((Eurydice_chunks){                                                         \
457
        .slice = { .ptr = slice_.ptr, .len = slice_.len - (slice_.len % sz_) }, \
458
        .chunk_size = sz_ })
459
#define core_slice_iter_Chunks Eurydice_chunks
460
#define core_slice_iter_ChunksExact Eurydice_chunks
461
#define Eurydice_chunks_next(iter, t, ret_t)                         \
462
    (((iter)->slice.len == 0) ? ((ret_t){ .tag = core_option_None }) \
463
                              : ((ret_t){ .tag = core_option_Some,   \
464
                                          .f0 = chunk_next(iter, sizeof(t)) }))
465
#define core_slice_iter___core__iter__traits__iterator__Iterator_for_core__slice__iter__Chunks__a__T___70__next \
466
    Eurydice_chunks_next
467
// This name changed on 20240627
468
#define core_slice_iter___core__iter__traits__iterator__Iterator_for_core__slice__iter__Chunks__a__T___71__next \
469
    Eurydice_chunks_next
470
#define core_slice_iter__core__slice__iter__ChunksExact__a__T__89__next( \
471
    iter, t, _ret_t)                                                     \
472
    core_slice_iter__core__slice__iter__Chunks__a__T__70__next(iter, t)
473
474
typedef struct {
475
    Eurydice_slice s;
476
    size_t index;
477
} Eurydice_slice_iterator;
478
479
#define core_slice___Slice_T___iter(x, t, _ret_t) \
480
    ((Eurydice_slice_iterator){ .s = x, .index = 0 })
481
#define core_slice_iter_Iter Eurydice_slice_iterator
482
#define core_slice_iter__core__slice__iter__Iter__a__T__181__next(iter, t, \
483
                                                                  ret_t)   \
484
    (((iter)->index == (iter)->s.len)                                      \
485
         ? (KRML_CLITERAL(ret_t){ .tag = core_option_None })               \
486
         : (KRML_CLITERAL(ret_t){                                          \
487
               .tag = core_option_Some,                                    \
488
               .f0 = ((iter)->index++,                                     \
489
                      &((t *)((iter)->s.ptr))[(iter)->index - 1]) }))
490
#define core_option__core__option__Option_T__TraitClause_0___is_some(X, _0, \
491
                                                                     _1)    \
492
    ((X)->tag == 1)
493
// STRINGS
494
495
typedef const char *Prims_string;
496
497
// MISC (UNTESTED)
498
499
typedef void *core_fmt_Formatter;
500
typedef void *core_fmt_Arguments;
501
typedef void *core_fmt_rt_Argument;
502
#define core_fmt_rt__core__fmt__rt__Argument__a__1__new_display(x1, x2, x3, \
503
                                                                x4)         \
504
    NULL
505
506
// BOXES
507
508
// Crimes.
509
static inline char *
510
malloc_and_init(size_t sz, char *init)
511
0
{
512
0
    char *ptr = (char *)malloc(sz);
513
0
    memcpy(ptr, init, sz);
514
0
    return ptr;
515
0
}
Unexecuted instantiation: kyber.c:malloc_and_init
Unexecuted instantiation: libcrux_mlkem768_portable.c:malloc_and_init
Unexecuted instantiation: libcrux_mlkem1024_portable.c:malloc_and_init
Unexecuted instantiation: libcrux_mlkem_portable.c:malloc_and_init
Unexecuted instantiation: libcrux_core.c:malloc_and_init
Unexecuted instantiation: libcrux_sha3_portable.c:malloc_and_init
516
517
#define Eurydice_box_new(init, t, t_dst) \
518
    ((t_dst)(malloc_and_init(sizeof(t), (char *)(&init))))
519
520
#define Eurydice_box_new_array(len, ptr, t, t_dst) \
521
    ((t_dst)(malloc_and_init(len * sizeof(t), (char *)(ptr))))
522
523
// VECTORS (ANCIENT, POSSIBLY UNTESTED)
524
525
/* For now these are passed by value -- three words. We could conceivably change
526
 * the representation to heap-allocate this struct and only pass around the
527
 * pointer (one word). */
528
typedef struct {
529
    void *ptr;
530
    size_t len;        /* the number of elements */
531
    size_t alloc_size; /* the size of the allocation, in number of BYTES */
532
} Eurydice_vec_s, *Eurydice_vec;
533
534
/* Here, we set everything to zero rather than use a non-standard GCC
535
 * statement-expression -- this suitably initializes ptr to NULL and len and
536
 * size to 0. */
537
#define EURYDICE_VEC_NEW(_) calloc(1, sizeof(Eurydice_vec_s))
538
#define EURYDICE_VEC_PUSH(v, x, t)                                              \
539
    do {                                                                        \
540
        /* Grow the vector if capacity has been reached. */                     \
541
        if (v->len == v->alloc_size / sizeof(t)) {                              \
542
            /* Assuming that this does not exceed SIZE_MAX, because code proven \
543
             * correct by Aeneas. Would this even happen in practice? */        \
544
            size_t new_size;                                                    \
545
            if (v->alloc_size == 0)                                             \
546
                new_size = 8 * sizeof(t);                                       \
547
            else if (v->alloc_size <= SIZE_MAX / 2)                             \
548
                /* TODO: discuss growth policy */                               \
549
                new_size = 2 * v->alloc_size;                                   \
550
            else                                                                \
551
                new_size = (SIZE_MAX / sizeof(t)) * sizeof(t);                  \
552
            v->ptr = realloc(v->ptr, new_size);                                 \
553
            v->alloc_size = new_size;                                           \
554
        }                                                                       \
555
        ((t *)v->ptr)[v->len] = x;                                              \
556
        v->len++;                                                               \
557
    } while (0)
558
559
#define EURYDICE_VEC_DROP(v, t) \
560
    do {                        \
561
        free(v->ptr);           \
562
        free(v);                \
563
    } while (0)
564
565
#define EURYDICE_VEC_INDEX(v, i, t) &((t *)v->ptr)[i]
566
#define EURYDICE_VEC_LEN(v, t) (v)->len
567
568
/* TODO: remove GCC-isms */
569
570
#define EURYDICE_REPLACE(ptr, new_v, t) \
571
    ({                                  \
572
        t old_v = *ptr;                 \
573
        *ptr = new_v;                   \
574
        old_v;                          \
575
    })