Parcourir la source

Remove frame pool for obfuscated2 frames

tags/0.9
9seconds il y a 7 ans
Parent
révision
6253648356

+ 0
- 1
client/direct.go Voir le fichier

@@ -29,7 +29,6 @@ func DirectInit(conn net.Conn, conf *config.Config) (*mtproto.ConnectionOpts, io
29 29
 	if err != nil {
30 30
 		return nil, nil, errors.Annotate(err, "Cannot extract frame")
31 31
 	}
32
-	defer obfuscated2.ReturnFrame(frame)
33 32
 
34 33
 	obfs2, connOpts, err := obfuscated2.ParseObfuscated2ClientFrame(conf.Secret, frame)
35 34
 	if err != nil {

+ 15
- 17
obfuscated2/frame.go Voir le fichier

@@ -66,57 +66,55 @@ func (f Frame) ConnectionType() (mtproto.ConnectionType, error) {
66 66
 
67 67
 // Invert inverts frame for extracting encryption keys. Pkease check that link:
68 68
 // https://blog.susanka.eu/how-telegram-obfuscates-its-mtproto-traffic/
69
-func (f Frame) Invert() *Frame {
70
-	reversed := MakeFrame()
71
-	copy(*reversed, f)
69
+func (f Frame) Invert() Frame {
70
+	reversed := make(Frame, FrameLen)
71
+	copy(reversed, f)
72 72
 
73 73
 	for i := 0; i < frameLenKey+frameLenIV; i++ {
74
-		(*reversed)[frameOffsetFirst+i] = f[frameOffsetIV-1-i]
74
+		reversed[frameOffsetFirst+i] = f[frameOffsetIV-1-i]
75 75
 	}
76 76
 
77 77
 	return reversed
78 78
 }
79 79
 
80 80
 // ExtractFrame extracts exact obfuscated2 handshake frame from given reader.
81
-func ExtractFrame(conn io.Reader) (*Frame, error) {
82
-	frame := MakeFrame()
83
-	buf := bytes.NewBuffer(*frame)
81
+func ExtractFrame(conn io.Reader) (Frame, error) {
82
+	frame := make(Frame, FrameLen)
83
+	buf := bytes.NewBuffer(frame)
84 84
 	buf.Reset()
85 85
 
86 86
 	if _, err := io.CopyN(buf, conn, FrameLen); err != nil {
87
-		ReturnFrame(frame)
88 87
 		return nil, errors.Annotate(err, "Cannot extract obfuscated header")
89 88
 	}
90
-	copy(*frame, buf.Bytes())
89
+	copy(frame, buf.Bytes())
91 90
 
92 91
 	return frame, nil
93 92
 }
94 93
 
95
-func generateFrame(connectionType mtproto.ConnectionType) *Frame {
96
-	frame := MakeFrame()
97
-	data := *frame
94
+func generateFrame(connectionType mtproto.ConnectionType) Frame {
95
+	frame := make(Frame, FrameLen)
98 96
 
99 97
 	for {
100
-		if _, err := rand.Read(data); err != nil {
98
+		if _, err := rand.Read(frame); err != nil {
101 99
 			continue
102 100
 		}
103
-		if data[0] == 0xef {
101
+		if frame[0] == 0xef {
104 102
 			continue
105 103
 		}
106 104
 
107
-		val := (uint32(data[3]) << 24) | (uint32(data[2]) << 16) | (uint32(data[1]) << 8) | uint32(data[0])
105
+		val := (uint32(frame[3]) << 24) | (uint32(frame[2]) << 16) | (uint32(frame[1]) << 8) | uint32(frame[0])
108 106
 		if val == 0x44414548 || val == 0x54534f50 || val == 0x20544547 || val == 0x4954504f || val == 0xeeeeeeee {
109 107
 			continue
110 108
 		}
111 109
 
112
-		val = (uint32(data[7]) << 24) | (uint32(data[6]) << 16) | (uint32(data[5]) << 8) | uint32(data[4])
110
+		val = (uint32(frame[7]) << 24) | (uint32(frame[6]) << 16) | (uint32(frame[5]) << 8) | uint32(frame[4])
113 111
 		if val == 0x00000000 {
114 112
 			continue
115 113
 		}
116 114
 
117 115
 		// error has to be checked before calling this function
118 116
 		tag, _ := connectionType.Tag() // nolint: errcheck
119
-		copy(data.Magic(), tag)
117
+		copy(frame.Magic(), tag)
120 118
 
121 119
 		return frame
122 120
 	}

+ 0
- 24
obfuscated2/frame_pool.go Voir le fichier

@@ -1,24 +0,0 @@
1
-package obfuscated2
2
-
3
-import "sync"
4
-
5
-var framePool sync.Pool
6
-
7
-// MakeFrame returns new pointer to the handshake frame.
8
-func MakeFrame() *Frame {
9
-	return framePool.Get().(*Frame)
10
-}
11
-
12
-// ReturnFrame returns pointer to the handshake frame back to the pool.
13
-func ReturnFrame(f *Frame) {
14
-	framePool.Put(f)
15
-}
16
-
17
-func init() {
18
-	framePool = sync.Pool{
19
-		New: func() interface{} {
20
-			data := make(Frame, FrameLen)
21
-			return &data
22
-		},
23
-	}
24
-}

+ 4
- 4
obfuscated2/frame_test.go Voir le fichier

@@ -54,21 +54,21 @@ func TestFrameValid(t *testing.T) {
54 54
 
55 55
 func TestFrameDoubleInvert(t *testing.T) {
56 56
 	frame := makeFrame()
57
-	assert.True(t, bytes.Equal(frame, *frame.Invert().Invert()))
57
+	assert.True(t, bytes.Equal(frame, frame.Invert().Invert()))
58 58
 }
59 59
 
60 60
 func TestFrameInvert(t *testing.T) {
61 61
 	frame := makeFrame()
62 62
 	reversed := frame.Invert()
63 63
 
64
-	assert.Exactly(t, frame[:8], (*reversed)[:8])
65
-	assert.Exactly(t, frame[56:], (*reversed)[56:])
64
+	assert.Exactly(t, frame[:8], reversed[:8])
65
+	assert.Exactly(t, frame[56:], reversed[56:])
66 66
 
67 67
 	toCompare := make([]byte, 48)
68 68
 	for i := 0; i < 48; i++ {
69 69
 		toCompare[i] = frame[55-i]
70 70
 	}
71
-	assert.Equal(t, []byte((*reversed)[8:56]), toCompare)
71
+	assert.Equal(t, []byte(reversed[8:56]), toCompare)
72 72
 }
73 73
 
74 74
 func TestFrameGenerateValid(t *testing.T) {

+ 8
- 10
obfuscated2/obfuscated2.go Voir le fichier

@@ -21,7 +21,7 @@ type Obfuscated2 struct {
21 21
 // details: http://telegra.ph/telegram-blocks-wtf-05-26
22 22
 //
23 23
 // Beware, link above is in russian.
24
-func ParseObfuscated2ClientFrame(secret []byte, frame *Frame) (*Obfuscated2, *mtproto.ConnectionOpts, error) {
24
+func ParseObfuscated2ClientFrame(secret []byte, frame Frame) (*Obfuscated2, *mtproto.ConnectionOpts, error) {
25 25
 	decHasher := sha256.New()
26 26
 	decHasher.Write(frame.Key()) // nolint: errcheck
27 27
 	decHasher.Write(secret)      // nolint: errcheck
@@ -33,9 +33,8 @@ func ParseObfuscated2ClientFrame(secret []byte, frame *Frame) (*Obfuscated2, *mt
33 33
 	encHasher.Write(secret)              // nolint: errcheck
34 34
 	encryptor := makeStreamCipher(encHasher.Sum(nil), invertedFrame.IV())
35 35
 
36
-	decryptedFrame := MakeFrame()
37
-	defer ReturnFrame(decryptedFrame)
38
-	decryptor.XORKeyStream(*decryptedFrame, *frame)
36
+	decryptedFrame := make(Frame, FrameLen)
37
+	decryptor.XORKeyStream(decryptedFrame, frame)
39 38
 	connType, err := decryptedFrame.ConnectionType()
40 39
 	if err != nil {
41 40
 		return nil, nil, errors.Annotate(err, "Unknown protocol")
@@ -56,18 +55,17 @@ func ParseObfuscated2ClientFrame(secret []byte, frame *Frame) (*Obfuscated2, *mt
56 55
 // MakeTelegramObfuscated2Frame creates new handshake frame to send to
57 56
 // Telegram.
58 57
 // https://blog.susanka.eu/how-telegram-obfuscates-its-mtproto-traffic/
59
-func MakeTelegramObfuscated2Frame(opts *mtproto.ConnectionOpts) (*Obfuscated2, *Frame) {
58
+func MakeTelegramObfuscated2Frame(opts *mtproto.ConnectionOpts) (*Obfuscated2, Frame) {
60 59
 	frame := generateFrame(opts.ConnectionType)
61 60
 
62 61
 	encryptor := makeStreamCipher(frame.Key(), frame.IV())
63 62
 	decryptorFrame := frame.Invert()
64 63
 	decryptor := makeStreamCipher(decryptorFrame.Key(), decryptorFrame.IV())
65 64
 
66
-	copyFrame := MakeFrame()
67
-	defer ReturnFrame(copyFrame)
68
-	copy((*copyFrame)[:frameOffsetIV], (*frame)[:frameOffsetIV])
69
-	encryptor.XORKeyStream(*frame, *frame)
70
-	copy((*frame)[:frameOffsetIV], (*copyFrame)[:frameOffsetIV])
65
+	copyFrame := make(Frame, FrameLen)
66
+	copy(copyFrame[:frameOffsetIV], frame[:frameOffsetIV])
67
+	encryptor.XORKeyStream(frame, frame)
68
+	copy(frame[:frameOffsetIV], copyFrame[:frameOffsetIV])
71 69
 
72 70
 	obfs := &Obfuscated2{
73 71
 		Decryptor: decryptor,

+ 5
- 5
obfuscated2/obfuscated2_test.go Voir le fichier

@@ -18,7 +18,7 @@ func TestObfs2TelegramFrameDecrypt(t *testing.T) {
18 18
 	decryptor := makeStreamCipher(frame.Key(), frame.IV())
19 19
 
20 20
 	decrypted := make(Frame, FrameLen)
21
-	decryptor.XORKeyStream(decrypted, *frame)
21
+	decryptor.XORKeyStream(decrypted, frame)
22 22
 
23 23
 	_, err := decrypted.ConnectionType()
24 24
 	assert.Nil(t, err)
@@ -53,8 +53,8 @@ func TestObfs2Full(t *testing.T) {
53 53
 
54 54
 	encryptor := makeStreamCipher(clientKey, clientFrame.IV())
55 55
 	encrypted := make(Frame, FrameLen)
56
-	encryptor.XORKeyStream(encrypted, *clientFrame)
57
-	copy(encrypted[:56], (*clientFrame)[:56])
56
+	encryptor.XORKeyStream(encrypted, clientFrame)
57
+	copy(encrypted[:56], clientFrame[:56])
58 58
 
59 59
 	invertedClientFrame := clientFrame.Invert()
60 60
 	clientHasher = sha256.New()
@@ -63,7 +63,7 @@ func TestObfs2Full(t *testing.T) {
63 63
 	invertedClientKey := clientHasher.Sum(nil)
64 64
 	clientDecryptor := makeStreamCipher(invertedClientKey, invertedClientFrame.IV())
65 65
 
66
-	clientObfs, _, err := ParseObfuscated2ClientFrame(secret, &encrypted)
66
+	clientObfs, _, err := ParseObfuscated2ClientFrame(secret, encrypted)
67 67
 	assert.Nil(t, err)
68 68
 
69 69
 	connOpts := &mtproto.ConnectionOpts{
@@ -73,7 +73,7 @@ func TestObfs2Full(t *testing.T) {
73 73
 	tgObfs, tgFrame := MakeTelegramObfuscated2Frame(connOpts)
74 74
 	tgDecryptor := makeStreamCipher(tgFrame.Key(), tgFrame.IV())
75 75
 	decrypted := make(Frame, FrameLen)
76
-	tgDecryptor.XORKeyStream(decrypted, *tgFrame)
76
+	tgDecryptor.XORKeyStream(decrypted, tgFrame)
77 77
 	_, err = decrypted.ConnectionType()
78 78
 	assert.Nil(t, err)
79 79
 

+ 1
- 2
telegram/direct.go Voir le fichier

@@ -46,9 +46,8 @@ func (t *directTelegram) Dial(connOpts *mtproto.ConnectionOpts) (io.ReadWriteClo
46 46
 
47 47
 func (t *directTelegram) Init(connOpts *mtproto.ConnectionOpts, conn io.ReadWriteCloser) (io.ReadWriteCloser, error) {
48 48
 	obfs2, frame := obfuscated2.MakeTelegramObfuscated2Frame(connOpts)
49
-	defer obfuscated2.ReturnFrame(frame)
50 49
 
51
-	if n, err := conn.Write(*frame); err != nil || n != len(*frame) {
50
+	if n, err := conn.Write(frame); err != nil || n != obfuscated2.FrameLen {
52 51
 		return nil, errors.Annotate(err, "Cannot write hadnshake frame")
53 52
 	}
54 53
 

Chargement…
Annuler
Enregistrer