Add randomized ETCP padding and isolate STCP CTR streams per connection
This commit is contained in:
1 parent
1f5b42845b
commit
a49cf5434e
31 files changed
+854
-103
No files matched your search
+24
-3
@@ -167,13 +167,13 @@ link_state: 0=just init, 1=handshake, 2=reconnect, 3=connected.
|
||||
- random_padding: случайные байты
|
||||
|
||||
3) PING (0x06):
|
||||
[0x06] [node_id(8 BE)] [nonce(8 BE)] [user_data_len(2 BE)] [user_data...]
|
||||
[0x06] [flags(1)] [node_id(8 BE)] [nonce(8 BE)] [user_data_len(2 BE)] [user_data...] [padding...]
|
||||
[salt(SC_PUBKEY_ENC_SALT_SIZE)] [obfuscated_pubkey(SC_PUBKEY_SIZE)]
|
||||
Отправляется с отдельным crypto-контекстом (не связан с ETCP-сессией).
|
||||
Используется для проверки доступности узла и NAT-тестирования.
|
||||
|
||||
4) PONG (0x07):
|
||||
[0x07] [node_id(8 BE)] [nonce(8 BE)] [resp_data_len(2 BE)] [response_data...]
|
||||
[0x07] [flags(1)] [node_id(8 BE)] [nonce(8 BE)] [resp_data_len(2 BE)] [response_data...] [padding...]
|
||||
[salt(SC_PUBKEY_ENC_SALT_SIZE)] [obfuscated_pubkey(SC_PUBKEY_SIZE)]
|
||||
Ответ на PING. nonce копируется из запроса для сопоставления.
|
||||
|
||||
@@ -183,11 +183,32 @@ link_state: 0=just init, 1=handshake, 2=reconnect, 3=connected.
|
||||
приём кодограмм из UDP выглядит так:
|
||||
uasync select -> etcp_connection.c etcp_connections_read_callback: memory_pool_alloc, decrypt (or init) -> etcp_conn_input (etcp.c/h - сам tcp механизм) -> ETCP_CONN output_queue
|
||||
|
||||
Keepalive: пакет без секций (только timestamp+flag_up в шифрованном заголовке, data_len=0).
|
||||
Keepalive: [0x08] [flags(1)] [period_ms(2 LE)] [sleep_fields?:4] [padding...].
|
||||
При KA_FLAG_SLEEP добавляются active_remaining(2 LE) и sleep_duration(2 LE), оба в единицах 0.1 с.
|
||||
Полезное тело занимает 4 байта без SLEEP или 8 байт с SLEEP; остальные байты — padding.
|
||||
keepalive пакеты шлют и клиент и сервер с заданным интервалом если нет полезного трафика.
|
||||
Сервер прекращает слать keepalive если линк потерян (ждёт keepalive от клиента).
|
||||
flag_up в заголовке устанавливается в значение recv_keepalive (признак что локальная сторона принимает пакеты).
|
||||
|
||||
Padding keepalive, PING/PONG и STCP-handshake:
|
||||
- ETCP_CONN хранит собственный диапазон min/max и независимый таймер для всех своих линков.
|
||||
- UTUN_INSTANCE хранит отдельный диапазон и таймер для PING/PONG без существующего ETCP_CONN.
|
||||
- При создании владельца и каждом обновлении: min=rand(0,30), max=min+rand(32,128), границы включительные.
|
||||
- Следующее обновление назначается через rand(50,300) секунд. При закрытии владельца таймер отменяется.
|
||||
- Каждый пакет независимо выбирает длину rand(min,max); padding заполняется нулями ДО шифрования.
|
||||
- UDP PING/PONG: padding шифруется перед CRC/tag; открытый salt+pubkey остаётся в конце датаграммы.
|
||||
user_data_len/resp_data_len обозначают только полезные данные. PONG не копирует padding запроса.
|
||||
- STCP: salt(8)+pubkey(32) открыты, затем 51 байт зашифрованного handshake и padding_size байт
|
||||
нулевого padding, зашифрованного продолжением того же CTR. Приём продвигает CTR через padding;
|
||||
padding_size=0 сразу завершает handshake. Параметры берутся у ETCP_CONN, иначе у instance.
|
||||
- Каждый STCP-поток использует соль своего отправителя: клиентскую для client→server, серверную для server→client.
|
||||
CTR IV = первые 12 байт SHA256(session_key || stream_id_LE || salt(8) || "uTun3-stream") + четыре нулевых байта.
|
||||
Отправка инициализируется после генерации своей соли, приём — после чтения соли пира, до расшифровки тела.
|
||||
После handshake CTR непрерывно продолжается через padding и DATA, без повторной инициализации на кадр.
|
||||
- Padding не должен превышать 158 байт. Для UDP длина ограничивается оставшимся MTU;
|
||||
если не помещается даже min, отправка завершается ошибкой без обрезания пользовательских данных.
|
||||
- Диагностика диапазонов/обновлений/PING/PONG: etcp=debug; keepalive: keepalive=debug.
|
||||
|
||||
Клиент: если все линки =down то начинается процедура восстановления связи:
|
||||
- клиент посылает init без сброса (0x04), link_state=2
|
||||
- сервер как получает init проверяет session_id:
|
||||
|
||||
@@ -3,6 +3,23 @@
|
||||
Сюда пишется список задач с короткой аннотацией. Если задача большая и имеет ТЗ - то ТЗ оформляется отдельным файлом, а сюда помещается аннотация и ссылка на ТЗ.
|
||||
|
||||
## Текущая задача
|
||||
[+] **Случайный зашифрованный padding ETCP** — 07.10.2026:
|
||||
keepalive UDP/TCP, UDP PING/PONG и STCP-handshake используют нулевой padding переменной длины.
|
||||
Каждый ETCP_CONN хранит свой диапазон и таймер; отдельный диапазон instance обслуживает пинги без соединения.
|
||||
min=rand(0,30), max=min+rand(32,128), обновление каждые rand(50,300) секунд.
|
||||
Добавлены проверки границ 0/158, эхо-данных, sleep/ACK, независимости и отмены таймеров, ошибок MTU/формата.
|
||||
TCP-пинг не удерживает instance. Полный check.sh: 134 PASS, 0 FAIL, 1 SKIP; proxy/burst/load — PASS.
|
||||
|
||||
[+] **STCP: исключить повтор CTR-потока между подключениями** — 07.10.2026:
|
||||
CTR IV теперь зависит от session_key, направления и соли отправителя из существующего блока handshake.
|
||||
Потоки инициализируются по мере получения солей; шифротекст Ed25519 и нулевого padding меняется.
|
||||
Проверяются повторные и параллельные подключения одной пары, короткие send/recv и подмена соли при том же ECDH.
|
||||
STCP — 14/14; полный check.sh — 134 PASS, 0 FAIL, 1 SKIP; proxy/burst/load — PASS.
|
||||
|
||||
[ ] **REALITY: исправить формат ClientHello и продолжение TLS-потока** — 07.10.2026:
|
||||
supported_groups и signature_algorithms не содержат внутренние двухбайтовые длины списков.
|
||||
После ClientHello/ServerHello идёт STCP без TLS record framing; это распознаётся пассивным наблюдателем.
|
||||
|
||||
[+] **Одна реакция автора и горизонтальный выбор смайликов** — 07.10.2026:
|
||||
выбор в Android и desktop отображается одной горизонтальной прокручиваемой строкой с выделением своего смайлика.
|
||||
Ядро допускает одну реакцию на сообщение от автора; другой смайлик атомарно заменяет прежний, повторный клик отменяет.
|
||||
|
||||
Reference in new issue
Block a user