]> andersk Git - openssh.git/blobdiff - packet.c
- markus@cvs.openbsd.org 2001/04/14 16:27:57
[openssh.git] / packet.c
index a4a0b05957d1cc4854f1a3a83cb6b0aaa47f98b0..e816cb9473ca0fc0fed76c8c6f65e25e796d0194 100644 (file)
--- a/packet.c
+++ b/packet.c
@@ -37,7 +37,7 @@
  */
 
 #include "includes.h"
-RCSID("$OpenBSD: packet.c,v 1.57 2001/04/03 23:32:12 markus Exp $");
+RCSID("$OpenBSD: packet.c,v 1.61 2001/04/05 10:42:51 markus Exp $");
 
 #include "xmalloc.h"
 #include "buffer.h"
@@ -104,6 +104,7 @@ static Buffer incoming_packet;
 
 /* Scratch buffer for packet compression/decompression. */
 static Buffer compression_buffer;
+static int compression_buffer_ready = 0;
 
 /* Flag indicating whether packet compression/decompression is enabled. */
 static int packet_compression = 0;
@@ -123,16 +124,6 @@ int use_ssh2_packet_format = 0;
 /* Session key information for Encryption and MAC */
 Newkeys *newkeys[MODE_MAX];
 
-void
-clear_enc_keys(Enc *enc, int len)
-{
-       memset(enc->iv,  0, len);
-       memset(enc->key, 0, len);
-       xfree(enc->iv);
-       xfree(enc->key);
-       enc->iv = NULL;
-       enc->key = NULL;
-}
 void
 packet_set_ssh2_format(void)
 {
@@ -259,7 +250,7 @@ packet_close()
        buffer_free(&output);
        buffer_free(&outgoing_packet);
        buffer_free(&incoming_packet);
-       if (packet_compression) {
+       if (compression_buffer_ready) {
                buffer_free(&compression_buffer);
                buffer_compress_uninit();
        }
@@ -287,15 +278,24 @@ packet_get_protocol_flags()
  * Level is compression level 1 (fastest) - 9 (slow, best) as in gzip.
  */
 
-/*** XXXXX todo: kex means re-init */
+void
+packet_init_compression()
+{
+       if (compression_buffer_ready == 1)
+               return;
+       compression_buffer_ready = 1;
+       buffer_init(&compression_buffer);
+}
+
 void
 packet_start_compression(int level)
 {
-       if (packet_compression)
+       if (packet_compression && !use_ssh2_packet_format)
                fatal("Compression already enabled.");
        packet_compression = 1;
-       buffer_init(&compression_buffer);
-       buffer_compress_init(level);
+       packet_init_compression();
+       buffer_compress_init_send(level);
+       buffer_compress_init_recv();
 }
 
 /*
@@ -524,8 +524,19 @@ set_newkeys(int mode)
        cc = (mode == MODE_OUT) ? &send_context : &receive_context;
        if (newkeys[mode] != NULL) {
                debug("newkeys: rekeying");
+               /* todo: free old keys, reset compression/cipher-ctxt; */
                memset(cc, 0, sizeof(*cc));
-               // free old keys, reset compression cipher-contexts;
+               enc  = &newkeys[mode]->enc;
+               mac  = &newkeys[mode]->mac;
+               comp = &newkeys[mode]->comp;
+               memset(mac->key, 0, mac->key_len);
+               xfree(enc->name);
+               xfree(enc->iv);
+               xfree(enc->key);
+               xfree(mac->name);
+               xfree(mac->key);
+               xfree(comp->name);
+               xfree(newkeys[mode]);
        }
        newkeys[mode] = kex_get_newkeys(mode);
        if (newkeys[mode] == NULL)
@@ -538,11 +549,15 @@ set_newkeys(int mode)
        DBG(debug("cipher_init_context: %d", mode));
        cipher_init(cc, enc->cipher, enc->key, enc->cipher->key_len,
            enc->iv, enc->cipher->block_size);
-       clear_enc_keys(enc, enc->cipher->key_len);
+       memset(enc->iv,  0, enc->cipher->block_size);
+       memset(enc->key, 0, enc->cipher->key_len);
        if (comp->type != 0 && comp->enabled == 0) {
+               packet_init_compression();
+               if (mode == MODE_OUT)
+                       buffer_compress_init_send(6);
+               else
+                       buffer_compress_init_recv();
                comp->enabled = 1;
-               if (! packet_compression)
-                       packet_start_compression(6);
        }
 }
 
@@ -1314,10 +1329,10 @@ packet_set_maxsize(int s)
 
 /*
  * 9.2.  Ignored Data Message
- * 
+ *
  *   byte      SSH_MSG_IGNORE
  *   string    data
- * 
+ *
  * All implementations MUST understand (and ignore) this message at any
  * time (after receiving the protocol version). No implementation is
  * required to send them. This message can be used as an additional
This page took 0.050556 seconds and 4 git commands to generate.