diff options
Diffstat (limited to 'lib/ssl/test')
| -rw-r--r-- | lib/ssl/test/ssl_basic_SUITE.erl | 358 | ||||
| -rw-r--r-- | lib/ssl/test/ssl_cipher_SUITE.erl | 66 | ||||
| -rw-r--r-- | lib/ssl/test/ssl_handshake_SUITE.erl | 3 | ||||
| -rw-r--r-- | lib/ssl/test/ssl_packet_SUITE.erl | 352 | ||||
| -rw-r--r-- | lib/ssl/test/ssl_payload_SUITE.erl | 57 | ||||
| -rw-r--r-- | lib/ssl/test/ssl_test_lib.erl | 32 | ||||
| -rw-r--r-- | lib/ssl/test/ssl_to_openssl_SUITE.erl | 598 | 
7 files changed, 774 insertions, 692 deletions
| diff --git a/lib/ssl/test/ssl_basic_SUITE.erl b/lib/ssl/test/ssl_basic_SUITE.erl index 5a52917d6c..93f7209aea 100644 --- a/lib/ssl/test/ssl_basic_SUITE.erl +++ b/lib/ssl/test/ssl_basic_SUITE.erl @@ -27,9 +27,11 @@  -include_lib("common_test/include/ct.hrl").  -include_lib("public_key/include/public_key.hrl"). +-include("ssl_internal.hrl").  -include("ssl_alert.hrl").  -include("ssl_internal.hrl").  -include("ssl_record.hrl"). +-include("ssl_handshake.hrl").  -define('24H_in_sec', 86400).    -define(TIMEOUT, 60000). @@ -54,7 +56,6 @@ init_per_suite(Config0) ->      try crypto:start() of  	ok ->  	    application:start(public_key), -	    ssl:start(),  	    %% make rsa certs using oppenssl  	    Result = @@ -91,46 +92,28 @@ end_per_suite(_Config) ->  %% variable, but should NOT alter/remove any existing entries.  %% Description: Initialization before each test case  %%-------------------------------------------------------------------- -init_per_testcase(session_cache_process_list, Config) -> -    init_customized_session_cache(list, Config); - -init_per_testcase(session_cache_process_mnesia, Config) -> -    mnesia:start(), -    init_customized_session_cache(mnesia, Config); - -init_per_testcase(reuse_session_expired, Config0) -> -    Config = lists:keydelete(watchdog, 1, Config0), -    Dog = ssl_test_lib:timetrap(?EXPIRE * 1000 * 5), -    ssl:stop(), -    application:load(ssl), -    application:set_env(ssl, session_lifetime, ?EXPIRE), -    ssl:start(), -    [{watchdog, Dog} | Config]; -  init_per_testcase(no_authority_key_identifier, Config) ->      %% Clear cach so that root cert will not      %% be found. -    ssl:stop(), -    ssl:start(),  +    ssl:clear_pem_cache(),      Config; -init_per_testcase(TestCase, Config) when TestCase == ciphers_rsa_signed_certs_ssl3;  -					 TestCase == ciphers_rsa_signed_certs_openssl_names_ssl3; -					 TestCase == ciphers_dsa_signed_certs_ssl3;  -					 TestCase == ciphers_dsa_signed_certs_openssl_names_ssl3 -> +init_per_testcase(protocol_versions, Config)  ->      ssl:stop(),      application:load(ssl), -    application:set_env(ssl, protocol_version, sslv3), +    %% For backwards compatibility sslv2 should be filtered out. +    application:set_env(ssl, protocol_version, [sslv2, sslv3, tlsv1]),      ssl:start(),      Config; -init_per_testcase(protocol_versions, Config)  -> +init_per_testcase(reuse_session_expired, Config0) -> +    Config = lists:keydelete(watchdog, 1, Config0), +    Dog = ssl_test_lib:timetrap(?EXPIRE * 1000 * 5),      ssl:stop(),      application:load(ssl), -    %% For backwards compatibility sslv2 should be filtered out. -    application:set_env(ssl, protocol_version, [sslv2, sslv3, tlsv1]), +    application:set_env(ssl, session_lifetime, ?EXPIRE),      ssl:start(), -    Config; +    [{watchdog, Dog} | Config];  init_per_testcase(empty_protocol_versions, Config)  ->      ssl:stop(), @@ -139,24 +122,15 @@ init_per_testcase(empty_protocol_versions, Config)  ->      ssl:start(),      Config; -init_per_testcase(different_ca_peer_sign, Config0) -> -    ssl_test_lib:make_mix_cert(Config0); +%% init_per_testcase(different_ca_peer_sign, Config0) -> +%%     ssl_test_lib:make_mix_cert(Config0);  init_per_testcase(_TestCase, Config0) -> +    test_server:format("TLS/SSL version ~p~n ", [ssl_record:supported_protocol_versions()]),      Config = lists:keydelete(watchdog, 1, Config0),      Dog = test_server:timetrap(?TIMEOUT),     [{watchdog, Dog} | Config]. -init_customized_session_cache(Type, Config0) -> -    Config = lists:keydelete(watchdog, 1, Config0), -    Dog = test_server:timetrap(?TIMEOUT), -    ssl:stop(), -    application:load(ssl), -    application:set_env(ssl, session_cb, ?MODULE), -    application:set_env(ssl, session_cb_init_args, [Type]), -    ssl:start(), -    [{watchdog, Dog} | Config]. -  %%--------------------------------------------------------------------  %% Function: end_per_testcase(TestCase, Config) -> _  %% Case - atom() @@ -165,27 +139,10 @@ init_customized_session_cache(Type, Config0) ->  %%   A list of key/value pairs, holding the test case configuration.  %% Description: Cleanup after each test case  %%-------------------------------------------------------------------- -end_per_testcase(session_cache_process_list, Config) -> -    application:unset_env(ssl, session_cb), -    end_per_testcase(default_action, Config); -end_per_testcase(session_cache_process_mnesia, Config) -> -    application:unset_env(ssl, session_cb), -    application:unset_env(ssl, session_cb_init_args), -    mnesia:stop(), -    ssl:stop(), -    ssl:start(), -    end_per_testcase(default_action, Config);  end_per_testcase(reuse_session_expired, Config) ->      application:unset_env(ssl, session_lifetime),      end_per_testcase(default_action, Config); -end_per_testcase(TestCase, Config) when TestCase == ciphers_rsa_signed_certs_ssl3;  -					TestCase == ciphers_rsa_signed_certs_openssl_names_ssl3; -					TestCase == ciphers_dsa_signed_certs_ssl3;  -					TestCase == ciphers_dsa_signed_certs_openssl_names_ssl3; -					TestCase == protocol_versions; -					TestCase == empty_protocol_versions-> -    application:unset_env(ssl, protocol_version), -    end_per_testcase(default_action, Config); +  end_per_testcase(_TestCase, Config) ->      Dog = ?config(watchdog, Config),      case Dog of  @@ -206,74 +163,170 @@ end_per_testcase(_TestCase, Config) ->  suite() -> [{ct_hooks,[ts_install_cth]}].  all() ->  -    [app, alerts, connection_info, protocol_versions, -     empty_protocol_versions, controlling_process, -     controller_dies, client_closes_socket, -     connect_dist, peername, peercert, sockname, socket_options, -     invalid_inet_get_option, invalid_inet_get_option_not_list, +    [ +     {group, basic}, +     {group, options}, +     {group, session}, +     {group, 'tlsv1.2'}, +     {group, 'tlsv1.1'}, +     {group, 'tlsv1'}, +     {group, 'sslv3'} +    ]. + +groups() -> +    [{basic, [], basic_tests()}, +     {options, [], options_tests()}, +     {'tlsv1.2', [], all_versions_groups()}, +     {'tlsv1.1', [], all_versions_groups()}, +     {'tlsv1', [], all_versions_groups() ++ rizzo_tests()}, +     {'sslv3', [], all_versions_groups() ++ rizzo_tests()}, +     {api,[], api_tests()}, +     {certificate_verify, [], certificate_verify_tests()}, +     {session, [], session_tests()}, +     {renegotiate, [], renegotiate_tests()}, +     {ciphers, [], cipher_tests()}, +     {error_handling_tests, [], error_handling_tests()} +    ]. + +all_versions_groups ()-> +    [{group, api}, +     {group, certificate_verify}, +     {group, renegotiate}, +     {group, ciphers}, +     {group, error_handling_tests}]. + +init_per_group(GroupName, Config) -> +    case ssl_test_lib:is_tls_version(GroupName) of +	true -> +	    case ssl_test_lib:sufficient_crypto_support(GroupName) of +		true -> +		    ssl_test_lib:init_tls_version(GroupName), +		    Config; +		false -> +		    {skip, "Missing crypto support"} +	    end; +	_ -> +	    ssl:start(), +	    Config +    end. + + +end_per_group(_GroupName, Config) -> +    Config. + +basic_tests() -> +    [app, +     alerts, +     send_close, +     connect_twice, +     connect_dist +    ]. + +options_tests() -> +    [der_input, +     misc_ssl_options, +     socket_options, +     invalid_inet_get_option, +     invalid_inet_get_option_not_list,       invalid_inet_get_option_improper_list, -     invalid_inet_set_option, invalid_inet_set_option_not_list, +     invalid_inet_set_option, +     invalid_inet_set_option_not_list,       invalid_inet_set_option_improper_list, -     misc_ssl_options, versions, cipher_suites, upgrade, -     upgrade_with_timeout, tcp_connect, tcp_connect_big, ipv6, ekeyfile, -     ecertfile, ecacertfile, eoptions, shutdown, -     shutdown_write, shutdown_both, shutdown_error, -     ciphers_rsa_signed_certs, ciphers_rsa_signed_certs_ssl3, -     ciphers_rsa_signed_certs_openssl_names, -     ciphers_rsa_signed_certs_openssl_names_ssl3, -     ciphers_dsa_signed_certs, ciphers_dsa_signed_certs_ssl3, -     ciphers_dsa_signed_certs_openssl_names, -     ciphers_dsa_signed_certs_openssl_names_ssl3, -     anonymous_cipher_suites, -     default_reject_anonymous, -     send_close, -     close_transport_accept, dh_params, -     server_verify_peer_passive, server_verify_peer_active, +     dh_params, +     ecertfile, +     ecacertfile, +     ekeyfile, +     eoptions, +     protocol_versions, +     empty_protocol_versions, +     ipv6, +     reuseaddr]. + +api_tests() -> +    [connection_info, +     peername, +     peercert, +     sockname, +     versions, +     controlling_process, +     upgrade, +     upgrade_with_timeout, +     shutdown, +     shutdown_write, +     shutdown_both, +     shutdown_error, +     hibernate +    ]. + +certificate_verify_tests() -> +    [server_verify_peer_passive, +     server_verify_peer_active,       server_verify_peer_active_once, -     server_verify_none_passive, server_verify_none_active, +     server_verify_none_passive, +     server_verify_none_active,       server_verify_none_active_once, -     server_verify_no_cacerts, server_require_peer_cert_ok, +     server_verify_no_cacerts, +     server_require_peer_cert_ok,       server_require_peer_cert_fail,       server_verify_client_once_passive,       server_verify_client_once_active,       server_verify_client_once_active_once, -     client_verify_none_passive, client_verify_none_active, +     client_verify_none_passive, +     client_verify_none_active,       client_verify_none_active_once, -     reuse_session, -     reuse_session_expired, -     server_does_not_want_to_reuse_session, -     client_renegotiate, server_renegotiate, -     client_renegotiate_reused_session, -     server_renegotiate_reused_session, -     client_no_wrap_sequence_number, -     server_no_wrap_sequence_number, extended_key_usage_verify_peer, +     extended_key_usage_verify_peer,       extended_key_usage_verify_none, -     no_authority_key_identifier, invalid_signature_client, -     invalid_signature_server, cert_expired, +     invalid_signature_client, +     invalid_signature_server, +     cert_expired,       client_with_cert_cipher_suites_handshake,       verify_fun_always_run_client,       verify_fun_always_run_server, -     unknown_server_ca_fail, der_input, +     unknown_server_ca_fail,       unknown_server_ca_accept_verify_none,       unknown_server_ca_accept_verify_peer,       unknown_server_ca_accept_backwardscompatibility, -     %%different_ca_peer_sign, -     no_reuses_session_server_restart_new_cert, -     no_reuses_session_server_restart_new_cert_file, reuseaddr, -     hibernate, connect_twice, renegotiate_dos_mitigate_active, -     renegotiate_dos_mitigate_passive, -     tcp_error_propagation_in_active_mode, rizzo, no_rizzo_rc4, -     recv_error_handling +     no_authority_key_identifier      ]. -groups() ->  -    []. +session_tests() -> +    [reuse_session, +     reuse_session_expired, +     server_does_not_want_to_reuse_session, +     no_reuses_session_server_restart_new_cert, +     no_reuses_session_server_restart_new_cert_file]. -init_per_group(_GroupName, Config) -> -    Config. +renegotiate_tests() -> +    [client_renegotiate, +     server_renegotiate, +     client_renegotiate_reused_session, +     server_renegotiate_reused_session, +     client_no_wrap_sequence_number, +     server_no_wrap_sequence_number, +     renegotiate_dos_mitigate_active, +     renegotiate_dos_mitigate_passive]. -end_per_group(_GroupName, Config) -> -    Config. +cipher_tests() -> +    [cipher_suites, +     ciphers_rsa_signed_certs, +     ciphers_rsa_signed_certs_openssl_names, +     ciphers_dsa_signed_certs, +     ciphers_dsa_signed_certs_openssl_names, +     anonymous_cipher_suites, +     default_reject_anonymous]. + +error_handling_tests()-> +    [controller_dies, +     client_closes_socket, +     tcp_error_propagation_in_active_mode, +     tcp_connect, +     tcp_connect_big, +     close_transport_accept +    ]. + +rizzo_tests() -> +    [rizzo, +     no_rizzo_rc4].  %% Test cases starts here.  %%-------------------------------------------------------------------- @@ -1726,21 +1779,7 @@ ciphers_rsa_signed_certs(Config) when is_list(Config) ->  	ssl_record:protocol_version(ssl_record:highest_protocol_version([])),      Ciphers = ssl_test_lib:rsa_suites(), -    test_server:format("tls1 erlang cipher suites ~p~n", [Ciphers]), -    run_suites(Ciphers, Version, Config, rsa). - -ciphers_rsa_signed_certs_ssl3(doc) ->  -    ["Test all rsa ssl cipher suites in ssl3"]; -        -ciphers_rsa_signed_certs_ssl3(suite) ->  -    []; - -ciphers_rsa_signed_certs_ssl3(Config) when is_list(Config) -> -    Version =  -	ssl_record:protocol_version({3,0}), - -    Ciphers = ssl_test_lib:rsa_suites(), -    test_server:format("ssl3 erlang cipher suites ~p~n", [Ciphers]), +    test_server:format("~p erlang cipher suites ~p~n", [Version, Ciphers]),      run_suites(Ciphers, Version, Config, rsa).  ciphers_rsa_signed_certs_openssl_names(doc) ->  @@ -1757,18 +1796,6 @@ ciphers_rsa_signed_certs_openssl_names(Config) when is_list(Config) ->      run_suites(Ciphers, Version, Config, rsa). -ciphers_rsa_signed_certs_openssl_names_ssl3(doc) ->  -    ["Test all dsa ssl cipher suites in ssl3"]; -        -ciphers_rsa_signed_certs_openssl_names_ssl3(suite) ->  -    []; - -ciphers_rsa_signed_certs_openssl_names_ssl3(Config) when is_list(Config) -> -    Version = ssl_record:protocol_version({3,0}), -    Ciphers = ssl_test_lib:openssl_rsa_suites(), -    run_suites(Ciphers, Version, Config, rsa). - -  ciphers_dsa_signed_certs(doc) ->       ["Test all dsa ssl cipher suites in highest support ssl/tls version"]; @@ -1780,24 +1807,9 @@ ciphers_dsa_signed_certs(Config) when is_list(Config) ->  	ssl_record:protocol_version(ssl_record:highest_protocol_version([])),      Ciphers = ssl_test_lib:dsa_suites(), -    test_server:format("tls1 erlang cipher suites ~p~n", [Ciphers]), +    test_server:format("~p erlang cipher suites ~p~n", [Version, Ciphers]),      run_suites(Ciphers, Version, Config, dsa). -ciphers_dsa_signed_certs_ssl3(doc) ->  -    ["Test all dsa ssl cipher suites in ssl3"]; -        -ciphers_dsa_signed_certs_ssl3(suite) ->  -    []; - -ciphers_dsa_signed_certs_ssl3(Config) when is_list(Config) -> -    Version =  -	ssl_record:protocol_version({3,0}), - -    Ciphers = ssl_test_lib:dsa_suites(), -    test_server:format("ssl3 erlang cipher suites ~p~n", [Ciphers]),   -    run_suites(Ciphers, Version, Config, dsa). -     -  ciphers_dsa_signed_certs_openssl_names(doc) ->       ["Test all dsa ssl cipher suites in highest support ssl/tls version"]; @@ -1812,18 +1824,6 @@ ciphers_dsa_signed_certs_openssl_names(Config) when is_list(Config) ->      test_server:format("tls1 openssl cipher suites ~p~n", [Ciphers]),      run_suites(Ciphers, Version, Config, dsa). - -ciphers_dsa_signed_certs_openssl_names_ssl3(doc) ->  -    ["Test all dsa ssl cipher suites in ssl3"]; -        -ciphers_dsa_signed_certs_openssl_names_ssl3(suite) ->  -    []; - -ciphers_dsa_signed_certs_openssl_names_ssl3(Config) when is_list(Config) -> -    Version = ssl_record:protocol_version({3,0}), -    Ciphers = ssl_test_lib:openssl_dsa_suites(), -    run_suites(Ciphers, Version, Config, dsa). -  anonymous_cipher_suites(doc)->      ["Test the anonymous ciphersuites"];  anonymous_cipher_suites(suite) -> @@ -1860,7 +1860,7 @@ run_suites(Ciphers, Version, Config, Type) ->      end.  erlang_cipher_suite(Suite) when is_list(Suite)-> -    ssl_cipher:suite_definition(ssl_cipher:openssl_suite(Suite)); +    ssl:suite_definition(ssl_cipher:openssl_suite(Suite));  erlang_cipher_suite(Suite) ->      Suite. @@ -2087,7 +2087,9 @@ reuse_session_expired(Config) when is_list(Config) ->      Server ! listen,      %% Make sure session is unregistered due to expiration -    test_server:sleep((?EXPIRE+1) * 1000), +    test_server:sleep((?EXPIRE+1)), +    [{session_id, Id} |_] = SessionInfo, +    make_sure_expired(Hostname, Port, Id),      Client2 =  	ssl_test_lib:start_client([{node, ClientNode},  @@ -2106,6 +2108,22 @@ reuse_session_expired(Config) when is_list(Config) ->      ssl_test_lib:close(Client1),      ssl_test_lib:close(Client2). +make_sure_expired(Host, Port, Id) -> +    {status, _, _, StatusInfo} = sys:get_status(whereis(ssl_manager)), +    [_, _,_, _, Prop] = StatusInfo, +    State = ssl_test_lib:state(Prop), +    Cache = element(2, State), +    case ssl_session_cache:lookup(Cache, {{Host, Port}, Id}) of +	undefined -> +	    ok; +	#session{is_resumable = false} -> +	    ok; +	_ -> +	    test_server:sleep(?SLEEP), +	    make_sure_expired(Host, Port, Id) +    end. + +  %%--------------------------------------------------------------------  server_does_not_want_to_reuse_session(doc) ->       ["Test reuse of sessions (short handshake)"]; @@ -3912,7 +3930,7 @@ recv_error_handling(Config) when is_list(Config) ->  					  {mfa, {?MODULE, recv_close, []}},  					 {options, [{active, false} | ServerOpts]}]),      Port = ssl_test_lib:inet_port(Server), -    {Client, #sslsocket{pid=Pid} = SslSocket} = ssl_test_lib:start_client([return_socket, +    {_Client, #sslsocket{} = SslSocket} = ssl_test_lib:start_client([return_socket,  									   {node, ClientNode}, {port, Port},  									   {host, Hostname},  									   {from, self()}, @@ -3929,9 +3947,9 @@ rizzo(doc) -> ["Test that there is a 1/n-1-split for non RC4 in 'TLS < 1.1' as i  rizzo(Config) when is_list(Config) ->      Ciphers  = [X || X ={_,Y,_} <- ssl:cipher_suites(), Y  =/= rc4_128], -    run_send_recv_rizzo(Ciphers, Config, sslv3, -			 {?MODULE, send_recv_result_active_rizzo, []}), -    run_send_recv_rizzo(Ciphers, Config, tlsv1, +    Prop = ?config(tc_group_properties, Config), +    Version = proplists:get_value(name, Prop), +    run_send_recv_rizzo(Ciphers, Config, Version,  			 {?MODULE, send_recv_result_active_rizzo, []}).  %%--------------------------------------------------------------------  no_rizzo_rc4(doc) ->  @@ -3939,9 +3957,9 @@ no_rizzo_rc4(doc) ->  no_rizzo_rc4(Config) when is_list(Config) ->      Ciphers = [X || X ={_,Y,_} <- ssl:cipher_suites(),Y == rc4_128], -    run_send_recv_rizzo(Ciphers, Config, sslv3, -			{?MODULE, send_recv_result_active_no_rizzo, []}), -    run_send_recv_rizzo(Ciphers, Config, tlsv1, +    Prop = ?config(tc_group_properties, Config), +    Version = proplists:get_value(name, Prop), +    run_send_recv_rizzo(Ciphers, Config, Version,  			{?MODULE, send_recv_result_active_no_rizzo, []}).  %%-------------------------------------------------------------------- diff --git a/lib/ssl/test/ssl_cipher_SUITE.erl b/lib/ssl/test/ssl_cipher_SUITE.erl index 99bc21e820..83beeb0131 100644 --- a/lib/ssl/test/ssl_cipher_SUITE.erl +++ b/lib/ssl/test/ssl_cipher_SUITE.erl @@ -27,6 +27,7 @@  -include("ssl_internal.hrl").  -include("ssl_record.hrl").  -include("ssl_cipher.hrl"). +-include("ssl_alert.hrl").  -define(TIMEOUT, 600000). @@ -103,7 +104,7 @@ end_per_testcase(_TestCase, Config) ->  suite() -> [{ct_hooks,[ts_install_cth]}].  all() ->  -    [aes_decipher_good, aes_decipher_fail]. +    [aes_decipher_good, aes_decipher_good_tls11, aes_decipher_fail, aes_decipher_fail_tls11].  groups() ->       []. @@ -131,10 +132,39 @@ aes_decipher_good(Config) when is_list(Config) ->  		 190,162,74,31,186,227,119,155,94,74,119,79,169,193,240,160,  		 198,181,81,19,98,162,213,228,74,224,253,168,156,59,195,122,  		 108,101,107,242,20,15,169,150,163,107,101,94,93,104,241,165>>, -    Version = {3,3}, -    Content = <<183,139,16,132,10,209,67,86,168,100,61,217,145,57,36,56,72,69,76,76,79,10>>, +    Content = <<183,139,16,132,10,209,67,86,168,100,61,217,145,57,36,56, "HELLO\n">>,      Mac = <<71,136,212,107,223,200,70,232,127,116,148,205,232,35,158,113,237,174,15,217,192,168,35,8,6,107,107,233,25,174,90,111>>, +    Version = {3,0},      {Content, Mac, _} = ssl_cipher:decipher(?AES, HashSz, CipherState, Fragment, Version), +    Version1 = {3,1}, +    {Content, Mac, _} = ssl_cipher:decipher(?AES, HashSz, CipherState, Fragment, Version1), +    ok. + +%%-------------------------------------------------------------------- + +aes_decipher_good_tls11(doc) -> +    ["Decipher a known TLS 1.1 cryptotext."]; + +aes_decipher_good_tls11(suite) -> +    []; + +%% the fragment is actuall a TLS 1.1 record, with +%% Version = TLS 1.1, we get the correct NextIV in #cipher_state +aes_decipher_good_tls11(Config) when is_list(Config) -> +    HashSz = 32, +    CipherState = #cipher_state{iv = <<59,201,85,117,188,206,224,136,5,109,46,70,104,79,4,9>>, +				key = <<72,196,247,97,62,213,222,109,210,204,217,186,172,184,197,148>>}, +    Fragment = <<220,193,179,139,171,33,143,245,202,47,123,251,13,232,114,8, +		 190,162,74,31,186,227,119,155,94,74,119,79,169,193,240,160, +		 198,181,81,19,98,162,213,228,74,224,253,168,156,59,195,122, +		 108,101,107,242,20,15,169,150,163,107,101,94,93,104,241,165>>, +    Content = <<"HELLO\n">>, +    NextIV = <<183,139,16,132,10,209,67,86,168,100,61,217,145,57,36,56>>, +    Mac = <<71,136,212,107,223,200,70,232,127,116,148,205,232,35,158,113,237,174,15,217,192,168,35,8,6,107,107,233,25,174,90,111>>, +    Version = {3,2}, +    {Content, Mac, #cipher_state{iv = NextIV}} = ssl_cipher:decipher(?AES, HashSz, CipherState, Fragment, Version), +    Version1 = {3,2}, +    {Content, Mac, #cipher_state{iv = NextIV}} = ssl_cipher:decipher(?AES, HashSz, CipherState, Fragment, Version1),      ok.  %%-------------------------------------------------------------------- @@ -154,10 +184,38 @@ aes_decipher_fail(Config) when is_list(Config) ->  		 190,162,74,31,186,227,119,155,94,74,119,79,169,193,240,160,  		 198,181,81,19,98,162,213,228,74,224,253,168,156,59,195,122,  		 108,101,107,242,20,15,169,150,163,107,101,94,93,104,241,165>>, -    Version = {3,3}, +    Version = {3,0},      {Content, Mac, _} = ssl_cipher:decipher(?AES, HashSz, CipherState, Fragment, Version),      32 = byte_size(Content),      32 = byte_size(Mac), +    Version1 = {3,1}, +    {Content1, Mac1, _} = ssl_cipher:decipher(?AES, HashSz, CipherState, Fragment, Version1), +    32 = byte_size(Content1), +    32 = byte_size(Mac1), +    ok. + +%%-------------------------------------------------------------------- + +aes_decipher_fail_tls11(doc) -> +    ["Decipher a known TLS 1.1 cryptotext."]; + +aes_decipher_fail_tls11(suite) -> +    []; + +%% same as above, last byte of key replaced +%% stricter padding checks in TLS 1.1 mean we get an alert instead +aes_decipher_fail_tls11(Config) when is_list(Config) -> +    HashSz = 32, +    CipherState = #cipher_state{iv = <<59,201,85,117,188,206,224,136,5,109,46,70,104,79,4,9>>, +				key = <<72,196,247,97,62,213,222,109,210,204,217,186,172,184,197,254>>}, +    Fragment = <<220,193,179,139,171,33,143,245,202,47,123,251,13,232,114,8, +		 190,162,74,31,186,227,119,155,94,74,119,79,169,193,240,160, +		 198,181,81,19,98,162,213,228,74,224,253,168,156,59,195,122, +		 108,101,107,242,20,15,169,150,163,107,101,94,93,104,241,165>>, +    Version = {3,2}, +    #alert{level = ?FATAL, description = ?BAD_RECORD_MAC} = ssl_cipher:decipher(?AES, HashSz, CipherState, Fragment, Version), +    Version1 = {3,3}, +    #alert{level = ?FATAL, description = ?BAD_RECORD_MAC} = ssl_cipher:decipher(?AES, HashSz, CipherState, Fragment, Version1),      ok.  %%-------------------------------------------------------------------- diff --git a/lib/ssl/test/ssl_handshake_SUITE.erl b/lib/ssl/test/ssl_handshake_SUITE.erl index 08c23b2d47..946865a3d8 100644 --- a/lib/ssl/test/ssl_handshake_SUITE.erl +++ b/lib/ssl/test/ssl_handshake_SUITE.erl @@ -48,7 +48,8 @@ decode_hello_handshake(_Config) ->  	16#00, 16#00, 16#33, 16#74, 16#00, 16#07, 16#06, 16#73,  	16#70, 16#64, 16#79, 16#2f, 16#32>>, -	{Records, _Buffer} = ssl_handshake:get_tls_handshake(HelloPacket, <<>>), +	Version = {3, 0}, +	{Records, _Buffer} = ssl_handshake:get_tls_handshake(Version, HelloPacket, <<>>),  	{Hello, _Data} = hd(Records),  	#renegotiation_info{renegotiated_connection = <<0>>} = Hello#server_hello.renegotiation_info. diff --git a/lib/ssl/test/ssl_packet_SUITE.erl b/lib/ssl/test/ssl_packet_SUITE.erl index 593b1fda5e..8ce80cb725 100644 --- a/lib/ssl/test/ssl_packet_SUITE.erl +++ b/lib/ssl/test/ssl_packet_SUITE.erl @@ -122,15 +122,56 @@ end_per_testcase(_TestCase, Config) ->  suite() -> [{ct_hooks,[ts_install_cth]}].  all() ->  +    [ +     {group, 'tlsv1.2'}, +     {group, 'tlsv1.1'}, +     {group, 'tlsv1'}, +     {group, 'sslv3'} +    ]. + +groups() -> +    [{'tlsv1.2', [], packet_tests()}, +     {'tlsv1.1', [], packet_tests()}, +     {'tlsv1', [], packet_tests()}, +     {'sslv3', [], packet_tests()}]. + +packet_tests() -> +    active_packet_tests() ++ active_once_packet_tests() ++ passive_packet_tests() ++ +	[packet_send_to_large, +	 packet_cdr_decode, packet_cdr_decode_list, +	 packet_http_decode, packet_http_decode_list, +	 packet_http_bin_decode_multi, +	 packet_line_decode, packet_line_decode_list, +	 packet_asn1_decode, packet_asn1_decode_list, +	 packet_tpkt_decode, packet_tpkt_decode_list, +	 packet_sunrm_decode, packet_sunrm_decode_list]. + +passive_packet_tests() ->      [packet_raw_passive_many_small,       packet_0_passive_many_small,       packet_1_passive_many_small,       packet_2_passive_many_small,       packet_4_passive_many_small, -     packet_raw_passive_some_big, packet_0_passive_some_big, -     packet_1_passive_some_big, packet_2_passive_some_big, +     packet_raw_passive_some_big, +     packet_0_passive_some_big, +     packet_1_passive_some_big, +     packet_2_passive_some_big,       packet_4_passive_some_big, -     packet_raw_active_once_many_small, +     packet_httph_passive, +     packet_httph_bin_passive, +     packet_http_error_passive, +     packet_wait_passive, +     packet_size_passive, +     packet_baddata_passive, +     %% inet header option should be deprecated! +     header_decode_one_byte_passive, +     header_decode_two_bytes_passive, +     header_decode_two_bytes_two_sent_passive, +     header_decode_two_bytes_one_sent_passive +    ]. + +active_once_packet_tests() -> +    [packet_raw_active_once_many_small,       packet_0_active_once_many_small,       packet_1_active_once_many_small,       packet_2_active_once_many_small, @@ -140,44 +181,49 @@ all() ->       packet_1_active_once_some_big,       packet_2_active_once_some_big,       packet_4_active_once_some_big, -     packet_raw_active_many_small, -     packet_0_active_many_small, packet_1_active_many_small, -     packet_2_active_many_small, packet_4_active_many_small, -     packet_raw_active_some_big, packet_0_active_some_big, -     packet_1_active_some_big, packet_2_active_some_big, -     packet_4_active_some_big, packet_send_to_large, -     packet_wait_passive, packet_wait_active, -     packet_baddata_passive, packet_baddata_active, -     packet_size_passive, packet_size_active, -     packet_cdr_decode, packet_cdr_decode_list, -     packet_http_decode, packet_http_decode_list, -     packet_http_bin_decode_multi, packet_http_error_passive, -     packet_httph_active, packet_httph_bin_active, -     packet_httph_active_once, packet_httph_bin_active_once, -     packet_httph_passive, packet_httph_bin_passive, -     packet_line_decode, packet_line_decode_list, -     packet_asn1_decode, packet_asn1_decode_list, -     packet_tpkt_decode, packet_tpkt_decode_list, -     packet_sunrm_decode, packet_sunrm_decode_list, -     {group, header} +     packet_httph_active_once, +     packet_httph_bin_active_once      ]. -groups() ->  -    [{header, [], [ header_decode_one_byte,   -		    header_decode_two_bytes,  -		    header_decode_two_bytes_one_sent, -		    header_decode_two_bytes_two_sent]}]. +active_packet_tests() -> +    [packet_raw_active_many_small, +     packet_0_active_many_small, +     packet_1_active_many_small, +     packet_2_active_many_small, +     packet_4_active_many_small, +     packet_raw_active_some_big, +     packet_0_active_some_big, +     packet_1_active_some_big, +     packet_2_active_some_big, +     packet_4_active_some_big, +     packet_httph_active, +     packet_httph_bin_active, +     packet_wait_active, +     packet_baddata_active, +     packet_size_active, +     %% inet header option should be deprecated! +     header_decode_one_byte_active, +     header_decode_two_bytes_active, +     header_decode_two_bytes_two_sent_active, +     header_decode_two_bytes_one_sent_active +    ]. -init_per_group(header, Config) -> -    case ssl_record:highest_protocol_version(ssl_record:supported_protocol_versions()) of -	{3, N} when N < 2 -> -	    {skip, ""}; + +init_per_group(GroupName, Config) -> +    case ssl_test_lib:is_tls_version(GroupName) of +	true -> +	    case ssl_test_lib:sufficient_crypto_support(GroupName) of +		true -> +		    ssl_test_lib:init_tls_version(GroupName), +		    Config; +		false -> +		    {skip, "Missing crypto support"} +	    end;  	_ -> +	    ssl:start(),  	    Config -    end; +    end. -init_per_group(_, Config) -> -    Config.  end_per_group(_GroupName, Config) ->      Config. @@ -2436,11 +2482,11 @@ packet_sunrm_decode_list(Config) when is_list(Config) ->      ssl_test_lib:close(Client).  %%-------------------------------------------------------------------- -header_decode_one_byte(doc) -> +header_decode_one_byte_active(doc) ->      ["Test setting the packet option {header, 1}"]; -header_decode_one_byte(suite) -> +header_decode_one_byte_active(suite) ->      []; -header_decode_one_byte(Config) when is_list(Config) -> +header_decode_one_byte_active(Config) when is_list(Config) ->      ClientOpts = ?config(client_opts, Config),      ServerOpts = ?config(server_opts, Config),      {ClientNode, ServerNode, Hostname} = ssl_test_lib:run_where(Config), @@ -2449,7 +2495,7 @@ header_decode_one_byte(Config) when is_list(Config) ->      Server = ssl_test_lib:start_server([{node, ClientNode}, {port, 0},  					{from, self()}, -					{mfa, {?MODULE, server_header_decode, +					{mfa, {?MODULE, server_header_decode_active,  					       [Data, [11 | <<"Hello world">>]]}},  					{options, [{active, true}, binary,   						   {header,1}|ServerOpts]}]), @@ -2458,7 +2504,7 @@ header_decode_one_byte(Config) when is_list(Config) ->      Client = ssl_test_lib:start_client([{node, ServerNode}, {port, Port},  					{host, Hostname},  					{from, self()}, -					{mfa, {?MODULE, client_header_decode,  +					{mfa, {?MODULE, client_header_decode_active,  					       [Data, [11 | <<"Hello world">> ]]}},  					{options, [{active, true}, {header, 1},  						   binary | ClientOpts]}]), @@ -2470,11 +2516,11 @@ header_decode_one_byte(Config) when is_list(Config) ->  %%-------------------------------------------------------------------- -header_decode_two_bytes(doc) -> +header_decode_two_bytes_active(doc) ->      ["Test setting the packet option {header, 2}"]; -header_decode_two_bytes(suite) -> +header_decode_two_bytes_active(suite) ->      []; -header_decode_two_bytes(Config) when is_list(Config) -> +header_decode_two_bytes_active(Config) when is_list(Config) ->      ClientOpts = ?config(client_opts, Config),      ServerOpts = ?config(server_opts, Config),      {ClientNode, ServerNode, Hostname} = ssl_test_lib:run_where(Config), @@ -2483,7 +2529,7 @@ header_decode_two_bytes(Config) when is_list(Config) ->      Server = ssl_test_lib:start_server([{node, ClientNode}, {port, 0},  					{from, self()}, -					{mfa, {?MODULE, server_header_decode, +					{mfa, {?MODULE, server_header_decode_active,  					       [Data, [11, $H | <<"ello world">> ]]}},  					{options, [{active, true}, binary,   						   {header,2}|ServerOpts]}]), @@ -2492,7 +2538,7 @@ header_decode_two_bytes(Config) when is_list(Config) ->      Client = ssl_test_lib:start_client([{node, ServerNode}, {port, Port},  					{host, Hostname},  					{from, self()}, -					{mfa, {?MODULE, client_header_decode,  +					{mfa, {?MODULE, client_header_decode_active,  					       [Data, [11, $H | <<"ello world">> ]]}},  					{options, [{active, true}, {header, 2},  						   binary | ClientOpts]}]), @@ -2505,11 +2551,11 @@ header_decode_two_bytes(Config) when is_list(Config) ->  %%-------------------------------------------------------------------- -header_decode_two_bytes_two_sent(doc) -> -    ["Test setting the packet option {header, 2} and sending on byte"]; -header_decode_two_bytes_two_sent(suite) -> +header_decode_two_bytes_two_sent_active(doc) -> +    ["Test setting the packet option {header, 2} and sending two byte"]; +header_decode_two_bytes_two_sent_active(suite) ->      []; -header_decode_two_bytes_two_sent(Config) when is_list(Config) -> +header_decode_two_bytes_two_sent_active(Config) when is_list(Config) ->      ClientOpts = ?config(client_opts, Config),      ServerOpts = ?config(server_opts, Config),      {ClientNode, ServerNode, Hostname} = ssl_test_lib:run_where(Config), @@ -2518,8 +2564,8 @@ header_decode_two_bytes_two_sent(Config) when is_list(Config) ->      Server = ssl_test_lib:start_server([{node, ClientNode}, {port, 0},  					{from, self()}, -					{mfa, {?MODULE, server_header_decode, -					       [Data, [$H, $e | <<>> ]]}}, +					{mfa, {?MODULE, server_header_decode_active, +					       [Data, [$H, $e]]}},  					{options, [{active, true}, binary,   						   {header,2}|ServerOpts]}]), @@ -2527,8 +2573,8 @@ header_decode_two_bytes_two_sent(Config) when is_list(Config) ->      Client = ssl_test_lib:start_client([{node, ServerNode}, {port, Port},  					{host, Hostname},  					{from, self()}, -					{mfa, {?MODULE, client_header_decode,  -					       [Data, [$H, $e | <<>> ]]}}, +					{mfa, {?MODULE, client_header_decode_active, +					       [Data, [$H, $e]]}},  					{options, [{active, true}, {header, 2},  						   binary | ClientOpts]}]), @@ -2540,11 +2586,11 @@ header_decode_two_bytes_two_sent(Config) when is_list(Config) ->  %%-------------------------------------------------------------------- -header_decode_two_bytes_one_sent(doc) -> -    ["Test setting the packet option {header, 2} and sending on byte"]; -header_decode_two_bytes_one_sent(suite) -> +header_decode_two_bytes_one_sent_active(doc) -> +    ["Test setting the packet option {header, 2} and sending one byte"]; +header_decode_two_bytes_one_sent_active(suite) ->      []; -header_decode_two_bytes_one_sent(Config) when is_list(Config) -> +header_decode_two_bytes_one_sent_active(Config) when is_list(Config) ->      ClientOpts = ?config(client_opts, Config),      ServerOpts = ?config(server_opts, Config),      {ClientNode, ServerNode, Hostname} = ssl_test_lib:run_where(Config), @@ -2553,7 +2599,7 @@ header_decode_two_bytes_one_sent(Config) when is_list(Config) ->      Server = ssl_test_lib:start_server([{node, ClientNode}, {port, 0},  					{from, self()}, -					{mfa, {?MODULE, server_header_decode, +					{mfa, {?MODULE, server_header_decode_active,  					       [Data, "H"]}},  					{options, [{active, true}, binary,   						   {header,2}|ServerOpts]}]), @@ -2562,7 +2608,7 @@ header_decode_two_bytes_one_sent(Config) when is_list(Config) ->      Client = ssl_test_lib:start_client([{node, ServerNode}, {port, Port},  					{host, Hostname},  					{from, self()}, -					{mfa, {?MODULE, client_header_decode,  +					{mfa, {?MODULE, client_header_decode_active,  					       [Data, "H"]}},  					{options, [{active, true}, {header, 2},  						   binary | ClientOpts]}]), @@ -2572,6 +2618,143 @@ header_decode_two_bytes_one_sent(Config) when is_list(Config) ->      ssl_test_lib:close(Server),      ssl_test_lib:close(Client). +%%-------------------------------------------------------------------- + +header_decode_one_byte_passive(doc) -> +    ["Test setting the packet option {header, 1}"]; +header_decode_one_byte_passive(suite) -> +    []; +header_decode_one_byte_passive(Config) when is_list(Config) -> +    ClientOpts = ?config(client_opts, Config), +    ServerOpts = ?config(server_opts, Config), +    {ClientNode, ServerNode, Hostname} = ssl_test_lib:run_where(Config), + +    Data = <<11:8, "Hello world">>, + +    Server = ssl_test_lib:start_server([{node, ClientNode}, {port, 0}, +					{from, self()}, +					{mfa, {?MODULE, server_header_decode_passive, +					       [Data, [11 | <<"Hello world">>]]}}, +					{options, [{active, false}, binary, +						   {header,1}|ServerOpts]}]), + +    Port = ssl_test_lib:inet_port(Server), +    Client = ssl_test_lib:start_client([{node, ServerNode}, {port, Port}, +					{host, Hostname}, +					{from, self()}, +					{mfa, {?MODULE, client_header_decode_passive, +					       [Data, [11 | <<"Hello world">> ]]}}, +					{options, [{active, false}, {header, 1}, +						   binary | ClientOpts]}]), + +    ssl_test_lib:check_result(Server, ok, Client, ok), + +    ssl_test_lib:close(Server), +    ssl_test_lib:close(Client). + +%%-------------------------------------------------------------------- + +header_decode_two_bytes_passive(doc) -> +    ["Test setting the packet option {header, 2}"]; +header_decode_two_bytes_passive(suite) -> +    []; +header_decode_two_bytes_passive(Config) when is_list(Config) -> +    ClientOpts = ?config(client_opts, Config), +    ServerOpts = ?config(server_opts, Config), +    {ClientNode, ServerNode, Hostname} = ssl_test_lib:run_where(Config), + +    Data = <<11:8, "Hello world">>, + +    Server = ssl_test_lib:start_server([{node, ClientNode}, {port, 0}, +					{from, self()}, +					{mfa, {?MODULE, server_header_decode_passive, +					       [Data, [11, $H | <<"ello world">> ]]}}, +					{options, [{active, false}, binary, +						   {header,2}|ServerOpts]}]), + +    Port = ssl_test_lib:inet_port(Server), +    Client = ssl_test_lib:start_client([{node, ServerNode}, {port, Port}, +					{host, Hostname}, +					{from, self()}, +					{mfa, {?MODULE, client_header_decode_passive, +					       [Data, [11, $H | <<"ello world">> ]]}}, +					{options, [{active, false}, {header, 2}, +						   binary | ClientOpts]}]), + +    ssl_test_lib:check_result(Server, ok, Client, ok), + +    ssl_test_lib:close(Server), +    ssl_test_lib:close(Client). + + +%%-------------------------------------------------------------------- + +header_decode_two_bytes_two_sent_passive(doc) -> +    ["Test setting the packet option {header, 2} and sending two byte"]; +header_decode_two_bytes_two_sent_passive(suite) -> +    []; +header_decode_two_bytes_two_sent_passive(Config) when is_list(Config) -> +    ClientOpts = ?config(client_opts, Config), +    ServerOpts = ?config(server_opts, Config), +    {ClientNode, ServerNode, Hostname} = ssl_test_lib:run_where(Config), + +    Data = <<"He">>, + +    Server = ssl_test_lib:start_server([{node, ClientNode}, {port, 0}, +					{from, self()}, +					{mfa, {?MODULE, server_header_decode_passive, +					       [Data, [$H, $e]]}}, +					{options, [{active, false}, binary, +						   {header,2}|ServerOpts]}]), + +    Port = ssl_test_lib:inet_port(Server), +    Client = ssl_test_lib:start_client([{node, ServerNode}, {port, Port}, +					{host, Hostname}, +					{from, self()}, +					{mfa, {?MODULE, client_header_decode_passive, +					       [Data, [$H, $e]]}}, +					{options, [{active, false}, {header, 2}, +						   binary | ClientOpts]}]), + +    ssl_test_lib:check_result(Server, ok, Client, ok), + +    ssl_test_lib:close(Server), +    ssl_test_lib:close(Client). + + +%%-------------------------------------------------------------------- + +header_decode_two_bytes_one_sent_passive(doc) -> +    ["Test setting the packet option {header, 2} and sending one byte"]; +header_decode_two_bytes_one_sent_passive(suite) -> +    []; +header_decode_two_bytes_one_sent_passive(Config) when is_list(Config) -> +    ClientOpts = ?config(client_opts, Config), +    ServerOpts = ?config(server_opts, Config), +    {ClientNode, ServerNode, Hostname} = ssl_test_lib:run_where(Config), + +    Data = <<"H">>, + +    Server = ssl_test_lib:start_server([{node, ClientNode}, {port, 0}, +					{from, self()}, +					{mfa, {?MODULE, server_header_decode_passive, +					       [Data, "H"]}}, +					{options, [{active, false}, binary, +						   {header,2}|ServerOpts]}]), + +    Port = ssl_test_lib:inet_port(Server), +    Client = ssl_test_lib:start_client([{node, ServerNode}, {port, Port}, +					{host, Hostname}, +					{from, self()}, +					{mfa, {?MODULE, client_header_decode_passive, +					       [Data, "H"]}}, +					{options, [{active, false}, {header, 2}, +						   binary | ClientOpts]}]), + +    ssl_test_lib:check_result(Server, ok, Client, ok), + +    ssl_test_lib:close(Server), +    ssl_test_lib:close(Client).  %%--------------------------------------------------------------------  %% Internal functions @@ -2758,29 +2941,52 @@ client_packet_decode(Socket, P1, P2, Packet) ->  	Other2 -> exit({?LINE, Other2})      end. -server_header_decode(Socket, Packet, Result) -> +server_header_decode_active(Socket, Packet, Result) ->      receive -	{ssl, Socket, Result}  -> ok; -	Other1 -> exit({?LINE, Other1}) -    end, -    ok = ssl:send(Socket, Packet), -    receive -	{ssl, Socket, Result}  -> ok; -	Other2 -> exit({?LINE, Other2}) +	{ssl, Socket, Result}  -> +	    ok; +	{ssl, Socket, Other1} -> +	    check_header_result(Result, Other1)      end,      ok = ssl:send(Socket, Packet). -client_header_decode(Socket, Packet, Result) -> +client_header_decode_active(Socket, Packet, Result) ->      ok = ssl:send(Socket, Packet),      receive -	{ssl, Socket, Result}  -> ok; -	Other1 -> exit({?LINE, Other1}) +	{ssl, Socket, Result}  -> +	    ok; +	{ssl, Socket, Other1} -> +	    check_header_result(Result, Other1) +    end. + +server_header_decode_passive(Socket, Packet, Result) -> +    case ssl:recv(Socket, 0) of +	{ok, Result} -> +	    ok; +	{ok, Other} -> +	    check_header_result(Result, Other)      end, +    ok = ssl:send(Socket, Packet). + +client_header_decode_passive(Socket, Packet, Result) ->      ok = ssl:send(Socket, Packet), -    receive -	{ssl, Socket, Result}  -> ok; -	Other2 -> exit({?LINE, Other2}) + +    case ssl:recv(Socket, 0) of +	{ok, Result} -> +	    ok; +	{ok, Other} -> +	    check_header_result(Result, Other)      end. + +%% The inet header option is a broken option as it does not buffer until it gets enough data. +%% This check only checks that it has the same behavior as inet, but it is a quite useless +%% option and the bitsynax makes it obsolete! +check_header_result([Byte1 | _], [Byte1]) -> +    ok; +check_header_result([Byte1, Byte2 | _], [Byte1, Byte2]) -> +    ok; +check_header_result(_,Got) -> +    exit({?LINE, Got}).  server_line_packet_decode(Socket, Packet) when is_binary(Packet) ->      [L1, L2] = string:tokens(binary_to_list(Packet), "\n"), diff --git a/lib/ssl/test/ssl_payload_SUITE.erl b/lib/ssl/test/ssl_payload_SUITE.erl index 02b5516e35..c97f97e70b 100644 --- a/lib/ssl/test/ssl_payload_SUITE.erl +++ b/lib/ssl/test/ssl_payload_SUITE.erl @@ -1,7 +1,7 @@  %%  %% %CopyrightBegin%  %% -%% Copyright Ericsson AB 2008-2011. All Rights Reserved. +%% Copyright Ericsson AB 2008-2012. All Rights Reserved.  %%  %% The contents of this file are subject to the Erlang Public License,  %% Version 1.1, (the "License"); you may not use this file except in @@ -103,23 +103,56 @@ end_per_testcase(_TestCase, Config) ->  suite() -> [{ct_hooks,[ts_install_cth]}].  all() ->  +    [ +     {group, 'tlsv1.2'}, +     {group, 'tlsv1.1'}, +     {group, 'tlsv1'}, +     {group, 'sslv3'} +    ]. + +groups() -> +    [ +     {'tlsv1.2', [], payload_tests()}, +     {'tlsv1.1', [], payload_tests()}, +     {'tlsv1', [], payload_tests()}, +     {'sslv3', [], payload_tests()} +    ]. + +payload_tests() ->      [server_echos_passive_small,       server_echos_active_once_small, -     server_echos_active_small, client_echos_passive_small, +     server_echos_active_small, +     client_echos_passive_small,       client_echos_active_once_small, -     client_echos_active_small, server_echos_passive_big, -     server_echos_active_once_big, server_echos_active_big, -     client_echos_passive_big, client_echos_active_once_big, -     client_echos_active_big, server_echos_passive_huge, -     server_echos_active_once_huge, server_echos_active_huge, +     client_echos_active_small, +     server_echos_passive_big, +     server_echos_active_once_big, +     server_echos_active_big, +     client_echos_passive_big, +     client_echos_active_once_big, +     client_echos_active_big, +     server_echos_passive_huge, +     server_echos_active_once_huge, +     server_echos_active_huge,       client_echos_passive_huge, -     client_echos_active_once_huge, client_echos_active_huge]. +     client_echos_active_once_huge, +     client_echos_active_huge]. -groups() ->  -    []. -init_per_group(_GroupName, Config) -> -    Config. +init_per_group(GroupName, Config) -> +     case ssl_test_lib:is_tls_version(GroupName) of +	true -> +	    case ssl_test_lib:sufficient_crypto_support(GroupName) of +		true -> +		    ssl_test_lib:init_tls_version(GroupName), +		    Config; +		false -> +		    {skip, "Missing crypto support"} +	    end; +	_ -> +	    ssl:start(), +	    Config +    end.  end_per_group(_GroupName, Config) ->      Config. diff --git a/lib/ssl/test/ssl_test_lib.erl b/lib/ssl/test/ssl_test_lib.erl index fa8a1826f2..b39c995552 100644 --- a/lib/ssl/test/ssl_test_lib.erl +++ b/lib/ssl/test/ssl_test_lib.erl @@ -1,7 +1,7 @@  %%  %% %CopyrightBegin%  %% -%% Copyright Ericsson AB 2008-2011. All Rights Reserved. +%% Copyright Ericsson AB 2008-2012. All Rights Reserved.  %%  %% The contents of this file are subject to the Erlang Public License,  %% Version 1.1, (the "License"); you may not use this file except in @@ -708,3 +708,33 @@ state([{data,[{"StateData", State}]} | _]) ->      State;  state([_ | Rest]) ->      state(Rest). + +is_tls_version('tlsv1.2') -> +    true; +is_tls_version('tlsv1.1') -> +    true; +is_tls_version('tlsv1') -> +    true; +is_tls_version('sslv3') -> +    true; +is_tls_version(_) -> +    false. + +init_tls_version(Version) -> +    ssl:stop(), +    application:load(ssl), +    application:set_env(ssl, protocol_version, Version), +    ssl:start(). + +sufficient_crypto_support('tlsv1.2') -> +    Data = "Sampl", +    Data2 = "e #1", +    Key = <<0,1,2,3,16,17,18,19,32,33,34,35,48,49,50,51,4,5,6,7,20,21,22,23,36,37,38,39, +	    52,53,54,55,8,9,10,11,24,25,26,27,40,41,42,43,56,57,58,59>>, +    try +	crypto:sha256_mac(Key, lists:flatten([Data, Data2])), +	true +    catch _:_ -> false +    end; +sufficient_crypto_support(_) -> +    true. diff --git a/lib/ssl/test/ssl_to_openssl_SUITE.erl b/lib/ssl/test/ssl_to_openssl_SUITE.erl index f593c1c552..d446014f7b 100644 --- a/lib/ssl/test/ssl_to_openssl_SUITE.erl +++ b/lib/ssl/test/ssl_to_openssl_SUITE.erl @@ -107,15 +107,13 @@ init_per_testcase(TestCase, Config0) ->  special_init(TestCase, Config)     when TestCase == erlang_client_openssl_server_renegotiate;         TestCase == erlang_client_openssl_server_no_wrap_sequence_number; -       TestCase == erlang_server_openssl_client_no_wrap_sequence_number -> +       TestCase == erlang_server_openssl_client_no_wrap_sequence_number +       ->      check_sane_openssl_renegotaite(Config);  special_init(ssl2_erlang_server_openssl_client, Config) ->      check_sane_openssl_sslv2(Config); -special_init(ciphers_dsa_signed_certs, Config) -> -    check_sane_openssl_dsa(Config); -  special_init(_, Config) ->      Config. @@ -153,37 +151,59 @@ end_per_testcase(_, Config) ->  suite() -> [{ct_hooks,[ts_install_cth]}].  all() ->  -    [erlang_client_openssl_server, +    [ +     {group, basic}, +     {group, 'tlsv1.2'}, +     {group, 'tlsv1.1'}, +     {group, 'tlsv1'}, +     {group, 'sslv3'} +    ]. + +groups() -> +    [{basic, [], basic_tests()}, +     {'tlsv1.2', [], all_versions_tests()}, +     {'tlsv1.1', [], all_versions_tests()}, +     {'tlsv1', [], all_versions_tests()}, +     {'sslv3', [], all_versions_tests()}]. + +basic_tests() -> +    [basic_erlang_client_openssl_server, +     basic_erlang_server_openssl_client, +     expired_session]. + +all_versions_tests() -> +    [ +     erlang_client_openssl_server,       erlang_server_openssl_client, -     tls1_erlang_client_openssl_server_dsa_cert, -     tls1_erlang_server_openssl_client_dsa_cert, -     ssl3_erlang_client_openssl_server_dsa_cert, -     ssl3_erlang_server_openssl_client_dsa_cert, +     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_no_wrap_sequence_number,       erlang_server_openssl_client_no_wrap_sequence_number,       erlang_client_openssl_server_no_server_ca_cert, -     ssl3_erlang_client_openssl_server, -     ssl3_erlang_server_openssl_client, -     ssl3_erlang_client_openssl_server_client_cert, -     ssl3_erlang_server_openssl_client_client_cert, -     ssl3_erlang_server_erlang_client_client_cert, -     tls1_erlang_client_openssl_server, -     tls1_erlang_server_openssl_client, -     tls1_erlang_client_openssl_server_client_cert, -     tls1_erlang_server_openssl_client_client_cert, -     tls1_erlang_server_erlang_client_client_cert, -     ciphers_rsa_signed_certs, ciphers_dsa_signed_certs, +     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, -     ssl2_erlang_server_openssl_client]. - -groups() ->  -    []. +     ssl2_erlang_server_openssl_client +    ]. -init_per_group(_GroupName, Config) -> -    Config. +init_per_group(GroupName, Config) -> +    case ssl_test_lib:is_tls_version(GroupName) of +	true -> +	    case check_sane_openssl_version(GroupName) of +		true -> +		    ssl_test_lib:init_tls_version(GroupName), +		    Config; +		false -> +		    {skip, openssl_does_not_support_version} +	    end; +	_ -> +	    ssl:start(), +	    Config +    end.  end_per_group(_GroupName, Config) ->      Config. @@ -191,12 +211,11 @@ end_per_group(_GroupName, Config) ->  %% Test cases starts here.  %%-------------------------------------------------------------------- - -erlang_client_openssl_server(doc) -> +basic_erlang_client_openssl_server(doc) ->      ["Test erlang client with openssl server"]; -erlang_client_openssl_server(suite) -> +basic_erlang_client_openssl_server(suite) ->      []; -erlang_client_openssl_server(Config) when is_list(Config) -> +basic_erlang_client_openssl_server(Config) when is_list(Config) ->      process_flag(trap_exit, true),      ServerOpts = ?config(server_opts, Config),        ClientOpts = ?config(client_opts, Config),   @@ -208,8 +227,8 @@ erlang_client_openssl_server(Config) when is_list(Config) ->      Port = ssl_test_lib:inet_port(node()),      CertFile = proplists:get_value(certfile, ServerOpts),      KeyFile = proplists:get_value(keyfile, ServerOpts), -    -    Cmd = "openssl s_server -accept " ++ integer_to_list(Port)  ++  + +    Cmd = "openssl s_server -accept " ++ integer_to_list(Port)  ++  	" -cert " ++ CertFile  ++ " -key " ++ KeyFile,       test_server:format("openssl cmd: ~p~n", [Cmd]), @@ -234,13 +253,12 @@ erlang_client_openssl_server(Config) when is_list(Config) ->      process_flag(trap_exit, false),      ok. -  %%--------------------------------------------------------------------     -erlang_server_openssl_client(doc) -> +basic_erlang_server_openssl_client(doc) ->      ["Test erlang server with openssl client"]; -erlang_server_openssl_client(suite) -> +basic_erlang_server_openssl_client(suite) ->      []; -erlang_server_openssl_client(Config) when is_list(Config) -> +basic_erlang_server_openssl_client(Config) when is_list(Config) ->      process_flag(trap_exit, true),      ServerOpts = ?config(server_opts, Config),   @@ -253,8 +271,8 @@ erlang_server_openssl_client(Config) when is_list(Config) ->  			   {mfa, {?MODULE, erlang_ssl_receive, [Data]}},  			   {options, ServerOpts}]),      Port = ssl_test_lib:inet_port(Server), -     -    Cmd = "openssl s_client -port " ++ integer_to_list(Port)  ++  + +    Cmd = "openssl s_client -port " ++ integer_to_list(Port) ++  	" -host localhost",      test_server:format("openssl cmd: ~p~n", [Cmd]), @@ -269,30 +287,26 @@ erlang_server_openssl_client(Config) when is_list(Config) ->      close_port(OpenSslPort),      process_flag(trap_exit, false),      ok. - -%%--------------------------------------------------------------------  - -tls1_erlang_client_openssl_server_dsa_cert(doc) -> -    ["Test erlang server with openssl client"]; -tls1_erlang_client_openssl_server_dsa_cert(suite) -> +%%-------------------------------------------------------------------- +erlang_client_openssl_server(doc) -> +    ["Test erlang client with openssl server"]; +erlang_client_openssl_server(suite) ->      []; -tls1_erlang_client_openssl_server_dsa_cert(Config) when is_list(Config) -> +erlang_client_openssl_server(Config) when is_list(Config) ->      process_flag(trap_exit, true), -    ClientOpts = ?config(client_dsa_opts, Config),   -    ServerOpts = ?config(server_dsa_opts, Config),   +    ServerOpts = ?config(server_opts, Config), +    ClientOpts = ?config(client_opts, Config),      {ClientNode, _, Hostname} = ssl_test_lib:run_where(Config), -   +      Data = "From openssl to erlang",      Port = ssl_test_lib:inet_port(node()), -    CaCertFile =  proplists:get_value(cacertfile, ServerOpts),      CertFile = proplists:get_value(certfile, ServerOpts),      KeyFile = proplists:get_value(keyfile, ServerOpts), -    -    Cmd = "openssl s_server -accept " ++ integer_to_list(Port)  ++  -	" -cert " ++ CertFile ++ " -CAfile " ++ CaCertFile   -	++ " -key " ++ KeyFile ++ " -Verify 2 -tls1 -msg",  +    Version = ssl_record:protocol_version(ssl_record:highest_protocol_version([])), +    Cmd = "openssl s_server -accept " ++ integer_to_list(Port)  ++  version_flag(Version) ++ +	" -cert " ++ CertFile  ++ " -key " ++ KeyFile,      test_server:format("openssl cmd: ~p~n", [Cmd]), @@ -306,44 +320,39 @@ tls1_erlang_client_openssl_server_dsa_cert(Config) when is_list(Config) ->  					{mfa, {?MODULE,   					       erlang_ssl_receive, [Data]}},  					{options, ClientOpts}]), -      port_command(OpensslPort, Data), -    ssl_test_lib:check_result(Client, ok),  -    +    ssl_test_lib:check_result(Client, ok), +      %% Clean close down!   Server needs to be closed first !!      close_port(OpensslPort),      ssl_test_lib:close(Client),      process_flag(trap_exit, false),      ok. -%%--------------------------------------------------------------------  -tls1_erlang_server_openssl_client_dsa_cert(doc) -> +%%-------------------------------------------------------------------- +erlang_server_openssl_client(doc) ->      ["Test erlang server with openssl client"]; -tls1_erlang_server_openssl_client_dsa_cert(suite) -> +erlang_server_openssl_client(suite) ->      []; -tls1_erlang_server_openssl_client_dsa_cert(Config) when is_list(Config) -> +erlang_server_openssl_client(Config) when is_list(Config) ->      process_flag(trap_exit, true), -    ClientOpts = ?config(client_dsa_opts, Config), -    ServerOpts = ?config(server_dsa_verify_opts, Config),   +    ServerOpts = ?config(server_opts, Config),      {_, ServerNode, _} = ssl_test_lib:run_where(Config),      Data = "From openssl to erlang", -    CaCertFile =  proplists:get_value(cacertfile, ClientOpts), -    CertFile = proplists:get_value(certfile, ClientOpts), -    KeyFile = proplists:get_value(keyfile, ClientOpts), -     +      Server = ssl_test_lib:start_server([{node, ServerNode}, {port, 0},   					{from, self()},   			   {mfa, {?MODULE, erlang_ssl_receive, [Data]}},  			   {options, ServerOpts}]),      Port = ssl_test_lib:inet_port(Server), -     -    Cmd = "openssl s_client -port " ++ integer_to_list(Port)  ++  -	" -host localhost " ++	" -cert " ++ CertFile ++ " -CAfile " ++ CaCertFile   -	++ " -key " ++ KeyFile ++ " -tls1 -msg", +    Version = ssl_record:protocol_version(ssl_record:highest_protocol_version([])), + +    Cmd = "openssl s_client -port " ++ integer_to_list(Port)  ++ version_flag(Version) ++ +	" -host localhost",      test_server:format("openssl cmd: ~p~n", [Cmd]), @@ -351,7 +360,7 @@ tls1_erlang_server_openssl_client_dsa_cert(Config) when is_list(Config) ->      port_command(OpenSslPort, Data),      ssl_test_lib:check_result(Server, ok), -     +      %% Clean close down!   Server needs to be closed first !!      ssl_test_lib:close(Server),      close_port(OpenSslPort), @@ -360,11 +369,11 @@ tls1_erlang_server_openssl_client_dsa_cert(Config) when is_list(Config) ->  %%--------------------------------------------------------------------  -ssl3_erlang_client_openssl_server_dsa_cert(doc) -> +erlang_client_openssl_server_dsa_cert(doc) ->      ["Test erlang server with openssl client"]; -ssl3_erlang_client_openssl_server_dsa_cert(suite) -> +erlang_client_openssl_server_dsa_cert(suite) ->      []; -ssl3_erlang_client_openssl_server_dsa_cert(Config) when is_list(Config) -> +erlang_client_openssl_server_dsa_cert(Config) when is_list(Config) ->      process_flag(trap_exit, true),      ClientOpts = ?config(client_dsa_opts, Config),        ServerOpts = ?config(server_dsa_opts, Config),   @@ -377,10 +386,11 @@ ssl3_erlang_client_openssl_server_dsa_cert(Config) when is_list(Config) ->      CaCertFile =  proplists:get_value(cacertfile, ServerOpts),      CertFile = proplists:get_value(certfile, ServerOpts),      KeyFile = proplists:get_value(keyfile, ServerOpts), -    -    Cmd = "openssl s_server -accept " ++ integer_to_list(Port)  ++  +    Version = ssl_record:protocol_version(ssl_record:highest_protocol_version([])), + +    Cmd = "openssl s_server -accept " ++ integer_to_list(Port)  ++  version_flag(Version) ++  	" -cert " ++ CertFile ++ " -CAfile " ++ CaCertFile   -	++ " -key " ++ KeyFile ++ " -Verify 2 -ssl3 -msg",  +	++ " -key " ++ KeyFile ++ " -Verify 2 -msg",      test_server:format("openssl cmd: ~p~n", [Cmd]), @@ -404,49 +414,46 @@ ssl3_erlang_client_openssl_server_dsa_cert(Config) when is_list(Config) ->      ssl_test_lib:close(Client),      process_flag(trap_exit, false),      ok. - -%%--------------------------------------------------------------------  - -ssl3_erlang_server_openssl_client_dsa_cert(doc) -> +%%-------------------------------------------------------------------- +erlang_server_openssl_client_dsa_cert(doc) ->      ["Test erlang server with openssl client"]; -ssl3_erlang_server_openssl_client_dsa_cert(suite) -> +erlang_server_openssl_client_dsa_cert(suite) ->      []; -ssl3_erlang_server_openssl_client_dsa_cert(Config) when is_list(Config) -> +erlang_server_openssl_client_dsa_cert(Config) when is_list(Config) ->      process_flag(trap_exit, true),      ClientOpts = ?config(client_dsa_opts, Config), -    ServerOpts = ?config(server_dsa_verify_opts, Config),   +    ServerOpts = ?config(server_dsa_verify_opts, Config),      {_, ServerNode, _} = ssl_test_lib:run_where(Config), -     +      Data = "From openssl to erlang",      CaCertFile =  proplists:get_value(cacertfile, ClientOpts),      CertFile = proplists:get_value(certfile, ClientOpts),      KeyFile = proplists:get_value(keyfile, ClientOpts), -     -    Server = ssl_test_lib:start_server([{node, ServerNode}, {port, 0},  -					{from, self()},  -			   {mfa, {?MODULE, erlang_ssl_receive, [Data]}}, -			   {options, ServerOpts}]), + +    Server = ssl_test_lib:start_server([{node, ServerNode}, {port, 0}, +                                       {from, self()}, +                          {mfa, {?MODULE, erlang_ssl_receive, [Data]}}, +                          {options, ServerOpts}]),      Port = ssl_test_lib:inet_port(Server), -     -    Cmd = "openssl s_client -port " ++ integer_to_list(Port)  ++  -	" -host localhost " ++	" -cert " ++ CertFile ++ " -CAfile " ++ CaCertFile   -	++ " -key " ++ KeyFile ++ " -ssl3 -msg", +    Version = ssl_record:protocol_version(ssl_record:highest_protocol_version([])), +    Cmd = "openssl s_client -port " ++ integer_to_list(Port)  ++ version_flag(Version) ++ +       " -host localhost " ++  " -cert " ++ CertFile ++ " -CAfile " ++ CaCertFile +       ++ " -key " ++ KeyFile ++ " -msg",      test_server:format("openssl cmd: ~p~n", [Cmd]), -     -    OpenSslPort =  open_port({spawn, Cmd}, [stderr_to_stdout]),  + +    OpenSslPort =  open_port({spawn, Cmd}, [stderr_to_stdout]),      port_command(OpenSslPort, Data), -     +      ssl_test_lib:check_result(Server, ok), -     +      %% Clean close down!   Server needs to be closed first !!      ssl_test_lib:close(Server),      close_port(OpenSslPort),      process_flag(trap_exit, false),      ok. -  %%--------------------------------------------------------------------   erlang_server_openssl_client_reuse_session(doc) -> @@ -468,8 +475,8 @@ erlang_server_openssl_client_reuse_session(Config) when is_list(Config) ->  			   {reconnect_times, 5},		  			   {options, ServerOpts}]),      Port = ssl_test_lib:inet_port(Server), -     -    Cmd = "openssl s_client -port " ++ integer_to_list(Port)  ++  +    Version = ssl_record:protocol_version(ssl_record:highest_protocol_version([])), +    Cmd = "openssl s_client -port " ++ integer_to_list(Port)  ++ version_flag(Version) ++  	" -host localhost -reconnect",      test_server:format("openssl cmd: ~p~n", [Cmd]), @@ -505,8 +512,9 @@ erlang_client_openssl_server_renegotiate(Config) when is_list(Config) ->      Port = ssl_test_lib:inet_port(node()),      CertFile = proplists:get_value(certfile, ServerOpts),      KeyFile = proplists:get_value(keyfile, ServerOpts), -    -    Cmd = "openssl s_server -accept " ++ integer_to_list(Port)  ++  +    Version = ssl_record:protocol_version(ssl_record:highest_protocol_version([])), + +    Cmd = "openssl s_server -accept " ++ integer_to_list(Port)  ++ version_flag(Version) ++  	" -cert " ++ CertFile ++ " -key " ++ KeyFile ++ " -msg",       test_server:format("openssl cmd: ~p~n", [Cmd]), @@ -556,8 +564,8 @@ erlang_client_openssl_server_no_wrap_sequence_number(Config) when is_list(Config      Port = ssl_test_lib:inet_port(node()),      CertFile = proplists:get_value(certfile, ServerOpts),      KeyFile = proplists:get_value(keyfile, ServerOpts), -    -    Cmd = "openssl s_server -accept " ++ integer_to_list(Port)  ++  +    Version = ssl_record:protocol_version(ssl_record:highest_protocol_version([])), +    Cmd = "openssl s_server -accept " ++ integer_to_list(Port)  ++ version_flag(Version) ++  	" -cert " ++ CertFile ++ " -key " ++ KeyFile ++ " -msg",       test_server:format("openssl cmd: ~p~n", [Cmd]), @@ -606,8 +614,8 @@ erlang_server_openssl_client_no_wrap_sequence_number(Config) when is_list(Config  					       trigger_renegotiate, [[Data, N+2]]}},  					{options, [{renegotiate_at, N}, {reuse_sessions, false} | ServerOpts]}]),      Port = ssl_test_lib:inet_port(Server), -     -    Cmd = "openssl s_client -port " ++ integer_to_list(Port)  ++  +    Version = ssl_record:protocol_version(ssl_record:highest_protocol_version([])), +    Cmd = "openssl s_client -port " ++ integer_to_list(Port)  ++ version_flag(Version) ++  	" -host localhost -msg",      test_server:format("openssl cmd: ~p~n", [Cmd]), @@ -643,8 +651,8 @@ erlang_client_openssl_server_no_server_ca_cert(Config) when is_list(Config) ->      Port = ssl_test_lib:inet_port(node()),      CertFile = proplists:get_value(certfile, ServerOpts),      KeyFile = proplists:get_value(keyfile, ServerOpts), -    -    Cmd = "openssl s_server -accept " ++ integer_to_list(Port)  ++  +    Version = ssl_record:protocol_version(ssl_record:highest_protocol_version([])), +    Cmd = "openssl s_server -accept " ++ integer_to_list(Port)  ++ version_flag(Version) ++  	" -cert " ++ CertFile ++ " -key " ++ KeyFile ++ " -msg",       test_server:format("openssl cmd: ~p~n", [Cmd]), @@ -671,85 +679,11 @@ erlang_client_openssl_server_no_server_ca_cert(Config) when is_list(Config) ->      ok.  %%-------------------------------------------------------------------- -ssl3_erlang_client_openssl_server(doc) -> -    ["Test erlang client with openssl server"]; -ssl3_erlang_client_openssl_server(suite) -> -    []; -ssl3_erlang_client_openssl_server(Config) when is_list(Config) -> -    process_flag(trap_exit, true), -    ServerOpts = ?config(server_opts, Config),   -    ClientOpts = ?config(client_opts, Config),   - -    {ClientNode, _, Hostname} = ssl_test_lib:run_where(Config), -     -    Port = ssl_test_lib:inet_port(node()), -    CertFile = proplists:get_value(certfile, ServerOpts), -    KeyFile = proplists:get_value(keyfile, ServerOpts), -    -    Cmd = "openssl s_server -accept " ++ integer_to_list(Port)  ++  -	" -cert " ++ CertFile ++ " -key " ++ KeyFile ++ " -ssl3",  -     -    test_server:format("openssl cmd: ~p~n", [Cmd]), - -    OpensslPort =  open_port({spawn, Cmd}, [stderr_to_stdout]),  - -    wait_for_openssl_server(), - -    Client = ssl_test_lib:start_client([{node, ClientNode}, {port, Port},  -					{host, Hostname}, -					{from, self()},  -					{mfa, {?MODULE,  -					       connection_info, [sslv3]}}, -					{options,  -					 [{versions, [sslv3]} | ClientOpts]}]), -    ssl_test_lib:check_result(Client, ok), - -    %% Clean close down!   Server needs to be closed first !! -    close_port(OpensslPort), -    ssl_test_lib:close(Client), -    process_flag(trap_exit, false), -    ok. - -%%-------------------------------------------------------------------- -  -ssl3_erlang_server_openssl_client(doc) -> -    ["Test erlang server with openssl client"]; -ssl3_erlang_server_openssl_client(suite) -> -    []; -ssl3_erlang_server_openssl_client(Config) when is_list(Config) -> -    process_flag(trap_exit, true), -    ServerOpts = ?config(server_opts, Config),   -     -    {_, ServerNode, _} = ssl_test_lib:run_where(Config), -     -    Server = ssl_test_lib:start_server([{node, ServerNode}, {port, 0},  -					{from, self()},  -					{mfa,  -					 {?MODULE, connection_info, [sslv3]}}, -					{options,  -					 [{versions, [sslv3]} | ServerOpts]}]), -    Port = ssl_test_lib:inet_port(Server), -     -    Cmd = "openssl s_client -port " ++ integer_to_list(Port)  ++  -	" -host localhost -ssl3", - -    test_server:format("openssl cmd: ~p~n", [Cmd]), -     -    OpenSslPort =  open_port({spawn, Cmd}, [stderr_to_stdout]),  - -    ssl_test_lib:check_result(Server, ok), -    %% Clean close down!   Server needs to be closed first !! -    ssl_test_lib:close(Server), -    close_port(OpenSslPort), -    process_flag(trap_exit, false), -    ok. - -%%-------------------------------------------------------------------- -ssl3_erlang_client_openssl_server_client_cert(doc) -> +erlang_client_openssl_server_client_cert(doc) ->      ["Test erlang client with openssl server when client sends cert"]; -ssl3_erlang_client_openssl_server_client_cert(suite) -> +erlang_client_openssl_server_client_cert(suite) ->      []; -ssl3_erlang_client_openssl_server_client_cert(Config) when is_list(Config) -> +erlang_client_openssl_server_client_cert(Config) when is_list(Config) ->      process_flag(trap_exit, true),      ServerOpts = ?config(server_verification_opts, Config),        ClientOpts = ?config(client_verification_opts, Config),   @@ -762,10 +696,10 @@ ssl3_erlang_client_openssl_server_client_cert(Config) when is_list(Config) ->      CertFile = proplists:get_value(certfile, ServerOpts),      CaCertFile = proplists:get_value(cacertfile, ServerOpts),      KeyFile = proplists:get_value(keyfile, ServerOpts), -    -    Cmd = "openssl s_server -accept " ++ integer_to_list(Port)  ++  +    Version = ssl_record:protocol_version(ssl_record:highest_protocol_version([])), +    Cmd = "openssl s_server -accept " ++ integer_to_list(Port)  ++ version_flag(Version) ++  	" -cert " ++ CertFile ++ " -CAfile " ++ CaCertFile  -	++ " -key " ++ KeyFile ++ " -Verify 2 -ssl3",  +	++ " -key " ++ KeyFile ++ " -Verify 2",      test_server:format("openssl cmd: ~p~n", [Cmd]), @@ -791,11 +725,11 @@ ssl3_erlang_client_openssl_server_client_cert(Config) when is_list(Config) ->  %%--------------------------------------------------------------------   -ssl3_erlang_server_openssl_client_client_cert(doc) -> +erlang_server_openssl_client_client_cert(doc) ->      ["Test erlang server with openssl client when client sends cert"]; -ssl3_erlang_server_openssl_client_client_cert(suite) -> +erlang_server_openssl_client_client_cert(suite) ->      []; -ssl3_erlang_server_openssl_client_client_cert(Config) when is_list(Config) -> +erlang_server_openssl_client_client_cert(Config) when is_list(Config) ->      process_flag(trap_exit, true),      ServerOpts = ?config(server_verification_opts, Config),        ClientOpts = ?config(client_verification_opts, Config),   @@ -816,10 +750,10 @@ ssl3_erlang_server_openssl_client_client_cert(Config) when is_list(Config) ->      CaCertFile = proplists:get_value(cacertfile, ClientOpts),      CertFile = proplists:get_value(certfile, ClientOpts),      KeyFile = proplists:get_value(keyfile, ClientOpts), -     +    Version = ssl_record:protocol_version(ssl_record:highest_protocol_version([])),      Cmd = "openssl s_client -cert " ++ CertFile  ++ " -CAfile " ++ CaCertFile  -	++ " -key " ++ KeyFile ++ " -port " ++ integer_to_list(Port)  ++  -	" -host localhost -ssl3", +	++ " -key " ++ KeyFile ++ " -port " ++ integer_to_list(Port)  ++ version_flag(Version) ++ +	" -host localhost",      test_server:format("openssl cmd: ~p~n", [Cmd]), @@ -837,15 +771,15 @@ ssl3_erlang_server_openssl_client_client_cert(Config) when is_list(Config) ->  %%--------------------------------------------------------------------   -ssl3_erlang_server_erlang_client_client_cert(doc) -> +erlang_server_erlang_client_client_cert(doc) ->      ["Test erlang server with erlang client when client sends cert"]; -ssl3_erlang_server_erlang_client_client_cert(suite) -> +erlang_server_erlang_client_client_cert(suite) ->      []; -ssl3_erlang_server_erlang_client_client_cert(Config) when is_list(Config) -> +erlang_server_erlang_client_client_cert(Config) when is_list(Config) ->      process_flag(trap_exit, true),      ServerOpts = ?config(server_verification_opts, Config),        ClientOpts = ?config(client_verification_opts, Config),   - +    Version = ssl_record:protocol_version(ssl_record:highest_protocol_version([])),      {ClientNode, ServerNode, Hostname} = ssl_test_lib:run_where(Config),      Data = "From erlang to erlang", @@ -867,7 +801,7 @@ ssl3_erlang_server_erlang_client_client_cert(Config) when is_list(Config) ->  					%% Due to 1/n-1 splitting countermeasure Rizzo/Duong-Beast  					{mfa, {ssl, send, [Data]}},  					{options,  -					 [{versions, [sslv3]} | ClientOpts]}]), +					 [{versions, [Version]} | ClientOpts]}]),      ssl_test_lib:check_result(Server, ok, Client, ok), @@ -875,215 +809,8 @@ ssl3_erlang_server_erlang_client_client_cert(Config) when is_list(Config) ->      ssl_test_lib:close(Client),      process_flag(trap_exit, false),      ok. - - -%%-------------------------------------------------------------------- - -tls1_erlang_client_openssl_server(doc) -> -    ["Test erlang client with openssl server"]; -tls1_erlang_client_openssl_server(suite) -> -    []; -tls1_erlang_client_openssl_server(Config) when is_list(Config) -> -    process_flag(trap_exit, true), -    ServerOpts = ?config(server_opts, Config),   -    ClientOpts = ?config(client_opts, Config),   - - -    test_server:format("Server Opts", [ServerOpts]), - -    {ClientNode, _, Hostname} = ssl_test_lib:run_where(Config), -     -    Port = ssl_test_lib:inet_port(node()), -    CertFile = proplists:get_value(certfile, ServerOpts), -    KeyFile = proplists:get_value(keyfile, ServerOpts), - -    Cmd = "openssl s_server -accept " ++ integer_to_list(Port)  ++  -	" -cert " ++ CertFile ++ " -key " ++ KeyFile ++ " -tls1",  -     -    test_server:format("openssl cmd: ~p~n", [Cmd]), - -    OpensslPort =  open_port({spawn, Cmd}, [stderr_to_stdout]),  - -    wait_for_openssl_server(), -     -    Client = ssl_test_lib:start_client([{node, ClientNode}, {port, Port},  -					{host, Hostname}, -					{from, self()},  -					{mfa, {?MODULE,  -					       connection_info, [tlsv1]}}, -					{options,  -					 [{versions, [tlsv1]} | ClientOpts]}]), -     -    ssl_test_lib:check_result(Client, ok), - -    %% Clean close down!   Server needs to be closed first !! -    close_port(OpensslPort), -    ssl_test_lib:close(Client), -    process_flag(trap_exit, false), -    ok. - -%%-------------------------------------------------------------------- - -tls1_erlang_server_openssl_client(doc) -> -    ["Test erlang server with openssl client"]; -tls1_erlang_server_openssl_client(suite) -> -    []; -tls1_erlang_server_openssl_client(Config) when is_list(Config) -> -    process_flag(trap_exit, true), -    ServerOpts = ?config(server_opts, Config),   - -    {_, ServerNode, _} = ssl_test_lib:run_where(Config), -     -    Server = ssl_test_lib:start_server([{node, ServerNode}, {port, 0},  -					{from, self()},  -					{mfa,  -					 {?MODULE, connection_info, [tlsv1]}}, -					{options,  -					 [{versions, [tlsv1]} | ServerOpts]}]), -    Port = ssl_test_lib:inet_port(Server), - -    Cmd = "openssl s_client -port " ++ integer_to_list(Port)  ++  -	" -host localhost -tls1", - -    test_server:format("openssl cmd: ~p~n", [Cmd]), -     -    OpenSslPort =  open_port({spawn, Cmd}, [stderr_to_stdout]),  -      -    ssl_test_lib:check_result(Server, ok), -     -    %% Clean close down!   Server needs to be closed first !! -    ssl_test_lib:close(Server), -    close_port(OpenSslPort), -    process_flag(trap_exit, false), -    ok. - -%%-------------------------------------------------------------------- - -tls1_erlang_client_openssl_server_client_cert(doc) -> -    ["Test erlang client with openssl server when client sends cert"]; -tls1_erlang_client_openssl_server_client_cert(suite) -> -    []; -tls1_erlang_client_openssl_server_client_cert(Config) when is_list(Config) -> -    process_flag(trap_exit, true), -    ServerOpts = ?config(server_verification_opts, Config),   -    ClientOpts = ?config(client_verification_opts, Config),   - -    {ClientNode, _, Hostname} = ssl_test_lib:run_where(Config), -     -    Data = "From openssl to erlang", -     -    Port = ssl_test_lib:inet_port(node()), -    CaCertFile = proplists:get_value(cacertfile, ServerOpts), -    CertFile = proplists:get_value(certfile, ServerOpts), -    KeyFile = proplists:get_value(keyfile, ServerOpts), -    -    Cmd = "openssl s_server -accept " ++ integer_to_list(Port)  ++  -	" -cert " ++ CertFile ++ " -CAfile " ++ CaCertFile  -	++ " -key " ++ KeyFile ++ " -Verify 2 -tls1",  -     -    test_server:format("openssl cmd: ~p~n", [Cmd]), - -    OpensslPort =  open_port({spawn, Cmd}, [stderr_to_stdout]),  - -    wait_for_openssl_server(), - -    Client = ssl_test_lib:start_client([{node, ClientNode}, {port, Port},  -					{host, Hostname}, -					{from, self()},  -					{mfa, {?MODULE,  -					       erlang_ssl_receive, [Data]}}, -					{options, ClientOpts}]), -    port_command(OpensslPort, Data), -     -    ssl_test_lib:check_result(Client, ok), -   -    %% Clean close down!   Server needs to be closed first !! -    close_port(OpensslPort), -    ssl_test_lib:close(Client), -    process_flag(trap_exit, false), -    ok. -  %%--------------------------------------------------------------------   -tls1_erlang_server_openssl_client_client_cert(doc) -> -    ["Test erlang server with openssl client when client sends cert"]; -tls1_erlang_server_openssl_client_client_cert(suite) -> -    []; -tls1_erlang_server_openssl_client_client_cert(Config) when is_list(Config) -> -    process_flag(trap_exit, true), -    ServerOpts = ?config(server_verification_opts, Config),   -    ClientOpts = ?config(client_verification_opts, Config),   - -    {_, ServerNode, _} = ssl_test_lib:run_where(Config), -     -    Data = "From openssl to erlang", - -    Server = ssl_test_lib:start_server([{node, ServerNode}, {port, 0},  -					{from, self()},  -					{mfa, {?MODULE,  -					       erlang_ssl_receive, [Data]}}, -					{options,  -					 [{verify , verify_peer}  -					  | ServerOpts]}]), -    Port = ssl_test_lib:inet_port(Server), -     -    CaCertFile = proplists:get_value(cacertfile, ClientOpts), -    CertFile = proplists:get_value(certfile, ClientOpts), -    KeyFile = proplists:get_value(keyfile, ClientOpts), -     -    Cmd = "openssl s_client -cert " ++ CertFile ++ " -CAfile " ++ CaCertFile  -	++ " -key " ++ KeyFile ++ " -port " ++ integer_to_list(Port)  ++  -	" -host localhost -tls1", - -    test_server:format("openssl cmd: ~p~n", [Cmd]), -     -    OpenSslPort =  open_port({spawn, Cmd}, [stderr_to_stdout]),  -    port_command(OpenSslPort, Data), -     -    ssl_test_lib:check_result(Server, ok), -     -    %% Clean close down!   Server needs to be closed first !! -    ssl_test_lib:close(Server), -    close_port(OpenSslPort), -    process_flag(trap_exit, false), -    ok. - -%%-------------------------------------------------------------------- -tls1_erlang_server_erlang_client_client_cert(doc) -> -    ["Test erlang server with erlang client when client sends cert"]; -tls1_erlang_server_erlang_client_client_cert(suite) -> -    []; -tls1_erlang_server_erlang_client_client_cert(Config) when is_list(Config) -> -    process_flag(trap_exit, true), -    ServerOpts = ?config(server_verification_opts, Config),   -    ClientOpts = ?config(client_verification_opts, Config),   - -    {ClientNode, ServerNode, Hostname} = ssl_test_lib:run_where(Config), -     -    Data = "From erlang to erlang", - -    Server = ssl_test_lib:start_server([{node, ServerNode}, {port, 0},  -					{from, self()},  -					{mfa, {?MODULE,  -					       erlang_ssl_receive, [Data]}}, -					{options,  -					 [{verify , verify_peer}  -					  | ServerOpts]}]), -    Port = ssl_test_lib:inet_port(Server), -     -    Client = ssl_test_lib:start_client([{node, ClientNode}, {port, Port},  -					{host, Hostname}, -					{from, self()},  -					{mfa, {ssl, send, [Data]}}, -					{options,  -					 [{versions, [tlsv1]} | ClientOpts]}]), -     -    ssl_test_lib:check_result(Server, ok, Client, ok), -    ssl_test_lib:close(Server), -    process_flag(trap_exit, false), -    ok. -%%-------------------------------------------------------------------- -  ciphers_rsa_signed_certs(doc) ->       ["Test cipher suites that uses rsa certs"]; @@ -1190,12 +917,6 @@ cipher(CipherSuite, Version, Config, ClientOpts, ServerOpts) ->      process_flag(trap_exit, false),      Return. - -version_flag(tlsv1) -> -    " -tls1 "; -version_flag(sslv3) -> -    " -ssl3 ". -  %%--------------------------------------------------------------------  erlang_client_bad_openssl_server(doc) ->      [""]; @@ -1211,8 +932,8 @@ erlang_client_bad_openssl_server(Config) when is_list(Config) ->      Port = ssl_test_lib:inet_port(node()),      CertFile = proplists:get_value(certfile, ServerOpts),      KeyFile = proplists:get_value(keyfile, ServerOpts), - -    Cmd = "openssl s_server -accept " ++ integer_to_list(Port)  ++  +    Version = ssl_record:protocol_version(ssl_record:highest_protocol_version([])), +    Cmd = "openssl s_server -accept " ++ integer_to_list(Port)  ++  version_flag(Version) ++   	" -cert " ++ CertFile ++ " -key " ++ KeyFile ++ "",      test_server:format("openssl cmd: ~p~n", [Cmd]), @@ -1226,7 +947,7 @@ erlang_client_bad_openssl_server(Config) when is_list(Config) ->  					 {from, self()},    					{mfa, {?MODULE, server_sent_garbage, []}},  					 {options, -					  [{versions, [tlsv1]} | ClientOpts]}]), +					  [{versions, [Version]} | ClientOpts]}]),      %% Send garbage      port_command(OpensslPort, ?OPENSSL_GARBAGE), @@ -1245,7 +966,7 @@ erlang_client_bad_openssl_server(Config) when is_list(Config) ->   					 {from, self()},   					 {mfa, {ssl_test_lib, no_result_msg, []}},   					 {options, - 					  [{versions, [tlsv1]} | ClientOpts]}]), +					  [{versions, [Version]} | ClientOpts]}]),      %% Clean close down!   Server needs to be closed first !!      close_port(OpensslPort), @@ -1271,8 +992,8 @@ expired_session(Config) when is_list(Config) ->      Port = ssl_test_lib:inet_port(node()),      CertFile = proplists:get_value(certfile, ServerOpts),      KeyFile = proplists:get_value(keyfile, ServerOpts), -    -    Cmd = "openssl s_server -accept " ++ integer_to_list(Port)  ++  + +    Cmd = "openssl s_server -accept " ++ integer_to_list(Port)  ++  	" -cert " ++ CertFile ++ " -key " ++ KeyFile ++ "",       test_server:format("openssl cmd: ~p~n", [Cmd]), @@ -1437,15 +1158,22 @@ wait_for_openssl_server() ->  	    %% more so than sleep!)  	    test_server:sleep(?SLEEP)      end. -	     + +version_flag(tlsv1) -> +    " -tls1 "; +version_flag('tlsv1.1') -> +    " -tls1_1 "; +version_flag('tlsv1.2') -> +    " -tls1_2 "; +version_flag(sslv3) -> +    " -ssl3 ". +  check_sane_openssl_renegotaite(Config) ->      case os:cmd("openssl version") of  	"OpenSSL 0.9.8" ++ _ -> -	    {skip, "Known renegotiation bug in OppenSSL"}; +	    {skip, "Known renegotiation bug in OpenSSL"};  	"OpenSSL 0.9.7" ++ _ -> -	    {skip, "Known renegotiation bug in OppenSSL"}; -	"OpenSSL 1.0.1c" ++ _ ->  -	    {skip, "Known renegotiation bug in OppenSSL"}; +	    {skip, "Known renegotiation bug in OpenSSL"};  	_ ->  	    Config      end. @@ -1458,10 +1186,18 @@ check_sane_openssl_sslv2(Config) ->  	    Config      end. -check_sane_openssl_dsa(Config) -> -    case os:cmd("openssl version") of -	"OpenSSL 1.0.1" ++ _ -> -	    {skip, "known dsa bug in openssl"}; -	_ -> -	    Config +check_sane_openssl_version(Version) -> +    case {Version, os:cmd("openssl version")} of +	{_, "OpenSSL 1.0.1" ++ _} -> +	    true; +	{'tlsv1.2', "OpenSSL 1.0" ++ _} -> +	    false; +	{'tlsv1.1', "OpenSSL 1.0" ++ _} -> +	    false; +	{'tlsv1.2', "OpenSSL 0" ++ _} -> +	    false; +	{'tlsv1.1', "OpenSSL 0" ++ _} -> +	    false; +	{_, _} -> +	    true      end. | 
