Skip to content

Commit 90e0e25

Browse files
committed
Merge 'sverker/crypto/SLH-DSA' into maint
OTP-19856
2 parents 73ee1db + d1123c6 commit 90e0e25

File tree

10 files changed

+391
-241
lines changed

10 files changed

+391
-241
lines changed

lib/crypto/c_src/algorithms.c

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@
2626
#include "mac.h"
2727
#ifdef HAS_3_0_API
2828
#include "digest.h"
29+
#include "pkey.h"
2930
#endif
3031

3132
#ifdef HAS_3_0_API
@@ -160,10 +161,14 @@ void init_hash_types(ErlNifEnv* env) {
160161

161162
ERL_NIF_TERM pubkey_algorithms(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[])
162163
{
163-
unsigned int cnt =
164-
FIPS_MODE() ? algo_pubkey_fips_cnt : algo_pubkey_cnt;
164+
const bool fips = FIPS_MODE();
165+
unsigned int cnt = fips ? algo_pubkey_fips_cnt : algo_pubkey_cnt;
166+
ERL_NIF_TERM list = enif_make_list_from_array(env, algo_pubkey, cnt);
165167

166-
return enif_make_list_from_array(env, algo_pubkey, cnt);
168+
#ifdef HAS_3_0_API
169+
list = build_pkey_type_list(env, list, fips);
170+
#endif
171+
return list;
167172
}
168173

169174
void init_pubkey_types(ErlNifEnv* env) {
@@ -193,11 +198,6 @@ void init_pubkey_types(ErlNifEnv* env) {
193198
algo_pubkey[algo_pubkey_cnt++] = enif_make_atom(env, "eddh");
194199
#endif
195200
algo_pubkey[algo_pubkey_cnt++] = enif_make_atom(env, "srp");
196-
#ifdef HAVE_ML_DSA
197-
algo_pubkey[algo_pubkey_cnt++] = atom_mldsa44;
198-
algo_pubkey[algo_pubkey_cnt++] = atom_mldsa65;
199-
algo_pubkey[algo_pubkey_cnt++] = atom_mldsa87;
200-
#endif
201201
ASSERT(algo_pubkey_cnt <= sizeof(algo_pubkey)/sizeof(ERL_NIF_TERM));
202202
}
203203

lib/crypto/c_src/atoms.c

Lines changed: 0 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -151,13 +151,8 @@ ERL_NIF_TERM atom_key_id;
151151
ERL_NIF_TERM atom_password;
152152
#endif
153153

154-
#ifdef HAVE_ML_DSA
155-
ERL_NIF_TERM atom_mldsa44;
156-
ERL_NIF_TERM atom_mldsa65;
157-
ERL_NIF_TERM atom_mldsa87;
158154
ERL_NIF_TERM atom_seed;
159155
ERL_NIF_TERM atom_expandedkey;
160-
#endif
161156

162157
#ifdef HAVE_ML_KEM
163158
ERL_NIF_TERM atom_mlkem512;
@@ -288,13 +283,8 @@ int init_atoms(ErlNifEnv *env) {
288283
atom_password = enif_make_atom(env,"password");
289284
#endif
290285

291-
#ifdef HAVE_ML_DSA
292-
atom_mldsa44 = enif_make_atom(env,"mldsa44");
293-
atom_mldsa65 = enif_make_atom(env,"mldsa65");
294-
atom_mldsa87 = enif_make_atom(env,"mldsa87");
295286
atom_seed = enif_make_atom(env,"seed");
296287
atom_expandedkey = enif_make_atom(env,"expandedkey");
297-
#endif
298288
#ifdef HAVE_ML_KEM
299289
atom_mlkem512 = enif_make_atom(env,"mlkem512");
300290
atom_mlkem768 = enif_make_atom(env,"mlkem768");

lib/crypto/c_src/atoms.h

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -150,13 +150,8 @@ extern ERL_NIF_TERM atom_key_id;
150150
extern ERL_NIF_TERM atom_password;
151151
#endif
152152

153-
#ifdef HAVE_ML_DSA
154-
extern ERL_NIF_TERM atom_mldsa44;
155-
extern ERL_NIF_TERM atom_mldsa65;
156-
extern ERL_NIF_TERM atom_mldsa87;
157153
extern ERL_NIF_TERM atom_seed;
158154
extern ERL_NIF_TERM atom_expandedkey;
159-
#endif
160155
#ifdef HAVE_ML_KEM
161156
extern ERL_NIF_TERM atom_mlkem512;
162157
extern ERL_NIF_TERM atom_mlkem768;

lib/crypto/c_src/crypto.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -102,6 +102,7 @@ static ErlNifFunc nif_funcs[] = {
102102

103103
{"pbkdf2_hmac_nif", 5, pbkdf2_hmac_nif, 0},
104104
{"pkey_sign_nif", 5, pkey_sign_nif, 0},
105+
{"pkey_sign_heavy_nif", 5, pkey_sign_heavy_nif, ERL_NIF_DIRTY_JOB_CPU_BOUND},
105106
{"pkey_verify_nif", 6, pkey_verify_nif, 0},
106107
{"pkey_crypt_nif", 6, pkey_crypt_nif, 0},
107108
{"encapsulate_key_nif", 2, encapsulate_key_nif, 0},
@@ -275,9 +276,8 @@ static int initialize(ErlNifEnv* env, ERL_NIF_TERM load_info)
275276
/* Don't fail loading if the legacy provider is missing */
276277
prov_cnt++;
277278
}
278-
prefetched_sign_algo_init();
279-
280279
#endif
280+
prefetched_sign_algo_init(env);
281281

282282
if (!init_atoms(env)) {
283283
ret = __LINE__; goto done;

lib/crypto/c_src/evp.c

Lines changed: 7 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@ ERL_NIF_TERM encapsulate_key_nif(ErlNifEnv* env, int argc, const ERL_NIF_TERM ar
3838
ERL_NIF_TERM ret;
3939

4040
if (!get_pkey_from_octet_string(env, argv[0], argv[1], PKEY_PUB,
41-
&peer_pkey, &ret)) {
41+
NULL, &peer_pkey, &ret)) {
4242
goto err;
4343
}
4444

@@ -92,7 +92,7 @@ ERL_NIF_TERM decapsulate_key_nif(ErlNifEnv* env, int argc, const ERL_NIF_TERM ar
9292
assign_goto(ret, err, EXCP_ERROR_N(env, 2, "Invalid encapsulated secret"));
9393
}
9494
if (!get_pkey_from_octet_string(env, argv[0], argv[1], PKEY_PRIV,
95-
&my_pkey, &ret)) {
95+
NULL, &my_pkey, &ret)) {
9696
goto err;
9797
}
9898

@@ -229,8 +229,12 @@ ERL_NIF_TERM evp_generate_key_nif(ErlNifEnv* env, int argc, const ERL_NIF_TERM a
229229
ErlNifBinary prv_key;
230230
size_t key_len;
231231
unsigned char *out_pub = NULL, *out_priv = NULL;
232+
struct pkey_type_t *pkey_type = get_pkey_type(argv[0]);
232233

233-
if (argv[0] == atom_x25519)
234+
if (pkey_type) {
235+
type = pkey_type->evp_pkey_id;
236+
}
237+
else if (argv[0] == atom_x25519)
234238
type = EVP_PKEY_X25519;
235239
#ifdef HAVE_X448
236240
else if (argv[0] == atom_x448)
@@ -242,15 +246,6 @@ ERL_NIF_TERM evp_generate_key_nif(ErlNifEnv* env, int argc, const ERL_NIF_TERM a
242246
else if (argv[0] == atom_ed448)
243247
type = EVP_PKEY_ED448;
244248
#endif
245-
#ifdef HAVE_ML_DSA
246-
else if (argv[0] == atom_mldsa44) {
247-
type = EVP_PKEY_ML_DSA_44;
248-
} else if (argv[0] == atom_mldsa65) {
249-
type = EVP_PKEY_ML_DSA_65;
250-
} else if (argv[0] == atom_mldsa87) {
251-
type = EVP_PKEY_ML_DSA_87;
252-
}
253-
#endif
254249
#ifdef HAVE_ML_KEM
255250
else if (argv[0] == atom_mlkem512) {
256251
type = NID_ML_KEM_512;

lib/crypto/c_src/openssl_config.h

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -389,13 +389,20 @@
389389
#endif
390390
#endif
391391

392+
#if OPENSSL_VERSION_NUMBER >= PACKED_OPENSSL_VERSION_PLAIN(3,4,0)
393+
# define HAS_PREFETCH_SIGN_INIT
394+
#endif
395+
392396
#if OPENSSL_VERSION_NUMBER >= PACKED_OPENSSL_VERSION_PLAIN(3,5,0)
393397
# ifndef OPENSSL_NO_ML_KEM
394398
# define HAVE_ML_KEM
395399
# endif
396400
# ifndef OPENSSL_NO_ML_DSA
397401
# define HAVE_ML_DSA
398402
# endif
403+
# ifndef OPENSSL_NO_SLH_DSA
404+
# define HAVE_SLH_DSA
405+
# endif
399406
#endif
400407

401408
#if defined(HAS_ENGINE_SUPPORT)

0 commit comments

Comments
 (0)