File 3272-crypto-Add-128-and-192-variants-of-SLH-DSA.patch of Package erlang
From d1123c60aa1ff6b351df77c8d19596fae63e19b7 Mon Sep 17 00:00:00 2001
From: Sverker Eriksson <sverker@erlang.org>
Date: Thu, 9 Oct 2025 17:27:55 +0200
Subject: [PATCH 2/2] crypto: Add 128 and 192 variants of SLH-DSA
---
lib/crypto/c_src/pkey.c | 40 ++++++++++++++++++++++++++++++++
lib/crypto/src/crypto.erl | 12 +++++++++-
lib/crypto/test/crypto_SUITE.erl | 15 ++++++++++--
3 files changed, 64 insertions(+), 3 deletions(-)
diff --git a/lib/crypto/c_src/pkey.c b/lib/crypto/c_src/pkey.c
index 6646a69f3e..046ef76e14 100644
--- a/lib/crypto/c_src/pkey.c
+++ b/lib/crypto/c_src/pkey.c
@@ -109,6 +109,46 @@ struct pkey_type_t pkey_types[] = {
},
#endif
#ifdef HAVE_SLH_DSA
+ {
+ .name.atom_str = "slh_dsa_shake_128s",
+ .evp_pkey_id = EVP_PKEY_SLH_DSA_SHAKE_128S,
+ .sign.alg_str = "SLH-DSA-SHAKE-128s"
+ },
+ {
+ .name.atom_str = "slh_dsa_shake_128f",
+ .evp_pkey_id = EVP_PKEY_SLH_DSA_SHAKE_128F,
+ .sign.alg_str = "SLH-DSA-SHAKE-128f"
+ },
+ {
+ .name.atom_str = "slh_dsa_sha2_128s",
+ .evp_pkey_id = EVP_PKEY_SLH_DSA_SHA2_128S,
+ .sign.alg_str = "SLH-DSA-SHA2-128s"
+ },
+ {
+ .name.atom_str = "slh_dsa_sha2_128f",
+ .evp_pkey_id = EVP_PKEY_SLH_DSA_SHA2_128F,
+ .sign.alg_str = "SLH-DSA-SHA2-128f"
+ },
+ {
+ .name.atom_str = "slh_dsa_shake_192s",
+ .evp_pkey_id = EVP_PKEY_SLH_DSA_SHAKE_192S,
+ .sign.alg_str = "SLH-DSA-SHAKE-192s"
+ },
+ {
+ .name.atom_str = "slh_dsa_shake_192f",
+ .evp_pkey_id = EVP_PKEY_SLH_DSA_SHAKE_192F,
+ .sign.alg_str = "SLH-DSA-SHAKE-192f"
+ },
+ {
+ .name.atom_str = "slh_dsa_sha2_192s",
+ .evp_pkey_id = EVP_PKEY_SLH_DSA_SHA2_192S,
+ .sign.alg_str = "SLH-DSA-SHA2-192s"
+ },
+ {
+ .name.atom_str = "slh_dsa_sha2_192f",
+ .evp_pkey_id = EVP_PKEY_SLH_DSA_SHA2_192F,
+ .sign.alg_str = "SLH-DSA-SHA2-192f"
+ },
{
.name.atom_str = "slh_dsa_shake_256s",
.evp_pkey_id = EVP_PKEY_SLH_DSA_SHAKE_256S,
diff --git a/lib/crypto/src/crypto.erl b/lib/crypto/src/crypto.erl
index 53e392b412..334ecda840 100644
--- a/lib/crypto/src/crypto.erl
+++ b/lib/crypto/src/crypto.erl
@@ -2443,7 +2443,9 @@ rand_seed_nif(_Seed) -> ?nif_stub.
-type mldsa() :: mldsa44 | mldsa65 | mldsa87.
-type mldsa_private() :: {seed | expandedkey, binary()}.
-type mldsa_public() :: binary().
--type slh_dsa() :: slh_dsa_shake_256s | slh_dsa_shake_256f | slh_dsa_sha2_256s | slh_dsa_sha2_256f.
+-type slh_dsa() :: slh_dsa_shake_128s | slh_dsa_shake_128f | slh_dsa_sha2_128s | slh_dsa_sha2_128f
+ | slh_dsa_shake_192s | slh_dsa_shake_192f | slh_dsa_sha2_192s | slh_dsa_sha2_192f
+ | slh_dsa_shake_256s | slh_dsa_shake_256f | slh_dsa_sha2_256s | slh_dsa_sha2_256f.
-type slh_dsa_private() :: binary().
-type slh_dsa_public() :: binary().
@@ -2551,6 +2553,14 @@ pkey_sign_nif(_Algorithm, _Type, _Digest, _Key, _Options) -> ?nif_stub.
pkey_sign_heavy_nif(_Algorithm, _Type, _Digest, _Key, _Options) -> ?nif_stub.
+is_heavy(slh_dsa_shake_128s) -> true;
+is_heavy(slh_dsa_shake_128f) -> true;
+is_heavy(slh_dsa_sha2_128s) -> true;
+is_heavy(slh_dsa_sha2_128f) -> true;
+is_heavy(slh_dsa_shake_192s) -> true;
+is_heavy(slh_dsa_shake_192f) -> true;
+is_heavy(slh_dsa_sha2_192s) -> true;
+is_heavy(slh_dsa_sha2_192f) -> true;
is_heavy(slh_dsa_shake_256s) -> true;
is_heavy(slh_dsa_shake_256f) -> true;
is_heavy(slh_dsa_sha2_256s) -> true;
diff --git a/lib/crypto/test/crypto_SUITE.erl b/lib/crypto/test/crypto_SUITE.erl
index cd348278f9..c94cd2ff26 100644
--- a/lib/crypto/test/crypto_SUITE.erl
+++ b/lib/crypto/test/crypto_SUITE.erl
@@ -1283,7 +1283,7 @@ sign_verify_oqs(_Config) ->
true = lists:member(Alg, Supported),
sign_verify_oqs_do(Alg)
end
- || Alg <- mldsa_sign_ciphers()],
+ || Alg <- quantum_sign_ciphers()],
ok
end.
@@ -1301,8 +1301,19 @@ sign_verify_oqs_do(Alg) ->
ok.
%% Supported by OpenSSL 3.5
-mldsa_sign_ciphers() ->
+quantum_sign_ciphers() ->
[mldsa44, mldsa65, mldsa87,
+
+ slh_dsa_shake_128s,
+ slh_dsa_shake_128f,
+ slh_dsa_sha2_128s,
+ slh_dsa_sha2_128f,
+
+ slh_dsa_shake_192s,
+ slh_dsa_shake_192f,
+ slh_dsa_sha2_192s,
+ slh_dsa_sha2_192f,
+
slh_dsa_shake_256s,
slh_dsa_shake_256f,
slh_dsa_sha2_256s,
--
2.51.0