Embedded SDK
Embedded SDK
Loading...
Searching...
No Matches
lcx_mlkem.h
Go to the documentation of this file.
1/*****************************************************************************
2 * (c) 2026 Ledger SAS.
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 *****************************************************************************/
24#ifndef MLKEM_H
25#define MLKEM_H
26
27#include <stddef.h>
28#include <stdint.h>
29#include "cx_errors.h"
30
35#define MLKEM_N 256U
36#define MLKEM_Q 3329
37#define MLKEM_Q_HALF 1665
38#define MLKEM_SYMBYTES 32U
39#define MLKEM_SSBYTES 32U
40#define MLKEM_POLYBYTES 384U
42#define MLKEM_POLYCOMPRESSEDBYTES_D10 320U
43#define MLKEM_POLYCOMPRESSEDBYTES_D11 352U
45#define MLKEM_NUM_PARAM_SETS 3U
53#define MLKEM512_K 2U
54#define MLKEM512_ETA1 3U
55#define MLKEM512_ETA2 2U
56#define MLKEM512_DU 10U
57#define MLKEM512_DV 4U
59#define MLKEM512_POLYVECBYTES \
60 (MLKEM512_K * MLKEM_POLYBYTES)
61#define MLKEM512_POLYCOMPRESSEDBYTES_DV 128U
62#define MLKEM512_POLYCOMPRESSEDBYTES_DU 320U
63#define MLKEM512_POLYVECCOMPRESSEDBYTES \
64 (MLKEM512_K * MLKEM512_POLYCOMPRESSEDBYTES_DU)
66#define MLKEM512_INDCPA_PUBLICKEYBYTES \
67 (MLKEM512_POLYVECBYTES + MLKEM_SYMBYTES)
68#define MLKEM512_INDCPA_SECRETKEYBYTES \
69 MLKEM512_POLYVECBYTES
71#define MLKEM512_INDCPA_BYTES \
72 (MLKEM512_POLYVECCOMPRESSEDBYTES \
73 + MLKEM512_POLYCOMPRESSEDBYTES_DV)
75#define MLKEM512_PUBLICKEYBYTES \
76 MLKEM512_INDCPA_PUBLICKEYBYTES
77#define MLKEM512_SECRETKEYBYTES \
78 (MLKEM512_INDCPA_SECRETKEYBYTES + MLKEM512_INDCPA_PUBLICKEYBYTES \
79 + (2U * MLKEM_SYMBYTES))
80#define MLKEM512_CIPHERTEXTBYTES MLKEM512_INDCPA_BYTES
88#define MLKEM768_K 3U
89#define MLKEM768_ETA1 2U
90#define MLKEM768_ETA2 2U
91#define MLKEM768_DU 10U
92#define MLKEM768_DV 4U
94#define MLKEM768_POLYVECBYTES \
95 (MLKEM768_K * MLKEM_POLYBYTES)
96#define MLKEM768_POLYCOMPRESSEDBYTES_DV 128U
97#define MLKEM768_POLYCOMPRESSEDBYTES_DU 320U
98#define MLKEM768_POLYVECCOMPRESSEDBYTES \
99 (MLKEM768_K * MLKEM768_POLYCOMPRESSEDBYTES_DU)
101#define MLKEM768_INDCPA_PUBLICKEYBYTES \
102 (MLKEM768_POLYVECBYTES + MLKEM_SYMBYTES)
103#define MLKEM768_INDCPA_SECRETKEYBYTES \
104 MLKEM768_POLYVECBYTES
106#define MLKEM768_INDCPA_BYTES \
107 (MLKEM768_POLYVECCOMPRESSEDBYTES \
108 + MLKEM768_POLYCOMPRESSEDBYTES_DV)
110#define MLKEM768_PUBLICKEYBYTES \
111 MLKEM768_INDCPA_PUBLICKEYBYTES
112#define MLKEM768_SECRETKEYBYTES \
113 (MLKEM768_INDCPA_SECRETKEYBYTES + MLKEM768_INDCPA_PUBLICKEYBYTES \
114 + (2U * MLKEM_SYMBYTES))
115#define MLKEM768_CIPHERTEXTBYTES MLKEM768_INDCPA_BYTES
123#define MLKEM1024_K 4U
124#define MLKEM1024_ETA1 2U
125#define MLKEM1024_ETA2 2U
126#define MLKEM1024_DU 11U
127#define MLKEM1024_DV 5U
129#define MLKEM1024_POLYVECBYTES \
130 (MLKEM1024_K * MLKEM_POLYBYTES)
131#define MLKEM1024_POLYCOMPRESSEDBYTES_DV 160U
132#define MLKEM1024_POLYCOMPRESSEDBYTES_DU 352U
133#define MLKEM1024_POLYVECCOMPRESSEDBYTES \
134 (MLKEM1024_K * MLKEM1024_POLYCOMPRESSEDBYTES_DU)
136#define MLKEM1024_INDCPA_PUBLICKEYBYTES \
137 (MLKEM1024_POLYVECBYTES + MLKEM_SYMBYTES)
138#define MLKEM1024_INDCPA_SECRETKEYBYTES \
139 MLKEM1024_POLYVECBYTES
140#define MLKEM1024_INDCPA_BYTES \
141 (MLKEM1024_POLYVECCOMPRESSEDBYTES \
142 + MLKEM1024_POLYCOMPRESSEDBYTES_DV)
144#define MLKEM1024_PUBLICKEYBYTES \
145 MLKEM1024_INDCPA_PUBLICKEYBYTES
146#define MLKEM1024_SECRETKEYBYTES \
147 (MLKEM1024_INDCPA_SECRETKEYBYTES + MLKEM1024_INDCPA_PUBLICKEYBYTES \
148 + (2U * MLKEM_SYMBYTES))
149#define MLKEM1024_CIPHERTEXTBYTES \
150 MLKEM1024_INDCPA_BYTES
154#define MLKEM_MAX_K MLKEM1024_K
164
168typedef struct MLKEM_param_info_s {
169 uint8_t k;
170 uint8_t eta1;
171 uint8_t eta2;
172 uint8_t du;
173 uint8_t dv;
174 uint16_t polyvec_bytes;
180 uint16_t pk_bytes;
181 uint16_t sk_bytes;
182 uint16_t ct_bytes;
184
189
203cx_err_t MLKEM_crypto_kem_keypair(uint8_t *pk,
204 size_t pk_len,
205 uint8_t *sk,
206 size_t sk_len,
207 MLKEM_param_t param);
208
225cx_err_t MLKEM_crypto_kem_enc(uint8_t *ct,
226 size_t ct_len,
227 uint8_t *ss,
228 size_t ss_len,
229 const uint8_t *pk,
230 size_t pk_len,
231 MLKEM_param_t param);
232
248cx_err_t MLKEM_crypto_kem_dec(uint8_t *ss,
249 size_t ss_len,
250 const uint8_t *ct,
251 size_t ct_len,
252 const uint8_t *sk,
253 size_t sk_len,
254 MLKEM_param_t param);
255
256#endif // MLKEM_H
#define MLKEM_NUM_PARAM_SETS
Definition lcx_mlkem.h:45
struct MLKEM_param_info_s MLKEM_param_info_t
ML-KEM parameter set descriptor holding all derived sizes.
cx_err_t MLKEM_crypto_kem_enc(uint8_t *ct, size_t ct_len, uint8_t *ss, size_t ss_len, const uint8_t *pk, size_t pk_len, MLKEM_param_t param)
ML-KEM encapsulation.
Definition cx_mlkem.c:59
enum MLKEM_param_e MLKEM_param_t
ML-KEM parameter set selector.
cx_err_t MLKEM_crypto_kem_keypair(uint8_t *pk, size_t pk_len, uint8_t *sk, size_t sk_len, MLKEM_param_t param)
Generates an ML-KEM key pair.
Definition cx_mlkem.c:32
const MLKEM_param_info_t MLKEM_PARAM[MLKEM_NUM_PARAM_SETS]
Lookup table of ML-KEM parameter sets indexed by MLKEM_param_t.
cx_err_t MLKEM_crypto_kem_dec(uint8_t *ss, size_t ss_len, const uint8_t *ct, size_t ct_len, const uint8_t *sk, size_t sk_len, MLKEM_param_t param)
ML-KEM decapsulation.
Definition cx_mlkem.c:88
MLKEM_param_e
ML-KEM parameter set selector.
Definition lcx_mlkem.h:159
@ MLKEM_1024
Definition lcx_mlkem.h:162
@ MLKEM_512
Definition lcx_mlkem.h:160
@ MLKEM_768
Definition lcx_mlkem.h:161
ML-KEM parameter set descriptor holding all derived sizes.
Definition lcx_mlkem.h:168
uint16_t poly_compressed_dv_bytes
Definition lcx_mlkem.h:176
uint16_t indcpa_ct_bytes
Definition lcx_mlkem.h:179
uint16_t polyvec_bytes
Definition lcx_mlkem.h:174
uint16_t indcpa_pk_bytes
Definition lcx_mlkem.h:177
uint16_t indcpa_sk_bytes
Definition lcx_mlkem.h:178
uint16_t polyvec_compressed_bytes
Definition lcx_mlkem.h:175