1
0
mirror of https://git.tartarus.org/simon/putty.git synced 2025-01-10 09:58:01 +00:00

Correct handling of SSH1 protocol flags, in particular

PROTOFLAG_SCREEN_NUMBER, without which OpenSSH 2.5.1 was objecting to
my gratuitous inclusion of a screen number in the SSH1 X forwarding
request. Ahem.

[originally from svn r1006]
This commit is contained in:
Simon Tatham 2001-03-16 11:58:54 +00:00
parent 947d33408f
commit 02f012a66a

49
ssh.c
View File

@ -68,6 +68,10 @@
#define SSH1_AUTH_TIS 5 /* 0x5 */ #define SSH1_AUTH_TIS 5 /* 0x5 */
#define SSH1_AUTH_CCARD 16 /* 0x10 */ #define SSH1_AUTH_CCARD 16 /* 0x10 */
#define SSH1_PROTOFLAG_SCREEN_NUMBER 1 /* 0x1 */
/* Mask for protoflags we will echo back to server if seen */
#define SSH1_PROTOFLAGS_SUPPORTED 0 /* 0x1 */
#define SSH2_MSG_DISCONNECT 1 /* 0x1 */ #define SSH2_MSG_DISCONNECT 1 /* 0x1 */
#define SSH2_MSG_IGNORE 2 /* 0x2 */ #define SSH2_MSG_IGNORE 2 /* 0x2 */
#define SSH2_MSG_UNIMPLEMENTED 3 /* 0x3 */ #define SSH2_MSG_UNIMPLEMENTED 3 /* 0x3 */
@ -256,6 +260,8 @@ static Socket s = NULL;
static unsigned char session_key[32]; static unsigned char session_key[32];
static int ssh1_compressing; static int ssh1_compressing;
static int ssh1_remote_protoflags;
static int ssh1_local_protoflags;
static int ssh_agentfwd_enabled; static int ssh_agentfwd_enabled;
static int ssh_X11_fwd_enabled; static int ssh_X11_fwd_enabled;
static int ssh_remote_bugs; static int ssh_remote_bugs;
@ -442,11 +448,13 @@ next_packet:
unsigned char *decompblk; unsigned char *decompblk;
int decomplen; int decomplen;
#if 0 #if 0
int i; {
debug(("Packet payload pre-decompression:\n")); int i;
for (i = -1; i < pktin.length; i++) debug(("Packet payload pre-decompression:\n"));
debug((" %02x", (unsigned char)pktin.body[i])); for (i = -1; i < pktin.length; i++)
debug(("\r\n")); debug((" %02x", (unsigned char)pktin.body[i]));
debug(("\r\n"));
}
#endif #endif
zlib_decompress_block(pktin.body-1, pktin.length+1, zlib_decompress_block(pktin.body-1, pktin.length+1,
&decompblk, &decomplen); &decompblk, &decomplen);
@ -463,10 +471,13 @@ next_packet:
sfree(decompblk); sfree(decompblk);
pktin.length = decomplen-1; pktin.length = decomplen-1;
#if 0 #if 0
debug(("Packet payload post-decompression:\n")); {
for (i = -1; i < pktin.length; i++) int i;
debug((" %02x", (unsigned char)pktin.body[i])); debug(("Packet payload post-decompression:\n"));
debug(("\r\n")); for (i = -1; i < pktin.length; i++)
debug((" %02x", (unsigned char)pktin.body[i]));
debug(("\r\n"));
}
#endif #endif
} }
@ -1418,9 +1429,13 @@ static int do_ssh1_login(unsigned char *in, int inlen, int ispkt)
logevent(logmsg); logevent(logmsg);
} }
ssh1_remote_protoflags = GET_32BIT(pktin.body+8+i+j);
supported_ciphers_mask = GET_32BIT(pktin.body+12+i+j); supported_ciphers_mask = GET_32BIT(pktin.body+12+i+j);
supported_auths_mask = GET_32BIT(pktin.body+16+i+j); supported_auths_mask = GET_32BIT(pktin.body+16+i+j);
ssh1_local_protoflags = ssh1_remote_protoflags & SSH1_PROTOFLAGS_SUPPORTED;
ssh1_local_protoflags |= SSH1_PROTOFLAG_SCREEN_NUMBER;
MD5Init(&md5c); MD5Init(&md5c);
MD5Update(&md5c, keystr2, hostkey.bytes); MD5Update(&md5c, keystr2, hostkey.bytes);
MD5Update(&md5c, keystr1, servkey.bytes); MD5Update(&md5c, keystr1, servkey.bytes);
@ -1494,7 +1509,7 @@ static int do_ssh1_login(unsigned char *in, int inlen, int ispkt)
PKT_DATA, cookie, 8, PKT_DATA, cookie, 8,
PKT_CHAR, (len*8) >> 8, PKT_CHAR, (len*8) & 0xFF, PKT_CHAR, (len*8) >> 8, PKT_CHAR, (len*8) & 0xFF,
PKT_DATA, rsabuf, len, PKT_DATA, rsabuf, len,
PKT_INT, 0, PKT_INT, ssh1_local_protoflags,
PKT_END); PKT_END);
logevent("Trying to enable encryption..."); logevent("Trying to enable encryption...");
@ -2054,10 +2069,16 @@ static void ssh1_protocol(unsigned char *in, int inlen, int ispkt) {
char proto[20], data[64]; char proto[20], data[64];
logevent("Requesting X11 forwarding"); logevent("Requesting X11 forwarding");
x11_invent_auth(proto, sizeof(proto), data, sizeof(data)); x11_invent_auth(proto, sizeof(proto), data, sizeof(data));
send_packet(SSH1_CMSG_X11_REQUEST_FORWARDING, if (ssh1_local_protoflags & SSH1_PROTOFLAG_SCREEN_NUMBER) {
PKT_STR, proto, PKT_STR, data, send_packet(SSH1_CMSG_X11_REQUEST_FORWARDING,
PKT_INT, 0, PKT_STR, proto, PKT_STR, data,
PKT_END); PKT_INT, 0,
PKT_END);
} else {
send_packet(SSH1_CMSG_X11_REQUEST_FORWARDING,
PKT_STR, proto, PKT_STR, data,
PKT_END);
}
do { crReturnV; } while (!ispkt); do { crReturnV; } while (!ispkt);
if (pktin.type != SSH1_SMSG_SUCCESS && pktin.type != SSH1_SMSG_FAILURE) { if (pktin.type != SSH1_SMSG_SUCCESS && pktin.type != SSH1_SMSG_FAILURE) {
bombout(("Protocol confusion")); bombout(("Protocol confusion"));