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

Small refactorings

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

+ 4
- 34
mtglib/internal/obfuscated2/client_handshake.go Просмотреть файл

@@ -1,7 +1,6 @@
1 1
 package obfuscated2
2 2
 
3 3
 import (
4
-	"crypto/aes"
5 4
 	"crypto/cipher"
6 5
 	"crypto/subtle"
7 6
 	"encoding/hex"
@@ -9,50 +8,21 @@ import (
9 8
 	"io"
10 9
 )
11 10
 
12
-// Connection Type secure. We support only fake tls.
13
-var clientHandshakeConnectionType = []byte{0xdd, 0xdd, 0xdd, 0xdd}
14
-
15 11
 func ClientHandshake(secret []byte, reader io.Reader) (int16, cipher.Stream, cipher.Stream, error) {
16
-	handshake := handshakeFrame{}
12
+	handshake := clientHandhakeFrame{}
17 13
 
18 14
 	if _, err := io.ReadFull(reader, handshake.data[:]); err != nil {
19 15
 		return 0, nil, nil, fmt.Errorf("cannot read frame: %w", err)
20 16
 	}
21 17
 
22
-	decHasher := acquireSha256Hasher()
23
-	defer releaseSha256Hasher(decHasher)
24
-
25
-	decHasher.Write(handshake.key()) // nolint: errcheck
26
-	decHasher.Write(secret)          // nolint: errcheck
27
-	decryptor := makeAesCtr(decHasher.Sum(nil), handshake.iv())
28
-
29
-	encHasher := acquireSha256Hasher()
30
-	defer releaseSha256Hasher(encHasher)
31
-
32
-	invertedHandshake := handshakeFrame{}
33
-
34
-	for i, v := range handshake.data {
35
-		invertedHandshake.data[handshakeFrameLen-1-i] = v
36
-	}
37
-
38
-	encHasher.Write(invertedHandshake.key()) // nolint: errcheck
39
-	encHasher.Write(secret)                  // nolint: errcheck
40
-	encryptor := makeAesCtr(encHasher.Sum(nil), invertedHandshake.iv())
18
+	decryptor := handshake.decryptor(secret)
19
+	encryptor := handshake.encryptor(secret)
41 20
 
42 21
 	decryptor.XORKeyStream(handshake.data[:], handshake.data[:])
43 22
 
44
-	if val := handshake.connectionType(); subtle.ConstantTimeCompare(clientHandshakeConnectionType, val) != 1 {
23
+	if val := handshake.connectionType(); subtle.ConstantTimeCompare(handshakeConnectionType, val) != 1 {
45 24
 		return 0, nil, nil, fmt.Errorf("unsupported connection type: %s", hex.EncodeToString(val))
46 25
 	}
47 26
 
48 27
 	return handshake.dc(), encryptor, decryptor, nil
49 28
 }
50
-
51
-func makeAesCtr(key, iv []byte) cipher.Stream {
52
-	block, err := aes.NewCipher(key)
53
-	if err != nil {
54
-		panic(err)
55
-	}
56
-
57
-	return cipher.NewCTR(block, iv)
58
-}

+ 30
- 0
mtglib/internal/obfuscated2/client_handshake_frame.go Просмотреть файл

@@ -0,0 +1,30 @@
1
+package obfuscated2
2
+
3
+import "crypto/cipher"
4
+
5
+type clientHandhakeFrame struct {
6
+	handshakeFrame
7
+}
8
+
9
+func (c *clientHandhakeFrame) decryptor(secret []byte) cipher.Stream {
10
+	hasher := acquireSha256Hasher()
11
+	defer releaseSha256Hasher(hasher)
12
+
13
+	hasher.Write(c.key()) // nolint: errcheck
14
+	hasher.Write(secret)  // nolint: errcheck
15
+
16
+	return makeAesCtr(hasher.Sum(nil), c.iv())
17
+}
18
+
19
+func (c *clientHandhakeFrame) encryptor(secret []byte) cipher.Stream {
20
+	arr := clientHandhakeFrame{}
21
+	invertByteSlices(arr.data[:], c.data[:])
22
+
23
+	hasher := acquireSha256Hasher()
24
+	defer releaseSha256Hasher(hasher)
25
+
26
+	hasher.Write(arr.key()) // nolint: errcheck
27
+	hasher.Write(secret)    // nolint: errcheck
28
+
29
+	return makeAesCtr(hasher.Sum(nil), arr.iv())
30
+}

+ 3
- 0
mtglib/internal/obfuscated2/handshake_frame.go Просмотреть файл

@@ -18,6 +18,9 @@ const (
18 18
 	handshakeFrameOffsetEnd            = handshakeFrameOffsetDC + handshakeFrameLenDC
19 19
 )
20 20
 
21
+// Connection-Type: Secure. We support only fake tls.
22
+var handshakeConnectionType = []byte{0xdd, 0xdd, 0xdd, 0xdd}
23
+
21 24
 // A structure of obfuscated2 handshake frame is following:
22 25
 //
23 26
 //    [frameOffsetFirst:frameOffsetKey:frameOffsetIV:frameOffsetMagic:frameOffsetDC:frameOffsetEnd].

+ 23
- 0
mtglib/internal/obfuscated2/utils.go Просмотреть файл

@@ -0,0 +1,23 @@
1
+package obfuscated2
2
+
3
+import (
4
+	"crypto/aes"
5
+	"crypto/cipher"
6
+)
7
+
8
+func makeAesCtr(key, iv []byte) cipher.Stream {
9
+	block, err := aes.NewCipher(key)
10
+	if err != nil {
11
+		panic(err)
12
+	}
13
+
14
+	return cipher.NewCTR(block, iv)
15
+}
16
+
17
+func invertByteSlices(dst, src []byte) {
18
+	lenDst := len(dst) - 1
19
+
20
+	for i, v := range src {
21
+		dst[lenDst-i] = v
22
+	}
23
+}

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