View | Details | Raw Unified | Return to bug 148 | Differences between
and this patch

Collapse All | Expand All

(-)kex.c (-3 / +44 lines)
Lines 74-80 Link Here
74
74
75
/* parse buffer and return algorithm proposal */
75
/* parse buffer and return algorithm proposal */
76
static char **
76
static char **
77
kex_buf2prop(Buffer *raw)
77
kex_buf2prop(Buffer *raw, int *first_kex_follows)
78
{
78
{
79
	Buffer b;
79
	Buffer b;
80
	int i;
80
	int i;
Lines 94-99 Link Here
94
	}
94
	}
95
	/* first kex follows / reserved */
95
	/* first kex follows / reserved */
96
	i = buffer_get_char(&b);
96
	i = buffer_get_char(&b);
97
	if (first_kex_follows != NULL)
98
		*first_kex_follows = i;
97
	debug2("kex_parse_kexinit: first_kex_follows %d ", i);
99
	debug2("kex_parse_kexinit: first_kex_follows %d ", i);
98
	i = buffer_get_int(&b);
100
	i = buffer_get_int(&b);
99
	debug2("kex_parse_kexinit: reserved %d ", i);
101
	debug2("kex_parse_kexinit: reserved %d ", i);
Lines 317-322 Link Here
317
	xfree(hostkeyalg);
319
	xfree(hostkeyalg);
318
}
320
}
319
321
322
#define PROPOSAL_MATCH(x, y) \
323
	do { \
324
		char *p, *myp, *peerp; \
325
		myp = my[PROPOSAL_ ## x]; \
326
		peerp = peer[PROPOSAL_ ## y]; \
327
		if ((p = strchr(myp, ',')) != NULL) \
328
			*p = '\0'; \
329
		if ((p = strchr(peerp, ',')) != NULL) \
330
			*p = '\0'; \
331
		if (strcmp(myp, peerp) != 0) { \
332
			debug2("proposal mismatch: %s %s", myp, peerp); \
333
			return (0); \
334
		} \
335
	} while (0)
336
337
static int 
338
proposals_match(char *my[PROPOSAL_MAX],char *peer[PROPOSAL_MAX])
339
{
340
	PROPOSAL_MATCH(KEX_ALGS, KEX_ALGS);
341
	PROPOSAL_MATCH(SERVER_HOST_KEY_ALGS, SERVER_HOST_KEY_ALGS);
342
	PROPOSAL_MATCH(ENC_ALGS_CTOS, ENC_ALGS_STOC);
343
	PROPOSAL_MATCH(ENC_ALGS_STOC, ENC_ALGS_CTOS);
344
	PROPOSAL_MATCH(MAC_ALGS_CTOS, MAC_ALGS_STOC);
345
	PROPOSAL_MATCH(MAC_ALGS_STOC, MAC_ALGS_CTOS);
346
	PROPOSAL_MATCH(COMP_ALGS_CTOS, COMP_ALGS_STOC);
347
	PROPOSAL_MATCH(COMP_ALGS_STOC, COMP_ALGS_CTOS);
348
	PROPOSAL_MATCH(LANG_CTOS, LANG_STOC);
349
	PROPOSAL_MATCH(LANG_STOC, LANG_CTOS);
350
	debug2("proposals match");
351
	return (1);
352
}
353
320
static void
354
static void
321
kex_choose_conf(Kex *kex)
355
kex_choose_conf(Kex *kex)
322
{
356
{
Lines 327-335 Link Here
327
	int mode;
361
	int mode;
328
	int ctos;				/* direction: if true client-to-server */
362
	int ctos;				/* direction: if true client-to-server */
329
	int need;
363
	int need;
364
	int first_kex_follows, type;
330
365
331
	my   = kex_buf2prop(&kex->my);
366
	my   = kex_buf2prop(&kex->my, NULL);
332
	peer = kex_buf2prop(&kex->peer);
367
	peer = kex_buf2prop(&kex->peer, &first_kex_follows);
333
368
334
	if (kex->server) {
369
	if (kex->server) {
335
		cprop=peer;
370
		cprop=peer;
Lines 372-377 Link Here
372
	}
407
	}
373
	/* XXX need runden? */
408
	/* XXX need runden? */
374
	kex->we_need = need;
409
	kex->we_need = need;
410
411
	/* ignore the next message if the proposals do not match */
412
	if (first_kex_follows && !proposals_match(my, peer)) {
413
		type = packet_read();
414
		debug2("skipping next packet (type %u)", type);
415
	}
375
416
376
	kex_prop_free(my);
417
	kex_prop_free(my);
377
	kex_prop_free(peer);
418
	kex_prop_free(peer);

Return to bug 148