version 1.164, 2021/01/27 09:26:54 |
version 1.165, 2021/01/27 10:05:28 |
|
|
(kex->peer = sshbuf_new()) == NULL || |
(kex->peer = sshbuf_new()) == NULL || |
(kex->my = sshbuf_new()) == NULL || |
(kex->my = sshbuf_new()) == NULL || |
(kex->client_version = sshbuf_new()) == NULL || |
(kex->client_version = sshbuf_new()) == NULL || |
(kex->server_version = sshbuf_new()) == NULL) { |
(kex->server_version = sshbuf_new()) == NULL || |
|
(kex->session_id = sshbuf_new()) == NULL) { |
kex_free(kex); |
kex_free(kex); |
return NULL; |
return NULL; |
} |
} |
|
|
sshbuf_free(kex->client_version); |
sshbuf_free(kex->client_version); |
sshbuf_free(kex->server_version); |
sshbuf_free(kex->server_version); |
sshbuf_free(kex->client_pub); |
sshbuf_free(kex->client_pub); |
free(kex->session_id); |
sshbuf_free(kex->session_id); |
free(kex->failed_choice); |
free(kex->failed_choice); |
free(kex->hostkey_alg); |
free(kex->hostkey_alg); |
free(kex->name); |
free(kex->name); |
|
|
ssh_digest_update_buffer(hashctx, shared_secret) != 0 || |
ssh_digest_update_buffer(hashctx, shared_secret) != 0 || |
ssh_digest_update(hashctx, hash, hashlen) != 0 || |
ssh_digest_update(hashctx, hash, hashlen) != 0 || |
ssh_digest_update(hashctx, &c, 1) != 0 || |
ssh_digest_update(hashctx, &c, 1) != 0 || |
ssh_digest_update(hashctx, kex->session_id, |
ssh_digest_update_buffer(hashctx, kex->session_id) != 0 || |
kex->session_id_len) != 0 || |
|
ssh_digest_final(hashctx, digest, mdsz) != 0) { |
ssh_digest_final(hashctx, digest, mdsz) != 0) { |
r = SSH_ERR_LIBCRYPTO_ERROR; |
r = SSH_ERR_LIBCRYPTO_ERROR; |
error_f("KEX hash failed"); |
error_f("KEX hash failed"); |
|
|
int r; |
int r; |
|
|
/* save initial hash as session id */ |
/* save initial hash as session id */ |
if (kex->session_id == NULL) { |
if ((kex->flags & KEX_INITIAL) != 0) { |
kex->session_id_len = hashlen; |
if ((kex->session_id = sshbuf_new()) == NULL) |
kex->session_id = malloc(kex->session_id_len); |
|
if (kex->session_id == NULL) |
|
return SSH_ERR_ALLOC_FAIL; |
return SSH_ERR_ALLOC_FAIL; |
memcpy(kex->session_id, hash, kex->session_id_len); |
if ((r = sshbuf_put(kex->session_id, hash, hashlen)) != 0) |
|
return r; |
|
} else if (sshbuf_len(kex->session_id) == 0) { |
|
error_f("no session ID in rekex"); |
|
return SSH_ERR_INTERNAL_ERROR; |
} |
} |
for (i = 0; i < NKEYS; i++) { |
for (i = 0; i < NKEYS; i++) { |
if ((r = derive_key(ssh, 'A'+i, kex->we_need, hash, hashlen, |
if ((r = derive_key(ssh, 'A'+i, kex->we_need, hash, hashlen, |