1 /*
2 * Redistribution and use in source and binary forms, with or without
3 * modification, are permitted provided that: (1) source code
4 * distributions retain the above copyright notice and this paragraph
5 * in its entirety, and (2) distributions including binary code include
6 * the above copyright notice and this paragraph in its entirety in
7 * the documentation or other materials provided with the distribution.
8 * THIS SOFTWARE IS PROVIDED ``AS IS'' AND
9 * WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, WITHOUT
10 * LIMITATION, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
11 * FOR A PARTICULAR PURPOSE.
12 */
13
14 /* \summary: Secure Shell (SSH) printer */
15
16 #include <config.h>
17
18 #include "netdissect-stdinc.h"
19 #include "netdissect-ctype.h"
20
21 #include "netdissect.h"
22 #include "extract.h"
23
24 static int
ssh_print_version(netdissect_options * ndo,const u_char * pptr,u_int len)25 ssh_print_version(netdissect_options *ndo, const u_char *pptr, u_int len)
26 {
27 u_int idx = 0;
28
29 if ( GET_U_1(pptr+idx) != 'S' )
30 return 0;
31 idx++;
32 if ( GET_U_1(pptr+idx) != 'S' )
33 return 0;
34 idx++;
35 if ( GET_U_1(pptr+idx) != 'H' )
36 return 0;
37 idx++;
38 if ( GET_U_1(pptr+idx) != '-' )
39 return 0;
40 idx++;
41
42 while (idx < len) {
43 u_char c;
44
45 c = GET_U_1(pptr + idx);
46 if (c == '\n') {
47 /*
48 * LF without CR; end of line.
49 * Skip the LF and print the line, with the
50 * exception of the LF.
51 */
52 goto print;
53 } else if (c == '\r') {
54 /* CR - any LF? */
55 if ((idx+1) >= len) {
56 /* not in this packet */
57 goto trunc;
58 }
59 if (GET_U_1(pptr + idx + 1) == '\n') {
60 /*
61 * CR-LF; end of line.
62 * Skip the CR-LF and print the line, with
63 * the exception of the CR-LF.
64 */
65 goto print;
66 }
67
68 /*
69 * CR followed by something else; treat this as
70 * if it were binary data and don't print it.
71 */
72 goto trunc;
73 } else if (!ND_ASCII_ISPRINT(c) ) {
74 /*
75 * Not a printable ASCII character; treat this
76 * as if it were binary data and don't print it.
77 */
78 goto trunc;
79 }
80 idx++;
81 }
82 trunc:
83 return -1;
84 print:
85 ND_PRINT(": ");
86 nd_print_protocol_caps(ndo);
87 ND_PRINT(": %.*s", (int)idx, pptr);
88 return idx;
89 }
90
91 void
ssh_print(netdissect_options * ndo,const u_char * pptr,u_int len)92 ssh_print(netdissect_options *ndo, const u_char *pptr, u_int len)
93 {
94 ndo->ndo_protocol = "ssh";
95
96 ssh_print_version(ndo, pptr, len);
97 }
98