Diff

Differences From Artifact [2e58f5dfd6]:

To Artifact [e1849e5c1c]:


64
65
66
67
68
69
70




71
72
73
74
75
76
77
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81







+
+
+
+







#define SSH1_CMSG_AUTH_CCARD                      70   /* 0x46 */
#define SSH1_SMSG_AUTH_CCARD_CHALLENGE            71   /* 0x47 */
#define SSH1_CMSG_AUTH_CCARD_RESPONSE             72   /* 0x48 */

#define SSH1_AUTH_TIS                             5    /* 0x5 */
#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_IGNORE                           2    /* 0x2 */
#define SSH2_MSG_UNIMPLEMENTED                    3    /* 0x3 */
#define SSH2_MSG_DEBUG                            4    /* 0x4 */
#define SSH2_MSG_SERVICE_REQUEST                  5    /* 0x5 */
#define SSH2_MSG_SERVICE_ACCEPT                   6    /* 0x6 */
#define SSH2_MSG_KEXINIT                          20   /* 0x14 */
252
253
254
255
256
257
258


259
260
261
262
263
264
265
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271







+
+








static SHA_State exhash, exhashbase;

static Socket s = NULL;

static unsigned char session_key[32];
static int ssh1_compressing;
static int ssh1_remote_protoflags;
static int ssh1_local_protoflags;
static int ssh_agentfwd_enabled;
static int ssh_X11_fwd_enabled;
static int ssh_remote_bugs;
static const struct ssh_cipher *cipher = NULL;
static const struct ssh2_cipher *cscipher = NULL;
static const struct ssh2_cipher *sccipher = NULL;
static const struct ssh_mac *csmac = NULL;
438
439
440
441
442
443
444

445
446
447
448
449






450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465


466
467
468
469





470
471
472
473
474
475
476
444
445
446
447
448
449
450
451





452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475




476
477
478
479
480
481
482
483
484
485
486
487







+
-
-
-
-
-
+
+
+
+
+
+
















+
+
-
-
-
-
+
+
+
+
+








    pktin.body = pktin.data + st->pad + 1;

    if (ssh1_compressing) {
	unsigned char *decompblk;
	int decomplen;
#if 0
        {
	int i;
	debug(("Packet payload pre-decompression:\n"));
	for (i = -1; i < pktin.length; i++)
	    debug(("  %02x", (unsigned char)pktin.body[i]));
	debug(("\r\n"));
            int i;
            debug(("Packet payload pre-decompression:\n"));
            for (i = -1; i < pktin.length; i++)
                debug(("  %02x", (unsigned char)pktin.body[i]));
            debug(("\r\n"));
        }
#endif
	zlib_decompress_block(pktin.body-1, pktin.length+1,
			      &decompblk, &decomplen);

	if (pktin.maxlen < st->pad + decomplen) {
	    pktin.maxlen = st->pad + decomplen;
	    pktin.data = srealloc(pktin.data, pktin.maxlen+APIEXTRA);
            pktin.body = pktin.data + st->pad + 1;
	    if (!pktin.data)
		fatalbox("Out of memory");
	}

	memcpy(pktin.body-1, decompblk, decomplen);
	sfree(decompblk);
	pktin.length = decomplen-1;
#if 0
        {
            int i;
	debug(("Packet payload post-decompression:\n"));
	for (i = -1; i < pktin.length; i++)
	    debug(("  %02x", (unsigned char)pktin.body[i]));
	debug(("\r\n"));
            debug(("Packet payload post-decompression:\n"));
            for (i = -1; i < pktin.length; i++)
                debug(("  %02x", (unsigned char)pktin.body[i]));
            debug(("\r\n"));
        }
#endif
    }

    if (pktin.type == SSH1_SMSG_STDOUT_DATA ||
        pktin.type == SSH1_SMSG_STDERR_DATA ||
        pktin.type == SSH1_MSG_DEBUG ||
        pktin.type == SSH1_SMSG_AUTH_TIS_CHALLENGE ||
1414
1415
1416
1417
1418
1419
1420

1421
1422



1423
1424
1425
1426
1427
1428
1429
1425
1426
1427
1428
1429
1430
1431
1432
1433
1434
1435
1436
1437
1438
1439
1440
1441
1442
1443
1444







+


+
+
+







	strcpy(logmsg, "      ");
        hostkey.comment = NULL;
        rsa_fingerprint(logmsg+strlen(logmsg), sizeof(logmsg)-strlen(logmsg),
                        &hostkey);
	logevent(logmsg);
    }

    ssh1_remote_protoflags = GET_32BIT(pktin.body+8+i+j);
    supported_ciphers_mask = GET_32BIT(pktin.body+12+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);
    MD5Update(&md5c, keystr2, hostkey.bytes);
    MD5Update(&md5c, keystr1, servkey.bytes);
    MD5Update(&md5c, pktin.body, 8);
    MD5Final(session_id, &md5c);

1490
1491
1492
1493
1494
1495
1496
1497

1498
1499
1500
1501
1502
1503
1504
1505
1506
1507
1508
1509
1510
1511

1512
1513
1514
1515
1516
1517
1518
1519







-
+







    }

    send_packet(SSH1_CMSG_SESSION_KEY,
                PKT_CHAR, cipher_type,
                PKT_DATA, cookie, 8,
                PKT_CHAR, (len*8) >> 8, PKT_CHAR, (len*8) & 0xFF,
                PKT_DATA, rsabuf, len,
                PKT_INT, 0,
                PKT_INT, ssh1_local_protoflags,
                PKT_END);

    logevent("Trying to enable encryption...");

    sfree(rsabuf);

    cipher = cipher_type == SSH_CIPHER_BLOWFISH ? &ssh_blowfish_ssh1 :
2050
2051
2052
2053
2054
2055
2056

2057
2058
2059
2060









2061
2062
2063
2064
2065
2066
2067
2065
2066
2067
2068
2069
2070
2071
2072




2073
2074
2075
2076
2077
2078
2079
2080
2081
2082
2083
2084
2085
2086
2087
2088







+
-
-
-
-
+
+
+
+
+
+
+
+
+







	}
    }

    if (cfg.x11_forward) {
        char proto[20], data[64];
        logevent("Requesting X11 forwarding");
        x11_invent_auth(proto, sizeof(proto), data, sizeof(data));
        if (ssh1_local_protoflags & SSH1_PROTOFLAG_SCREEN_NUMBER) {
        send_packet(SSH1_CMSG_X11_REQUEST_FORWARDING, 
		    PKT_STR, proto, PKT_STR, data,
		    PKT_INT, 0,
		    PKT_END);
            send_packet(SSH1_CMSG_X11_REQUEST_FORWARDING,
                        PKT_STR, proto, PKT_STR, data,
                        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);
        if (pktin.type != SSH1_SMSG_SUCCESS && pktin.type != SSH1_SMSG_FAILURE) {
            bombout(("Protocol confusion"));
            crReturnV;
        } else if (pktin.type == SSH1_SMSG_FAILURE) {
            logevent("X11 forwarding refused");
        } else {