version 1.4, 2019/01/21 10:29:56 |
version 1.5, 2019/01/21 10:35:09 |
|
|
struct kex *kex = ssh->kex; |
struct kex *kex = ssh->kex; |
struct sshkey *server_host_key = NULL; |
struct sshkey *server_host_key = NULL; |
struct sshbuf *shared_secret = NULL; |
struct sshbuf *shared_secret = NULL; |
u_char *server_pubkey = NULL; |
struct sshbuf *server_blob = NULL; |
u_char *server_host_key_blob = NULL, *signature = NULL; |
u_char *server_host_key_blob = NULL, *signature = NULL; |
u_char hash[SSH_DIGEST_MAX_LENGTH]; |
u_char hash[SSH_DIGEST_MAX_LENGTH]; |
size_t slen, pklen, sbloblen, hashlen; |
size_t slen, sbloblen, hashlen; |
int r; |
int r; |
|
|
/* hostkey */ |
/* hostkey */ |
|
|
|
|
/* Q_S, server public key */ |
/* Q_S, server public key */ |
/* signed H */ |
/* signed H */ |
if ((r = sshpkt_get_string(ssh, &server_pubkey, &pklen)) != 0 || |
if ((r = sshpkt_getb_froms(ssh, &server_blob)) != 0 || |
(r = sshpkt_get_string(ssh, &signature, &slen)) != 0 || |
(r = sshpkt_get_string(ssh, &signature, &slen)) != 0 || |
(r = sshpkt_get_end(ssh)) != 0) |
(r = sshpkt_get_end(ssh)) != 0) |
goto out; |
goto out; |
|
|
case KEX_DH_GRP14_SHA256: |
case KEX_DH_GRP14_SHA256: |
case KEX_DH_GRP16_SHA512: |
case KEX_DH_GRP16_SHA512: |
case KEX_DH_GRP18_SHA512: |
case KEX_DH_GRP18_SHA512: |
r = kex_dh_dec(kex, server_pubkey, pklen, &shared_secret); |
r = kex_dh_dec(kex, server_blob, &shared_secret); |
break; |
break; |
case KEX_ECDH_SHA2: |
case KEX_ECDH_SHA2: |
r = kex_ecdh_dec(kex, server_pubkey, pklen, &shared_secret); |
r = kex_ecdh_dec(kex, server_blob, &shared_secret); |
break; |
break; |
case KEX_C25519_SHA256: |
case KEX_C25519_SHA256: |
r = kex_c25519_dec(kex, server_pubkey, pklen, &shared_secret); |
r = kex_c25519_dec(kex, server_blob, &shared_secret); |
break; |
break; |
case KEX_KEM_SNTRUP4591761X25519_SHA512: |
case KEX_KEM_SNTRUP4591761X25519_SHA512: |
r = kex_kem_sntrup4591761x25519_dec(kex, server_pubkey, pklen, |
r = kex_kem_sntrup4591761x25519_dec(kex, server_blob, |
&shared_secret); |
&shared_secret); |
break; |
break; |
default: |
default: |
|
|
sshbuf_ptr(kex->my), sshbuf_len(kex->my), |
sshbuf_ptr(kex->my), sshbuf_len(kex->my), |
sshbuf_ptr(kex->peer), sshbuf_len(kex->peer), |
sshbuf_ptr(kex->peer), sshbuf_len(kex->peer), |
server_host_key_blob, sbloblen, |
server_host_key_blob, sbloblen, |
sshbuf_ptr(kex->kem_client_pub), sshbuf_len(kex->kem_client_pub), |
kex->kem_client_pub, |
server_pubkey, pklen, |
server_blob, |
sshbuf_ptr(shared_secret), sshbuf_len(shared_secret), |
shared_secret, |
hash, &hashlen)) != 0) |
hash, &hashlen)) != 0) |
goto out; |
goto out; |
|
|
|
|
explicit_bzero(kex->sntrup4591761_client_key, |
explicit_bzero(kex->sntrup4591761_client_key, |
sizeof(kex->sntrup4591761_client_key)); |
sizeof(kex->sntrup4591761_client_key)); |
free(server_host_key_blob); |
free(server_host_key_blob); |
free(server_pubkey); |
|
free(signature); |
free(signature); |
sshkey_free(server_host_key); |
sshkey_free(server_host_key); |
|
sshbuf_free(server_blob); |
sshbuf_free(shared_secret); |
sshbuf_free(shared_secret); |
sshbuf_free(kex->kem_client_pub); |
sshbuf_free(kex->kem_client_pub); |
kex->kem_client_pub = NULL; |
kex->kem_client_pub = NULL; |