From ae29f5f18443d758a984aeca36e3917463beb173 Mon Sep 17 00:00:00 2001
From: Ingela Anderton Andin <ingela@erlang.org>
Date: Tue, 7 Feb 2017 22:10:18 +0100
Subject: dtls: Enable some DTLS tests in ssl_to_openssl_SUITE

We need to figure out a good way of knowing if the OpenSSL-"DTLS server" is up.
Some of the code in this commit is attempting this, but it is not really working
yet, and hence only tests where OpenSSL is client are enabled.
---
 lib/ssl/test/ssl_test_lib.erl         | 110 ++++++++++++++++++++++++++++++++--
 lib/ssl/test/ssl_to_openssl_SUITE.erl |  56 ++++++++++++-----
 2 files changed, 144 insertions(+), 22 deletions(-)

(limited to 'lib/ssl')

diff --git a/lib/ssl/test/ssl_test_lib.erl b/lib/ssl/test/ssl_test_lib.erl
index 4933dd332a..ef5de382a4 100644
--- a/lib/ssl/test/ssl_test_lib.erl
+++ b/lib/ssl/test/ssl_test_lib.erl
@@ -1197,19 +1197,37 @@ check_sane_openssl_version(Version) ->
 enough_openssl_crl_support("OpenSSL 0." ++ _) -> false;
 enough_openssl_crl_support(_) -> true.
 
-wait_for_openssl_server(Port) ->
-    wait_for_openssl_server(Port, 10).
-wait_for_openssl_server(_, 0) ->
+wait_for_openssl_server(Port, tls) ->
+    do_wait_for_openssl_tls_server(Port, 10);
+wait_for_openssl_server(Port, dtls) ->
+    do_wait_for_openssl_dtls_server(Port, 10).
+
+do_wait_for_openssl_tls_server(_, 0) ->
     exit(failed_to_connect_to_openssl);
-wait_for_openssl_server(Port, N) ->
+do_wait_for_openssl_tls_server(Port, N) ->
     case gen_tcp:connect("localhost", Port, []) of
 	{ok, S} ->
 	    gen_tcp:close(S);
 	_  ->
 	    ct:sleep(?SLEEP),
-	    wait_for_openssl_server(Port, N-1)
+	    do_wait_for_openssl_tls_server(Port, N-1)
     end.
 
+do_wait_for_openssl_dtls_server(_, 0) ->
+    %%exit(failed_to_connect_to_openssl);
+    ok;
+do_wait_for_openssl_dtls_server(Port, N) ->
+    %% case gen_udp:open(0) of
+    %%     {ok, S} ->
+    %%         gen_udp:connect(S, "localhost", Port),
+    %%         gen_udp:close(S);
+    %%     _  ->
+    %%         ct:sleep(?SLEEP),
+    %%         do_wait_for_openssl_dtls_server(Port, N-1)
+    %% end.
+    ct:sleep(500),
+    do_wait_for_openssl_dtls_server(Port, N-1).
+
 version_flag(tlsv1) ->
     "-tls1";
 version_flag('tlsv1.1') ->
@@ -1219,7 +1237,11 @@ version_flag('tlsv1.2') ->
 version_flag(sslv3) ->
     "-ssl3";
 version_flag(sslv2) ->
-    "-ssl2".
+    "-ssl2";
+version_flag('dtlsv1.2') ->
+    "-dtls1_2";
+version_flag('dtlsv1') ->
+    "-dtls1".
 
 filter_suites(Ciphers0, AtomVersion) ->
     Version = tls_version(AtomVersion),
@@ -1372,3 +1394,79 @@ tls_version('dtlsv1.2' = Atom) ->
     dtls_v1:corresponding_tls_version(dtls_record:protocol_version(Atom));
 tls_version(Atom) ->
     tls_record:protocol_version(Atom).
+
+dtls_hello() ->
+    [1,
+     <<0,1,4>>,
+     <<0,0>>,
+     <<0,0,0>>,
+     <<0,1,4>>,
+     <<254,253,88,
+       156,129,61,
+       131,216,15,
+       131,194,242,
+       46,154,190,
+       20,228,234,
+       234,150,44,
+       62,96,96,103,
+       127,95,103,
+       23,24,42,138,
+       13,142,32,57,
+       230,177,32,
+       210,154,152,
+       188,121,134,
+       136,53,105,
+       118,96,106,
+       103,231,223,
+       133,10,165,
+       50,32,211,
+       227,193,14,
+       181,143,48,
+       66,0,0,100,0,
+       255,192,44,
+       192,48,192,
+       36,192,40,
+       192,46,192,
+       50,192,38,
+       192,42,0,159,
+       0,163,0,107,
+       0,106,0,157,
+       0,61,192,43,
+       192,47,192,
+       35,192,39,
+       192,45,192,
+       49,192,37,
+       192,41,0,158,
+       0,162,0,103,
+       0,64,0,156,0,
+       60,192,10,
+       192,20,0,57,
+       0,56,192,5,
+       192,15,0,53,
+       192,8,192,18,
+       0,22,0,19,
+       192,3,192,13,
+       0,10,192,9,
+       192,19,0,51,
+       0,50,192,4,
+       192,14,0,47,
+       1,0,0,86,0,0,
+       0,14,0,12,0,
+       0,9,108,111,
+       99,97,108,
+       104,111,115,
+       116,0,10,0,
+       58,0,56,0,14,
+       0,13,0,25,0,
+       28,0,11,0,12,
+       0,27,0,24,0,
+       9,0,10,0,26,
+       0,22,0,23,0,
+       8,0,6,0,7,0,
+       20,0,21,0,4,
+       0,5,0,18,0,
+       19,0,1,0,2,0,
+       3,0,15,0,16,
+       0,17,0,11,0,
+       2,1,0>>].
+
diff --git a/lib/ssl/test/ssl_to_openssl_SUITE.erl b/lib/ssl/test/ssl_to_openssl_SUITE.erl
index e99340822d..de56aa133a 100644
--- a/lib/ssl/test/ssl_to_openssl_SUITE.erl
+++ b/lib/ssl/test/ssl_to_openssl_SUITE.erl
@@ -42,7 +42,9 @@ all() ->
      {group, 'tlsv1.2'},
      {group, 'tlsv1.1'},
      {group, 'tlsv1'},
-     {group, 'sslv3'}
+     {group, 'sslv3'},
+     {group, 'dtlsv1.2'},
+     {group, 'dtlsv1'}
     ].
 
 groups() ->
@@ -50,7 +52,10 @@ groups() ->
      {'tlsv1.2', [], all_versions_tests() ++ alpn_tests() ++ npn_tests() ++ sni_server_tests()},
      {'tlsv1.1', [], all_versions_tests() ++ alpn_tests() ++ npn_tests() ++ sni_server_tests()},
      {'tlsv1', [], all_versions_tests()++ alpn_tests() ++ npn_tests() ++ sni_server_tests()},
-     {'sslv3', [], all_versions_tests()}].
+     {'sslv3', [], all_versions_tests()},
+     {'dtlsv1.2', [], dtls_all_versions_tests()},
+     {'dtlsv1', [], dtls_all_versions_tests()}
+    ].
 
 basic_tests() ->
     [basic_erlang_client_openssl_server,
@@ -78,6 +83,24 @@ all_versions_tests() ->
      expired_session,
      ssl2_erlang_server_openssl_client
     ].
+dtls_all_versions_tests() ->
+    [
+     %erlang_client_openssl_server,
+     erlang_server_openssl_client,
+     %erlang_client_openssl_server_dsa_cert,
+     erlang_server_openssl_client_dsa_cert,
+     erlang_server_openssl_client_reuse_session
+     %erlang_client_openssl_server_renegotiate,
+     %erlang_client_openssl_server_nowrap_seqnum,
+     %erlang_server_openssl_client_nowrap_seqnum,
+     %erlang_client_openssl_server_no_server_ca_cert,
+     %erlang_client_openssl_server_client_cert,
+     %erlang_server_openssl_client_client_cert
+     %ciphers_rsa_signed_certs,
+     %ciphers_dsa_signed_certs,
+     %erlang_client_bad_openssl_server,
+     %expired_session
+    ].
 
 alpn_tests() ->
     [erlang_client_alpn_openssl_server_alpn,
@@ -284,7 +307,8 @@ basic_erlang_client_openssl_server(Config) when is_list(Config) ->
 
     OpensslPort = ssl_test_lib:portable_open_port(Exe, Args), 
 
-    ssl_test_lib:wait_for_openssl_server(Port),
+
+    ssl_test_lib:wait_for_openssl_server(Port, tls),
 
     Client = ssl_test_lib:start_client([{node, ClientNode}, {port, Port}, 
 					{host, Hostname},
@@ -357,7 +381,7 @@ erlang_client_openssl_server(Config) when is_list(Config) ->
 	
     OpensslPort =  ssl_test_lib:portable_open_port(Exe, Args), 
 
-    ssl_test_lib:wait_for_openssl_server(Port),
+    ssl_test_lib:wait_for_openssl_server(Port, proplists:get_value(protocol, Config)),
 
     Client = ssl_test_lib:start_client([{node, ClientNode}, {port, Port}, 
 					{host, Hostname},
@@ -431,7 +455,7 @@ erlang_client_openssl_server_dsa_cert(Config) when is_list(Config) ->
 
     OpensslPort =  ssl_test_lib:portable_open_port(Exe, Args), 
 
-    ssl_test_lib:wait_for_openssl_server(Port),
+    ssl_test_lib:wait_for_openssl_server(Port, proplists:get_value(protocol, Config)),
 
     Client = ssl_test_lib:start_client([{node, ClientNode}, {port, Port}, 
 					{host, Hostname},
@@ -551,7 +575,7 @@ erlang_client_openssl_server_renegotiate(Config) when is_list(Config) ->
     
     OpensslPort =  ssl_test_lib:portable_open_port(Exe, Args), 
 
-    ssl_test_lib:wait_for_openssl_server(Port),
+    ssl_test_lib:wait_for_openssl_server(Port, proplists:get_value(protocol, Config)),
 
     Client = ssl_test_lib:start_client([{node, ClientNode}, {port, Port}, 
 					{host, Hostname},
@@ -600,7 +624,7 @@ erlang_client_openssl_server_nowrap_seqnum(Config) when is_list(Config) ->
     
     OpensslPort = ssl_test_lib:portable_open_port(Exe, Args),
 
-    ssl_test_lib:wait_for_openssl_server(Port),
+    ssl_test_lib:wait_for_openssl_server(Port, proplists:get_value(protocol, Config)),
 
     Client = ssl_test_lib:start_client([{node, ClientNode}, {port, Port}, 
 					{host, Hostname},
@@ -681,7 +705,7 @@ erlang_client_openssl_server_no_server_ca_cert(Config) when is_list(Config) ->
     
     OpensslPort =  ssl_test_lib:portable_open_port(Exe, Args), 
  
-    ssl_test_lib:wait_for_openssl_server(Port),
+    ssl_test_lib:wait_for_openssl_server(Port, proplists:get_value(protocol, Config)),
 
     Client = ssl_test_lib:start_client([{node, ClientNode}, {port, Port}, 
 					{host, Hostname},
@@ -724,7 +748,7 @@ erlang_client_openssl_server_client_cert(Config) when is_list(Config) ->
     
     OpensslPort = ssl_test_lib:portable_open_port(Exe, Args),   
 
-    ssl_test_lib:wait_for_openssl_server(Port),
+    ssl_test_lib:wait_for_openssl_server(Port, proplists:get_value(protocol, Config)),
 
     Client = ssl_test_lib:start_client([{node, ClientNode}, {port, Port}, 
 					{host, Hostname},
@@ -856,7 +880,7 @@ erlang_client_bad_openssl_server(Config) when is_list(Config) ->
  	"-cert", CertFile, "-key", KeyFile],
     OpensslPort = ssl_test_lib:portable_open_port(Exe, Args), 
     
-    ssl_test_lib:wait_for_openssl_server(Port),
+    ssl_test_lib:wait_for_openssl_server(Port, proplists:get_value(protocol, Config)),
     
     Client0 = ssl_test_lib:start_client([{node, ClientNode}, {port, Port}, 
 					 {host, Hostname},
@@ -911,7 +935,7 @@ expired_session(Config) when is_list(Config) ->
     
     OpensslPort = ssl_test_lib:portable_open_port(Exe, Args), 
 
-    ssl_test_lib:wait_for_openssl_server(Port),
+    ssl_test_lib:wait_for_openssl_server(Port, tls),
     
     Client0 =
 	ssl_test_lib:start_client([{node, ClientNode}, 
@@ -1399,7 +1423,7 @@ cipher(CipherSuite, Version, Config, ClientOpts, ServerOpts) ->
 
     OpenSslPort =  ssl_test_lib:portable_open_port(Exe, Args), 
 
-    ssl_test_lib:wait_for_openssl_server(Port),
+    ssl_test_lib:wait_for_openssl_server(Port, proplists:get_value(protocol, Config)),
 
     ConnectionInfo = {ok, {Version, CipherSuite}},
 
@@ -1469,7 +1493,7 @@ start_erlang_client_and_openssl_server_with_opts(Config, ErlangClientOpts, Opens
 		   
     OpensslPort = ssl_test_lib:portable_open_port(Exe, Args),  
 
-    ssl_test_lib:wait_for_openssl_server(Port),
+    ssl_test_lib:wait_for_openssl_server(Port, proplists:get_value(protocol, Config)),
 
     Client = ssl_test_lib:start_client([{node, ClientNode}, {port, Port},
                     {host, Hostname},
@@ -1505,7 +1529,7 @@ start_erlang_client_and_openssl_server_for_alpn_negotiation(Config, Data, Callba
     Args = ["s_server", "-msg", "-alpn", "http/1.1,spdy/2", "-accept", integer_to_list(Port), ssl_test_lib:version_flag(Version),
 	    "-cert", CertFile, "-key", KeyFile],
     OpensslPort = ssl_test_lib:portable_open_port(Exe, Args),  
-    ssl_test_lib:wait_for_openssl_server(Port),
+    ssl_test_lib:wait_for_openssl_server(Port, proplists:get_value(protocol, Config)),
 
     Client = ssl_test_lib:start_client([{node, ClientNode}, {port, Port},
                     {host, Hostname},
@@ -1574,7 +1598,7 @@ start_erlang_client_and_openssl_server_for_alpn_npn_negotiation(Config, Data, Ca
 
     OpensslPort = ssl_test_lib:portable_open_port(Exe, Args),  
 
-    ssl_test_lib:wait_for_openssl_server(Port),
+    ssl_test_lib:wait_for_openssl_server(Port, proplists:get_value(protocol, Config)),
 
     Client = ssl_test_lib:start_client([{node, ClientNode}, {port, Port},
                     {host, Hostname},
@@ -1639,7 +1663,7 @@ start_erlang_client_and_openssl_server_for_npn_negotiation(Config, Data, Callbac
 	    "-cert", CertFile, "-key", KeyFile],
     OpensslPort = ssl_test_lib:portable_open_port(Exe, Args),  
 
-    ssl_test_lib:wait_for_openssl_server(Port),
+    ssl_test_lib:wait_for_openssl_server(Port, proplists:get_value(protocol, Config)),
 
     Client = ssl_test_lib:start_client([{node, ClientNode}, {port, Port},
                     {host, Hostname},
-- 
cgit v1.2.3