version 1.24, 2015/01/26 06:10:03 |
version 1.25, 2015/04/13 02:04:08 |
|
|
int |
int |
kexgex_server(struct ssh *ssh) |
kexgex_server(struct ssh *ssh) |
{ |
{ |
ssh_dispatch_set(ssh, SSH2_MSG_KEX_DH_GEX_REQUEST_OLD, |
|
&input_kex_dh_gex_request); |
|
ssh_dispatch_set(ssh, SSH2_MSG_KEX_DH_GEX_REQUEST, |
ssh_dispatch_set(ssh, SSH2_MSG_KEX_DH_GEX_REQUEST, |
&input_kex_dh_gex_request); |
&input_kex_dh_gex_request); |
debug("expecting SSH2_MSG_KEX_DH_GEX_REQUEST"); |
debug("expecting SSH2_MSG_KEX_DH_GEX_REQUEST"); |
|
|
int r; |
int r; |
u_int min = 0, max = 0, nbits = 0; |
u_int min = 0, max = 0, nbits = 0; |
|
|
switch (type) { |
debug("SSH2_MSG_KEX_DH_GEX_REQUEST received"); |
case SSH2_MSG_KEX_DH_GEX_REQUEST: |
if ((r = sshpkt_get_u32(ssh, &min)) != 0 || |
debug("SSH2_MSG_KEX_DH_GEX_REQUEST received"); |
(r = sshpkt_get_u32(ssh, &nbits)) != 0 || |
if ((r = sshpkt_get_u32(ssh, &min)) != 0 || |
(r = sshpkt_get_u32(ssh, &max)) != 0 || |
(r = sshpkt_get_u32(ssh, &nbits)) != 0 || |
(r = sshpkt_get_end(ssh)) != 0) |
(r = sshpkt_get_u32(ssh, &max)) != 0 || |
|
(r = sshpkt_get_end(ssh)) != 0) |
|
goto out; |
|
kex->nbits = nbits; |
|
kex->min = min; |
|
kex->max = max; |
|
min = MAX(DH_GRP_MIN, min); |
|
max = MIN(DH_GRP_MAX, max); |
|
nbits = MAX(DH_GRP_MIN, nbits); |
|
nbits = MIN(DH_GRP_MAX, nbits); |
|
break; |
|
case SSH2_MSG_KEX_DH_GEX_REQUEST_OLD: |
|
debug("SSH2_MSG_KEX_DH_GEX_REQUEST_OLD received"); |
|
if ((r = sshpkt_get_u32(ssh, &nbits)) != 0 || |
|
(r = sshpkt_get_end(ssh)) != 0) |
|
goto out; |
|
kex->nbits = nbits; |
|
/* unused for old GEX */ |
|
kex->min = min = DH_GRP_MIN; |
|
kex->max = max = DH_GRP_MAX; |
|
break; |
|
default: |
|
r = SSH_ERR_INVALID_ARGUMENT; |
|
goto out; |
goto out; |
} |
kex->nbits = nbits; |
|
kex->min = min; |
|
kex->max = max; |
|
min = MAX(DH_GRP_MIN, min); |
|
max = MIN(DH_GRP_MAX, max); |
|
nbits = MAX(DH_GRP_MIN, nbits); |
|
nbits = MIN(DH_GRP_MAX, nbits); |
|
|
if (kex->max < kex->min || kex->nbits < kex->min || |
if (kex->max < kex->min || kex->nbits < kex->min || |
kex->max < kex->nbits) { |
kex->max < kex->nbits) { |
|
|
/* Compute our exchange value in parallel with the client */ |
/* Compute our exchange value in parallel with the client */ |
if ((r = dh_gen_key(kex->dh, kex->we_need * 8)) != 0) |
if ((r = dh_gen_key(kex->dh, kex->we_need * 8)) != 0) |
goto out; |
goto out; |
|
|
/* old KEX does not use min/max in kexgex_hash() */ |
|
if (type == SSH2_MSG_KEX_DH_GEX_REQUEST_OLD) |
|
kex->min = kex->max = -1; |
|
|
|
debug("expecting SSH2_MSG_KEX_DH_GEX_INIT"); |
debug("expecting SSH2_MSG_KEX_DH_GEX_INIT"); |
ssh_dispatch_set(ssh, SSH2_MSG_KEX_DH_GEX_INIT, &input_kex_dh_gex_init); |
ssh_dispatch_set(ssh, SSH2_MSG_KEX_DH_GEX_INIT, &input_kex_dh_gex_init); |