aboutsummaryrefslogtreecommitdiff
path: root/src/ecdh_gcrypt.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/ecdh_gcrypt.c')
-rw-r--r--src/ecdh_gcrypt.c14
1 files changed, 11 insertions, 3 deletions
diff --git a/src/ecdh_gcrypt.c b/src/ecdh_gcrypt.c
index 96dbd1a0..913855c0 100644
--- a/src/ecdh_gcrypt.c
+++ b/src/ecdh_gcrypt.c
@@ -259,10 +259,11 @@ int ecdh_build_k(ssh_session session)
#ifdef WITH_SERVER
-/** @brief Parse a SSH_MSG_KEXDH_INIT packet (server) and send a
+
+/** @brief Handle a SSH_MSG_KEXDH_INIT packet (server) and send a
* SSH_MSG_KEXDH_REPLY
*/
-int ssh_server_ecdh_init(ssh_session session, ssh_buffer packet) {
+SSH_PACKET_CALLBACK(ssh_packet_server_ecdh_init){
gpg_error_t err;
/* ECDH keys */
ssh_string q_c_string;
@@ -275,7 +276,10 @@ int ssh_server_ecdh_init(ssh_session session, ssh_buffer packet) {
ssh_string pubkey_blob = NULL;
int rc = SSH_ERROR;
const char *curve = NULL;
+ (void)type;
+ (void)user;
+ ssh_packet_remove_callbacks(session, &ssh_ecdh_server_callbacks);
curve = ecdh_kex_type_to_curve(session->next_crypto->kex_type);
if (curve == NULL) {
goto out;
@@ -380,7 +384,11 @@ int ssh_server_ecdh_init(ssh_session session, ssh_buffer packet) {
out:
gcry_sexp_release(param);
gcry_sexp_release(key);
- return rc;
+ if (rc == SSH_ERROR) {
+ ssh_buffer_reinit(session->out_buffer);
+ session->session_state = SSH_SESSION_STATE_ERROR;
+ }
+ return SSH_PACKET_USED;
}
#endif /* WITH_SERVER */