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

Integrate new fake package and doppel into proxy

tags/v2.2.0^2^2
9seconds 1 месяц назад
Родитель
Сommit
bb49c6a55d

+ 9
- 5
mtglib/internal/tls/fake/client_side.go Просмотреть файл

12
 	"slices"
12
 	"slices"
13
 	"time"
13
 	"time"
14
 
14
 
15
-	"github.com/9seconds/mtg/v2/mtglib"
16
 	"github.com/9seconds/mtg/v2/mtglib/internal/tls"
15
 	"github.com/9seconds/mtg/v2/mtglib/internal/tls"
17
 )
16
 )
18
 
17
 
37
 	CipherSuite uint16
36
 	CipherSuite uint16
38
 }
37
 }
39
 
38
 
40
-func ReadClientHello(conn net.Conn, secret mtglib.Secret, tolerateTimeSkewness time.Duration) (*ClientHello, error) {
39
+func ReadClientHello(
40
+	conn net.Conn,
41
+	secret []byte,
42
+	hostname string,
43
+	tolerateTimeSkewness time.Duration,
44
+) (*ClientHello, error) {
41
 	if err := conn.SetReadDeadline(time.Now().Add(ClientHelloReadTimeout)); err != nil {
45
 	if err := conn.SetReadDeadline(time.Now().Add(ClientHelloReadTimeout)); err != nil {
42
 		return nil, fmt.Errorf("cannot set read deadline: %w", err)
46
 		return nil, fmt.Errorf("cannot set read deadline: %w", err)
43
 	}
47
 	}
75
 		return nil, fmt.Errorf("cannot parse SNI: %w", err)
79
 		return nil, fmt.Errorf("cannot parse SNI: %w", err)
76
 	}
80
 	}
77
 
81
 
78
-	if !slices.Contains(sniHostnames, secret.Host) {
79
-		return nil, fmt.Errorf("cannot find %s in %v", secret.Host, sniHostnames)
82
+	if !slices.Contains(sniHostnames, hostname) {
83
+		return nil, fmt.Errorf("cannot find %s in %v", hostname, sniHostnames)
80
 	}
84
 	}
81
 
85
 
82
-	digest := hmac.New(sha256.New, secret.Key[:])
86
+	digest := hmac.New(sha256.New, secret)
83
 	// we write a copy of the handshake with client random all nullified.
87
 	// we write a copy of the handshake with client random all nullified.
84
 	digest.Write(handshakeCopyBuf.Next(RandomOffset))
88
 	digest.Write(handshakeCopyBuf.Next(RandomOffset))
85
 	handshakeCopyBuf.Next(RandomLen)
89
 	handshakeCopyBuf.Next(RandomLen)

+ 1
- 1
mtglib/internal/tls/fake/client_side_fuzz_test.go Просмотреть файл

42
 			Twice().
42
 			Twice().
43
 			Return(nil)
43
 			Return(nil)
44
 
44
 
45
-		_, err := fake.ReadClientHello(r, secret, time.Hour)
45
+		_, err := fake.ReadClientHello(r, secret.Key[:], secret.Host, time.Hour)
46
 		assert.Error(t, err)
46
 		assert.Error(t, err)
47
 	})
47
 	})
48
 
48
 

+ 12
- 2
mtglib/internal/tls/fake/client_side_snapshot_test.go Просмотреть файл

100
 			connMock := suite.makeConn(snapshot.GetFull())
100
 			connMock := suite.makeConn(snapshot.GetFull())
101
 			defer connMock.AssertExpectations(t)
101
 			defer connMock.AssertExpectations(t)
102
 
102
 
103
-			hello, err := fake.ReadClientHello(connMock, suite.secret, TolerateTime)
103
+			hello, err := fake.ReadClientHello(
104
+				connMock,
105
+				suite.secret.Key[:],
106
+				suite.secret.Host,
107
+				TolerateTime,
108
+			)
104
 			require.NoError(t, err)
109
 			require.NoError(t, err)
105
 
110
 
106
 			assert.Equal(t, snapshot.GetRandom(), hello.Random[:])
111
 			assert.Equal(t, snapshot.GetRandom(), hello.Random[:])
131
 			connMock := suite.makeConn(snapshot.GetFull())
136
 			connMock := suite.makeConn(snapshot.GetFull())
132
 			defer connMock.AssertExpectations(t)
137
 			defer connMock.AssertExpectations(t)
133
 
138
 
134
-			_, err = fake.ReadClientHello(connMock, suite.secret, TolerateTime)
139
+			_, err = fake.ReadClientHello(
140
+				connMock,
141
+				suite.secret.Key[:],
142
+				suite.secret.Host,
143
+				TolerateTime,
144
+			)
135
 			assert.ErrorIs(t, err, fake.ErrBadDigest)
145
 			assert.ErrorIs(t, err, fake.ErrBadDigest)
136
 		})
146
 		})
137
 	}
147
 	}

+ 27
- 27
mtglib/internal/tls/fake/client_side_test.go Просмотреть файл

73
 		Once().
73
 		Once().
74
 		Return(errors.New("fail"))
74
 		Return(errors.New("fail"))
75
 
75
 
76
-	_, err := fake.ReadClientHello(suite.connMock, suite.secret, TolerateTime)
76
+	_, err := fake.ReadClientHello(suite.connMock, suite.secret.Key[:], suite.secret.Host, TolerateTime)
77
 	suite.ErrorContains(err, "fail")
77
 	suite.ErrorContains(err, "fail")
78
 }
78
 }
79
 
79
 
84
 		Twice().
84
 		Twice().
85
 		Return(nil)
85
 		Return(nil)
86
 
86
 
87
-	_, err := fake.ReadClientHello(suite.connMock, suite.secret, TolerateTime)
87
+	_, err := fake.ReadClientHello(suite.connMock, suite.secret.Key[:], suite.secret.Host, TolerateTime)
88
 	suite.ErrorIs(err, io.EOF)
88
 	suite.ErrorIs(err, io.EOF)
89
 }
89
 }
90
 
90
 
96
 	})
96
 	})
97
 	suite.readBuf.WriteByte(10)
97
 	suite.readBuf.WriteByte(10)
98
 
98
 
99
-	_, err := fake.ReadClientHello(suite.connMock, suite.secret, TolerateTime)
99
+	_, err := fake.ReadClientHello(suite.connMock, suite.secret.Key[:], suite.secret.Host, TolerateTime)
100
 	suite.ErrorContains(err, "unexpected record type 0xa")
100
 	suite.ErrorContains(err, "unexpected record type 0xa")
101
 }
101
 }
102
 
102
 
107
 		0, 0,
107
 		0, 0,
108
 	})
108
 	})
109
 
109
 
110
-	_, err := fake.ReadClientHello(suite.connMock, suite.secret, TolerateTime)
110
+	_, err := fake.ReadClientHello(suite.connMock, suite.secret.Key[:], suite.secret.Host, TolerateTime)
111
 	suite.ErrorContains(err, "unexpected protocol version")
111
 	suite.ErrorContains(err, "unexpected protocol version")
112
 }
112
 }
113
 
113
 
118
 		0, 10,
118
 		0, 10,
119
 	})
119
 	})
120
 
120
 
121
-	_, err := fake.ReadClientHello(suite.connMock, suite.secret, TolerateTime)
121
+	_, err := fake.ReadClientHello(suite.connMock, suite.secret.Key[:], suite.secret.Host, TolerateTime)
122
 	suite.ErrorIs(err, io.EOF)
122
 	suite.ErrorIs(err, io.EOF)
123
 }
123
 }
124
 
124
 
142
 		10,
142
 		10,
143
 	})
143
 	})
144
 
144
 
145
-	_, err := fake.ReadClientHello(suite.connMock, suite.secret, TolerateTime)
145
+	_, err := fake.ReadClientHello(suite.connMock, suite.secret.Key[:], suite.secret.Host, TolerateTime)
146
 	suite.ErrorContains(err, "cannot read handshake header")
146
 	suite.ErrorContains(err, "cannot read handshake header")
147
 }
147
 }
148
 
148
 
152
 		10, 0, 0, 0,
152
 		10, 0, 0, 0,
153
 	})
153
 	})
154
 
154
 
155
-	_, err := fake.ReadClientHello(suite.connMock, suite.secret, TolerateTime)
155
+	_, err := fake.ReadClientHello(suite.connMock, suite.secret.Key[:], suite.secret.Host, TolerateTime)
156
 	suite.ErrorContains(err, "incorrect handshake type")
156
 	suite.ErrorContains(err, "incorrect handshake type")
157
 }
157
 }
158
 
158
 
162
 		10, 0, 0, 0,
162
 		10, 0, 0, 0,
163
 	})
163
 	})
164
 
164
 
165
-	_, err := fake.ReadClientHello(suite.connMock, suite.secret, TolerateTime)
165
+	_, err := fake.ReadClientHello(suite.connMock, suite.secret.Key[:], suite.secret.Host, TolerateTime)
166
 	suite.ErrorIs(err, io.EOF)
166
 	suite.ErrorIs(err, io.EOF)
167
 }
167
 }
168
 
168
 
192
 func (suite *ParseClientHelloHandshakeBodyTestSuite) TestCannotReadVersion() {
192
 func (suite *ParseClientHelloHandshakeBodyTestSuite) TestCannotReadVersion() {
193
 	suite.writeBody(nil)
193
 	suite.writeBody(nil)
194
 
194
 
195
-	_, err := fake.ReadClientHello(suite.connMock, suite.secret, TolerateTime)
195
+	_, err := fake.ReadClientHello(suite.connMock, suite.secret.Key[:], suite.secret.Host, TolerateTime)
196
 	suite.ErrorContains(err, "cannot read client version")
196
 	suite.ErrorContains(err, "cannot read client version")
197
 }
197
 }
198
 
198
 
199
 func (suite *ParseClientHelloHandshakeBodyTestSuite) TestCannotReadRandom() {
199
 func (suite *ParseClientHelloHandshakeBodyTestSuite) TestCannotReadRandom() {
200
 	suite.writeBody([]byte{3, 3})
200
 	suite.writeBody([]byte{3, 3})
201
 
201
 
202
-	_, err := fake.ReadClientHello(suite.connMock, suite.secret, TolerateTime)
202
+	_, err := fake.ReadClientHello(suite.connMock, suite.secret.Key[:], suite.secret.Host, TolerateTime)
203
 	suite.ErrorContains(err, "cannot read client random")
203
 	suite.ErrorContains(err, "cannot read client random")
204
 }
204
 }
205
 
205
 
208
 
208
 
209
 	suite.writeBody(body)
209
 	suite.writeBody(body)
210
 
210
 
211
-	_, err := fake.ReadClientHello(suite.connMock, suite.secret, TolerateTime)
211
+	_, err := fake.ReadClientHello(suite.connMock, suite.secret.Key[:], suite.secret.Host, TolerateTime)
212
 	suite.ErrorContains(err, "cannot read session ID length")
212
 	suite.ErrorContains(err, "cannot read session ID length")
213
 }
213
 }
214
 
214
 
218
 
218
 
219
 	suite.writeBody(body)
219
 	suite.writeBody(body)
220
 
220
 
221
-	_, err := fake.ReadClientHello(suite.connMock, suite.secret, TolerateTime)
221
+	_, err := fake.ReadClientHello(suite.connMock, suite.secret.Key[:], suite.secret.Host, TolerateTime)
222
 	suite.ErrorContains(err, "cannot read session id")
222
 	suite.ErrorContains(err, "cannot read session id")
223
 }
223
 }
224
 
224
 
227
 
227
 
228
 	suite.writeBody(body)
228
 	suite.writeBody(body)
229
 
229
 
230
-	_, err := fake.ReadClientHello(suite.connMock, suite.secret, TolerateTime)
230
+	_, err := fake.ReadClientHello(suite.connMock, suite.secret.Key[:], suite.secret.Host, TolerateTime)
231
 	suite.ErrorContains(err, "cannot read cipher suite length")
231
 	suite.ErrorContains(err, "cannot read cipher suite length")
232
 }
232
 }
233
 
233
 
236
 
236
 
237
 	suite.writeBody(body)
237
 	suite.writeBody(body)
238
 
238
 
239
-	_, err := fake.ReadClientHello(suite.connMock, suite.secret, TolerateTime)
239
+	_, err := fake.ReadClientHello(suite.connMock, suite.secret.Key[:], suite.secret.Host, TolerateTime)
240
 	suite.ErrorContains(err, "cannot read first cipher suite")
240
 	suite.ErrorContains(err, "cannot read first cipher suite")
241
 }
241
 }
242
 
242
 
246
 
246
 
247
 	suite.writeBody(body)
247
 	suite.writeBody(body)
248
 
248
 
249
-	_, err := fake.ReadClientHello(suite.connMock, suite.secret, TolerateTime)
249
+	_, err := fake.ReadClientHello(suite.connMock, suite.secret.Key[:], suite.secret.Host, TolerateTime)
250
 	suite.ErrorContains(err, "cannot skip remaining cipher suites")
250
 	suite.ErrorContains(err, "cannot skip remaining cipher suites")
251
 }
251
 }
252
 
252
 
256
 
256
 
257
 	suite.writeBody(body)
257
 	suite.writeBody(body)
258
 
258
 
259
-	_, err := fake.ReadClientHello(suite.connMock, suite.secret, TolerateTime)
259
+	_, err := fake.ReadClientHello(suite.connMock, suite.secret.Key[:], suite.secret.Host, TolerateTime)
260
 	suite.ErrorContains(err, "cannot read compression methods length")
260
 	suite.ErrorContains(err, "cannot read compression methods length")
261
 }
261
 }
262
 
262
 
267
 
267
 
268
 	suite.writeBody(body)
268
 	suite.writeBody(body)
269
 
269
 
270
-	_, err := fake.ReadClientHello(suite.connMock, suite.secret, TolerateTime)
270
+	_, err := fake.ReadClientHello(suite.connMock, suite.secret.Key[:], suite.secret.Host, TolerateTime)
271
 	suite.ErrorContains(err, "cannot skip compression methods")
271
 	suite.ErrorContains(err, "cannot skip compression methods")
272
 }
272
 }
273
 
273
 
307
 func (suite *ParseClientHelloSNITestSuite) TestCannotReadExtensionsLength() {
307
 func (suite *ParseClientHelloSNITestSuite) TestCannotReadExtensionsLength() {
308
 	suite.writeExtensions(nil)
308
 	suite.writeExtensions(nil)
309
 
309
 
310
-	_, err := fake.ReadClientHello(suite.connMock, suite.secret, TolerateTime)
310
+	_, err := fake.ReadClientHello(suite.connMock, suite.secret.Key[:], suite.secret.Host, TolerateTime)
311
 	suite.ErrorContains(err, "cannot read length of TLS extensions")
311
 	suite.ErrorContains(err, "cannot read length of TLS extensions")
312
 }
312
 }
313
 
313
 
314
 func (suite *ParseClientHelloSNITestSuite) TestCannotReadExtensions() {
314
 func (suite *ParseClientHelloSNITestSuite) TestCannotReadExtensions() {
315
 	suite.writeExtensions([]byte{0, 10})
315
 	suite.writeExtensions([]byte{0, 10})
316
 
316
 
317
-	_, err := fake.ReadClientHello(suite.connMock, suite.secret, TolerateTime)
317
+	_, err := fake.ReadClientHello(suite.connMock, suite.secret.Key[:], suite.secret.Host, TolerateTime)
318
 	suite.ErrorContains(err, "cannot read extensions")
318
 	suite.ErrorContains(err, "cannot read extensions")
319
 }
319
 }
320
 
320
 
321
 func (suite *ParseClientHelloSNITestSuite) TestCannotReadExtensionType() {
321
 func (suite *ParseClientHelloSNITestSuite) TestCannotReadExtensionType() {
322
 	suite.writeExtensions([]byte{0, 1, 0xAB})
322
 	suite.writeExtensions([]byte{0, 1, 0xAB})
323
 
323
 
324
-	_, err := fake.ReadClientHello(suite.connMock, suite.secret, TolerateTime)
324
+	_, err := fake.ReadClientHello(suite.connMock, suite.secret.Key[:], suite.secret.Host, TolerateTime)
325
 	suite.ErrorContains(err, "cannot read extension type")
325
 	suite.ErrorContains(err, "cannot read extension type")
326
 }
326
 }
327
 
327
 
328
 func (suite *ParseClientHelloSNITestSuite) TestCannotReadExtensionLength() {
328
 func (suite *ParseClientHelloSNITestSuite) TestCannotReadExtensionLength() {
329
 	suite.writeExtensions([]byte{0, 2, 0xFF, 0xFF})
329
 	suite.writeExtensions([]byte{0, 2, 0xFF, 0xFF})
330
 
330
 
331
-	_, err := fake.ReadClientHello(suite.connMock, suite.secret, TolerateTime)
331
+	_, err := fake.ReadClientHello(suite.connMock, suite.secret.Key[:], suite.secret.Host, TolerateTime)
332
 	suite.ErrorContains(err, "length:")
332
 	suite.ErrorContains(err, "length:")
333
 }
333
 }
334
 
334
 
335
 func (suite *ParseClientHelloSNITestSuite) TestCannotReadExtensionData() {
335
 func (suite *ParseClientHelloSNITestSuite) TestCannotReadExtensionData() {
336
 	suite.writeExtensions([]byte{0, 4, 0xFF, 0xFF, 0, 5})
336
 	suite.writeExtensions([]byte{0, 4, 0xFF, 0xFF, 0, 5})
337
 
337
 
338
-	_, err := fake.ReadClientHello(suite.connMock, suite.secret, TolerateTime)
338
+	_, err := fake.ReadClientHello(suite.connMock, suite.secret.Key[:], suite.secret.Host, TolerateTime)
339
 	suite.ErrorContains(err, "data: len")
339
 	suite.ErrorContains(err, "data: len")
340
 }
340
 }
341
 
341
 
342
 func (suite *ParseClientHelloSNITestSuite) TestCannotReadSNIRecordLength() {
342
 func (suite *ParseClientHelloSNITestSuite) TestCannotReadSNIRecordLength() {
343
 	suite.writeExtensions([]byte{0, 5, 0, 0, 0, 1, 0xAB})
343
 	suite.writeExtensions([]byte{0, 5, 0, 0, 0, 1, 0xAB})
344
 
344
 
345
-	_, err := fake.ReadClientHello(suite.connMock, suite.secret, TolerateTime)
345
+	_, err := fake.ReadClientHello(suite.connMock, suite.secret.Key[:], suite.secret.Host, TolerateTime)
346
 	suite.ErrorContains(err, "cannot read the length of the SNI record")
346
 	suite.ErrorContains(err, "cannot read the length of the SNI record")
347
 }
347
 }
348
 
348
 
349
 func (suite *ParseClientHelloSNITestSuite) TestCannotReadSNIListType() {
349
 func (suite *ParseClientHelloSNITestSuite) TestCannotReadSNIListType() {
350
 	suite.writeExtensions([]byte{0, 6, 0, 0, 0, 2, 0, 1})
350
 	suite.writeExtensions([]byte{0, 6, 0, 0, 0, 2, 0, 1})
351
 
351
 
352
-	_, err := fake.ReadClientHello(suite.connMock, suite.secret, TolerateTime)
352
+	_, err := fake.ReadClientHello(suite.connMock, suite.secret.Key[:], suite.secret.Host, TolerateTime)
353
 	suite.ErrorContains(err, "cannot read SNI list type")
353
 	suite.ErrorContains(err, "cannot read SNI list type")
354
 }
354
 }
355
 
355
 
356
 func (suite *ParseClientHelloSNITestSuite) TestIncorrectSNIListType() {
356
 func (suite *ParseClientHelloSNITestSuite) TestIncorrectSNIListType() {
357
 	suite.writeExtensions([]byte{0, 7, 0, 0, 0, 3, 0, 1, 5})
357
 	suite.writeExtensions([]byte{0, 7, 0, 0, 0, 3, 0, 1, 5})
358
 
358
 
359
-	_, err := fake.ReadClientHello(suite.connMock, suite.secret, TolerateTime)
359
+	_, err := fake.ReadClientHello(suite.connMock, suite.secret.Key[:], suite.secret.Host, TolerateTime)
360
 	suite.ErrorContains(err, "incorrect SNI list type")
360
 	suite.ErrorContains(err, "incorrect SNI list type")
361
 }
361
 }
362
 
362
 
363
 func (suite *ParseClientHelloSNITestSuite) TestCannotReadHostnameLength() {
363
 func (suite *ParseClientHelloSNITestSuite) TestCannotReadHostnameLength() {
364
 	suite.writeExtensions([]byte{0, 8, 0, 0, 0, 4, 0, 2, 0, 0xAB})
364
 	suite.writeExtensions([]byte{0, 8, 0, 0, 0, 4, 0, 2, 0, 0xAB})
365
 
365
 
366
-	_, err := fake.ReadClientHello(suite.connMock, suite.secret, TolerateTime)
366
+	_, err := fake.ReadClientHello(suite.connMock, suite.secret.Key[:], suite.secret.Host, TolerateTime)
367
 	suite.ErrorContains(err, "incorrect length of the hostname")
367
 	suite.ErrorContains(err, "incorrect length of the hostname")
368
 }
368
 }
369
 
369
 
370
 func (suite *ParseClientHelloSNITestSuite) TestCannotReadHostname() {
370
 func (suite *ParseClientHelloSNITestSuite) TestCannotReadHostname() {
371
 	suite.writeExtensions([]byte{0, 9, 0, 0, 0, 5, 0, 3, 0, 0, 5})
371
 	suite.writeExtensions([]byte{0, 9, 0, 0, 0, 5, 0, 3, 0, 0, 5})
372
 
372
 
373
-	_, err := fake.ReadClientHello(suite.connMock, suite.secret, TolerateTime)
373
+	_, err := fake.ReadClientHello(suite.connMock, suite.secret.Key[:], suite.secret.Host, TolerateTime)
374
 	suite.ErrorContains(err, "incorrect length of SNI hostname")
374
 	suite.ErrorContains(err, "incorrect length of SNI hostname")
375
 }
375
 }
376
 
376
 

+ 2
- 3
mtglib/internal/tls/fake/server_side.go Просмотреть файл

8
 	"encoding/binary"
8
 	"encoding/binary"
9
 	"io"
9
 	"io"
10
 
10
 
11
-	"github.com/9seconds/mtg/v2/mtglib"
12
 	"github.com/9seconds/mtg/v2/mtglib/internal/tls"
11
 	"github.com/9seconds/mtg/v2/mtglib/internal/tls"
13
 	"golang.org/x/crypto/curve25519"
12
 	"golang.org/x/crypto/curve25519"
14
 )
13
 )
35
 	}
34
 	}
36
 )
35
 )
37
 
36
 
38
-func SendServerHello(w io.Writer, secret mtglib.Secret, clientHello *ClientHello) ([]byte, error) {
37
+func SendServerHello(w io.Writer, secret []byte, clientHello *ClientHello) ([]byte, error) {
39
 	buf := &bytes.Buffer{}
38
 	buf := &bytes.Buffer{}
40
 	buf.Grow(tls.MaxRecordSize)
39
 	buf.Grow(tls.MaxRecordSize)
41
 
40
 
46
 	generateNoise(noise)
45
 	generateNoise(noise)
47
 
46
 
48
 	packet := buf.Bytes()
47
 	packet := buf.Bytes()
49
-	digest := hmac.New(sha256.New, secret.Key[:])
48
+	digest := hmac.New(sha256.New, secret)
50
 
49
 
51
 	digest.Write(clientHello.Random[:])
50
 	digest.Write(clientHello.Random[:])
52
 	digest.Write(packet)
51
 	digest.Write(packet)

+ 4
- 4
mtglib/internal/tls/fake/server_side_test.go Просмотреть файл

38
 }
38
 }
39
 
39
 
40
 func (suite *SendServerHelloTestSuite) TestRecordStructure() {
40
 func (suite *SendServerHelloTestSuite) TestRecordStructure() {
41
-	noise, err := fake.SendServerHello(suite.buf, suite.secret, suite.hello)
41
+	noise, err := fake.SendServerHello(suite.buf, suite.secret.Key[:], suite.hello)
42
 	suite.NoError(err)
42
 	suite.NoError(err)
43
 
43
 
44
 	var rec bytes.Buffer
44
 	var rec bytes.Buffer
65
 }
65
 }
66
 
66
 
67
 func (suite *SendServerHelloTestSuite) TestHMAC() {
67
 func (suite *SendServerHelloTestSuite) TestHMAC() {
68
-	noise, err := fake.SendServerHello(suite.buf, suite.secret, suite.hello)
68
+	noise, err := fake.SendServerHello(suite.buf, suite.secret.Key[:], suite.hello)
69
 	suite.NoError(err)
69
 	suite.NoError(err)
70
 
70
 
71
 	packet := make([]byte, suite.buf.Len())
71
 	packet := make([]byte, suite.buf.Len())
84
 }
84
 }
85
 
85
 
86
 func (suite *SendServerHelloTestSuite) TestHandshakePayload() {
86
 func (suite *SendServerHelloTestSuite) TestHandshakePayload() {
87
-	_, err := fake.SendServerHello(suite.buf, suite.secret, suite.hello)
87
+	_, err := fake.SendServerHello(suite.buf, suite.secret.Key[:], suite.hello)
88
 	suite.NoError(err)
88
 	suite.NoError(err)
89
 
89
 
90
 	packet := suite.buf.Bytes()
90
 	packet := suite.buf.Bytes()
106
 }
106
 }
107
 
107
 
108
 func (suite *SendServerHelloTestSuite) TestChangeCipherSpec() {
108
 func (suite *SendServerHelloTestSuite) TestChangeCipherSpec() {
109
-	_, err := fake.SendServerHello(suite.buf, suite.secret, suite.hello)
109
+	_, err := fake.SendServerHello(suite.buf, suite.secret.Key[:], suite.hello)
110
 	suite.NoError(err)
110
 	suite.NoError(err)
111
 
111
 
112
 	// Skip first record
112
 	// Skip first record

+ 20
- 31
mtglib/proxy.go Просмотреть файл

11
 
11
 
12
 	"github.com/9seconds/mtg/v2/essentials"
12
 	"github.com/9seconds/mtg/v2/essentials"
13
 	"github.com/9seconds/mtg/v2/mtglib/internal/dc"
13
 	"github.com/9seconds/mtg/v2/mtglib/internal/dc"
14
-	"github.com/9seconds/mtg/v2/mtglib/internal/faketls"
15
-	"github.com/9seconds/mtg/v2/mtglib/internal/faketls/record"
14
+	"github.com/9seconds/mtg/v2/mtglib/internal/doppel"
16
 	"github.com/9seconds/mtg/v2/mtglib/internal/obfuscation"
15
 	"github.com/9seconds/mtg/v2/mtglib/internal/obfuscation"
17
 	"github.com/9seconds/mtg/v2/mtglib/internal/relay"
16
 	"github.com/9seconds/mtg/v2/mtglib/internal/relay"
17
+	"github.com/9seconds/mtg/v2/mtglib/internal/tls"
18
+	"github.com/9seconds/mtg/v2/mtglib/internal/tls/fake"
18
 	"github.com/panjf2000/ants/v2"
19
 	"github.com/panjf2000/ants/v2"
19
 )
20
 )
20
 
21
 
32
 	workerPool                  *ants.PoolWithFunc
33
 	workerPool                  *ants.PoolWithFunc
33
 	telegram                    *dc.Telegram
34
 	telegram                    *dc.Telegram
34
 	configUpdater               *dc.PublicConfigUpdater
35
 	configUpdater               *dc.PublicConfigUpdater
36
+	doppelGanger                *doppel.Ganger
35
 	clientObfuscatror           obfuscation.Obfuscator
37
 	clientObfuscatror           obfuscation.Obfuscator
36
 
38
 
37
 	secret          Secret
39
 	secret          Secret
161
 }
163
 }
162
 
164
 
163
 func (p *Proxy) doFakeTLSHandshake(ctx *streamContext) bool {
165
 func (p *Proxy) doFakeTLSHandshake(ctx *streamContext) bool {
164
-	rec := record.AcquireRecord()
165
-	defer record.ReleaseRecord(rec)
166
-
167
 	rewind := newConnRewind(ctx.clientConn)
166
 	rewind := newConnRewind(ctx.clientConn)
168
 
167
 
169
-	if err := rec.Read(rewind); err != nil {
170
-		p.logger.InfoError("cannot read client hello", err)
171
-		p.doDomainFronting(ctx, rewind)
172
-
173
-		return false
174
-	}
175
-
176
-	hello, err := faketls.ParseClientHello(p.secret.Key[:], rec.Payload.Bytes())
168
+	clientHello, err := fake.ReadClientHello(
169
+		rewind,
170
+		p.secret.Key[:],
171
+		p.secret.Host,
172
+		p.tolerateTimeSkewness,
173
+	)
177
 	if err != nil {
174
 	if err != nil {
178
-		p.logger.InfoError("cannot parse client hello", err)
179
-		p.doDomainFronting(ctx, rewind)
180
-
181
-		return false
182
-	}
183
-
184
-	if err := hello.Valid(p.secret.Host, p.tolerateTimeSkewness); err != nil {
185
-		p.logger.
186
-			BindStr("hostname", hello.Host).
187
-			BindStr("hello-time", hello.Time.String()).
188
-			InfoError("invalid faketls client hello", err)
175
+		p.logger.InfoError("cannot read client hello", err)
189
 		p.doDomainFronting(ctx, rewind)
176
 		p.doDomainFronting(ctx, rewind)
190
-
191
 		return false
177
 		return false
192
 	}
178
 	}
193
 
179
 
194
-	if p.antiReplayCache.SeenBefore(hello.SessionID) {
180
+	if p.antiReplayCache.SeenBefore(clientHello.SessionID) {
195
 		p.logger.Warning("replay attack has been detected!")
181
 		p.logger.Warning("replay attack has been detected!")
196
 		p.eventStream.Send(p.ctx, NewEventReplayAttack(ctx.streamID))
182
 		p.eventStream.Send(p.ctx, NewEventReplayAttack(ctx.streamID))
197
 		p.doDomainFronting(ctx, rewind)
183
 		p.doDomainFronting(ctx, rewind)
198
-
199
 		return false
184
 		return false
200
 	}
185
 	}
201
 
186
 
202
-	if err := faketls.SendWelcomePacket(rewind, p.secret.Key[:], hello); err != nil {
187
+	_, err = fake.SendServerHello(ctx.clientConn, p.secret.Key[:], clientHello)
188
+	if err != nil {
203
 		p.logger.InfoError("cannot send welcome packet", err)
189
 		p.logger.InfoError("cannot send welcome packet", err)
204
-
205
 		return false
190
 		return false
206
 	}
191
 	}
207
 
192
 
208
-	ctx.clientConn = &faketls.Conn{
209
-		Conn: ctx.clientConn,
193
+	ctx.clientConn = tls.New(ctx.clientConn, true, true)
194
+
195
+	ctx.clientConn, err = p.doppelGanger.NewConn(ctx.clientConn)
196
+	if err != nil {
197
+		p.logger.WarningError("cannot create connection", err)
198
+		return false
210
 	}
199
 	}
211
 
200
 
212
 	return true
201
 	return true

+ 1
- 12
network/v2/http.go Просмотреть файл

1
 package network
1
 package network
2
 
2
 
3
-import (
4
-	"crypto/tls"
5
-	"net/http"
6
-)
3
+import "net/http"
7
 
4
 
8
 type networkHTTPTransport struct {
5
 type networkHTTPTransport struct {
9
 	userAgent string
6
 	userAgent string
15
 
12
 
16
 	return n.next.RoundTrip(req) //nolint: wrapcheck
13
 	return n.next.RoundTrip(req) //nolint: wrapcheck
17
 }
14
 }
18
-
19
-func (n networkHTTPTransport) TrustTLS() {
20
-	tr := n.next.(*http.Transport)
21
-	if tr.TLSClientConfig == nil {
22
-		tr.TLSClientConfig = &tls.Config{}
23
-	}
24
-	tr.TLSClientConfig.InsecureSkipVerify = true
25
-}

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