Skip to content

Commit b685b01

Browse files
committed
ssl: Add SLH-DSA support
Also remove white space errors and too long lines and no longer needed deprecation supressions.
1 parent 4dda03c commit b685b01

File tree

12 files changed

+767
-352
lines changed

12 files changed

+767
-352
lines changed

lib/ssl/src/ssl.erl

Lines changed: 52 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -424,6 +424,7 @@ still disallow sha1 use in the TLS protocol, since 27.0.1 and 26.2.5.2.
424424
| ecdsa_brainpoolP512r1tls13_sha512
425425
| ecdsa_brainpoolP384r1tls13_sha384
426426
| ecdsa_brainpoolP256r1tls13_sha256
427+
| post_quantum_schemes()
427428
| rsassa_pss_scheme()
428429
| legacy_sign_scheme() . % exported
429430

@@ -439,6 +440,13 @@ Supported in TLS-1.3 and TLS-1.2.
439440
| rsa_pss_pss_sha384
440441
| rsa_pss_pss_sha256.
441442

443+
-doc(#{group => <<"Algorithms">>}).
444+
-doc """
445+
Supported in TLS-1.3 only. ML-DSA since 28.1, SLH-DSA since 28.3.
446+
""".
447+
-type post_quantum_schemes() :: crypto:mldsa() | crypto:slh_dsa().
448+
449+
442450
-doc(#{group => <<"Algorithms Legacy">>}).
443451
-doc """
444452
This is only used for certificate signatures if TLS-1.2 is negotiated,
@@ -3006,33 +3014,45 @@ Example:
30063014
```erlang
30073015
1> ssl:signature_algs(default, 'tlsv1.3').
30083016
[eddsa_ed25519,eddsa_ed448,ecdsa_secp521r1_sha512,
3009-
ecdsa_secp384r1_sha384,ecdsa_secp256r1_sha256,
3010-
rsa_pss_pss_sha512,rsa_pss_pss_sha384,rsa_pss_pss_sha256,
3011-
rsa_pss_rsae_sha512,rsa_pss_rsae_sha384,rsa_pss_rsae_sha256,
3012-
rsa_pkcs1_sha512,rsa_pkcs1_sha384,rsa_pkcs1_sha256,
3013-
{sha512,ecdsa},
3014-
{sha384,ecdsa},
3015-
{sha256,ecdsa}]
3017+
ecdsa_secp384r1_sha384,ecdsa_secp256r1_sha256,
3018+
ecdsa_brainpoolP512r1tls13_sha512,
3019+
ecdsa_brainpoolP384r1tls13_sha384,
3020+
ecdsa_brainpoolP256r1tls13_sha256,rsa_pss_pss_sha512,
3021+
rsa_pss_pss_sha384,rsa_pss_pss_sha256,rsa_pss_rsae_sha512,
3022+
rsa_pss_rsae_sha384,rsa_pss_rsae_sha256,mldsa44,mldsa65,
3023+
mldsa87,rsa_pkcs1_sha512,rsa_pkcs1_sha384,rsa_pkcs1_sha256,
3024+
{sha512,ecdsa},
3025+
{sha384,ecdsa},
3026+
{sha256,ecdsa}]
30163027

30173028
2> ssl:signature_algs(all, 'tlsv1.3').
3018-
[eddsa_ed25519,eddsa_ed448,ecdsa_secp521r1_sha512,
3019-
ecdsa_secp384r1_sha384,ecdsa_secp256r1_sha256,
3020-
rsa_pss_pss_sha512,rsa_pss_pss_sha384,rsa_pss_pss_sha256,
3021-
rsa_pss_rsae_sha512,rsa_pss_rsae_sha384,rsa_pss_rsae_sha256,
3022-
rsa_pkcs1_sha512,rsa_pkcs1_sha384,rsa_pkcs1_sha256,
3023-
{sha512,ecdsa},
3024-
{sha384,ecdsa},
3025-
{sha256,ecdsa},
3026-
{sha224,ecdsa},
3027-
{sha224,rsa},
3028-
{sha,rsa},
3029-
{sha,dsa}]
3030-
3031-
3> ssl:signature_algs(exclusive, 'tlsv1.3').
3032-
[eddsa_ed25519,eddsa_ed448,ecdsa_secp521r1_sha512,
3033-
ecdsa_secp384r1_sha384,ecdsa_secp256r1_sha256,
3034-
rsa_pss_pss_sha512,rsa_pss_pss_sha384,rsa_pss_pss_sha256,
3035-
rsa_pss_rsae_sha512,rsa_pss_rsae_sha384,rsa_pss_rsae_sha256]
3029+
[eddsa_ed25519,eddsa_ed448,ecdsa_secp521r1_sha512,ecdsa_secp384r1_sha384,
3030+
ecdsa_secp256r1_sha256,ecdsa_brainpoolP512r1tls13_sha512,
3031+
ecdsa_brainpoolP384r1tls13_sha384,ecdsa_brainpoolP256r1tls13_sha256,
3032+
rsa_pss_pss_sha512,rsa_pss_pss_sha384,rsa_pss_pss_sha256,rsa_pss_rsae_sha512,
3033+
rsa_pss_rsae_sha384,rsa_pss_rsae_sha256,mldsa44,mldsa65,mldsa87,
3034+
rsa_pkcs1_sha512,rsa_pkcs1_sha384,rsa_pkcs1_sha256,
3035+
{sha512,ecdsa},
3036+
{sha384,ecdsa},
3037+
{sha256,ecdsa},
3038+
slh_dsa_shake_256f,slh_dsa_shake_256s,slh_dsa_sha2_256f,slh_dsa_sha2_256s,
3039+
slh_dsa_shake_192f,slh_dsa_shake_192s,slh_dsa_sha2_192f,slh_dsa_sha2_192s,
3040+
slh_dsa_shake_128f,slh_dsa_shake_128s,slh_dsa_sha2_128f,slh_dsa_sha2_128s,
3041+
ecdsa_sha1,rsa_pkcs1_sha1,
3042+
{sha224,ecdsa},
3043+
{sha224,rsa},
3044+
{sha,dsa}]
3045+
3046+
3> [ssl:signature_algs(exclusive, 'tlsv1.3').
3047+
[eddsa_ed25519,eddsa_ed448,ecdsa_secp521r1_sha512,ecdsa_secp384r1_sha384,
3048+
ecdsa_secp256r1_sha256,ecdsa_brainpoolP512r1tls13_sha512,
3049+
ecdsa_brainpoolP384r1tls13_sha384,ecdsa_brainpoolP256r1tls13_sha256,
3050+
rsa_pss_pss_sha512,rsa_pss_pss_sha384,rsa_pss_pss_sha256,rsa_pss_rsae_sha512,
3051+
rsa_pss_rsae_sha384,rsa_pss_rsae_sha256,mldsa44,mldsa65,mldsa87,
3052+
rsa_pkcs1_sha512,rsa_pkcs1_sha384,rsa_pkcs1_sha256,slh_dsa_shake_256f,
3053+
slh_dsa_shake_256s,slh_dsa_sha2_256f,slh_dsa_sha2_256s,slh_dsa_shake_192f,
3054+
slh_dsa_shake_192s,slh_dsa_sha2_192f,slh_dsa_sha2_192s,slh_dsa_shake_128f,
3055+
slh_dsa_shake_128s,slh_dsa_sha2_128f,slh_dsa_sha2_128s]
30363056
```
30373057

30383058
> #### Note {: .info }
@@ -3051,19 +3071,22 @@ rsa_pss_rsae_sha512,rsa_pss_rsae_sha384,rsa_pss_rsae_sha256]
30513071
%%--------------------------------------------------------------------
30523072

30533073
signature_algs(default, 'tlsv1.3') ->
3054-
tls_v1:default_signature_algs([tls_record:protocol_version_name('tlsv1.3'),
3074+
tls_v1:default_signature_algs([tls_record:protocol_version_name('tlsv1.3'),
30553075
tls_record:protocol_version_name('tlsv1.2')]);
30563076
signature_algs(default, 'tlsv1.2') ->
30573077
tls_v1:default_signature_algs([tls_record:protocol_version_name('tlsv1.2')]);
30583078
signature_algs(all, 'tlsv1.3') ->
30593079
tls_v1:default_signature_algs([tls_record:protocol_version_name('tlsv1.3'),
30603080
tls_record:protocol_version_name('tlsv1.2')]) ++
3061-
[ecdsa_sha1, rsa_pkcs1_sha1 | tls_v1:legacy_signature_algs_pre_13()] -- [{sha, ecdsa}, {sha, rsa}];
3081+
tls_v1:slh_dsa_schemes() ++
3082+
[ecdsa_sha1, rsa_pkcs1_sha1 | tls_v1:legacy_signature_algs_pre_13()] --
3083+
[{sha, ecdsa}, {sha, rsa}];
30623084
signature_algs(all, 'tlsv1.2') ->
3063-
tls_v1:default_signature_algs([tls_record:protocol_version_name('tlsv1.2')]) ++
3085+
tls_v1:default_signature_algs([tls_record:protocol_version_name('tlsv1.2')]) ++
30643086
tls_v1:legacy_signature_algs_pre_13();
30653087
signature_algs(exclusive, 'tlsv1.3') ->
3066-
tls_v1:default_signature_algs([tls_record:protocol_version_name('tlsv1.3')]);
3088+
tls_v1:default_signature_algs([tls_record:protocol_version_name('tlsv1.3')]) ++
3089+
tls_v1:slh_dsa_schemes();
30673090
signature_algs(exclusive, 'tlsv1.2') ->
30683091
Algs = tls_v1:default_signature_algs([tls_record:protocol_version_name('tlsv1.2')]),
30693092
Algs ++ tls_v1:legacy_signature_algs_pre_13();

lib/ssl/src/ssl_certificate.erl

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -361,7 +361,7 @@ available_cert_key_pairs(CertKeyGroups) ->
361361
%% Create the prioritized list of cert key pairs that
362362
%% are availble for use in the negotiated version
363363
available_cert_key_pairs(CertKeyGroups, ?TLS_1_3) ->
364-
RevAlgos = [mldsa, rsa, rsa_pss_pss, ecdsa, eddsa],
364+
RevAlgos = [slhdsa, mldsa, rsa, rsa_pss_pss, ecdsa, eddsa],
365365
cert_key_group_to_list(RevAlgos, CertKeyGroups, []);
366366
available_cert_key_pairs(CertKeyGroups, ?TLS_1_2) ->
367367
RevAlgos = [dsa, rsa, rsa_pss_pss, ecdsa],

lib/ssl/src/ssl_cipher.erl

Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -599,6 +599,18 @@ signature_scheme(ecdsa_sha1) -> ?ECDSA_SHA1;
599599
signature_scheme(mldsa44) -> ?MLDSA44;
600600
signature_scheme(mldsa65) -> ?MLDSA65;
601601
signature_scheme(mldsa87) -> ?MLDSA87;
602+
signature_scheme(slh_dsa_sha2_128f) -> ?SLHDSA_SHA2_128F;
603+
signature_scheme(slh_dsa_sha2_128s) -> ?SLHDSA_SHA2_128S;
604+
signature_scheme(slh_dsa_sha2_192f) -> ?SLHDSA_SHA2_192F;
605+
signature_scheme(slh_dsa_sha2_192s) -> ?SLHDSA_SHA2_192S;
606+
signature_scheme(slh_dsa_sha2_256f) -> ?SLHDSA_SHA2_256F;
607+
signature_scheme(slh_dsa_sha2_256s) -> ?SLHDSA_SHA2_256S;
608+
signature_scheme(slh_dsa_shake_128f) -> ?SLHDSA_SHAKE_128F;
609+
signature_scheme(slh_dsa_shake_128s) -> ?SLHDSA_SHAKE_128S;
610+
signature_scheme(slh_dsa_shake_192f) -> ?SLHDSA_SHAKE_192F;
611+
signature_scheme(slh_dsa_shake_192s) -> ?SLHDSA_SHAKE_192S;
612+
signature_scheme(slh_dsa_shake_256f) -> ?SLHDSA_SHAKE_256F;
613+
signature_scheme(slh_dsa_shake_256s) -> ?SLHDSA_SHAKE_256S;
602614

603615
%% New algorithms on legacy format
604616
signature_scheme({sha512, rsa_pss_pss}) ->
@@ -641,6 +653,18 @@ signature_scheme(?ECDSA_SHA1) -> ecdsa_sha1;
641653
signature_scheme(?MLDSA44) -> mldsa44;
642654
signature_scheme(?MLDSA65) -> mldsa65;
643655
signature_scheme(?MLDSA87) -> mldsa87;
656+
signature_scheme(?SLHDSA_SHA2_128F) -> slh_dsa_sha2_128f;
657+
signature_scheme(?SLHDSA_SHA2_128S) -> slh_dsa_sha2_128s;
658+
signature_scheme(?SLHDSA_SHA2_192F) -> slh_dsa_sha2_192f;
659+
signature_scheme(?SLHDSA_SHA2_192S) -> slh_dsa_sha2_192s;
660+
signature_scheme(?SLHDSA_SHA2_256F) -> slh_dsa_sha2_256f;
661+
signature_scheme(?SLHDSA_SHA2_256S) -> slh_dsa_sha2_256s;
662+
signature_scheme(?SLHDSA_SHAKE_128F) -> slh_dsa_shake_128f;
663+
signature_scheme(?SLHDSA_SHAKE_128S) -> slh_dsa_shake_128s;
664+
signature_scheme(?SLHDSA_SHAKE_192F) -> slh_dsa_shake_192f;
665+
signature_scheme(?SLHDSA_SHAKE_192S) -> slh_dsa_shake_192s;
666+
signature_scheme(?SLHDSA_SHAKE_256F) -> slh_dsa_shake_256f;
667+
signature_scheme(?SLHDSA_SHAKE_256S) -> slh_dsa_shake_256s;
644668

645669
%% Handling legacy signature algorithms for logging purposes. These algorithms
646670
%% cannot be used in TLS 1.3 handshakes.
@@ -712,6 +736,18 @@ scheme_to_components(ecdsa_sha1) -> {sha, ecdsa, undefined};
712736
scheme_to_components(mldsa44) -> {none, mldsa44, undefined};
713737
scheme_to_components(mldsa65) -> {none, mldsa65, undefined};
714738
scheme_to_components(mldsa87) -> {none, mldsa87, undefined};
739+
scheme_to_components(slh_dsa_sha2_128f = Scheme) -> {Scheme, slhdsa, undefined};
740+
scheme_to_components(slh_dsa_sha2_128s = Scheme) -> {Scheme, slhdsa, undefined};
741+
scheme_to_components(slh_dsa_sha2_192f = Scheme) -> {Scheme, slhdsa, undefined};
742+
scheme_to_components(slh_dsa_sha2_192s = Scheme) -> {Scheme, slhdsa, undefined};
743+
scheme_to_components(slh_dsa_sha2_256f = Scheme) -> {Scheme, slhdsa, undefined};
744+
scheme_to_components(slh_dsa_sha2_256s = Scheme) -> {Scheme, slhdsa, undefined};
745+
scheme_to_components(slh_dsa_shake_128f = Scheme) -> {Scheme, slhdsa, undefined};
746+
scheme_to_components(slh_dsa_shake_128s = Scheme) -> {Scheme, slhdsa, undefined};
747+
scheme_to_components(slh_dsa_shake_192f = Scheme) -> {Scheme, slhdsa, undefined};
748+
scheme_to_components(slh_dsa_shake_192s = Scheme) -> {Scheme, slhdsa, undefined};
749+
scheme_to_components(slh_dsa_shake_256f = Scheme) -> {Scheme, slhdsa, undefined};
750+
scheme_to_components(slh_dsa_shake_256s = Scheme) -> {Scheme, slhdsa, undefined};
715751
%% Handling legacy signature algorithms
716752
scheme_to_components({Hash,Sign}) -> {Hash, Sign, undefined}.
717753

@@ -890,6 +926,30 @@ signature_algorithm_to_scheme(#'SignatureAlgorithm'{algorithm = ?'id-ml-dsa-65'}
890926
mldsa65;
891927
signature_algorithm_to_scheme(#'SignatureAlgorithm'{algorithm = ?'id-ml-dsa-87'}) ->
892928
mldsa87;
929+
signature_algorithm_to_scheme(#'SignatureAlgorithm'{algorithm = ?'id-slh-dsa-shake-256f'}) ->
930+
slh_dsa_shake_256f;
931+
signature_algorithm_to_scheme(#'SignatureAlgorithm'{algorithm = ?'id-slh-dsa-shake-192f'}) ->
932+
slh_dsa_shake_192f;
933+
signature_algorithm_to_scheme(#'SignatureAlgorithm'{algorithm = ?'id-slh-dsa-shake-128f'}) ->
934+
slh_dsa_shake_128f;
935+
signature_algorithm_to_scheme(#'SignatureAlgorithm'{algorithm = ?'id-slh-dsa-shake-256s'}) ->
936+
slh_dsa_shake_256s;
937+
signature_algorithm_to_scheme(#'SignatureAlgorithm'{algorithm = ?'id-slh-dsa-shake-192s'}) ->
938+
slh_dsa_shake_192s;
939+
signature_algorithm_to_scheme(#'SignatureAlgorithm'{algorithm = ?'id-slh-dsa-shake-128s'}) ->
940+
slh_dsa_shake_128s;
941+
signature_algorithm_to_scheme(#'SignatureAlgorithm'{algorithm = ?'id-slh-dsa-sha2-256f'}) ->
942+
slh_dsa_sha2_256f;
943+
signature_algorithm_to_scheme(#'SignatureAlgorithm'{algorithm = ?'id-slh-dsa-sha2-192f'}) ->
944+
slh_dsa_sha2_192f;
945+
signature_algorithm_to_scheme(#'SignatureAlgorithm'{algorithm = ?'id-slh-dsa-sha2-128f'}) ->
946+
slh_dsa_sha2_128f;
947+
signature_algorithm_to_scheme(#'SignatureAlgorithm'{algorithm = ?'id-slh-dsa-sha2-256s'}) ->
948+
slh_dsa_sha2_256s;
949+
signature_algorithm_to_scheme(#'SignatureAlgorithm'{algorithm = ?'id-slh-dsa-sha2-192s'}) ->
950+
slh_dsa_sha2_192s;
951+
signature_algorithm_to_scheme(#'SignatureAlgorithm'{algorithm = ?'id-slh-dsa-sha2-128s'}) ->
952+
slh_dsa_sha2_128s;
893953
signature_algorithm_to_scheme(#'SignatureAlgorithm'{algorithm = ?sha256WithRSAEncryption}) ->
894954
rsa_pkcs1_sha256;
895955
signature_algorithm_to_scheme(#'SignatureAlgorithm'{algorithm = ?sha384WithRSAEncryption}) ->

lib/ssl/src/ssl_config.erl

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -162,6 +162,7 @@ group_pairs([#{certs := []}]) ->
162162
rsa_pss_pss => [],
163163
rsa => [],
164164
mldsa => [],
165+
slhdsa => [],
165166
dsa => []
166167
};
167168
group_pairs(Pairs) ->
@@ -170,6 +171,7 @@ group_pairs(Pairs) ->
170171
rsa_pss_pss => [],
171172
rsa => [],
172173
mldsa => [],
174+
slhdsa => [],
173175
dsa => []
174176
}).
175177

@@ -188,6 +190,8 @@ group_pairs([#{private_key := #'RSAPrivateKey'{}} = Pair | Rest], #{rsa := RSA}
188190
group_pairs(Rest, Group#{rsa => [Pair | RSA]});
189191
group_pairs([#{private_key := #'ML-DSAPrivateKey'{}} = Pair | Rest], #{mldsa := MLDSA} = Group) ->
190192
group_pairs(Rest, Group#{mldsa => [Pair | MLDSA]});
193+
group_pairs([#{private_key := #'SLH-DSAPrivateKey'{}} = Pair | Rest], #{slhdsa := SLHDSA} = Group) ->
194+
group_pairs(Rest, Group#{slhdsa => [Pair | SLHDSA]});
191195
group_pairs([#{private_key := #'DSAPrivateKey'{}} = Pair | Rest], #{dsa := DSA} = Group) ->
192196
group_pairs(Rest, Group#{dsa => [Pair | DSA]});
193197
group_pairs([#{private_key := #{algorithm := dss, engine := _}} = Pair | Rest], Group) ->
@@ -207,13 +211,15 @@ prioritize_groups(#{eddsa := EDDSA,
207211
rsa_pss_pss := RSAPSS,
208212
rsa := RSA,
209213
mldsa := MLDSA,
214+
slhdsa := SLHDSA,
210215
dsa := DSA} = CertKeyGroups, Opts) ->
211216
EC = ecdsa_support(Opts),
212217
CertKeyGroups#{eddsa => prio_eddsa(EDDSA),
213218
ecdsa => prio_ecdsa(ECDSA, EC),
214219
rsa_pss_pss => prio_rsa_pss(RSAPSS),
215220
rsa => prio_rsa(RSA),
216221
mldsa => prio_mldsa(MLDSA),
222+
slhdsa => prio_slhdsa(SLHDSA),
217223
dsa => prio_dsa(DSA)}.
218224
prio_eddsa(EDDSA) ->
219225
%% Engine not supported yet
@@ -276,6 +282,12 @@ prio_mldsa(MLDSA) ->
276282
SignFunPairs
277283
++ lists:keysort(#'ML-DSAPrivateKey'.algorithm, MLDSA -- SignFunPairs).
278284

285+
prio_slhdsa(SLHDSA) ->
286+
%% Engine not supported yet
287+
SignFunPairs = [Pair || Pair = #{private_key := #{sign_fun := _}} <- SLHDSA],
288+
SignFunPairs
289+
++ lists:keysort(#'SLH-DSAPrivateKey'.algorithm, SLHDSA -- SignFunPairs).
290+
279291
prio_dsa(DSA) ->
280292
Order = fun(#{key := #'DSAPrivateKey'{q = N}},
281293
#{key := #'DSAPrivateKey'{q = M}}) when M > N ->
@@ -309,6 +321,22 @@ private_key(#'PrivateKeyInfo'{privateKeyAlgorithm =
309321
#'PrivateKeyInfo_privateKeyAlgorithm'{algorithm = ?'id-ml-dsa-87'},
310322
privateKey = DerKey}) ->
311323
mldsa_priv_key_dec('ML-DSA-87-PrivateKey', DerKey, #'ML-DSAPrivateKey'{algorithm = mldsa87});
324+
private_key(#'PrivateKeyInfo'{privateKeyAlgorithm =
325+
#'PrivateKeyInfo_privateKeyAlgorithm'{
326+
algorithm = Algorithm},
327+
privateKey = DerKey}) when Algorithm == ?'id-slh-dsa-sha2-128f';
328+
Algorithm == ?'id-slh-dsa-sha2-128s';
329+
Algorithm == ?'id-slh-dsa-sha2-192f';
330+
Algorithm == ?'id-slh-dsa-sha2-192s';
331+
Algorithm == ?'id-slh-dsa-sha2-256f';
332+
Algorithm == ?'id-slh-dsa-sha2-256s';
333+
Algorithm == ?'id-slh-dsa-shake-128f';
334+
Algorithm == ?'id-slh-dsa-shake-128s';
335+
Algorithm == ?'id-slh-dsa-shake-192f';
336+
Algorithm == ?'id-slh-dsa-shake-192s';
337+
Algorithm == ?'id-slh-dsa-shake-256f';
338+
Algorithm == ?'id-slh-dsa-shake-256s' ->
339+
public_key:der_decode('SLH-DSA-PrivateKey', DerKey);
312340
private_key(#'PrivateKeyInfo'{privateKeyAlgorithm =
313341
#'PrivateKeyInfo_privateKeyAlgorithm'{algorithm = ?'id-ecPublicKey',
314342
parameters = {asn1_OPENTYPE, Parameters}},
@@ -2240,6 +2268,8 @@ check_key(#'ECPrivateKey'{}) ->
22402268
ok;
22412269
check_key(#'ML-DSAPrivateKey'{}) ->
22422270
ok;
2271+
check_key(#'SLH-DSAPrivateKey'{}) ->
2272+
ok;
22432273
check_key(NotKey) ->
22442274
{error, {unexpected_content, NotKey}}.
22452275

lib/ssl/src/ssl_connection.hrl

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -119,6 +119,7 @@
119119
cert_key_alts = undefined :: #{eddsa => list(),
120120
ecdsa => list(),
121121
mldsa => list(),
122+
slhdsa => list(),
122123
rsa_pss_pss => list(),
123124
rsa => list(),
124125
dsa => list()

lib/ssl/src/ssl_handshake.erl

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -50,15 +50,6 @@
5050
#client_key_exchange{} | #finished{} | #certificate_verify{} |
5151
#hello_request{} | #next_protocol{} | #end_of_early_data{}.
5252

53-
%% Needed for legacy TLS-1.0 and TLS-1.1 functionality
54-
-compile({nowarn_deprecated_function, [{crypto, private_encrypt, 4},
55-
{crypto, private_decrypt, 4},
56-
{public_key, encrypt_private, 3},
57-
{public_key, decrypt_private, 3},
58-
{public_key, encrypt_public, 3},
59-
{public_key, decrypt_public, 3}
60-
]}).
61-
6253
%% Create handshake messages
6354
-export([hello_request/0,
6455
server_hello/4,
@@ -462,6 +453,8 @@ verify_signature(?TLS_1_3, Msg, {_, mldsa65}, Signature,
462453
verify_signature(?TLS_1_3, Msg, {_, mldsa87}, Signature,
463454
{?'id-ml-dsa-87', #'ML-DSAPublicKey'{algorithm = mldsa87} = PubKey,_}) ->
464455
public_key:verify(Msg, none, Signature, PubKey);
456+
verify_signature(?TLS_1_3, Msg, {_ , slhdsa}, Signature, {_, #'SLH-DSAPublicKey'{} = PubKey,_}) ->
457+
public_key:verify(Msg, none, Signature, PubKey);
465458
verify_signature(?TLS_1_3, Msg, {_, eddsa}, Signature, {?'id-Ed25519', PubKey, PubKeyParams}) ->
466459
public_key:verify(Msg, none, Signature, {PubKey, PubKeyParams});
467460
verify_signature(?TLS_1_3, Msg, {_, eddsa}, Signature, {?'id-Ed448', PubKey, PubKeyParams}) ->
@@ -2220,6 +2213,11 @@ do_digitally_signed(Version, Msg, HashAlgo, #'ML-DSAPrivateKey'{}= Key,
22202213
SignAlgo == mldsa65 orelse
22212214
SignAlgo == mldsa87) ->
22222215
public_key:sign(Msg, HashAlgo, Key);
2216+
do_digitally_signed(Version, Msg, _, #'SLH-DSAPrivateKey'{}= Key,
2217+
slhdsa) when ?TLS_GTE(Version, ?TLS_1_3) ->
2218+
%% HashAlgo will in this case be the full scheme that public_key/crypto deduces from the key.
2219+
%% and none should be used for second argument.
2220+
public_key:sign(Msg, none, Key);
22232221
do_digitally_signed(Version, Msg, HashAlgo, {#'RSAPrivateKey'{} = Key,
22242222
#'RSASSA-PSS-params'{}},
22252223
SignAlgo) when ?TLS_GTE(Version, ?TLS_1_2) ->
@@ -2286,6 +2284,8 @@ bad_key(#'ECPrivateKey'{}) ->
22862284
unacceptable_ecdsa_key;
22872285
bad_key(#'ML-DSAPrivateKey'{}) ->
22882286
unacceptable_mldsa_key;
2287+
bad_key(#'SLH-DSAPrivateKey'{}) ->
2288+
unacceptable_slhdsa_key;
22892289
bad_key(#{algorithm := rsa}) ->
22902290
unacceptable_rsa_key;
22912291
bad_key(#{algorithm := rsa_pss_pss}) ->

0 commit comments

Comments
 (0)