From 8de727932d1c99ea43a39698e79fcdd1c5887467 Mon Sep 17 00:00:00 2001 From: 9seconds Date: Thu, 18 Mar 2021 22:06:51 +0300 Subject: [PATCH] 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. --- .../internal/obfuscated2/client_handshake.go | 31 +++++++++---------- mtglib/internal/obfuscated2/pools.go | 25 +++------------ 2 files changed, 20 insertions(+), 36 deletions(-) diff --git a/mtglib/internal/obfuscated2/client_handshake.go b/mtglib/internal/obfuscated2/client_handshake.go index 41e80b3..035086e 100644 --- a/mtglib/internal/obfuscated2/client_handshake.go +++ b/mtglib/internal/obfuscated2/client_handshake.go @@ -1,6 +1,7 @@ package obfuscated2 import ( + "crypto/aes" "crypto/cipher" "crypto/subtle" "encoding/hex" @@ -12,41 +13,39 @@ import ( var clientHandshakeConnectionType = []byte{0xdd, 0xdd, 0xdd, 0xdd} func ClientHandshake(secret []byte, reader io.Reader) (int16, cipher.Stream, cipher.Stream, error) { - handshakeFrame := acquireHandshakeFrame() - defer releaseHandshakeFrame(handshakeFrame) + handshake := handshakeFrame{} - if _, err := io.ReadFull(reader, handshakeFrame.data[:]); err != nil { + if _, err := io.ReadFull(reader, handshake.data[:]); err != nil { return 0, nil, nil, fmt.Errorf("cannot read frame: %w", err) } decHasher := acquireSha256Hasher() defer releaseSha256Hasher(decHasher) - decHasher.Write(handshakeFrame.key()) // nolint: errcheck - decHasher.Write(secret) // nolint: errcheck - decryptor := makeAesCtr(decHasher.Sum(nil), handshakeFrame.iv()) + decHasher.Write(handshake.key()) // nolint: errcheck + decHasher.Write(secret) // nolint: errcheck + decryptor := makeAesCtr(decHasher.Sum(nil), handshake.iv()) encHasher := acquireSha256Hasher() defer releaseSha256Hasher(encHasher) - invertedFrame := acquireHandshakeFrame() - defer releaseHandshakeFrame(invertedFrame) + invertedHandshake := handshakeFrame{} - for i, v := range handshakeFrame.data { - invertedFrame.data[handshakeFrameLen-1-i] = v + for i, v := range handshake.data { + invertedHandshake.data[handshakeFrameLen-1-i] = v } - encHasher.Write(invertedFrame.key()) // nolint: errcheck - encHasher.Write(secret) // nolint: errcheck - encryptor := makeAesCtr(encHasher.Sum(nil), invertedFrame.iv()) + encHasher.Write(invertedHandshake.key()) // nolint: errcheck + encHasher.Write(secret) // nolint: errcheck + encryptor := makeAesCtr(encHasher.Sum(nil), invertedHandshake.iv()) - decryptor.XORKeyStream(handshakeFrame.data[:], handshakeFrame.data[:]) + decryptor.XORKeyStream(handshake.data[:], handshake.data[:]) - if val := handshakeFrame.connectionType(); subtle.ConstantTimeCompare(clientHandshakeConnectionType, val) != 1 { + if val := handshake.connectionType(); subtle.ConstantTimeCompare(clientHandshakeConnectionType, val) != 1 { return 0, nil, nil, fmt.Errorf("unsupported connection type: %s", hex.EncodeToString(val)) } - return handshakeFrame.dc(), encryptor, decryptor, nil + return handshake.dc(), encryptor, decryptor, nil } func makeAesCtr(key, iv []byte) cipher.Stream { diff --git a/mtglib/internal/obfuscated2/pools.go b/mtglib/internal/obfuscated2/pools.go index 222514e..ce3204f 100644 --- a/mtglib/internal/obfuscated2/pools.go +++ b/mtglib/internal/obfuscated2/pools.go @@ -6,18 +6,11 @@ import ( "sync" ) -var ( - sha256HasherPool = sync.Pool{ - New: func() interface{} { - return sha256.New() - }, - } - handshakeFramePool = sync.Pool{ - New: func() interface{} { - return &handshakeFrame{} - }, - } -) +var sha256HasherPool = sync.Pool{ + New: func() interface{} { + return sha256.New() + }, +} func acquireSha256Hasher() hash.Hash { return sha256HasherPool.Get().(hash.Hash) @@ -27,11 +20,3 @@ func releaseSha256Hasher(h hash.Hash) { h.Reset() sha256HasherPool.Put(h) } - -func acquireHandshakeFrame() *handshakeFrame { - return handshakeFramePool.Get().(*handshakeFrame) -} - -func releaseHandshakeFrame(h *handshakeFrame) { - handshakeFramePool.Put(h) -}