@@ -3,13 +3,36 @@ package azuretls
3
3
import (
4
4
"github.com/Noooste/fhttp/http2"
5
5
tls "github.com/Noooste/utls"
6
+ "math/rand"
6
7
)
7
8
9
+ // since version 110, Chrome TLS Client Hello extensions are shuffled
10
+ // https://www.fastly.com/blog/a-first-look-at-chromes-tls-clienthello-permutation-in-the-wild
11
+ // replace the rdn.Shuffle with a custom shuffle to avoid the panic
12
+ // see issue 102
13
+ func getShuffledExtensions (extensions []tls.TLSExtension ) []tls.TLSExtension {
14
+ extensionsLength := len (extensions )
15
+
16
+ dest := make ([]tls.TLSExtension , extensionsLength )
17
+ perm := rand .Perm (extensionsLength )
18
+ for i , v := range perm {
19
+ dest [v ] = extensions [i ]
20
+ }
21
+
22
+ final := make ([]tls.TLSExtension , 0 , extensionsLength + 3 ) // first grease + last grease + padding
23
+ final = append (final , & tls.UtlsGREASEExtension {})
24
+ final = append (final , dest ... )
25
+ final = append (final , & tls.UtlsGREASEExtension {})
26
+ final = append (final , & tls.UtlsPaddingExtension {GetPaddingLen : tls .BoringPaddingStyle })
27
+
28
+ return final
29
+ }
30
+
8
31
// GetLastChromeVersion apply the latest Chrome version
9
32
// Current Chrome version : 121
10
33
func GetLastChromeVersion () * tls.ClientHelloSpec {
11
34
extensions := []tls.TLSExtension {
12
- & tls.UtlsGREASEExtension {},
35
+ // &tls.UtlsGREASEExtension{},
13
36
& tls.KeyShareExtension {KeyShares : []tls.KeyShare {
14
37
{Group : tls .CurveID (tls .GREASE_PLACEHOLDER ), Data : []byte {0 }},
15
38
{Group : tls .X25519Kyber768Draft00 },
@@ -58,35 +81,22 @@ func GetLastChromeVersion() *tls.ClientHelloSpec {
58
81
0x00 , // pointFormatUncompressed
59
82
}},
60
83
tls .BoringGREASEECH (),
61
- & tls.UtlsGREASEExtension {},
62
- & tls.UtlsPaddingExtension {GetPaddingLen : tls .BoringPaddingStyle },
84
+ // &tls.UtlsGREASEExtension{},
85
+ // &tls.UtlsPaddingExtension{GetPaddingLen: tls.BoringPaddingStyle},
63
86
}
64
87
65
- extensionsLength := len (extensions )
66
- lastTwo := extensionsLength - 2
67
-
68
- // since version 110, Chrome TLS Client Hello extensions are shuffled
69
- // https://www.fastly.com/blog/a-first-look-at-chromes-tls-clienthello-permutation-in-the-wild
70
- rdn .Shuffle (extensionsLength , func (i , j int ) {
71
- if i >= lastTwo || j >= lastTwo || i == 0 || j == 0 {
72
- // ignore GREASE extensions and padding extension
73
- return
74
- }
75
- extensions [i ], extensions [j ] = extensions [j ], extensions [i ]
76
- })
77
-
78
88
return & tls.ClientHelloSpec {
79
89
CipherSuites : []uint16 {
80
90
tls .GREASE_PLACEHOLDER ,
91
+ tls .TLS_CHACHA20_POLY1305_SHA256 ,
81
92
tls .TLS_AES_128_GCM_SHA256 ,
82
93
tls .TLS_AES_256_GCM_SHA384 ,
83
- tls .TLS_CHACHA20_POLY1305_SHA256 ,
84
- tls .TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256 ,
85
- tls .TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 ,
86
- tls .TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384 ,
87
- tls .TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 ,
88
- tls .TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256 ,
94
+ tls .TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256 ,
89
95
tls .TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256 ,
96
+ tls .TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256 ,
97
+ tls .TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 ,
98
+ tls .TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384 ,
99
+ tls .TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 ,
90
100
tls .TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA ,
91
101
tls .TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA ,
92
102
tls .TLS_RSA_WITH_AES_128_GCM_SHA256 ,
@@ -97,7 +107,7 @@ func GetLastChromeVersion() *tls.ClientHelloSpec {
97
107
CompressionMethods : []byte {
98
108
0x00 , // compressionNone
99
109
},
100
- Extensions : extensions ,
110
+ Extensions : getShuffledExtensions ( extensions ) ,
101
111
}
102
112
}
103
113
0 commit comments