File 4611-ssl-Correct-OpenSSL-interop-tests.patch of Package erlang

From c0443a50756398b3676c3418d1b50c2217da24c1 Mon Sep 17 00:00:00 2001
From: Ingela Anderton Andin <ingela@erlang.org>
Date: Mon, 8 Nov 2021 11:25:40 +0100
Subject: [PATCH 1/2] ssl: Correct OpenSSL interop tests

Add missing call to wait_for_openssl_server. Also make
sure openssl interop tests honor DTLS group configuration.
---
 lib/ssl/test/openssl_client_cert_SUITE.erl |  5 +-
 lib/ssl/test/openssl_ocsp_SUITE.erl        | 84 +++++++++++-----------
 lib/ssl/test/ssl_cert_tests.erl            |  4 +-
 lib/ssl/test/ssl_test_lib.erl              | 58 +++++++++++----
 4 files changed, 89 insertions(+), 62 deletions(-)

diff --git a/lib/ssl/test/openssl_client_cert_SUITE.erl b/lib/ssl/test/openssl_client_cert_SUITE.erl
index 263628c3c4..6effd69664 100644
--- a/lib/ssl/test/openssl_client_cert_SUITE.erl
+++ b/lib/ssl/test/openssl_client_cert_SUITE.erl
@@ -82,10 +82,10 @@ groups() ->
     [
      {openssl_client, [], protocol_groups()},
      {'tlsv1.3', [], tls_1_3_protocol_groups()},
-     {'tlsv1.2', [], pre_tls_1_3_protocol_groups() ++ [{group, rsa_pss_rsae}, {group, rsa_pss_pss}]},
+     {'tlsv1.2', [], pre_tls_1_3_protocol_groups() ++ [{group, ecdsa}, {group, rsa_pss_rsae}, {group, rsa_pss_pss}]},
      {'tlsv1.1', [], pre_tls_1_3_protocol_groups()},
      {'tlsv1', [], pre_tls_1_3_protocol_groups()},
-     {'dtlsv1.2', [], pre_tls_1_3_protocol_groups()},
+     {'dtlsv1.2', [], pre_tls_1_3_protocol_groups() ++ [{group, ecdsa}]},
      {'dtlsv1', [], pre_tls_1_3_protocol_groups()},
      {rsa, [], all_version_tests()},
      {ecdsa, [], all_version_tests()},
@@ -119,7 +119,6 @@ protocol_groups() ->
 
 pre_tls_1_3_protocol_groups() ->
     [{group, rsa},
-     {group, ecdsa},
      {group, dsa}].
 
 tls_1_3_protocol_groups() ->
diff --git a/lib/ssl/test/openssl_ocsp_SUITE.erl b/lib/ssl/test/openssl_ocsp_SUITE.erl
index f4a68f7543..ec12354b8d 100644
--- a/lib/ssl/test/openssl_ocsp_SUITE.erl
+++ b/lib/ssl/test/openssl_ocsp_SUITE.erl
@@ -145,12 +145,12 @@ ocsp_stapling_basic(Config)
                                        [{options, ServerOpts}], Config),
     Port = ssl_test_lib:inet_port(Server),
 
-    ClientOpts = [{log_level, debug},
-                  {verify, verify_peer},
-                  {cacertfile, CACertsFile},
-                  {server_name_indication, disable},
-                  {ocsp_stapling, true},
-                  {ocsp_nonce, false}] ++ dtls_client_opt(GroupName),
+    ClientOpts = ssl_test_lib:ssl_options([{log_level, debug},
+                                           {verify, verify_peer},
+                                           {cacertfile, CACertsFile},
+                                           {server_name_indication, disable},
+                                           {ocsp_stapling, true},
+                                           {ocsp_nonce, false}], Config),
     Client = ssl_test_lib:start_client(erlang,
                                        [{port, Port},
                                         {options, ClientOpts}], Config),
@@ -175,12 +175,12 @@ ocsp_stapling_with_nonce(Config)
                                        [{options, ServerOpts}], Config),
     Port = ssl_test_lib:inet_port(Server),
 
-    ClientOpts = [{log_level, debug},
-                  {verify, verify_peer},
-                  {cacertfile, CACertsFile},
-                  {server_name_indication, disable},
-                  {ocsp_stapling, true},
-                  {ocsp_nonce, true}] ++ dtls_client_opt(GroupName),
+    ClientOpts = ssl_test_lib:ssl_options([{log_level, debug},
+                                           {verify, verify_peer},
+                                           {cacertfile, CACertsFile},
+                                           {server_name_indication, disable},
+                                           {ocsp_stapling, true},
+                                           {ocsp_nonce, true}], Config),
     Client = ssl_test_lib:start_client(erlang,
                                        [{port, Port},
                                         {options, ClientOpts}], Config),
@@ -212,13 +212,13 @@ ocsp_stapling_with_responder_cert(Config)
     [{'Certificate', Der, _IsEncrypted}] =
         public_key:pem_decode(ResponderCert),
 
-    ClientOpts = [{log_level, debug},
-                  {verify, verify_peer},
-                  {cacertfile, CACertsFile},
-                  {server_name_indication, disable},
-                  {ocsp_stapling, true},
-                  {ocsp_nonce, true},
-                  {ocsp_responder_certs, [Der]}] ++ dtls_client_opt(GroupName),
+    ClientOpts = ssl_test_lib:ssl_options([{log_level, debug},
+                                           {verify, verify_peer},
+                                           {cacertfile, CACertsFile},
+                                           {server_name_indication, disable},
+                                           {ocsp_stapling, true},
+                                           {ocsp_nonce, true},
+                                           {ocsp_responder_certs, [Der]}], Config),
     Client = ssl_test_lib:start_client(erlang,
                                        [{port, Port},
                                         {options, ClientOpts}], Config),
@@ -244,13 +244,13 @@ ocsp_stapling_revoked(Config)
                                        [{options, ServerOpts}], Config),
     Port = ssl_test_lib:inet_port(Server),
 
-    ClientOpts = [{log_level, debug},
-                  {verify, verify_peer},
-                  {server_name_indication, disable},
-                  {cacertfile, CACertsFile},
-                  {ocsp_stapling, true},
-                  {ocsp_nonce, true}
-                 ] ++ dtls_client_opt(GroupName),
+    ClientOpts = ssl_test_lib:ssl_options([{log_level, debug},
+                                           {verify, verify_peer},
+                                           {server_name_indication, disable},
+                                           {cacertfile, CACertsFile},
+                                           {ocsp_stapling, true},
+                                           {ocsp_nonce, true}
+                                          ], Config),
     
     Client = ssl_test_lib:start_client_error([{node, ClientNode},{port, Port},
                                               {host, Hostname}, {from, self()},
@@ -275,13 +275,13 @@ ocsp_stapling_undetermined(Config)
                                        [{options, ServerOpts}], Config),
     Port = ssl_test_lib:inet_port(Server),
 
-    ClientOpts = [{log_level, debug},
-                  {verify, verify_peer},
-                  {server_name_indication, disable},
-                  {cacertfile, CACertsFile},
-                  {ocsp_stapling, true},
-                  {ocsp_nonce, true}
-                 ] ++ dtls_client_opt(GroupName),
+    ClientOpts = ssl_test_lib:ssl_options([{log_level, debug},
+                                           {verify, verify_peer},
+                                           {server_name_indication, disable},
+                                           {cacertfile, CACertsFile},
+                                           {ocsp_stapling, true},
+                                           {ocsp_nonce, true}
+                                          ], Config),
 
     Client = ssl_test_lib:start_client_error([{node, ClientNode},{port, Port},
                                               {host, Hostname}, {from, self()},
@@ -307,13 +307,13 @@ ocsp_stapling_no_staple(Config)
                                        [{options, ServerOpts}], Config),
     Port = ssl_test_lib:inet_port(Server),
 
-    ClientOpts = [{log_level, debug},
-                  {verify, verify_peer},
-                  {server_name_indication, disable},
-                  {cacertfile, CACertsFile},
-                  {ocsp_stapling, true},
-                  {ocsp_nonce, true}
-                 ] ++ dtls_client_opt(GroupName),
+    ClientOpts = ssl_test_lib:ssl_options([{log_level, debug},
+                                           {verify, verify_peer},
+                                           {server_name_indication, disable},
+                                           {cacertfile, CACertsFile},
+                                           {ocsp_stapling, true},
+                                           {ocsp_nonce, true}
+                                          ], Config),
 
     Client = ssl_test_lib:start_client_error([{node, ClientNode},{port, Port},
                                               {host, Hostname}, {from, self()},
@@ -382,7 +382,3 @@ get_free_port() ->
     ok = gen_tcp:close(Listen),
     Port.
 
-dtls_client_opt('dtlsv1.2') ->
-    [{protocol, dtls}];
-dtls_client_opt(_Other) ->
-    [].
\ No newline at end of file
diff --git a/lib/ssl/test/ssl_cert_tests.erl b/lib/ssl/test/ssl_cert_tests.erl
index 2b71998b11..a6760663f8 100644
--- a/lib/ssl/test/ssl_cert_tests.erl
+++ b/lib/ssl/test/ssl_cert_tests.erl
@@ -434,8 +434,8 @@ test_ciphers(_, 'tlsv1.3' = Version) ->
                  end, Ciphers);
 test_ciphers(_, Version) when Version == 'dtlsv1';
                                 Version == 'dtlsv1.2' ->
-    {_, Minor} = dtls_record:proplists(Version),
-    Ciphers = dtls_v1:suites(Minor),
+    {_, Minor} = dtls_record:protocol_version(Version),
+    Ciphers = [ssl_cipher_format:suite_bin_to_map(Bin) ||  Bin <- dtls_v1:suites(Minor)],
     ct:log("Version ~p Testing  ~p~n", [Version, Ciphers]),
     OpenSSLCiphers = openssl_ciphers(),
     ct:log("OpenSSLCiphers ~p~n", [OpenSSLCiphers]),
diff --git a/lib/ssl/test/ssl_test_lib.erl b/lib/ssl/test/ssl_test_lib.erl
index 7ef5034f4b..fb992e8c51 100644
--- a/lib/ssl/test/ssl_test_lib.erl
+++ b/lib/ssl/test/ssl_test_lib.erl
@@ -325,7 +325,7 @@ working_openssl_client() ->
     end.
 
 init_per_group_openssl(GroupName, Config0) ->
-    case is_tls_version(GroupName) andalso sufficient_crypto_support(GroupName) of
+    case is_protocol_version(GroupName) andalso sufficient_crypto_support(GroupName) of
 	true ->
             Config = clean_protocol_version(Config0),
 	    case openssl_tls_version_support(GroupName, Config)
@@ -346,7 +346,7 @@ init_per_group_openssl(GroupName, Config0) ->
     end.
 
 end_per_group(GroupName, Config) ->
-  case is_tls_version(GroupName) of
+  case is_protocol_version(GroupName) of
       true ->
           clean_protocol_version(Config);
       false ->
@@ -373,6 +373,8 @@ openssl_ciphers() ->
 
 openssl_support_rsa_kex() ->
     case portable_cmd("openssl", ["version"]) of
+        "OpenSSL 3." ++ _Rest ->
+            false;
         "OpenSSL 1.1.1" ++ _Rest ->
             false;
         _ ->
@@ -2027,8 +2029,8 @@ accepters(Acc, N) ->
 basic_test(COpts, SOpts, Config) ->
     SType = proplists:get_value(server_type, Config, erlang),
     CType = proplists:get_value(client_type, Config, erlang),
-    {Server, Port} = start_server(SType, COpts, SOpts, Config),
-    Client = start_client(CType, Port, COpts, Config),
+    {Server, Port} = start_server(SType,  COpts, ssl_options(SOpts, Config), Config),
+    Client = start_client(CType, Port, ssl_options(COpts, Config), Config),
     gen_check_result(Server, SType, Client, CType),
     stop(Server, Client).    
 
@@ -2565,31 +2567,48 @@ openssl_tls_version_support(Version, Config0) ->
     CertFile = proplists:get_value(certfile, ServerOpts),
     KeyFile = proplists:get_value(keyfile, ServerOpts),
     Exe = "openssl",
-    Args0 = ["s_server", "-accept", 
-            integer_to_list(Port), "-CAfile", CaCertFile,
-            "-cert", CertFile,"-key", KeyFile],
+    {Proto, Opts} = case is_tls_version(Version) of
+                        true ->
+                            {tls, [{protocol,tls}, {versions, [Version]}]};
+                        false ->
+                            {dtls, [{protocol,dtls}, {versions, [Version]}]}
+                    end,
+    Args0 = case Proto of
+                tls ->
+                    ["s_server", "-accept",
+                     integer_to_list(Port), "-CAfile", CaCertFile,
+                     "-cert", CertFile,"-key", KeyFile];
+                dtls ->
+                    ["s_server", "-accept",
+                     integer_to_list(Port), "-dtls", "-CAfile", CaCertFile,
+                     "-cert", CertFile,"-key", KeyFile]
+            end,
     Args = maybe_force_ipv4(Args0),
     OpensslPort = portable_open_port(Exe, Args),
 
-    try wait_for_openssl_server(Port, tls) of
+    try wait_for_openssl_server(Port, Proto) of
         ok ->
-            case  ssl:connect("localhost", Port, [{versions, [Version]}]) of
+            case  ssl:connect("localhost", Port, Opts, 5000) of
                 {ok, Socket} ->
                     ssl:close(Socket),
                     close_port(OpensslPort),
                     true;
                 {error, {tls_alert, {protocol_version, _}}} ->
-                    ct:pal("Openssl does not support ~p", [Version]),
+                    ct:pal("OpenSSL does not support ~p", [Version]),
                     close_port(OpensslPort),
                     false;
                 {error, {tls_alert, Alert}} ->
-                    ct:pal("Openssl returned alert ~p", [Alert]),
+                    ct:pal("OpenSSL returned alert ~p", [Alert]),
+                    close_port(OpensslPort),
+                    false;
+                {error, timeout} ->
+                    ct:pal("Timed out conntion to OpenSSL", []),
                     close_port(OpensslPort),
                     false
             end
     catch
         _:_ ->
-            ct:pal("Openssl does not support ~p", [Version]),
+            ct:pal("OpenSSL does not support ~p", [Version]),
             close_port(OpensslPort),
             false
     end.
@@ -3100,7 +3119,9 @@ check_sane_openssl_renegotiate(Config) ->
     end.
 
 openssl_allows_client_renegotiate(Config) ->
-     case portable_cmd("openssl", ["version"]) of
+    case portable_cmd("openssl", ["version"]) of
+        "OpenSSL 3" ++ _ ->
+            {skip, "OpenSSL does not allow client renegotiation"};
 	"OpenSSL 1.1" ++ _ ->
 	    {skip, "OpenSSL does not allow client renegotiation"};
 	"LibreSSL" ++ _ ->
@@ -3124,8 +3145,11 @@ enough_openssl_crl_support(_) -> true.
 wait_for_openssl_server(Port, tls) ->
     do_wait_for_openssl_tls_server(Port, 10);
 wait_for_openssl_server(_Port, dtls) ->
+    ct:sleep(?SLEEP),
     ok. %% No need to wait for DTLS over UDP server
         %% client will retransmitt until it is up.
+        %% But wait a little for openssl debug printing
+
 
 do_wait_for_openssl_tls_server(_, 0) ->
     exit(failed_to_connect_to_openssl);
@@ -3868,6 +3892,14 @@ default_ciphers(Version) ->
         case portable_cmd("openssl", ["version"]) of
             "OpenSSL 0.9" ++ _ ->
                 ssl:cipher_suites(all,Version);
+            "OpenSSL 3." ++ _ ->
+                ssl:filter_cipher_suites(ssl:cipher_suites(default, Version),
+                                         [{mac,
+                                           fun(sha) ->
+                                                   false;
+                                              (_) ->
+                                                   true
+                                           end}]);
             _ ->
                 ssl:cipher_suites(default, Version)
         end, 
-- 
2.31.1

openSUSE Build Service is sponsored by