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