diff options
author | Hans Nilsson <[email protected]> | 2017-01-20 15:52:57 +0100 |
---|---|---|
committer | Hans Nilsson <[email protected]> | 2017-02-01 13:12:08 +0100 |
commit | 99a6fe8c485af3024731bbb6a5af9afac7a0045f (patch) | |
tree | 8a60da391fdbf27d8afb0c6b6db96de82771593f | |
parent | 05473252a740ae40894fbd2e5ee4349db6db087c (diff) | |
download | otp-99a6fe8c485af3024731bbb6a5af9afac7a0045f.tar.gz otp-99a6fe8c485af3024731bbb6a5af9afac7a0045f.tar.bz2 otp-99a6fe8c485af3024731bbb6a5af9afac7a0045f.zip |
ssh: Enable usage of supported but not default host key algorithms
-rw-r--r-- | lib/ssh/src/ssh_connection_handler.erl | 33 |
1 files changed, 19 insertions, 14 deletions
diff --git a/lib/ssh/src/ssh_connection_handler.erl b/lib/ssh/src/ssh_connection_handler.erl index 4496c657c3..dcf509ca09 100644 --- a/lib/ssh/src/ssh_connection_handler.erl +++ b/lib/ssh/src/ssh_connection_handler.erl @@ -1481,31 +1481,36 @@ renegotiation(_) -> false. %%-------------------------------------------------------------------- supported_host_keys(client, _, Options) -> try - case proplists:get_value(public_key, - proplists:get_value(preferred_algorithms,Options,[]) - ) of - undefined -> - ssh_transport:default_algorithms(public_key); - L -> - L -- (L--ssh_transport:default_algorithms(public_key)) - end + find_sup_hkeys(Options) of [] -> - {stop, {shutdown, "No public key algs"}}; + error({shutdown, "No public key algs"}); Algs -> [atom_to_list(A) || A<-Algs] catch exit:Reason -> - {stop, {shutdown, Reason}} + error({shutdown, Reason}) end; supported_host_keys(server, KeyCb, Options) -> - [atom_to_list(A) || A <- proplists:get_value(public_key, - proplists:get_value(preferred_algorithms,Options,[]), - ssh_transport:default_algorithms(public_key) - ), + [atom_to_list(A) || A <- find_sup_hkeys(Options), available_host_key(KeyCb, A, Options) ]. + +find_sup_hkeys(Options) -> + case proplists:get_value(public_key, + proplists:get_value(preferred_algorithms,Options,[]) + ) + of + undefined -> + ssh_transport:default_algorithms(public_key); + L -> + NonSupported = L--ssh_transport:supported_algorithms(public_key), + L -- NonSupported + end. + + + %% Alg :: atom() available_host_key(KeyCb, Alg, Opts) -> element(1, catch KeyCb:host_key(Alg, Opts)) == ok. |