#[non_exhaustive]pub struct TlsProfile {
pub name: String,
pub cipher_suites: Vec<CipherSuiteId>,
pub tls_versions: Vec<TlsVersion>,
pub extensions: Vec<TlsExtensionId>,
pub supported_groups: Vec<SupportedGroup>,
pub signature_algorithms: Vec<SignatureAlgorithm>,
pub alpn_protocols: Vec<AlpnProtocol>,
}Expand description
A complete TLS fingerprint profile matching a real browser’s ClientHello.
The ordering of cipher suites, extensions, and supported groups matters — anti-bot systems compare these orderings against known browser signatures.
§Example
use stygian_browser::tls::{CHROME_131, TlsProfile};
let profile: &TlsProfile = &*CHROME_131;
assert_eq!(profile.name, "Chrome 131");
assert!(!profile.cipher_suites.is_empty());Fields (Non-exhaustive)§
This struct is marked as non-exhaustive
Struct { .. } syntax; cannot be matched against without a wildcard ..; and struct update syntax will not work.name: StringHuman-readable profile name (e.g. "Chrome 131").
cipher_suites: Vec<CipherSuiteId>Ordered cipher-suite list from the ClientHello.
tls_versions: Vec<TlsVersion>Supported TLS protocol versions.
extensions: Vec<TlsExtensionId>Ordered extension list from the ClientHello.
supported_groups: Vec<SupportedGroup>Supported named groups (elliptic curves / key exchange).
signature_algorithms: Vec<SignatureAlgorithm>Supported signature algorithms.
alpn_protocols: Vec<AlpnProtocol>ALPN protocol list.
Implementations§
Source§impl TlsProfile
impl TlsProfile
Sourcepub fn ja3(&self) -> Ja3Hash
pub fn ja3(&self) -> Ja3Hash
Compute the JA3 fingerprint for this profile.
JA3 format: TLSVersion,Ciphers,Extensions,EllipticCurves,EcPointFormats
- GREASE values are stripped from all fields.
- EC point formats default to
0(uncompressed) when not otherwise specified in the profile.
§Example
use stygian_browser::tls::CHROME_131;
let ja3 = CHROME_131.ja3();
assert!(ja3.raw.starts_with("772,"));
assert_eq!(ja3.hash.len(), 32);Sourcepub fn ja4(&self) -> Ja4
pub fn ja4(&self) -> Ja4
Compute the JA4 fingerprint for this profile.
JA4 format (JA4_a section):
{q}{version}{sni}{cipher_count:02}{ext_count:02}_{alpn}_{sorted_cipher_hash}_{sorted_ext_hash}
This implements the JA4_a (raw fingerprint) portion. Sorted cipher and
extension hashes use the first 12 hex characters of the SHA-256 —
approximated here by truncated MD5 since we already have that
implementation and the goal is fingerprint representation, not
cryptographic security.
§Example
use stygian_browser::tls::CHROME_131;
let ja4 = CHROME_131.ja4();
assert!(ja4.fingerprint.starts_with("t13"));Sourcepub fn random_weighted(seed: u64) -> &'static Self
pub fn random_weighted(seed: u64) -> &'static Self
Select a built-in TLS profile weighted by real browser market share.
Distribution mirrors DeviceProfile
and BrowserKind weights:
- Windows (70%): Chrome 65%, Edge 16%, Firefox 19%
- macOS (20%): Chrome 56%, Safari 36%, Firefox 8%
- Linux (10%): Chrome 65%, Edge 16%, Firefox 19%
Edge 131 shares Chrome’s Blink engine so its TLS stack is nearly
identical; the profile uses EDGE_131.
§Example
use stygian_browser::tls::TlsProfile;
let profile = TlsProfile::random_weighted(42);
assert!(!profile.name.is_empty());Trait Implementations§
Source§impl Clone for TlsProfile
impl Clone for TlsProfile
Source§fn clone(&self) -> TlsProfile
fn clone(&self) -> TlsProfile
1.0.0 · Source§fn clone_from(&mut self, source: &Self)
fn clone_from(&mut self, source: &Self)
source. Read more