Skip to main content

TlsProfile

Struct TlsProfile 

Source
#[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
Non-exhaustive structs could have additional fields added in future. Therefore, non-exhaustive structs cannot be constructed in external crates using the traditional Struct { .. } syntax; cannot be matched against without a wildcard ..; and struct update syntax will not work.
§name: String

Human-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

Source

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.

Source

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

Source

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);
Source

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"));
Source

pub fn http3_perk(&self) -> Option<Http3Perk>

Returns HTTP/3 QUIC settings for browsers that support it, if applicable.

Source

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

Source§

fn clone(&self) -> TlsProfile

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for TlsProfile

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl<'de> Deserialize<'de> for TlsProfile

Source§

fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>
where __D: Deserializer<'de>,

Deserialize this value from the given Serde deserializer. Read more
Source§

impl PartialEq for TlsProfile

Source§

fn eq(&self, other: &TlsProfile) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, and should not be overridden without very good reason.
Source§

impl Serialize for TlsProfile

Source§

fn serialize<__S>(&self, __serializer: __S) -> Result<__S::Ok, __S::Error>
where __S: Serializer,

Serialize this value into the given Serde serializer. Read more
Source§

impl TlsProfileValidate for TlsProfile

Source§

fn validate_static( &self, expected_ja3: &str, expected_ja4: &str, ) -> TlsValidationReport

Validate this profile against known reference hashes (no network required). Read more
Source§

impl Eq for TlsProfile

Source§

impl StructuralPartialEq for TlsProfile

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
§

impl<Q, K> Equivalent<K> for Q
where Q: Eq + ?Sized, K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<Q, K> Equivalent<K> for Q
where Q: Eq + ?Sized, K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an Instrumented wrapper. Read more
Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

§

impl<T> PolicyExt for T
where T: ?Sized,

§

fn and<P, B, E>(self, other: P) -> And<T, P>
where T: Policy<B, E>, P: Policy<B, E>,

Create a new Policy that returns [Action::Follow] only if self and other return Action::Follow. Read more
§

fn or<P, B, E>(self, other: P) -> Or<T, P>
where T: Policy<B, E>, P: Policy<B, E>,

Create a new Policy that returns [Action::Follow] if either self or other returns Action::Follow. Read more
Source§

impl<T> Same for T

Source§

type Output = T

Should always be Self
Source§

impl<T> ToOwned for T
where T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for T
where V: MultiLane<T>,

§

fn vzip(self) -> V

§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a [WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a [WithDispatch] wrapper. Read more
Source§

impl<T> DeserializeOwned for T
where T: for<'de> Deserialize<'de>,