8
8
#include <stdlib.h>
9
9
#include <string.h>
10
10
#include "../mlkem/common.h"
11
- #include "../mlkem/mlkem_native .h"
11
+ #include "../mlkem/kem .h"
12
12
#include "../mlkem/randombytes.h"
13
13
#include "hal.h"
14
14
15
+ #define CRYPTO_PUBLICKEYBYTES MLKEM_INDCCA_PUBLICKEYBYTES
16
+ #define CRYPTO_SECRETKEYBYTES MLKEM_INDCCA_SECRETKEYBYTES
17
+ #define CRYPTO_CIPHERTEXTBYTES MLKEM_INDCCA_CIPHERTEXTBYTES
18
+ #define CRYPTO_BYTES MLKEM_SYMBYTES
19
+
15
20
#define NWARMUP 50
16
21
#define NITERATIONS 300
17
22
#define NTESTS 500
@@ -35,15 +40,15 @@ static int cmp_uint64_t(const void *a, const void *b)
35
40
36
41
static void print_median (const char * txt , uint64_t cyc [NTESTS ])
37
42
{
38
- printf ("%10s cycles = %" PRIu64 "\n" , txt , cyc [NTESTS >> 1 ] / NITERATIONS );
43
+ printf ("%14s cycles = %" PRIu64 "\n" , txt , cyc [NTESTS >> 1 ] / NITERATIONS );
39
44
}
40
45
41
46
static int percentiles [] = {1 , 10 , 20 , 30 , 40 , 50 , 60 , 70 , 80 , 90 , 99 };
42
47
43
48
static void print_percentile_legend (void )
44
49
{
45
50
unsigned i ;
46
- printf ("%21s " , "percentile" );
51
+ printf ("%25s " , "percentile" );
47
52
for (i = 0 ; i < sizeof (percentiles ) / sizeof (percentiles [0 ]); i ++ )
48
53
{
49
54
printf ("%7d" , percentiles [i ]);
@@ -54,7 +59,7 @@ static void print_percentile_legend(void)
54
59
static void print_percentiles (const char * txt , uint64_t cyc [NTESTS ])
55
60
{
56
61
unsigned i ;
57
- printf ("%10s percentiles:" , txt );
62
+ printf ("%14s percentiles:" , txt );
58
63
for (i = 0 ; i < sizeof (percentiles ) / sizeof (percentiles [0 ]); i ++ )
59
64
{
60
65
printf ("%7" PRIu64 , (cyc )[NTESTS * percentiles [i ] / 100 ] / NITERATIONS );
@@ -72,6 +77,19 @@ static int bench(void)
72
77
unsigned char kg_rand [2 * CRYPTO_BYTES ], enc_rand [CRYPTO_BYTES ];
73
78
uint64_t cycles_kg [NTESTS ], cycles_enc [NTESTS ], cycles_dec [NTESTS ];
74
79
80
+
81
+ mlk_public_key pks ;
82
+ mlk_secret_key sks ;
83
+ uint64_t cycles_kg_struct [NTESTS ];
84
+ uint64_t cycles_pk_marshal [NTESTS ];
85
+ uint64_t cycles_sk_marshal [NTESTS ];
86
+
87
+ uint64_t cycles_pk_parse [NTESTS ];
88
+ uint64_t cycles_enc_struct [NTESTS ];
89
+
90
+ uint64_t cycles_sk_parse [NTESTS ];
91
+ uint64_t cycles_dec_struct [NTESTS ];
92
+
75
93
unsigned i , j ;
76
94
uint64_t t0 , t1 ;
77
95
@@ -125,16 +143,140 @@ static int bench(void)
125
143
126
144
CHECK (ret == 0 );
127
145
CHECK (memcmp (key_a , key_b , CRYPTO_BYTES ) == 0 );
146
+
147
+
148
+ /* Key-pair generation */
149
+ for (j = 0 ; j < NWARMUP ; j ++ )
150
+ {
151
+ ret |= crypto_kem_keypair_derand_struct (& pks , & sks , kg_rand );
152
+ }
153
+
154
+ t0 = get_cyclecounter ();
155
+ for (j = 0 ; j < NITERATIONS ; j ++ )
156
+ {
157
+ ret |= crypto_kem_keypair_derand_struct (& pks , & sks , kg_rand );
158
+ }
159
+ t1 = get_cyclecounter ();
160
+ cycles_kg_struct [i ] = t1 - t0 ;
161
+
162
+
163
+ /* Marshal public key */
164
+ for (j = 0 ; j < NWARMUP ; j ++ )
165
+ {
166
+ crypto_kem_marshal_pk (pk , & pks );
167
+ }
168
+
169
+ t0 = get_cyclecounter ();
170
+ for (j = 0 ; j < NITERATIONS ; j ++ )
171
+ {
172
+ crypto_kem_marshal_pk (pk , & pks );
173
+ }
174
+ t1 = get_cyclecounter ();
175
+ cycles_pk_marshal [i ] = t1 - t0 ;
176
+
177
+ /* Marshal secret key */
178
+ for (j = 0 ; j < NWARMUP ; j ++ )
179
+ {
180
+ crypto_kem_marshal_sk (sk , & sks );
181
+ }
182
+
183
+ t0 = get_cyclecounter ();
184
+ for (j = 0 ; j < NITERATIONS ; j ++ )
185
+ {
186
+ crypto_kem_marshal_sk (sk , & sks );
187
+ }
188
+ t1 = get_cyclecounter ();
189
+ cycles_sk_marshal [i ] = t1 - t0 ;
190
+
191
+
192
+ /* pk parse */
193
+ for (j = 0 ; j < NWARMUP ; j ++ )
194
+ {
195
+ ret |= crypto_kem_parse_pk (& pks , pk );
196
+ }
197
+
198
+ t0 = get_cyclecounter ();
199
+ for (j = 0 ; j < NITERATIONS ; j ++ )
200
+ {
201
+ ret |= crypto_kem_parse_pk (& pks , pk );
202
+ }
203
+ t1 = get_cyclecounter ();
204
+ cycles_pk_parse [i ] = t1 - t0 ;
205
+
206
+
207
+ /* encaps */
208
+ for (j = 0 ; j < NWARMUP ; j ++ )
209
+ {
210
+ ret |= crypto_kem_enc_derand_struct (ct , key_a , & pks , enc_rand );
211
+ }
212
+
213
+ t0 = get_cyclecounter ();
214
+ for (j = 0 ; j < NITERATIONS ; j ++ )
215
+ {
216
+ ret |= crypto_kem_enc_derand_struct (ct , key_a , & pks , enc_rand );
217
+ }
218
+ t1 = get_cyclecounter ();
219
+ cycles_enc_struct [i ] = t1 - t0 ;
220
+
221
+
222
+ /* sk prase */
223
+ for (j = 0 ; j < NWARMUP ; j ++ )
224
+ {
225
+ ret |= crypto_kem_parse_sk (& sks , sk );
226
+ }
227
+
228
+ t0 = get_cyclecounter ();
229
+ for (j = 0 ; j < NITERATIONS ; j ++ )
230
+ {
231
+ ret |= crypto_kem_parse_sk (& sks , sk );
232
+ }
233
+ t1 = get_cyclecounter ();
234
+ cycles_sk_parse [i ] = t1 - t0 ;
235
+
236
+
237
+ /* decaps */
238
+ for (j = 0 ; j < NWARMUP ; j ++ )
239
+ {
240
+ ret |= crypto_kem_dec_struct (key_b , ct , & sks );
241
+ }
242
+
243
+ t0 = get_cyclecounter ();
244
+ for (j = 0 ; j < NITERATIONS ; j ++ )
245
+ {
246
+ ret |= crypto_kem_dec_struct (key_b , ct , & sks );
247
+ }
248
+ t1 = get_cyclecounter ();
249
+ cycles_dec_struct [i ] = t1 - t0 ;
250
+
251
+ CHECK (ret == 0 );
252
+ CHECK (memcmp (key_a , key_b , CRYPTO_BYTES ) == 0 );
128
253
}
129
254
130
255
qsort (cycles_kg , NTESTS , sizeof (uint64_t ), cmp_uint64_t );
131
256
qsort (cycles_enc , NTESTS , sizeof (uint64_t ), cmp_uint64_t );
132
257
qsort (cycles_dec , NTESTS , sizeof (uint64_t ), cmp_uint64_t );
133
258
259
+ qsort (cycles_kg_struct , NTESTS , sizeof (uint64_t ), cmp_uint64_t );
260
+ qsort (cycles_pk_marshal , NTESTS , sizeof (uint64_t ), cmp_uint64_t );
261
+ qsort (cycles_sk_marshal , NTESTS , sizeof (uint64_t ), cmp_uint64_t );
262
+ qsort (cycles_pk_parse , NTESTS , sizeof (uint64_t ), cmp_uint64_t );
263
+ qsort (cycles_enc_struct , NTESTS , sizeof (uint64_t ), cmp_uint64_t );
264
+ qsort (cycles_sk_parse , NTESTS , sizeof (uint64_t ), cmp_uint64_t );
265
+ qsort (cycles_dec_struct , NTESTS , sizeof (uint64_t ), cmp_uint64_t );
266
+
267
+
134
268
print_median ("keypair" , cycles_kg );
135
269
print_median ("encaps" , cycles_enc );
136
270
print_median ("decaps" , cycles_dec );
137
271
272
+ print_median ("keypair_struct" , cycles_kg_struct );
273
+ print_median ("marshal_pk" , cycles_pk_marshal );
274
+ print_median ("marshal_sk" , cycles_sk_marshal );
275
+ print_median ("parse_pk" , cycles_pk_parse );
276
+ print_median ("encaps_struct" , cycles_enc_struct );
277
+ print_median ("parse_sk" , cycles_sk_parse );
278
+ print_median ("decaps_struct" , cycles_dec_struct );
279
+
138
280
printf ("\n" );
139
281
140
282
print_percentile_legend ();
@@ -143,6 +285,14 @@ static int bench(void)
143
285
print_percentiles ("encaps" , cycles_enc );
144
286
print_percentiles ("decaps" , cycles_dec );
145
287
288
+ print_percentiles ("keypair_struct" , cycles_kg_struct );
289
+ print_percentiles ("marshal_pk" , cycles_pk_marshal );
290
+ print_percentiles ("marshal_sk" , cycles_sk_marshal );
291
+ print_percentiles ("parse_pk" , cycles_pk_parse );
292
+ print_percentiles ("encaps_struct" , cycles_enc_struct );
293
+ print_percentiles ("parse_sk" , cycles_sk_parse );
294
+ print_percentiles ("decaps_struct" , cycles_dec_struct );
295
+
146
296
return 0 ;
147
297
}
148
298
0 commit comments