Explorar el Código

Add fuzz tests for obfuscated2

tags/v2.1.6^2
9seconds hace 4 años
padre
commit
9375552180

+ 32
- 0
mtglib/internal/obfuscated2/client_handshake_fuzz_internal_test.go Ver fichero

1
+package obfuscated2
2
+
3
+import (
4
+	"bytes"
5
+	"testing"
6
+
7
+	"github.com/stretchr/testify/require"
8
+)
9
+
10
+var FuzzClientHandshakeSecret = []byte{1,2,3}
11
+
12
+func FuzzClientHandshake(f *testing.F) {
13
+	f.Add([]byte{1,2,3})
14
+
15
+	f.Fuzz(func(t *testing.T, frame []byte) {
16
+		data := bytes.NewReader(frame)
17
+
18
+		if _, _, _, err := ClientHandshake(FuzzClientHandshakeSecret, data); err != nil {
19
+			return
20
+		}
21
+
22
+		handshake := clientHandhakeFrame{}
23
+		require.Len(t, frame, handshakeFrameLen)
24
+
25
+		copy(handshake.data[:], frame)
26
+
27
+		decryptor := handshake.decryptor(FuzzClientHandshakeSecret)
28
+		decryptor.XORKeyStream(handshake.data[:], handshake.data[:])
29
+
30
+		require.Equal(t, handshakeConnectionType, handshake.connectionType())
31
+	})
32
+}

+ 54
- 0
mtglib/internal/obfuscated2/init_test.go Ver fichero

1
 package obfuscated2_test
1
 package obfuscated2_test
2
 
2
 
3
 import (
3
 import (
4
+	"bytes"
5
+	"crypto/aes"
6
+	"crypto/cipher"
4
 	"encoding/base64"
7
 	"encoding/base64"
5
 	"encoding/json"
8
 	"encoding/json"
6
 	"fmt"
9
 	"fmt"
7
 	"os"
10
 	"os"
8
 	"path/filepath"
11
 	"path/filepath"
9
 	"strings"
12
 	"strings"
13
+	"testing"
14
+
15
+	"github.com/9seconds/mtg/v2/internal/testlib"
16
+	"github.com/9seconds/mtg/v2/mtglib/internal/obfuscated2"
17
+	"github.com/stretchr/testify/require"
10
 )
18
 )
11
 
19
 
12
 type snapshotBytes struct {
20
 type snapshotBytes struct {
50
 	snapshots map[string]*Obfuscated2Snapshot
58
 	snapshots map[string]*Obfuscated2Snapshot
51
 }
59
 }
52
 
60
 
61
+type ServerHandshakeTestData struct {
62
+	connMock *testlib.EssentialsConnMock
63
+
64
+	proxyConn obfuscated2.Conn
65
+	encryptor cipher.Stream
66
+	decryptor cipher.Stream
67
+}
68
+
53
 func (suite *SnapshotTestSuite) IngestSnapshots(dirname, namePrefix string) error {
69
 func (suite *SnapshotTestSuite) IngestSnapshots(dirname, namePrefix string) error {
54
 	suite.snapshots = map[string]*Obfuscated2Snapshot{}
70
 	suite.snapshots = map[string]*Obfuscated2Snapshot{}
55
 
71
 
81
 
97
 
82
 	return nil
98
 	return nil
83
 }
99
 }
100
+
101
+func NewServerHandshakeTestData(t *testing.T) ServerHandshakeTestData {
102
+	buf := &bytes.Buffer{}
103
+	connMock := &testlib.EssentialsConnMock{}
104
+
105
+	handshakeEnc, handshakeDec, err := obfuscated2.ServerHandshake(buf)
106
+	require.NoError(t, err)
107
+
108
+	serverEncrypted := buf.Bytes()
109
+	decBlock, _ := aes.NewCipher(serverEncrypted[8 : 8+32])
110
+	decryptor := cipher.NewCTR(decBlock, serverEncrypted[8+32:8+32+16])
111
+
112
+	serverDecrypted := make([]byte, len(serverEncrypted))
113
+	decryptor.XORKeyStream(serverDecrypted, serverEncrypted)
114
+
115
+	require.Equal(t, "3d3d3Q",
116
+		base64.RawStdEncoding.EncodeToString(serverDecrypted[8+32+16:8+32+16+4]))
117
+
118
+	serverEncryptedReverted := make([]byte, len(serverEncrypted))
119
+
120
+	for i := 0; i < 32+16; i++ {
121
+		serverEncryptedReverted[8+i] = serverEncrypted[8+32+16-1-i]
122
+	}
123
+
124
+	encBlock, _ := aes.NewCipher(serverEncryptedReverted[8 : 8+32])
125
+	encryptor := cipher.NewCTR(encBlock, serverEncryptedReverted[8+32:8+32+16])
126
+
127
+	return ServerHandshakeTestData{
128
+		connMock: connMock,
129
+		proxyConn: obfuscated2.Conn{
130
+			Conn: connMock,
131
+			Encryptor: handshakeEnc,
132
+			Decryptor: handshakeDec,
133
+		},
134
+		encryptor: encryptor,
135
+		decryptor: decryptor,
136
+	}
137
+}

+ 30
- 0
mtglib/internal/obfuscated2/server_handshake_fuzz_internal_test.go Ver fichero

1
+package obfuscated2
2
+
3
+import (
4
+	"encoding/binary"
5
+	"testing"
6
+
7
+	"github.com/stretchr/testify/assert"
8
+)
9
+
10
+func FuzzServerGenerateHandshakeFrame(f *testing.F) {
11
+	f.Fuzz(func(t *testing.T, arg int) {
12
+		frame := generateServerHanshakeFrame()
13
+
14
+		assert.NotEqualValues(t, 0xef, frame.data[0])
15
+
16
+		firstBytes := binary.LittleEndian.Uint32(frame.data[:4])
17
+		assert.NotEqualValues(t, 0x44414548, firstBytes)
18
+		assert.NotEqualValues(t, 0x54534f50, firstBytes)
19
+		assert.NotEqualValues(t, 0x20544547, firstBytes)
20
+		assert.NotEqualValues(t, 0x4954504f, firstBytes)
21
+		assert.NotEqualValues(t, 0xeeeeeeee, firstBytes)
22
+
23
+		assert.NotEqualValues(
24
+			t,
25
+			0,
26
+			frame.data[4] | frame.data[5] | frame.data[6] | frame.data[7])
27
+
28
+		assert.Equal(t, handshakeConnectionType, frame.connectionType())
29
+	})
30
+}

+ 58
- 0
mtglib/internal/obfuscated2/server_handshake_fuzz_test.go Ver fichero

1
+package obfuscated2_test
2
+
3
+import (
4
+	"testing"
5
+
6
+	"github.com/stretchr/testify/assert"
7
+	"github.com/stretchr/testify/mock"
8
+)
9
+
10
+func FuzzServerSend(f *testing.F) {
11
+	f.Add([]byte{1,2,3,4,5})
12
+
13
+	f.Fuzz(func(t *testing.T, data []byte) {
14
+		handshakeData := NewServerHandshakeTestData(t)
15
+
16
+		handshakeData.connMock.
17
+			On("Write", mock.Anything).
18
+			Return(len(data), nil).
19
+			Once().
20
+			Run(func(args mock.Arguments) {
21
+				message := make([]byte, len(data))
22
+				handshakeData.decryptor.XORKeyStream(message, args.Get(0).([]byte))
23
+				assert.Equal(t, message, data)
24
+			})
25
+
26
+		n, err := handshakeData.proxyConn.Write(data)
27
+
28
+		assert.EqualValues(t, len(data), n)
29
+		assert.NoError(t, err)
30
+		handshakeData.connMock.AssertExpectations(t)
31
+	})
32
+}
33
+
34
+func FuzzServerReceive(f *testing.F) {
35
+	f.Add([]byte{1,2,3,4,5})
36
+
37
+	f.Fuzz(func(t *testing.T, data []byte) {
38
+		handshakeData := NewServerHandshakeTestData(t)
39
+		buffer := make([]byte, len(data))
40
+
41
+		handshakeData.connMock.
42
+			On("Read", mock.Anything).
43
+			Return(len(data), nil).
44
+			Once().
45
+			Run(func(args mock.Arguments) {
46
+				message := make([]byte, len(data))
47
+				handshakeData.encryptor.XORKeyStream(message, data)
48
+				copy(args.Get(0).([]byte), message)
49
+			})
50
+
51
+		n, err := handshakeData.proxyConn.Read(buffer)
52
+
53
+		assert.EqualValues(t, len(data), n)
54
+		assert.NoError(t, err)
55
+		assert.Equal(t, data, buffer)
56
+		handshakeData.connMock.AssertExpectations(t)
57
+	})
58
+}

+ 9
- 48
mtglib/internal/obfuscated2/server_handshake_test.go Ver fichero

1
 package obfuscated2_test
1
 package obfuscated2_test
2
 
2
 
3
 import (
3
 import (
4
-	"bytes"
5
-	"crypto/aes"
6
-	"crypto/cipher"
7
-	"encoding/base64"
8
 	"testing"
4
 	"testing"
9
 
5
 
10
-	"github.com/9seconds/mtg/v2/internal/testlib"
11
-	"github.com/9seconds/mtg/v2/mtglib/internal/obfuscated2"
12
 	"github.com/stretchr/testify/mock"
6
 	"github.com/stretchr/testify/mock"
13
 	"github.com/stretchr/testify/suite"
7
 	"github.com/stretchr/testify/suite"
14
 )
8
 )
16
 type ServerHandshakeTestSuite struct {
10
 type ServerHandshakeTestSuite struct {
17
 	suite.Suite
11
 	suite.Suite
18
 
12
 
19
-	connMock  *testlib.EssentialsConnMock
20
-	proxyConn obfuscated2.Conn
21
-	encryptor cipher.Stream
22
-	decryptor cipher.Stream
13
+	data ServerHandshakeTestData
23
 }
14
 }
24
 
15
 
25
 func (suite *ServerHandshakeTestSuite) SetupTest() {
16
 func (suite *ServerHandshakeTestSuite) SetupTest() {
26
-	buf := &bytes.Buffer{}
27
-	suite.connMock = &testlib.EssentialsConnMock{}
28
-
29
-	encryptor, decryptor, err := obfuscated2.ServerHandshake(buf)
30
-	suite.NoError(err)
31
-
32
-	suite.proxyConn = obfuscated2.Conn{
33
-		Conn:      suite.connMock,
34
-		Encryptor: encryptor,
35
-		Decryptor: decryptor,
36
-	}
37
-
38
-	serverEncrypted := buf.Bytes()
39
-
40
-	decBlock, _ := aes.NewCipher(serverEncrypted[8 : 8+32])
41
-	suite.decryptor = cipher.NewCTR(decBlock, serverEncrypted[8+32:8+32+16])
42
-
43
-	serverDecrypted := make([]byte, len(serverEncrypted))
44
-	suite.decryptor.XORKeyStream(serverDecrypted, serverEncrypted)
45
-
46
-	suite.Equal("3d3d3Q",
47
-		base64.RawStdEncoding.EncodeToString(serverDecrypted[8+32+16:8+32+16+4]))
48
-
49
-	serverEncryptedReverted := make([]byte, len(serverEncrypted))
50
-
51
-	for i := 0; i < 32+16; i++ {
52
-		serverEncryptedReverted[8+i] = serverEncrypted[8+32+16-1-i]
53
-	}
54
-
55
-	encBlock, _ := aes.NewCipher(serverEncryptedReverted[8 : 8+32])
56
-	suite.encryptor = cipher.NewCTR(encBlock, serverEncryptedReverted[8+32:8+32+16])
17
+	suite.data = NewServerHandshakeTestData(suite.T())
57
 }
18
 }
58
 
19
 
59
 func (suite *ServerHandshakeTestSuite) TearDownTest() {
20
 func (suite *ServerHandshakeTestSuite) TearDownTest() {
60
-	suite.connMock.AssertExpectations(suite.T())
21
+	suite.data.connMock.AssertExpectations(suite.T())
61
 }
22
 }
62
 
23
 
63
 func (suite *ServerHandshakeTestSuite) TestSendToTelegram() {
24
 func (suite *ServerHandshakeTestSuite) TestSendToTelegram() {
64
 	messageToTelegram := []byte{10, 11, 12, 13, 14, 'a'}
25
 	messageToTelegram := []byte{10, 11, 12, 13, 14, 'a'}
65
 
26
 
66
-	suite.connMock.
27
+	suite.data.connMock.
67
 		On("Write", mock.Anything).
28
 		On("Write", mock.Anything).
68
 		Return(len(messageToTelegram), nil).
29
 		Return(len(messageToTelegram), nil).
69
 		Once().
30
 		Once().
70
 		Run(func(args mock.Arguments) {
31
 		Run(func(args mock.Arguments) {
71
 			message := make([]byte, len(messageToTelegram))
32
 			message := make([]byte, len(messageToTelegram))
72
-			suite.decryptor.XORKeyStream(message, args.Get(0).([]byte)) // nolint: forcetypeassert
33
+			suite.data.decryptor.XORKeyStream(message, args.Get(0).([]byte)) // nolint: forcetypeassert
73
 			suite.Equal(messageToTelegram, message)
34
 			suite.Equal(messageToTelegram, message)
74
 		})
35
 		})
75
 
36
 
76
-	n, err := suite.proxyConn.Write(messageToTelegram)
37
+	n, err := suite.data.proxyConn.Write(messageToTelegram)
77
 	suite.EqualValues(len(messageToTelegram), n)
38
 	suite.EqualValues(len(messageToTelegram), n)
78
 	suite.NoError(err)
39
 	suite.NoError(err)
79
 }
40
 }
82
 	messageFromTelegram := []byte{10, 11, 12, 13, 14, 'a'}
43
 	messageFromTelegram := []byte{10, 11, 12, 13, 14, 'a'}
83
 	buffer := make([]byte, len(messageFromTelegram))
44
 	buffer := make([]byte, len(messageFromTelegram))
84
 
45
 
85
-	suite.connMock.
46
+	suite.data.connMock.
86
 		On("Read", mock.Anything).
47
 		On("Read", mock.Anything).
87
 		Return(len(messageFromTelegram), nil).
48
 		Return(len(messageFromTelegram), nil).
88
 		Once().
49
 		Once().
89
 		Run(func(args mock.Arguments) {
50
 		Run(func(args mock.Arguments) {
90
 			message := make([]byte, len(messageFromTelegram))
51
 			message := make([]byte, len(messageFromTelegram))
91
-			suite.encryptor.XORKeyStream(message, messageFromTelegram)
52
+			suite.data.encryptor.XORKeyStream(message, messageFromTelegram)
92
 			copy(args.Get(0).([]byte), message) // nolint: forcetypeassert
53
 			copy(args.Get(0).([]byte), message) // nolint: forcetypeassert
93
 		})
54
 		})
94
 
55
 
95
-	n, err := suite.proxyConn.Read(buffer)
56
+	n, err := suite.data.proxyConn.Read(buffer)
96
 	suite.EqualValues(len(messageFromTelegram), n)
57
 	suite.EqualValues(len(messageFromTelegram), n)
97
 	suite.NoError(err)
58
 	suite.NoError(err)
98
 	suite.Equal(messageFromTelegram, buffer)
59
 	suite.Equal(messageFromTelegram, buffer)

Loading…
Cancelar
Guardar