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

Unpool handshake

Anyway, we are going to use stack here, no need for connection pooling.
Even arrays are allocaed on a stack because we do not use slices here
but real ones.
tags/v2.0.0-rc1
9seconds 5 лет назад
Родитель
Сommit
8de727932d
2 измененных файлов: 20 добавлений и 36 удалений
  1. 15
    16
      mtglib/internal/obfuscated2/client_handshake.go
  2. 5
    20
      mtglib/internal/obfuscated2/pools.go

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

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

+ 5
- 20
mtglib/internal/obfuscated2/pools.go Просмотреть файл

6
 	"sync"
6
 	"sync"
7
 )
7
 )
8
 
8
 
9
-var (
10
-	sha256HasherPool = sync.Pool{
11
-		New: func() interface{} {
12
-			return sha256.New()
13
-		},
14
-	}
15
-	handshakeFramePool = sync.Pool{
16
-		New: func() interface{} {
17
-			return &handshakeFrame{}
18
-		},
19
-	}
20
-)
9
+var sha256HasherPool = sync.Pool{
10
+	New: func() interface{} {
11
+		return sha256.New()
12
+	},
13
+}
21
 
14
 
22
 func acquireSha256Hasher() hash.Hash {
15
 func acquireSha256Hasher() hash.Hash {
23
 	return sha256HasherPool.Get().(hash.Hash)
16
 	return sha256HasherPool.Get().(hash.Hash)
27
 	h.Reset()
20
 	h.Reset()
28
 	sha256HasherPool.Put(h)
21
 	sha256HasherPool.Put(h)
29
 }
22
 }
30
-
31
-func acquireHandshakeFrame() *handshakeFrame {
32
-	return handshakeFramePool.Get().(*handshakeFrame)
33
-}
34
-
35
-func releaseHandshakeFrame(h *handshakeFrame) {
36
-	handshakeFramePool.Put(h)
37
-}

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