Diff

Differences From Artifact [5a7465859e]:

To Artifact [c2b2b031da]:


178
179
180
181
182
183
184

185
186
187
188
189
190
191
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192







+







 * Various remote-bug flags.
 */
#define BUG_CHOKES_ON_SSH1_IGNORE                 1
#define BUG_SSH2_HMAC                             2
#define BUG_NEEDS_SSH1_PLAIN_PASSWORD        	  4
#define BUG_CHOKES_ON_RSA	        	  8
#define BUG_SSH2_RSA_PADDING	        	 16
#define BUG_SSH2_DERIVEKEY                       32

static int ssh_pkt_ctx = 0;

#define translate(x) if (type == x) return #x
#define translatec(x,ctx) if (type == x && (ssh_pkt_ctx & ctx)) return #x
char *ssh1_pkt_type(int type)
{
1696
1697
1698
1699
1700
1701
1702










1703
1704
1705
1706
1707
1708
1709
1697
1698
1699
1700
1701
1702
1703
1704
1705
1706
1707
1708
1709
1710
1711
1712
1713
1714
1715
1716
1717
1718
1719
1720







+
+
+
+
+
+
+
+
+
+







	!strncmp(imp, "2.1 ", 4)) {
	/*
	 * These versions have the HMAC bug.
	 */
	ssh_remote_bugs |= BUG_SSH2_HMAC;
	logevent("We believe remote version has SSH2 HMAC bug");
    }

    if (!strncmp(imp, "2.0.", 4)) {
	/*
	 * These versions have the key-derivation bug (failing to
	 * include the literal shared secret in the hashes that
	 * generate the keys).
	 */
	ssh_remote_bugs |= BUG_SSH2_DERIVEKEY;
	logevent("We believe remote version has SSH2 key-derivation bug");
    }

    if ((!strncmp(imp, "OpenSSH_2.", 10) && imp[10]>='5' && imp[10]<='9') ||
	(!strncmp(imp, "OpenSSH_3.", 10) && imp[10]>='0' && imp[10]<='2')) {
	/*
	 * These versions have the SSH2 RSA padding bug.
	 */
	ssh_remote_bugs |= BUG_SSH2_RSA_PADDING;
3493
3494
3495
3496
3497
3498
3499

3500

3501
3502
3503
3504
3505
3506

3507

3508
3509
3510
3511
3512
3513
3514
3504
3505
3506
3507
3508
3509
3510
3511

3512
3513
3514
3515
3516
3517
3518
3519

3520
3521
3522
3523
3524
3525
3526
3527







+
-
+






+
-
+







 */
static void ssh2_mkkey(Bignum K, char *H, char *sessid, char chr,
		       char *keyspace)
{
    SHA_State s;
    /* First 20 bytes. */
    SHA_Init(&s);
    if (!(ssh_remote_bugs & BUG_SSH2_DERIVEKEY))
    sha_mpint(&s, K);
	sha_mpint(&s, K);
    SHA_Bytes(&s, H, 20);
    SHA_Bytes(&s, &chr, 1);
    SHA_Bytes(&s, sessid, 20);
    SHA_Final(&s, keyspace);
    /* Next 20 bytes. */
    SHA_Init(&s);
    if (!(ssh_remote_bugs & BUG_SSH2_DERIVEKEY))
    sha_mpint(&s, K);
	sha_mpint(&s, K);
    SHA_Bytes(&s, H, 20);
    SHA_Bytes(&s, keyspace, 20);
    SHA_Final(&s, keyspace + 20);
}

/*
 * Handle the SSH2 transport layer.