summaryrefslogtreecommitdiff
path: root/lib/ssh/test/ssh_algorithms_SUITE.erl
diff options
context:
space:
mode:
Diffstat (limited to 'lib/ssh/test/ssh_algorithms_SUITE.erl')
-rw-r--r--lib/ssh/test/ssh_algorithms_SUITE.erl166
1 files changed, 120 insertions, 46 deletions
diff --git a/lib/ssh/test/ssh_algorithms_SUITE.erl b/lib/ssh/test/ssh_algorithms_SUITE.erl
index 6dcf52ce13..2ee8fd24bd 100644
--- a/lib/ssh/test/ssh_algorithms_SUITE.erl
+++ b/lib/ssh/test/ssh_algorithms_SUITE.erl
@@ -23,11 +23,33 @@
-module(ssh_algorithms_SUITE).
-include_lib("common_test/include/ct.hrl").
--include_lib("ssh/src/ssh_transport.hrl").
+-include("ssh_transport.hrl").
-include("ssh_test_lib.hrl").
-%% Note: This directive should only be used in test suites.
--compile(export_all).
+-export([
+ suite/0,
+ all/0,
+ groups/0,
+ init_per_suite/1,
+ end_per_suite/1,
+ init_per_group/2,
+ end_per_group/2,
+ init_per_testcase/2,
+ end_per_testcase/2
+ ]).
+
+-export([
+ interpolate/1,
+ simple_connect/1,
+ simple_exec/1,
+ simple_exec_groups/0,
+ simple_exec_groups/1,
+ simple_exec_groups_no_match_too_large/1,
+ simple_exec_groups_no_match_too_small/1,
+ simple_sftp/1,
+ sshc_simple_exec_os_cmd/1,
+ sshd_simple_exec/1
+ ]).
%%--------------------------------------------------------------------
%% Common Test interface functions -----------------------------------
@@ -35,7 +57,7 @@
suite() ->
[{ct_hooks,[ts_install_cth]},
- {timetrap,{seconds,60}}].
+ {timetrap,{seconds,120}}].
all() ->
%% [{group,kex},{group,cipher}... etc
@@ -48,9 +70,9 @@ groups() ->
SshdAlgos = extract_algos(ssh_test_lib:default_algorithms(sshd)),
DoubleAlgos =
- [{Tag, double(Algs)} || {Tag,Algs} <- ErlAlgos,
- length(Algs) > 1,
- lists:member(Tag, two_way_tags())],
+ [{Tag, double(Tag,Algs)} || {Tag,Algs} <- ErlAlgos,
+ length(Algs) > 1,
+ lists:member(Tag, two_way_tags())],
TagGroupSet =
[{Tag, [], group_members_for_tag(Tag,Algs,DoubleAlgos)}
|| {Tag,Algs} <- ErlAlgos,
@@ -60,14 +82,14 @@ groups() ->
TypeSSH = ssh_test_lib:ssh_type(),
AlgoTcSet =
- [{Alg, [parallel], specific_test_cases(Tag,Alg,SshcAlgos,SshdAlgos,TypeSSH)}
+ [{Alg, [], specific_test_cases(Tag,Alg,SshcAlgos,SshdAlgos,TypeSSH)}
|| {Tag,Algs} <- ErlAlgos ++ DoubleAlgos,
Alg <- Algs],
TagGroupSet ++ AlgoTcSet.
tags() -> [kex,cipher,mac,compression,public_key].
-two_way_tags() -> [cipher,mac,compression].
+two_way_tags() -> [cipher,mac,compression, public_key].
%%--------------------------------------------------------------------
init_per_suite(Config) ->
@@ -91,7 +113,10 @@ init_per_suite(Config) ->
ssh_test_lib:installed_ssh_version("TIMEOUT"),
ssh:default_algorithms(),
crypto:info_lib(),
- ssh_test_lib:default_algorithms(sshc),
+ ssh_test_lib:default_algorithms(sshc,
+ %% Use a fake system_dir to enable the test
+ %% daemon to start:
+ [{system_dir,proplists:get_value(data_dir,Config)}]),
ssh_test_lib:default_algorithms(sshd),
{?DEFAULT_DH_GROUP_MIN,?DEFAULT_DH_GROUP_NBITS,?DEFAULT_DH_GROUP_MAX},
public_key:dh_gex_group_sizes(),
@@ -126,32 +151,43 @@ init_per_group(Group, Config) ->
init_per_group(public_key=Tag, Alg, Config) ->
- ct:log("Init tests for public_key ~p",[Alg]),
- PrefAlgs = {preferred_algorithms,[{Tag,[Alg]}]},
+ PA =
+ case split(Tag, Alg) of
+ [_] ->
+ [Alg];
+ [A1,A2] ->
+ [A1,A2]
+ end,
+ OtherAlgs = [{T,L} || {T,L} <- ssh_transport:supported_algorithms(), T=/=Tag],
+ ct:log("Init tests for public_key ~p~nOtherAlgs=~p",[PA,OtherAlgs]),
+ PrefAlgs = {preferred_algorithms,[{Tag,PA}|OtherAlgs]},
%% Daemon started later in init_per_testcase
try
- setup_pubkey(Alg,
+ setup_pubkey(PA,
[{pref_algs,PrefAlgs},
- {tag_alg,{Tag,Alg}}
+ {tag_alg,{Tag,PA}}
| Config])
catch
- _:_ -> {skip, io_lib:format("Unsupported: ~p",[Alg])}
+ _C:_E:_S ->
+ ct:log("Exception ~p:~p~n~p",[_C,_E,_S]),
+ {skip, io_lib:format("Unsupported: ~p",[Alg])}
end;
init_per_group(Tag, Alg, Config) ->
PA =
- case split(Alg) of
+ case split(Tag, Alg) of
[_] ->
[Alg];
[A1,A2] ->
[{client2server,[A1]},
{server2client,[A2]}]
end,
- ct:log("Init tests for tag=~p alg=~p",[Tag,PA]),
- PrefAlgs = {preferred_algorithms,[{Tag,PA}]},
+ OtherAlgs = [{T,L} || {T,L} <- ssh_transport:supported_algorithms(), T=/=Tag],
+ ct:log("Init tests for tag=~p alg=~p~nOtherAlgs=~p",[Tag,PA,OtherAlgs]),
+ PrefAlgs = {preferred_algorithms,[{Tag,PA}|OtherAlgs]},
start_std_daemon([PrefAlgs],
[{pref_algs,PrefAlgs},
- {tag_alg,{Tag,Alg}}
+ {tag_alg,{Tag,[Alg]}}
| Config]).
@@ -171,6 +207,7 @@ init_per_testcase(TC, Config) ->
init_per_testcase(TC, {public_key,Alg}, Config) ->
+ ct:log("init_per_testcase TC=~p, Alg=~p",[TC,Alg]),
ExtraOpts = case TC of
simple_connect ->
[{user_dir, proplists:get_value(priv_dir,Config)}];
@@ -178,21 +215,26 @@ init_per_testcase(TC, {public_key,Alg}, Config) ->
[]
end,
Opts = pubkey_opts(Config) ++ ExtraOpts,
- case {ssh_file:user_key(Alg,Opts), ssh_file:host_key(Alg,Opts)} of
+ {UserAlg,SrvrAlg} =
+ case Alg of
+ [A1,A2] -> {A1,A2};
+ [A0] -> {A0,A0}
+ end,
+ case {ssh_file:user_key(UserAlg,Opts), ssh_file:host_key(SrvrAlg,Opts)} of
{{ok,_}, {ok,_}} ->
start_pubkey_daemon([proplists:get_value(pref_algs,Config)
| ExtraOpts],
[{extra_daemon,true}|Config]);
{{ok,_}, {error,Err}} ->
- ct:log("Alg = ~p~nOpts = ~p",[Alg,Opts]),
+ ct:log("SrvrAlg = ~p~nOpts = ~p",[SrvrAlg,Opts]),
{skip, io_lib:format("No host key: ~p",[Err])};
{{error,Err}, {ok,_}} ->
- ct:log("Alg = ~p~nOpts = ~p",[Alg,Opts]),
+ ct:log("UserAlg = ~p~nOpts = ~p",[UserAlg,Opts]),
{skip, io_lib:format("No user key: ~p",[Err])};
_ ->
- ct:log("Alg = ~p~nOpts = ~p",[Alg,Opts]),
+ ct:log("UserAlg = ~p SrvrAlg = ~p~nOpts = ~p",[UserAlg,SrvrAlg,Opts]),
{skip, "Neither host nor user key"}
end;
@@ -242,14 +284,23 @@ simple_exec(Config) ->
%%--------------------------------------------------------------------
%% A simple exec call
simple_connect(Config) ->
+ ct:log("PrivDir ~p:~n~p~n~nPrivDir/system: ~p",[proplists:get_value(priv_dir,Config),
+ file:list_dir(proplists:get_value(priv_dir,Config)),
+ catch file:list_dir(
+ filename:join(proplists:get_value(priv_dir,Config),
+ system))]),
{Host,Port} = proplists:get_value(srvr_addr, Config),
{preferred_algorithms,AlgEntries} = proplists:get_value(pref_algs, Config),
Opts =
case proplists:get_value(tag_alg, Config) of
- {public_key,Alg} -> [{pref_public_key_algs,[Alg]}];
+ {public_key,Alg} -> [{pref_public_key_algs,Alg},
+ {preferred_algorithms,AlgEntries}];
_ -> [{modify_algorithms,[{append,AlgEntries}]}]
end,
- ConnectionRef = ssh_test_lib:std_connect(Config, Host, Port, Opts),
+ ConnectionRef = ssh_test_lib:std_connect(Config, Host, Port,
+ [{silently_accept_hosts, true},
+ {user_interaction, false} |
+ Opts]),
ct:log("~p:~p connected! ~p",[?MODULE,?LINE,ConnectionRef]),
ssh:close(ConnectionRef).
@@ -274,7 +325,7 @@ try_exec_simple_group(Group, Config) ->
%% Testing all default groups
simple_exec_groups() ->
- [{timetrap,{seconds,180}}].
+ [{timetrap,{seconds,240}}].
simple_exec_groups(Config) ->
Sizes = interpolate( public_key:dh_gex_group_sizes() ),
@@ -311,7 +362,10 @@ sshc_simple_exec_os_cmd(Config) ->
Result = ssh_test_lib:open_sshc(Host, Port,
[" -C"
" -o UserKnownHostsFile=",KnownHosts,
+ " -o CheckHostIP=no"
" -o StrictHostKeyChecking=no"
+ " -q"
+ " -x"
],
" 1+1."),
Parent ! {result, self(), Result, "2"}
@@ -336,7 +390,7 @@ sshc_simple_exec_os_cmd(Config) ->
sshd_simple_exec(Config) ->
ClientPubKeyOpts =
case proplists:get_value(tag_alg,Config) of
- {public_key,Alg} -> [{pref_public_key_algs,[Alg]}];
+ {public_key,Alg} -> [{pref_public_key_algs,Alg}];
_ -> []
end,
ConnectionRef = ssh_test_lib:connect(22, [{silently_accept_hosts, true},
@@ -389,13 +443,20 @@ sshd_simple_exec(Config) ->
group_members_for_tag(Tag, Algos, DoubleAlgos) ->
[{group,Alg} || Alg <- Algos++proplists:get_value(Tag,DoubleAlgos,[])].
-double(Algs) -> [concat(A1,A2) || A1 <- Algs,
- A2 <- Algs,
- A1 =/= A2].
+double(Tag, Algs) -> [concat(Tag,A1,A2) || A1 <- Algs,
+ A2 <- Algs,
+ A1 =/= A2].
-concat(A1, A2) -> list_to_atom(lists:concat([A1," + ",A2])).
+concat(Tag, A1, A2) ->
+ list_to_atom(lists:concat(["D: ",Tag," ",A1," + ",A2])).
-split(Alg) -> ssh_test_lib:to_atoms(string:tokens(atom_to_list(Alg), " + ")).
+split(TagA, Alg) ->
+ Tag = atom_to_list(TagA),
+ ssh_test_lib:to_atoms(
+ case string:tokens(atom_to_list(Alg), " ") of
+ ["D:",Tag,A1,"+",A2] ->[A1,A2];
+ Other -> Other
+ end).
specific_test_cases(Tag, Alg, SshcAlgos, SshdAlgos, TypeSSH) ->
case Tag of
@@ -429,7 +490,7 @@ supports(Tag, Alg, Algos) ->
lists:all(fun(A) ->
lists:member(A, proplists:get_value(Tag, Algos,[]))
end,
- split(Alg)).
+ split(Tag, Alg)).
extract_algos(Spec) ->
@@ -469,21 +530,33 @@ pubkey_opts(Config) ->
{system_dir, SystemDir}].
-setup_pubkey(Alg, Config) ->
+setup_pubkey([AlgClient, AlgServer], Config) ->
DataDir = proplists:get_value(data_dir, Config),
UserDir = proplists:get_value(priv_dir, Config),
+ ssh_test_lib:del_dir_contents(UserDir),
+ ok = ssh_test_lib:setup_user_key(AlgClient, DataDir, UserDir),
+ _SysDir = ssh_test_lib:setup_host_key_create_dir(AlgServer, DataDir, UserDir),
+try ct:log("~p:~p AlgClient=~p, AlgServer=~p~nPrivDir ~p:~n~p~n~nSYsDir=~p~nPrivDir/system: ~p",
+ [?MODULE,?LINE,
+ AlgClient, AlgServer,
+ proplists:get_value(priv_dir,Config),
+ file:list_dir(proplists:get_value(priv_dir,Config)),
+ _SysDir,
+ catch file:list_dir(
+ filename:join(proplists:get_value(priv_dir,Config),
+ system))
+ ])
+catch _C:_E:_S ->
+ ct:log("~p:~p ~p:~p~n~p",[?MODULE,?LINE,_C,_E,_S])
+end,
+ Config;
+
+setup_pubkey([Alg], Config) ->
+ DataDir = proplists:get_value(data_dir, Config),
+ PrivDir = proplists:get_value(priv_dir, Config),
ct:log("Setup keys for ~p",[Alg]),
- case Alg of
- 'ssh-dss' -> ssh_test_lib:setup_dsa(DataDir, UserDir);
- 'ssh-rsa' -> ssh_test_lib:setup_rsa(DataDir, UserDir);
- 'rsa-sha2-256' -> ssh_test_lib:setup_rsa(DataDir, UserDir);
- 'rsa-sha2-512' -> ssh_test_lib:setup_rsa(DataDir, UserDir);
- 'ecdsa-sha2-nistp256' -> ssh_test_lib:setup_ecdsa("256", DataDir, UserDir);
- 'ecdsa-sha2-nistp384' -> ssh_test_lib:setup_ecdsa("384", DataDir, UserDir);
- 'ecdsa-sha2-nistp521' -> ssh_test_lib:setup_ecdsa("521", DataDir, UserDir);
- 'ssh-ed25519' -> ssh_test_lib:setup_eddsa(ed25519, DataDir, UserDir);
- 'ssh-ed448' -> ssh_test_lib:setup_eddsa(ed448, DataDir, UserDir)
- end,
+ ssh_test_lib:setup_user_key(Alg, DataDir, PrivDir),
+ ssh_test_lib:setup_host_key_create_dir(Alg, DataDir, PrivDir),
Config.
@@ -492,5 +565,6 @@ simple_exec_group(I, Config) when is_integer(I) ->
simple_exec_group({Min,I,Max}, Config) ->
{Host,Port} = proplists:get_value(srvr_addr, Config),
ssh_test_lib:std_simple_exec(Host, Port, Config,
- [{dh_gex_limits,{Min,I,Max}}]).
+ [proplists:get_value(pref_algs,Config),
+ {dh_gex_limits,{Min,I,Max}}]).