--- ssh_transport.erl.orig 2008-02-05 14:43:42.000000000 +0100 +++ ssh_transport.erl 2008-02-08 15:33:02.000000000 +0100 @@ -512,15 +512,13 @@ {ok, SendPdu} = send_algorithms(S, SSH, SendAlg), {ok, {RecvPdu,RecvAlg}} = recv_algorithms(S, SSH), kex_negotiate(S, User, SSH, UserAck, SendAlg, SendPdu, RecvAlg, RecvPdu). %% Other side started re-negotiate -recv_negotiate(S, User, SSH, RecvAlg, UserAck) -> - RecvPdu = ssh_bits:encode(RecvAlg), +recv_negotiate(S, User, SSH, RecvAlg, RecvPdu, UserAck) -> SendAlg = kex_init(SSH), {ok, SendPdu} = send_algorithms(S, SSH, SendAlg), - send_msg(S, SSH, SendAlg), kex_negotiate(S, User, SSH, UserAck, SendAlg, SendPdu, RecvAlg, RecvPdu). %% Select algorithms kex_negotiate(S, User, SSH, UserAck, SendAlg, SendPdu, RecvAlg, RecvPdu) -> case SSH#ssh.role of @@ -566,11 +564,13 @@ {error, bad_message}; Error -> Error end. - +%% select session id +sid(SSH, H) when SSH#ssh.session_id == undefined -> H; +sid(SSH, _) -> SSH#ssh.session_id. client_kex(S, SSH, 'diffie-hellman-group1-sha1') -> ssh_bits:install_messages(kexdh_messages()), {G,P} = dh_group1(), {Private, Public} = dh_gen_key(G,P,1024), @@ -587,11 +587,11 @@ ?dbg(?DBG_KEX, "hash: ~s\n", [fmt_binary(H, 16, 4)]), case verify_host_key(S, SSH, K_S, H, H_SIG) of ok -> {ok, SSH#ssh { shared_secret = K, exchanged_hash = H, - session_id = H }}; + session_id = sid(SSH, H) }}; Error -> Error end; {ok, _} -> {error, bad_message}; @@ -628,11 +628,11 @@ [fmt_binary(H, 16, 4)]), case verify_host_key(S, SSH, K_S, H, H_SIG) of ok -> {ok, SSH#ssh { shared_secret = K, exchanged_hash = H, - session_id = H }}; + session_id = sid(SSH, H) }}; Error -> Error end; {ok, _} -> {error, bad_message}; @@ -671,11 +671,11 @@ }), ?dbg(?DBG_KEX, "shared_secret: ~s\n", [fmt_binary(K, 16, 4)]), ?dbg(?DBG_KEX, "hash: ~s\n", [fmt_binary(H, 16, 4)]), {ok, SSH#ssh { shared_secret = K, exchanged_hash = H, - session_id = H }}; + session_id = sid(SSH, H) }}; {ok, _} -> {error, bad_message}; continue -> {error, bad_message}; Error -> @@ -704,11 +704,11 @@ }), ?dbg(?DBG_KEX, "shared_secret: ~s\n", [fmt_binary(K, 16, 4)]), ?dbg(?DBG_KEX, "hash: ~s\n", [fmt_binary(H, 16, 4)]), {ok, SSH#ssh { shared_secret = K, exchanged_hash = H, - session_id = H }}; + session_id = sid(SSH, H) }}; {ok, _} -> {error, bad_message}; continue -> {error, bad_message}; Error -> @@ -735,11 +735,11 @@ [M#ssh_msg_disconnect.code, M#ssh_msg_disconnect.description]), gen_tcp:close(S); {ok,M} when is_record(M, ssh_msg_kexinit) -> - recv_negotiate(S, User, SSH, M, false); + recv_negotiate(S, User, SSH, M, get(last_packet), false); continue -> %% ignore and debug messages inet:setopts(S, [{active, once}]), ssh_main(S, User, SSH); @@ -1202,10 +1202,11 @@ end, continue; {ok, M} when record(M, ssh_msg_ignore) -> continue; {ok, Msg} -> + put(last_packet, Packet), ?dbg(?DBG_MESSAGE, "RECV_MSG: ~70p\n", [Msg]), {ok, Msg}; Error -> %% Fixme (send disconnect...) Error