#[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>§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>Implementations§
Source§impl TlsProfile
impl TlsProfile
Sourcepub fn to_rustls_config(&self) -> Result<TlsClientConfig, TlsConfigError>
pub fn to_rustls_config(&self) -> Result<TlsClientConfig, TlsConfigError>
Build a rustls ClientConfig matching this profile.
§Errors
profile’s cipher suites are available in the backend.
§rustls extension control
supported_versions,key_share,signature_algorithms,supported_groups,server_name,psk_key_exchange_modes, and
Extensions like compress_certificate, application_settings,
delegated_credentials, and signed_certificate_timestamp are
not configurable in rustls and are emitted (or not) based on the
library version.
Sourcepub fn to_rustls_config_with_control(
&self,
control: TlsControl,
) -> Result<TlsClientConfig, TlsConfigError>
pub fn to_rustls_config_with_control( &self, control: TlsControl, ) -> Result<TlsClientConfig, TlsConfigError>
Build a rustls ClientConfig using explicit control settings.
introducing native TLS dependencies.
§Limitations
ordering or GREASE emission. This method provides strict control over the fields rustls does expose (cipher suites, groups, ALPN,
§Example
use stygian_browser::tls::{CHROME_131, TlsControl};
let result = CHROME_131.to_rustls_config_with_control(TlsControl::default());
assert!(result.is_ok());Source§impl TlsProfile
impl TlsProfile
Sourcepub fn ja3(&self) -> Ja3Hash
pub fn ja3(&self) -> Ja3Hash
Computes the JA3 fingerprint string for this profile.
- GREASE values are stripped from all fields.
- Fields are ordered as 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
{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 http3_perk(&self) -> Option<Http3Perk>
pub fn http3_perk(&self) -> Option<Http3Perk>
Returns HTTP/3 QUIC settings for browsers that support it, if applicable.
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 moreSource§impl Debug for TlsProfile
impl Debug for TlsProfile
Source§impl<'de> Deserialize<'de> for TlsProfile
impl<'de> Deserialize<'de> for TlsProfile
Source§fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>where
__D: Deserializer<'de>,
fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>where
__D: Deserializer<'de>,
Source§impl PartialEq for TlsProfile
impl PartialEq for TlsProfile
Source§impl Serialize for TlsProfile
impl Serialize for TlsProfile
Source§impl TlsProfileValidate for TlsProfile
impl TlsProfileValidate for TlsProfile
Source§fn validate_static(
&self,
expected_ja3: &str,
expected_ja4: &str,
) -> TlsValidationReport
fn validate_static( &self, expected_ja3: &str, expected_ja4: &str, ) -> TlsValidationReport
impl Eq for TlsProfile
impl StructuralPartialEq for TlsProfile
Auto Trait Implementations§
impl Freeze for TlsProfile
impl RefUnwindSafe for TlsProfile
impl Send for TlsProfile
impl Sync for TlsProfile
impl Unpin for TlsProfile
impl UnsafeUnpin for TlsProfile
impl UnwindSafe for TlsProfile
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Source§impl<T> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
§impl<Q, K> Equivalent<K> for Q
impl<Q, K> Equivalent<K> for Q
§fn equivalent(&self, key: &K) -> bool
fn equivalent(&self, key: &K) -> bool
§impl<Q, K> Equivalent<K> for Q
impl<Q, K> Equivalent<K> for Q
§fn equivalent(&self, key: &K) -> bool
fn equivalent(&self, key: &K) -> bool
key and return true if they are equal.