1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
|
/*
* 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 "netdissect-ctype.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;
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) {
u_char c;
c = GET_U_1(pptr + idx);
if (c == '\n') {
/*
* LF without CR; end of line.
* Skip the LF and print the line, with the
* exception of the LF.
*/
goto print;
} else if (c == '\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 (!ND_ASCII_ISPRINT(c) ) {
/*
* 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(": ");
nd_print_protocol_caps(ndo);
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);
}
|