summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--packet.c17
-rw-r--r--packet.h7
2 files changed, 22 insertions, 2 deletions
diff --git a/packet.c b/packet.c
index 783ae5bd4..ad1f6b497 100644
--- a/packet.c
+++ b/packet.c
@@ -1,4 +1,4 @@
1/* $OpenBSD: packet.c,v 1.242 2016/09/30 09:19:13 markus Exp $ */ 1/* $OpenBSD: packet.c,v 1.243 2016/10/11 21:47:45 djm Exp $ */
2/* 2/*
3 * Author: Tatu Ylonen <ylo@cs.hut.fi> 3 * Author: Tatu Ylonen <ylo@cs.hut.fi>
4 * Copyright (c) 1995 Tatu Ylonen <ylo@cs.hut.fi>, Espoo, Finland 4 * Copyright (c) 1995 Tatu Ylonen <ylo@cs.hut.fi>, Espoo, Finland
@@ -219,6 +219,10 @@ struct session_state {
219 /* SSH1 CRC compensation attack detector */ 219 /* SSH1 CRC compensation attack detector */
220 struct deattack_ctx deattack; 220 struct deattack_ctx deattack;
221 221
222 /* Hook for fuzzing inbound packets */
223 ssh_packet_hook_fn *hook_in;
224 void *hook_in_ctx;
225
222 TAILQ_HEAD(, packet) outgoing; 226 TAILQ_HEAD(, packet) outgoing;
223}; 227};
224 228
@@ -263,6 +267,13 @@ ssh_alloc_session_state(void)
263 return NULL; 267 return NULL;
264} 268}
265 269
270void
271ssh_packet_set_input_hook(struct ssh *ssh, ssh_packet_hook_fn *hook, void *ctx)
272{
273 ssh->state->hook_in = hook;
274 ssh->state->hook_in_ctx = ctx;
275}
276
266/* Returns nonzero if rekeying is in progress */ 277/* Returns nonzero if rekeying is in progress */
267int 278int
268ssh_packet_is_rekeying(struct ssh *ssh) 279ssh_packet_is_rekeying(struct ssh *ssh)
@@ -1884,6 +1895,10 @@ ssh_packet_read_poll2(struct ssh *ssh, u_char *typep, u_int32_t *seqnr_p)
1884 return r; 1895 return r;
1885 return SSH_ERR_PROTOCOL_ERROR; 1896 return SSH_ERR_PROTOCOL_ERROR;
1886 } 1897 }
1898 if (state->hook_in != NULL &&
1899 (r = state->hook_in(ssh, state->incoming_packet, typep,
1900 state->hook_in_ctx)) != 0)
1901 return r;
1887 if (*typep == SSH2_MSG_USERAUTH_SUCCESS && !state->server_side) 1902 if (*typep == SSH2_MSG_USERAUTH_SUCCESS && !state->server_side)
1888 r = ssh_packet_enable_delayed_compress(ssh); 1903 r = ssh_packet_enable_delayed_compress(ssh);
1889 else 1904 else
diff --git a/packet.h b/packet.h
index 0a64eb2a5..bfe7da615 100644
--- a/packet.h
+++ b/packet.h
@@ -1,4 +1,4 @@
1/* $OpenBSD: packet.h,v 1.73 2016/09/30 09:19:13 markus Exp $ */ 1/* $OpenBSD: packet.h,v 1.74 2016/10/11 21:47:45 djm Exp $ */
2 2
3/* 3/*
4 * Author: Tatu Ylonen <ylo@cs.hut.fi> 4 * Author: Tatu Ylonen <ylo@cs.hut.fi>
@@ -78,6 +78,9 @@ struct ssh {
78 void *app_data; 78 void *app_data;
79}; 79};
80 80
81typedef int (ssh_packet_hook_fn)(struct ssh *, struct sshbuf *,
82 u_char *, void *);
83
81struct ssh *ssh_alloc_session_state(void); 84struct ssh *ssh_alloc_session_state(void);
82struct ssh *ssh_packet_set_connection(struct ssh *, int, int); 85struct ssh *ssh_packet_set_connection(struct ssh *, int, int);
83void ssh_packet_set_timeout(struct ssh *, int, int); 86void ssh_packet_set_timeout(struct ssh *, int, int);
@@ -88,6 +91,8 @@ int ssh_packet_get_connection_in(struct ssh *);
88int ssh_packet_get_connection_out(struct ssh *); 91int ssh_packet_get_connection_out(struct ssh *);
89void ssh_packet_close(struct ssh *); 92void ssh_packet_close(struct ssh *);
90void ssh_packet_set_encryption_key(struct ssh *, const u_char *, u_int, int); 93void ssh_packet_set_encryption_key(struct ssh *, const u_char *, u_int, int);
94void ssh_packet_set_input_hook(struct ssh *, ssh_packet_hook_fn *, void *);
95
91int ssh_packet_is_rekeying(struct ssh *); 96int ssh_packet_is_rekeying(struct ssh *);
92void ssh_packet_set_protocol_flags(struct ssh *, u_int); 97void ssh_packet_set_protocol_flags(struct ssh *, u_int);
93u_int ssh_packet_get_protocol_flags(struct ssh *); 98u_int ssh_packet_get_protocol_flags(struct ssh *);