Skip to content

Commit db72a3b

Browse files
author
shadowy-pycoder
committed
Added basic tests for ssh parser
1 parent dc6117b commit db72a3b

File tree

7 files changed

+151
-0
lines changed

7 files changed

+151
-0
lines changed

layers/ssh_test.go

Lines changed: 150 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,150 @@
1+
package layers
2+
3+
import (
4+
"fmt"
5+
"io"
6+
"testing"
7+
8+
"github.com/stretchr/testify/require"
9+
)
10+
11+
func BenchmarkParseSSH(b *testing.B) {
12+
packet, close := testPacketBench(b, "ssh")
13+
defer close()
14+
b.ResetTimer()
15+
ssh := &SSHMessage{}
16+
for i := 0; i < b.N; i++ {
17+
_ = ssh.Parse(packet)
18+
fmt.Fprint(io.Discard, ssh.String())
19+
}
20+
}
21+
22+
func TestParseSSHProtoEx(t *testing.T) {
23+
expected := &SSHMessage{Protocol: "SSH-2.0-OpenSSH_8.9p1 Ubuntu-3ubuntu0.10"}
24+
ssh := &SSHMessage{}
25+
packet, close := testPacket(t, "ssh_proto_ex")
26+
defer close()
27+
if err := ssh.Parse(packet); err != nil {
28+
t.Fatal(err)
29+
}
30+
require.Equal(t, expected, ssh)
31+
}
32+
33+
func TestParseSSHKeyExInitClient(t *testing.T) {
34+
expected := &SSHMessage{Messages: []*Message{
35+
{
36+
PacketLength: 1532,
37+
PaddingLength: 7,
38+
MesssageType: 20,
39+
MesssageTypeDesc: "Key Exchange Init",
40+
},
41+
}}
42+
ssh := &SSHMessage{}
43+
packet, close := testPacket(t, "ssh_client_kex_init")
44+
defer close()
45+
if err := ssh.Parse(packet); err != nil {
46+
t.Fatal(err)
47+
}
48+
require.Equal(t, len(expected.Messages), len(ssh.Messages))
49+
require.Equal(t, expected.Messages[0].PacketLength, ssh.Messages[0].PacketLength)
50+
require.Equal(t, expected.Messages[0].PaddingLength, ssh.Messages[0].PaddingLength)
51+
require.Equal(t, expected.Messages[0].MesssageType, ssh.Messages[0].MesssageType)
52+
require.Equal(t, expected.Messages[0].MesssageTypeDesc, ssh.Messages[0].MesssageTypeDesc)
53+
}
54+
55+
func TestParseSSHKeyExInitServer(t *testing.T) {
56+
expected := &SSHMessage{Messages: []*Message{
57+
{
58+
PacketLength: 1108,
59+
PaddingLength: 10,
60+
MesssageType: 20,
61+
MesssageTypeDesc: "Key Exchange Init",
62+
},
63+
}}
64+
ssh := &SSHMessage{}
65+
packet, close := testPacket(t, "ssh_server_kex_init")
66+
defer close()
67+
if err := ssh.Parse(packet); err != nil {
68+
t.Fatal(err)
69+
}
70+
require.Equal(t, len(expected.Messages), len(ssh.Messages))
71+
require.Equal(t, expected.Messages[0].PacketLength, ssh.Messages[0].PacketLength)
72+
require.Equal(t, expected.Messages[0].PaddingLength, ssh.Messages[0].PaddingLength)
73+
require.Equal(t, expected.Messages[0].MesssageType, ssh.Messages[0].MesssageType)
74+
require.Equal(t, expected.Messages[0].MesssageTypeDesc, ssh.Messages[0].MesssageTypeDesc)
75+
}
76+
77+
func TestParseSSHKeyExDHClient(t *testing.T) {
78+
expected := &SSHMessage{Messages: []*Message{
79+
{
80+
PacketLength: 44,
81+
PaddingLength: 6,
82+
MesssageType: 30,
83+
MesssageTypeDesc: "Elliptic Curve Diffie-Hellman Key Exchange Init",
84+
},
85+
}}
86+
ssh := &SSHMessage{}
87+
packet, close := testPacket(t, "ssh_client_dh_kex")
88+
defer close()
89+
if err := ssh.Parse(packet); err != nil {
90+
t.Fatal(err)
91+
}
92+
require.Equal(t, len(expected.Messages), len(ssh.Messages))
93+
require.Equal(t, expected.Messages[0].PacketLength, ssh.Messages[0].PacketLength)
94+
require.Equal(t, expected.Messages[0].PaddingLength, ssh.Messages[0].PaddingLength)
95+
require.Equal(t, expected.Messages[0].MesssageType, ssh.Messages[0].MesssageType)
96+
require.Equal(t, expected.Messages[0].MesssageTypeDesc, ssh.Messages[0].MesssageTypeDesc)
97+
}
98+
99+
func TestParseSSHKeyExDHServer(t *testing.T) {
100+
expected := &SSHMessage{Messages: []*Message{
101+
{
102+
PacketLength: 188,
103+
PaddingLength: 8,
104+
MesssageType: 31,
105+
MesssageTypeDesc: "Elliptic Curve Diffie-Hellman Key Exchange Reply",
106+
},
107+
{
108+
PacketLength: 12,
109+
PaddingLength: 10,
110+
MesssageType: 21,
111+
MesssageTypeDesc: "New Keys",
112+
},
113+
{},
114+
}}
115+
ssh := &SSHMessage{}
116+
packet, close := testPacket(t, "ssh_server_dh_kex")
117+
defer close()
118+
if err := ssh.Parse(packet); err != nil {
119+
t.Fatal(err)
120+
}
121+
require.Equal(t, len(expected.Messages), len(ssh.Messages))
122+
for i := range expected.Messages {
123+
require.Equal(t, expected.Messages[i].PacketLength, ssh.Messages[i].PacketLength)
124+
require.Equal(t, expected.Messages[i].PaddingLength, ssh.Messages[i].PaddingLength)
125+
require.Equal(t, expected.Messages[i].MesssageType, ssh.Messages[i].MesssageType)
126+
require.Equal(t, expected.Messages[i].MesssageTypeDesc, ssh.Messages[i].MesssageTypeDesc)
127+
}
128+
}
129+
130+
func TestParseSSHNewKeysClient(t *testing.T) {
131+
expected := &SSHMessage{Messages: []*Message{
132+
{
133+
PacketLength: 12,
134+
PaddingLength: 10,
135+
MesssageType: 21,
136+
MesssageTypeDesc: "New Keys",
137+
},
138+
}}
139+
ssh := &SSHMessage{}
140+
packet, close := testPacket(t, "ssh_client_new_keys")
141+
defer close()
142+
if err := ssh.Parse(packet); err != nil {
143+
t.Fatal(err)
144+
}
145+
require.Equal(t, len(expected.Messages), len(ssh.Messages))
146+
require.Equal(t, expected.Messages[0].PacketLength, ssh.Messages[0].PacketLength)
147+
require.Equal(t, expected.Messages[0].PaddingLength, ssh.Messages[0].PaddingLength)
148+
require.Equal(t, expected.Messages[0].MesssageType, ssh.Messages[0].MesssageType)
149+
require.Equal(t, expected.Messages[0].MesssageTypeDesc, ssh.Messages[0].MesssageTypeDesc)
150+
}
48 Bytes
Binary file not shown.
1.37 KB
Binary file not shown.
16 Bytes
Binary file not shown.

layers/testdata/ssh_proto_ex.bin

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
SSH-2.0-OpenSSH_8.9p1 Ubuntu-3ubuntu0.10
524 Bytes
Binary file not shown.
1.09 KB
Binary file not shown.

0 commit comments

Comments
 (0)