TLS Engine (Masking + Parsing)
Обзор
Этот модуль реализует:
- Генерацию TLS ClientHello / ServerHello с профилями браузеров
- Гибкую сборку TLS Extensions (включая GREASE, padding, ALPS)
- Парсинг TLS-records и handshake-сообщений
- Маскировку под реальные браузеры (Chrome / Firefox)
- Минимальный TLS-стек для кастомного протокола
Фокус: fingerprint mimicry, а не полный TLS стек.
Архитектура
tlseng/
├── consts.rs # TLS константы
├── extension.rs # Extensions builder + parser
├── handshake.rs # ClientHello / ServerHello
├── profile.rs # Browser / Server profiles
├── tls_record.rs # TLS record layer
├── types.rs # enums + структуры
Основные компоненты
1. TLS Record Layer
Файл: tls_record.rs
Реализует базовый TLS record:
struct TlsRecord {
content_type: ContentType,
version: ProtocolVersion,
payload: Bytes
}
Поддержка:
- Handshake (0x16)
- ApplicationData (0x17)
- Alert (0x15)
Особенности:
- Минимальная валидация длины
- Быстрая сериализация без аллокаций
- ApplicationData требует минимум 17 байт (под AEAD)
2. Handshake Layer
Файл: handshake.rs
ClientHello
Генерация:
ClientHello::make_client_hello(profile, host, keys)
Что делает:
-
Генерирует
random(через session keys) -
Формирует
session_id:- 16 байт random
- 16 байт auth tag
-
Вставляет cipher suites из профиля
-
Добавляет extensions через
ExtensionBuilder -
Оборачивает в TLS Record
Особенности:
- TLS 1.3 masked как TLS 1.2 (version = 0x0303)
- Поддержка padding (для fingerprint совпадения)
- Полный контроль порядка extensions
ServerHello
ServerHello::make_server_hello(...)
-
Выбор cipher suite:
- либо server order
- либо client order
-
Всегда включает:
- supported_versions
- key_share
Минимальный TLS 1.3 ServerHello
3. Extension System
Файл: extension.rs
ExtensionStack (Parser)
- Парсит список extensions
- Проверяет корректность длины
- Позволяет искать extension по типу
find_by_type(etype) -> Option<Bytes>
ExtensionBuilder
Ключевой компонент маскировки.
ExtensionBuilder::apply_profile(profile, host, pub_key, overhead)
Поддерживает:
| Extension | Реализация |
|---|---|
| SNI | ✔ |
| ALPN | ✔ |
| ALPS | ✔ |
| Supported Groups | ✔ |
| Signature Algorithms | ✔ |
| KeyShare | ✔ |
| PSK Modes | ✔ |
| Padding | ✔ |
| GREASE | ✔ |
| Compress Certificate | ✔ |
| SCT | ✔ |
| Delegated Credentials | ✔ |
Особенности
GREASE
TlsExtensions::is_grease(id)
- Проверка по паттерну
0x?a?a - Вставляется только если
profile.has_grease
Padding
padding(target_size, overhead)
- Доводит ClientHello до нужного размера
- Используется для bypass DPI / fingerprint
ALPS (Application Settings)
application_settings(["h2"])
- Chromium-only behavior
- Добавляется только если есть в профиле
4. Profiles (Fingerprint Mimicry)
Файл: profile.rs
BrowserProfile
Определяет fingerprint:
pub struct BrowserProfile {
groups
signatures
versions
cipher_suites
extension_order
alpn
grease
padding
}
Примеры
Chrome 131
- GREASE: включен
- ALPS: включен
- Padding: 512 bytes
- TLS 1.3 only
- Record version: TLS 1.0 (как в реальном Chrome)
Firefox 130
- GREASE: выключен
- ALPS: нет
- Padding: нет
- TLS 1.2 + 1.3
Extension Order — критично
ExtensionOrder::CHROMIUM_131
Порядок полностью повторяет реальный браузер.
Это ключ к обходу:
- JA3 fingerprint
- DPI
- TLS fingerprinting
5. Типы и константы
Файл: types.rs
Содержит:
ContentTypeProtocolVersionHelloTypeTlsGroupsTlsSignaturesTlsVersionsTlsExtensions
Важно
TLS Versions
TlsVersions::TLS_13_ONLY
TlsVersions::MODERN
Метод:
max() -> ProtocolVersion
Supported Groups
X25519 (0x001d) — основной
Signature Algorithms
Совместимы с браузерами:
- ECDSA
- RSA-PSS
- RSA PKCS1
Парсинг
Все структуры реализуют трейт:
trait Parser {
fn can_parse(...)
fn parse(...)
}
Подход:
can_parse— быстрый pre-check без аллокацийparse— безопасный разбор
Безопасность и ограничения
Что есть
- Корректная структура TLS
- Реалистичный fingerprint
- Минимальная валидация
Чего нет
- Полного TLS state machine
- Certificate validation
- Finished / handshake verify
- AEAD шифрования (в этом модуле)
Основной use-case
Этот движок предназначен для:
- TLS fingerprint spoofing
- DPI bypass
- Proxy / tunneling протоколов
- Эмуляции браузера на уровне TLS
Пример использования
let client_hello = ClientHello::make_client_hello(
&BrowserProfile::CHROME_131,
"example.com",
&session_keys
);
Ключевые идеи
- TLS используется как транспорт маскировки
- Fingerprint важнее криптографии
- Поведение должно совпадать с браузером
- Порядок и длины критичны
- GREASE обязателен для Chromium
Если нужно — могу:
- разобрать отличия от real Chrome packet capture
- добавить JA3 генерацию
- указать где fingerprint ещё палится (важно)