diff --git a/src/Renci.SshNet/ConnectionInfo.cs b/src/Renci.SshNet/ConnectionInfo.cs
index f9b872d3c..51cb30e9e 100644
--- a/src/Renci.SshNet/ConnectionInfo.cs
+++ b/src/Renci.SshNet/ConnectionInfo.cs
@@ -180,6 +180,11 @@ public class ConnectionInfo : IConnectionInfoInternal
///
public int MaxSessions { get; set; }
+ ///
+ /// send client keys right after server version exchange, don't wait for server
+ ///
+ public bool EarlyClientInitMessage { get; set; }
+
///
/// Occurs when authentication banner is sent by the server.
///
diff --git a/src/Renci.SshNet/Security/KeyExchange.cs b/src/Renci.SshNet/Security/KeyExchange.cs
index 75e3517ac..1d0fa730a 100644
--- a/src/Renci.SshNet/Security/KeyExchange.cs
+++ b/src/Renci.SshNet/Security/KeyExchange.cs
@@ -71,7 +71,14 @@ public virtual void Start(Session session, KeyExchangeInitMessage message)
{
Session = session;
- SendMessage(session.ClientInitMessage);
+ if (!Session.ConnectionInfo.EarlyClientInitMessage)
+ {
+ SendMessage(session.ClientInitMessage);
+ }
+ else
+ {
+ DiagnosticAbstraction.Log("KeyExchange: ClientInitMessage already sent, skip");
+ }
// Determine encryption algorithm
var clientEncryptionAlgorithmName = (from b in session.ConnectionInfo.Encryptions.Keys
diff --git a/src/Renci.SshNet/Session.cs b/src/Renci.SshNet/Session.cs
index 33af76560..c50b7be42 100644
--- a/src/Renci.SshNet/Session.cs
+++ b/src/Renci.SshNet/Session.cs
@@ -651,6 +651,12 @@ public void Connect()
// mark the message listener threads as started
_messageListenerCompleted.Reset();
+ if (ConnectionInfo.EarlyClientInitMessage)
+ {
+ DiagnosticAbstraction.Log("Sending early client init message");
+ SendMessage(ClientInitMessage);
+ }
+
// Start incoming request listener
ThreadAbstraction.ExecuteThread(MessageListener);