Fix case where "-K 1" would cause a SSH_MSG_IGNORE packet to be sent

with the wrong encryption key ("bad packet length" symptom) while
key exchange was happening.

--HG--
extra : convert_revision : f7d27ec094c4aba2a4289c523c722fcb3c3f58ca
This commit is contained in:
Matt Johnston 2011-06-07 11:55:44 +00:00
parent 0f83379dc0
commit 2bcb60fe56
2 changed files with 9 additions and 3 deletions

4
kex.h
View File

@ -52,8 +52,8 @@ struct KEXState {
unsigned sentkexinit : 1; /*set when we've sent/recv kexinit packet */ unsigned sentkexinit : 1; /*set when we've sent/recv kexinit packet */
unsigned recvkexinit : 1; unsigned recvkexinit : 1;
unsigned firstfollows : 1; /* true when first_kex_packet_follows is set */ unsigned firstfollows : 1; /* true when first_kex_packet_follows is set */
unsigned sentnewkeys : 1; /* set once we've send/recv'ed MSG_NEWKEYS*/ unsigned sentnewkeys : 1; /* set once we've send MSG_NEWKEYS (will be cleared once we have also received */
unsigned recvnewkeys : 1; unsigned recvnewkeys : 1; /* set once we've received MSG_NEWKEYS (cleared once we have also sent */
unsigned donefirstkex : 1; /* Set to 1 after the first kex has completed, unsigned donefirstkex : 1; /* Set to 1 after the first kex has completed,
ie the transport layer has been set up */ ie the transport layer has been set up */

View File

@ -441,10 +441,16 @@ void encrypt_packet() {
TRACE(("encrypt_packet type is %d", packet_type)) TRACE(("encrypt_packet type is %d", packet_type))
if (!ses.dataallowed && !packet_is_okay_kex(packet_type)) { if ((!ses.dataallowed && !packet_is_okay_kex(packet_type))
|| ses.kexstate.sentnewkeys) {
/* During key exchange only particular packets are allowed. /* During key exchange only particular packets are allowed.
Since this packet_type isn't OK we just enqueue it to send Since this packet_type isn't OK we just enqueue it to send
after the KEX, see maybe_flush_reply_queue */ after the KEX, see maybe_flush_reply_queue */
/* We also enqueue packets here when we have sent a MSG_NEWKEYS
* packet but are yet to received one. For simplicity we just switch
* over all the keys at once. This is the 'ses.kexstate.sentnewkeys'
* case. */
enqueue_reply_packet(); enqueue_reply_packet();
return; return;
} }