File 2847-ssh-Fix-ssh_agent_SUITE-for-missing-pubkey-algos.patch of Package erlang
From b01fd908e2e550b7c489b23c79ba421d9141729f Mon Sep 17 00:00:00 2001
From: Hans Nilsson <hans@erlang.org>
Date: Wed, 4 Mar 2020 15:11:21 +0100
Subject: [PATCH 07/12] ssh: Fix ssh_agent_SUITE for missing pubkey algos
---
lib/ssh/test/ssh_agent_SUITE.erl | 2 +-
lib/ssh/test/ssh_agent_mock_server.erl | 41 ++++++++++++++++++++--------------
2 files changed, 25 insertions(+), 18 deletions(-)
diff --git a/lib/ssh/test/ssh_agent_SUITE.erl b/lib/ssh/test/ssh_agent_SUITE.erl
index 44616fb969..7efd1c6d88 100644
--- a/lib/ssh/test/ssh_agent_SUITE.erl
+++ b/lib/ssh/test/ssh_agent_SUITE.erl
@@ -120,7 +120,7 @@ connect_with_ssh_agent() ->
connect_with_ssh_agent(Config) ->
DataDir = proplists:get_value(data_dir, Config),
- {ok, SocketPath} = ssh_agent_mock_server:start_link(DataDir),
+ {ok, SocketPath} = ssh_agent_mock_server:start_link('rsa-sha2-256', DataDir),
{Pid, Host, Port} = ssh_test_lib:daemon([{system_dir, DataDir},
{user_dir, DataDir}]),
ConnectionRef = ssh_test_lib:connect(Host, Port, [{user_dir, DataDir},
diff --git a/lib/ssh/test/ssh_agent_mock_server.erl b/lib/ssh/test/ssh_agent_mock_server.erl
index 9c17e639ab..ff417bd91e 100644
--- a/lib/ssh/test/ssh_agent_mock_server.erl
+++ b/lib/ssh/test/ssh_agent_mock_server.erl
@@ -29,21 +29,19 @@
-include_lib("ssh/src/ssh_agent.hrl").
-export([respond/1, check_mktemp/1]).
--export([start_link/1, stop/1]).
+-export([start_link/2, stop/1]).
-export([init/1, handle_info/2, handle_cast/2, handle_call/3, terminate/2]).
--record(state, {socket, priv_key, pub_key, socket_path}).
+-record(state, {socket, priv_key, pub_key, socket_path, sig_alg}).
--define(SIG_ALG, 'ssh-rsa').
-
-start_link(PrivKeyDir) ->
- {ok, PrivKey} =ssh_file:user_key(?SIG_ALG, [{user_dir, PrivKeyDir}]),
+start_link(SigAlg, PrivKeyDir) ->
+ {ok, PrivKey} =ssh_file:user_key(SigAlg, [{user_dir, PrivKeyDir}]),
%% We cannot use priv_dir because unix socket paths are limited to 108 bytes.
SocketPath = string:chomp(os:cmd("mktemp -u")),
PubKey = extract_pubkey(PrivKey),
- InitialState = #state{socket_path=SocketPath, priv_key=PrivKey, pub_key=PubKey},
+ InitialState = #state{socket_path=SocketPath, priv_key=PrivKey, pub_key=PubKey, sig_alg=SigAlg},
{ok, _} = gen_server:start_link(?MODULE, InitialState, []),
{ok, SocketPath}.
@@ -92,20 +90,24 @@ handle_request(<<11>>, #state{pub_key=PubKey}) ->
?STRING(<<"lorem">>) % key 1 comment (4 + 5 bytes)
>>;
-handle_request(<<13, Rest/binary>>, #state{priv_key=PrivKey, pub_key=PubKey}) ->
+handle_request(<<13, Rest/binary>>, #state{priv_key=PrivKey, pub_key=PubKey, sig_alg=SigAlg}) ->
Flags = ?SSH_AGENT_RSA_SHA2_256 bor ?SSH_AGENT_RSA_SHA2_512,
<<?DEC_BIN(PubKey, _KeyBlobLen), ?DEC_BIN(Data, _DataLen), ?Euint32(Flags)>> = Rest,
- Hash = ssh_transport:sha(?SIG_ALG),
+ Hash = ssh_transport:sha(SigAlg),
Sig = ssh_transport:sign(Data, Hash, PrivKey),
- SigLen = byte_size(Sig),
- <<?UINT32(20 + SigLen), % message length
- ?BYTE(14), % message type (1 byte)
- ?STRING( % nested string (4 bytes)
- <<?STRING(<<"ssh-rsa">>), % signature format (4 + 7 bytes)
- ?STRING(Sig) % signature blob (4 + SigLen bytes)
- >>
- )
+ SigFormat = sig_format(SigAlg),
+ Msg =
+ <<?BYTE(14), % message type (1 byte)
+ ?STRING( % nested string (4 bytes)
+ <<?STRING(SigFormat), % signature format (4 + ? bytes)
+ ?STRING(Sig) % signature blob (4 + SigLen bytes)
+ >>
+ )
+ >>,
+ MsgLen = size(Msg),
+ <<?UINT32(MsgLen), % message length
+ Msg/binary
>>.
terminate(_Reason, #state{socket_path=SocketPath, socket=Socket}) ->
@@ -149,3 +151,8 @@ check_mktemp(Config) ->
extract_pubkey(PrivKey) ->
PubKey = ssh_transport:extract_public_key(PrivKey),
ssh_message:ssh2_pubkey_encode(PubKey).
+
+sig_format('ssh-rsa') -> <<"ssh-rsa">>;
+sig_format('rsa-sha2-256') -> <<"ssh-rsa">>;
+sig_format('rsa-sha2-384') -> <<"ssh-rsa">>;
+sig_format('rsa-sha2-512') -> <<"ssh-rsa">>.
--
2.16.4