diff options
Diffstat (limited to 'lib')
5 files changed, 351 insertions, 194 deletions
diff --git a/lib/common_test/test/ct_netconfc_SUITE.erl b/lib/common_test/test/ct_netconfc_SUITE.erl index c89a4cdabe..2959f77087 100644 --- a/lib/common_test/test/ct_netconfc_SUITE.erl +++ b/lib/common_test/test/ct_netconfc_SUITE.erl @@ -1,7 +1,7 @@  %%  %% %CopyrightBegin%  %% -%% Copyright Ericsson AB 2009-2012. All Rights Reserved. +%% Copyright Ericsson AB 2009-2014. 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 @@ -63,7 +63,8 @@ suite() -> [{ct_hooks,[ts_install_cth]}].  all() ->      [ -     default +     netconfc1_SUITE, +     netconfc_remote_SUITE      ].  %%-------------------------------------------------------------------- @@ -72,14 +73,21 @@ all() ->  %%%-----------------------------------------------------------------  %%% -default(Config) when is_list(Config) -> +netconfc1_SUITE(Config) when is_list(Config) ->      DataDir = ?config(data_dir, Config),      Suite = filename:join(DataDir, "netconfc1_SUITE"),      CfgFile = filename:join(DataDir, "netconfc1.cfg"),      {Opts,ERPid} = setup([{suite,Suite},{config,CfgFile}, -			  {label,default}], Config), +			  {label,netconfc1_SUITE}], Config), -    ok = execute(default, Opts, ERPid, Config). +    ok = execute(netconfc1_SUITE, Opts, ERPid, Config). + +netconfc_remote_SUITE(Config) when is_list(Config) -> +    DataDir = ?config(data_dir, Config), +    Suite = filename:join(DataDir, "netconfc_remote_SUITE"), +    {Opts,ERPid} = setup([{suite,Suite},{label,netconfc_remote_SUITE}], Config), + +    ok = execute(netconfc_remote_SUITE, Opts, ERPid, Config).  %%%----------------------------------------------------------------- @@ -112,16 +120,15 @@ reformat(Events, EH) ->  %%%-----------------------------------------------------------------  %%% TEST EVENTS  %%%----------------------------------------------------------------- -events_to_check(default,Config) -> -    {module,_} = code:load_abs(filename:join(?config(data_dir,Config), -					     netconfc1_SUITE)), -    TCs = netconfc1_SUITE:all(), -    code:purge(netconfc1_SUITE), -    code:delete(netconfc1_SUITE), +events_to_check(Suite,Config) -> +    {module,_} = code:load_abs(filename:join(?config(data_dir,Config),Suite)), +    TCs = Suite:all(), +    code:purge(Suite), +    code:delete(Suite),      OneTest =  	[{?eh,start_logging,{'DEF','RUNDIR'}}] ++ -	[{?eh,tc_done,{netconfc1_SUITE,TC,ok}} || TC <- TCs] ++ +	[{?eh,tc_done,{Suite,TC,ok}} || TC <- TCs] ++  	[{?eh,stop_logging,[]}],      %% 2 tests (ct:run_test + script_start) is default diff --git a/lib/common_test/test/ct_netconfc_SUITE_data/netconfc1_SUITE.erl b/lib/common_test/test/ct_netconfc_SUITE_data/netconfc1_SUITE.erl index 2bcfeeec0c..f2adeb9065 100644 --- a/lib/common_test/test/ct_netconfc_SUITE_data/netconfc1_SUITE.erl +++ b/lib/common_test/test/ct_netconfc_SUITE_data/netconfc1_SUITE.erl @@ -1,7 +1,7 @@  %%--------------------------------------------------------------------  %% %CopyrightBegin%  %% -%% Copyright Ericsson AB 2013. All Rights Reserved. +%% Copyright Ericsson AB 2013-2014. 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 @@ -30,25 +30,10 @@  -module(netconfc1_SUITE).  -include_lib("common_test/include/ct.hrl").  -include_lib("common_test/src/ct_netconfc.hrl"). --include_lib("public_key/include/public_key.hrl"). +-include("netconfc_test_lib.hrl").  -compile(export_all). -%% Default timetrap timeout (set in init_per_testcase). --define(default_timeout, ?t:minutes(1)). - --define(NS,ns). --define(LOCALHOST, "127.0.0.1"). --define(SSH_PORT, 2060). - --define(DEFAULT_SSH_OPTS,[{ssh,?LOCALHOST}, -			  {port,?SSH_PORT}, -			  {user,"xxx"}, -			  {password,"xxx"}]). --define(DEFAULT_SSH_OPTS(Dir), ?DEFAULT_SSH_OPTS++[{user_dir,Dir}]). - --define(ok,ok). -  suite() ->      [{ct_hooks, [{cth_conn_log,  		  [{ct_netconfc,[{log_type,html}, %will be overwritten by config @@ -136,8 +121,8 @@ end_per_testcase(_Case, Config) ->  init_per_suite(Config) ->      case catch {crypto:start(), ssh:start()} of  	{ok, ok} -> -	    {ok, _} =  get_id_keys(Config), -	    make_dsa_files(Config), +	    {ok, _} =  netconfc_test_lib:get_id_keys(Config), +	    netconfc_test_lib:make_dsa_files(Config),  	    Server = ?NS:start(?config(data_dir,Config)),  	    [{server,Server}|Config];  	_ -> @@ -148,7 +133,7 @@ end_per_suite(Config) ->      ?NS:stop(?config(server,Config)),      ssh:stop(),      crypto:stop(), -    remove_id_keys(Config), +    netconfc_test_lib:remove_id_keys(Config),      Config.  hello(Config) -> @@ -1001,165 +986,3 @@ pad(I) when I<10 ->      "0"++integer_to_list(I);  pad(I) ->      integer_to_list(I). - - -%%%----------------------------------------------------------------- -%%% BEGIN SSH key management -%% copy private keys to given dir from ~/.ssh -get_id_keys(Config) -> -    DstDir = ?config(priv_dir, Config), -    SrcDir = filename:join(os:getenv("HOME"), ".ssh"), -    RsaOk = copyfile(SrcDir, DstDir, "id_rsa"), -    DsaOk = copyfile(SrcDir, DstDir, "id_dsa"), -    case {RsaOk, DsaOk} of -	{{ok, _}, {ok, _}} -> {ok, both}; -	{{ok, _}, _} -> {ok, rsa}; -	{_, {ok, _}} -> {ok, dsa}; -	{Error, _} -> Error -    end. - -%% Remove later on. Use make_dsa_files instead. -remove_id_keys(Config) -> -    Dir = ?config(priv_dir, Config), -    file:delete(filename:join(Dir, "id_rsa")), -    file:delete(filename:join(Dir, "id_dsa")). - - -make_dsa_files(Config) -> -    make_dsa_files(Config, rfc4716_public_key). -make_dsa_files(Config, Type) -> -    {DSA, EncodedKey} = gen_dsa(128, 20), -    PKey = DSA#'DSAPrivateKey'.y, -    P = DSA#'DSAPrivateKey'.p, -    Q = DSA#'DSAPrivateKey'.q, -    G = DSA#'DSAPrivateKey'.g, -    Dss = #'Dss-Parms'{p=P, q=Q, g=G}, -    {ok, Hostname} = inet:gethostname(), -    {ok, {A, B, C, D}} = inet:getaddr(Hostname, inet), -    IP = lists:concat([A, ".", B, ".", C, ".", D]), -    Attributes = [], % Could be [{comment,"user@" ++ Hostname}], -    HostNames = [{hostnames,[IP, IP]}], -    PublicKey = [{{PKey, Dss}, Attributes}], -    KnownHosts = [{{PKey, Dss}, HostNames}], - -    KnownHostsEnc = public_key:ssh_encode(KnownHosts, known_hosts), -    KnownHosts = public_key:ssh_decode(KnownHostsEnc, known_hosts), - -    PublicKeyEnc = public_key:ssh_encode(PublicKey, Type), - -    SystemTmpDir = ?config(data_dir, Config), -    filelib:ensure_dir(SystemTmpDir), -    file:make_dir(SystemTmpDir), - -    DSAFile = filename:join(SystemTmpDir, "ssh_host_dsa_key.pub"), -    file:delete(DSAFile), - -    DSAPrivateFile  = filename:join(SystemTmpDir, "ssh_host_dsa_key"), -    file:delete(DSAPrivateFile), - -    KHFile = filename:join(SystemTmpDir, "known_hosts"), -    file:delete(KHFile), - -    PemBin = public_key:pem_encode([EncodedKey]), - -    file:write_file(DSAFile, PublicKeyEnc), -    file:write_file(KHFile, KnownHostsEnc), -    file:write_file(DSAPrivateFile, PemBin), -    ok. - - -%%-------------------------------------------------------------------- -%% @doc Creates a dsa key (OBS: for testing only) -%%   the sizes are in bytes -%% @spec (::integer()) -> {::atom(), ::binary(), ::opaque()} -%% @end -%%-------------------------------------------------------------------- -gen_dsa(LSize,NSize) when is_integer(LSize), is_integer(NSize) -> -    Key = gen_dsa2(LSize, NSize), -    {Key, encode_key(Key)}. - -encode_key(Key = #'DSAPrivateKey'{}) -> -    Der = public_key:der_encode('DSAPrivateKey', Key), -    {'DSAPrivateKey', Der, not_encrypted}. - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%% DSA key generation  (OBS: for testing only) -%% See http://en.wikipedia.org/wiki/Digital_Signature_Algorithm -%% and the fips_186-3.pdf -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -gen_dsa2(LSize, NSize) -> -    Q  = prime(NSize),  %% Choose N-bit prime Q -    X0 = prime(LSize), -    P0 = prime((LSize div 2) +1), -     -    %% Choose L-bit prime modulus P such that p-1 is a multiple of q. -    case dsa_search(X0 div (2*Q*P0), P0, Q, 1000) of -	error ->  -	    gen_dsa2(LSize, NSize); -	P ->	     -	    G = crypto:mod_pow(2, (P-1) div Q, P), % Choose G a number whose multiplicative order modulo p is q. -	    %%                 such that This may be done by setting g = h^(p-1)/q mod p, commonly h=2 is used. -	     -	    X = prime(20),               %% Choose x by some random method, where 0 < x < q. -	    Y = crypto:mod_pow(G, X, P), %% Calculate y = g^x mod p. -	     -	    #'DSAPrivateKey'{version=0, p = P, q = Q,  -			     g = crypto:bytes_to_integer(G), y = crypto:bytes_to_integer(Y), x = X} -    end. -     -%% See fips_186-3.pdf -dsa_search(T, P0, Q, Iter) when Iter > 0 -> -    P = 2*T*Q*P0 + 1, -    case is_prime(P, 50) of -	true -> P; -	false -> dsa_search(T+1, P0, Q, Iter-1) -    end; -dsa_search(_,_,_,_) ->  -    error. - - -%%%%%%% Crypto Math %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -prime(ByteSize) -> -    Rand = odd_rand(ByteSize), -    prime_odd(Rand, 0). - -prime_odd(Rand, N) -> -    case is_prime(Rand, 50) of -	true ->  -	    Rand; -	false ->  -	    prime_odd(Rand+2, N+1) -    end. - -%% see http://en.wikipedia.org/wiki/Fermat_primality_test -is_prime(_, 0) -> true; -is_prime(Candidate, Test) ->  -    CoPrime = odd_rand(10000, Candidate), -    Result = crypto:mod_pow(CoPrime, Candidate, Candidate) , -    is_prime(CoPrime, crypto:bytes_to_integer(Result), Candidate, Test). - -is_prime(CoPrime, CoPrime, Candidate, Test) -> -    is_prime(Candidate, Test-1); -is_prime(_,_,_,_) -> -    false. - -odd_rand(Size) -> -    Min = 1 bsl (Size*8-1), -    Max = (1 bsl (Size*8))-1, -    odd_rand(Min, Max). - -odd_rand(Min,Max) -> -    Rand = crypto:rand_uniform(Min,Max), -    case Rand rem 2 of -	0 ->  -	    Rand + 1; -	_ ->  -	    Rand -    end. - -copyfile(SrcDir, DstDir, Fn) -> -    file:copy(filename:join(SrcDir, Fn), -	      filename:join(DstDir, Fn)). - -%%% END SSH key management -%%%----------------------------------------------------------------- diff --git a/lib/common_test/test/ct_netconfc_SUITE_data/netconfc_remote_SUITE.erl b/lib/common_test/test/ct_netconfc_SUITE_data/netconfc_remote_SUITE.erl new file mode 100644 index 0000000000..7a44d148dd --- /dev/null +++ b/lib/common_test/test/ct_netconfc_SUITE_data/netconfc_remote_SUITE.erl @@ -0,0 +1,147 @@ +%%-------------------------------------------------------------------- +%% %CopyrightBegin% +%% +%% Copyright Ericsson AB 2014. 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 +%% compliance with the License. You should have received a copy of the +%% Erlang Public License along with this software. If not, it can be +%% retrieved online at http://www.erlang.org/. +%% +%% Software distributed under the License is distributed on an "AS IS" +%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See +%% the License for the specific language governing rights and limitations +%% under the License. +%% +%% %CopyrightEnd% +%% +%%---------------------------------------------------------------------- +-module(netconfc_remote_SUITE). +-include_lib("common_test/include/ct.hrl"). +-include_lib("common_test/src/ct_netconfc.hrl"). +-include("netconfc_test_lib.hrl"). + +-compile(export_all). + +suite() -> +    [{ct_hooks, [{cth_conn_log,[{ct_netconfc,[{log_type,html}]}]}]}]. + +all() -> +    case os:find_executable("ssh") of +	false -> +	    {skip, "SSH not installed on host"}; +	_ -> +	    [remote_crash +	    ] +    end. + +groups() -> +    []. + +init_per_group(_GroupName, Config) -> +    Config. + +end_per_group(_GroupName, Config) -> +    Config. + +init_per_testcase(Case, Config) -> +    stop_node(Case), +    Dog = test_server:timetrap(?default_timeout), +    [{watchdog, Dog}|Config]. + +end_per_testcase(Case, Config) -> +    stop_node(Case), +    Dog=?config(watchdog, Config), +    test_server:timetrap_cancel(Dog), +    ok. + +stop_node(Case) -> +    {ok,Host} = inet:gethostname(), +    Node = list_to_atom("nc_" ++ atom_to_list(Case)++ "@" ++ Host), +    rpc:call(Node,erlang,halt,[]). + + +init_per_suite(Config) -> +    case {crypto:start(),ssh:start()} of +	{ok,ok} -> +	    {ok, _} =  netconfc_test_lib:get_id_keys(Config), +	    netconfc_test_lib:make_dsa_files(Config), +	    Config; +	_ -> +	    {skip, "Crypto and/or SSH could not be started locally!"} +    end. + +end_per_suite(Config) -> +    ssh:stop(), +    crypto:stop(), +    netconfc_test_lib:remove_id_keys(Config), +    Config. + +%% This test case is related to seq12645 +%% Running the netconf server in a remote node, test that the client +%% process terminates if the remote node goes down. +remote_crash(Config) -> +    {ok,Node} = ct_slave:start(nc_remote_crash), +    Pa = filename:dirname(code:which(?NS)), +    true = rpc:call(Node,code,add_patha,[Pa]), +     +    case {rpc:call(Node,crypto,start,[]),rpc:call(Node,ssh,start,[])} of +	{ok,ok} -> +	    Server = rpc:call(Node,?NS,start,[?config(data_dir,Config)]), +	    remote_crash(Node,Config); +	_ -> +	    {skip, "Crypto and/or SSH could not be started remote!"} +    end. + +remote_crash(Node,Config) -> +    DataDir = ?config(data_dir,Config), +    {ok,Client} = open_success(Node,DataDir), + +    ns(Node,expect_reply,[{'create-subscription',[stream]},ok]), +    ?ok = ct_netconfc:create_subscription(Client), + +    true = erlang:is_process_alive(Client), +    Ref = erlang:monitor(process,Client), +    rpc:call(Node,erlang,halt,[]), % take the node down as brutally as possible +    receive {'DOWN',Ref,process,Client,_} -> +	    ok +    after 10000 -> +	    ct:fail(client_still_alive) +    end. + +%%%----------------------------------------------------------------- + +break(_Config) -> +    test_server:break("break test case"). + +%%%----------------------------------------------------------------- +%% Open a netconf session which is not specified in a config file +open_success(Node,Dir) -> +    open_success(Node,Dir,[]). + +%% Open a netconf session which is not specified in a config file, and +%% give som extra options in addition to the test defaults. +open_success(Node,Dir,ExtraOpts) when is_list(Dir), is_list(ExtraOpts) -> +    ns(Node,hello,[1]), % tell server to send hello with session id 1 +    ns(Node,expect,[hello]), % tell server to expect a hello message from client +    open(Dir,ExtraOpts); + +%% Open a named netconf session which is not specified in a config file +open_success(Node,KeyOrName,Dir) when is_atom(KeyOrName), is_list(Dir) -> +    ns(Node,hello,[1]), +    ns(Node,expect,[hello]), +    ct_netconfc:open(KeyOrName,?DEFAULT_SSH_OPTS(Dir)). + +open(Dir) -> +    open(Dir,[]). +open(Dir,ExtraOpts) -> +    Opts = lists:ukeymerge(1,lists:keysort(1,ExtraOpts), +			   lists:keysort(1,?DEFAULT_SSH_OPTS(Dir))), +    ct_netconfc:open(Opts). + +%%%----------------------------------------------------------------- +%%% Call server on remote node +ns(Node,Func,Args) -> +    rpc:call(Node,?NS,Func,Args). + diff --git a/lib/common_test/test/ct_netconfc_SUITE_data/netconfc_test_lib.erl b/lib/common_test/test/ct_netconfc_SUITE_data/netconfc_test_lib.erl new file mode 100644 index 0000000000..e058bc7600 --- /dev/null +++ b/lib/common_test/test/ct_netconfc_SUITE_data/netconfc_test_lib.erl @@ -0,0 +1,166 @@ +-module(netconfc_test_lib). + +-export([get_id_keys/1, remove_id_keys/1, make_dsa_files/1]). +-include_lib("common_test/include/ct.hrl"). +-include_lib("public_key/include/public_key.hrl"). + +%%%----------------------------------------------------------------- +%%% BEGIN SSH key management +%% copy private keys to given dir from ~/.ssh +get_id_keys(Config) -> +    DstDir = ?config(priv_dir, Config), +    SrcDir = filename:join(os:getenv("HOME"), ".ssh"), +    RsaOk = copyfile(SrcDir, DstDir, "id_rsa"), +    DsaOk = copyfile(SrcDir, DstDir, "id_dsa"), +    case {RsaOk, DsaOk} of +	{{ok, _}, {ok, _}} -> {ok, both}; +	{{ok, _}, _} -> {ok, rsa}; +	{_, {ok, _}} -> {ok, dsa}; +	{Error, _} -> Error +    end. + +%% Remove later on. Use make_dsa_files instead. +remove_id_keys(Config) -> +    Dir = ?config(priv_dir, Config), +    file:delete(filename:join(Dir, "id_rsa")), +    file:delete(filename:join(Dir, "id_dsa")). + + +make_dsa_files(Config) -> +    make_dsa_files(Config, rfc4716_public_key). +make_dsa_files(Config, Type) -> +    {DSA, EncodedKey} = gen_dsa(128, 20), +    PKey = DSA#'DSAPrivateKey'.y, +    P = DSA#'DSAPrivateKey'.p, +    Q = DSA#'DSAPrivateKey'.q, +    G = DSA#'DSAPrivateKey'.g, +    Dss = #'Dss-Parms'{p=P, q=Q, g=G}, +    {ok, Hostname} = inet:gethostname(), +    {ok, {A, B, C, D}} = inet:getaddr(Hostname, inet), +    IP = lists:concat([A, ".", B, ".", C, ".", D]), +    Attributes = [], % Could be [{comment,"user@" ++ Hostname}], +    HostNames = [{hostnames,[IP, IP]}], +    PublicKey = [{{PKey, Dss}, Attributes}], +    KnownHosts = [{{PKey, Dss}, HostNames}], + +    KnownHostsEnc = public_key:ssh_encode(KnownHosts, known_hosts), +    KnownHosts = public_key:ssh_decode(KnownHostsEnc, known_hosts), + +    PublicKeyEnc = public_key:ssh_encode(PublicKey, Type), + +    SystemTmpDir = ?config(data_dir, Config), +    filelib:ensure_dir(SystemTmpDir), +    file:make_dir(SystemTmpDir), + +    DSAFile = filename:join(SystemTmpDir, "ssh_host_dsa_key.pub"), +    file:delete(DSAFile), + +    DSAPrivateFile  = filename:join(SystemTmpDir, "ssh_host_dsa_key"), +    file:delete(DSAPrivateFile), + +    KHFile = filename:join(SystemTmpDir, "known_hosts"), +    file:delete(KHFile), + +    PemBin = public_key:pem_encode([EncodedKey]), + +    file:write_file(DSAFile, PublicKeyEnc), +    file:write_file(KHFile, KnownHostsEnc), +    file:write_file(DSAPrivateFile, PemBin), +    ok. + + +%%-------------------------------------------------------------------- +%% @doc Creates a dsa key (OBS: for testing only) +%%   the sizes are in bytes +%% @spec (::integer()) -> {::atom(), ::binary(), ::opaque()} +%% @end +%%-------------------------------------------------------------------- +gen_dsa(LSize,NSize) when is_integer(LSize), is_integer(NSize) -> +    Key = gen_dsa2(LSize, NSize), +    {Key, encode_key(Key)}. + +encode_key(Key = #'DSAPrivateKey'{}) -> +    Der = public_key:der_encode('DSAPrivateKey', Key), +    {'DSAPrivateKey', Der, not_encrypted}. + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% DSA key generation  (OBS: for testing only) +%% See http://en.wikipedia.org/wiki/Digital_Signature_Algorithm +%% and the fips_186-3.pdf +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +gen_dsa2(LSize, NSize) -> +    Q  = prime(NSize),  %% Choose N-bit prime Q +    X0 = prime(LSize), +    P0 = prime((LSize div 2) +1), +     +    %% Choose L-bit prime modulus P such that p-1 is a multiple of q. +    case dsa_search(X0 div (2*Q*P0), P0, Q, 1000) of +	error ->  +	    gen_dsa2(LSize, NSize); +	P ->	     +	    G = crypto:mod_pow(2, (P-1) div Q, P), % Choose G a number whose multiplicative order modulo p is q. +	    %%                 such that This may be done by setting g = h^(p-1)/q mod p, commonly h=2 is used. +	     +	    X = prime(20),               %% Choose x by some random method, where 0 < x < q. +	    Y = crypto:mod_pow(G, X, P), %% Calculate y = g^x mod p. +	     +	    #'DSAPrivateKey'{version=0, p = P, q = Q,  +			     g = crypto:bytes_to_integer(G), y = crypto:bytes_to_integer(Y), x = X} +    end. +     +%% See fips_186-3.pdf +dsa_search(T, P0, Q, Iter) when Iter > 0 -> +    P = 2*T*Q*P0 + 1, +    case is_prime(P, 50) of +	true -> P; +	false -> dsa_search(T+1, P0, Q, Iter-1) +    end; +dsa_search(_,_,_,_) ->  +    error. + + +%%%%%%% Crypto Math %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +prime(ByteSize) -> +    Rand = odd_rand(ByteSize), +    prime_odd(Rand, 0). + +prime_odd(Rand, N) -> +    case is_prime(Rand, 50) of +	true ->  +	    Rand; +	false ->  +	    prime_odd(Rand+2, N+1) +    end. + +%% see http://en.wikipedia.org/wiki/Fermat_primality_test +is_prime(_, 0) -> true; +is_prime(Candidate, Test) ->  +    CoPrime = odd_rand(10000, Candidate), +    Result = crypto:mod_pow(CoPrime, Candidate, Candidate) , +    is_prime(CoPrime, crypto:bytes_to_integer(Result), Candidate, Test). + +is_prime(CoPrime, CoPrime, Candidate, Test) -> +    is_prime(Candidate, Test-1); +is_prime(_,_,_,_) -> +    false. + +odd_rand(Size) -> +    Min = 1 bsl (Size*8-1), +    Max = (1 bsl (Size*8))-1, +    odd_rand(Min, Max). + +odd_rand(Min,Max) -> +    Rand = crypto:rand_uniform(Min,Max), +    case Rand rem 2 of +	0 ->  +	    Rand + 1; +	_ ->  +	    Rand +    end. + +copyfile(SrcDir, DstDir, Fn) -> +    file:copy(filename:join(SrcDir, Fn), +	      filename:join(DstDir, Fn)). + +%%% END SSH key management +%%%----------------------------------------------------------------- diff --git a/lib/common_test/test/ct_netconfc_SUITE_data/netconfc_test_lib.hrl b/lib/common_test/test/ct_netconfc_SUITE_data/netconfc_test_lib.hrl new file mode 100644 index 0000000000..dcaad5ba93 --- /dev/null +++ b/lib/common_test/test/ct_netconfc_SUITE_data/netconfc_test_lib.hrl @@ -0,0 +1,14 @@ +%% Default timetrap timeout (set in init_per_testcase). +-define(default_timeout, ?t:minutes(1)). + +-define(NS,ns). % netconf server module +-define(LOCALHOST, "127.0.0.1"). +-define(SSH_PORT, 2060). + +-define(DEFAULT_SSH_OPTS,[{ssh,?LOCALHOST}, +			  {port,?SSH_PORT}, +			  {user,"xxx"}, +			  {password,"xxx"}]). +-define(DEFAULT_SSH_OPTS(Dir), ?DEFAULT_SSH_OPTS++[{user_dir,Dir}]). + +-define(ok,ok).  | 
