summaryrefslogtreecommitdiff
path: root/print-ssh.c
diff options
context:
space:
mode:
authorAndreas Jaggi <andreas.jaggi@waterwave.ch>2018-12-23 11:38:17 +0100
committerfxlb <devel.fx.lebail@orange.fr>2019-05-08 22:15:55 +0200
commit886fcf669f13779c8d25370c95b47993f5e3c7dd (patch)
tree8c468640f6d6e466bc6d3dafd0ead5b131308bf2 /print-ssh.c
parent2055e39f2af0aba1ab3945ea8f3e82c614a691a3 (diff)
downloadtcpdump-886fcf669f13779c8d25370c95b47993f5e3c7dd.tar.gz
Add dissector for SSH version exchange
Diffstat (limited to 'print-ssh.c')
-rw-r--r--print-ssh.c102
1 files changed, 102 insertions, 0 deletions
diff --git a/print-ssh.c b/print-ssh.c
new file mode 100644
index 00000000..0126bd0e
--- /dev/null
+++ b/print-ssh.c
@@ -0,0 +1,102 @@
+/*
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that: (1) source code
+ * distributions retain the above copyright notice and this paragraph
+ * in its entirety, and (2) distributions including binary code include
+ * the above copyright notice and this paragraph in its entirety in
+ * the documentation or other materials provided with the distribution.
+ * THIS SOFTWARE IS PROVIDED ``AS IS'' AND
+ * WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, WITHOUT
+ * LIMITATION, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ * FOR A PARTICULAR PURPOSE.
+ */
+
+/* \summary: Secure Shell (SSH) printer */
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include "netdissect-stdinc.h"
+
+#include <stdio.h>
+#include <stdlib.h>
+
+#include "netdissect.h"
+#include "extract.h"
+
+static int
+ssh_print_version(netdissect_options *ndo, const u_char *pptr, u_int len)
+{
+ u_int idx = 0;
+ const char *pnp;
+
+ if ( GET_U_1(pptr+idx) != 'S' )
+ return 0;
+ idx++;
+ if ( GET_U_1(pptr+idx) != 'S' )
+ return 0;
+ idx++;
+ if ( GET_U_1(pptr+idx) != 'H' )
+ return 0;
+ idx++;
+ if ( GET_U_1(pptr+idx) != '-' )
+ return 0;
+ idx++;
+
+ while (idx < len) {
+ if (GET_U_1(pptr + idx) == '\n') {
+ /*
+ * LF without CR; end of line.
+ * Skip the LF and print the line, with the
+ * exception of the LF.
+ */
+ goto print;
+ } else if (GET_U_1(pptr + idx) == '\r') {
+ /* CR - any LF? */
+ if ((idx+1) >= len) {
+ /* not in this packet */
+ goto trunc;
+ }
+ if (GET_U_1(pptr + idx + 1) == '\n') {
+ /*
+ * CR-LF; end of line.
+ * Skip the CR-LF and print the line, with
+ * the exception of the CR-LF.
+ */
+ goto print;
+ }
+
+ /*
+ * CR followed by something else; treat this as
+ * if it were binary data and don't print it.
+ */
+ goto trunc;
+ } else if (!isascii(GET_U_1(pptr + idx)) ||
+ !isprint(GET_U_1(pptr + idx)) ) {
+ /*
+ * Not a printable ASCII character; treat this
+ * as if it were binary data and don't print it.
+ */
+ goto trunc;
+ }
+ idx++;
+ }
+trunc:
+ return -1;
+print:
+ ND_PRINT(": ");
+ /* Capitalize the protocol name */
+ for (pnp = ndo->ndo_protocol; *pnp != '\0'; pnp++)
+ ND_PRINT("%c", ND_TOUPPER((u_char)*pnp));
+ ND_PRINT(": %.*s", (int)idx, pptr);
+ return idx;
+}
+
+void
+ssh_print(netdissect_options *ndo, const u_char *pptr, u_int len)
+{
+ ndo->ndo_protocol = "ssh";
+
+ ssh_print_version(ndo, pptr, len);
+}