Use pool for frames

This commit is contained in:
9seconds
2018-06-20 09:19:27 +03:00
parent 9ddf3e147c
commit c76d8307c2
8 changed files with 66 additions and 30 deletions
+10 -8
View File
@@ -19,7 +19,7 @@ type Obfuscated2 struct {
// details: http://telegra.ph/telegram-blocks-wtf-05-26
//
// Beware, link above is in russian.
func ParseObfuscated2ClientFrame(secret []byte, frame Frame) (*Obfuscated2, int16, error) {
func ParseObfuscated2ClientFrame(secret []byte, frame *Frame) (*Obfuscated2, int16, error) {
decHasher := sha256.New()
decHasher.Write(frame.Key()) // nolint: errcheck
decHasher.Write(secret) // nolint: errcheck
@@ -31,8 +31,9 @@ func ParseObfuscated2ClientFrame(secret []byte, frame Frame) (*Obfuscated2, int1
encHasher.Write(secret) // nolint: errcheck
encryptor := makeStreamCipher(encHasher.Sum(nil), invertedFrame.IV())
decryptedFrame := make(Frame, FrameLen)
decryptor.XORKeyStream(decryptedFrame, frame)
decryptedFrame := MakeFrame()
defer ReturnFrame(decryptedFrame)
decryptor.XORKeyStream(*decryptedFrame, *frame)
if !decryptedFrame.Valid() {
return nil, 0, errors.New("Unknown protocol")
}
@@ -48,17 +49,18 @@ func ParseObfuscated2ClientFrame(secret []byte, frame Frame) (*Obfuscated2, int1
// MakeTelegramObfuscated2Frame creates new handshake frame to send to
// Telegram.
// https://blog.susanka.eu/how-telegram-obfuscates-its-mtproto-traffic/
func MakeTelegramObfuscated2Frame() (*Obfuscated2, Frame) {
func MakeTelegramObfuscated2Frame() (*Obfuscated2, *Frame) {
frame := generateFrame()
encryptor := makeStreamCipher(frame.Key(), frame.IV())
decryptorFrame := frame.Invert()
decryptor := makeStreamCipher(decryptorFrame.Key(), decryptorFrame.IV())
copyFrame := make(Frame, frameOffsetIV)
copy(copyFrame, frame)
encryptor.XORKeyStream(frame, frame)
copy(frame, copyFrame)
copyFrame := MakeFrame()
defer ReturnFrame(copyFrame)
copy((*copyFrame)[:frameOffsetIV], (*frame)[:frameOffsetIV])
encryptor.XORKeyStream(*frame, *frame)
copy((*frame)[:frameOffsetIV], (*copyFrame)[:frameOffsetIV])
obfs := &Obfuscated2{
Decryptor: decryptor,