@@ -4,53 +4,52 @@ import (
44 "crypto/tls"
55 "net"
66
7+ "github.com/metacubex/mihomo/common/once"
78 "github.com/metacubex/mihomo/common/utils"
89 "github.com/metacubex/mihomo/log"
910
1011 utls "github.com/metacubex/utls"
1112 "github.com/mroth/weightedrand/v2"
1213)
1314
15+ type Conn = utls.Conn
1416type UConn = utls.UConn
17+ type UClientHelloID = utls.ClientHelloID
1518
1619const VersionTLS13 = utls .VersionTLS13
1720
18- type UClientHelloID struct {
19- * utls.ClientHelloID
21+ func Client ( c net. Conn , config * utls. Config ) * Conn {
22+ return utls .Client ( c , config )
2023}
2124
22- var initRandomFingerprint UClientHelloID
23- var initUtlsClient string
24-
2525func UClient (c net.Conn , config * utls.Config , fingerprint UClientHelloID ) * UConn {
26- return utls .UClient (c , config , * fingerprint . ClientHelloID )
26+ return utls .UClient (c , config , fingerprint )
2727}
2828
29- func GetFingerprint (ClientFingerprint string ) (UClientHelloID , bool ) {
30- if ClientFingerprint == "none" {
31- return UClientHelloID {}, false
29+ func GetFingerprint (clientFingerprint string ) (UClientHelloID , bool ) {
30+ if len ( clientFingerprint ) == 0 {
31+ clientFingerprint = globalFingerprint
3232 }
33-
34- if initRandomFingerprint .ClientHelloID == nil {
35- initRandomFingerprint , _ = RollFingerprint ()
33+ if len (clientFingerprint ) == 0 || clientFingerprint == "none" {
34+ return UClientHelloID {}, false
3635 }
3736
38- if ClientFingerprint == "random" {
39- log .Debugln ("use initial random HelloID:%s" , initRandomFingerprint .Client )
40- return initRandomFingerprint , true
37+ if clientFingerprint == "random" {
38+ fingerprint := randomFingerprint ()
39+ log .Debugln ("use initial random HelloID:%s" , fingerprint .Client )
40+ return fingerprint , true
4141 }
4242
43- fingerprint , ok := Fingerprints [ClientFingerprint ]
44- if ok {
43+ if fingerprint , ok := fingerprints [clientFingerprint ]; ok {
4544 log .Debugln ("use specified fingerprint:%s" , fingerprint .Client )
46- return fingerprint , ok
45+ return fingerprint , true
4746 } else {
48- log .Warnln ("wrong ClientFingerprint :%s" , ClientFingerprint )
47+ log .Warnln ("wrong clientFingerprint :%s" , clientFingerprint )
4948 return UClientHelloID {}, false
5049 }
5150}
5251
53- func RollFingerprint () ( UClientHelloID , bool ) {
52+ var randomFingerprint = once . OnceValue ( func () UClientHelloID {
5453 chooser , _ := weightedrand .NewChooser (
5554 weightedrand .NewChoice ("chrome" , 6 ),
5655 weightedrand .NewChoice ("safari" , 3 ),
@@ -59,26 +58,29 @@ func RollFingerprint() (UClientHelloID, bool) {
5958 )
6059 initClient := chooser .Pick ()
6160 log .Debugln ("initial random HelloID:%s" , initClient )
62- fingerprint , ok := Fingerprints [initClient ]
63- return fingerprint , ok
64- }
65-
66- var Fingerprints = map [string ]UClientHelloID {
67- "chrome" : {& utls .HelloChrome_Auto },
68- "chrome_psk" : {& utls .HelloChrome_100_PSK },
69- "chrome_psk_shuffle" : {& utls .HelloChrome_106_Shuffle },
70- "chrome_padding_psk_shuffle" : {& utls .HelloChrome_114_Padding_PSK_Shuf },
71- "chrome_pq" : {& utls .HelloChrome_115_PQ },
72- "chrome_pq_psk" : {& utls .HelloChrome_115_PQ_PSK },
73- "firefox" : {& utls .HelloFirefox_Auto },
74- "safari" : {& utls .HelloSafari_Auto },
75- "ios" : {& utls .HelloIOS_Auto },
76- "android" : {& utls .HelloAndroid_11_OkHttp },
77- "edge" : {& utls .HelloEdge_Auto },
78- "360" : {& utls .Hello360_Auto },
79- "qq" : {& utls .HelloQQ_Auto },
80- "random" : {nil },
81- "randomized" : {nil },
61+ fingerprint , ok := fingerprints [initClient ]
62+ if ! ok {
63+ log .Warnln ("error in initial random HelloID:%s" , initClient )
64+ }
65+ return fingerprint
66+ })
67+
68+ var fingerprints = map [string ]UClientHelloID {
69+ "chrome" : utls .HelloChrome_Auto ,
70+ "chrome_psk" : utls .HelloChrome_100_PSK ,
71+ "chrome_psk_shuffle" : utls .HelloChrome_106_Shuffle ,
72+ "chrome_padding_psk_shuffle" : utls .HelloChrome_114_Padding_PSK_Shuf ,
73+ "chrome_pq" : utls .HelloChrome_115_PQ ,
74+ "chrome_pq_psk" : utls .HelloChrome_115_PQ_PSK ,
75+ "firefox" : utls .HelloFirefox_Auto ,
76+ "safari" : utls .HelloSafari_Auto ,
77+ "ios" : utls .HelloIOS_Auto ,
78+ "android" : utls .HelloAndroid_11_OkHttp ,
79+ "edge" : utls .HelloEdge_Auto ,
80+ "360" : utls .Hello360_Auto ,
81+ "qq" : utls .HelloQQ_Auto ,
82+ "random" : {},
83+ "randomized" : utls .HelloRandomized ,
8284}
8385
8486func init () {
@@ -88,7 +90,7 @@ func init() {
8890 randomized := utls .HelloRandomized
8991 randomized .Seed , _ = utls .NewPRNGSeed ()
9092 randomized .Weights = & weights
91- Fingerprints ["randomized" ] = UClientHelloID { & randomized }
93+ fingerprints ["randomized" ] = randomized
9294}
9395
9496func UCertificates (it tls.Certificate ) utls.Certificate {
@@ -154,14 +156,12 @@ func BuildWebsocketHandshakeState(c *UConn) error {
154156 return nil
155157}
156158
157- func SetGlobalUtlsClient (Client string ) {
158- initUtlsClient = Client
159- }
159+ var globalFingerprint string
160160
161- func HaveGlobalFingerprint () bool {
162- return len ( initUtlsClient ) != 0 && initUtlsClient != "none"
161+ func SetGlobalFingerprint ( fingerprint string ) {
162+ globalFingerprint = fingerprint
163163}
164164
165165func GetGlobalFingerprint () string {
166- return initUtlsClient
166+ return globalFingerprint
167167}
0 commit comments