diff --git a/mapper.go b/mapper.go index 15f534c..fe50c6b 100644 --- a/mapper.go +++ b/mapper.go @@ -68,11 +68,14 @@ var aeadIds = map[string]uint16{ } var curves = map[string]tls.CurveID{ - "GREASE": tls.CurveID(tls.GREASE_PLACEHOLDER), - "P256": tls.CurveP256, - "P384": tls.CurveP384, - "P521": tls.CurveP521, - "X25519": tls.X25519, + "GREASE": tls.CurveID(tls.GREASE_PLACEHOLDER), + "P256": tls.CurveP256, + "P384": tls.CurveP384, + "P521": tls.CurveP521, + "X25519": tls.X25519, + "P256Kyber768": tls.P256Kyber768Draft00, + "X25519Kyber512D": tls.X25519Kyber512Draft00, + "X25519Kyber768": tls.X25519Kyber768Draft00, } var certCompression = map[string]tls.CertCompressionAlgo{ diff --git a/profiles/internal_browser_profiles.go b/profiles/internal_browser_profiles.go index f6f4d83..350bcc9 100644 --- a/profiles/internal_browser_profiles.go +++ b/profiles/internal_browser_profiles.go @@ -105,6 +105,108 @@ var Chrome_117 = ClientProfile{ connectionFlow: 15663105, } +var Chrome_124 = ClientProfile{ + clientHelloId: tls.ClientHelloID{ + Client: "Chrome", + RandomExtensionOrder: false, + Version: "124", + Seed: nil, + SpecFactory: func() (tls.ClientHelloSpec, error) { + return tls.ClientHelloSpec{ + CipherSuites: []uint16{ + tls.GREASE_PLACEHOLDER, + tls.TLS_AES_128_GCM_SHA256, + tls.TLS_AES_256_GCM_SHA384, + tls.TLS_CHACHA20_POLY1305_SHA256, + tls.TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256, + tls.TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256, + tls.TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384, + tls.TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384, + tls.TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305, + tls.TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305, + tls.TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA, + tls.TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA, + tls.TLS_RSA_WITH_AES_128_GCM_SHA256, + tls.TLS_RSA_WITH_AES_256_GCM_SHA384, + tls.TLS_RSA_WITH_AES_128_CBC_SHA, + tls.TLS_RSA_WITH_AES_256_CBC_SHA, + }, + CompressionMethods: []uint8{ + tls.CompressionNone, + }, + Extensions: []tls.TLSExtension{ + &tls.UtlsGREASEExtension{}, + &tls.UtlsCompressCertExtension{[]tls.CertCompressionAlgo{ + tls.CertCompressionBrotli, + }}, + &tls.SCTExtension{}, + &tls.ExtendedMasterSecretExtension{}, + &tls.ApplicationSettingsExtension{SupportedProtocols: []string{"h2"}}, + &tls.ALPNExtension{AlpnProtocols: []string{"h2", "http/1.1"}}, + &tls.SupportedVersionsExtension{[]uint16{ + tls.GREASE_PLACEHOLDER, + tls.VersionTLS13, + tls.VersionTLS12, + }}, + &tls.SignatureAlgorithmsExtension{SupportedSignatureAlgorithms: []tls.SignatureScheme{ + tls.ECDSAWithP256AndSHA256, + tls.PSSWithSHA256, + tls.PKCS1WithSHA256, + tls.ECDSAWithP384AndSHA384, + tls.PSSWithSHA384, + tls.PKCS1WithSHA384, + tls.PSSWithSHA512, + tls.PKCS1WithSHA512, + }}, + &tls.SupportedPointsExtension{SupportedPoints: []byte{ + tls.PointFormatUncompressed, + }}, + &tls.SNIExtension{}, + &tls.SessionTicketExtension{}, + &tls.SupportedCurvesExtension{[]tls.CurveID{ + tls.GREASE_PLACEHOLDER, + tls.X25519Kyber768Draft00, + tls.X25519, + tls.CurveP256, + tls.CurveP384, + }}, + tls.BoringGREASEECH(), + &tls.StatusRequestExtension{}, + &tls.RenegotiationInfoExtension{Renegotiation: tls.RenegotiateOnceAsClient}, + &tls.PSKKeyExchangeModesExtension{[]uint8{ + tls.PskModeDHE, + }}, + &tls.KeyShareExtension{[]tls.KeyShare{ + {Group: tls.CurveID(tls.GREASE_PLACEHOLDER), Data: []byte{0}}, + {Group: tls.X25519Kyber768Draft00}, + {Group: tls.X25519}, + }}, + &tls.UtlsGREASEExtension{}, + }, + }, nil + }, + }, + settings: map[http2.SettingID]uint32{ + http2.SettingHeaderTableSize: 65536, + http2.SettingEnablePush: 0, + http2.SettingInitialWindowSize: 6291456, + http2.SettingMaxHeaderListSize: 262144, + }, + settingsOrder: []http2.SettingID{ + http2.SettingHeaderTableSize, + http2.SettingEnablePush, + http2.SettingInitialWindowSize, + http2.SettingMaxHeaderListSize, + }, + pseudoHeaderOrder: []string{ + ":method", + ":authority", + ":scheme", + ":path", + }, + connectionFlow: 15663105, +} + var Chrome_120 = ClientProfile{ clientHelloId: tls.ClientHelloID{ Client: "Chrome", @@ -180,7 +282,6 @@ var Chrome_120 = ClientProfile{ tls.CertCompressionBrotli, }}, &tls.UtlsGREASEExtension{}, - //&tls.UtlsPaddingExtension{GetPaddingLen: tls.BoringPaddingStyle}, }, }, nil }, diff --git a/profiles/profiles.go b/profiles/profiles.go index fca1592..27a89a5 100644 --- a/profiles/profiles.go +++ b/profiles/profiles.go @@ -5,7 +5,7 @@ import ( tls "github.com/bogdanfinn/utls" ) -var DefaultClientProfile = Chrome_120 +var DefaultClientProfile = Chrome_124 var MappedTLSClients = map[string]ClientProfile{ "chrome_103": Chrome_103, @@ -22,6 +22,7 @@ var MappedTLSClients = map[string]ClientProfile{ "chrome_116_PSK_PQ": Chrome_116_PSK_PQ, "chrome_117": Chrome_117, "chrome_120": Chrome_120, + "chrome_124": Chrome_124, "safari_15_6_1": Safari_15_6_1, "safari_16_0": Safari_16_0, "safari_ipad_15_6": Safari_Ipad_15_6, @@ -36,7 +37,7 @@ var MappedTLSClients = map[string]ClientProfile{ "firefox_108": Firefox_108, "firefox_110": Firefox_110, "firefox_117": Firefox_117, - "firefox_120": Firefox_120, + "firefox_120": Firefox_120, "firefox_123": Firefox_123, "opera_89": Opera_89, "opera_90": Opera_90, diff --git a/tests/client_test.go b/tests/client_test.go index a78f07f..2957c14 100644 --- a/tests/client_test.go +++ b/tests/client_test.go @@ -14,6 +14,8 @@ import ( ) func TestClients(t *testing.T) { + t.Log("testing chrome 124") + chrome_124(t) t.Log("testing chrome 120") chrome_120(t) time.Sleep(2 * time.Second) @@ -511,6 +513,31 @@ func firefox_108(t *testing.T) { compareResponse(t, "firefox", clientFingerprints[firefox][tls.HelloFirefox_108.Str()], resp) } +func chrome_124(t *testing.T) { + options := []tls_client.HttpClientOption{ + tls_client.WithClientProfile(profiles.Chrome_124), + } + + client, err := tls_client.NewHttpClient(nil, options...) + if err != nil { + t.Fatal(err) + } + + req, err := http.NewRequest(http.MethodGet, peetApiEndpoint, nil) + if err != nil { + t.Fatal(err) + } + + req.Header = defaultHeader + + resp, err := client.Do(req) + if err != nil { + t.Fatal(err) + } + + compareResponse(t, "chrome", clientFingerprints[chrome][profiles.Chrome_124.GetClientHelloStr()], resp) +} + func chrome_120(t *testing.T) { options := []tls_client.HttpClientOption{ tls_client.WithClientProfile(profiles.Chrome_120), diff --git a/tests/client_test_utils.go b/tests/client_test_utils.go index cf3061c..79e08d9 100644 --- a/tests/client_test_utils.go +++ b/tests/client_test_utils.go @@ -82,6 +82,12 @@ const ( var clientFingerprints = map[string]map[string]map[string]string{ chrome: { + profiles.Chrome_124.GetClientHelloStr(): map[string]string{ + ja3String: "771,4865-4866-4867-49195-49199-49196-49200-52393-52392-49171-49172-156-157-47-53,27-18-23-17513-16-43-13-11-0-35-10-65037-5-65281-45-51,25497-29-23-24,0", + ja3Hash: "64aff24dbef210f33880d4f62e1493dd", + akamaiFingerprint: "1:65536,2:0,4:6291456,6:262144|15663105|0|m,a,s,p", + akamaiFingerprintHash: "90224459f8bf70b7d0a8797eb916dbc9", + }, profiles.Chrome_120.GetClientHelloStr(): map[string]string{ ja3String: "771,4865-4866-4867-49195-49199-49196-49200-52393-52392-49171-49172-156-157-47-53,0-45-43-5-23-35-13-65281-16-65037-18-51-10-11-17513-27,29-23-24,0", ja3Hash: "1d9a054bac1eef41f30d370f9bbb2ad2",