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

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,7 +12,6 @@ import (
12 12
 	"slices"
13 13
 	"time"
14 14
 
15
-	"github.com/9seconds/mtg/v2/mtglib"
16 15
 	"github.com/9seconds/mtg/v2/mtglib/internal/tls"
17 16
 )
18 17
 
@@ -37,7 +36,12 @@ type ClientHello struct {
37 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 45
 	if err := conn.SetReadDeadline(time.Now().Add(ClientHelloReadTimeout)); err != nil {
42 46
 		return nil, fmt.Errorf("cannot set read deadline: %w", err)
43 47
 	}
@@ -75,11 +79,11 @@ func ReadClientHello(conn net.Conn, secret mtglib.Secret, tolerateTimeSkewness t
75 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 87
 	// we write a copy of the handshake with client random all nullified.
84 88
 	digest.Write(handshakeCopyBuf.Next(RandomOffset))
85 89
 	handshakeCopyBuf.Next(RandomLen)

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

@@ -42,7 +42,7 @@ func FuzzReadClientHello(f *testing.F) {
42 42
 			Twice().
43 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 46
 		assert.Error(t, err)
47 47
 	})
48 48
 

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

@@ -100,7 +100,12 @@ func (suite *ParseClientHelloSnapshotTestSuite) TestSnapshotOk() {
100 100
 			connMock := suite.makeConn(snapshot.GetFull())
101 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 109
 			require.NoError(t, err)
105 110
 
106 111
 			assert.Equal(t, snapshot.GetRandom(), hello.Random[:])
@@ -131,7 +136,12 @@ func (suite *ParseClientHelloSnapshotTestSuite) TestSnapshotBad() {
131 136
 			connMock := suite.makeConn(snapshot.GetFull())
132 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 145
 			assert.ErrorIs(t, err, fake.ErrBadDigest)
136 146
 		})
137 147
 	}

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

@@ -73,7 +73,7 @@ func (suite *ParseClientHello_TLSHeaderTestSuite) TestEmpty() {
73 73
 		Once().
74 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 77
 	suite.ErrorContains(err, "fail")
78 78
 }
79 79
 
@@ -84,7 +84,7 @@ func (suite *ParseClientHello_TLSHeaderTestSuite) TestNothing() {
84 84
 		Twice().
85 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 88
 	suite.ErrorIs(err, io.EOF)
89 89
 }
90 90
 
@@ -96,7 +96,7 @@ func (suite *ParseClientHello_TLSHeaderTestSuite) TestUnknownRecord() {
96 96
 	})
97 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 100
 	suite.ErrorContains(err, "unexpected record type 0xa")
101 101
 }
102 102
 
@@ -107,7 +107,7 @@ func (suite *ParseClientHello_TLSHeaderTestSuite) TestUnknownProtocolVersion() {
107 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 111
 	suite.ErrorContains(err, "unexpected protocol version")
112 112
 }
113 113
 
@@ -118,7 +118,7 @@ func (suite *ParseClientHello_TLSHeaderTestSuite) TestCannotReadRestOfRecord() {
118 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 122
 	suite.ErrorIs(err, io.EOF)
123 123
 }
124 124
 
@@ -142,7 +142,7 @@ func (suite *ParseClientHelloHandshakeTestSuite) TestCannotReadHeader() {
142 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 146
 	suite.ErrorContains(err, "cannot read handshake header")
147 147
 }
148 148
 
@@ -152,7 +152,7 @@ func (suite *ParseClientHelloHandshakeTestSuite) TestIncorrectHandshakeType() {
152 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 156
 	suite.ErrorContains(err, "incorrect handshake type")
157 157
 }
158 158
 
@@ -162,7 +162,7 @@ func (suite *ParseClientHelloHandshakeTestSuite) TestCannotReadHandshake() {
162 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 166
 	suite.ErrorIs(err, io.EOF)
167 167
 }
168 168
 
@@ -192,14 +192,14 @@ func (suite *ParseClientHelloHandshakeBodyTestSuite) writeBody(body []byte) {
192 192
 func (suite *ParseClientHelloHandshakeBodyTestSuite) TestCannotReadVersion() {
193 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 196
 	suite.ErrorContains(err, "cannot read client version")
197 197
 }
198 198
 
199 199
 func (suite *ParseClientHelloHandshakeBodyTestSuite) TestCannotReadRandom() {
200 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 203
 	suite.ErrorContains(err, "cannot read client random")
204 204
 }
205 205
 
@@ -208,7 +208,7 @@ func (suite *ParseClientHelloHandshakeBodyTestSuite) TestCannotReadSessionIDLeng
208 208
 
209 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 212
 	suite.ErrorContains(err, "cannot read session ID length")
213 213
 }
214 214
 
@@ -218,7 +218,7 @@ func (suite *ParseClientHelloHandshakeBodyTestSuite) TestCannotReadSessionID() {
218 218
 
219 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 222
 	suite.ErrorContains(err, "cannot read session id")
223 223
 }
224 224
 
@@ -227,7 +227,7 @@ func (suite *ParseClientHelloHandshakeBodyTestSuite) TestCannotReadCipherSuiteLe
227 227
 
228 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 231
 	suite.ErrorContains(err, "cannot read cipher suite length")
232 232
 }
233 233
 
@@ -236,7 +236,7 @@ func (suite *ParseClientHelloHandshakeBodyTestSuite) TestCannotReadFirstCipherSu
236 236
 
237 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 240
 	suite.ErrorContains(err, "cannot read first cipher suite")
241 241
 }
242 242
 
@@ -246,7 +246,7 @@ func (suite *ParseClientHelloHandshakeBodyTestSuite) TestCannotSkipRemainingCiph
246 246
 
247 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 250
 	suite.ErrorContains(err, "cannot skip remaining cipher suites")
251 251
 }
252 252
 
@@ -256,7 +256,7 @@ func (suite *ParseClientHelloHandshakeBodyTestSuite) TestCannotReadCompressionMe
256 256
 
257 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 260
 	suite.ErrorContains(err, "cannot read compression methods length")
261 261
 }
262 262
 
@@ -267,7 +267,7 @@ func (suite *ParseClientHelloHandshakeBodyTestSuite) TestCannotSkipCompressionMe
267 267
 
268 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 271
 	suite.ErrorContains(err, "cannot skip compression methods")
272 272
 }
273 273
 
@@ -307,70 +307,70 @@ func (suite *ParseClientHelloSNITestSuite) writeExtensions(extensions []byte) {
307 307
 func (suite *ParseClientHelloSNITestSuite) TestCannotReadExtensionsLength() {
308 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 311
 	suite.ErrorContains(err, "cannot read length of TLS extensions")
312 312
 }
313 313
 
314 314
 func (suite *ParseClientHelloSNITestSuite) TestCannotReadExtensions() {
315 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 318
 	suite.ErrorContains(err, "cannot read extensions")
319 319
 }
320 320
 
321 321
 func (suite *ParseClientHelloSNITestSuite) TestCannotReadExtensionType() {
322 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 325
 	suite.ErrorContains(err, "cannot read extension type")
326 326
 }
327 327
 
328 328
 func (suite *ParseClientHelloSNITestSuite) TestCannotReadExtensionLength() {
329 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 332
 	suite.ErrorContains(err, "length:")
333 333
 }
334 334
 
335 335
 func (suite *ParseClientHelloSNITestSuite) TestCannotReadExtensionData() {
336 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 339
 	suite.ErrorContains(err, "data: len")
340 340
 }
341 341
 
342 342
 func (suite *ParseClientHelloSNITestSuite) TestCannotReadSNIRecordLength() {
343 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 346
 	suite.ErrorContains(err, "cannot read the length of the SNI record")
347 347
 }
348 348
 
349 349
 func (suite *ParseClientHelloSNITestSuite) TestCannotReadSNIListType() {
350 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 353
 	suite.ErrorContains(err, "cannot read SNI list type")
354 354
 }
355 355
 
356 356
 func (suite *ParseClientHelloSNITestSuite) TestIncorrectSNIListType() {
357 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 360
 	suite.ErrorContains(err, "incorrect SNI list type")
361 361
 }
362 362
 
363 363
 func (suite *ParseClientHelloSNITestSuite) TestCannotReadHostnameLength() {
364 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 367
 	suite.ErrorContains(err, "incorrect length of the hostname")
368 368
 }
369 369
 
370 370
 func (suite *ParseClientHelloSNITestSuite) TestCannotReadHostname() {
371 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 374
 	suite.ErrorContains(err, "incorrect length of SNI hostname")
375 375
 }
376 376
 

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

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

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

@@ -38,7 +38,7 @@ func (suite *SendServerHelloTestSuite) SetupTest() {
38 38
 }
39 39
 
40 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 42
 	suite.NoError(err)
43 43
 
44 44
 	var rec bytes.Buffer
@@ -65,7 +65,7 @@ func (suite *SendServerHelloTestSuite) TestRecordStructure() {
65 65
 }
66 66
 
67 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 69
 	suite.NoError(err)
70 70
 
71 71
 	packet := make([]byte, suite.buf.Len())
@@ -84,7 +84,7 @@ func (suite *SendServerHelloTestSuite) TestHMAC() {
84 84
 }
85 85
 
86 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 88
 	suite.NoError(err)
89 89
 
90 90
 	packet := suite.buf.Bytes()
@@ -106,7 +106,7 @@ func (suite *SendServerHelloTestSuite) TestHandshakePayload() {
106 106
 }
107 107
 
108 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 110
 	suite.NoError(err)
111 111
 
112 112
 	// Skip first record

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

@@ -11,10 +11,11 @@ import (
11 11
 
12 12
 	"github.com/9seconds/mtg/v2/essentials"
13 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 15
 	"github.com/9seconds/mtg/v2/mtglib/internal/obfuscation"
17 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 19
 	"github.com/panjf2000/ants/v2"
19 20
 )
20 21
 
@@ -32,6 +33,7 @@ type Proxy struct {
32 33
 	workerPool                  *ants.PoolWithFunc
33 34
 	telegram                    *dc.Telegram
34 35
 	configUpdater               *dc.PublicConfigUpdater
36
+	doppelGanger                *doppel.Ganger
35 37
 	clientObfuscatror           obfuscation.Obfuscator
36 38
 
37 39
 	secret          Secret
@@ -161,52 +163,39 @@ func (p *Proxy) Shutdown() {
161 163
 }
162 164
 
163 165
 func (p *Proxy) doFakeTLSHandshake(ctx *streamContext) bool {
164
-	rec := record.AcquireRecord()
165
-	defer record.ReleaseRecord(rec)
166
-
167 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 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 176
 		p.doDomainFronting(ctx, rewind)
190
-
191 177
 		return false
192 178
 	}
193 179
 
194
-	if p.antiReplayCache.SeenBefore(hello.SessionID) {
180
+	if p.antiReplayCache.SeenBefore(clientHello.SessionID) {
195 181
 		p.logger.Warning("replay attack has been detected!")
196 182
 		p.eventStream.Send(p.ctx, NewEventReplayAttack(ctx.streamID))
197 183
 		p.doDomainFronting(ctx, rewind)
198
-
199 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 189
 		p.logger.InfoError("cannot send welcome packet", err)
204
-
205 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 201
 	return true

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

@@ -1,9 +1,6 @@
1 1
 package network
2 2
 
3
-import (
4
-	"crypto/tls"
5
-	"net/http"
6
-)
3
+import "net/http"
7 4
 
8 5
 type networkHTTPTransport struct {
9 6
 	userAgent string
@@ -15,11 +12,3 @@ func (n networkHTTPTransport) RoundTrip(req *http.Request) (*http.Response, erro
15 12
 
16 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
-}

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