diff --git a/kexecdhs.c b/kexecdhs.c
index 6bfad04..6b8d95d 100644
--- a/kexecdhs.c
+++ b/kexecdhs.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: kexecdhs.c,v 1.11 2015/01/19 19:52:16 markus Exp $ */
+/* $OpenBSD: kexecdhs.c,v 1.12 2015/01/19 20:16:15 markus Exp $ */
 /*
  * Copyright (c) 2001 Markus Friedl.  All rights reserved.
  * Copyright (c) 2010 Damien Miller.  All rights reserved.
@@ -32,124 +32,176 @@
 #include <string.h>
 #include <signal.h>
 
-#include "xmalloc.h"
-#include "buffer.h"
-#include "key.h"
+#include <openssl/ecdh.h>
+
+#include "sshkey.h"
 #include "cipher.h"
+#include "digest.h"
 #include "kex.h"
 #include "log.h"
 #include "packet.h"
 #include "ssh2.h"
 
-#include <openssl/ecdh.h>
+#include "dispatch.h"
+#include "compat.h"
+#include "ssherr.h"
+#include "sshbuf.h"
 
-void
-kexecdh_server(Kex *kex)
+static int input_kex_ecdh_init(int, u_int32_t, void *);
+
+int
+kexecdh_server(struct ssh *ssh)
 {
-	EC_POINT *client_public;
-	EC_KEY *server_key;
-	const EC_GROUP *group;
-	BIGNUM *shared_secret;
-	Key *server_host_private, *server_host_public;
-	u_char *server_host_key_blob = NULL, *signature = NULL;
-	u_char *kbuf, *hash;
-	u_int klen, slen, sbloblen, hashlen;
+	debug("expecting SSH2_MSG_KEX_ECDH_INIT");
+	ssh_dispatch_set(ssh, SSH2_MSG_KEX_ECDH_INIT, &input_kex_ecdh_init);
+	return 0;
+}
 
-	if ((server_key = EC_KEY_new_by_curve_name(kex->ec_nid)) == NULL)
-		fatal("%s: EC_KEY_new_by_curve_name failed", __func__);
-	if (EC_KEY_generate_key(server_key) != 1)
-		fatal("%s: EC_KEY_generate_key failed", __func__);
+static int
+input_kex_ecdh_init(int type, u_int32_t seq, void *ctxt)
+{
+	struct ssh *ssh = ctxt;
+	struct kex *kex = ssh->kex;
+	EC_POINT *client_public;
+	EC_KEY *server_key = NULL;
+	const EC_GROUP *group;
+	const EC_POINT *public_key;
+	BIGNUM *shared_secret = NULL;
+	struct sshkey *server_host_private, *server_host_public;
+	u_char *server_host_key_blob = NULL, *signature = NULL;
+	u_char *kbuf = NULL;
+	u_char hash[SSH_DIGEST_MAX_LENGTH];
+	size_t slen, sbloblen;
+	size_t klen = 0, hashlen;
+	int r;
+
+	if ((server_key = EC_KEY_new_by_curve_name(kex->ec_nid)) == NULL) {
+		r = SSH_ERR_ALLOC_FAIL;
+		goto out;
+	}
+	if (EC_KEY_generate_key(server_key) != 1) {
+		r = SSH_ERR_LIBCRYPTO_ERROR;
+		goto out;
+	}
 	group = EC_KEY_get0_group(server_key);
 
 #ifdef DEBUG_KEXECDH
 	fputs("server private key:\n", stderr);
-	key_dump_ec_key(server_key);
+	sshkey_dump_ec_key(server_key);
 #endif
 
 	if (kex->load_host_public_key == NULL ||
-	    kex->load_host_private_key == NULL)
-		fatal("Cannot load hostkey");
-	server_host_public = kex->load_host_public_key(kex->hostkey_type);
-	if (server_host_public == NULL)
-		fatal("Unsupported hostkey type %d", kex->hostkey_type);
-	server_host_private = kex->load_host_private_key(kex->hostkey_type);
-
-	debug("expecting SSH2_MSG_KEX_ECDH_INIT");
-	packet_read_expect(SSH2_MSG_KEX_ECDH_INIT);
-	if ((client_public = EC_POINT_new(group)) == NULL)
-		fatal("%s: EC_POINT_new failed", __func__);
-	packet_get_ecpoint(group, client_public);
-	packet_check_eom();
-
-	if (key_ec_validate_public(group, client_public) != 0)
-		fatal("%s: invalid client public key", __func__);
+	    kex->load_host_private_key == NULL) {
+		r = SSH_ERR_INVALID_ARGUMENT;
+		goto out;
+	}
+	if ((server_host_public = kex->load_host_public_key(kex->hostkey_type,
+	    ssh)) == NULL ||
+	    (server_host_private = kex->load_host_private_key(kex->hostkey_type,
+	    ssh)) == NULL) {
+		r = SSH_ERR_NO_HOSTKEY_LOADED;
+		goto out;
+	}
+	if ((client_public = EC_POINT_new(group)) == NULL) {
+		r = SSH_ERR_ALLOC_FAIL;
+		goto out;
+	}
+	if ((r = sshpkt_get_ec(ssh, client_public, group)) != 0 ||
+	    (r = sshpkt_get_end(ssh)) != 0)
+		goto out;
 
 #ifdef DEBUG_KEXECDH
 	fputs("client public key:\n", stderr);
-	key_dump_ec_point(group, client_public);
+	sshkey_dump_ec_point(group, client_public);
 #endif
+	if (sshkey_ec_validate_public(group, client_public) != 0) {
+		sshpkt_disconnect(ssh, "invalid client public key");
+		r = SSH_ERR_MESSAGE_INCOMPLETE;
+		goto out;
+	}
 
 	/* Calculate shared_secret */
 	klen = (EC_GROUP_get_degree(group) + 7) / 8;
-	kbuf = xmalloc(klen);
+	if ((kbuf = malloc(klen)) == NULL ||
+	    (shared_secret = BN_new()) == NULL) {
+		r = SSH_ERR_ALLOC_FAIL;
+		goto out;
+	}
 	if (ECDH_compute_key(kbuf, klen, client_public,
-	    server_key, NULL) != (int)klen)
-		fatal("%s: ECDH_compute_key failed", __func__);
+	    server_key, NULL) != (int)klen ||
+	    BN_bin2bn(kbuf, klen, shared_secret) == NULL) {
+		r = SSH_ERR_LIBCRYPTO_ERROR;
+		goto out;
+	}
 
-#ifdef DEBUG_KEXDH
+#ifdef DEBUG_KEXECDH
 	dump_digest("shared secret", kbuf, klen);
 #endif
-	if ((shared_secret = BN_new()) == NULL)
-		fatal("%s: BN_new failed", __func__);
-	if (BN_bin2bn(kbuf, klen, shared_secret) == NULL)
-		fatal("%s: BN_bin2bn failed", __func__);
-	explicit_bzero(kbuf, klen);
-	free(kbuf);
-
 	/* calc H */
-	key_to_blob(server_host_public, &server_host_key_blob, &sbloblen);
-	kex_ecdh_hash(
+	if ((r = sshkey_to_blob(server_host_public, &server_host_key_blob,
+	    &sbloblen)) != 0)
+		goto out;
+	hashlen = sizeof(hash);
+	if ((r = kex_ecdh_hash(
 	    kex->hash_alg,
 	    group,
 	    kex->client_version_string,
 	    kex->server_version_string,
-	    buffer_ptr(kex->peer), buffer_len(kex->peer),
-	    buffer_ptr(kex->my), buffer_len(kex->my),
+	    sshbuf_ptr(kex->peer), sshbuf_len(kex->peer),
+	    sshbuf_ptr(kex->my), sshbuf_len(kex->my),
 	    server_host_key_blob, sbloblen,
 	    client_public,
 	    EC_KEY_get0_public_key(server_key),
 	    shared_secret,
-	    &hash, &hashlen
-	);
-	EC_POINT_clear_free(client_public);
+	    hash, &hashlen)) != 0)
+		goto out;
 
 	/* save session id := H */
 	if (kex->session_id == NULL) {
 		kex->session_id_len = hashlen;
-		kex->session_id = xmalloc(kex->session_id_len);
+		kex->session_id = malloc(kex->session_id_len);
+		if (kex->session_id == NULL) {
+			r = SSH_ERR_ALLOC_FAIL;
+			goto out;
+		}
 		memcpy(kex->session_id, hash, kex->session_id_len);
 	}
 
 	/* sign H */
-	kex->sign(server_host_private, server_host_public, &signature, &slen,
-	    hash, hashlen);
+	if ((r = kex->sign(server_host_private, server_host_public,
+	    &signature, &slen, hash, hashlen, ssh->compat)) < 0)
+		goto out;
 
 	/* destroy_sensitive_data(); */
 
+	public_key = EC_KEY_get0_public_key(server_key);
 	/* send server hostkey, ECDH pubkey 'Q_S' and signed H */
-	packet_start(SSH2_MSG_KEX_ECDH_REPLY);
-	packet_put_string(server_host_key_blob, sbloblen);
-	packet_put_ecpoint(group, EC_KEY_get0_public_key(server_key));
-	packet_put_string(signature, slen);
-	packet_send();
+	if ((r = sshpkt_start(ssh, SSH2_MSG_KEX_ECDH_REPLY)) != 0 ||
+	    (r = sshpkt_put_string(ssh, server_host_key_blob, sbloblen)) != 0 ||
+	    (r = sshpkt_put_ec(ssh, public_key, group)) != 0 ||
+	    (r = sshpkt_put_string(ssh, signature, slen)) != 0 ||
+	    (r = sshpkt_send(ssh)) != 0)
+		goto out;
 
-	free(signature);
+	if ((r = kex_derive_keys_bn(ssh, hash, hashlen, shared_secret)) == 0)
+		r = kex_send_newkeys(ssh);
+ out:
+	explicit_bzero(hash, sizeof(hash));
+	if (kex->ec_client_key) {
+		EC_KEY_free(kex->ec_client_key);
+		kex->ec_client_key = NULL;
+	}
+	if (server_key)
+		EC_KEY_free(server_key);
+	if (kbuf) {
+		explicit_bzero(kbuf, klen);
+		free(kbuf);
+	}
+	if (shared_secret)
+		BN_clear_free(shared_secret);
 	free(server_host_key_blob);
-	/* have keys, free server key */
-	EC_KEY_free(server_key);
-
-	kex_derive_keys_bn(kex, hash, hashlen, shared_secret);
-	BN_clear_free(shared_secret);
-	kex_finish(kex);
+	free(signature);
+	return r;
 }
 #endif /* defined(WITH_OPENSSL) && defined(OPENSSL_HAS_ECC) */
+
