From 342d353037fa46939ff4dd1efd55d7503bf2d6b7 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Sun, 5 Apr 2026 14:19:31 +0000 Subject: [PATCH 1/2] Initial plan From c5ccab2802ec5f372dc16ca8f6ea606550668257 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Sun, 5 Apr 2026 14:44:49 +0000 Subject: [PATCH 2/2] Fix ECH payload size to be per-connection random for better DPI bypass Agent-Logs-Url: https://github.com/chipitsine/td/sessions/728c1c97-9113-4e00-a90d-e5fd9df19daf Co-authored-by: chipitsine <2217296+chipitsine@users.noreply.github.com> --- td/mtproto/TlsInit.cpp | 22 +++++++++++++++++++--- 1 file changed, 19 insertions(+), 3 deletions(-) diff --git a/td/mtproto/TlsInit.cpp b/td/mtproto/TlsInit.cpp index 2ca658391ca5..4e7047f31c77 100644 --- a/td/mtproto/TlsInit.cpp +++ b/td/mtproto/TlsInit.cpp @@ -51,7 +51,8 @@ class TlsHello { BeginScope, EndScope, Permutation, - Padding + Padding, + EchPayload }; Type type; int length; @@ -116,8 +117,7 @@ class TlsHello { } static Op ech_payload() { Op res; - res.type = Type::Random; - res.length = Random::fast(0, 3) * 32 + 144; + res.type = Type::EchPayload; return res; } static Op padding() { @@ -232,6 +232,7 @@ class TlsHelloContext { public: TlsHelloContext(size_t grease_size, string domain) : grease_(grease_size, '\0'), domain_(std::move(domain)) { Grease::init(grease_); + ech_payload_size_ = static_cast(Random::fast(0, 3)) * 32 + 144; } char get_grease(size_t i) const { @@ -244,10 +245,14 @@ class TlsHelloContext { Slice get_domain() const { return Slice(domain_).substr(0, ProxySecret::MAX_DOMAIN_LENGTH); } + size_t get_ech_payload_size() const { + return ech_payload_size_; + } private: string grease_; string domain_; + size_t ech_payload_size_; }; class TlsHelloCalcLength { @@ -320,6 +325,10 @@ class TlsHelloCalcLength { size_ = 517; } break; + case Type::EchPayload: + CHECK(context); + size_ += context->get_ech_payload_size(); + break; default: UNREACHABLE(); } @@ -468,6 +477,13 @@ class TlsHelloStore { } break; } + case Type::EchPayload: { + CHECK(context); + auto payload_size = context->get_ech_payload_size(); + Random::secure_bytes(dest_.substr(0, payload_size)); + dest_.remove_prefix(payload_size); + break; + } default: UNREACHABLE(); }