diff options
-rw-r--r-- | lib/kernel/src/inet_epmd_socket.erl | 11 | ||||
-rw-r--r-- | lib/ssl/src/inet_tls_dist.erl | 244 | ||||
-rw-r--r-- | lib/ssl/test/cryptcookie.erl | 20 | ||||
-rw-r--r-- | lib/ssl/test/inet_epmd_socket_cryptcookie.erl | 5 | ||||
-rw-r--r-- | lib/ssl/test/openssl_ocsp_SUITE.erl | 8 | ||||
-rw-r--r-- | lib/ssl/test/ssl_dist_SUITE.erl | 17 | ||||
-rw-r--r-- | lib/ssl/test/ssl_dist_bench_SUITE.erl | 28 | ||||
-rw-r--r-- | lib/ssl/test/ssl_pem_cache_SUITE.erl | 10 | ||||
-rw-r--r-- | lib/ssl/test/ssl_test_lib.erl | 380 | ||||
-rw-r--r-- | lib/ssl/test/ssl_test_lib.hrl | 20 | ||||
-rw-r--r-- | lib/ssl/test/ssl_trace_SUITE.erl | 24 |
11 files changed, 419 insertions, 348 deletions
diff --git a/lib/kernel/src/inet_epmd_socket.erl b/lib/kernel/src/inet_epmd_socket.erl index 534f2ffe8d..49a56f84d0 100644 --- a/lib/kernel/src/inet_epmd_socket.erl +++ b/lib/kernel/src/inet_epmd_socket.erl @@ -26,6 +26,8 @@ accept_open/2, accept_controller/3, accepted/3, connect/3]). +-export([supported/0]). + -include("net_address.hrl"). -include("dist.hrl"). -include("dist_util.hrl"). @@ -455,3 +457,12 @@ input_data(Socket) -> put_data(DistHandle, _PacketSize, Packet) -> %% erlang:display({'<<==', _PacketSize}), erlang:dist_ctrl_put_data(DistHandle, Packet). + +%% ------------------------------------------------------------ +supported() -> + try socket:is_supported(ipv6) of + _ -> + ok + catch error : notsup -> + "Module 'socket' not supported" + end. diff --git a/lib/ssl/src/inet_tls_dist.erl b/lib/ssl/src/inet_tls_dist.erl index 15d460d85c..89fe5ccf7d 100644 --- a/lib/ssl/src/inet_tls_dist.erl +++ b/lib/ssl/src/inet_tls_dist.erl @@ -34,6 +34,11 @@ -export([verify_client/3, cert_nodes/1]). +%% kTLS helpers +-export([inet_ktls_setopt/3, inet_ktls_getopt/3, + set_ktls/1, set_ktls_ulp/2, set_ktls_cipher/5, + ktls_os/0, ktls_opt_ulp/1, ktls_opt_cipher/6]). + -export([dbg/0]). % Debug -include_lib("kernel/include/net_address.hrl"). @@ -345,7 +350,7 @@ accept_one(Family, Socket, NetKernel) -> case KTLS of true -> {ok, KtlsInfo} = ssl_gen_statem:ktls_handover(Receiver), - case set_ktls(KtlsInfo) of + case inet_set_ktls(KtlsInfo) of ok -> accept_one( Family, maps:get(socket, KtlsInfo), NetKernel, @@ -648,7 +653,7 @@ do_setup( {ok, KtlsInfo} = ssl_gen_statem:ktls_handover(Receiver), Socket = maps:get(socket, KtlsInfo), - case set_ktls(KtlsInfo) of + case inet_set_ktls(KtlsInfo) of ok when is_port(Socket) -> %% XXX Breaking abstraction barrier Driver = erlang:port_get_data(Socket), @@ -916,69 +921,142 @@ verify_fun(Value) -> error(malformed_ssl_dist_opt, [Value]) end. -set_ktls(KtlsInfo) -> - %% - %% Check OS type and version + +inet_set_ktls( + #{ socket := Socket, socket_options := SocketOptions } = KtlsInfo) -> %% - case {os:type(), os:version()} of - {{unix,linux}, {_,_,_} = OsVersion} - when {5,2,0} =< OsVersion -> - set_ktls_1(KtlsInfo); - OsTypeVersion -> - {error, {ktls_invalid_os, OsTypeVersion}} + maybe + ok ?= + set_ktls( + KtlsInfo + #{ setopt_fun => fun ?MODULE:inet_ktls_setopt/3, + getopt_fun => fun ?MODULE:inet_ktls_getopt/3 }), + %% + #socket_options{ + mode = _Mode, + packet = Packet, + packet_size = PacketSize, + header = Header, + active = Active + } = SocketOptions, + case + inet:setopts( + Socket, + [list, {packet, Packet}, {packet_size, PacketSize}, + {header, Header}, {active, Active}]) + of + ok -> + ok; + {error, SetoptError} -> + {error, {ktls_setopt_failed, SetoptError}} + end end. -%% Check TLS version and cipher suite -%% -set_ktls_1( - #{tls_version := {3,4}, % 'tlsv1.3' - cipher_suite := CipherSuite, - socket := Socket} = KtlsInfo) - when CipherSuite =:= ?TLS_AES_256_GCM_SHA384 -> - %% - %% See https://www.kernel.org/doc/html/latest/networking/tls.html - %% and include/netinet/tcp.h +inet_ktls_setopt(Socket, {Level, Opt}, Value) + when is_integer(Level), is_integer(Opt), is_binary(Value) -> + inet:setopts(Socket, [{raw, Level, Opt, Value}]). + +inet_ktls_getopt(Socket, {Level, Opt}, Size) + when is_integer(Level), is_integer(Opt), is_integer(Size) -> + case inet:getopts(Socket, [{raw, Level, Opt, Size}]) of + {ok, [{raw, Level, Opt, Value}]} -> + {ok, Value}; + {ok, _} = Error -> + {error, Error}; + {error, _} = Error -> + Error + end. + + +set_ktls(KtlsInfo) -> + maybe + {ok, OS} ?= ktls_os(), + ok ?= set_ktls_ulp(KtlsInfo, OS), + #{ write_state := WriteState, + write_seq := WriteSeq, + read_state := ReadState, + read_seq := ReadSeq } = KtlsInfo, + ok ?= set_ktls_cipher(KtlsInfo, OS, WriteState, WriteSeq, tx), + set_ktls_cipher(KtlsInfo, OS, ReadState, ReadSeq, rx) + end. + +set_ktls_ulp( + #{ socket := Socket, + setopt_fun := SetoptFun, + getopt_fun := GetoptFun }, + OS) -> %% - SOL_TCP = 6, - TCP_ULP = 31, - KtlsMod = <<"tls">>, % Linux kernel module name - KtlsModSize = byte_size(KtlsMod), - _ = inet:setopts(Socket, [{raw, SOL_TCP, TCP_ULP, KtlsMod}]), + {Option, Value} = ktls_opt_ulp(OS), + Size = byte_size(Value), + _ = SetoptFun(Socket, Option, Value), %% %% Check if kernel module loaded, - %% i.e if getopts SOL_TCP,TCP_ULP returns KtlsMod + %% i.e if getopts Level, Opt returns Value %% - case - inet:getopts(Socket, [{raw, SOL_TCP, TCP_ULP, KtlsModSize + 1}]) - of - {ok, [{raw, SOL_TCP, TCP_ULP, <<KtlsMod:KtlsModSize/binary,0>>}]} -> - set_ktls_2(KtlsInfo, Socket); + case GetoptFun(Socket, Option, Size + 1) of + {ok, <<Value:Size/binary, 0>>} -> + ok; Other -> - {error, {ktls_not_supported, Other}} - end; -set_ktls_1( - #{tls_version := TLSVersion, - cipher_suite := CipherSuite, - socket := _}) -> - {error, {ktls_invalid_cipher, TLSVersion, CipherSuite}}. + {error, {ktls_set_ulp_failed, Option, Value, Other}} + end. %% Set kTLS cipher %% -set_ktls_2( - #{write_state := - #cipher_state{ - key = <<WriteKey:32/bytes>>, - iv = <<WriteSalt:4/bytes, WriteIV:8/bytes>> - }, - write_seq := WriteSeq, - read_state := - #cipher_state{ - key = <<ReadKey:32/bytes>>, - iv = <<ReadSalt:4/bytes, ReadIV:8/bytes>> - }, - read_seq := ReadSeq, - socket_options := SocketOptions}, - Socket) -> +set_ktls_cipher( + _KtlsInfo = + #{ tls_version := TLS_version, + cipher_suite := CipherSuite, + %% + socket := Socket, + setopt_fun := SetoptFun, + getopt_fun := GetoptFun }, + OS, CipherState, CipherSeq, TxRx) -> + maybe + {ok, {Option, Value}} ?= + ktls_opt_cipher( + OS, TLS_version, CipherSuite, CipherState, CipherSeq, TxRx), + _ = SetoptFun(Socket, Option, Value), + case TxRx of + tx -> + Size = byte_size(Value), + case GetoptFun(Socket, Option, Size) of + {ok, Value} -> + ok; + Other -> + {error, {ktls_set_cipher_failed, Other}} + end; + rx -> + ok + end + end. + +ktls_os() -> + OS = {os:type(), os:version()}, + case OS of + {{unix,linux}, OsVersion} when {5,2,0} =< OsVersion -> + {ok, OS}; + _ -> + {error, {ktls_notsup, {os,OS}}} + end. + +ktls_opt_ulp(_OS) -> + %% + %% See https://www.kernel.org/doc/html/latest/networking/tls.html + %% and include/netinet/tcp.h + %% + SOL_TCP = 6, TCP_ULP = 31, + KtlsMod = <<"tls">>, + {{SOL_TCP,TCP_ULP}, KtlsMod}. + +ktls_opt_cipher( + _OS, + _TLS_version = {3,4}, % 'tlsv1.3' + _CipherSpec = ?TLS_AES_256_GCM_SHA384, + #cipher_state{ + key = <<Key:32/bytes>>, + iv = <<Salt:4/bytes, IV:8/bytes>> }, + CipherSeq, + TxRx) when is_integer(CipherSeq) -> %% %% See include/linux/tls.h %% @@ -987,51 +1065,29 @@ set_ktls_2( TLS_1_3_VERSION = (TLS_1_3_VERSION_MAJOR bsl 8) bor TLS_1_3_VERSION_MINOR, TLS_CIPHER_AES_GCM_256 = 52, - TLS_crypto_info_TX = - <<TLS_1_3_VERSION:16/native, - TLS_CIPHER_AES_GCM_256:16/native, - WriteIV/bytes, WriteKey/bytes, - WriteSalt/bytes, WriteSeq:64/native>>, - TLS_crypto_info_RX = + SOL_TLS = 282, + TLS_TX = 1, + TLS_RX = 2, + Value = <<TLS_1_3_VERSION:16/native, TLS_CIPHER_AES_GCM_256:16/native, - ReadIV/bytes, ReadKey/bytes, - ReadSalt/bytes, ReadSeq:64/native>>, + IV/bytes, Key/bytes, + Salt/bytes, CipherSeq:64/native>>, + %% SOL_TLS = 282, TLS_TX = 1, TLS_RX = 2, - RawOptTX = {raw, SOL_TLS, TLS_TX, TLS_crypto_info_TX}, - RawOptRX = {raw, SOL_TLS, TLS_RX, TLS_crypto_info_RX}, - _ = inet:setopts(Socket, [RawOptTX]), - _ = inet:setopts(Socket, [RawOptRX]), - %% - %% Check if cipher could be set - %% - case - inet:getopts( - Socket, [{raw, SOL_TLS, TLS_TX, byte_size(TLS_crypto_info_TX)}]) - of - {ok, [RawOptTX]} -> - #socket_options{ - mode = _Mode, - packet = Packet, - packet_size = PacketSize, - header = Header, - active = Active - } = SocketOptions, - case - inet:setopts( - Socket, - [list, {packet, Packet}, {packet_size, PacketSize}, - {header, Header}, {active, Active}]) - of - ok -> ok; - {error, SetoptError} -> - {error, {ktls_setopt_failed, SetoptError}} - end; - Other -> - {error, {ktls_set_cipher_failed, Other}} - end. + TLS_TxRx = + case TxRx of + tx -> TLS_TX; + rx -> TLS_RX + end, + {ok, {{SOL_TLS,TLS_TxRx}, Value}}; +ktls_opt_cipher( + _OS, TLS_version, CipherSpec, _CipherState, _CipherSeq, _TxRx) -> + {error, + {ktls_notsup, {cipher, TLS_version, CipherSpec, _CipherState}}}. + %% ------------------------------------------------------------------------- diff --git a/lib/ssl/test/cryptcookie.erl b/lib/ssl/test/cryptcookie.erl index b713bc15a8..28a539f061 100644 --- a/lib/ssl/test/cryptcookie.erl +++ b/lib/ssl/test/cryptcookie.erl @@ -25,8 +25,9 @@ -module(cryptcookie). -feature(maybe_expr, enable). --export([supported/0, start_keypair_server/0, init/1, init/2]). --export([encrypt_and_send_chunk/4, recv_and_decrypt_chunk/2]). +-export([supported/0, start_keypair_server/0, init/1, init/2, + encrypt_and_send_chunk/4, recv_and_decrypt_chunk/2, + record_to_map/2]). %% ------------------------------------------------------------------------- %% The curve choice greatly affects setup time, @@ -649,6 +650,21 @@ decrypt_rekey( %% ------------------------------------------------------------------------- +-define(RECORD_TO_MAP(Name, Record), + record_to_map(Name, Record = #Name{}) -> + record_to_map(record_info(fields, Name), Record, 2, #{})). + +%%%record_to_map(params, Record = #params{}) -> +%%% record_to_map(record_info(fields, params), Record, 2, #{}). +?RECORD_TO_MAP(params, Record). +%% +record_to_map([Field | Fields], Record, Index, Map) -> + record_to_map( + Fields, Record, Index + 1, + Map#{ Field => element(Index, Record) }); +record_to_map([], _Record, _Index, Map) -> + Map. + timestamp() -> erlang:monotonic_time(second). diff --git a/lib/ssl/test/inet_epmd_socket_cryptcookie.erl b/lib/ssl/test/inet_epmd_socket_cryptcookie.erl index d1b78bebe3..fbe3df0f98 100644 --- a/lib/ssl/test/inet_epmd_socket_cryptcookie.erl +++ b/lib/ssl/test/inet_epmd_socket_cryptcookie.erl @@ -230,4 +230,7 @@ stream_controlling_process(Stream = {_, [_ | Socket], _}, Pid) -> %% ------------------------------------------------------------ supported() -> - dist_cryptcookie:supported(). + maybe + ok ?= inet_epmd_socket:supported(), + dist_cryptcookie:supported() + end. diff --git a/lib/ssl/test/openssl_ocsp_SUITE.erl b/lib/ssl/test/openssl_ocsp_SUITE.erl index 800ce3ce78..a06dcbcb7b 100644 --- a/lib/ssl/test/openssl_ocsp_SUITE.erl +++ b/lib/ssl/test/openssl_ocsp_SUITE.erl @@ -1,7 +1,7 @@ %% %% %CopyrightBegin% %% -%% Copyright Ericsson AB 2011-2022. All Rights Reserved. +%% Copyright Ericsson AB 2011-2023. All Rights Reserved. %% %% Licensed under the Apache License, Version 2.0 (the "License"); %% you may not use this file except in compliance with the License. @@ -242,16 +242,16 @@ ocsp_responder_init(ResponderPort, PrivDir, Starter) -> ocsp_responder_loop(Port, {Status, Starter} = State) -> receive {_Port, closed} -> - ?LOG("Port Closed"), + ?CT_LOG("Port Closed"), ok; {'EXIT', _Port, Reason} -> - ?LOG("Port Closed ~p",[Reason]), + ?CT_LOG("Port Closed ~p",[Reason]), ok; {Port, {data, _Msg}} when Status == new -> Starter ! {started, self()}, ocsp_responder_loop(Port, {started, undefined}); {Port, {data, Msg}} -> - ?PAL("Responder Msg ~p",[Msg]), + ?CT_PAL("Responder Msg ~p",[Msg]), ocsp_responder_loop(Port, State) after 1000 -> case Status of diff --git a/lib/ssl/test/ssl_dist_SUITE.erl b/lib/ssl/test/ssl_dist_SUITE.erl index a870f75ae1..70d43cbfd0 100644 --- a/lib/ssl/test/ssl_dist_SUITE.erl +++ b/lib/ssl/test/ssl_dist_SUITE.erl @@ -1,7 +1,7 @@ %% %% %CopyrightBegin% %% -%% Copyright Ericsson AB 2007-2022. All Rights Reserved. +%% Copyright Ericsson AB 2007-2023. All Rights Reserved. %% %% Licensed under the Apache License, Version 2.0 (the "License"); %% you may not use this file except in compliance with the License. @@ -290,9 +290,9 @@ ktls_encrypt_decrypt(Test) when is_boolean(Test) -> {ok, Server} = gen_tcp:accept(Listen), try maybe - ok ?= ssl_test_lib:ktls_check_os(), - ok ?= ssl_test_lib:ktls_set_ulp(Client), - ok ?= ssl_test_lib:ktls_set_cipher(Client, tx, 11), + {ok, OS} ?= ssl_test_lib:ktls_os(), + ok ?= ssl_test_lib:ktls_set_ulp(Client, OS), + ok ?= ssl_test_lib:ktls_set_cipher(Client, OS, tx, 11), case Test of false -> ok; @@ -301,7 +301,7 @@ ktls_encrypt_decrypt(Test) when is_boolean(Test) -> end else {error, Reason} -> - {skip, {ktls, Reason}} + {skip, Reason} end after _ = gen_tcp:close(Server), @@ -321,8 +321,9 @@ ktls_encrypt_decrypt(Client, Server) -> receive after 500 -> ok end, % Give time for data to arrive %% %% Activate Server TX encryption - ok = ssl_test_lib:ktls_set_ulp(Server), - ok = ssl_test_lib:ktls_set_cipher(Server, tx, 17), + {ok, OS} = ssl_test_lib:ktls_os(), + ok = ssl_test_lib:ktls_set_ulp(Server, OS), + ok = ssl_test_lib:ktls_set_cipher(Server, OS, tx, 17), %% Send encrypted from Server ok = gen_tcp:send(Server, Data), %% Receive encrypted data without decryption @@ -335,7 +336,7 @@ ktls_encrypt_decrypt(Client, Server) -> ok end, %% Finally, activate Server decryption - ok = ssl_test_lib:ktls_set_cipher(Server, rx, 11), + ok = ssl_test_lib:ktls_set_cipher(Server, OS, rx, 11), %% Receive and decrypt the data that was first sent {ok, Data} = gen_tcp:recv(Server, 0, 1000), ok. diff --git a/lib/ssl/test/ssl_dist_bench_SUITE.erl b/lib/ssl/test/ssl_dist_bench_SUITE.erl index 81c6c5af16..12f6aab0c1 100644 --- a/lib/ssl/test/ssl_dist_bench_SUITE.erl +++ b/lib/ssl/test/ssl_dist_bench_SUITE.erl @@ -256,7 +256,7 @@ init_per_group(crypto_socket, Config) -> {fail, {Class, Reason, Stacktrace}} end; init_per_group(crypto_inet, Config) -> - try inet_epmd_socket_cryptcookie:supported() of + try inet_epmd_inet_cryptcookie:supported() of ok -> [{ssl_dist, false}, {ssl_dist_prefix, "Crypto-Inet"}, {ssl_dist_args, @@ -272,11 +272,19 @@ init_per_group(plain, Config) -> [{ssl_dist, false}, {ssl_dist_prefix, "Plain"}|Config]; %% init_per_group(socket, Config) -> - [{ssl_dist, false}, - {ssl_dist_prefix, "Socket"}, - {ssl_dist_args, - "-proto_dist inet_epmd -inet_epmd socket"} - | Config]; + try inet_epmd_socket:supported() of + ok -> + [{ssl_dist, false}, + {ssl_dist_prefix, "Socket"}, + {ssl_dist_args, + "-proto_dist inet_epmd -inet_epmd socket"} + | Config]; + Problem -> + {skip, Problem} + catch + Class : Reason : Stacktrace -> + {fail, {Class, Reason, Stacktrace}} + end; %% init_per_group(ktls, Config) -> {ok, Listen} = gen_tcp:listen(0, [{active, false}]), @@ -286,16 +294,16 @@ init_per_group(ktls, Config) -> {ok, Server} = gen_tcp:accept(Listen), try maybe - ok ?= ssl_test_lib:ktls_check_os(), - ok ?= ssl_test_lib:ktls_set_ulp(Client), - ok ?= ssl_test_lib:ktls_set_cipher(Client, tx, 1), + {ok, OS} ?= ssl_test_lib:ktls_os(), + ok ?= ssl_test_lib:ktls_set_ulp(Client, OS), + ok ?= ssl_test_lib:ktls_set_cipher(Client, OS, tx, 1), [{ktls, true}, {ssl_dist_prefix, proplists:get_value(ssl_dist_prefix, Config) ++ "-kTLS"} | proplists:delete(ssl_dist_prefix, Config)] else {error, Reason} -> - {skip, {ktls, Reason}} + {skip, Reason} end after _ = gen_tcp:close(Server), diff --git a/lib/ssl/test/ssl_pem_cache_SUITE.erl b/lib/ssl/test/ssl_pem_cache_SUITE.erl index 53c95c0cb7..5610def4a9 100644 --- a/lib/ssl/test/ssl_pem_cache_SUITE.erl +++ b/lib/ssl/test/ssl_pem_cache_SUITE.erl @@ -1,7 +1,7 @@ %% %% %CopyrightBegin% %% -%% Copyright Ericsson AB 2015-2022. All Rights Reserved. +%% Copyright Ericsson AB 2015-2023. All Rights Reserved. %% %% Licensed under the Apache License, Version 2.0 (the "License"); %% you may not use this file except in compliance with the License. @@ -478,9 +478,9 @@ check_tables(ExpectedTables) -> true -> ok; _ -> - ?PAL("Mismatch for table ~w", [ActualLabel]), - ?PAL("Expected = ~w", [ExpectedTableSorted]), - ?PAL("Actual = ~w", [ActualTableSorted]), + ?CT_PAL("Mismatch for table ~w", [ActualLabel]), + ?CT_PAL("Expected = ~w", [ExpectedTableSorted]), + ?CT_PAL("Actual = ~w", [ActualTableSorted]), ct:fail({data_mismatch, ActualLabel}) end end, @@ -512,7 +512,7 @@ new_root_pem_helper(Config, CleanMode, %% ConnectedN - state after establishing Nth connection %% Cleaned - state after periodical cleanup %% DisconnectedN - state after closing Nth connection - ?PAL(">>> IntermediateServerKeyId = ~w", [IntermediateServerKeyId]), + ?CT_PAL(">>> IntermediateServerKeyId = ~w", [IntermediateServerKeyId]), {ServerCAFile, ClientConf0, ServerConf, ServerRootCert0, ClientBase, ServerBase} = create_initial_config(Config), diff --git a/lib/ssl/test/ssl_test_lib.erl b/lib/ssl/test/ssl_test_lib.erl index dcb6597ae1..e8d517c19a 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-2022. All Rights Reserved. +%% Copyright Ericsson AB 2008-2023. All Rights Reserved. %% %% Licensed under the Apache License, Version 2.0 (the "License"); %% you may not use this file except in compliance with the License. @@ -25,6 +25,8 @@ -include_lib("common_test/include/ct.hrl"). -include_lib("public_key/include/public_key.hrl"). -include_lib("ssl/src/tls_handshake_1_3.hrl"). +-include_lib("ssl/src/ssl_cipher.hrl"). +-include_lib("ssl/src/ssl_internal.hrl"). -export([clean_start/0, clean_start/1, @@ -220,9 +222,9 @@ %% Tracing -export([handle_trace/3]). --export([ktls_check_os/0, - ktls_set_ulp/1, - ktls_set_cipher/3]). +-export([ktls_os/0, + ktls_set_ulp/2, + ktls_set_cipher/4]). -record(sslsocket, { fd = nil, pid = nil}). -define(SLEEP, 1000). @@ -510,7 +512,7 @@ run_server(Opts) -> Options = proplists:get_value(options, Opts), Pid = proplists:get_value(from, Opts), Transport = proplists:get_value(transport, Opts, ssl), - ?LOG("~nssl:listen(~p, ~p)~n", [Port, format_options(Options)]), + ?CT_LOG("~nssl:listen(~p, ~p)~n", [Port, format_options(Options)]), case Transport:listen(Port, Options) of {ok, ListenSocket} -> Pid ! {listen, up}, @@ -533,11 +535,11 @@ run_server(ListenSocket, Opts, N) -> run_server(ListenSocket, Opts, N-1). do_run_server(_, {error, _} = Result, Opts) -> - ?LOG("Server error result ~p~n", [Result]), + ?CT_LOG("Server error result ~p~n", [Result]), Pid = proplists:get_value(from, Opts), Pid ! {self(), Result}; do_run_server(_, ok = Result, Opts) -> - ?LOG("Server cancel result ~p~n", [Result]), + ?CT_LOG("Server cancel result ~p~n", [Result]), Pid = proplists:get_value(from, Opts), Pid ! {self(), Result}; do_run_server(ListenSocket, AcceptSocket, Opts) -> @@ -548,7 +550,7 @@ do_run_server(ListenSocket, AcceptSocket, Opts) -> no_result_msg -> ok; Msg -> - ?LOG("~nServer Msg: ~p ~n", [Msg]), + ?CT_LOG("~nServer Msg: ~p ~n", [Msg]), case lists:member(return_socket, Opts) of true -> Pid ! {self(), {Msg, AcceptSocket}}; false -> Pid ! {self(), Msg} @@ -559,14 +561,14 @@ do_run_server(ListenSocket, AcceptSocket, Opts) -> server_apply_mfa(_, undefined) -> no_result_msg; server_apply_mfa(AcceptSocket, {Module, Function, Args}) -> - ?LOG("~nServer: apply(~p,~p,~p)~n", + ?CT_LOG("~nServer: apply(~p,~p,~p)~n", [Module, Function, [AcceptSocket | Args]]), apply(Module, Function, [AcceptSocket | Args]). client_apply_mfa(_, undefined) -> no_result_msg; client_apply_mfa(AcceptSocket, {Module, Function, Args}) -> - ?LOG("~nClient: apply(~p,~p,~p)~n", + ?CT_LOG("~nClient: apply(~p,~p,~p)~n", [Module, Function, [AcceptSocket | Args]]), apply(Module, Function, [AcceptSocket | Args]). @@ -574,7 +576,7 @@ client_apply_mfa(AcceptSocket, {Module, Function, Args}) -> do_run_server_core(ListenSocket, AcceptSocket, Opts, Transport, Pid) -> receive {data, Data} -> - ?LOG("[server] Send: ~p~n", [Data]), + ?CT_LOG("[server] Send: ~p~n", [Data]), case Transport:send(AcceptSocket, Data) of ok -> Pid ! {self(), ok}; @@ -585,17 +587,17 @@ do_run_server_core(ListenSocket, AcceptSocket, Opts, Transport, Pid) -> {active_receive, Data} -> case active_recv(AcceptSocket, length(Data)) of ReceivedData -> - ?LOG("[server] Received: ~p~n", [Data]), + ?CT_LOG("[server] Received: ~p~n", [Data]), Pid ! {self(), ReceivedData} end, do_run_server_core(ListenSocket, AcceptSocket, Opts, Transport, Pid); {update_keys, Type} -> case ssl:update_keys(AcceptSocket, Type) of ok -> - ?LOG("[server] Update keys: ~p", [Type]), + ?CT_LOG("[server] Update keys: ~p", [Type]), Pid ! {self(), ok}; {error, Reason} -> - ?LOG("[server] Update keys failed: ~p", [Type]), + ?CT_LOG("[server] Update keys failed: ~p", [Type]), Pid ! {self(), Reason} end, do_run_server_core(ListenSocket, AcceptSocket, Opts, Transport, Pid); @@ -607,10 +609,10 @@ do_run_server_core(ListenSocket, AcceptSocket, Opts, Transport, Pid) -> {listen, MFA} -> run_server(ListenSocket, [MFA | proplists:delete(mfa, Opts)]); close -> - ?LOG("~nServer closing~n", []), + ?CT_LOG("~nServer closing~n", []), Result = Transport:close(AcceptSocket), Result1 = Transport:close(ListenSocket), - ?LOG("~nResult ~p : ~p ~n", [Result, Result1]) + ?CT_LOG("~nResult ~p : ~p ~n", [Result, Result1]) end. %%% To enable to test with s_client -reconnect @@ -629,35 +631,35 @@ connect(#sslsocket{} = ListenSocket, Opts) -> AcceptSocket end; connect(ListenSocket, _Opts) -> - ?LOG("~ngen_tcp:accept(~p)~n", [ListenSocket]), + ?CT_LOG("~ngen_tcp:accept(~p)~n", [ListenSocket]), {ok, AcceptSocket} = gen_tcp:accept(ListenSocket), AcceptSocket. connect(_, _, 0, AcceptSocket, _, _, _) -> AcceptSocket; connect(ListenSocket, Node, _N, _, Timeout, SslOpts, cancel) -> - ?LOG("ssl:transport_accept(~P)~n", [ListenSocket, ?PRINT_DEPTH]), + ?CT_LOG("ssl:transport_accept(~P)~n", [ListenSocket, ?PRINT_DEPTH]), {ok, AcceptSocket} = ssl:transport_accept(ListenSocket), - ?LOG("~nssl:handshake(~p,~p,~p)~n", [AcceptSocket, format_options(SslOpts),Timeout]), + ?CT_LOG("~nssl:handshake(~p,~p,~p)~n", [AcceptSocket, format_options(SslOpts),Timeout]), case ssl:handshake(AcceptSocket, SslOpts, Timeout) of {ok, Socket0, Ext} -> - ?LOG("Ext ~p:~n", [Ext]), - ?LOG("~nssl:handshake_cancel(~p)~n", [Socket0]), + ?CT_LOG("Ext ~p:~n", [Ext]), + ?CT_LOG("~nssl:handshake_cancel(~p)~n", [Socket0]), ssl:handshake_cancel(Socket0); Result -> - ?LOG("~nssl:handshake@~p ret ~p",[Node,Result]), + ?CT_LOG("~nssl:handshake@~p ret ~p",[Node,Result]), Result end; connect(ListenSocket, Node, N, _, Timeout, SslOpts, [_|_] =ContOpts0) -> - ?LOG("ssl:transport_accept(~P)~n", [ListenSocket, ?PRINT_DEPTH]), + ?CT_LOG("ssl:transport_accept(~P)~n", [ListenSocket, ?PRINT_DEPTH]), {ok, AcceptSocket} = ssl:transport_accept(ListenSocket), - ?LOG("~nssl:handshake(~p,~p,~p)~n", [AcceptSocket, SslOpts,Timeout]), + ?CT_LOG("~nssl:handshake(~p,~p,~p)~n", [AcceptSocket, SslOpts,Timeout]), case ssl:handshake(AcceptSocket, SslOpts, Timeout) of {ok, Socket0, Ext} -> [_|_] = maps:get(sni, Ext), - ?LOG("Ext ~p:~n", [Ext]), + ?CT_LOG("Ext ~p:~n", [Ext]), ContOpts = case lists:keytake(want_ext, 1, ContOpts0) of {value, {_, WantExt}, ContOpts1} -> if is_pid(WantExt) -> @@ -669,34 +671,34 @@ connect(ListenSocket, Node, N, _, Timeout, SslOpts, [_|_] =ContOpts0) -> _ -> ContOpts0 end, - ?LOG("~nssl:handshake_continue(~p,~p,~p)~n", [Socket0, ContOpts,Timeout]), + ?CT_LOG("~nssl:handshake_continue(~p,~p,~p)~n", [Socket0, ContOpts,Timeout]), case ssl:handshake_continue(Socket0, ContOpts, Timeout) of {ok, Socket} -> connect(ListenSocket, Node, N-1, Socket, Timeout, SslOpts, ContOpts0); Error -> - ?LOG("~nssl:handshake_continue@~p ret ~p",[Node,Error]), + ?CT_LOG("~nssl:handshake_continue@~p ret ~p",[Node,Error]), Error end; Result -> - ?LOG("~nssl:handshake@~p ret ~p",[Node,Result]), + ?CT_LOG("~nssl:handshake@~p ret ~p",[Node,Result]), Result end; connect(ListenSocket, Node, N, _, Timeout, [], ContOpts) -> - ?LOG("ssl:transport_accept(~P)~n", [ListenSocket, ?PRINT_DEPTH]), + ?CT_LOG("ssl:transport_accept(~P)~n", [ListenSocket, ?PRINT_DEPTH]), {ok, AcceptSocket} = ssl:transport_accept(ListenSocket), - ?LOG("~nssl:handshake(~p, ~p)~n", [AcceptSocket, Timeout]), + ?CT_LOG("~nssl:handshake(~p, ~p)~n", [AcceptSocket, Timeout]), case ssl:handshake(AcceptSocket, Timeout) of {ok, Socket} -> connect(ListenSocket, Node, N-1, Socket, Timeout, [], ContOpts); Result -> - ?LOG("~nssl:handshake@~p ret ~p",[Node,Result]), + ?CT_LOG("~nssl:handshake@~p ret ~p",[Node,Result]), Result end; connect(ListenSocket, _Node, _, _, Timeout, Opts, _) -> - ?LOG("ssl:transport_accept(~P)~n", [ListenSocket, ?PRINT_DEPTH]), + ?CT_LOG("ssl:transport_accept(~P)~n", [ListenSocket, ?PRINT_DEPTH]), {ok, AcceptSocket} = ssl:transport_accept(ListenSocket), - ?LOG("ssl:handshake(~p,~p, ~p)~n", [AcceptSocket, Opts, Timeout]), + ?CT_LOG("ssl:handshake(~p,~p, ~p)~n", [AcceptSocket, Opts, Timeout]), ssl:handshake(AcceptSocket, Opts, Timeout), AcceptSocket. @@ -722,7 +724,7 @@ transport_accept_abuse(Opts) -> Options = proplists:get_value(options, Opts), Pid = proplists:get_value(from, Opts), Transport = proplists:get_value(transport, Opts, ssl), - ?LOG("~nssl:listen(~p, ~p)~n", [Port, Options]), + ?CT_LOG("~nssl:listen(~p, ~p)~n", [Port, Options]), {ok, ListenSocket} = Transport:listen(Port, Options), Pid ! {listen, up}, send_selected_port(Pid, Port, ListenSocket), @@ -736,7 +738,7 @@ transport_switch_control(Opts) -> Options = proplists:get_value(options, Opts), Pid = proplists:get_value(from, Opts), Transport = proplists:get_value(transport, Opts, ssl), - ?LOG("~nssl:listen(~p, ~p)~n", [Port, Options]), + ?CT_LOG("~nssl:listen(~p, ~p)~n", [Port, Options]), {ok, ListenSocket} = Transport:listen(Port, Options), Pid ! {listen, up}, send_selected_port(Pid, Port, ListenSocket), @@ -867,34 +869,34 @@ openssl_server_loop(Pid, SslPort, Args) -> {data, Data} -> case port_command(SslPort, Data, [nosuspend]) of true -> - ?LOG("[openssl server] Send data: ~p~n", [Data]), + ?CT_LOG("[openssl server] Send data: ~p~n", [Data]), Pid ! {self(), ok}; _Else -> - ?LOG("[openssl server] Send failed, data: ~p~n", [Data]), + ?CT_LOG("[openssl server] Send failed, data: ~p~n", [Data]), Pid ! {self(), {error, port_command_failed}} end, openssl_server_loop(Pid, SslPort, Args); {active_receive, Data} -> case active_recv(SslPort, length(Data)) of ReceivedData -> - ?LOG("[openssl server] Received: ~p~n", [Data]), + ?CT_LOG("[openssl server] Received: ~p~n", [Data]), Pid ! {self(), ReceivedData} end, openssl_server_loop(Pid, SslPort, Args); {update_keys, Type} -> case Type of write -> - ?LOG("[openssl server] Update keys: ~p", [Type]), + ?CT_LOG("[openssl server] Update keys: ~p", [Type]), true = port_command(SslPort, "k", [nosuspend]), Pid ! {self(), ok}; read_write -> - ?LOG("[openssl server] Update keys: ~p", [Type]), + ?CT_LOG("[openssl server] Update keys: ~p", [Type]), true = port_command(SslPort, "K", [nosuspend]), Pid ! {self(), ok} end, openssl_server_loop(Pid, SslPort, Args); close -> - ?LOG("~n[openssl server] Server closing~n", []), + ?CT_LOG("~n[openssl server] Server closing~n", []), catch port_close(SslPort); {ssl_closed, _Socket} -> %% TODO @@ -944,17 +946,17 @@ openssl_client_loop_core(Pid, SslPort, Args) -> {data, Data} -> case port_command(SslPort, Data, [nosuspend]) of true -> - ?LOG("[openssl client] Send data: ~p~n", [Data]), + ?CT_LOG("[openssl client] Send data: ~p~n", [Data]), Pid ! {self(), ok}; _Else -> - ?LOG("[openssl client] Send failed, data: ~p~n", [Data]), + ?CT_LOG("[openssl client] Send failed, data: ~p~n", [Data]), Pid ! {self(), {error, port_command_failed}} end, openssl_client_loop_core(Pid, SslPort, Args); {active_receive, Data} -> case active_recv(SslPort, length(Data)) of ReceivedData -> - ?LOG("[openssl client] Received: ~p~n (forward to PID=~p)~n", + ?CT_LOG("[openssl client] Received: ~p~n (forward to PID=~p)~n", [Data, Pid]), Pid ! {self(), ReceivedData} end, @@ -962,17 +964,17 @@ openssl_client_loop_core(Pid, SslPort, Args) -> {update_keys, Type} -> case Type of write -> - ?LOG("[openssl client] Update keys: ~p", [Type]), + ?CT_LOG("[openssl client] Update keys: ~p", [Type]), true = port_command(SslPort, "k", [nosuspend]), Pid ! {self(), ok}; read_write -> - ?LOG("[openssl client] Update keys: ~p", [Type]), + ?CT_LOG("[openssl client] Update keys: ~p", [Type]), true = port_command(SslPort, "K", [nosuspend]), Pid ! {self(), ok} end, openssl_client_loop_core(Pid, SslPort, Args); close -> - ?LOG("~nClient closing~n", []), + ?CT_LOG("~nClient closing~n", []), catch port_close(SslPort); {ssl_closed, _Socket} -> %% TODO @@ -1017,8 +1019,8 @@ run_client(Opts) -> Options0 = proplists:get_value(options, Opts), Options = patch_dtls_options(Options0), ContOpts = proplists:get_value(continue_options, Opts, []), - ?LOG("~n~p:connect(~p, ~p)@~p~n", [Transport, Host, Port, Node]), - ?LOG("SSLOpts:~n ~0.p", [format_options(Options)]), + ?CT_LOG("~n~p:connect(~p, ~p)@~p~n", [Transport, Host, Port, Node]), + ?CT_LOG("SSLOpts:~n ~0.p", [format_options(Options)]), case ContOpts of [] -> client_loop(Node, Host, Port, Pid, Transport, Options, Opts); @@ -1030,7 +1032,7 @@ client_loop(_Node, Host, Port, Pid, Transport, Options, Opts) -> case Transport:connect(Host, Port, Options) of {ok, Socket} -> Pid ! {connected, Socket}, - ?LOG("~nClient: connected~n", []), + ?CT_LOG("~nClient: connected~n", []), %% In special cases we want to know the client port, it will %% be indicated by sending {port, 0} in options list! send_selected_port(Pid, proplists:get_value(port, Options), Socket), @@ -1039,7 +1041,7 @@ client_loop(_Node, Host, Port, Pid, Transport, Options, Opts) -> no_result_msg -> ok; Msg -> - ?LOG("~nClient Msg: ~p ~n", [Msg]), + ?CT_LOG("~nClient Msg: ~p ~n", [Msg]), Pid ! {self(), Msg} end, client_loop_core(Socket, Pid, Transport); @@ -1050,35 +1052,35 @@ client_loop(_Node, Host, Port, Pid, Transport, Options, Opts) -> _ -> case get(retries) of N when N < 5 -> - ?LOG("~neconnrefused retries=~p sleep ~p",[N,?SLEEP]), + ?CT_LOG("~neconnrefused retries=~p sleep ~p",[N,?SLEEP]), put(retries, N+1), ct:sleep(?SLEEP), run_client(Opts); _ -> - ?LOG("~nClient failed several times: connection failed: ~p ~n", [Reason]), + ?CT_LOG("~nClient failed several times: connection failed: ~p ~n", [Reason]), Pid ! {self(), {error, Reason}} end end; {error, econnreset = Reason} -> case get(retries) of N when N < 5 -> - ?LOG("~neconnreset retries=~p sleep ~p",[N,?SLEEP]), + ?CT_LOG("~neconnreset retries=~p sleep ~p",[N,?SLEEP]), put(retries, N+1), ct:sleep(?SLEEP), run_client(Opts); _ -> - ?LOG("~nClient failed several times: connection failed: ~p ~n", [Reason]), + ?CT_LOG("~nClient failed several times: connection failed: ~p ~n", [Reason]), Pid ! {self(), {error, Reason}} end; {error, Reason} -> - ?LOG("~nClient: connection failed: ~p ~n", [Reason]), + ?CT_LOG("~nClient: connection failed: ~p ~n", [Reason]), Pid ! {connect_failed, Reason} end. client_loop_core(Socket, Pid, Transport) -> receive {data, Data} -> - ?LOG("[client] Send: ~p~n", [Data]), + ?CT_LOG("[client] Send: ~p~n", [Data]), case Transport:send(Socket, Data) of ok -> Pid ! {self(), ok}; @@ -1089,17 +1091,17 @@ client_loop_core(Socket, Pid, Transport) -> {active_receive, Data} -> case active_recv(Socket, length(Data)) of ReceivedData -> - ?LOG("[client] Received: ~p~n", [Data]), + ?CT_LOG("[client] Received: ~p~n", [Data]), Pid ! {self(), ReceivedData} end, client_loop_core(Socket, Pid, Transport); {update_keys, Type} -> case ssl:update_keys(Socket, Type) of ok -> - ?LOG("[client] Update keys: ~p", [Type]), + ?CT_LOG("[client] Update keys: ~p", [Type]), Pid ! {self(), ok}; {error, Reason} -> - ?LOG("[client] Update keys failed: ~p", [Type]), + ?CT_LOG("[client] Update keys failed: ~p", [Type]), Pid ! {self(), Reason} end, client_loop_core(Socket, Pid, Transport); @@ -1107,7 +1109,7 @@ client_loop_core(Socket, Pid, Transport) -> Pid ! {self(), {socket, Socket}}, client_loop_core(Socket, Pid, Transport); close -> - ?LOG("~nClient closing~n", []), + ?CT_LOG("~nClient closing~n", []), Transport:close(Socket); {ssl_closed, Socket} -> ok; @@ -1131,10 +1133,10 @@ client_cont_loop(_Node, Host, Port, Pid, Transport, Options, cancel, _Opts) -> case Transport:connect(Host, Port, Options) of {ok, Socket, _} -> Result = Transport:handshake_cancel(Socket), - ?LOG("~nClient: Cancel: ~p ~n", [Result]), + ?CT_LOG("~nClient: Cancel: ~p ~n", [Result]), Pid ! {connect_failed, Result}; {error, Reason} -> - ?LOG("~nClient: connection failed: ~p ~n", [Reason]), + ?CT_LOG("~nClient: connection failed: ~p ~n", [Reason]), Pid ! {connect_failed, Reason} end; @@ -1152,45 +1154,47 @@ client_cont_loop(_Node, Host, Port, Pid, Transport, Options, ContOpts0, Opts) -> _ -> ContOpts0 end, - ?LOG("~nClient: handshake_continue(~p, ~p, infinity) ~n", [Socket0, ContOpts]), + ?CT_LOG("~nClient: handshake_continue(~p, ~p, infinity) ~n", [Socket0, ContOpts]), case Transport:handshake_continue(Socket0, ContOpts) of {ok, Socket} -> Pid ! {connected, Socket}, {Module, Function, Args} = proplists:get_value(mfa, Opts), - ?LOG("~nClient: apply(~p,~p,~p)~n", + ?CT_LOG("~nClient: apply(~p,~p,~p)~n", [Module, Function, [Socket | Args]]), case apply(Module, Function, [Socket | Args]) of no_result_msg -> ok; Msg -> - ?LOG("~nClient Msg: ~p ~n", [Msg]), + ?CT_LOG("~nClient Msg: ~p ~n", [Msg]), Pid ! {self(), Msg} end end; {error, Reason} -> - ?LOG("~nClient: connection failed: ~p ~n", [Reason]), + ?CT_LOG("~nClient: connection failed: ~p ~n", [Reason]), Pid ! {connect_failed, Reason} end. close(Pid) -> - ?LOG("~nClose ~p ~n", [Pid]), + ?CT_LOG("~nClose ~p ~n", [Pid]), Monitor = erlang:monitor(process, Pid), Pid ! close, receive {'DOWN', Monitor, process, Pid, Reason} -> erlang:demonitor(Monitor), - ?LOG("~nPid: ~p down due to:~p ~n", [Pid, Reason]) + ?CT_LOG("~nPid: ~p down due to:~p ~n", [Pid, Reason]) end. close(Pid, Timeout) -> - ?LOG("~n Close ~p ~n", [Pid]), + ?CT_LOG("~n Close ~p ~n", [Pid]), Monitor = erlang:monitor(process, Pid), Pid ! close, receive {'DOWN', Monitor, process, Pid, Reason} -> erlang:demonitor(Monitor), - ?LOG("~nPid: ~p down due to:~p ~n", [Pid, Reason]) - after Timeout -> exit(Pid, kill) + ?CT_LOG("~nPid: ~p down due to:~p ~n", [Pid, Reason]) + after + Timeout -> + exit(Pid, kill) end. get_result(Pids) -> @@ -1225,10 +1229,10 @@ match_result_msg2({Pid, {ok, {{127,_,_,_}, Port}}} = Msg, Msgs) -> false -> ct:fail({{expected, Msgs}, {got, Msg}}) end; match_result_msg2({Port, {data,Debug}}, Msgs) when is_port(Port) -> - ?LOG(" Openssl (~p) ~s~n",[Port, Debug]), + ?CT_LOG(" Openssl (~p) ~s~n",[Port, Debug]), check_result(Msgs); match_result_msg2({Port, closed}, Msgs) when is_port(Port) -> - ?LOG(" Openssl port (~p) closed ~n",[Port]), + ?CT_LOG(" Openssl port (~p) closed ~n",[Port]), check_result(Msgs); match_result_msg2(Msg, Msgs) -> ct:fail({{expected, Msgs}, {got, Msg}}). @@ -1316,7 +1320,7 @@ wait_for_result(Server, ServerMsg, Client, ClientMsg) -> %% Unexpected end; {Port, {data,Debug}} when is_port(Port) -> - ?LOG("~nopenssl ~s~n",[Debug]), + ?CT_LOG("~nopenssl ~s~n",[Debug]), wait_for_result(Server, ServerMsg, Client, ClientMsg) %% Unexpected -> %% Unexpected @@ -1337,7 +1341,7 @@ wait_for_result(Pid, Msg) -> {Pid, Msg} -> ok; {Port, {data,Debug}} when is_port(Port) -> - ?LOG("~nopenssl ~s~n",[Debug]), + ?CT_LOG("~nopenssl ~s~n",[Debug]), wait_for_result(Pid,Msg) %% Unexpected -> %% Unexpected @@ -1978,31 +1982,31 @@ run_upgrade_server(Opts) -> SslOptions = proplists:get_value(ssl_options, Opts), Pid = proplists:get_value(from, Opts), - ?LOG("~ngen_tcp:listen(~p, ~p)~n", [Port, TcpOptions]), + ?CT_LOG("~ngen_tcp:listen(~p, ~p)~n", [Port, TcpOptions]), {ok, ListenSocket} = gen_tcp:listen(Port, TcpOptions), Pid ! {listen, up}, send_selected_port(Pid, Port, ListenSocket), - ?LOG("~ngen_tcp:accept(~p)~n", [ListenSocket]), + ?CT_LOG("~ngen_tcp:accept(~p)~n", [ListenSocket]), {ok, AcceptSocket} = gen_tcp:accept(ListenSocket), try {ok, SslAcceptSocket} = case TimeOut of infinity -> - ?LOG("~nssl:handshake(~p, ~p)~n", + ?CT_LOG("~nssl:handshake(~p, ~p)~n", [AcceptSocket, SslOptions]), ssl:handshake(AcceptSocket, SslOptions); _ -> - ?LOG("~nssl:handshake(~p, ~p, ~p)~n", + ?CT_LOG("~nssl:handshake(~p, ~p, ~p)~n", [AcceptSocket, SslOptions, TimeOut]), ssl:handshake(AcceptSocket, SslOptions, TimeOut) end, {Module, Function, Args} = proplists:get_value(mfa, Opts), Msg = apply(Module, Function, [SslAcceptSocket | Args]), - ?LOG("~nUpgrade Server Msg: ~p ~n", [Msg]), + ?CT_LOG("~nUpgrade Server Msg: ~p ~n", [Msg]), Pid ! {self(), Msg}, receive close -> - ?LOG("~nUpgrade Server closing~n", []), + ?CT_LOG("~nUpgrade Server closing~n", []), ssl:close(SslAcceptSocket) end catch error:{badmatch, Error} -> @@ -2020,24 +2024,24 @@ run_upgrade_client(Opts) -> TcpOptions = proplists:get_value(tcp_options, Opts), SslOptions = proplists:get_value(ssl_options, Opts), - ?LOG("~ngen_tcp:connect(~p, ~p, ~p)~n", + ?CT_LOG("~ngen_tcp:connect(~p, ~p, ~p)~n", [Host, Port, TcpOptions]), {ok, Socket} = gen_tcp:connect(Host, Port, TcpOptions), send_selected_port(Pid, Port, Socket), - ?LOG("~nssl:connect(~p, ~p)~n", [Socket, SslOptions]), + ?CT_LOG("~nssl:connect(~p, ~p)~n", [Socket, SslOptions]), {ok, SslSocket} = ssl:connect(Socket, SslOptions), {Module, Function, Args} = proplists:get_value(mfa, Opts), - ?LOG("~napply(~p, ~p, ~p)~n", + ?CT_LOG("~napply(~p, ~p, ~p)~n", [Module, Function, [SslSocket | Args]]), Msg = apply(Module, Function, [SslSocket | Args]), - ?LOG("~nUpgrade Client Msg: ~p ~n", [Msg]), + ?CT_LOG("~nUpgrade Client Msg: ~p ~n", [Msg]), Pid ! {self(), Msg}, receive close -> - ?LOG("~nUpgrade Client closing~n", []), + ?CT_LOG("~nUpgrade Client closing~n", []), ssl:close(SslSocket) end. @@ -2052,11 +2056,11 @@ run_upgrade_client_error(Opts) -> Timeout = proplists:get_value(timeout, Opts, infinity), TcpOptions = proplists:get_value(tcp_options, Opts), SslOptions = proplists:get_value(ssl_options, Opts), - ?LOG("gen_tcp:connect(~p, ~p, ~p)", + ?CT_LOG("gen_tcp:connect(~p, ~p, ~p)", [Host, Port, TcpOptions]), {ok, Socket} = gen_tcp:connect(Host, Port, TcpOptions), send_selected_port(Pid, Port, Socket), - ?LOG("ssl:connect(~p, ~p)", [Socket, SslOptions]), + ?CT_LOG("ssl:connect(~p, ~p)", [Socket, SslOptions]), Error = ssl:connect(Socket, SslOptions, Timeout), Pid ! {self(), Error}. @@ -2075,19 +2079,19 @@ run_upgrade_server_error(Opts) -> SslOptions = proplists:get_value(ssl_options, Opts), Pid = proplists:get_value(from, Opts), - ?LOG("~ngen_tcp:listen(~p, ~p)~n", [Port, TcpOptions]), + ?CT_LOG("~ngen_tcp:listen(~p, ~p)~n", [Port, TcpOptions]), {ok, ListenSocket} = gen_tcp:listen(Port, TcpOptions), Pid ! {listen, up}, send_selected_port(Pid, Port, ListenSocket), - ?LOG("~ngen_tcp:accept(~p)~n", [ListenSocket]), + ?CT_LOG("~ngen_tcp:accept(~p)~n", [ListenSocket]), {ok, AcceptSocket} = gen_tcp:accept(ListenSocket), Error = case TimeOut of infinity -> - ?LOG("~nssl:handshake(~p, ~p)~n", + ?CT_LOG("~nssl:handshake(~p, ~p)~n", [AcceptSocket, SslOptions]), ssl:handshake(AcceptSocket, SslOptions); _ -> - ?LOG("~nssl:ssl_handshake(~p, ~p, ~p)~n", + ?CT_LOG("~nssl:ssl_handshake(~p, ~p, ~p)~n", [AcceptSocket, SslOptions, TimeOut]), ssl:handshake(AcceptSocket, SslOptions, TimeOut) end, @@ -2105,7 +2109,7 @@ run_server_error(Opts) -> Options = proplists:get_value(options, Opts), Pid = proplists:get_value(from, Opts), Transport = proplists:get_value(transport, Opts, ssl), - ?LOG("~nssl:listen(~p, ~p)~n", [Port, Options]), + ?CT_LOG("~nssl:listen(~p, ~p)~n", [Port, Options]), Timeout = proplists:get_value(timeout, Opts, infinity), case Transport:listen(Port, Options) of {ok, #sslsocket{} = ListenSocket} -> @@ -2113,19 +2117,19 @@ run_server_error(Opts) -> %% get {error, closed} and not {error, connection_refused} Pid ! {listen, up}, send_selected_port(Pid, Port, ListenSocket), - ?LOG("~nssl:transport_accept(~p)~n", [ListenSocket]), + ?CT_LOG("~nssl:transport_accept(~p)~n", [ListenSocket]), case Transport:transport_accept(ListenSocket, Timeout) of {error, _} = Error -> Pid ! {self(), Error}; {ok, AcceptSocket} -> - ?LOG("~nssl:handshake(~p)~n", [AcceptSocket]), + ?CT_LOG("~nssl:handshake(~p)~n", [AcceptSocket]), Error = ssl:handshake(AcceptSocket), Pid ! {self(), Error} end; {ok, ListenSocket} -> Pid ! {listen, up}, send_selected_port(Pid, Port, ListenSocket), - ?LOG("~n~p:accept(~p)~n", [Transport, ListenSocket]), + ?CT_LOG("~n~p:accept(~p)~n", [Transport, ListenSocket]), case Transport:accept(ListenSocket) of {error, _} = Error -> Pid ! {self(), Error} @@ -2148,7 +2152,7 @@ run_client_error(Opts) -> Transport = proplists:get_value(transport, Opts, ssl), Options0 = proplists:get_value(options, Opts), Options = patch_dtls_options(Options0), - ?LOG("~nssl:connect(~p, ~p, ~p)~n", [Host, Port, Options]), + ?CT_LOG("~nssl:connect(~p, ~p, ~p)~n", [Host, Port, Options]), Error = Transport:connect(Host, Port, Options), case Error of {error, _} -> @@ -2680,7 +2684,7 @@ der_to_pem(File, Entries) -> cipher_result(Socket, Result) -> {ok, Info} = ssl:connection_information(Socket), Result = {ok, {proplists:get_value(protocol, Info), proplists:get_value(selected_cipher_suite, Info)}}, - ?LOG("~nSuccessfull connect: ~p~n", [Result]), + ?CT_LOG("~nSuccessfull connect: ~p~n", [Result]), %% Importante to send two packets here %% to properly test "cipher state" handling Hello = "Hello\n", @@ -2789,21 +2793,21 @@ openssl_tls_version_support(Proto, Opts, Port, Exe, Args0) -> close_port(OpensslPort), true; {error, {tls_alert, {protocol_version, _}}} -> - ?PAL("OpenSSL does not support ~p", [proplists:get_value(versions, Opts)]), + ?CT_PAL("OpenSSL does not support ~p", [proplists:get_value(versions, Opts)]), close_port(OpensslPort), false; {error, {tls_alert, Alert}} -> - ?PAL("OpenSSL returned alert ~p", [Alert]), + ?CT_PAL("OpenSSL returned alert ~p", [Alert]), close_port(OpensslPort), false; {error, timeout} -> - ?PAL("Timed out connection to OpenSSL", []), + ?CT_PAL("Timed out connection to OpenSSL", []), close_port(OpensslPort), false end catch _:_ -> - ?PAL("OpenSSL does not support ~p", [proplists:get_value(versions, Opts)]), + ?CT_PAL("OpenSSL does not support ~p", [proplists:get_value(versions, Opts)]), close_port(OpensslPort), false end. @@ -2856,20 +2860,20 @@ check_key_exchange_send_active(Socket, KeyEx) -> send_recv_result_active(Socket). check_key_exchange({KeyEx,_, _}, KeyEx, _) -> - ?LOG("Kex: ~p", [KeyEx]), + ?CT_LOG("Kex: ~p", [KeyEx]), true; check_key_exchange({KeyEx,_,_,_}, KeyEx, _) -> - ?LOG("Kex: ~p", [KeyEx]), + ?CT_LOG("Kex: ~p", [KeyEx]), true; check_key_exchange(KeyEx1, KeyEx2, Version) -> - ?LOG("Kex: ~p ~p", [KeyEx1, KeyEx2]), + ?CT_LOG("Kex: ~p ~p", [KeyEx1, KeyEx2]), case Version of 'tlsv1.2' -> v_1_2_check(element(1, KeyEx1), KeyEx2); 'dtlsv1.2' -> v_1_2_check(element(1, KeyEx1), KeyEx2); _ -> - ?PAL("Negotiated ~p Expected ~p", [KeyEx1, KeyEx2]), + ?CT_PAL("Negotiated ~p Expected ~p", [KeyEx1, KeyEx2]), false end. @@ -2913,10 +2917,10 @@ check_active_receive(Pid, Data) -> check_active_receive_loop(Pid, Data) -> receive {Pid, Data} -> - ?LOG("Received: ~p~n (from ~p)~n", [Data, Pid]), + ?CT_LOG("Received: ~p~n (from ~p)~n", [Data, Pid]), Data; {Pid, Data2} -> - ?LOG("Received unexpected message: ~p~n (from ~p)~n", [Data2, Pid]), + ?CT_LOG("Received unexpected message: ~p~n (from ~p)~n", [Data2, Pid]), check_active_receive_loop(Pid, Data) end. @@ -2950,15 +2954,15 @@ verify_active_session_resumption(Socket, SessionResumption, WaitForReply, Ticket case ssl:connection_information(Socket, [session_resumption]) of {ok, [{session_resumption, SessionResumption}]} -> Msg = boolean_to_log_msg(SessionResumption), - ?LOG("~nSession resumption verified! (expected ~p, got ~p)!", + ?CT_LOG("~nSession resumption verified! (expected ~p, got ~p)!", [Msg, Msg]); {ok, [{session_resumption, Got0}]} -> Expected = boolean_to_log_msg(SessionResumption), Got = boolean_to_log_msg(Got0), - ?FAIL("~nFailed to verify session resumption! (expected ~p, got ~p)", + ?CT_FAIL("~nFailed to verify session resumption! (expected ~p, got ~p)", [Expected, Got]); {error, Reason} -> - ?FAIL("~nFailed to verify session resumption! Reason: ~p", + ?CT_FAIL("~nFailed to verify session resumption! Reason: ~p", [Reason]) end, @@ -2970,7 +2974,7 @@ verify_active_session_resumption(Socket, SessionResumption, WaitForReply, Ticket no_reply -> ok; Else1 -> - ?FAIL("~nFaulty parameter: ~p", [Else1]) + ?CT_FAIL("~nFaulty parameter: ~p", [Else1]) end, Tickets = case TicketOption of @@ -2979,7 +2983,7 @@ verify_active_session_resumption(Socket, SessionResumption, WaitForReply, Ticket no_tickets -> ok; Else2 -> - ?FAIL("~nFaulty parameter: ~p", [Else2]) + ?CT_FAIL("~nFaulty parameter: ~p", [Else2]) end, case EarlyData of {verify_early_data, Atom} -> @@ -2987,28 +2991,28 @@ verify_active_session_resumption(Socket, SessionResumption, WaitForReply, Ticket ok -> Tickets; Else -> - ?FAIL("~nFailed to verify early_data! (expected ~p, got ~p)", + ?CT_FAIL("~nFailed to verify early_data! (expected ~p, got ~p)", [Atom, Else]) end; no_early_data -> Tickets; Else3 -> - ?FAIL("~nFaulty parameter: ~p", [Else3]) + ?CT_FAIL("~nFaulty parameter: ~p", [Else3]) end. verify_server_early_data(Socket, WaitForReply, EarlyData) -> case ssl:connection_information(Socket, [session_resumption]) of {ok, [{session_resumption, true}]} -> Msg = boolean_to_log_msg(true), - ?LOG("~nSession resumption verified! (expected ~p, got ~p)!", + ?CT_LOG("~nSession resumption verified! (expected ~p, got ~p)!", [Msg, Msg]); {ok, [{session_resumption, Got0}]} -> Expected = boolean_to_log_msg(true), Got = boolean_to_log_msg(Got0), - ?FAIL("~nFailed to verify session resumption! (expected ~p, got ~p)", + ?CT_FAIL("~nFailed to verify session resumption! (expected ~p, got ~p)", [Expected, Got]); {error, Reason} -> - ?FAIL("~nFailed to verify session resumption! Reason: ~p", + ?CT_FAIL("~nFailed to verify session resumption! Reason: ~p", [Reason]) end, Data = "Hello world", @@ -3020,14 +3024,14 @@ verify_server_early_data(Socket, WaitForReply, EarlyData) -> _ -> binary_to_list(EarlyData) ++ Data end, - ?LOG("Expected Reply: ~p~n", [Reply]), + ?CT_LOG("Expected Reply: ~p~n", [Reply]), case WaitForReply of wait_reply -> Reply = active_recv(Socket, length(Reply)); no_reply -> ok; Else1 -> - ?FAIL("~nFaulty parameter: ~p", [Else1]) + ?CT_FAIL("~nFaulty parameter: ~p", [Else1]) end, ok. @@ -3038,10 +3042,10 @@ verify_session_ticket_extension([Ticket0|_], MaxEarlyDataSize) -> indication = Size}}}} = Ticket0, case Size of MaxEarlyDataSize -> - ?LOG("~nmax_early_data_size verified! (expected ~p, got ~p)!", + ?CT_LOG("~nmax_early_data_size verified! (expected ~p, got ~p)!", [MaxEarlyDataSize, Size]); Else -> - ?LOG("~nFailed to verify max_early_data_size! (expected ~p, got ~p)!", + ?CT_LOG("~nFailed to verify max_early_data_size! (expected ~p, got ~p)!", [MaxEarlyDataSize, Else]) end. @@ -3050,7 +3054,7 @@ update_session_ticket_extension([Ticket|_], MaxEarlyDataSize) -> extensions = #{early_data := #early_data_indication_nst{ indication = Size}}}} = Ticket, - ?LOG("~nOverwrite max_early_data_size (from ~p to ~p)!", + ?CT_LOG("~nOverwrite max_early_data_size (from ~p to ~p)!", [Size, MaxEarlyDataSize]), #{ticket := #new_session_ticket{ extensions = #{early_data := _Extensions0}} = NST0} = Ticket, @@ -3081,17 +3085,17 @@ check_tickets(Client) -> Tickets after 5000 -> - ?FAIL("~nNo tickets received!", []) + ?CT_FAIL("~nNo tickets received!", []) end. active_recv_loop(Pid, SslPort, Data) -> case active_recv(SslPort, length(Data)) of Data -> - ?LOG("[openssl server] Received: ~p~n (forward to PID=~p)~n", + ?CT_LOG("[openssl server] Received: ~p~n (forward to PID=~p)~n", [Data, Pid]), Pid ! {self(), Data}; Unexpected -> - ?LOG("[openssl server] Received unexpected: ~p~n (dropping message)~n", + ?CT_LOG("[openssl server] Received unexpected: ~p~n (dropping message)~n", [Unexpected]), active_recv_loop(Pid, SslPort, Data) end. @@ -3392,28 +3396,28 @@ close_port(Port) -> close_loop(Port, Time, SentClose) -> receive {Port, {data,Debug}} when is_port(Port) -> - ?LOG("openssl ~s~n",[Debug]), + ?CT_LOG("openssl ~s~n",[Debug]), close_loop(Port, Time, SentClose); {ssl,_,Msg} -> - ?LOG("ssl Msg ~s~n",[Msg]), + ?CT_LOG("ssl Msg ~s~n",[Msg]), close_loop(Port, Time, SentClose); {Port, closed} -> - ?LOG("Port Closed~n",[]), + ?CT_LOG("Port Closed~n",[]), ok; {'EXIT', Port, Reason} -> - ?LOG("Port Closed ~p~n",[Reason]), + ?CT_LOG("Port Closed ~p~n",[Reason]), ok; Msg -> - ?LOG("Port Msg ~p~n",[Msg]), + ?CT_LOG("Port Msg ~p~n",[Msg]), close_loop(Port, Time, SentClose) after Time -> case SentClose of false -> - ?LOG("Closing port ~n",[]), + ?CT_LOG("Closing port ~n",[]), catch erlang:port_close(Port), close_loop(Port, Time, true); true -> - ?LOG("Timeout~n",[]) + ?CT_LOG("Timeout~n",[]) end end. @@ -3425,7 +3429,7 @@ portable_open_port("openssl" = Exe, Args0) -> case IsWindows andalso os:getenv("WSLENV") of false -> AbsPath = os:find_executable(Exe), - ?LOG("open_port({spawn_executable, ~p}, [stderr_to_stdout,~n {args, \"~s\"}]).", + ?CT_LOG("open_port({spawn_executable, ~p}, [stderr_to_stdout,~n {args, \"~s\"}]).", [AbsPath, lists:join($\s, Args0)]), open_port({spawn_executable, AbsPath}, [{args, Args0}, stderr_to_stdout]); @@ -3442,14 +3446,14 @@ portable_open_port("openssl" = Exe, Args0) -> Args1 = [Translate(Arg) || Arg <- Args0], Args = ["/C","wsl","openssl"| Args1] ++ ["2>&1"], Cmd = os:find_executable("cmd"), - ?LOG("open_port({spawn_executable, ~p}, [stderr_to_stdout,~n {args, \"~s\"}]).", + ?CT_LOG("open_port({spawn_executable, ~p}, [stderr_to_stdout,~n {args, \"~s\"}]).", [Cmd, lists:join($\s, Args0)]), open_port({spawn_executable, Cmd}, [{args, Args}, stderr_to_stdout, hide]) end; portable_open_port(Exe, Args) -> AbsPath = os:find_executable(Exe), - ?LOG("open_port({spawn_executable, ~p}, [{args, ~p}, stderr_to_stdout]).", [AbsPath, Args]), + ?CT_LOG("open_port({spawn_executable, ~p}, [{args, ~p}, stderr_to_stdout]).", [AbsPath, Args]), open_port({spawn_executable, AbsPath}, [{args, Args}, stderr_to_stdout]). @@ -3532,7 +3536,7 @@ do_supports_ssl_tls_version(Port, Acc) -> "s_client: Unknown option: " ++ _-> false; Info when length(Info) >= 24 -> - ?LOG("~p", [Info]), + ?CT_LOG("~p", [Info]), true; _ -> do_supports_ssl_tls_version(Port, Acc ++ Data) @@ -3598,9 +3602,9 @@ protocol_options(Config, Options) -> ct_log_supported_protocol_versions(Config) -> case proplists:get_value(protocol, Config) of dtls -> - ?LOG("DTLS version ~p~n ", [dtls_record:supported_protocol_versions()]); + ?CT_LOG("DTLS version ~p~n ", [dtls_record:supported_protocol_versions()]); _ -> - ?LOG("TLS/SSL version ~p~n ", [tls_record:supported_protocol_versions()]) + ?CT_LOG("TLS/SSL version ~p~n ", [tls_record:supported_protocol_versions()]) end. clean_env() -> @@ -3793,10 +3797,10 @@ client_msg(Client, ClientMsg) -> {Client, ClientMsg} -> ok; {Client, {error,closed}} -> - ?LOG("client got close", []), + ?CT_LOG("client got close", []), ok; {Client, {error, Reason}} -> - ?LOG("client got econnaborted: ~p", [Reason]), + ?CT_LOG("client got econnaborted: ~p", [Reason]), ok; Unexpected -> ct:fail(Unexpected) @@ -3806,10 +3810,10 @@ server_msg(Server, ServerMsg) -> {Server, ServerMsg} -> ok; {Server, {error,closed}} -> - ?LOG("server got close", []), + ?CT_LOG("server got close", []), ok; {Server, {error, Reason}} -> - ?LOG("server got econnaborted: ~p", [Reason]), + ?CT_LOG("server got econnaborted: ~p", [Reason]), ok; Unexpected -> ct:fail(Unexpected) @@ -3981,7 +3985,7 @@ new_config(PrivDir, ServerOpts0) -> ServerOpts = proplists:delete(keyfile, ServerOpts2), {ok, PEM} = file:read_file(NewCaCertFile), - ?LOG("CA file content: ~p~n", [public_key:pem_decode(PEM)]), + ?CT_LOG("CA file content: ~p~n", [public_key:pem_decode(PEM)]), [{cacertfile, NewCaCertFile}, {certfile, NewCertFile}, {keyfile, NewKeyFile} | ServerOpts]. @@ -4082,11 +4086,11 @@ openssl_maxfraglen_support() -> assert_mfl(Socket, undefined) -> InfoMFL = ssl:connection_information(Socket, [max_fragment_length]), - ?LOG("Connection MFL ~p, Expecting: [] ~n", [InfoMFL]), + ?CT_LOG("Connection MFL ~p, Expecting: [] ~n", [InfoMFL]), {ok, []} = InfoMFL; assert_mfl(Socket, MFL) -> InfoMFL = ssl:connection_information(Socket, [max_fragment_length]), - ?LOG("Connection MFL ~p, Expecting: ~p ~n", [InfoMFL, MFL]), + ?CT_LOG("Connection MFL ~p, Expecting: ~p ~n", [InfoMFL, MFL]), {ok, [{max_fragment_length, ConnMFL}]} = InfoMFL, ConnMFL = MFL. -define(BIG_BUF, 10000000). @@ -4145,67 +4149,31 @@ handle_trace(rle, [{role, Role} | Stack0]}. -ktls_check_os() -> - case {os:type(), os:version()} of - {{unix,linux}, OsVersion} when {5,2,0} =< OsVersion -> - ok; - OS -> - {error, {notsup, {os,OS}}} - end. +ktls_os() -> + inet_tls_dist:ktls_os(). %% Set UserLand Protocol -ktls_set_ulp(Socket) -> - SOL_TCP = 6, TCP_ULP = 31, - case inet:setopts(Socket, [{raw, SOL_TCP, TCP_ULP, <<"tls">>}]) of - ok -> - case inet:getopts(Socket, [{raw, SOL_TCP, TCP_ULP, 4}]) of - {ok, [{raw, SOL_TCP, TCP_ULP, <<"tls",0>>}]} -> - ok; - GetULP -> - {error, {get_ulp, GetULP}} - end; - Error -> - {error, {set_ulp, Error}} - end. - -ktls_set_cipher(Socket, TxRx, Seed) -> +ktls_set_ulp(Socket, OS) -> + inet_tls_dist:set_ktls_ulp( + #{ socket => Socket, + setopt_fun => fun inet_tls_dist:inet_ktls_setopt/3, + getopt_fun => fun inet_tls_dist:inet_ktls_getopt/3 }, + OS). + +ktls_set_cipher(Socket, OS, TxRx, Seed) -> + TLS_version = {3,4}, + TLS_cipher = ?TLS_AES_256_GCM_SHA384, TLS_IV = binary:copy(<<(Seed + 0)>>, 8), TLS_KEY = binary:copy(<<(Seed + 1)>>, 32), TLS_SALT = binary:copy(<<(Seed + 2)>>, 4), - ktls_set_cipher(Socket, TxRx, TLS_IV, TLS_KEY, TLS_SALT). - -ktls_set_cipher(Socket, TxRx, TLS_IV, TLS_KEY, TLS_SALT) -> - TLS_OPT = - case TxRx of - tx -> 1; - rx -> 2 - end, - TLS_VER = ((3 bsl 8) bor 4), - TLS_CIPHER = 52, - TLS_SEQ = 0, - TLS_crypto_info = - <<TLS_VER:16/native, TLS_CIPHER:16/native, - TLS_IV/binary, TLS_KEY/binary, TLS_SALT/binary, - TLS_SEQ:64/native>>, - SOL_TLS = 282, - RawOpt = {raw, SOL_TLS, TLS_OPT, TLS_crypto_info}, - case inet:setopts(Socket, [RawOpt]) of - ok -> - case TxRx of - tx -> - OptSize = byte_size(TLS_crypto_info), - case - inet:getopts( - Socket, [{raw, SOL_TLS, TLS_OPT, OptSize}]) - of - {ok, [RawOpt]} -> - ok; - GetCipher -> - {error, {get_cipher, GetCipher}} - end; - rx -> - ok - end; - SetCipher -> - {error, {set_cipher, SetCipher}} - end. + KtlsInfo = + #{ socket => Socket, + tls_version => TLS_version, + cipher_suite => TLS_cipher, + setopt_fun => fun inet_tls_dist:inet_ktls_setopt/3, + getopt_fun => fun inet_tls_dist:inet_ktls_getopt/3 }, + CipherState = + #cipher_state{ + key = TLS_KEY, + iv = <<TLS_SALT/binary, TLS_IV/binary>> }, + inet_tls_dist:set_ktls_cipher(KtlsInfo, OS, CipherState, 0, TxRx). diff --git a/lib/ssl/test/ssl_test_lib.hrl b/lib/ssl/test/ssl_test_lib.hrl index 817e3e0904..947c765c2a 100644 --- a/lib/ssl/test/ssl_test_lib.hrl +++ b/lib/ssl/test/ssl_test_lib.hrl @@ -1,6 +1,14 @@ --define(FORMAT, "(~s ~p:~p in ~p) "). --define(ARGS, [erlang:pid_to_list(self()), ?MODULE, ?LINE, ?FUNCTION_NAME]). --define(LOG(F), ct:log(?FORMAT ++ F, ?ARGS, [esc_chars])). --define(LOG(F, Args), ct:log(?FORMAT ++ F, ?ARGS ++ Args, [esc_chars])). --define(PAL(F, Args), ct:pal(?FORMAT ++ F, ?ARGS ++ Args)). --define(FAIL(F, Args), ct:fail(?FORMAT ++ F, ?ARGS ++ Args)). +-define(SSL_TEST_LIB_FORMAT, "(~s ~p:~p in ~p) "). +-define(SSL_TEST_LIB_ARGS, + [erlang:pid_to_list(self()), ?MODULE, ?LINE, ?FUNCTION_NAME]). +-define(CT_LOG(F), + (ct:log(?SSL_TEST_LIB_FORMAT ++ F, ?SSL_TEST_LIB_ARGS, [esc_chars]))). +-define(CT_LOG(F, Args), + (ct:log( + ?SSL_TEST_LIB_FORMAT ++ F, + ?SSL_TEST_LIB_ARGS ++ Args, + [esc_chars]))). +-define(CT_PAL(F, Args), + (ct:pal(?SSL_TEST_LIB_FORMAT ++ F, ?SSL_TEST_LIB_ARGS ++ Args))). +-define(CT_FAIL(F, Args), + (ct:fail(?SSL_TEST_LIB_FORMAT ++ F, ?SSL_TEST_LIB_ARGS ++ Args))). diff --git a/lib/ssl/test/ssl_trace_SUITE.erl b/lib/ssl/test/ssl_trace_SUITE.erl index 376b9a01ab..8c8dc240ce 100644 --- a/lib/ssl/test/ssl_trace_SUITE.erl +++ b/lib/ssl/test/ssl_trace_SUITE.erl @@ -1,7 +1,7 @@ %% %% %CopyrightBegin% %% -%% Copyright Ericsson AB 2022. All Rights Reserved. +%% Copyright Ericsson AB 2022-2023. All Rights Reserved. %% %% Licensed under the Apache License, Version 2.0 (the "License"); %% you may not use this file except in compliance with the License. @@ -264,7 +264,7 @@ tc_budget_option(Config) -> true -> ok; _ -> - ?FAIL("Expected ~w traces, but found ~w", + ?CT_FAIL("Expected ~w traces, but found ~w", [ExpectedTraceCnt, ActualTraceCnt]) end. @@ -283,7 +283,7 @@ tc_file_option(Config) -> true -> ok; _ -> - ?FAIL("Expected ~w traces, but found ~w", + ?CT_FAIL("Expected ~w traces, but found ~w", [ExpectedTraceCnt, ActualTraceCnt]) end. @@ -300,7 +300,7 @@ tc_write(_Config) -> true -> ok; _ -> - ?FAIL("Expected ~w traces, but found ~w", + ?CT_FAIL("Expected ~w traces, but found ~w", [ExpectedTraceCnt, ActualTraceCnt]) end. @@ -379,14 +379,14 @@ check_trace_map(Ref, ExpectedTraces, ExpectedRemainders) -> true -> ok; _ -> - ?FAIL("Expected trace remainders = ~w ~n" + ?CT_FAIL("Expected trace remainders = ~w ~n" "Actual trace remainders = ~w", [ExpectedRemainders, ActualRemainders]) end. check_key(Type, ExpectedTraces, ReceivedPerType) -> ReceivedPerTypeCnt = length(ReceivedPerType), - ?LOG("Received Type = ~w Messages# = ~w", [Type, ReceivedPerTypeCnt]), + ?CT_LOG("Received Type = ~w Messages# = ~w", [Type, ReceivedPerTypeCnt]), case ReceivedPerTypeCnt > 0 of true -> ExpectedPerType = maps:get(Type, ExpectedTraces, []), @@ -413,7 +413,7 @@ check_key(Type, ExpectedTraces, ReceivedPerType) -> case Result of false -> F = "Trace not found: {~s, ~w, ~w}", - ?FAIL(F, [ExpectedString, Module, Function]); + ?CT_FAIL(F, [ExpectedString, Module, Function]); _ -> ok end, Result @@ -431,7 +431,7 @@ check_key(Type, ExpectedTraces, ReceivedPerType) -> case Result of false -> F = "Processed trace not found: ~s", - ?FAIL(F, [ExpectedString]); + ?CT_FAIL(F, [ExpectedString]); _ -> ok end, Result @@ -450,7 +450,7 @@ check_trace(processed, ExpectedPerType, ReceivedPerType) -> P1 = ?CHECK_PROCESSED_TRACE([_Timestamp, _Pid, Txt], Expected), true = lists:all(P1, ExpectedPerType); check_trace(Type, _ExpectedPerType, _ReceivedPerType) -> - ?FAIL("Type = ~w not checked", [Type]), + ?CT_FAIL("Type = ~w not checked", [Type]), ok. count_line(Filename) -> @@ -460,7 +460,7 @@ count_line(Filename) -> file:close(IoDevice), Count; {error, Reason} -> - ?PAL("~s open error reason:~s~n", [Filename, Reason]), + ?CT_PAL("~s open error reason:~s~n", [Filename, Reason]), ct:fail(Reason) end. @@ -471,7 +471,7 @@ count_line(IoDevice, Count) -> end. ssl_connect(Config) when is_list(Config) -> - ?LOG("Establishing connection for producing traces", []), + ?CT_LOG("Establishing connection for producing traces", []), ClientOpts = ssl_test_lib:ssl_options(client_rsa_verify_opts, Config), ServerOpts = ssl_test_lib:ssl_options(server_rsa_verify_opts, Config), {ClientNode, ServerNode, Hostname} = ssl_test_lib:run_where(Config), @@ -489,5 +489,5 @@ ssl_connect(Config) when is_list(Config) -> {mfa, {ssl_test_lib, send_recv_result, []}}, {options, [{keepalive, true},{active, false} | ClientOpts]}]), - ?LOG("Testcase ~p, Client ~p Server ~p ~n", [self(), Client, Server]), + ?CT_LOG("Testcase ~p, Client ~p Server ~p ~n", [self(), Client, Server]), [Server, Client]. |