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

Small refactorings

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

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

1
 package obfuscated2
1
 package obfuscated2
2
 
2
 
3
 import (
3
 import (
4
-	"crypto/aes"
5
 	"crypto/cipher"
4
 	"crypto/cipher"
6
 	"crypto/subtle"
5
 	"crypto/subtle"
7
 	"encoding/hex"
6
 	"encoding/hex"
9
 	"io"
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
 func ClientHandshake(secret []byte, reader io.Reader) (int16, cipher.Stream, cipher.Stream, error) {
11
 func ClientHandshake(secret []byte, reader io.Reader) (int16, cipher.Stream, cipher.Stream, error) {
16
-	handshake := handshakeFrame{}
12
+	handshake := clientHandhakeFrame{}
17
 
13
 
18
 	if _, err := io.ReadFull(reader, handshake.data[:]); err != nil {
14
 	if _, err := io.ReadFull(reader, handshake.data[:]); err != nil {
19
 		return 0, nil, nil, fmt.Errorf("cannot read frame: %w", err)
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
 	decryptor.XORKeyStream(handshake.data[:], handshake.data[:])
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
 		return 0, nil, nil, fmt.Errorf("unsupported connection type: %s", hex.EncodeToString(val))
24
 		return 0, nil, nil, fmt.Errorf("unsupported connection type: %s", hex.EncodeToString(val))
46
 	}
25
 	}
47
 
26
 
48
 	return handshake.dc(), encryptor, decryptor, nil
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 Просмотреть файл

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
 	handshakeFrameOffsetEnd            = handshakeFrameOffsetDC + handshakeFrameLenDC
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
 // A structure of obfuscated2 handshake frame is following:
24
 // A structure of obfuscated2 handshake frame is following:
22
 //
25
 //
23
 //    [frameOffsetFirst:frameOffsetKey:frameOffsetIV:frameOffsetMagic:frameOffsetDC:frameOffsetEnd].
26
 //    [frameOffsetFirst:frameOffsetKey:frameOffsetIV:frameOffsetMagic:frameOffsetDC:frameOffsetEnd].

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

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
+}

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