From 6da9f87abc184542bbb66b874c8e96139921cb6f Mon Sep 17 00:00:00 2001 From: Markus Friedl Date: Thu, 19 Jan 2012 09:33:46 +0100 Subject: [PATCH] add new error messages for protocol version and hostkey loading --- ssh/err.c | 8 ++++++++ ssh/err.h | 4 ++++ ssh/kexdhs.c | 2 +- ssh/kexecdhs.c | 2 +- ssh/kexgexs.c | 2 +- ssh/packet.c | 4 ++-- 6 files changed, 17 insertions(+), 5 deletions(-) diff --git a/ssh/err.c b/ssh/err.c index d34d157..67988d8 100644 --- a/ssh/err.c +++ b/ssh/err.c @@ -93,6 +93,14 @@ ssh_err(int n) return "no matching key exchange method found"; case SSH_ERR_NO_HOSTKEY_ALG_MATCH: return "no matching host key type found"; + case SSH_ERR_PROTOCOL_MISMATCH: + return "protocol version mismatch"; + case SSH_ERR_NO_PROTOCOL_VERSION: + return "failed to not read protocol version"; + case SSH_ERR_NO_HOSTKEY_LOADED: + return "could not load host key"; + case SSH_ERR_NEED_REKEY: + return "rekeying not supported by peer"; default: return "unknown error"; } diff --git a/ssh/err.h b/ssh/err.h index 8468fad..9ea41b3 100644 --- a/ssh/err.h +++ b/ssh/err.h @@ -56,6 +56,10 @@ #define SSH_ERR_NO_COMPRESS_ALG_MATCH -32 #define SSH_ERR_NO_KEX_ALG_MATCH -33 #define SSH_ERR_NO_HOSTKEY_ALG_MATCH -34 +#define SSH_ERR_NO_HOSTKEY_LOADED -35 +#define SSH_ERR_PROTOCOL_MISMATCH -36 +#define SSH_ERR_NO_PROTOCOL_VERSION -37 +#define SSH_ERR_NEED_REKEY -38 /* Translate a numeric error code to a human-readable error string */ const char *ssh_err(int n); diff --git a/ssh/kexdhs.c b/ssh/kexdhs.c index b572be7..e3b074c 100644 --- a/ssh/kexdhs.c +++ b/ssh/kexdhs.c @@ -101,7 +101,7 @@ input_kex_dh_init(int type, u_int32_t seq, struct ssh *ssh) ssh)) == NULL || (server_host_private = kex->load_host_private_key(kex->hostkey_type, ssh)) == NULL) { - r = SSH_ERR_KEY_TYPE_MISMATCH; /* XXX */ + r = SSH_ERR_NO_HOSTKEY_LOADED; goto out; } diff --git a/ssh/kexecdhs.c b/ssh/kexecdhs.c index 3dc24fb..822aa2b 100644 --- a/ssh/kexecdhs.c +++ b/ssh/kexecdhs.c @@ -101,7 +101,7 @@ input_kex_ecdh_init(int type, u_int32_t seq, struct ssh *ssh) ssh)) == NULL || (server_host_private = kex->load_host_private_key(kex->hostkey_type, ssh)) == NULL) { - r = SSH_ERR_KEY_TYPE_MISMATCH; /* XXX */ + r = SSH_ERR_NO_HOSTKEY_LOADED; goto out; } if ((client_public = EC_POINT_new(group)) == NULL) { diff --git a/ssh/kexgexs.c b/ssh/kexgexs.c index f378179..6b4c35f 100644 --- a/ssh/kexgexs.c +++ b/ssh/kexgexs.c @@ -154,7 +154,7 @@ input_kex_dh_gex_init(int type, u_int32_t seq, struct ssh *ssh) ssh)) == NULL || (server_host_private = kex->load_host_private_key(kex->hostkey_type, ssh)) == NULL) { - r = SSH_ERR_KEY_TYPE_MISMATCH; /* XXX */ + r = SSH_ERR_NO_HOSTKEY_LOADED; goto out; } diff --git a/ssh/packet.c b/ssh/packet.c index 85ea61c..ff67502 100644 --- a/ssh/packet.c +++ b/ssh/packet.c @@ -1323,7 +1323,7 @@ ssh_packet_send2_wrapped(struct ssh *ssh) logit("outgoing seqnr wraps around"); if (++state->p_send.packets == 0) if (!(ssh->datafellows & SSH_BUG_NOREKEY)) - return SSH_ERR_INTERNAL_ERROR; /* XXX */ + return SSH_ERR_NEED_REKEY; state->p_send.blocks += (packet_length + 4) / block_size; state->p_send.bytes += packet_length + 4; sshbuf_reset(state->outgoing_packet); @@ -1759,7 +1759,7 @@ ssh_packet_read_poll2(struct ssh *ssh, u_char *typep, u_int32_t *seqnr_p) logit("incoming seqnr wraps around"); if (++state->p_read.packets == 0) if (!(ssh->datafellows & SSH_BUG_NOREKEY)) - return SSH_ERR_INTERNAL_ERROR; /* XXX */ + return SSH_ERR_NEED_REKEY; state->p_read.blocks += (state->packlen + 4) / block_size; state->p_read.bytes += state->packlen + 4;