Documentation
¶
Index ¶
Constants ¶
const SecCHUA = `"Not:A-Brand";v="99", "Google Chrome";v="145", "Chromium";v="145"`
SecCHUA is the static value of the sec-ch-ua header for Chrome 145 (Chromium brand list). If the mobile sec-ch-ua diverges from desktop, introduce SecCHUAMobile here and wire it into chrome.Mobile in variant.go.
Variables ¶
var Desktop = profiles.Variant{ HelloSpec: &HelloChrome_145, Boundary: Boundary, ConfigureH2: configureH2Desktop, ConfigureH3: configureH3Desktop, BuildHeaders: buildHeadersDesktop, Headers: DesktopApplier, }
Desktop is the Chrome 145 desktop variant — current production fingerprint.
var DesktopApplier = profiles.NewApplier(insertDesktopHeaders, insertDesktopHeaders, headerCache, false)
DesktopApplier applies the desktop Chrome request-header pipeline. Wired into chrome.Desktop.
var HelloChrome_145 = utls.ClientHelloSpec{ CipherSuites: []uint16{ utls.GREASE_PLACEHOLDER, utls.TLS_AES_128_GCM_SHA256, utls.TLS_AES_256_GCM_SHA384, utls.TLS_CHACHA20_POLY1305_SHA256, utls.TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256, utls.TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256, utls.TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384, utls.TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384, utls.TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305, utls.TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305, utls.TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA, utls.TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA, utls.TLS_RSA_WITH_AES_128_GCM_SHA256, utls.TLS_RSA_WITH_AES_256_GCM_SHA384, utls.TLS_RSA_WITH_AES_128_CBC_SHA, utls.TLS_RSA_WITH_AES_256_CBC_SHA, }, CompressionMethods: []byte{0x00}, Extensions: utls.ShuffleChromeTLSExtensions( []utls.TLSExtension{ &utls.UtlsGREASEExtension{}, &utls.SNIExtension{}, &utls.ExtendedMasterSecretExtension{}, &utls.RenegotiationInfoExtension{ Renegotiation: utls.RenegotiateOnceAsClient, }, &utls.SupportedCurvesExtension{ Curves: []utls.CurveID{ utls.GREASE_PLACEHOLDER, utls.X25519MLKEM768, utls.X25519, utls.CurveP256, utls.CurveP384, }, }, &utls.SupportedPointsExtension{ SupportedPoints: []byte{0x00}, }, &utls.SessionTicketExtension{}, &utls.ALPNExtension{ AlpnProtocols: []string{"h2", "http/1.1"}, }, &utls.StatusRequestExtension{}, &utls.SignatureAlgorithmsExtension{ SupportedSignatureAlgorithms: []utls.SignatureScheme{ utls.ECDSAWithP256AndSHA256, utls.PSSWithSHA256, utls.PKCS1WithSHA256, utls.ECDSAWithP384AndSHA384, utls.PSSWithSHA384, utls.PKCS1WithSHA384, utls.PSSWithSHA512, utls.PKCS1WithSHA512, }, }, &utls.SCTExtension{}, &utls.KeyShareExtension{ KeyShares: []utls.KeyShare{ {Group: utls.GREASE_PLACEHOLDER, Data: []byte{0}}, {Group: utls.X25519MLKEM768}, {Group: utls.X25519}, }, }, &utls.PSKKeyExchangeModesExtension{ Modes: []uint8{ utls.PskModeDHE, }, }, &utls.SupportedVersionsExtension{ Versions: []uint16{ utls.GREASE_PLACEHOLDER, utls.VersionTLS13, utls.VersionTLS12, }, }, &utls.UtlsCompressCertExtension{ Algorithms: []utls.CertCompressionAlgo{ utls.CertCompressionBrotli, }, }, &utls.ApplicationSettingsExtensionNew{ SupportedProtocols: []string{"h2"}, }, utls.BoringGREASEECH(), &utls.UtlsGREASEExtension{}, &utls.UtlsPreSharedKeyExtension{}, }, ), }
var HelloChrome_145_Mobile = utls.ClientHelloSpec{ CipherSuites: []uint16{ utls.GREASE_PLACEHOLDER, utls.TLS_AES_128_GCM_SHA256, utls.TLS_AES_256_GCM_SHA384, utls.TLS_CHACHA20_POLY1305_SHA256, utls.TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256, utls.TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256, utls.TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384, utls.TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384, utls.TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305, utls.TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305, utls.TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA, utls.TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA, utls.TLS_RSA_WITH_AES_128_GCM_SHA256, utls.TLS_RSA_WITH_AES_256_GCM_SHA384, utls.TLS_RSA_WITH_AES_128_CBC_SHA, utls.TLS_RSA_WITH_AES_256_CBC_SHA, }, CompressionMethods: []byte{0x00}, Extensions: utls.ShuffleChromeTLSExtensions( []utls.TLSExtension{ &utls.UtlsGREASEExtension{}, &utls.SNIExtension{}, &utls.ExtendedMasterSecretExtension{}, &utls.RenegotiationInfoExtension{ Renegotiation: utls.RenegotiateOnceAsClient, }, &utls.SupportedCurvesExtension{ Curves: []utls.CurveID{ utls.GREASE_PLACEHOLDER, utls.X25519MLKEM768, utls.X25519, utls.CurveP256, utls.CurveP384, }, }, &utls.SupportedPointsExtension{ SupportedPoints: []byte{0x00}, }, &utls.SessionTicketExtension{}, &utls.ALPNExtension{ AlpnProtocols: []string{"h2", "http/1.1"}, }, &utls.StatusRequestExtension{}, &utls.SignatureAlgorithmsExtension{ SupportedSignatureAlgorithms: []utls.SignatureScheme{ utls.ECDSAWithP256AndSHA256, utls.PSSWithSHA256, utls.PKCS1WithSHA256, utls.ECDSAWithP384AndSHA384, utls.PSSWithSHA384, utls.PKCS1WithSHA384, utls.PSSWithSHA512, utls.PKCS1WithSHA512, }, }, &utls.SCTExtension{}, &utls.KeyShareExtension{ KeyShares: []utls.KeyShare{ {Group: utls.GREASE_PLACEHOLDER, Data: []byte{0}}, {Group: utls.X25519MLKEM768}, {Group: utls.X25519}, }, }, &utls.PSKKeyExchangeModesExtension{ Modes: []uint8{ utls.PskModeDHE, }, }, &utls.SupportedVersionsExtension{ Versions: []uint16{ utls.GREASE_PLACEHOLDER, utls.VersionTLS13, utls.VersionTLS12, }, }, &utls.UtlsCompressCertExtension{ Algorithms: []utls.CertCompressionAlgo{ utls.CertCompressionBrotli, }, }, &utls.ApplicationSettingsExtensionNew{ SupportedProtocols: []string{"h2"}, }, utls.BoringGREASEECH(), &utls.UtlsGREASEExtension{}, &utls.UtlsPreSharedKeyExtension{}, }, ), }
HelloChrome_145_Mobile is a placeholder mobile variant. On the day real Chrome Android 145 ClientHello bytes are observed, replace this body — it is the single point of substitution for the mobile TLS fingerprint.
var HelloChrome_145_QUIC = utls.ClientHelloSpec{ CipherSuites: []uint16{ utls.TLS_AES_128_GCM_SHA256, utls.TLS_AES_256_GCM_SHA384, utls.TLS_CHACHA20_POLY1305_SHA256, }, CompressionMethods: []byte{0x00}, Extensions: []utls.TLSExtension{ &utls.ApplicationSettingsExtensionNew{ SupportedProtocols: []string{"h3"}, }, &utls.PSKKeyExchangeModesExtension{ Modes: []uint8{ utls.PskModeDHE, }, }, utls.BoringGREASEECH(), &utls.SupportedCurvesExtension{ Curves: []utls.CurveID{ utls.X25519MLKEM768, utls.X25519, utls.CurveP256, utls.CurveP384, }, }, &utls.ALPNExtension{ AlpnProtocols: []string{"h3"}, }, &utls.SupportedVersionsExtension{ Versions: []uint16{ utls.VersionTLS13, }, }, &utls.SNIExtension{}, &utls.SignatureAlgorithmsExtension{ SupportedSignatureAlgorithms: []utls.SignatureScheme{ utls.ECDSAWithP256AndSHA256, utls.PSSWithSHA256, utls.PKCS1WithSHA256, utls.ECDSAWithP384AndSHA384, utls.PSSWithSHA384, utls.PKCS1WithSHA384, utls.PSSWithSHA512, utls.PKCS1WithSHA512, utls.PKCS1WithSHA1, }, }, &utls.UtlsCompressCertExtension{ Algorithms: []utls.CertCompressionAlgo{ utls.CertCompressionBrotli, }, }, &utls.QUICTransportParametersExtension{}, &utls.KeyShareExtension{KeyShares: []utls.KeyShare{ {Group: utls.X25519MLKEM768}, {Group: utls.X25519}, }}, }, }
var Mobile = profiles.Variant{ HelloSpec: &HelloChrome_145_Mobile, Boundary: Boundary, ConfigureH2: configureH2Mobile, ConfigureH3: configureH3Mobile, BuildHeaders: buildHeadersMobile, Headers: MobileApplier, }
Mobile is a placeholder Chrome 145 mobile variant. On the day real Chrome Android 145 bytes are observed, replace HelloChrome_145_Mobile, configureH2Mobile, configureH3Mobile and buildHeadersMobile bodies — the variant fields below stay as-is.
var MobileApplier = profiles.NewApplier(insertMobileHeaders, insertMobileHeaders, headerCache, true)
MobileApplier applies the mobile Chrome request-header pipeline. Wired into chrome.Mobile.
var Platform = g.Map[profiles.OSKey, g.String]{ profiles.Windows: `"Windows"`, profiles.MacOS: `"macOS"`, profiles.Linux: `"Linux"`, profiles.Android: `"Android"`, profiles.IOS: `"iOS"`, }
Platform maps every supported impersonated OS to its sec-ch-ua-platform header value.
var UserAgent = g.Map[profiles.OSKey, g.String]{ profiles.Windows: "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/145.0.0.0 Safari/537.36", profiles.MacOS: "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/145.0.0.0 Safari/537.36", profiles.Linux: "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/145.0.0.0 Safari/537.36", profiles.Android: "Mozilla/5.0 (Linux; Android 10; K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/145.0.7632.26 Mobile Safari/537.36", profiles.IOS: "Mozilla/5.0 (iPhone; CPU iPhone OS 26_2_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) CriOS/145.0.7632.55 Mobile/15E148 Safari/604.1", }
UserAgent maps every supported impersonated OS to its Chrome 145 User-Agent string. It is shared between Desktop and Mobile variants — UA strings are an OS property, not a form-factor property (Chrome on Android always identifies as mobile, Chrome on Windows always as desktop, regardless of which fingerprint variant is dispatched).
Functions ¶
func Boundary ¶
Blink implementation: https://source.chromium.org/chromium/chromium/src/+/main:third_party/blink/renderer/platform/network/form_data_encoder.cc;drc=1d694679493c7b2f7b9df00e967b4f8699321093;l=130 WebKit implementation: https://github.com/WebKit/WebKit/blob/main/Source/WebCore/platform/network/FormDataBuilder.cpp#L120
Types ¶
This section is empty.