From 0e11054cdbf94c903cb060d42edb8cfe2badc15e Mon Sep 17 00:00:00 2001 From: Kenny Root Date: Tue, 11 Nov 2008 07:18:26 +0000 Subject: * Add compression option to hosts --- .../com/trilead/ssh2/transport/KexManager.java | 11 ++++- .../ssh2/transport/TransportConnection.java | 53 +++++++++++++++++++++- .../trilead/ssh2/transport/TransportManager.java | 26 +++++++++++ 3 files changed, 88 insertions(+), 2 deletions(-) (limited to 'lib/src/main/java/com/trilead/ssh2/transport') diff --git a/lib/src/main/java/com/trilead/ssh2/transport/KexManager.java b/lib/src/main/java/com/trilead/ssh2/transport/KexManager.java index 686e6cd..a2da737 100644 --- a/lib/src/main/java/com/trilead/ssh2/transport/KexManager.java +++ b/lib/src/main/java/com/trilead/ssh2/transport/KexManager.java @@ -7,6 +7,8 @@ import java.security.SecureRandom; import com.trilead.ssh2.ConnectionInfo; import com.trilead.ssh2.DHGexParameters; import com.trilead.ssh2.ServerHostKeyVerifier; +import com.trilead.ssh2.compression.CompressionFactory; +import com.trilead.ssh2.compression.ICompressor; import com.trilead.ssh2.crypto.CryptoWishList; import com.trilead.ssh2.crypto.KeyMaterial; import com.trilead.ssh2.crypto.cipher.BlockCipher; @@ -283,6 +285,7 @@ public class KexManager BlockCipher cbc; MAC mac; + ICompressor comp; try { @@ -290,6 +293,8 @@ public class KexManager km.initial_iv_client_to_server); mac = new MAC(kxs.np.mac_algo_client_to_server, km.integrity_key_client_to_server); + + comp = CompressionFactory.createCompressor(kxs.np.comp_algo_client_to_server); } catch (IllegalArgumentException e1) @@ -298,6 +303,7 @@ public class KexManager } tm.changeSendCipher(cbc, mac); + tm.changeSendCompression(comp); tm.kexFinished(); } @@ -464,6 +470,7 @@ public class KexManager BlockCipher cbc; MAC mac; + ICompressor comp; try { @@ -471,7 +478,8 @@ public class KexManager km.enc_key_server_to_client, km.initial_iv_server_to_client); mac = new MAC(kxs.np.mac_algo_server_to_client, km.integrity_key_server_to_client); - + + comp = CompressionFactory.createCompressor(kxs.np.comp_algo_server_to_client); } catch (IllegalArgumentException e1) { @@ -479,6 +487,7 @@ public class KexManager } tm.changeRecvCipher(cbc, mac); + tm.changeRecvCompression(comp); ConnectionInfo sci = new ConnectionInfo(); diff --git a/lib/src/main/java/com/trilead/ssh2/transport/TransportConnection.java b/lib/src/main/java/com/trilead/ssh2/transport/TransportConnection.java index a193503..2384773 100644 --- a/lib/src/main/java/com/trilead/ssh2/transport/TransportConnection.java +++ b/lib/src/main/java/com/trilead/ssh2/transport/TransportConnection.java @@ -6,6 +6,7 @@ import java.io.InputStream; import java.io.OutputStream; import java.security.SecureRandom; +import com.trilead.ssh2.compression.ICompressor; import com.trilead.ssh2.crypto.cipher.BlockCipher; import com.trilead.ssh2.crypto.cipher.CipherInputStream; import com.trilead.ssh2.crypto.cipher.CipherOutputStream; @@ -50,6 +51,16 @@ public class TransportConnection byte[] recv_mac_buffer_cmp; int recv_padd_blocksize = 8; + + ICompressor recv_comp = null; + + ICompressor send_comp = null; + + boolean can_compress = false; + + byte[] recv_comp_buffer; + + byte[] send_comp_buffer; /* won't change */ @@ -101,7 +112,23 @@ public class TransportConnection if (send_padd_blocksize < 8) send_padd_blocksize = 8; } + + public void changeRecvCompression(ICompressor comp) + { + recv_comp = comp; + + if (comp != null) + recv_comp_buffer = new byte[comp.getBufferSize()]; + } + public void changeSendCompression(ICompressor comp) + { + send_comp = comp; + + if (comp != null) + send_comp_buffer = new byte[comp.getBufferSize()]; + } + public void sendMessage(byte[] message) throws IOException { sendMessage(message, 0, message.length, 0); @@ -124,6 +151,12 @@ public class TransportConnection padd = 4; else if (padd > 64) padd = 64; + + // TODO add compression somewhere here + if (send_comp != null && can_compress) { + len = send_comp.compress(message, off, len, send_comp_buffer); + message = send_comp_buffer; + } int packet_len = 5 + len + padd; /* Minimum allowed padding is 4 */ @@ -279,6 +312,24 @@ public class TransportConnection + " bytes payload"); } - return payload_length; + if (recv_comp != null && can_compress) { + int[] uncomp_len = new int[] { payload_length }; + buffer = recv_comp.uncompress(buffer, off, uncomp_len); + + if (buffer == null) { + throw new IOException("Error while inflating remote data"); + } else { + return uncomp_len[0]; + } + } else { + return payload_length; + } + } + + /** + * + */ + public void startCompression() { + can_compress = true; } } diff --git a/lib/src/main/java/com/trilead/ssh2/transport/TransportManager.java b/lib/src/main/java/com/trilead/ssh2/transport/TransportManager.java index aeb4fce..c81dbdf 100644 --- a/lib/src/main/java/com/trilead/ssh2/transport/TransportManager.java +++ b/lib/src/main/java/com/trilead/ssh2/transport/TransportManager.java @@ -18,6 +18,7 @@ import com.trilead.ssh2.HTTPProxyData; import com.trilead.ssh2.HTTPProxyException; import com.trilead.ssh2.ProxyData; import com.trilead.ssh2.ServerHostKeyVerifier; +import com.trilead.ssh2.compression.ICompressor; import com.trilead.ssh2.crypto.Base64; import com.trilead.ssh2.crypto.CryptoWishList; import com.trilead.ssh2.crypto.cipher.BlockCipher; @@ -586,6 +587,27 @@ public class TransportManager tc.changeSendCipher(bc, mac); } + /** + * @param comp + */ + public void changeRecvCompression(ICompressor comp) { + tc.changeRecvCompression(comp); + } + + /** + * @param comp + */ + public void changeSendCompression(ICompressor comp) { + tc.changeSendCompression(comp); + } + + /** + * + */ + public void startCompression() { + tc.startCompression(); + } + public void sendAsynchronousMessage(byte[] msg) throws IOException { synchronized (asynchronousQueue) @@ -755,6 +777,10 @@ public class TransportManager continue; } + if (type == Packets.SSH_MSG_USERAUTH_SUCCESS) { + tc.startCompression(); + } + MessageHandler mh = null; for (int i = 0; i < messageHandlers.size(); i++) -- cgit v1.2.3