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

openSUSE Build Service is sponsored by