version 1.52, 2002/11/21 22:45:31 |
version 1.53, 2003/02/02 10:56:08 |
|
|
|
|
/* parse buffer and return algorithm proposal */ |
/* parse buffer and return algorithm proposal */ |
static char ** |
static char ** |
kex_buf2prop(Buffer *raw) |
kex_buf2prop(Buffer *raw, int *first_kex_follows) |
{ |
{ |
Buffer b; |
Buffer b; |
int i; |
int i; |
|
|
} |
} |
/* first kex follows / reserved */ |
/* first kex follows / reserved */ |
i = buffer_get_char(&b); |
i = buffer_get_char(&b); |
|
if (first_kex_follows != NULL) |
|
*first_kex_follows = i; |
debug2("kex_parse_kexinit: first_kex_follows %d ", i); |
debug2("kex_parse_kexinit: first_kex_follows %d ", i); |
i = buffer_get_int(&b); |
i = buffer_get_int(&b); |
debug2("kex_parse_kexinit: reserved %d ", i); |
debug2("kex_parse_kexinit: reserved %d ", i); |
|
|
xfree(hostkeyalg); |
xfree(hostkeyalg); |
} |
} |
|
|
|
static int |
|
proposals_match(char *my[PROPOSAL_MAX], char *peer[PROPOSAL_MAX]) |
|
{ |
|
static int check[] = { |
|
PROPOSAL_KEX_ALGS, PROPOSAL_SERVER_HOST_KEY_ALGS, -1 |
|
}; |
|
int *idx; |
|
char *p; |
|
|
|
for (idx = &check[0]; *idx != -1; idx++) { |
|
if ((p = strchr(my[*idx], ',')) != NULL) |
|
*p = '\0'; |
|
if ((p = strchr(peer[*idx], ',')) != NULL) |
|
*p = '\0'; |
|
if (strcmp(my[*idx], peer[*idx]) != 0) { |
|
debug2("proposal mismatch: my %s peer %s", |
|
my[*idx], peer[*idx]); |
|
return (0); |
|
} |
|
} |
|
debug2("proposals match"); |
|
return (1); |
|
} |
|
|
static void |
static void |
kex_choose_conf(Kex *kex) |
kex_choose_conf(Kex *kex) |
{ |
{ |
|
|
int mode; |
int mode; |
int ctos; /* direction: if true client-to-server */ |
int ctos; /* direction: if true client-to-server */ |
int need; |
int need; |
|
int first_kex_follows, type; |
|
|
my = kex_buf2prop(&kex->my); |
my = kex_buf2prop(&kex->my, NULL); |
peer = kex_buf2prop(&kex->peer); |
peer = kex_buf2prop(&kex->peer, &first_kex_follows); |
|
|
if (kex->server) { |
if (kex->server) { |
cprop=peer; |
cprop=peer; |
|
|
} |
} |
/* XXX need runden? */ |
/* XXX need runden? */ |
kex->we_need = need; |
kex->we_need = need; |
|
|
|
/* ignore the next message if the proposals do not match */ |
|
if (first_kex_follows && !proposals_match(my, peer)) { |
|
type = packet_read(); |
|
debug2("skipping next packet (type %u)", type); |
|
} |
|
|
kex_prop_free(my); |
kex_prop_free(my); |
kex_prop_free(peer); |
kex_prop_free(peer); |