|
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); |