1*0c814320Stb /*	$OpenBSD: mlkem_tests_util.c,v 1.5 2024/12/26 00:04:24 tb Exp $ */
2d4ed7533Stb /*
38889493eStb  * Copyright (c) 2024 Google Inc.
48889493eStb  * Copyright (c) 2024 Bob Beck <beck@obtuse.com>
58889493eStb  * Copyright (c) 2024 Theo Buehler <tb@openbsd.org>
675c083a0Sbeck  *
775c083a0Sbeck  * Permission to use, copy, modify, and/or distribute this software for any
875c083a0Sbeck  * purpose with or without fee is hereby granted, provided that the above
975c083a0Sbeck  * copyright notice and this permission notice appear in all copies.
1075c083a0Sbeck  *
1175c083a0Sbeck  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
1275c083a0Sbeck  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
1375c083a0Sbeck  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
1475c083a0Sbeck  * SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
1575c083a0Sbeck  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION
1675c083a0Sbeck  * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
17d4ed7533Stb  * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
18d4ed7533Stb  */
1975c083a0Sbeck 
2075c083a0Sbeck #include <err.h>
21d4ed7533Stb #include <stdint.h>
2275c083a0Sbeck #include <stdio.h>
2375c083a0Sbeck #include <string.h>
2475c083a0Sbeck 
258889493eStb #include "bytestring.h"
268889493eStb #include "mlkem.h"
278889493eStb 
288889493eStb #include "mlkem_internal.h"
298889493eStb 
3075c083a0Sbeck #include "mlkem_tests_util.h"
3175c083a0Sbeck 
328889493eStb static void
hexdump(const uint8_t * buf,size_t len,const uint8_t * compare)3375c083a0Sbeck hexdump(const uint8_t *buf, size_t len, const uint8_t *compare)
3475c083a0Sbeck {
3575c083a0Sbeck 	const char *mark = "";
3675c083a0Sbeck 	size_t i;
3775c083a0Sbeck 
3875c083a0Sbeck 	for (i = 1; i <= len; i++) {
3975c083a0Sbeck 		if (compare != NULL)
4075c083a0Sbeck 			mark = (buf[i - 1] != compare[i - 1]) ? "*" : " ";
4175c083a0Sbeck 		fprintf(stderr, " %s0x%02hhx,%s", mark, buf[i - 1],
4275c083a0Sbeck 		    i % 8 && i != len ? "" : "\n");
4375c083a0Sbeck 	}
4475c083a0Sbeck 	fprintf(stderr, "\n");
4575c083a0Sbeck }
4675c083a0Sbeck 
4775c083a0Sbeck int
compare_data(const uint8_t * want,const uint8_t * got,size_t len,const char * msg)48*0c814320Stb compare_data(const uint8_t *want, const uint8_t *got, size_t len, const char *msg)
4975c083a0Sbeck {
508889493eStb 	if (memcmp(want, got, len) == 0)
518889493eStb 		return 0;
5275c083a0Sbeck 
53*0c814320Stb 	warnx("FAIL: %s differs", msg);
548889493eStb 	fprintf(stderr, "want:\n");
558889493eStb 	hexdump(want, len, got);
568889493eStb 	fprintf(stderr, "got:\n");
578889493eStb 	hexdump(got, len, want);
588889493eStb 	fprintf(stderr, "\n");
5975c083a0Sbeck 
6075c083a0Sbeck 	return 1;
6175c083a0Sbeck }
6275c083a0Sbeck 
638889493eStb int
mlkem768_encode_private_key(const void * private_key,uint8_t ** out_buf,size_t * out_len)64*0c814320Stb mlkem768_encode_private_key(const void *private_key, uint8_t **out_buf,
65*0c814320Stb     size_t *out_len)
6675c083a0Sbeck {
67*0c814320Stb 	CBB cbb;
68*0c814320Stb 	int ret = 0;
698889493eStb 
70*0c814320Stb 	if (!CBB_init(&cbb, MLKEM768_PUBLIC_KEY_BYTES))
71*0c814320Stb 		goto err;
72*0c814320Stb 	if (!MLKEM768_marshal_private_key(&cbb, private_key))
73*0c814320Stb 		goto err;
74*0c814320Stb 	if (!CBB_finish(&cbb, out_buf, out_len))
75*0c814320Stb 		goto err;
76*0c814320Stb 
77*0c814320Stb 	ret = 1;
78*0c814320Stb 
79*0c814320Stb  err:
80*0c814320Stb 	CBB_cleanup(&cbb);
81*0c814320Stb 
82*0c814320Stb 	return ret;
838889493eStb }
848889493eStb 
85*0c814320Stb int
mlkem768_encode_public_key(const void * public_key,uint8_t ** out_buf,size_t * out_len)86*0c814320Stb mlkem768_encode_public_key(const void *public_key, uint8_t **out_buf,
87*0c814320Stb     size_t *out_len)
888889493eStb {
89*0c814320Stb 	CBB cbb;
90*0c814320Stb 	int ret = 0;
918889493eStb 
92*0c814320Stb 	if (!CBB_init(&cbb, MLKEM768_PUBLIC_KEY_BYTES))
93*0c814320Stb 		goto err;
94*0c814320Stb 	if (!MLKEM768_marshal_public_key(&cbb, public_key))
95*0c814320Stb 		goto err;
96*0c814320Stb 	if (!CBB_finish(&cbb, out_buf, out_len))
97*0c814320Stb 		goto err;
988889493eStb 
99*0c814320Stb 	ret = 1;
100*0c814320Stb 
101*0c814320Stb  err:
102*0c814320Stb 	CBB_cleanup(&cbb);
103*0c814320Stb 
104*0c814320Stb 	return ret;
1058889493eStb }
1068889493eStb 
107*0c814320Stb int
mlkem1024_encode_private_key(const void * private_key,uint8_t ** out_buf,size_t * out_len)108*0c814320Stb mlkem1024_encode_private_key(const void *private_key, uint8_t **out_buf,
109*0c814320Stb     size_t *out_len)
110*0c814320Stb {
111*0c814320Stb 	CBB cbb;
112*0c814320Stb 	int ret = 0;
113*0c814320Stb 
114*0c814320Stb 	if (!CBB_init(&cbb, MLKEM1024_PUBLIC_KEY_BYTES))
115*0c814320Stb 		goto err;
116*0c814320Stb 	if (!MLKEM1024_marshal_private_key(&cbb, private_key))
117*0c814320Stb 		goto err;
118*0c814320Stb 	if (!CBB_finish(&cbb, out_buf, out_len))
119*0c814320Stb 		goto err;
120*0c814320Stb 
121*0c814320Stb 	ret = 1;
122*0c814320Stb 
123*0c814320Stb  err:
124*0c814320Stb 	CBB_cleanup(&cbb);
125*0c814320Stb 
126*0c814320Stb 	return ret;
127*0c814320Stb }
128*0c814320Stb 
129*0c814320Stb int
mlkem1024_encode_public_key(const void * public_key,uint8_t ** out_buf,size_t * out_len)130*0c814320Stb mlkem1024_encode_public_key(const void *public_key, uint8_t **out_buf,
131*0c814320Stb     size_t *out_len)
132*0c814320Stb {
133*0c814320Stb 	CBB cbb;
134*0c814320Stb 	int ret = 0;
135*0c814320Stb 
136*0c814320Stb 	if (!CBB_init(&cbb, MLKEM1024_PUBLIC_KEY_BYTES))
137*0c814320Stb 		goto err;
138*0c814320Stb 	if (!MLKEM1024_marshal_public_key(&cbb, public_key))
139*0c814320Stb 		goto err;
140*0c814320Stb 	if (!CBB_finish(&cbb, out_buf, out_len))
141*0c814320Stb 		goto err;
142*0c814320Stb 
143*0c814320Stb 	ret = 1;
144*0c814320Stb 
145*0c814320Stb  err:
146*0c814320Stb 	CBB_cleanup(&cbb);
147*0c814320Stb 
148*0c814320Stb 	return ret;
149*0c814320Stb }
150*0c814320Stb 
151*0c814320Stb int
mlkem768_decap(uint8_t out_shared_secret[MLKEM_SHARED_SECRET_BYTES],const uint8_t * ciphertext,size_t ciphertext_len,const void * private_key)152*0c814320Stb mlkem768_decap(uint8_t out_shared_secret[MLKEM_SHARED_SECRET_BYTES],
153*0c814320Stb     const uint8_t *ciphertext, size_t ciphertext_len, const void *private_key)
154*0c814320Stb {
155*0c814320Stb 	return MLKEM768_decap(out_shared_secret, ciphertext, ciphertext_len,
156*0c814320Stb 	    private_key);
1578889493eStb }
1588889493eStb 
1598889493eStb void
mlkem768_encap(uint8_t * out_ciphertext,uint8_t out_shared_secret[MLKEM_SHARED_SECRET_BYTES],const void * public_key)160*0c814320Stb mlkem768_encap(uint8_t *out_ciphertext,
161*0c814320Stb     uint8_t out_shared_secret[MLKEM_SHARED_SECRET_BYTES],
162*0c814320Stb     const void *public_key)
1638889493eStb {
164*0c814320Stb 	MLKEM768_encap(out_ciphertext, out_shared_secret, public_key);
1658889493eStb }
166*0c814320Stb 
167*0c814320Stb void
mlkem768_encap_external_entropy(uint8_t * out_ciphertext,uint8_t out_shared_secret[MLKEM_SHARED_SECRET_BYTES],const void * public_key,const uint8_t entropy[MLKEM_ENCAP_ENTROPY])168*0c814320Stb mlkem768_encap_external_entropy(uint8_t *out_ciphertext,
169*0c814320Stb     uint8_t out_shared_secret[MLKEM_SHARED_SECRET_BYTES],
170*0c814320Stb     const void *public_key, const uint8_t entropy[MLKEM_ENCAP_ENTROPY])
171*0c814320Stb {
172*0c814320Stb 	MLKEM768_encap_external_entropy(out_ciphertext, out_shared_secret,
173*0c814320Stb 	    public_key, entropy);
174*0c814320Stb }
175*0c814320Stb 
176*0c814320Stb void
mlkem768_generate_key(uint8_t * out_encoded_public_key,uint8_t optional_out_seed[MLKEM_SEED_BYTES],void * out_private_key)177*0c814320Stb mlkem768_generate_key(uint8_t *out_encoded_public_key,
178*0c814320Stb     uint8_t optional_out_seed[MLKEM_SEED_BYTES], void *out_private_key)
179*0c814320Stb {
180*0c814320Stb 	MLKEM768_generate_key(out_encoded_public_key, optional_out_seed,
181*0c814320Stb 	    out_private_key);
182*0c814320Stb }
183*0c814320Stb 
184*0c814320Stb void
mlkem768_generate_key_external_entropy(uint8_t * out_encoded_public_key,void * out_private_key,const uint8_t entropy[MLKEM_SEED_BYTES])185*0c814320Stb mlkem768_generate_key_external_entropy(uint8_t *out_encoded_public_key,
186*0c814320Stb     void *out_private_key, const uint8_t entropy[MLKEM_SEED_BYTES])
187*0c814320Stb {
188*0c814320Stb 	MLKEM768_generate_key_external_entropy(out_encoded_public_key,
189*0c814320Stb 	    out_private_key, entropy);
1908889493eStb }
1918889493eStb 
1928889493eStb int
mlkem768_parse_private_key(void * out_private_key,CBS * private_key_cbs)193*0c814320Stb mlkem768_parse_private_key(void *out_private_key, CBS *private_key_cbs)
1948889493eStb {
195*0c814320Stb 	return MLKEM768_parse_private_key(out_private_key, private_key_cbs);
1968889493eStb }
1978889493eStb 
1988889493eStb int
mlkem768_parse_public_key(void * out_public_key,CBS * public_key_cbs)199*0c814320Stb mlkem768_parse_public_key(void *out_public_key, CBS *public_key_cbs)
2008889493eStb {
201*0c814320Stb 	return MLKEM768_parse_public_key(out_public_key, public_key_cbs);
202*0c814320Stb }
2038889493eStb 
204*0c814320Stb void
mlkem768_public_from_private(void * out_public_key,const void * private_key)205*0c814320Stb mlkem768_public_from_private(void *out_public_key, const void *private_key)
206*0c814320Stb {
207*0c814320Stb 	MLKEM768_public_from_private(out_public_key, private_key);
2088889493eStb }
2098889493eStb 
2108889493eStb int
mlkem1024_decap(uint8_t out_shared_secret[MLKEM_SHARED_SECRET_BYTES],const uint8_t * ciphertext,size_t ciphertext_len,const void * private_key)211*0c814320Stb mlkem1024_decap(uint8_t out_shared_secret[MLKEM_SHARED_SECRET_BYTES],
212*0c814320Stb     const uint8_t *ciphertext, size_t ciphertext_len, const void *private_key)
2138889493eStb {
214*0c814320Stb 	return MLKEM1024_decap(out_shared_secret, ciphertext, ciphertext_len,
215*0c814320Stb 	    private_key);
216*0c814320Stb }
2178889493eStb 
218*0c814320Stb void
mlkem1024_encap(uint8_t * out_ciphertext,uint8_t out_shared_secret[MLKEM_SHARED_SECRET_BYTES],const void * public_key)219*0c814320Stb mlkem1024_encap(uint8_t *out_ciphertext,
220*0c814320Stb     uint8_t out_shared_secret[MLKEM_SHARED_SECRET_BYTES],
221*0c814320Stb     const void *public_key)
222*0c814320Stb {
223*0c814320Stb 	MLKEM1024_encap(out_ciphertext, out_shared_secret, public_key);
224*0c814320Stb }
2258889493eStb 
226*0c814320Stb void
mlkem1024_encap_external_entropy(uint8_t * out_ciphertext,uint8_t out_shared_secret[MLKEM_SHARED_SECRET_BYTES],const void * public_key,const uint8_t entropy[MLKEM_ENCAP_ENTROPY])227*0c814320Stb mlkem1024_encap_external_entropy(uint8_t *out_ciphertext,
228*0c814320Stb     uint8_t out_shared_secret[MLKEM_SHARED_SECRET_BYTES],
229*0c814320Stb     const void *public_key, const uint8_t entropy[MLKEM_ENCAP_ENTROPY])
230*0c814320Stb {
231*0c814320Stb 	MLKEM1024_encap_external_entropy(out_ciphertext, out_shared_secret,
232*0c814320Stb 	    public_key, entropy);
233*0c814320Stb }
2348889493eStb 
235*0c814320Stb void
mlkem1024_generate_key(uint8_t * out_encoded_public_key,uint8_t optional_out_seed[MLKEM_SEED_BYTES],void * out_private_key)236*0c814320Stb mlkem1024_generate_key(uint8_t *out_encoded_public_key,
237*0c814320Stb     uint8_t optional_out_seed[MLKEM_SEED_BYTES], void *out_private_key)
238*0c814320Stb {
239*0c814320Stb 	MLKEM1024_generate_key(out_encoded_public_key, optional_out_seed,
240*0c814320Stb 	    out_private_key);
241*0c814320Stb }
2428889493eStb 
243*0c814320Stb void
mlkem1024_generate_key_external_entropy(uint8_t * out_encoded_public_key,void * out_private_key,const uint8_t entropy[MLKEM_SEED_BYTES])244*0c814320Stb mlkem1024_generate_key_external_entropy(uint8_t *out_encoded_public_key,
245*0c814320Stb     void *out_private_key, const uint8_t entropy[MLKEM_SEED_BYTES])
246*0c814320Stb {
247*0c814320Stb 	MLKEM1024_generate_key_external_entropy(out_encoded_public_key,
248*0c814320Stb 	    out_private_key, entropy);
2498889493eStb }
2508889493eStb 
2518889493eStb int
mlkem1024_parse_private_key(void * out_private_key,CBS * private_key_cbs)252*0c814320Stb mlkem1024_parse_private_key(void *out_private_key, CBS *private_key_cbs)
2538889493eStb {
254*0c814320Stb 	return MLKEM1024_parse_private_key(out_private_key, private_key_cbs);
255*0c814320Stb }
2568889493eStb 
257*0c814320Stb void
mlkem1024_public_from_private(void * out_public_key,const void * private_key)258*0c814320Stb mlkem1024_public_from_private(void *out_public_key, const void *private_key)
259*0c814320Stb {
260*0c814320Stb 	MLKEM1024_public_from_private(out_public_key, private_key);
2618889493eStb }
2628889493eStb 
2638889493eStb int
mlkem1024_parse_public_key(void * out_public_key,CBS * public_key_cbs)264*0c814320Stb mlkem1024_parse_public_key(void *out_public_key, CBS *public_key_cbs)
2658889493eStb {
266*0c814320Stb 	return MLKEM1024_parse_public_key(out_public_key, public_key_cbs);
26775c083a0Sbeck }
268