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