pub const CHROME_CIPHER_SUITES: &[&str] = &[
"TLS_AES_128_GCM_SHA256",
"TLS_AES_256_GCM_SHA384",
"TLS_CHACHA20_POLY1305_SHA256",
"TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256",
"TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256",
"TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384",
"TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384",
"TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256",
"TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256",
"TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA",
"TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA",
"TLS_RSA_WITH_AES_128_GCM_SHA256",
"TLS_RSA_WITH_AES_256_GCM_SHA384",
"TLS_RSA_WITH_AES_128_CBC_SHA",
"TLS_RSA_WITH_AES_256_CBC_SHA",
];
pub const CHROME_142_CIPHER_SUITES: &[&str] = CHROME_CIPHER_SUITES;
pub const CHROME_SIGNATURE_ALGORITHMS: &[&str] = &[
"ecdsa_secp256r1_sha256",
"rsa_pss_rsae_sha256",
"rsa_pkcs1_sha256",
"ecdsa_secp384r1_sha384",
"rsa_pss_rsae_sha384",
"rsa_pkcs1_sha384",
"rsa_pss_rsae_sha512",
"rsa_pkcs1_sha512",
];
pub const CHROME_142_SIGNATURE_ALGORITHMS: &[&str] = CHROME_SIGNATURE_ALGORITHMS;
pub const CHROME_CURVES: &[&str] = &["x25519", "P-256", "P-384"];
pub const CHROME_142_CURVES: &[&str] = CHROME_CURVES;
pub const CHROME_EXTENSION_IDS: &[u16] =
&[0, 23, 65281, 10, 11, 35, 16, 5, 13, 18, 51, 45, 43, 27, 21];
pub const CHROME_142_EXTENSION_IDS: &[u16] = CHROME_EXTENSION_IDS;
pub const FIREFOX_133_CIPHER_SUITES: &[&str] = &[
"TLS_AES_128_GCM_SHA256",
"TLS_AES_256_GCM_SHA384",
"TLS_CHACHA20_POLY1305_SHA256",
"TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256",
"TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256",
"TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384",
"TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384",
"TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256",
"TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256",
"TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA",
"TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA",
"TLS_RSA_WITH_AES_128_GCM_SHA256",
"TLS_RSA_WITH_AES_256_GCM_SHA384",
"TLS_RSA_WITH_AES_128_CBC_SHA",
"TLS_RSA_WITH_AES_256_CBC_SHA",
];
pub const FIREFOX_133_SIGNATURE_ALGORITHMS: &[&str] = &[
"ecdsa_secp256r1_sha256",
"rsa_pss_rsae_sha256",
"rsa_pkcs1_sha256",
"ecdsa_secp384r1_sha384",
"rsa_pss_rsae_sha384",
"rsa_pkcs1_sha384",
"rsa_pss_rsae_sha512",
"rsa_pkcs1_sha512",
];
pub const FIREFOX_133_CURVES: &[&str] = &["x25519", "P-256", "P-384", "P-521"];
pub const FIREFOX_133_EXTENSION_IDS: &[u16] =
&[0, 23, 65281, 10, 11, 35, 16, 5, 13, 18, 51, 45, 43, 27, 21];
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum CertCompression {
Brotli,
Zlib,
None,
}
#[derive(Debug, Clone)]
pub struct TlsFingerprint {
pub cipher_list: Vec<&'static str>,
pub sigalgs: Vec<&'static str>,
pub curves: Vec<&'static str>,
pub extensions: Vec<u16>,
pub extension_order: Vec<u16>,
pub grease: bool,
pub cert_compression: CertCompression,
pub enable_kyber: bool,
}
impl Default for TlsFingerprint {
fn default() -> Self {
Self {
cipher_list: vec![],
sigalgs: vec![],
curves: vec![],
extensions: vec![],
extension_order: vec![],
grease: true,
cert_compression: CertCompression::None,
enable_kyber: false,
}
}
}
impl TlsFingerprint {
pub fn chrome() -> Self {
Self {
cipher_list: CHROME_CIPHER_SUITES.to_vec(),
sigalgs: CHROME_SIGNATURE_ALGORITHMS.to_vec(),
curves: CHROME_CURVES.to_vec(),
extensions: CHROME_EXTENSION_IDS.to_vec(),
extension_order: CHROME_EXTENSION_IDS.to_vec(),
grease: true,
cert_compression: CertCompression::Brotli,
enable_kyber: true,
}
}
pub fn chrome_142() -> Self {
Self::chrome()
}
pub fn chrome_143() -> Self {
Self::chrome()
}
pub fn chrome_144() -> Self {
Self::chrome()
}
pub fn chrome_145() -> Self {
Self::chrome()
}
pub fn chrome_146() -> Self {
Self::chrome()
}
pub fn firefox_133() -> Self {
Self {
cipher_list: FIREFOX_133_CIPHER_SUITES.to_vec(),
sigalgs: FIREFOX_133_SIGNATURE_ALGORITHMS.to_vec(),
curves: FIREFOX_133_CURVES.to_vec(),
extensions: FIREFOX_133_EXTENSION_IDS.to_vec(),
extension_order: FIREFOX_133_EXTENSION_IDS.to_vec(),
grease: false, cert_compression: CertCompression::None, enable_kyber: false, }
}
}