File 1621-ssl-Remove-CBC-ciphers-from-TLS-1.2-default.patch of Package erlang

From 550041c9546e4a42091d322478a00abfe49a01b1 Mon Sep 17 00:00:00 2001
From: Ingela Anderton Andin <ingela@erlang.org>
Date: Sat, 9 Mar 2024 08:39:44 +0100
Subject: [PATCH] ssl: Remove CBC ciphers from TLS-1.2 default

---
 lib/ssl/src/ssl_cipher.erl         |  24 +++--
 lib/ssl/src/tls_v1.erl             | 107 ++++++++++++++++-------
 lib/ssl/test/ssl_api_SUITE.erl     | 136 ++++++++++++++++++++++-------
 lib/ssl/test/ssl_basic_SUITE.erl   |  48 +++++++---
 lib/ssl/test/ssl_reject_SUITE.erl  |   7 +-
 lib/ssl/test/ssl_session_SUITE.erl |  13 ++-
 lib/ssl/test/tls_api_SUITE.erl     |  16 +++-
 7 files changed, 256 insertions(+), 95 deletions(-)

diff --git a/lib/ssl/src/ssl_cipher.erl b/lib/ssl/src/ssl_cipher.erl
index fc250c01ba..11d57ddc50 100644
--- a/lib/ssl/src/ssl_cipher.erl
+++ b/lib/ssl/src/ssl_cipher.erl
@@ -322,20 +322,26 @@ suites(Version) when ?TLS_1_X(Version) ->
     tls_v1:suites(Version);
 suites(Version) when ?DTLS_1_X(Version) ->
     dtls_v1:suites(Version).
+
 all_suites(?TLS_1_3 = Version) ->
-    suites(Version) ++ tls_legacy_suites(?TLS_1_2);
-all_suites(Version) when ?TLS_1_X(Version) ->
-    suites(Version) ++ tls_legacy_suites(Version);
+    suites(Version) ++ tls_legacy_suites(?TLS_1_2)  ++ tls_v1:exclusive_suites(?TLS_1_0);
+all_suites(?TLS_1_2 = Version) ->
+    suites(Version) ++ tls_legacy_suites(Version) ++ tls_v1:exclusive_suites(?TLS_1_0);
+all_suites(?TLS_1_1 = Version) ->
+    suites(Version) ++ tls_legacy_suites(Version) ++ tls_v1:cbc_suites(Version);
+all_suites(?TLS_1_0 = Version) ->
+    suites(Version) ++ tls_legacy_suites(Version) ++ tls_v1:cbc_suites(Version);
 all_suites(Version) ->
     dtls_v1:all_suites(Version).
 
 tls_legacy_suites(Version) ->
-    Tests = [fun tls_v1:psk_suites/1,
-             fun tls_v1:srp_suites/1,
-             fun tls_v1:rsa_suites/1,
-             fun tls_v1:des_suites/1,
-             fun tls_v1:rc4_suites/1],
-    lists:flatmap(fun (Fun) -> Fun(Version) end, Tests).
+    LegacySuites = [fun tls_v1:cbc_suites/1,
+                    fun tls_v1:psk_suites/1,
+                    fun tls_v1:srp_suites/1,
+                    fun tls_v1:rsa_suites/1,
+                    fun tls_v1:des_suites/1,
+                    fun tls_v1:rc4_suites/1],
+    lists:flatmap(fun (Fun) -> Fun(Version) end, LegacySuites).
 
 %%--------------------------------------------------------------------
 -spec anonymous_suites(ssl_record:ssl_version()) -> [ssl_cipher_format:cipher_suite()].
diff --git a/lib/ssl/src/tls_v1.erl b/lib/ssl/src/tls_v1.erl
index 11ec33ad10..b770d1ef3e 100644
--- a/lib/ssl/src/tls_v1.erl
+++ b/lib/ssl/src/tls_v1.erl
@@ -40,6 +40,7 @@
          suites/1,
          exclusive_suites/1,
          exclusive_anonymous_suites/1,
+         cbc_suites/1,
          psk_suites/1,
          psk_exclusive/1,
          psk_suites_anon/1,
@@ -503,15 +504,51 @@ mac_hash(Method, Mac_write_secret, Seq_num, Type, Version,Length, Fragment) ->
 -spec suites(ssl_record:ssl_version()) -> [ssl_cipher_format:cipher_suite()].
 
 suites(Version) when ?TLS_1_X(Version) ->
-    lists:flatmap(fun exclusive_suites/1, suites_to_test(Version)).
+    lists:flatmap(fun default_suites/1, suites_in_version(Version)).
 
-suites_to_test(?TLS_1_0) -> [?TLS_1_0];
-suites_to_test(?TLS_1_1) -> [?TLS_1_0];
-suites_to_test(?TLS_1_2) -> [?TLS_1_2, ?TLS_1_0];
-suites_to_test(?TLS_1_3) -> [?TLS_1_3, ?TLS_1_2, ?TLS_1_0].
+suites_in_version(?TLS_1_0) -> [?TLS_1_0];
+suites_in_version(?TLS_1_1) -> [?TLS_1_0];
+suites_in_version(?TLS_1_2) -> [?TLS_1_2];
+suites_in_version(?TLS_1_3) -> [?TLS_1_3, ?TLS_1_2].
 
 -spec exclusive_suites(ssl_record:ssl_version()) -> [ssl_cipher_format:cipher_suite()].
 
+default_suites(?TLS_1_3 = Version) ->
+    exclusive_suites(Version);
+default_suites(?TLS_1_2) ->
+    [?TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384,
+     ?TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384,
+
+     ?TLS_ECDHE_ECDSA_WITH_AES_256_CCM,
+     ?TLS_ECDHE_ECDSA_WITH_AES_256_CCM_8,
+
+     ?TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256,
+     ?TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256,
+
+     ?TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256,
+     ?TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256,
+
+     ?TLS_ECDHE_ECDSA_WITH_AES_128_CCM,
+     ?TLS_ECDHE_ECDSA_WITH_AES_128_CCM_8,
+
+     ?TLS_ECDH_ECDSA_WITH_AES_256_GCM_SHA384,
+     ?TLS_ECDH_RSA_WITH_AES_256_GCM_SHA384,
+
+     ?TLS_ECDH_ECDSA_WITH_AES_128_GCM_SHA256,
+     ?TLS_ECDH_RSA_WITH_AES_128_GCM_SHA256,
+
+     ?TLS_DHE_RSA_WITH_AES_256_GCM_SHA384,
+     ?TLS_DHE_DSS_WITH_AES_256_GCM_SHA384,
+
+     ?TLS_DHE_RSA_WITH_AES_128_GCM_SHA256,
+     ?TLS_DHE_DSS_WITH_AES_128_GCM_SHA256,
+
+     ?TLS_DHE_RSA_WITH_CHACHA20_POLY1305_SHA256
+    ];
+default_suites(Version) when Version == ?TLS_1_1;
+                             Version == ?TLS_1_0 ->
+    exclusive_suites(?TLS_1_0).
+
 exclusive_suites(?TLS_1_3) ->
     [?TLS_AES_256_GCM_SHA384,
      ?TLS_AES_128_GCM_SHA256,
@@ -528,9 +565,6 @@ exclusive_suites(?TLS_1_2) ->
      ?TLS_ECDHE_ECDSA_WITH_AES_256_CCM,
      ?TLS_ECDHE_ECDSA_WITH_AES_256_CCM_8,
 
-     ?TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384,
-     ?TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384,
-
      ?TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256,
      ?TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256,
 
@@ -543,32 +577,16 @@ exclusive_suites(?TLS_1_2) ->
      ?TLS_ECDH_ECDSA_WITH_AES_256_GCM_SHA384,
      ?TLS_ECDH_RSA_WITH_AES_256_GCM_SHA384,
 
-     ?TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA384,
-     ?TLS_ECDH_RSA_WITH_AES_256_CBC_SHA384,
-
      ?TLS_ECDH_ECDSA_WITH_AES_128_GCM_SHA256,
      ?TLS_ECDH_RSA_WITH_AES_128_GCM_SHA256,
 
-     ?TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256,
-     ?TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256,
-
-     ?TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA256,
-     ?TLS_ECDH_RSA_WITH_AES_128_CBC_SHA256,
-
      ?TLS_DHE_RSA_WITH_AES_256_GCM_SHA384,
      ?TLS_DHE_DSS_WITH_AES_256_GCM_SHA384,
 
-     ?TLS_DHE_RSA_WITH_AES_256_CBC_SHA256,
-     ?TLS_DHE_DSS_WITH_AES_256_CBC_SHA256,
-
      ?TLS_DHE_RSA_WITH_AES_128_GCM_SHA256,
      ?TLS_DHE_DSS_WITH_AES_128_GCM_SHA256,
 
-     ?TLS_DHE_RSA_WITH_CHACHA20_POLY1305_SHA256,
-
-     ?TLS_DHE_RSA_WITH_AES_128_CBC_SHA256,
-     ?TLS_DHE_DSS_WITH_AES_128_CBC_SHA256
-
+     ?TLS_DHE_RSA_WITH_CHACHA20_POLY1305_SHA256
      %% not supported
      %% ?TLS_DH_RSA_WITH_AES_256_GCM_SHA384,
      %% ?TLS_DH_DSS_WITH_AES_256_GCM_SHA384,
@@ -578,8 +596,7 @@ exclusive_suites(?TLS_1_2) ->
 exclusive_suites(?TLS_1_1) ->
     [];
 exclusive_suites(?TLS_1_0) ->
-    [
-     ?TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA,
+    [?TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA,
      ?TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA,
 
      ?TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA,
@@ -594,8 +611,7 @@ exclusive_suites(?TLS_1_0) ->
      ?TLS_DHE_RSA_WITH_AES_256_CBC_SHA,
      ?TLS_DHE_DSS_WITH_AES_256_CBC_SHA,
      ?TLS_DHE_RSA_WITH_AES_128_CBC_SHA,
-     ?TLS_DHE_DSS_WITH_AES_128_CBC_SHA
-    ].
+     ?TLS_DHE_DSS_WITH_AES_128_CBC_SHA].
 
 %%--------------------------------------------------------------------
 -spec exclusive_anonymous_suites(ssl_record:ssl_version()) ->
@@ -633,6 +649,31 @@ exclusive_anonymous_suites(?TLS_1_0=Version) ->
          ?TLS_DH_anon_WITH_DES_CBC_SHA
         ] ++ srp_suites_anon(Version).
 
+
+cbc_suites(Version) when ?TLS_1_X(Version) ->
+    cbc_exclusive(Version).
+
+cbc_exclusive(?TLS_1_2) ->
+    [?TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384,
+     ?TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384,
+     ?TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA384,
+     ?TLS_ECDH_RSA_WITH_AES_256_CBC_SHA384,
+     ?TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256,
+     ?TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256,
+     ?TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA256,
+     ?TLS_ECDH_RSA_WITH_AES_128_CBC_SHA256,
+     ?TLS_DHE_RSA_WITH_AES_256_CBC_SHA256,
+     ?TLS_DHE_DSS_WITH_AES_256_CBC_SHA256,
+     ?TLS_DHE_RSA_WITH_AES_128_CBC_SHA256,
+     ?TLS_DHE_DSS_WITH_AES_128_CBC_SHA256
+    ];
+cbc_exclusive(?TLS_1_1) ->
+    %% Only have CBC SUITES
+    %% disabled even though they are legacy
+    [];
+cbc_exclusive(?TLS_1_0) ->
+    [?TLS_DHE_DSS_WITH_3DES_EDE_CBC_SHA].
+
 %%--------------------------------------------------------------------
 -spec psk_suites(ssl_record:ssl_version()) -> [ssl_cipher_format:cipher_suite()].
 %%
@@ -814,11 +855,11 @@ des_exclusive(_) ->
 %% Are not considered secure any more.
 %%--------------------------------------------------------------------
 rsa_suites(Version) when ?TLS_1_X(Version) ->
-    lists:flatmap(fun rsa_exclusive/1, rsa_suites_to_test(Version)).
+    lists:flatmap(fun rsa_exclusive/1, rsa_suites_in_version(Version)).
 
-rsa_suites_to_test(?TLS_1_2) -> [?TLS_1_2, ?TLS_1_0];
-rsa_suites_to_test(?TLS_1_1) -> [?TLS_1_0];
-rsa_suites_to_test(?TLS_1_0) -> [?TLS_1_0].
+rsa_suites_in_version(?TLS_1_2) -> [?TLS_1_2, ?TLS_1_0];
+rsa_suites_in_version(?TLS_1_1) -> [?TLS_1_0];
+rsa_suites_in_version(?TLS_1_0) -> [?TLS_1_0].
 
 -spec rsa_exclusive(Version::ssl_record:ssl_version()) -> [ssl_cipher_format:cipher_suite()].
 rsa_exclusive(?TLS_1_2) ->
diff --git a/lib/ssl/test/ssl_api_SUITE.erl b/lib/ssl/test/ssl_api_SUITE.erl
index 20b017436c..af1b1ac35f 100644
--- a/lib/ssl/test/ssl_api_SUITE.erl
+++ b/lib/ssl/test/ssl_api_SUITE.erl
@@ -114,6 +114,10 @@
          honor_server_cipher_order/1,
          honor_client_cipher_order/0,
          honor_client_cipher_order/1,
+         honor_server_cipher_order_tls12/0,
+         honor_server_cipher_order_tls12/1,
+         honor_client_cipher_order_tls12/0,
+         honor_client_cipher_order_tls12/1,
          honor_client_cipher_order_tls13/0,
          honor_client_cipher_order_tls13/1,
          honor_server_cipher_order_tls13/0,
@@ -249,19 +253,18 @@ groups() ->
      {'tlsv1.3', [], ((gen_api_tests() ++ tls13_group() ++
                            handshake_paus_tests()) --
                           [dh_params,
-                           honor_server_cipher_order,
-                           honor_client_cipher_order,
                            new_options_in_handshake,
                            handshake_continue_tls13_client,
                            invalid_options])
       ++ (since_1_2() -- [conf_signature_algs])},
-     {'tlsv1.2', [],  gen_api_tests() ++ since_1_2() ++ handshake_paus_tests() ++ pre_1_3()},
-     {'tlsv1.1', [],  gen_api_tests() ++ handshake_paus_tests() ++ pre_1_3()},
-     {'tlsv1', [],  gen_api_tests() ++ handshake_paus_tests() ++ pre_1_3() ++ beast_mitigation_test()},
+     {'tlsv1.2', [],  gen_api_tests() ++ since_1_2() ++ handshake_paus_tests() ++ pre_1_3() ++ [honor_client_cipher_order_tls12,
+                                                                                                honor_server_cipher_order_tls12]},
+     {'tlsv1.1', [],  gen_api_tests() ++ handshake_paus_tests() ++ pre_1_3() ++ pre_1_2()},
+     {'tlsv1', [],  gen_api_tests() ++ handshake_paus_tests() ++ pre_1_3() ++ pre_1_2() ++ beast_mitigation_test()},
      {'dtlsv1.2', [], gen_api_tests() -- [new_options_in_handshake, hibernate_server] ++
           handshake_paus_tests() -- [handshake_continue_tls13_client] ++ pre_1_3()},
      {'dtlsv1', [],  gen_api_tests() -- [new_options_in_handshake, hibernate_server] ++
-          handshake_paus_tests() -- [handshake_continue_tls13_client] ++ pre_1_3()}
+          handshake_paus_tests() -- [handshake_continue_tls13_client] ++ pre_1_3() ++ pre_1_2()}
     ].
 
 since_1_2() ->
@@ -277,6 +280,10 @@ pre_1_3() ->
      connection_information_with_srp
     ].
 
+pre_1_2() ->
+    [honor_server_cipher_order,
+     honor_client_cipher_order].
+
 simple_api_tests() ->
     [
      invalid_keyfile,
@@ -289,7 +296,6 @@ simple_api_tests() ->
      format_error
     ].
 
-
 gen_api_tests() ->
     [
      peercert,
@@ -320,9 +326,6 @@ gen_api_tests() ->
      close_in_error_state,
      call_in_error_state,
      close_transport_accept,
-     abuse_transport_accept_socket,
-     honor_server_cipher_order,
-     honor_client_cipher_order,
      ipv6,
      der_input,
      max_handshake_size,
@@ -756,13 +759,18 @@ dh_params(Config) when is_list(Config) ->
     ServerOpts = ssl_test_lib:ssl_options(server_rsa_opts, Config),
     DataDir = proplists:get_value(data_dir, Config),
     DHParamFile = filename:join(DataDir, "dHParam.pem"),
+    Ciphers = ssl:filter_cipher_suites(ssl:cipher_suites(all, 'tlsv1.2'),
+                                       [{key_exchange, fun(srp_rsa)  -> false;
+                                                          (srp_anon) -> false;
+                                                          (srp_dss) -> false;
+                                                          (_) -> true end}]),
 
     {ClientNode, ServerNode, Hostname} = ssl_test_lib:run_where(Config),
     
     Server = ssl_test_lib:start_server([{node, ServerNode}, {port, 0}, 
 					{from, self()}, 
 			   {mfa, {ssl_test_lib, send_recv_result_active, []}},
-			   {options, [{dhfile, DHParamFile} | ServerOpts]}]),
+			   {options, [{dhfile, DHParamFile}, {ciphers, Ciphers} | ServerOpts]}]),
     Port = ssl_test_lib:inet_port(Server),
     Client = ssl_test_lib:start_client([{node, ClientNode}, {port, Port}, 
 					{host, Hostname},
@@ -1117,12 +1125,17 @@ versions_option_based_on_sni(Config) when is_list(Config) ->
     TestVersion = ssl_test_lib:protocol_version(Config),
     {Version, Versions} = test_versions_for_option_based_on_sni(TestVersion),
     {ClientNode, ServerNode, Hostname} = ssl_test_lib:run_where(Config),
+    Ciphers = ssl:filter_cipher_suites(ssl:cipher_suites(all, TestVersion),
+                                       [{key_exchange, fun(srp_rsa) -> false;
+                                                          (srp_dss) -> false;
+                                                          (_) -> true
+                                                       end}]),
 
     SNI = net_adm:localhost(),
     Fun = fun(ServerName) ->
               case ServerName of
                   SNI ->
-                      [{versions, [Version]} | ServerOpts];
+                      [{versions, [Version]}, {ciphers, Ciphers} | ServerOpts];
                   _ ->
                       ServerOpts
               end
@@ -1138,7 +1151,9 @@ versions_option_based_on_sni(Config) when is_list(Config) ->
 					{host, Hostname},
 					{from, self()},
 					{mfa, {ssl_test_lib, no_result, []}},
-					{options, [{server_name_indication, SNI}, {versions, Versions} | ClientOpts]}]),
+					{options, [{server_name_indication, SNI}, {versions, Versions},
+                                                   {ciphers, Ciphers}
+                                                  | ClientOpts]}]),
 
     ssl_test_lib:check_result(Server, ok),
     ssl_test_lib:close(Server),
@@ -1814,24 +1829,77 @@ invalid_keyfile(Config) when is_list(Config) ->
                               {error,{options, {keyfile, File, {error,enoent}}}}, Client,
                               {error, closed}).
 
+%%--------------------------------------------------------------------
+honor_server_cipher_order_tls12() ->
+    [{doc,"Test API honor server cipher order."}].
+honor_server_cipher_order_tls12(Config) when is_list(Config) ->
+    ClientCiphers = [#{key_exchange => ecdhe_rsa,
+                       cipher => aes_128_gcm,
+                       mac => aead,
+                       prf => sha256},
+                     #{key_exchange => ecdhe_rsa,
+                       cipher => aes_256_gcm,
+                       mac => aead,
+                       prf => sha384}],
+    ServerCiphers = [#{key_exchange => ecdhe_rsa,
+                       cipher => aes_256_gcm,
+                       mac => aead,
+                       prf => sha384},
+                     #{key_exchange => ecdhe_rsa,
+                       cipher => aes_128_gcm,
+                       mac => aead,
+                       prf => sha256}],
+    honor_cipher_order(Config, true, ServerCiphers,
+                       ClientCiphers, #{key_exchange => ecdhe_rsa,
+                                        cipher => aes_256_gcm,
+                                        mac => aead,
+                                        prf => sha384}).
+
+%%--------------------------------------------------------------------
+
+honor_client_cipher_order_tls12() ->
+    [{doc,"Test API honor server cipher order."}].
+honor_client_cipher_order_tls12(Config) when is_list(Config) ->
+     ClientCiphers = [#{key_exchange => ecdhe_rsa,
+                       cipher => aes_128_gcm,
+                       mac => aead,
+                       prf => sha256},
+                     #{key_exchange => ecdhe_rsa,
+                       cipher => aes_256_gcm,
+                       mac => aead,
+                       prf => sha384}],
+    ServerCiphers = [#{key_exchange => ecdhe_rsa,
+                       cipher => aes_256_gcm,
+                       mac => aead,
+                       prf => sha384},
+                     #{key_exchange => ecdhe_rsa,
+                       cipher => aes_128_gcm,
+                       mac => aead,
+                       prf => sha256}],
+    honor_cipher_order(Config, false, ServerCiphers,
+                       ClientCiphers, #{key_exchange => ecdhe_rsa,
+                                        cipher => aes_128_gcm,
+                                        mac => aead,
+                                        prf => sha256}).
+
 %%--------------------------------------------------------------------
 honor_server_cipher_order() ->
     [{doc,"Test API honor server cipher order."}].
 honor_server_cipher_order(Config) when is_list(Config) ->
-     ClientCiphers = [#{key_exchange => dhe_rsa, 
-                       cipher => aes_128_cbc, 
+    ClientCiphers = [#{key_exchange => dhe_rsa,
+                       cipher => aes_128_cbc,
                        mac => sha,
-                       prf => default_prf}, 
-                     #{key_exchange => dhe_rsa, 
-                       cipher => aes_256_cbc, 
+                       prf => default_prf},
+                     #{key_exchange => dhe_rsa,
+                       cipher => aes_256_cbc,
                        mac => sha,
                        prf => default_prf}],
-    ServerCiphers = [#{key_exchange => dhe_rsa, 
-                       cipher => aes_256_cbc,   
-                       mac =>sha,
+    ServerCiphers = [#{key_exchange => dhe_rsa,
+                       cipher => aes_256_cbc,
+                       mac => sha,
                        prf => default_prf},
-                     #{key_exchange => dhe_rsa, 
-                       cipher => aes_128_cbc, 
+                     #{key_exchange => dhe_rsa,
+                       cipher => aes_128_cbc,
                        mac => sha,
                        prf => default_prf}],
     honor_cipher_order(Config, true, ServerCiphers,
@@ -1841,23 +1909,24 @@ honor_server_cipher_order(Config) when is_list(Config) ->
                                         prf => default_prf}).
 
 %%--------------------------------------------------------------------
+
 honor_client_cipher_order() ->
     [{doc,"Test API honor server cipher order."}].
 honor_client_cipher_order(Config) when is_list(Config) ->
-    ClientCiphers = [#{key_exchange => dhe_rsa, 
-                       cipher => aes_128_cbc, 
+     ClientCiphers = [#{key_exchange => dhe_rsa,
+                       cipher => aes_128_cbc,
                        mac => sha,
-                       prf => default_prf}, 
-                     #{key_exchange => dhe_rsa, 
-                       cipher => aes_256_cbc, 
+                       prf => default_prf},
+                     #{key_exchange => dhe_rsa,
+                       cipher => aes_256_cbc,
                        mac => sha,
                        prf => default_prf}],
-    ServerCiphers = [#{key_exchange => dhe_rsa, 
-                       cipher => aes_256_cbc,   
-                       mac =>sha,
+    ServerCiphers = [#{key_exchange => dhe_rsa,
+                       cipher => aes_256_cbc,
+                       mac => sha,
                        prf => default_prf},
-                     #{key_exchange => dhe_rsa, 
-                       cipher => aes_128_cbc, 
+                     #{key_exchange => dhe_rsa,
+                       cipher => aes_128_cbc,
                        mac => sha,
                        prf => default_prf}],
     honor_cipher_order(Config, false, ServerCiphers,
@@ -1866,6 +1935,7 @@ honor_client_cipher_order(Config) when is_list(Config) ->
                                         mac => sha,
                                         prf => default_prf}).
 
+
 %%--------------------------------------------------------------------
 ipv6() ->
     [{require, ipv6_hosts},
diff --git a/lib/ssl/test/ssl_basic_SUITE.erl b/lib/ssl/test/ssl_basic_SUITE.erl
index d83427122c..98dc4dff00 100644
--- a/lib/ssl/test/ssl_basic_SUITE.erl
+++ b/lib/ssl/test/ssl_basic_SUITE.erl
@@ -313,12 +313,18 @@ cipher_suites_mix(Config) when is_list(Config) ->
     ClientOpts = ssl_test_lib:ssl_options(client_rsa_verify_opts, Config),
     ServerOpts = ssl_test_lib:ssl_options(server_rsa_verify_opts, Config),
 
+    ServerCipherSuites =  ssl:filter_cipher_suites(ssl:cipher_suites(all, 'tlsv1.3'),
+                                                   [{key_exchange, fun(srp_rsa) -> false;
+                                                                      (srp_dss) -> false;
+                                                                      (_) -> true
+                                                                   end}]),
+
     {ClientNode, ServerNode, Hostname} = ssl_test_lib:run_where(Config),
 
     Server = ssl_test_lib:start_server([{node, ServerNode}, {port, 0},
 					{from, self()},
 					{mfa, {ssl_test_lib, send_recv_result_active, []}},
-					{options, ServerOpts}]),
+					{options, [{ciphers, ServerCipherSuites} | ServerOpts]}]),
     Port = ssl_test_lib:inet_port(Server),
     Client = ssl_test_lib:start_client([{node, ClientNode}, {port, Port},
 					{host, Hostname},
@@ -997,10 +1003,14 @@ anon_chipher_suite_checks(Version) ->
     [_|_] = ssl:cipher_suites(exclusive_anonymous, Version).
 
 chipher_suite_checks(Version) ->
-    MandatoryCipherSuiteTLS1_0TLS1_1 = #{key_exchange => rsa,
-                                         cipher => '3des_ede_cbc',
-                                         mac => sha,
-                                         prf => default_prf},
+    MandatoryCipherSuiteTLS1_0 = #{key_exchange => dhe_dss,
+                                   cipher => '3des_ede_cbc',
+                                   mac => sha,
+                                   prf => default_prf},
+    MandatoryCipherSuiteTLS1_1 = #{key_exchange => rsa,
+                                   cipher => '3des_ede_cbc',
+                                   mac => sha,
+                                   prf => default_prf},
     MandatoryCipherSuiteTLS1_0TLS1_2 = #{key_exchange =>rsa,
                                          cipher => 'aes_128_cbc',
                                          mac => sha,
@@ -1009,6 +1019,7 @@ chipher_suite_checks(Version) ->
     Default = [_|_] = ssl:cipher_suites(default, Version),
     Anonymous = ssl:cipher_suites(anonymous, Version),
     true = length(Default) < length(All),
+
     Filters = [{key_exchange,
                 fun(dhe_rsa) ->
                         true;
@@ -1024,6 +1035,7 @@ chipher_suite_checks(Version) ->
                 end
                },
                {mac,
+
                 fun(sha) ->
                         true;
                    (_) ->
@@ -1037,20 +1049,30 @@ chipher_suite_checks(Version) ->
                prf => default_prf},
     [Cipher] = ssl:filter_cipher_suites(All, Filters),
     [Cipher | Rest0] = ssl:prepend_cipher_suites([Cipher], Default),
-    [Cipher | Rest0] = ssl:prepend_cipher_suites(Filters, Default),
-    true = lists:member(Cipher, Default),
-    false = lists:member(Cipher, Rest0),
+    case (Version == 'tlsv1') orelse (Version == 'tlsv1.1')  orelse (Version == 'dtlsv1') of
+        true ->
+            true = lists:member(Cipher, Default),
+            [Cipher | Rest0] = ssl:prepend_cipher_suites(Filters, Default),
+            false = lists:member(Cipher, Rest0);
+        false ->
+            false = lists:member(Cipher, Default)
+    end,
     [Cipher | Rest1] = lists:reverse(ssl:append_cipher_suites([Cipher], Default)),
-    [Cipher | Rest1] = lists:reverse(ssl:append_cipher_suites(Filters, Default)),
-    true = lists:member(Cipher, Default),
-    false = lists:member(Cipher, Rest1),
+    case (Version == 'tlsv1') orelse (Version == 'tlsv1.1') orelse (Version == 'dtlsv1') of
+        true ->
+            true = lists:member(Cipher, Default),
+            [Cipher | Rest1] = lists:reverse(ssl:append_cipher_suites(Filters, Default)),
+            false = lists:member(Cipher, Rest1);
+         false ->
+            false = lists:member(Cipher, Default)
+    end,
     [] = lists:dropwhile(fun(X) -> not lists:member(X, Default) end, Anonymous),
     [] = lists:dropwhile(fun(X) -> not lists:member(X, All) end, Anonymous),
     case Version of
         tlsv1 ->
-            true = lists:member(MandatoryCipherSuiteTLS1_0TLS1_1, All);
+           true = lists:member(MandatoryCipherSuiteTLS1_0, All);
         'tlsv1.1' ->
-            true = lists:member(MandatoryCipherSuiteTLS1_0TLS1_1, All),
+            true = lists:member(MandatoryCipherSuiteTLS1_1, All),
             true = lists:member(MandatoryCipherSuiteTLS1_0TLS1_2, All);
         'tlsv1.2' ->
             ok;
diff --git a/lib/ssl/test/ssl_reject_SUITE.erl b/lib/ssl/test/ssl_reject_SUITE.erl
index be79e0543b..a18b232f9b 100644
--- a/lib/ssl/test/ssl_reject_SUITE.erl
+++ b/lib/ssl/test/ssl_reject_SUITE.erl
@@ -185,11 +185,16 @@ accept_sslv3_record_hello(Config) when is_list(Config) ->
     Allversions = all_versions(),
 
     AllSigAlgs = ssl:signature_algs(all, 'tlsv1.3'),
+    Ciphers = ssl:filter_cipher_suites(ssl:cipher_suites(all, 'tlsv1.3'),
+                                       [{key_exchange, fun(srp_rsa) -> false;
+                                                          (srp_dss) -> false;
+                                                          (_) -> true
+                                                       end}]),
 
     Server = ssl_test_lib:start_server([{node, ServerNode}, {port, 0},
                                         {from, self()},
                                         {options, [{versions, Allversions}, 
-                                                   {signature_algs, AllSigAlgs} | ServerOpts]}]),
+                                                   {signature_algs, AllSigAlgs}, {ciphers, Ciphers} | ServerOpts]}]),
     Port = ssl_test_lib:inet_port(Server),
 
     %% TLS-1.X Hello with SSL-3.0 record version
diff --git a/lib/ssl/test/ssl_session_SUITE.erl b/lib/ssl/test/ssl_session_SUITE.erl
index 0901539b9c..4041213b3b 100644
--- a/lib/ssl/test/ssl_session_SUITE.erl
+++ b/lib/ssl/test/ssl_session_SUITE.erl
@@ -186,8 +186,14 @@ reuse_session_expired() ->
 reuse_session_expired(Config) when is_list(Config) -> 
     ClientOpts = ssl_test_lib:ssl_options(client_rsa_verify_opts, Config),
     ServerOpts = ssl_test_lib:ssl_options(server_rsa_verify_opts, Config),
+    TestVersion = ssl_test_lib:protocol_version(Config),
     {ClientNode, ServerNode, Hostname} = ssl_test_lib:run_where(Config),
-    
+    Ciphers = ssl:filter_cipher_suites(ssl:cipher_suites(all, TestVersion),
+                                       [{key_exchange, fun(srp_rsa) -> false;
+                                                          (srp_dss) -> false;
+                                                          (_) -> true
+                                                       end}]),
+
     Server0 =
 	ssl_test_lib:start_server([{node, ServerNode}, {port, 0},
 				   {from, self()},
@@ -199,13 +205,14 @@ reuse_session_expired(Config) when is_list(Config) ->
     Client0 = ssl_test_lib:start_client([{node, ClientNode},
                                          {port, Port0}, {host, Hostname},
                                          {mfa, {ssl_test_lib, session_id, []}},
-                                         {from, self()},  {options, [{reuse_sessions, save} | ClientOpts]}]),
+                                         {from, self()},  {options, [{reuse_sessions, save},
+                                                                     {ciphers, Ciphers}| ClientOpts]}]),
     Server0 ! listen,
     
     Client1 = ssl_test_lib:start_client([{node, ClientNode},
                                          {port, Port0}, {host, Hostname},
                                          {mfa, {ssl_test_lib, session_id, []}},
-                                         {from, self()},  {options, ClientOpts}]),    
+                                         {from, self()},  {options,  [{ciphers, Ciphers} | ClientOpts]}]),
     
     SID = receive
               {Client0, Id0} ->
diff --git a/lib/ssl/test/tls_api_SUITE.erl b/lib/ssl/test/tls_api_SUITE.erl
index 11756bf2f7..4c7228a499 100644
--- a/lib/ssl/test/tls_api_SUITE.erl
+++ b/lib/ssl/test/tls_api_SUITE.erl
@@ -305,7 +305,11 @@ tls_upgrade_new_opts_with_sni_fun(Config) when is_list(Config) ->
     TcpOpts = [binary, {reuseaddr, true}],
     Version = ssl_test_lib:protocol_version(Config),
     NewVersions = new_versions(Version),
-    Ciphers =  ssl:filter_cipher_suites(ssl:cipher_suites(all, Version), []),
+    Ciphers =  ssl:filter_cipher_suites(ssl:cipher_suites(all, Version),
+                                        [{key_exchange, fun(srp_rsa) -> false;
+                                                           (srp_dss) -> false;
+                                                           (_) -> true
+                                                        end}]),
 
     NewOpts = [{versions, NewVersions},
                {ciphers, Ciphers},
@@ -729,11 +733,17 @@ tls_dont_crash_on_handshake_garbage(Config) ->
     ServerOpts = ssl_test_lib:ssl_options(server_rsa_opts, Config),
     Version = ssl_test_lib:protocol_version(Config),
     {_ClientNode, ServerNode, Hostname} = ssl_test_lib:run_where(Config),
+    Ciphers = ssl:filter_cipher_suites(ssl:cipher_suites(all, Version),
+                                       [{key_exchange, fun(srp_rsa) -> false;
+                                                          (srp_dss) -> false;
+                                                          (_) -> true
+                                                       end}]),
+
 
     Server = ssl_test_lib:start_server([{node, ServerNode}, {port, 0},
                                         {from, self()},
                                         {mfa, ssl_test_lib, no_result},
-                                        {options, [{versions, [Version]} | ServerOpts]}]),
+                                        {options, [{versions, [Version]}, {ciphers, Ciphers} | ServerOpts]}]),
     Port = ssl_test_lib:inet_port(Server),
 
     {ok, Socket} = gen_tcp:connect(Hostname, Port, [binary, {active, false}]),
@@ -752,7 +762,7 @@ tls_dont_crash_on_handshake_garbage(Config) ->
     case Version of
         'tlsv1.3' ->
             ssl_test_lib:check_server_alert(Server, protocol_version);
-        _  ->
+        _ ->
             ssl_test_lib:check_server_alert(Server, handshake_failure)
     end.
 
-- 
2.35.3

openSUSE Build Service is sponsored by