Procházet zdrojové kódy

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 před 5 roky
rodič
revize
8de727932d

+ 15
- 16
mtglib/internal/obfuscated2/client_handshake.go Zobrazit soubor

@@ -1,6 +1,7 @@
1 1
 package obfuscated2
2 2
 
3 3
 import (
4
+	"crypto/aes"
4 5
 	"crypto/cipher"
5 6
 	"crypto/subtle"
6 7
 	"encoding/hex"
@@ -12,41 +13,39 @@ import (
12 13
 var clientHandshakeConnectionType = []byte{0xdd, 0xdd, 0xdd, 0xdd}
13 14
 
14 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 19
 		return 0, nil, nil, fmt.Errorf("cannot read frame: %w", err)
20 20
 	}
21 21
 
22 22
 	decHasher := acquireSha256Hasher()
23 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 29
 	encHasher := acquireSha256Hasher()
30 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 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 51
 func makeAesCtr(key, iv []byte) cipher.Stream {

+ 5
- 20
mtglib/internal/obfuscated2/pools.go Zobrazit soubor

@@ -6,18 +6,11 @@ import (
6 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 15
 func acquireSha256Hasher() hash.Hash {
23 16
 	return sha256HasherPool.Get().(hash.Hash)
@@ -27,11 +20,3 @@ func releaseSha256Hasher(h hash.Hash) {
27 20
 	h.Reset()
28 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
-}

Načítá se…
Zrušit
Uložit