Просмотр исходного кода

Add tests for client hello

tags/v2.0.0-rc1
9seconds 5 лет назад
Родитель
Сommit
491b674e70

+ 159
- 0
mtglib/internal/faketls/client_hello_test.go Просмотреть файл

1
+package faketls_test
2
+
3
+import (
4
+	"encoding/base64"
5
+	"encoding/json"
6
+	"os"
7
+	"path/filepath"
8
+	"strings"
9
+	"testing"
10
+	"time"
11
+
12
+	"github.com/9seconds/mtg/v2/mtglib"
13
+	"github.com/9seconds/mtg/v2/mtglib/internal/faketls"
14
+	"github.com/stretchr/testify/assert"
15
+	"github.com/stretchr/testify/suite"
16
+)
17
+
18
+type ClientHelloSnapshot struct {
19
+	Time        int    `json:"time"`
20
+	Random      string `json:"random"`
21
+	SessionID   string `json:"session-id"`
22
+	Host        string `json:"host"`
23
+	CipherSuite int    `json:"cipher-suite"`
24
+	Full        string `json:"full"`
25
+}
26
+
27
+func (c ClientHelloSnapshot) GetTime() time.Time {
28
+	return time.Unix(int64(c.Time), 0)
29
+}
30
+
31
+func (c ClientHelloSnapshot) GetRandom() []byte {
32
+	data, _ := base64.StdEncoding.DecodeString(c.Random)
33
+
34
+	return data
35
+}
36
+
37
+func (c ClientHelloSnapshot) GetSessionID() []byte {
38
+	data, _ := base64.StdEncoding.DecodeString(c.SessionID)
39
+
40
+	return data
41
+}
42
+
43
+func (c ClientHelloSnapshot) GetHost() string {
44
+	return c.Host
45
+}
46
+
47
+func (c ClientHelloSnapshot) GetCipherSuite() uint16 {
48
+	return uint16(c.CipherSuite)
49
+}
50
+
51
+func (c ClientHelloSnapshot) GetFull() []byte {
52
+	data, _ := base64.StdEncoding.DecodeString(c.Full)
53
+
54
+	return data
55
+}
56
+
57
+type ClientHelloTestSuite struct {
58
+	suite.Suite
59
+
60
+	secret mtglib.Secret
61
+}
62
+
63
+func (suite *ClientHelloTestSuite) SetupSuite() {
64
+	parsed, err := mtglib.ParseSecret("ee367a189aee18fa31c190054efd4a8e9573746f726167652e676f6f676c65617069732e636f6d")
65
+	if err != nil {
66
+		panic(err)
67
+	}
68
+
69
+	suite.secret = parsed
70
+}
71
+
72
+func (suite *ClientHelloTestSuite) TestEmptyHandshake() {
73
+	_, err := faketls.ParseClientHello(suite.secret.Key[:], nil)
74
+	suite.Error(err)
75
+}
76
+
77
+func (suite *ClientHelloTestSuite) TestIncorrectHandshakeType() {
78
+	data := make([]byte, 1024)
79
+	data[0] = 0x02
80
+
81
+	_, err := faketls.ParseClientHello(suite.secret.Key[:], data)
82
+	suite.Error(err)
83
+}
84
+
85
+func (suite *ClientHelloTestSuite) TestIncorrectLength() {
86
+	data := make([]byte, 1024)
87
+	data[0] = 0x01
88
+	data[1] = 0xff
89
+	data[2] = 0xff
90
+
91
+	_, err := faketls.ParseClientHello(suite.secret.Key[:], data)
92
+	suite.Error(err)
93
+}
94
+
95
+func (suite *ClientHelloTestSuite) TestSnapshotOk() {
96
+	files, err := os.ReadDir("testdata")
97
+	suite.NoError(err)
98
+
99
+	testData := []string{}
100
+
101
+	for _, v := range files {
102
+		if strings.HasPrefix(v.Name(), "client-hello-ok") {
103
+			testData = append(testData, v.Name())
104
+		}
105
+	}
106
+
107
+	for _, name := range testData {
108
+		path := filepath.Join("testdata", name)
109
+
110
+		suite.T().Run(name, func(t *testing.T) {
111
+			fileData, err := os.ReadFile(path)
112
+			assert.NoError(t, err)
113
+
114
+			snapshot := &ClientHelloSnapshot{}
115
+			assert.NoError(t, json.Unmarshal(fileData, snapshot))
116
+
117
+			hello, err := faketls.ParseClientHello(suite.secret.Key[:], snapshot.GetFull())
118
+			assert.NoError(t, err)
119
+			assert.WithinDuration(t, snapshot.GetTime(), hello.Time, time.Second)
120
+			assert.Equal(t, snapshot.GetRandom(), hello.Random[:])
121
+			assert.Equal(t, snapshot.GetSessionID(), hello.SessionID)
122
+			assert.Equal(t, snapshot.GetHost(), hello.Host)
123
+			assert.Equal(t, snapshot.GetCipherSuite(), hello.CipherSuite)
124
+		})
125
+	}
126
+}
127
+
128
+func (suite *ClientHelloTestSuite) TestSnapshotBad() {
129
+	files, err := os.ReadDir("testdata")
130
+	suite.NoError(err)
131
+
132
+	testData := []string{}
133
+
134
+	for _, v := range files {
135
+		if strings.HasPrefix(v.Name(), "client-hello-bad") {
136
+			testData = append(testData, v.Name())
137
+		}
138
+	}
139
+
140
+	for _, name := range testData {
141
+		path := filepath.Join("testdata", name)
142
+
143
+		suite.T().Run(name, func(t *testing.T) {
144
+			fileData, err := os.ReadFile(path)
145
+			assert.NoError(t, err)
146
+
147
+			snapshot := &ClientHelloSnapshot{}
148
+			assert.NoError(t, json.Unmarshal(fileData, snapshot))
149
+
150
+			_, err = faketls.ParseClientHello(suite.secret.Key[:], snapshot.GetFull())
151
+			assert.Error(t, err)
152
+		})
153
+	}
154
+}
155
+
156
+func TestClientHello(t *testing.T) {
157
+	t.Parallel()
158
+	suite.Run(t, &ClientHelloTestSuite{})
159
+}

+ 8
- 0
mtglib/internal/faketls/testdata/client-hello-bad-fa2e46cdb33e2a1b.json Просмотреть файл

1
+{
2
+  "time": 1617181365,
3
+  "random": "XvCPc3aAbHbhRLv0kUmy6BfPZOGvsused5/HNsKXEPs=",
4
+  "session-id": "St2BZ2uHMFn3B2trD1jfdtpjoJOOg6JBeLhFcyCMCq4=",
5
+  "host": "storage.googleapis.com",
6
+  "cipher-suite": 4867,
7
+  "full": "AQAB/AMDXvCPc3aAbHbhRLv0kUmy6BfPZOGvsused5/HNsKXEPsgSt2BZ2uHMFn3B2trD1jfdtpjoJOOg6JBeLhFcyCACq4ANBMDEwETAsAswCvAJMAjwArACcypwDDAL8AowCfAFMATzKgAnQCcAD0APAA1AC/ACMASAAoBAAF//wEAAQAAAAAbABkAABZzdG9yYWdlLmdvb2dsZWFwaXMuY29tABcAAAANABgAFgQDCAQEAQUDAgMIBQgFBQEIBgYBAgEABQAFANAAAAAzdAAAABIAAAAQADAALgJoMgVoMi0xNgVoMi0xNQVoMi0xNAhzcGR5LzMuMQZzcGR5LzMIaHR0cC8xLjEACwACAQAAMwAmACQAHQAgB/7oLx9JElIALsLJS91H2QNyU1H0osKwIUelVndsLyIALQACAQEAKwAJCAMEAwMDAgMBAAoACgAIAB0AFwAYABkAFQChAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA="
8
+}

+ 8
- 0
mtglib/internal/faketls/testdata/client-hello-ok-19dfe38384b9884b.json Просмотреть файл

1
+{
2
+  "time": 1617181365,
3
+  "random": "XvCPc3aAbHbhRLv0kUmy6BfPZOGvsused5/HNsKXEPs=",
4
+  "session-id": "St2BZ2uHMFn3B2trD1jfdtpjoJOOg6JBeLhFcyCMCq4=",
5
+  "host": "storage.googleapis.com",
6
+  "cipher-suite": 4867,
7
+  "full": "AQAB/AMDXvCPc3aAbHbhRLv0kUmy6BfPZOGvsused5/HNsKXEPsgSt2BZ2uHMFn3B2trD1jfdtpjoJOOg6JBeLhFcyCMCq4ANBMDEwETAsAswCvAJMAjwArACcypwDDAL8AowCfAFMATzKgAnQCcAD0APAA1AC/ACMASAAoBAAF//wEAAQAAAAAbABkAABZzdG9yYWdlLmdvb2dsZWFwaXMuY29tABcAAAANABgAFgQDCAQEAQUDAgMIBQgFBQEIBgYBAgEABQAFAQAAAAAzdAAAABIAAAAQADAALgJoMgVoMi0xNgVoMi0xNQVoMi0xNAhzcGR5LzMuMQZzcGR5LzMIaHR0cC8xLjEACwACAQAAMwAmACQAHQAgB/7oLx9JElIALsLJS91H2QNyU1H0osKwIUelVndsLyIALQACAQEAKwAJCAMEAwMDAgMBAAoACgAIAB0AFwAYABkAFQChAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA="
8
+}

+ 8
- 0
mtglib/internal/faketls/testdata/client-hello-ok-48f8a72a56f3174a.json Просмотреть файл

1
+{
2
+  "time": 1617181352,
3
+  "random": "oYEu33jl+zQbUKMtQbV1OHB0gXIM2y2aq9iY0QX12os=",
4
+  "session-id": "FGqA3ZFYrSlj//xl7lammNn64K9/MK2mQ3HJUGvP+8g=",
5
+  "host": "storage.googleapis.com",
6
+  "cipher-suite": 4867,
7
+  "full": "AQAB/AMDoYEu33jl+zQbUKMtQbV1OHB0gXIM2y2aq9iY0QX12osgFGqA3ZFYrSlj//xl7lammNn64K9/MK2mQ3HJUGvP+8gANBMDEwETAsAswCvAJMAjwArACcypwDDAL8AowCfAFMATzKgAnQCcAD0APAA1AC/ACMASAAoBAAF//wEAAQAAAAAbABkAABZzdG9yYWdlLmdvb2dsZWFwaXMuY29tABcAAAANABgAFgQDCAQEAQUDAgMIBQgFBQEIBgYBAgEABQAFAQAAAAAzdAAAABIAAAAQADAALgJoMgVoMi0xNgVoMi0xNQVoMi0xNAhzcGR5LzMuMQZzcGR5LzMIaHR0cC8xLjEACwACAQAAMwAmACQAHQAga6CocpFP8Qd4YCFR9pkaCr97po2ALj0P5nI9Nnb3UWMALQACAQEAKwAJCAMEAwMDAgMBAAoACgAIAB0AFwAYABkAFQChAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA="
8
+}

+ 8
- 0
mtglib/internal/faketls/testdata/client-hello-ok-651054256093c6cd.json Просмотреть файл

1
+{
2
+  "time": 1617181352,
3
+  "random": "5V5sSprk/tFIgy+x1BeKNGhLlFkqfggLpgN7GYOA1ro=",
4
+  "session-id": "jxr4d6PXPDk+Lwx3WUp9wvj8TGlOxEdrRJ0ydyJ9+H8=",
5
+  "host": "storage.googleapis.com",
6
+  "cipher-suite": 4867,
7
+  "full": "AQAB/AMD5V5sSprk/tFIgy+x1BeKNGhLlFkqfggLpgN7GYOA1rogjxr4d6PXPDk+Lwx3WUp9wvj8TGlOxEdrRJ0ydyJ9+H8ANBMDEwETAsAswCvAJMAjwArACcypwDDAL8AowCfAFMATzKgAnQCcAD0APAA1AC/ACMASAAoBAAF//wEAAQAAAAAbABkAABZzdG9yYWdlLmdvb2dsZWFwaXMuY29tABcAAAANABgAFgQDCAQEAQUDAgMIBQgFBQEIBgYBAgEABQAFAQAAAAAzdAAAABIAAAAQADAALgJoMgVoMi0xNgVoMi0xNQVoMi0xNAhzcGR5LzMuMQZzcGR5LzMIaHR0cC8xLjEACwACAQAAMwAmACQAHQAgrulAaqUdKeVYM0F+pu6on/h6LBpOyzOKG4xFIKcoFk4ALQACAQEAKwAJCAMEAwMDAgMBAAoACgAIAB0AFwAYABkAFQChAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA="
8
+}

+ 8
- 0
mtglib/internal/faketls/testdata/client-hello-ok-79d01ef18a9d2621.json Просмотреть файл

1
+{
2
+  "time": 1617181365,
3
+  "random": "8xljlOhkDlkafEF5vu3e1r3fWvh8AX548wC3hLZ3szQ=",
4
+  "session-id": "00uvDYKnFyZFKyf3HlLwWGCOyeHsPFiU5UZ+Fs5pDAU=",
5
+  "host": "storage.googleapis.com",
6
+  "cipher-suite": 4867,
7
+  "full": "AQAB/AMD8xljlOhkDlkafEF5vu3e1r3fWvh8AX548wC3hLZ3szQg00uvDYKnFyZFKyf3HlLwWGCOyeHsPFiU5UZ+Fs5pDAUANBMDEwETAsAswCvAJMAjwArACcypwDDAL8AowCfAFMATzKgAnQCcAD0APAA1AC/ACMASAAoBAAF//wEAAQAAAAAbABkAABZzdG9yYWdlLmdvb2dsZWFwaXMuY29tABcAAAANABgAFgQDCAQEAQUDAgMIBQgFBQEIBgYBAgEABQAFAQAAAAAzdAAAABIAAAAQADAALgJoMgVoMi0xNgVoMi0xNQVoMi0xNAhzcGR5LzMuMQZzcGR5LzMIaHR0cC8xLjEACwACAQAAMwAmACQAHQAg/9P7140NtKzjyDwBf99mOy1+FjRPAPHTNQ9WxHOKpV4ALQACAQEAKwAJCAMEAwMDAgMBAAoACgAIAB0AFwAYABkAFQChAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA="
8
+}

+ 8
- 0
mtglib/internal/faketls/testdata/client-hello-ok-7a5569f05b118145.json Просмотреть файл

1
+{
2
+  "time": 1617181352,
3
+  "random": "zja3MLZ8WGSfsQRtPV75+tY6gbK3zKPi1Sy7SBBafg4=",
4
+  "session-id": "qPut2yMqXa9zGLII/872SQ3d4Tfqo0uoDb7tpkRfBnA=",
5
+  "host": "storage.googleapis.com",
6
+  "cipher-suite": 4867,
7
+  "full": "AQAB/AMDzja3MLZ8WGSfsQRtPV75+tY6gbK3zKPi1Sy7SBBafg4gqPut2yMqXa9zGLII/872SQ3d4Tfqo0uoDb7tpkRfBnAANBMDEwETAsAswCvAJMAjwArACcypwDDAL8AowCfAFMATzKgAnQCcAD0APAA1AC/ACMASAAoBAAF//wEAAQAAAAAbABkAABZzdG9yYWdlLmdvb2dsZWFwaXMuY29tABcAAAANABgAFgQDCAQEAQUDAgMIBQgFBQEIBgYBAgEABQAFAQAAAAAzdAAAABIAAAAQADAALgJoMgVoMi0xNgVoMi0xNQVoMi0xNAhzcGR5LzMuMQZzcGR5LzMIaHR0cC8xLjEACwACAQAAMwAmACQAHQAgXviLRAqAYJ8xOLdlcsUhldI4Xl0g/s9+y2Qrd8raPEgALQACAQEAKwAJCAMEAwMDAgMBAAoACgAIAB0AFwAYABkAFQChAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA="
8
+}

Загрузка…
Отмена
Сохранить