%%
%% %CopyrightBegin%
%%
%% Copyright Ericsson AB 2008-2018. 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.
%% You may obtain a copy of the License at
%%
%% http://www.apache.org/licenses/LICENSE-2.0
%%
%% Unless required by applicable law or agreed to in writing, software
%% distributed under the License is distributed on an "AS IS" BASIS,
%% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
%% See the License for the specific language governing permissions and
%% limitations under the License.
%%
%% %CopyrightEnd%
%%
%%
-module(ssh_engine_SUITE).
-include_lib("common_test/include/ct.hrl").
-include("ssh_test_lib.hrl").
%% Note: This directive should only be used in test suites.
-compile(export_all).
%%--------------------------------------------------------------------
%% Common Test interface functions -----------------------------------
%%--------------------------------------------------------------------
suite() ->
[{ct_hooks,[ts_install_cth]},
{timetrap,{seconds,40}}].
all() ->
[{group, dsa_key},
{group, rsa_key}
].
groups() ->
[{dsa_key, [], basic_tests()},
{rsa_key, [], basic_tests()}
].
basic_tests() ->
[simple_connect
].
%%--------------------------------------------------------------------
init_per_suite(Config) ->
ssh:start(),
?CHECK_CRYPTO(
case crypto:info_lib() of
[{_,_, <<"OpenSSL 1.0.1s-freebsd 1 Mar 2016">>}] ->
{skip, "Strange Engine stuff"};
_ ->
case load_engine() of
{ok,E} ->
[{engine,E}|Config];
{error, notsup} ->
{skip, "Engine not supported on this OpenSSL version"};
{error, bad_engine_id} ->
{skip, "Dynamic Engine not supported"};
Other ->
ct:log("Engine load failed: ~p",[Other]),
{fail, "Engine load failed"}
end
end
).
end_per_suite(Config) ->
catch crypto:engine_unload( proplists:get_value(engine,Config) ),
ssh:stop().
%%--------------------------------------------------------------------
init_per_group(dsa_key, Config) ->
case lists:member('ssh-dss',
ssh_transport:default_algorithms(public_key)) of
true ->
start_daemon(Config, 'ssh-dss', "dsa_private_key.pem");
false ->
{skip, unsupported_pub_key}
end;
init_per_group(rsa_key, Config) ->
case lists:member('ssh-rsa',
ssh_transport:default_algorithms(public_key)) of
true ->
start_daemon(Config, 'ssh-rsa', "rsa_private_key.pem");
false ->
{skip, unsupported_pub_key}
end.
start_daemon(Config, KeyType, KeyId) ->
SystemDir = proplists:get_value(data_dir, Config),
FullKeyId = filename:join(SystemDir, KeyId),
KeyCBOpts = [{engine, proplists:get_value(engine,Config)},
{KeyType, FullKeyId}
],
Opts = [{key_cb, {ssh_key_cb_engine_keys, KeyCBOpts}}],
{Pid, Host, Port} = ssh_test_lib:std_daemon(Config, Opts),
[{host_port,{Host,Port}}, {daemon_pid,Pid}| Config].
end_per_group(_, Config) ->
catch ssh:stop_daemon(proplists:get_value(daemon_pid,Config)),
Config.
%%--------------------------------------------------------------------
%% Test Cases --------------------------------------------------------
%%--------------------------------------------------------------------
%% A simple exec call
simple_connect(Config) ->
{Host,Port} = proplists:get_value(host_port, Config),
CRef = ssh_test_lib:std_connect(Config, Host, Port, []),
ssh:close(CRef).
%%--------------------------------------------------------------------
%%--------------------------------------------------------------------
load_engine() ->
case crypto:get_test_engine() of
{ok, Engine} ->
try
%% The test engine has it's own fake rsa sign/verify that
%% you don't want to use, so exclude it from methods to load:
Methods =
crypto:engine_get_all_methods() -- [engine_method_rsa],
crypto:engine_load(<<"dynamic">>,
[{<<"SO_PATH">>, Engine},
<<"LOAD">>],
[],
Methods
)
catch
error:notsup ->
{error, notsup}
end;
{error, Error} ->
{error, Error}
end.
start_std_daemon(Opts, Config) ->
ct:log("starting std_daemon",[]),
{Pid, Host, Port} = ssh_test_lib:std_daemon(Config, Opts),
ct:log("started ~p:~p ~p",[Host,Port,Opts]),
[{srvr_pid,Pid},{srvr_addr,{Host,Port}} | Config].