From 24333bdf4473b9440788147d1dd1fc7c5fb346ec Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Sat, 14 Nov 2026 02:21:00 +0800 Subject: [PATCH] =?UTF-8?q?=F0=9F=8C=88=20Sync=202026-11-14=2002:21:00?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- glorytun-udp/Makefile | 2 +- glorytun-udp/init | 28 +- tracebox/Makefile | 2 +- .../usr/share/tracebox/omr-mptcp-trace.lua | 43 +- v2raya-core/Makefile | 2 +- v2raya-core/test.sh | 13 - v2raya/Makefile | 21 +- v2raya/files/v2raya.init | 1 + v2raya/files/web.tar.gz | Bin 871507 -> 0 bytes v2raya/test.sh | 13 - xray-core/Makefile | 106 +- xray-core/README.eip93.md | 173 + .../patches/100-restore-allow-insecure.patch | 154 + xray-core/patches/110-add-anytls-proxy.patch | 1202 ++++ .../120-restore-vmess-alterid-outbound.patch | 669 +++ xray-core/patches/130-add-naive-proxy.patch | 1648 ++++++ .../patches/140-add-shadowsocksr-proxy.patch | 5117 +++++++++++++++++ xray-core/patches/150-add-tuic-proxy.patch | 2314 ++++++++ xray-core/patches/160-add-snell-proxy.patch | 1642 ++++++ .../patches/170-add-shadowtls-transport.patch | 2732 +++++++++ .../patches/180-add-kcptun-transport.patch | 2009 +++++++ .../patches/190-an7581-eip93-aes-gcm.patch | 515 ++ 22 files changed, 18341 insertions(+), 65 deletions(-) delete mode 100644 v2raya-core/test.sh delete mode 100644 v2raya/files/web.tar.gz delete mode 100644 v2raya/test.sh create mode 100644 xray-core/README.eip93.md create mode 100644 xray-core/patches/100-restore-allow-insecure.patch create mode 100644 xray-core/patches/110-add-anytls-proxy.patch create mode 100644 xray-core/patches/120-restore-vmess-alterid-outbound.patch create mode 100644 xray-core/patches/130-add-naive-proxy.patch create mode 100644 xray-core/patches/140-add-shadowsocksr-proxy.patch create mode 100644 xray-core/patches/150-add-tuic-proxy.patch create mode 100644 xray-core/patches/160-add-snell-proxy.patch create mode 100644 xray-core/patches/170-add-shadowtls-transport.patch create mode 100644 xray-core/patches/180-add-kcptun-transport.patch create mode 100644 xray-core/patches/190-an7581-eip93-aes-gcm.patch diff --git a/glorytun-udp/Makefile b/glorytun-udp/Makefile index 321f16ebc..eae86fe70 100644 --- a/glorytun-udp/Makefile +++ b/glorytun-udp/Makefile @@ -13,7 +13,7 @@ PKG_SOURCE_URL:=https://github.com/ysurac/glorytun.git PKG_SOURCE_VERSION:=203c5f2223d7d5146d659b51159b2f02c2480d15 PKG_NAME:=glorytun-udp PKG_VERSION:=0.3.4 -PKG_RELEASE:=6 +PKG_RELEASE:=7 PKG_LICENSE:=BSD-2-Clause PKG_LICENSE_FILES:=LICENSE diff --git a/glorytun-udp/init b/glorytun-udp/init index cb43b0496..70ea41a77 100755 --- a/glorytun-udp/init +++ b/glorytun-udp/init @@ -36,6 +36,29 @@ validate_section() { 'dev:string' } +# persist keeps the device, and the address set on it, once glorytun is +# disabled: the next VPN on that device (OpenVPN's tun0) got both, and +# omr-tracker saw its gateway down. Only this exact address is removed, +# the device may already belong to that VPN +release_addr() { + [ -n "$1" ] && [ -n "$2" ] && [ -n "$3" ] || return 0 + ip addr del "$2" peer "$3" dev "$1" 2>/dev/null + return 0 +} + +stopped_instance() { + local enable dev localip remoteip + validate_section "${1}" || return 0 + [ "${enable}" = "1" ] || release_addr "$dev" "$localip" "$remoteip" +} + +# force_stop_vpn disables then stops, without a start; an enabled instance +# keeps its address across a restart +service_stopped() { + config_load glorytun-udp + config_foreach stopped_instance glorytun-udp +} + start_instance() { local enable key host port listener proto mtuauto chacha dev mode local persist kxtimeout timetolerance keepalive localip remoteip @@ -47,7 +70,10 @@ start_instance() { return 1 } - [ "${enable}" = "1" ] || return 1 + [ "${enable}" = "1" ] || { + release_addr "$dev" "$localip" "$remoteip" + return 1 + } [ -n "${key}" ] || return 1 [ "${key}" != "secretkey" ] || return 1 diff --git a/tracebox/Makefile b/tracebox/Makefile index e225d970a..62fb89ec9 100644 --- a/tracebox/Makefile +++ b/tracebox/Makefile @@ -10,7 +10,7 @@ include $(TOPDIR)/rules.mk PKG_NAME:=tracebox PKG_VERSION:=0.4.4 -PKG_RELEASE:=1 +PKG_RELEASE:=2 PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.bz2 PKG_SOURCE_SUBDIR:=$(PKG_NAME)-$(PKG_VERSION) diff --git a/tracebox/files/usr/share/tracebox/omr-mptcp-trace.lua b/tracebox/files/usr/share/tracebox/omr-mptcp-trace.lua index f7afd471b..99864f9e3 100644 --- a/tracebox/files/usr/share/tracebox/omr-mptcp-trace.lua +++ b/tracebox/files/usr/share/tracebox/omr-mptcp-trace.lua @@ -1,10 +1,45 @@ -pkt = ip{dst=to} / tcp{dst=65101} / MPCAPABLE +local function uci_get(key) + local f = io.popen("uci -q get " .. key) + local v = f and f:read("*l") or "" + if f then f:close() end + return v or "" +end + +-- Probe the port of the proxy in use: 65101 is shadowsocks-libev's, a VPS +-- may not run it or the path may treat it differently than the real one. +local port +local proxy = uci_get("openmptcprouter.settings.proxy") +if proxy:match("^shadowsocks%-rust") then + port = uci_get("shadowsocks-rust.sss0.server_port") +elseif proxy == "shadowsocks" then + port = uci_get("shadowsocks-libev.sss0.server_port") +end +port = tonumber(port) or 65101 + +-- tracebox's MPCAPABLE is MPTCP v0 (out-of-tree kernel), which the upstream +-- (v1, RFC 8684) kernel on the VPS ignores: build the 4-byte v1 SYN option +-- by hand (subtype 0 / version 1, flags H = HMAC-SHA256). +MPCAPABLE_V1 = TCPOption.new{kind=30, length=4, data={0x01, 0x01}} +pkt = ip{dst=to} / tcp{dst=port} / MPCAPABLE_V1 function cb(ttl, r_ip, mod) if r_ip == nil then r_ip = "*" end - print(ttl .. ": " .. tostring(r_ip) .. " " .. tostring(mod)) --- print(tostring(mod:original():ip())) + mod = tostring(mod) + -- Crafter can't parse a 4-byte MP_CAPABLE quoted back in ICMP and shows + -- it as raw bytes: that's the option kept, not stripped. The server's + -- 12-byte SYN/ACK option likewise shows as "-TCPOption +...Capable". + if mod:find("+RawLayer", 1, true) or mod:find("+TCPOptionMPTCPCapable", 1, true) then + mod = mod:gsub("%-TCPOption ", ""):gsub("%+RawLayer ", "") + end + print(ttl .. ": " .. tostring(r_ip) .. " " .. mod) end +print("Port: " .. port) result = tracebox(pkt, {callback="cb"}) -print("\nResult:\n" .. tostring(result)) \ No newline at end of file +print("\nResult:\n" .. tostring(result)) +-- The page's help text and omr-tracebox-mptcp key on these option names. +if result == nil then + print("No reply from the server") +elseif not tostring(result):find("TCPOptionMPTCPCapable", 1, true) then + print("-TCPOptionMPTCPCapable: no MPTCP in the server reply") +end diff --git a/v2raya-core/Makefile b/v2raya-core/Makefile index cacbb7ff4..b810c2048 100644 --- a/v2raya-core/Makefile +++ b/v2raya-core/Makefile @@ -11,7 +11,7 @@ include $(TOPDIR)/rules.mk PKG_NAME:=v2raya-core PKG_VERSION:=2.5.15 -PKG_RELEASE:=2 +PKG_RELEASE:=3 PKG_SOURCE:=v2rayA-$(PKG_VERSION).tar.gz PKG_SOURCE_URL:=https://codeload.github.com/v2rayA/v2rayA/tar.gz/v$(PKG_VERSION)? diff --git a/v2raya-core/test.sh b/v2raya-core/test.sh deleted file mode 100644 index 81243588d..000000000 --- a/v2raya-core/test.sh +++ /dev/null @@ -1,13 +0,0 @@ -#!/bin/sh -# SPDX-License-Identifier: GPL-3.0-only -# -# Copyright (C) 2026 Amr Fateem - -case "$1" in -v2raya-core) - /usr/bin/v2raya_core version | grep -F "$2" - ;; -*) - exit 1 - ;; -esac diff --git a/v2raya/Makefile b/v2raya/Makefile index afe7ee386..7538a92ce 100644 --- a/v2raya/Makefile +++ b/v2raya/Makefile @@ -14,12 +14,15 @@ include $(TOPDIR)/rules.mk PKG_NAME:=v2raya PKG_VERSION:=2.5.15 -PKG_RELEASE:=10 +PKG_RELEASE:=11 PKG_SOURCE:=v2rayA-$(PKG_VERSION).tar.gz PKG_SOURCE_URL:=https://codeload.github.com/v2rayA/v2rayA/tar.gz/v$(PKG_VERSION)? PKG_HASH:=skip +WEB_FILE:=v2raya-web-$(PKG_VERSION).tar.gz +WEB_HASH:=76774f195ee74604fbc43a48fe74e5f3363e81ec68af02d1c26feeeacc0f63ae + PKG_BUILD_DIR:=$(BUILD_DIR)/v2rayA-$(PKG_VERSION)/service PKG_LICENSE:=AGPL-3.0-only @@ -117,12 +120,6 @@ define Package/v2raya/prerm } endef -# v2rayA publishes the built web UI as web.tar.gz on its releases. The -# GitHub release CDN has been returning 504/404 for it, which makes every -# matrix build fail. Keep the 871 KiB asset in the package instead; the -# hash of the upstream v2.5.13 asset is -# 76774f195ee74604fbc43a48fe74e5f3363e81ec68af02d1c26feeeacc0f63ae. - define Build/Prepare $(call Build/Prepare/Default) @@ -156,7 +153,7 @@ define Build/Prepare ( \ mkdir -p $(PKG_BUILD_DIR)/server/router/web ; \ - gzip -dc $(CURDIR)/files/web.tar.gz | $(HOST_TAR) -C $(PKG_BUILD_DIR)/server/router/web $(TAR_OPTIONS) ; \ + gzip -dc $(DL_DIR)/$(WEB_FILE) | $(HOST_TAR) -C $(PKG_BUILD_DIR)/server/router/web $(TAR_OPTIONS) ; \ ) endef @@ -184,5 +181,13 @@ define Package/v2raya/install $(INSTALL_DIR) $(1)/usr/share/v2raya endef +define Download/v2raya-web + URL:=https://github.com/v2rayA/v2rayA/releases/download/v$(PKG_VERSION)/ + URL_FILE:=web.tar.gz + FILE:=$(WEB_FILE) + HASH:=skip +endef + +$(eval $(call Download,v2raya-web)) $(eval $(call GoBinPackage,v2raya)) $(eval $(call BuildPackage,v2raya)) diff --git a/v2raya/files/v2raya.init b/v2raya/files/v2raya.init index b0051667c..51aaa5c69 100755 --- a/v2raya/files/v2raya.init +++ b/v2raya/files/v2raya.init @@ -2,6 +2,7 @@ # SPDX-License-Identifier: GPL-3.0-only # # Copyright (C) 2021 Tianling Shen +# Copyright (C) 2021 Tianling Shen # Copyright (C) 2026 Amr Fateem # # procd init script for v2rayA. diff --git a/v2raya/files/web.tar.gz b/v2raya/files/web.tar.gz deleted file mode 100644 index 9adfc66718a4ca26eb5de836f4fafc076c973f71..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 871507 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 z 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

3h-C(yi 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%0DCAy&>D74#u#ts=#Q{a#MmACngLyWm8|pFk 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 Uf}gfV!t}7s9YL-u4$bph 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

gX!&-3Vd7BVcEX=~J5cUSCqF5nX#}-) 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%0DcQd9DfI2ma@S5B7g=`q__Fvkm#H_u07n*;cbk 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

PRDh2nX1VK=BO3Y1#ij;nU%2&~%PAM;f7HIl$)q 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

6lL@6F&+f>3sch6JlqXpw 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
B)<&(6g7-%BvF080SV|Fp!y@!!+zob*iW|Elrd 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 diff --git a/v2raya/test.sh b/v2raya/test.sh deleted file mode 100644 index 5714d961e..000000000 --- a/v2raya/test.sh +++ /dev/null @@ -1,13 +0,0 @@ -#!/bin/sh -# SPDX-License-Identifier: GPL-3.0-only -# -# Copyright (C) 2026 Amr Fateem - -case "$1" in -v2raya) - /usr/bin/v2raya --version | grep -F "$2" - ;; -*) - exit 1 - ;; -esac diff --git a/xray-core/Makefile b/xray-core/Makefile index 21734cd1e..e52e916f8 100644 --- a/xray-core/Makefile +++ b/xray-core/Makefile @@ -1,23 +1,26 @@ include $(TOPDIR)/rules.mk -PKG_NAME:=Xray-core +PKG_NAME:=xray-core PKG_VERSION:=26.11.9 -PKG_RELEASE:=30 +PKG_RELEASE:=31 PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz PKG_SOURCE_URL:=https://codeload.github.com/XTLS/Xray-core/tar.gz/v$(PKG_VERSION)? PKG_HASH:=skip PKG_MAINTAINER:=Tianling Shen -PKG_LICENSE:=MPL-2.0 -PKG_LICENSE_FILES:=LICENSE +PKG_LICENSE:=MPL-2.0 GPL-3.0-or-later MIT +PKG_LICENSE_FILES:=LICENSE proxy/anytls/LICENSE.sing-anytls proxy/naive/LICENSE.sing-box proxy/shadowsocksr/LICENSE proxy/tuic/LICENSE.mihomo proxy/snell/LICENSE.mihomo transport/internet/shadowtls/LICENSE.mihomo transport/internet/kcptun/LICENSE.mihomo transport/internet/kcptun/LICENSE.kcptun -PKG_BUILD_DEPENDS:=golang/host +PKG_BUILD_DIR:=$(BUILD_DIR)/Xray-core-$(PKG_VERSION) +PKG_BUILD_DEPENDS:=golang/host upx/host +PKG_CONFIG_DEPENDS:=CONFIG_XRAY_CORE_NAIVE PKG_BUILD_PARALLEL:=1 PKG_USE_MIPS16:=0 PKG_BUILD_FLAGS:=no-mips16 GO_PKG:=github.com/xtls/xray-core +GO_PKG_LDFLAGS:=-s -w GO_PKG_BUILD_PKG:=$(GO_PKG)/main GO_PKG_LDFLAGS_X:= \ $(GO_PKG)/core.build=OpenWrt \ @@ -26,36 +29,93 @@ GO_PKG_LDFLAGS_X:= \ include $(INCLUDE_DIR)/package.mk include $(TOPDIR)/feeds/packages/lang/golang/golang-package.mk -define Package/xray/template +# Cronet's native archives contain LLVM bitcode. Use its matching linker while +# retaining OpenWrt's target GCC, sysroot, ABI flags and C runtime. +CRONET_CLANG_VERSION:=llvmorg-24-init-3796-g20e97c4b-27 +CRONET_CLANG_FILE:=clang-$(CRONET_CLANG_VERSION).tar.xz +CRONET_CLANG_DIR:=$(PKG_BUILD_DIR)/.cronet-clang + +ifeq ($(CONFIG_XRAY_CORE_NAIVE),y) + GO_PKG_TAGS+=with_naive_outbound + ifeq ($(CONFIG_USE_MUSL),y) + GO_PKG_TAGS+=with_musl + endif + # golang-package.mk also appends TARGET_LDFLAGS through -extldflags, after + # CGO_LDFLAGS. Select LLD here so the SDK cannot override it with ld.bfd. + TARGET_LDFLAGS:=$(filter-out -fuse-ld=%,$(TARGET_LDFLAGS)) -B$(CRONET_CLANG_DIR)/bin -fuse-ld=lld $(if $(filter arm i386 mipsel loongarch64,$(ARCH)),-Wl$(comma)-no-pie) $(if $(filter loongarch64,$(ARCH)),-Wl$(comma)--no-relax) + + ifeq ($(HOST_OS)-$(HOST_ARCH),Linux-x86_64) + define Download/cronet-clang + URL:=https://commondatastorage.googleapis.com/chromium-browser-clang/Linux_x64 + URL_FILE:=$(CRONET_CLANG_FILE) + FILE:=$(CRONET_CLANG_FILE) + HASH:=skip + endef + $(eval $(call Download,cronet-clang)) + endif + + define Build/Prepare + @if [ "$(HOST_OS)-$(HOST_ARCH)" != "Linux-x86_64" ]; then \ + echo "xray-core: Naive outbound requires a Linux x86_64 build host; disable CONFIG_XRAY_CORE_NAIVE on this host." >&2; \ + exit 1; \ + fi + $(call Build/Prepare/Default) + $(INSTALL_DIR) $(CRONET_CLANG_DIR) + $(TAR) -xJf $(DL_DIR)/$(CRONET_CLANG_FILE) -C $(CRONET_CLANG_DIR) + endef +endif + +# Apply only to this package; runtime DT detection restricts use to AN7581. +# Resolve Go through the same versioned PATH and environment as the build. +ifeq ($(GO_ARCH),arm64) + define Build/Compile + $(GO_PKG_VARS) python3 $(PKG_BUILD_DIR)/tools/eip93/overlay.py --go go --out $(PKG_BUILD_DIR)/.eip93-overlay + $(call GoPackage/Build/Compile,-overlay=$(PKG_BUILD_DIR)/.eip93-overlay/overlay.json) + endef +endif + +# Compress once per build, not once per package/rootfs installation. +# Keep Go's output intact and let the .built stamp guard the packed copy. +define Build/Install + $(INSTALL_DIR) $(PKG_BUILD_DIR)/.upx + $(INSTALL_BIN) $(GO_PKG_BUILD_BIN_DIR)/main $(PKG_BUILD_DIR)/.upx/xray + $(STAGING_DIR_HOST)/bin/upx --lzma --best $(PKG_BUILD_DIR)/.upx/xray +endef + +# Go's -s -w flags strip the binary before UPX; do not strip it again. +RSTRIP:=: + +define Package/xray-core TITLE:=A platform for building proxies to bypass network restrictions SECTION:=net CATEGORY:=Network URL:=https://xtls.github.io -endef - -define Package/xray-core - $(call Package/xray/template) DEPENDS:=$(GO_ARCH_DEPENDS) +ca-bundle endef -define Package/xray/description +define Package/xray-core/config + config XRAY_CORE_NAIVE + bool "Enable NaiveProxy outbound (Chromium/Cronet)" + depends on PACKAGE_xray-core + depends on (aarch64 || arm || i386 || x86_64 || mipsel || riscv64 || loongarch64) + depends on (USE_MUSL || USE_GLIBC) + depends on !arm || (arm_v7 && HAS_FPU) + default $(if $(filter Linux-x86_64,$(HOST_OS)-$(HOST_ARCH)),y,n) + help + Link Chromium/Cronet for NaiveProxy HTTP/2 and HTTP/3 outbounds. + Requires an x86_64 Linux build host and adds a native library to Xray. + Disabled by default on other build hosts, including ARM and ARM64. + Naive inbound support remains available when this option is disabled. +endef + +define Package/xray-core/description Xray, Penetrates Everything. It helps you to build your own computer network. It secures your network connections and thus protects your privacy. endef -define Package/xray-core/description - $(call Package/xray/description) -endef - -define Package/xray-core/conffiles -/etc/xray/ -/etc/config/xray -endef - define Package/xray-core/install - $(call GoPackage/Package/Install/Bin,$(PKG_INSTALL_DIR)) - $(INSTALL_DIR) $(1)/usr/bin/ - $(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/bin/main $(1)/usr/bin/xray + $(INSTALL_DIR) $(1)/usr/bin + $(INSTALL_BIN) $(PKG_BUILD_DIR)/.upx/xray $(1)/usr/bin/xray endef $(eval $(call BuildPackage,xray-core)) diff --git a/xray-core/README.eip93.md b/xray-core/README.eip93.md new file mode 100644 index 000000000..5b058bf18 --- /dev/null +++ b/xray-core/README.eip93.md @@ -0,0 +1,173 @@ +# AN7581 EIP93 hybrid AES-GCM + +Xray 26.10.31 includes an automatic AN7581-only AES-GCM path through Linux AF_ALG. +EIP93 performs AES-CTR; GHASH stays on the CPU. This is not native hardware GCM. + +The ARM64 package build generates a private Go source overlay. It never changes +the shared toolchain. The overlay is checked against Go 1.27's implementation; +unknown source layouts fail the build so that they can be reviewed explicitly. +Go TLS/uTLS and other users of Go AES-GCM can use it. Native Cronet TLS does not. +TLS framing, nonce management, overlap checks and authentication checks remain +in their original implementations. + +## Automatic selection and fallback + +- Read the NUL-delimited root DT `compatible` property from sysfs or procfs. +- Enable only `airoha,an7581` / `airoha,en7581`, with no ARM AES instructions. +- Explicitly exclude AN7583/EN7583, other platforms, missing/malformed DT and FIPS. +- Use only standard 12-byte nonces, 16-byte tags and 4–32 KiB payloads. +- Bind `gcm_base(ctr(aes-eip93),ghash-generic)` on older kernels, retrying + `gcm_base(ctr(aes-eip93),ghash-lib)` on kernels such as 7.3 when the old + name fails to bind, including driver or policy errors. Both names require + the exact EIP93 CTR driver; failure of both keeps the original Go path. +- Verify each newly opened key against Go encryption/decryption and bad-tag + rejection before using it. Bound sockets, serialize each key's operations, + set socket timeouts and clear private buffers. The kernel must also be healthy; + socket timeouts do not recover a hung DMA engine. +- Missing modules, failed verification or syscall errors use the original Go + implementation. Authentication failures remain failures. +- `XRAY_EIP93=off` disables the optimization; there is no force-enable override. + +The first successful activation prints: +`Xray EIP93: AN7581 AES-GCM hybrid backend enabled (AF_ALG CTR + CPU GHASH)`. +This message alone is not performance evidence; use engine interrupt counters. + +Firmware needs `kmod-crypto-hw-airoha-eip93`, `kmod-crypto-gcm`, `kmod-crypto-user` and +GHASH/DES dependencies. The QWRT EIP93 package selects these dependencies. +BSP 5.4 needs the supplied driver and DT node. Linux 6.18 uses its native driver +with matching DMA cache-line and immutable-SA fixes. Linux 7.3 carries the +same protections plus the CTR next-IV carry fix, and additionally +needs the supplied AF_ALG exception for the exact EIP93 hybrid GCM driver; +leave `crypto.af_alg_restrict` at its default value. Native hardware authenc +is withheld because its bad-tag tests fail; hybrid GCM authenticates through +the kernel GCM implementation and passes its own bad-tag tests. AN7583 remains on the normal +Xray path until separate hardware measurements justify an alternative. + +## Validation + +The entire 100–190 patch stack replays on the official 26.10.31 archive with +`patch --fuzz=0`. The version upgrade refreshed dependency contexts and fixed +patch 100's TLS protobuf descriptor length; `infra/conf` tests catch that issue. +Existing protocol packages compile and their available tests pass. The ARM64 +OpenWrt package also builds with `with_naive_outbound with_musl` and Cronet LLD. +This is not a claim of rerunning every historical cross-core protocol matrix. + +On Nokia XG-040G-MD UBI / AN7581 / Linux 5.4.302: + +- AES-128/192/256 comparisons against the independent Go generic implementation. +- Payload boundaries, in-place operations, corrupted tags, concurrent requests, + closed-socket fallback, nonstandard nonce/tag exclusion and the off switch. +- Go `crypto/cipher` short regression suite on the device. +- Ordinary client → optimized server and optimized client → ordinary server, + plus ordinary controls, using VLESS/TLS 1.2 AES-256-GCM. Each connection sends + and receives deterministic data and checks SHA-256. Hardware interrupts grow + only in optimized runs. + +Local raw evidence and reproducible test sources: +`/home/lean/Desktop/airoha-5.4-evidence/eip93-20261022/`. + +## Final Xray throughput + +VLESS/TLS 1.2, server restricted to AES-256-GCM, same patched source and +Naive/Cronet build features. AN7581 at 1.2 GHz, Gigabit LAN. Each of two +alternating runs per row sends and receives 32 MiB and verifies SHA-256. +The optimized binary is the packaged UPX artifact; startup completes before +timing. Both ordinary-client/optimized-server and optimized-client/ordinary- +server directions passed. Values are mean Mbps; connection/relay overhead is +included. Receive results varied roughly 95–112 Mbps across optimized runs. +These final measurements use the driver extracted from the final IPK, including +the immutable-SA and native-authenc fixes; see `xray-e2e-packaged-final.log`. + +| AN7581 role | Build | Router sends | Router receives | +| --- | --- | ---: | ---: | +| server | normal | 35.0 | 32.1 | +| server | eip93 | 136.6 | 98.2 | +| client | normal | 34.4 | 32.5 | +| client | eip93 | 133.3 | 104.5 | + +All eight runs agree on SHA-256: +`e09320c5b00b34bb704802136c599a95b3996332ba84d7c7f21112b6231b6bd0`. +Ordinary runs add no EIP93 interrupts; each optimized run adds 8198. + +This supports enabling the AN7581 path for bulk Go AES-GCM traffic, with +roughly 3–4x throughput versus ordinary Go. It does not imply gigabit GCM, +the same gain over optimized OpenSSL, or any measured benefit on AN7583. + +The packaged binary with `XRAY_EIP93=off` also passed bidirectional hash +checks at 33.5/34.9 Mbps, with no EIP93 interrupt increase. The host AMD64 +Go cipher regression passes with the overlay present and acceleration disabled. + +The native-authenc quarantine preserves the kernel `authenc` composition over +EIP93 CBC/HMAC primitives. That composed implementation passes 12- and 13-byte +AAD encryption/decryption and corrupted-tag tests; `/proc/crypto` identifies +its module as `authenc`, rather than `crypto_hw_eip93`. + +The final Nokia UBI firmware builds and includes Xray 26.10.21, EIP93, libdes, +GCM, GHASH and AF_ALG modules. Its embedded FIT DTB has the EIP93 node at +0x1fb70000 / GIC SPI 44. All 16 generated AN7581 BSP DTBs contain that node, +including standalone Nokia, Fiberhome and W1700K DTS layouts. + +The final image passes `sysupgrade -T` on the Nokia test board +(`Signature check OK`). This validates the image without flashing it. +The board governor is restored to `schedutil` and test proxy processes stop +after each run. The final driver remains loaded temporarily for inspection. + +## Linux 7.3 regression validation (2026-10-29) + +On H3C HM2004-DU, five repeated hardware test runs passed AES-128/192/256-GCM, +boundary lengths, in-place operations, concurrent use, bad-tag rejection and +closed-socket fallback. CBC encrypt/decrypt/encrypt and CTR exact-rollover IV +tests failed with the original 7.3 driver and passed after the driver fixes. +The packaged Xray completed a 4 MiB AES-256-GCM Shadowsocks transfer with +matching SHA-256 and EIP93 activation at both ends. The disabled backend +completed the same transfer without increasing EIP93 interrupts. +`crypto.af_alg_restrict` remained at 1. These are correctness checks, not +throughput measurements. The legacy 5.4 name is retained; 5.4 hardware was +not rerun in this validation. + +## Xray 26.10.29 regression validation (2026-10-31) + +All ten patches were refreshed using temporary files and labeled unified diffs. +They replay on the official v26.10.29 archive with zero fuzz and no offsets. +The ARM64 OpenWrt package builds with Naive/Cronet enabled and passes the UPX +integrity check. Configuration, AnyTLS and VMess tests pass; the other added +protocol packages compile in the focused regression run. + +On FiberHome HG5585F CT / AN7581 / Linux 7.3, the package was installed as +26.10.29-1 and its binary hash matched the IPK. The EIP93 hardware tests pass +AES-128/192/256, payload boundaries, in-place operations, bad-tag rejection, +concurrency and closed-socket fallback. A 4 MiB AES-256-GCM Shadowsocks +loopback transfer with both peers in the packaged Xray matches SHA-256 +`2b07811057df887086f06a67edc6ebf911de8b6741156e7a2eb1416a4b8b1b2e`. +With `XRAY_EIP93=off`, the interrupt count stays at 1818; the enabled run +increases it to 2651, and unmodified `/sbin/usage` reports the same count. +`crypto.af_alg_restrict` remains 1. + +These checks use the fixed EIP93 and AF_ALG modules loaded temporarily on the +test machine. They establish correctness and acceleration activation, not +throughput, a full firmware build or persistence of the kernel fixes after +reboot. The firmware must include the matching Linux 7.3 fixes. + +## Xray 26.10.31 build validation (2026-11-01) + +The source archive SHA-256 is +`be44f95d497ad4ba6e9d1dcfbbd71e8e51f812aff077d4c15c9947eff5e3046a`. +All ten patches replay with zero fuzz and zero offsets. Temporary files and +labeled unified diffs refresh the changed dependency contexts in patches 150 +and 180, including upstream's protoc-gen-go-grpc update to 1.6.2. + +EIP93 backend selection now tries the exact `ghash-lib` composition after any +legacy-name bind error, matching the Mihomo compatibility behavior. An ARM64 +QEMU regression checks success, missing algorithms, invalid arguments, absent +drivers and permission errors, including failure of both names. DT gating and +the Go GCM tests pass; the hardware-only test is skipped without AN7581. + +The ARM64 OpenWrt package builds with Naive/Cronet, musl and the private EIP93 +Go overlay enabled. Configuration, AnyTLS and VMess tests pass, and the other +added protocol packages compile. The resulting ARM64 program starts under QEMU +and reports 26.10.31; the UPX integrity check passes. + +This run does not repeat the historical board tests or validate Linux 7.3 +hardware throughput. The matching kernel EIP93/AF_ALG fixes described above +remain required; native Cronet TLS does not use the Go acceleration overlay. +Local build and regression logs: `/tmp/xray-26.10.31-validation/`. diff --git a/xray-core/patches/100-restore-allow-insecure.patch b/xray-core/patches/100-restore-allow-insecure.patch new file mode 100644 index 000000000..56a1d32b4 --- /dev/null +++ b/xray-core/patches/100-restore-allow-insecure.patch @@ -0,0 +1,154 @@ +From: coolsnowwolf +Subject: [PATCH] tls: restore explicit allowInsecure compatibility + +Restore the opt-in TLS option for legacy proxy certificates, including +Hysteria2 servers without SANs. Keep certificate verification enabled by +default and continue enforcing explicit certificate pins and names. + +Signed-off-by: coolsnowwolf + +--- a/infra/conf/transport_security.go ++++ b/infra/conf/transport_security.go +@@ -359,9 +359,7 @@ + config.RejectUnknownSni = c.RejectUnknownSNI + config.MasterKeyLog = c.MasterKeyLog + +- if c.AllowInsecure { +- return nil, errors.PrintRemovedFeatureError(`"allowInsecure"`, `"pinnedPeerCertSha256"(pcs) and "verifyPeerCertByName"(vcn)`) +- } ++ config.AllowInsecure = c.AllowInsecure + if c.PinnedPeerCertSha256 != "" { + for v := range strings.SplitSeq(c.PinnedPeerCertSha256, ",") { + v = strings.TrimSpace(v) +--- a/infra/conf/tls_allow_insecure_test.go ++++ b/infra/conf/tls_allow_insecure_test.go +@@ -0,0 +1,70 @@ ++package conf_test ++ ++import ( ++ "crypto/sha256" ++ "crypto/tls" ++ "encoding/hex" ++ "encoding/json" ++ "io" ++ "log" ++ "net" ++ "net/http" ++ "net/http/httptest" ++ "strings" ++ "testing" ++ "time" ++ ++ "github.com/xtls/xray-core/infra/conf" ++ xraytls "github.com/xtls/xray-core/transport/internet/tls" ++ "google.golang.org/protobuf/proto" ++) ++ ++func TestTLSAllowInsecure(t *testing.T) { ++ server := httptest.NewUnstartedServer(http.HandlerFunc(func(http.ResponseWriter, *http.Request) {})) ++ server.Config.ErrorLog = log.New(io.Discard, "", 0) ++ server.StartTLS() ++ defer server.Close() ++ hash := sha256.Sum256(server.Certificate().Raw) ++ pin := hex.EncodeToString(hash[:]) ++ for _, tc := range []struct { ++ name string ++ options string ++ wantOK bool ++ }{ ++ {"default rejects untrusted certificate", `{}`, false}, ++ {"false rejects untrusted certificate", `{"allowInsecure":false}`, false}, ++ {"true accepts untrusted certificate", `{"allowInsecure":true}`, true}, ++ {"valid pin", `{"pinnedPeerCertSha256":"` + pin + `"}`, true}, ++ {"true with valid pin", `{"allowInsecure":true,"pinnedPeerCertSha256":"` + pin + `"}`, true}, ++ {"true preserves invalid pin rejection", `{"allowInsecure":true,"pinnedPeerCertSha256":"` + strings.Repeat("00", 32) + `"}`, false}, ++ {"true preserves explicit name verification", `{"allowInsecure":true,"verifyPeerCertByName":"wrong.invalid"}`, false}, ++ } { ++ t.Run(tc.name, func(t *testing.T) { ++ var input conf.TLSConfig ++ if err := json.Unmarshal([]byte(tc.options), &input); err != nil { ++ t.Fatal(err) ++ } ++ input.ServerName = "example.com" ++ built, err := input.Build() ++ if err != nil { ++ t.Fatal(err) ++ } ++ // Exercise the protobuf path used by the core, not just the JSON loader. ++ data, err := proto.Marshal(built) ++ if err != nil { ++ t.Fatal(err) ++ } ++ var config xraytls.Config ++ if err := proto.Unmarshal(data, &config); err != nil { ++ t.Fatal(err) ++ } ++ conn, err := tls.DialWithDialer(&net.Dialer{Timeout: 3 * time.Second}, "tcp", server.Listener.Addr().String(), config.GetTLSConfig()) ++ if conn != nil { ++ conn.Close() ++ } ++ if (err == nil) != tc.wantOK { ++ t.Fatalf("handshake error = %v, want success %v", err, tc.wantOK) ++ } ++ }) ++ } ++} +--- a/transport/internet/tls/config.proto ++++ b/transport/internet/tls/config.proto +@@ -38,7 +38,8 @@ + } + + message Config { +- // Number 1 was assigned and used by an legacy option. ++ // Allow unverified certificates only when explicitly enabled by the client. ++ bool allow_insecure = 1; + + // List of certificates to be served on server. + repeated Certificate certificate = 2; +--- a/transport/internet/tls/config.pb.go ++++ b/transport/internet/tls/config.pb.go +@@ -178,6 +178,8 @@ + + type Config struct { + state protoimpl.MessageState `protogen:"open.v1"` ++ // Allow unverified certificates only when explicitly enabled by the client. ++ AllowInsecure bool `protobuf:"varint,1,opt,name=allow_insecure,json=allowInsecure,proto3" json:"allow_insecure,omitempty"` + // List of certificates to be served on server. + Certificate []*Certificate `protobuf:"bytes,2,rep,name=certificate,proto3" json:"certificate,omitempty"` + // Override server name. +@@ -241,6 +243,13 @@ + return file_transport_internet_tls_config_proto_rawDescGZIP(), []int{1} + } + ++func (x *Config) GetAllowInsecure() bool { ++ if x != nil { ++ return x.AllowInsecure ++ } ++ return false ++} ++ + func (x *Config) GetCertificate() []*Certificate { + if x != nil { + return x.Certificate +@@ -385,8 +394,9 @@ + "\x05Usage\x12\x10\n" + + "\fENCIPHERMENT\x10\x00\x12\x14\n" + + "\x10AUTHORITY_VERIFY\x10\x01\x12\x13\n" + +- "\x0fAUTHORITY_ISSUE\x10\x02\"\xca\x06\n" + +- "\x06Config\x12J\n" + ++ "\x0fAUTHORITY_ISSUE\x10\x02\"\xf1\x06\n" + ++ "\x06Config\x12%\n" + ++ "\x0eallow_insecure\x18\x01 \x01(\bR\rallowInsecure\x12J\n" + + "\vcertificate\x18\x02 \x03(\v2(.xray.transport.internet.tls.CertificateR\vcertificate\x12\x1f\n" + + "\vserver_name\x18\x03 \x01(\tR\n" + + "serverName\x12#\n" + +--- a/transport/internet/tls/config.go ++++ b/transport/internet/tls/config.go +@@ -385,6 +385,7 @@ + PinnedPeerCertSha256: c.PinnedPeerCertSha256, + } + config := &tls.Config{ ++ InsecureSkipVerify: c.AllowInsecure, + Rand: randCarrier, + ClientSessionCache: globalSessionCache, + RootCAs: root, diff --git a/xray-core/patches/110-add-anytls-proxy.patch b/xray-core/patches/110-add-anytls-proxy.patch new file mode 100644 index 000000000..3a41d046f --- /dev/null +++ b/xray-core/patches/110-add-anytls-proxy.patch @@ -0,0 +1,1202 @@ +From: coolsnowwolf +Subject: [PATCH] proxy: add AnyTLS inbound and outbound + +Use sing-anytls at 580984e4d8cb for authenticated reusable TLS sessions. +Adapt both directions to Xray routing, TCP and UDP-over-TCP. Support +multiple inbound users, padding negotiation and fragmented prologues. +Require TLS on inbound, preserve private-target restrictions, and join +inbound copy loops before releasing stream state. Retain outbound TLS, +socket marks, dialer chains and session-pool lifecycle handling. + +Reference: https://github.com/XTLS/Xray-core/pull/5907 +Signed-off-by: coolsnowwolf + +--- a/go.mod ++++ b/go.mod +@@ -53,6 +53,8 @@ + github.com/pion/logging v0.2.4 // indirect + github.com/pion/transport/v4 v4.1.0 // indirect + github.com/quic-go/qpack v0.6.0 // indirect ++ github.com/sagernet/sing v0.8.14 ++ github.com/sagernet/sing-anytls v0.0.0-20260928104022-580984e4d8cb + github.com/vishvananda/netns v0.0.5 // indirect + github.com/wlynxg/anet v0.0.5 // indirect + go.yaml.in/yaml/v3 v3.0.5 // indirect +--- a/go.sum ++++ b/go.sum +@@ -73,6 +73,10 @@ + github.com/robfig/cron/v3 v3.0.1/go.mod h1:eQICP3HwyT7UooqI/z+Ov+PtYAWygg1TEWWzGIFLtro= + github.com/rogpeppe/go-internal v1.16.0 h1:O9DK+vNMDVGLr2BeZqmpLeMjiMNkuXfcqntWbZV6S5g= + github.com/rogpeppe/go-internal v1.16.0/go.mod h1:DrUVZyrJU+txYW5/1kwtXQSMFio52ZOxX7yM1VHvnxs= ++github.com/sagernet/sing v0.8.14 h1:S6Netv4F61uNAuD/sUbHnGuNUEPwtL08Ouk0//CVYgM= ++github.com/sagernet/sing v0.8.14/go.mod h1:olXxWQNqRW/l2Q6JI3b2Qmz8iQnIFlOeeH8bx6JhgUA= ++github.com/sagernet/sing-anytls v0.0.0-20260928104022-580984e4d8cb h1:n4sF2zv0CR1gcb4awh61t11t0FZmcP40x5enB8HARjE= ++github.com/sagernet/sing-anytls v0.0.0-20260928104022-580984e4d8cb/go.mod h1:VRKLnj0ObEsN228h+zuzf91p+6sjtYE8SBaLPVsBy5o= + github.com/stretchr/testify v1.12.1 h1:EuwCh5fleGS7H32xRwO3wRGT7DxrDhLAT6FF8MpWDWE= + github.com/stretchr/testify v1.12.1/go.mod h1:MDEgiDPPsNp5cuIrHPPCyornHKgEVbtFUmoNlxoYthg= + github.com/vishvananda/netlink v1.3.1 h1:3AEMt62VKqz90r0tmNhog0r/PpWKmrEShJU0wJW6bV0= +--- a/infra/conf/anytls.go ++++ b/infra/conf/anytls.go +@@ -0,0 +1,63 @@ ++package conf ++ ++import ( ++ "github.com/xtls/xray-core/common/errors" ++ "github.com/xtls/xray-core/proxy/anytls" ++ "google.golang.org/protobuf/proto" ++ "strings" ++) ++ ++// AnyTLSClientConfig follows the outbound schema proposed in Xray-core#5907. ++// Session intervals are expressed in seconds, as in that proposal. ++type AnyTLSClientConfig struct { ++ Address *Address `json:"address"` ++ Port uint16 `json:"port"` ++ Password string `json:"password"` ++ Level uint32 `json:"level"` ++ IdleSessionCheckInterval uint32 `json:"idleSessionCheckInterval"` ++ IdleSessionTimeout uint32 `json:"idleSessionTimeout"` ++ MinIdleSession int32 `json:"minIdleSession"` ++} ++ ++func (c *AnyTLSClientConfig) Build() (proto.Message, error) { ++ if c.Address == nil || c.Port == 0 { ++ return nil, errors.New("anytls: server address and port are required") ++ } ++ if c.Password == "" { ++ return nil, errors.New("anytls: password is required") ++ } ++ if c.MinIdleSession < 0 { ++ return nil, errors.New("anytls: minIdleSession must be non-negative") ++ } ++ return &anytls.ClientConfig{ ++ Address: c.Address.Build(), Port: uint32(c.Port), Password: c.Password, Level: c.Level, ++ IdleSessionCheckInterval: c.IdleSessionCheckInterval, ++ IdleSessionTimeout: c.IdleSessionTimeout, MinIdleSession: uint32(c.MinIdleSession), ++ }, nil ++} ++ ++type AnyTLSUser struct { ++ Password string `json:"password"` ++ Email string `json:"email"` ++ Level uint32 `json:"level"` ++} ++type AnyTLSServerConfig struct { ++ Users []AnyTLSUser `json:"users"` ++ PaddingScheme []string `json:"paddingScheme"` ++} ++ ++func (c *AnyTLSServerConfig) Build() (proto.Message, error) { ++ if len(c.Users) == 0 { ++ return nil, errors.New("anytls: users required") ++ } ++ config := &anytls.ServerConfig{PaddingScheme: []byte(strings.Join(c.PaddingScheme, "\n"))} ++ seen := map[string]bool{} ++ for _, u := range c.Users { ++ if u.Password == "" || seen[u.Password] { ++ return nil, errors.New("anytls: empty or duplicate password") ++ } ++ seen[u.Password] = true ++ config.Users = append(config.Users, &anytls.User{Password: u.Password, Email: u.Email, Level: u.Level}) ++ } ++ return config, nil ++} +--- a/infra/conf/anytls_test.go ++++ b/infra/conf/anytls_test.go +@@ -0,0 +1,45 @@ ++package conf_test ++ ++import ( ++ "encoding/json" ++ "github.com/xtls/xray-core/infra/conf" ++ "github.com/xtls/xray-core/proxy/anytls" ++ "google.golang.org/protobuf/proto" ++ "testing" ++) ++ ++func TestAnyTLSConfig(t *testing.T) { ++ for _, tc := range []struct { ++ input string ++ valid bool ++ }{ ++ {`{"address":"example.com","port":443,"password":"test","idleSessionCheckInterval":30,"idleSessionTimeout":60,"minIdleSession":2}`, true}, ++ {`{"port":443,"password":"test"}`, false}, ++ {`{"address":"example.com","password":"test"}`, false}, ++ {`{"address":"example.com","port":443}`, false}, ++ {`{"address":"example.com","port":443,"password":"test","minIdleSession":-1}`, false}, ++ } { ++ var config conf.AnyTLSClientConfig ++ if err := json.Unmarshal([]byte(tc.input), &config); err != nil { ++ t.Fatal(err) ++ } ++ built, err := config.Build() ++ if (err == nil) != tc.valid { ++ t.Fatalf("Build(%s): %v", tc.input, err) ++ } ++ if !tc.valid { ++ continue ++ } ++ data, err := proto.Marshal(built) ++ if err != nil { ++ t.Fatal(err) ++ } ++ var result anytls.ClientConfig ++ if err = proto.Unmarshal(data, &result); err != nil { ++ t.Fatal(err) ++ } ++ if result.Password != "test" || result.Port != 443 || result.IdleSessionTimeout != 60 || result.MinIdleSession != 2 { ++ t.Fatal("configuration lost during protobuf serialization") ++ } ++ } ++} +--- a/infra/conf/xray.go ++++ b/infra/conf/xray.go +@@ -35,6 +35,7 @@ + "vless": func() interface{} { return new(VLessInboundConfig) }, + "vmess": func() interface{} { return new(VMessInboundConfig) }, + "trojan": func() interface{} { return new(TrojanServerConfig) }, ++ "anytls": func() interface{} { return new(AnyTLSServerConfig) }, + "wireguard": func() interface{} { return &WireGuardConfig{IsClient: false} }, + "hysteria": func() interface{} { return new(HysteriaServerConfig) }, + "masque": func() interface{} { return new(MasqueServerConfig) }, +@@ -53,6 +54,7 @@ + "vless": func() interface{} { return new(VLessOutboundConfig) }, + "vmess": func() interface{} { return new(VMessOutboundConfig) }, + "trojan": func() interface{} { return new(TrojanClientConfig) }, ++ "anytls": func() interface{} { return new(AnyTLSClientConfig) }, + "hysteria": func() interface{} { return new(HysteriaClientConfig) }, + "masque": func() interface{} { return new(MasqueClientConfig) }, + "dns": func() interface{} { return new(DNSOutboundConfig) }, +--- a/main/distro/all/all.go ++++ b/main/distro/all/all.go +@@ -35,6 +35,7 @@ + _ "github.com/xtls/xray-core/app/observatory" + + // Inbound and outbound proxies. ++ _ "github.com/xtls/xray-core/proxy/anytls" + _ "github.com/xtls/xray-core/proxy/blackhole" + _ "github.com/xtls/xray-core/proxy/dns" + _ "github.com/xtls/xray-core/proxy/dokodemo" +--- a/proxy/anytls/LICENSE.sing-anytls ++++ b/proxy/anytls/LICENSE.sing-anytls +@@ -0,0 +1,14 @@ ++Copyright (C) 2022 by nekohasekai ++ ++This program is free software: you can redistribute it and/or modify ++it under the terms of the GNU General Public License as published by ++the Free Software Foundation, either version 3 of the License, or ++(at your option) any later version. ++ ++This program is distributed in the hope that it will be useful, ++but WITHOUT ANY WARRANTY; without even the implied warranty of ++MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++GNU General Public License for more details. ++ ++You should have received a copy of the GNU General Public License ++along with this program. If not, see . +--- a/proxy/anytls/client.go ++++ b/proxy/anytls/client.go +@@ -0,0 +1,156 @@ ++package anytls ++ ++import ( ++ "context" ++ "sync" ++ "time" ++ ++ singanytls "github.com/sagernet/sing-anytls" ++ M "github.com/sagernet/sing/common/metadata" ++ "github.com/sagernet/sing/common/uot" ++ "github.com/xtls/xray-core/common" ++ "github.com/xtls/xray-core/common/buf" ++ "github.com/xtls/xray-core/common/errors" ++ "github.com/xtls/xray-core/common/net" ++ "github.com/xtls/xray-core/common/session" ++ "github.com/xtls/xray-core/common/signal" ++ "github.com/xtls/xray-core/common/task" ++ "github.com/xtls/xray-core/core" ++ "github.com/xtls/xray-core/features/policy" ++ "github.com/xtls/xray-core/transport" ++ "github.com/xtls/xray-core/transport/internet" ++) ++ ++// Client adapts the same AnyTLS implementation used by sing-box. The session ++// pool belongs to the outbound handler, not to an individual proxied request. ++type Client struct { ++ server net.Destination ++ policy policy.Session ++ options singanytls.ClientOptions ++ mu sync.Mutex ++ client *singanytls.Client ++ closed bool ++} ++ ++func NewClient(ctx context.Context, config *ClientConfig) (*Client, error) { ++ if config.Address == nil || config.Port == 0 || config.Port > 65535 || config.Password == "" { ++ return nil, errors.New("anytls: invalid server or password") ++ } ++ manager := core.MustFromContext(ctx).GetFeature(policy.ManagerType()).(policy.Manager) ++ return &Client{ ++ server: net.TCPDestination(config.Address.AsAddress(), net.Port(config.Port)), ++ policy: manager.ForLevel(config.Level), ++ options: singanytls.ClientOptions{ ++ Password: config.Password, ++ IdleSessionCheckInterval: time.Duration(config.IdleSessionCheckInterval) * time.Second, ++ IdleSessionTimeout: time.Duration(config.IdleSessionTimeout) * time.Second, ++ MinIdleSession: int(config.MinIdleSession), ++ }, ++ }, nil ++} ++ ++func (c *Client) getClient(dialer internet.Dialer) (*singanytls.Client, error) { ++ c.mu.Lock() ++ defer c.mu.Unlock() ++ if c.closed { ++ return nil, errors.New("anytls: client closed") ++ } ++ if c.client == nil { ++ options := c.options ++ options.DialOut = func(ctx context.Context) (net.Conn, error) { ++ // Keep Xray's configured TLS/uTLS, socket mark, and outbound chaining. ++ return dialer.Dial(ctx, c.server) ++ } ++ client, err := singanytls.NewClient(options) ++ if err != nil { ++ return nil, err ++ } ++ c.client = client ++ } ++ return c.client, nil ++} ++ ++func (c *Client) Close() error { ++ c.mu.Lock() ++ c.closed = true ++ client := c.client ++ c.mu.Unlock() ++ if client != nil { ++ return client.Close() ++ } ++ return nil ++} ++ ++func (c *Client) Process(ctx context.Context, link *transport.Link, dialer internet.Dialer) error { ++ outbounds := session.OutboundsFromContext(ctx) ++ if len(outbounds) == 0 { ++ return errors.New("anytls: target not specified") ++ } ++ ob := outbounds[len(outbounds)-1] ++ target := ob.Target ++ if !target.IsValid() || (target.Network != net.Network_TCP && target.Network != net.Network_UDP) { ++ return errors.New("anytls: unsupported target") ++ } ++ ob.Name = "anytls" ++ ob.CanSpliceCopy = 3 ++ client, err := c.getClient(dialer) ++ if err != nil { ++ return err ++ } ++ destination := socksaddr(target) ++ streamDestination := destination ++ if target.Network == net.Network_UDP { ++ streamDestination = uot.RequestDestination(uot.Version) ++ } ++ dialCtx, dialCancel := context.WithTimeout(ctx, c.policy.Timeouts.Handshake) ++ conn, err := client.DialContext(dialCtx, streamDestination) ++ dialCancel() ++ if err != nil { ++ return errors.New("anytls: failed to open stream").Base(err) ++ } ++ defer conn.Close() ++ errors.LogInfo(ctx, "tunneling request to ", target, " via ", c.server.NetAddr()) ++ ++ var reader buf.Reader = buf.NewReader(conn) ++ var writer buf.Writer = buf.NewWriter(conn) ++ if target.Network == net.Network_UDP { ++ // UoT v2, with an address per datagram for transparent UDP and SOCKS5. ++ conn.SetWriteDeadline(time.Now().Add(c.policy.Timeouts.Handshake)) ++ packetConn, err := (&uot.Client{Version: uot.Version}).DialConn(conn, false, destination) ++ conn.SetWriteDeadline(time.Time{}) ++ if err != nil { ++ return errors.New("anytls: failed to start UoT").Base(err) ++ } ++ reader = &packetReader{conn: packetConn} ++ writer = &packetWriter{conn: packetConn, destination: destination} ++ } ++ ctx, cancel := context.WithCancel(ctx) ++ defer cancel() ++ timer := signal.CancelAfterInactivity(ctx, cancel, c.policy.Timeouts.ConnectionIdle) ++ defer timer.SetTimeout(0) ++ request := func() error { ++ defer timer.SetTimeout(c.policy.Timeouts.DownlinkOnly) ++ return buf.Copy(link.Reader, writer, buf.UpdateActivity(timer)) ++ } ++ response := func() error { ++ defer timer.SetTimeout(c.policy.Timeouts.UplinkOnly) ++ return buf.Copy(reader, link.Writer, buf.UpdateActivity(timer)) ++ } ++ if err := task.Run(ctx, request, task.OnSuccess(response, task.Close(link.Writer))); err != nil { ++ // Unblock the other copy task on cancellation as well as I/O failures. ++ common.Interrupt(link.Reader) ++ common.Interrupt(link.Writer) ++ return errors.New("anytls: connection ends").Base(err) ++ } ++ return nil ++} ++ ++func socksaddr(destination net.Destination) M.Socksaddr { ++ return M.ParseSocksaddrHostPort(destination.Address.String(), uint16(destination.Port)) ++} ++ ++func init() { ++ common.Must(common.RegisterConfig((*ClientConfig)(nil), func(ctx context.Context, config interface{}) (interface{}, error) { ++ return NewClient(ctx, config.(*ClientConfig)) ++ })) ++} +--- a/proxy/anytls/client_test.go ++++ b/proxy/anytls/client_test.go +@@ -0,0 +1,199 @@ ++package anytls ++ ++import ( ++ "bytes" ++ "context" ++ "io" ++ stdnet "net" ++ "sync/atomic" ++ "testing" ++ "time" ++ ++ singanytls "github.com/sagernet/sing-anytls" ++ singbuf "github.com/sagernet/sing/common/buf" ++ M "github.com/sagernet/sing/common/metadata" ++ N "github.com/sagernet/sing/common/network" ++ "github.com/sagernet/sing/common/uot" ++ "github.com/xtls/xray-core/common/buf" ++ "github.com/xtls/xray-core/common/net" ++ "github.com/xtls/xray-core/common/session" ++ "github.com/xtls/xray-core/features/policy" ++ "github.com/xtls/xray-core/transport" ++ "github.com/xtls/xray-core/transport/internet/stat" ++ "github.com/xtls/xray-core/transport/pipe" ++) ++ ++type echoHandler struct{} ++ ++func (echoHandler) NewConnectionEx(ctx context.Context, conn net.Conn, source, destination M.Socksaddr, onClose N.CloseHandlerFunc) { ++ defer conn.Close() ++ if destination.Fqdn != uot.MagicAddress { ++ io.Copy(conn, conn) ++ return ++ } ++ request, err := uot.ReadRequest(conn) ++ if err != nil { ++ return ++ } ++ packets := uot.NewConn(conn, *request) ++ data := singbuf.NewSize(65535) ++ defer data.Release() ++ for { ++ data.Reset() ++ address, err := packets.ReadPacket(data) ++ if err != nil { ++ return ++ } ++ if err := packets.WritePacket(data, address); err != nil { ++ return ++ } ++ } ++} ++ ++type testDialer struct { ++ service *singanytls.Service ++ dialed atomic.Int32 ++ active atomic.Int32 ++} ++ ++func (d *testDialer) Dial(ctx context.Context, dest net.Destination) (stat.Connection, error) { ++ a, b := stdnet.Pipe() ++ d.dialed.Add(1) ++ d.active.Add(1) ++ go func() { ++ defer d.active.Add(-1) ++ defer b.Close() ++ d.service.NewConnection(context.Background(), b, M.Socksaddr{}, nil) ++ }() ++ return a, nil ++} ++func (*testDialer) DestIpAddress() net.IP { return nil } ++func (*testDialer) SetOutboundGateway(context.Context, *session.Outbound) {} ++ ++func newTestClient(t *testing.T, password string) (*Client, *testDialer) { ++ t.Helper() ++ service, err := singanytls.NewService("test-password", singanytls.ServiceOptions{Handler: echoHandler{}}) ++ if err != nil { ++ t.Fatal(err) ++ } ++ c := &Client{server: net.TCPDestination(net.LocalHostIP, 443), policy: policy.SessionDefault(), options: singanytls.ClientOptions{Password: password}} ++ d := &testDialer{service: service} ++ t.Cleanup(func() { ++ c.Close() ++ deadline := time.Now().Add(3 * time.Second) ++ for d.active.Load() != 0 && time.Now().Before(deadline) { ++ time.Sleep(time.Millisecond) ++ } ++ if d.active.Load() != 0 { ++ t.Error("session connection leaked after Close") ++ } ++ if _, err := c.getClient(d); err == nil { ++ t.Error("client reopened after Close") ++ } ++ }) ++ return c, d ++} ++ ++func exchange(t *testing.T, c *Client, d *testDialer, udp bool) { ++ t.Helper() ++ target := net.TCPDestination(net.DomainAddress("echo.example"), 443) ++ if udp { ++ target = net.UDPDestination(net.DomainAddress("dns.example"), 53) ++ } ++ ctx, cancel := context.WithCancel(session.ContextWithOutbounds(context.Background(), []*session.Outbound{{Target: target}})) ++ uplink, input := pipe.New() ++ output, downlink := pipe.New() ++ done := make(chan error, 1) ++ go func() { done <- c.Process(ctx, &transport.Link{Reader: uplink, Writer: downlink}, d) }() ++ defer func() { ++ cancel() ++ input.Close() ++ output.Interrupt() ++ select { ++ case <-done: ++ case <-time.After(3 * time.Second): ++ t.Error("Process did not exit after cancellation") ++ } ++ }() ++ sizes := []int{13, 9000} ++ for i, size := range sizes { ++ payload := bytes.Repeat([]byte{byte(i + 1)}, size) ++ b := buf.FromBytes(payload) ++ address := target ++ if udp { ++ if i == 1 { ++ address = net.UDPDestination(net.ParseAddress("2001:db8::1"), 12345) ++ } ++ b.UDP = &address ++ } ++ if err := input.WriteMultiBuffer(buf.MultiBuffer{b}); err != nil { ++ t.Fatal(err) ++ } ++ received := []byte{} ++ for len(received) < len(payload) { ++ mb, err := output.ReadMultiBufferTimeout(3 * time.Second) ++ if err != nil { ++ t.Fatal(err) ++ } ++ for _, packet := range mb { ++ if udp && (packet.UDP == nil || *packet.UDP != address) { ++ t.Errorf("UDP source mismatch: %v != %v", packet.UDP, address) ++ } ++ received = append(received, packet.Bytes()...) ++ } ++ buf.ReleaseMulti(mb) ++ } ++ if !bytes.Equal(received, payload) { ++ t.Fatal("payload corrupted") ++ } ++ } ++} ++ ++func TestAnyTLSProcess(t *testing.T) { ++ for _, udp := range []bool{false, true} { ++ name := "TCP" ++ if udp { ++ name = "UDP" ++ } ++ t.Run(name, func(t *testing.T) { c, d := newTestClient(t, "test-password"); exchange(t, c, d, udp) }) ++ } ++} ++ ++func TestAnyTLSReuseAndClose(t *testing.T) { ++ c, d := newTestClient(t, "test-password") ++ for i := 0; i < 10; i++ { ++ exchange(t, c, d, false) ++ } ++ if n := d.dialed.Load(); n > 2 { ++ t.Fatalf("sessions were not reused: %d dials for 10 requests", n) ++ } ++ c.Close() ++ c.Close() ++} ++ ++func TestAnyTLSWrongPassword(t *testing.T) { ++ c, d := newTestClient(t, "wrong-password") ++ ctx, cancel := context.WithTimeout(context.Background(), 3*time.Second) ++ defer cancel() ++ ctx = session.ContextWithOutbounds(ctx, []*session.Outbound{{Target: net.TCPDestination(net.DomainAddress("echo.example"), 443)}}) ++ uplink, input := pipe.New() ++ output, downlink := pipe.New() ++ defer input.Close() ++ defer output.Interrupt() ++ done := make(chan error, 1) ++ go func() { done <- c.Process(ctx, &transport.Link{Reader: uplink, Writer: downlink}, d) }() ++ input.WriteMultiBuffer(buf.MultiBuffer{buf.FromBytes([]byte("must not be echoed"))}) ++ select { ++ case err := <-done: ++ if err == nil { ++ t.Fatal("wrong password accepted") ++ } ++ case <-ctx.Done(): ++ t.Fatal("wrong password did not fail promptly") ++ } ++ mb, err := output.ReadMultiBufferTimeout(time.Second) ++ defer buf.ReleaseMulti(mb) ++ if err == nil && len(mb) > 0 { ++ t.Fatal("received payload with wrong password") ++ } ++} +--- a/proxy/anytls/config.pb.go ++++ b/proxy/anytls/config.pb.go +@@ -0,0 +1,301 @@ ++// Code generated by protoc-gen-go. DO NOT EDIT. ++// versions: ++// protoc-gen-go v1.36.12 ++// protoc v3.21.12 ++// source: proxy/anytls/config.proto ++ ++package anytls ++ ++import ( ++ net "github.com/xtls/xray-core/common/net" ++ protoreflect "google.golang.org/protobuf/reflect/protoreflect" ++ protoimpl "google.golang.org/protobuf/runtime/protoimpl" ++ reflect "reflect" ++ sync "sync" ++ unsafe "unsafe" ++) ++ ++const ( ++ // Verify that this generated code is sufficiently up-to-date. ++ _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) ++ // Verify that runtime/protoimpl is sufficiently up-to-date. ++ _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) ++) ++ ++type ClientConfig struct { ++ state protoimpl.MessageState `protogen:"open.v1"` ++ Address *net.IPOrDomain `protobuf:"bytes,1,opt,name=address,proto3" json:"address,omitempty"` ++ Port uint32 `protobuf:"varint,2,opt,name=port,proto3" json:"port,omitempty"` ++ Password string `protobuf:"bytes,3,opt,name=password,proto3" json:"password,omitempty"` ++ Level uint32 `protobuf:"varint,4,opt,name=level,proto3" json:"level,omitempty"` ++ IdleSessionCheckInterval uint32 `protobuf:"varint,5,opt,name=idle_session_check_interval,json=idleSessionCheckInterval,proto3" json:"idle_session_check_interval,omitempty"` ++ IdleSessionTimeout uint32 `protobuf:"varint,6,opt,name=idle_session_timeout,json=idleSessionTimeout,proto3" json:"idle_session_timeout,omitempty"` ++ MinIdleSession uint32 `protobuf:"varint,7,opt,name=min_idle_session,json=minIdleSession,proto3" json:"min_idle_session,omitempty"` ++ unknownFields protoimpl.UnknownFields ++ sizeCache protoimpl.SizeCache ++} ++ ++func (x *ClientConfig) Reset() { ++ *x = ClientConfig{} ++ mi := &file_proxy_anytls_config_proto_msgTypes[0] ++ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ++ ms.StoreMessageInfo(mi) ++} ++ ++func (x *ClientConfig) String() string { ++ return protoimpl.X.MessageStringOf(x) ++} ++ ++func (*ClientConfig) ProtoMessage() {} ++ ++func (x *ClientConfig) ProtoReflect() protoreflect.Message { ++ mi := &file_proxy_anytls_config_proto_msgTypes[0] ++ if x != nil { ++ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ++ if ms.LoadMessageInfo() == nil { ++ ms.StoreMessageInfo(mi) ++ } ++ return ms ++ } ++ return mi.MessageOf(x) ++} ++ ++// Deprecated: Use ClientConfig.ProtoReflect.Descriptor instead. ++func (*ClientConfig) Descriptor() ([]byte, []int) { ++ return file_proxy_anytls_config_proto_rawDescGZIP(), []int{0} ++} ++ ++func (x *ClientConfig) GetAddress() *net.IPOrDomain { ++ if x != nil { ++ return x.Address ++ } ++ return nil ++} ++ ++func (x *ClientConfig) GetPort() uint32 { ++ if x != nil { ++ return x.Port ++ } ++ return 0 ++} ++ ++func (x *ClientConfig) GetPassword() string { ++ if x != nil { ++ return x.Password ++ } ++ return "" ++} ++ ++func (x *ClientConfig) GetLevel() uint32 { ++ if x != nil { ++ return x.Level ++ } ++ return 0 ++} ++ ++func (x *ClientConfig) GetIdleSessionCheckInterval() uint32 { ++ if x != nil { ++ return x.IdleSessionCheckInterval ++ } ++ return 0 ++} ++ ++func (x *ClientConfig) GetIdleSessionTimeout() uint32 { ++ if x != nil { ++ return x.IdleSessionTimeout ++ } ++ return 0 ++} ++ ++func (x *ClientConfig) GetMinIdleSession() uint32 { ++ if x != nil { ++ return x.MinIdleSession ++ } ++ return 0 ++} ++ ++type User struct { ++ state protoimpl.MessageState `protogen:"open.v1"` ++ Password string `protobuf:"bytes,1,opt,name=password,proto3" json:"password,omitempty"` ++ Email string `protobuf:"bytes,2,opt,name=email,proto3" json:"email,omitempty"` ++ Level uint32 `protobuf:"varint,3,opt,name=level,proto3" json:"level,omitempty"` ++ unknownFields protoimpl.UnknownFields ++ sizeCache protoimpl.SizeCache ++} ++ ++func (x *User) Reset() { ++ *x = User{} ++ mi := &file_proxy_anytls_config_proto_msgTypes[1] ++ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ++ ms.StoreMessageInfo(mi) ++} ++ ++func (x *User) String() string { ++ return protoimpl.X.MessageStringOf(x) ++} ++ ++func (*User) ProtoMessage() {} ++ ++func (x *User) ProtoReflect() protoreflect.Message { ++ mi := &file_proxy_anytls_config_proto_msgTypes[1] ++ if x != nil { ++ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ++ if ms.LoadMessageInfo() == nil { ++ ms.StoreMessageInfo(mi) ++ } ++ return ms ++ } ++ return mi.MessageOf(x) ++} ++ ++// Deprecated: Use User.ProtoReflect.Descriptor instead. ++func (*User) Descriptor() ([]byte, []int) { ++ return file_proxy_anytls_config_proto_rawDescGZIP(), []int{1} ++} ++ ++func (x *User) GetPassword() string { ++ if x != nil { ++ return x.Password ++ } ++ return "" ++} ++ ++func (x *User) GetEmail() string { ++ if x != nil { ++ return x.Email ++ } ++ return "" ++} ++ ++func (x *User) GetLevel() uint32 { ++ if x != nil { ++ return x.Level ++ } ++ return 0 ++} ++ ++type ServerConfig struct { ++ state protoimpl.MessageState `protogen:"open.v1"` ++ Users []*User `protobuf:"bytes,1,rep,name=users,proto3" json:"users,omitempty"` ++ PaddingScheme []byte `protobuf:"bytes,2,opt,name=padding_scheme,json=paddingScheme,proto3" json:"padding_scheme,omitempty"` ++ unknownFields protoimpl.UnknownFields ++ sizeCache protoimpl.SizeCache ++} ++ ++func (x *ServerConfig) Reset() { ++ *x = ServerConfig{} ++ mi := &file_proxy_anytls_config_proto_msgTypes[2] ++ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ++ ms.StoreMessageInfo(mi) ++} ++ ++func (x *ServerConfig) String() string { ++ return protoimpl.X.MessageStringOf(x) ++} ++ ++func (*ServerConfig) ProtoMessage() {} ++ ++func (x *ServerConfig) ProtoReflect() protoreflect.Message { ++ mi := &file_proxy_anytls_config_proto_msgTypes[2] ++ if x != nil { ++ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ++ if ms.LoadMessageInfo() == nil { ++ ms.StoreMessageInfo(mi) ++ } ++ return ms ++ } ++ return mi.MessageOf(x) ++} ++ ++// Deprecated: Use ServerConfig.ProtoReflect.Descriptor instead. ++func (*ServerConfig) Descriptor() ([]byte, []int) { ++ return file_proxy_anytls_config_proto_rawDescGZIP(), []int{2} ++} ++ ++func (x *ServerConfig) GetUsers() []*User { ++ if x != nil { ++ return x.Users ++ } ++ return nil ++} ++ ++func (x *ServerConfig) GetPaddingScheme() []byte { ++ if x != nil { ++ return x.PaddingScheme ++ } ++ return nil ++} ++ ++var File_proxy_anytls_config_proto protoreflect.FileDescriptor ++ ++const file_proxy_anytls_config_proto_rawDesc = "" + ++ "\n" + ++ "\x19proxy/anytls/config.proto\x12\x11xray.proxy.anytls\x1a\x18common/net/address.proto\"\xa6\x02\n" + ++ "\fClientConfig\x125\n" + ++ "\aaddress\x18\x01 \x01(\v2\x1b.xray.common.net.IPOrDomainR\aaddress\x12\x12\n" + ++ "\x04port\x18\x02 \x01(\rR\x04port\x12\x1a\n" + ++ "\bpassword\x18\x03 \x01(\tR\bpassword\x12\x14\n" + ++ "\x05level\x18\x04 \x01(\rR\x05level\x12=\n" + ++ "\x1bidle_session_check_interval\x18\x05 \x01(\rR\x18idleSessionCheckInterval\x120\n" + ++ "\x14idle_session_timeout\x18\x06 \x01(\rR\x12idleSessionTimeout\x12(\n" + ++ "\x10min_idle_session\x18\a \x01(\rR\x0eminIdleSession\"N\n" + ++ "\x04User\x12\x1a\n" + ++ "\bpassword\x18\x01 \x01(\tR\bpassword\x12\x14\n" + ++ "\x05email\x18\x02 \x01(\tR\x05email\x12\x14\n" + ++ "\x05level\x18\x03 \x01(\rR\x05level\"d\n" + ++ "\fServerConfig\x12-\n" + ++ "\x05users\x18\x01 \x03(\v2\x17.xray.proxy.anytls.UserR\x05users\x12%\n" + ++ "\x0epadding_scheme\x18\x02 \x01(\fR\rpaddingSchemeB(Z&github.com/xtls/xray-core/proxy/anytlsb\x06proto3" ++ ++var ( ++ file_proxy_anytls_config_proto_rawDescOnce sync.Once ++ file_proxy_anytls_config_proto_rawDescData []byte ++) ++ ++func file_proxy_anytls_config_proto_rawDescGZIP() []byte { ++ file_proxy_anytls_config_proto_rawDescOnce.Do(func() { ++ file_proxy_anytls_config_proto_rawDescData = protoimpl.X.CompressGZIP(unsafe.Slice(unsafe.StringData(file_proxy_anytls_config_proto_rawDesc), len(file_proxy_anytls_config_proto_rawDesc))) ++ }) ++ return file_proxy_anytls_config_proto_rawDescData ++} ++ ++var file_proxy_anytls_config_proto_msgTypes = make([]protoimpl.MessageInfo, 3) ++var file_proxy_anytls_config_proto_goTypes = []any{ ++ (*ClientConfig)(nil), // 0: xray.proxy.anytls.ClientConfig ++ (*User)(nil), // 1: xray.proxy.anytls.User ++ (*ServerConfig)(nil), // 2: xray.proxy.anytls.ServerConfig ++ (*net.IPOrDomain)(nil), // 3: xray.common.net.IPOrDomain ++} ++var file_proxy_anytls_config_proto_depIdxs = []int32{ ++ 3, // 0: xray.proxy.anytls.ClientConfig.address:type_name -> xray.common.net.IPOrDomain ++ 1, // 1: xray.proxy.anytls.ServerConfig.users:type_name -> xray.proxy.anytls.User ++ 2, // [2:2] is the sub-list for method output_type ++ 2, // [2:2] is the sub-list for method input_type ++ 2, // [2:2] is the sub-list for extension type_name ++ 2, // [2:2] is the sub-list for extension extendee ++ 0, // [0:2] is the sub-list for field type_name ++} ++ ++func init() { file_proxy_anytls_config_proto_init() } ++func file_proxy_anytls_config_proto_init() { ++ if File_proxy_anytls_config_proto != nil { ++ return ++ } ++ type x struct{} ++ out := protoimpl.TypeBuilder{ ++ File: protoimpl.DescBuilder{ ++ GoPackagePath: reflect.TypeOf(x{}).PkgPath(), ++ RawDescriptor: unsafe.Slice(unsafe.StringData(file_proxy_anytls_config_proto_rawDesc), len(file_proxy_anytls_config_proto_rawDesc)), ++ NumEnums: 0, ++ NumMessages: 3, ++ NumExtensions: 0, ++ NumServices: 0, ++ }, ++ GoTypes: file_proxy_anytls_config_proto_goTypes, ++ DependencyIndexes: file_proxy_anytls_config_proto_depIdxs, ++ MessageInfos: file_proxy_anytls_config_proto_msgTypes, ++ }.Build() ++ File_proxy_anytls_config_proto = out.File ++ file_proxy_anytls_config_proto_goTypes = nil ++ file_proxy_anytls_config_proto_depIdxs = nil ++} +--- a/proxy/anytls/config.proto ++++ b/proxy/anytls/config.proto +@@ -0,0 +1,24 @@ ++syntax = "proto3"; ++package xray.proxy.anytls; ++option go_package = "github.com/xtls/xray-core/proxy/anytls"; ++import "common/net/address.proto"; ++ ++message ClientConfig { ++ xray.common.net.IPOrDomain address = 1; ++ uint32 port = 2; ++ string password = 3; ++ uint32 level = 4; ++ uint32 idle_session_check_interval = 5; ++ uint32 idle_session_timeout = 6; ++ uint32 min_idle_session = 7; ++} ++ ++message User { ++ string password = 1; ++ string email = 2; ++ uint32 level = 3; ++} ++message ServerConfig { ++ repeated User users = 1; ++ bytes padding_scheme = 2; ++} +--- a/proxy/anytls/packet.go ++++ b/proxy/anytls/packet.go +@@ -0,0 +1,44 @@ ++package anytls ++ ++import ( ++ singbuf "github.com/sagernet/sing/common/buf" ++ M "github.com/sagernet/sing/common/metadata" ++ "github.com/sagernet/sing/common/uot" ++ "github.com/xtls/xray-core/common/buf" ++ "github.com/xtls/xray-core/common/net" ++) ++ ++type packetReader struct{ conn *uot.Conn } ++ ++func (r *packetReader) ReadMultiBuffer() (buf.MultiBuffer, error) { ++ // Read one whole datagram, including packets larger than Xray's 8K buffer. ++ packet := singbuf.NewSize(65535) ++ defer packet.Release() ++ address, err := r.conn.ReadPacket(packet) ++ if err != nil { ++ return nil, err ++ } ++ b := buf.FromBytes(append([]byte(nil), packet.Bytes()...)) ++ destination := net.UDPDestination(net.ParseAddress(address.AddrString()), net.Port(address.Port)) ++ b.UDP = &destination ++ return buf.MultiBuffer{b}, nil ++} ++ ++type packetWriter struct { ++ conn *uot.Conn ++ destination M.Socksaddr ++} ++ ++func (w *packetWriter) WriteMultiBuffer(mb buf.MultiBuffer) error { ++ defer buf.ReleaseMulti(mb) ++ for _, b := range mb { ++ destination := w.destination ++ if b.UDP != nil { ++ destination = socksaddr(*b.UDP) ++ } ++ if err := w.conn.WritePacket(singbuf.As(b.Bytes()), destination); err != nil { ++ return err ++ } ++ } ++ return nil ++} +--- a/proxy/anytls/relay.go ++++ b/proxy/anytls/relay.go +@@ -0,0 +1,60 @@ ++package anytls ++ ++import ( ++ "context" ++ "github.com/xtls/xray-core/common" ++ "github.com/xtls/xray-core/common/buf" ++ "github.com/xtls/xray-core/common/signal" ++ "github.com/xtls/xray-core/features/policy" ++) ++ ++// Stop blocked reads and join both copy loops before releasing stream state. ++func relay(ctx context.Context, upR buf.Reader, upW buf.Writer, downR buf.Reader, downW buf.Writer, stopIO func(), p policy.Session) error { ++ ctx, cancel := context.WithCancel(ctx) ++ defer cancel() ++ timer := signal.CancelAfterInactivity(ctx, cancel, p.Timeouts.ConnectionIdle) ++ defer timer.SetTimeout(0) ++ results := make(chan error, 2) ++ go func() { ++ e := buf.Copy(upR, upW, buf.UpdateActivity(timer)) ++ if e == nil { ++ common.Close(upW) ++ } ++ timer.SetTimeout(p.Timeouts.DownlinkOnly) ++ results <- e ++ }() ++ go func() { ++ e := buf.Copy(downR, downW, buf.UpdateActivity(timer)) ++ if e == nil { ++ common.Close(downW) ++ } ++ timer.SetTimeout(p.Timeouts.UplinkOnly) ++ results <- e ++ }() ++ var first error ++ count := 0 ++ for count < 2 { ++ select { ++ case e := <-results: ++ count++ ++ if e != nil { ++ first = e ++ } ++ case <-ctx.Done(): ++ first = ctx.Err() ++ } ++ if first != nil || count == 2 { ++ break ++ } ++ } ++ stopIO() ++ common.Interrupt(upR) ++ common.Interrupt(upW) ++ common.Interrupt(downR) ++ common.Interrupt(downW) ++ for count < 2 { ++ <-results ++ count++ ++ } ++ return first ++} +--- a/proxy/anytls/server.go ++++ b/proxy/anytls/server.go +@@ -0,0 +1,189 @@ ++package anytls ++ ++import ( ++ "bytes" ++ "context" ++ "encoding/binary" ++ "io" ++ "time" ++ ++ A "github.com/sagernet/sing-anytls" ++ "github.com/sagernet/sing/common/auth" ++ M "github.com/sagernet/sing/common/metadata" ++ N "github.com/sagernet/sing/common/network" ++ "github.com/sagernet/sing/common/uot" ++ "github.com/xtls/xray-core/common" ++ "github.com/xtls/xray-core/common/buf" ++ "github.com/xtls/xray-core/common/errors" ++ "github.com/xtls/xray-core/common/net" ++ "github.com/xtls/xray-core/common/protocol" ++ "github.com/xtls/xray-core/common/session" ++ "github.com/xtls/xray-core/core" ++ "github.com/xtls/xray-core/features/policy" ++ "github.com/xtls/xray-core/features/routing" ++ "github.com/xtls/xray-core/transport/internet" ++ "github.com/xtls/xray-core/transport/internet/stat" ++ "github.com/xtls/xray-core/transport/internet/tls" ++) ++ ++type Server struct { ++ service *A.MultiService[*User] ++ policy policy.Manager ++} ++type dispatcherKey struct{} ++ ++func NewServer(ctx context.Context, c *ServerConfig) (*Server, error) { ++ m, _ := session.StreamSettingsFromContext(ctx).(*internet.MemoryStreamConfig) ++ if m == nil { ++ return nil, errors.New("anytls inbound requires TLS") ++ } ++ if _, ok := m.SecuritySettings.(*tls.Config); !ok { ++ return nil, errors.New("anytls inbound requires TLS") ++ } ++ if len(c.Users) == 0 { ++ return nil, errors.New("anytls: users required") ++ } ++ s := &Server{policy: core.MustFromContext(ctx).GetFeature(policy.ManagerType()).(policy.Manager)} ++ service, e := A.NewMultiService[*User](A.ServiceOptions{PaddingScheme: c.PaddingScheme, Handler: s}) ++ if e != nil { ++ return nil, e ++ } ++ passwords := make([]string, len(c.Users)) ++ seen := map[string]bool{} ++ for i, u := range c.Users { ++ if u == nil || u.Password == "" || seen[u.Password] { ++ return nil, errors.New("anytls: empty or duplicate password") ++ } ++ seen[u.Password] = true ++ passwords[i] = u.Password ++ } ++ if e = service.UpdateUsers(c.Users, passwords); e != nil { ++ return nil, e ++ } ++ s.service = service ++ return s, nil ++} ++func (*Server) Network() []net.Network { return []net.Network{net.Network_TCP} } ++ ++type prefaceConn struct { ++ net.Conn ++ reader io.Reader ++} ++ ++func (c *prefaceConn) Read(b []byte) (int, error) { return c.reader.Read(b) } ++func (s *Server) Process(ctx context.Context, _ net.Network, conn stat.Connection, d routing.Dispatcher) error { ++ defer conn.Close() ++ ctx, cancel := context.WithCancel(ctx) ++ defer cancel() ++ done := make(chan struct{}) ++ stop := context.AfterFunc(ctx, func() { conn.Close(); close(done) }) ++ defer func() { ++ if !stop() { ++ <-done ++ } ++ }() ++ conn.SetReadDeadline(time.Now().Add(s.policy.ForLevel(0).Timeouts.Handshake)) ++ // sing-anytls inspects the password in its first Read. Preserve fragmented ++ // TLS/application writes by collecting the bounded prologue before handing it off. ++ var header [34]byte ++ if _, e := io.ReadFull(conn, header[:]); e != nil { ++ return e ++ } ++ preface := make([]byte, 34+int(binary.BigEndian.Uint16(header[32:]))) ++ copy(preface, header[:]) ++ if _, e := io.ReadFull(conn, preface[34:]); e != nil { ++ return e ++ } ++ conn.SetReadDeadline(time.Time{}) ++ wrapped := &prefaceConn{conn, io.MultiReader(bytes.NewReader(preface), conn)} ++ ctx = context.WithValue(ctx, dispatcherKey{}, d) ++ return s.service.NewConnection(ctx, wrapped, M.SocksaddrFromNet(conn.RemoteAddr()), nil) ++} ++func (s *Server) NewConnectionEx(ctx context.Context, conn net.Conn, _ M.Socksaddr, dest M.Socksaddr, onClose N.CloseHandlerFunc) { ++ e := s.handleStream(ctx, conn, dest) ++ conn.Close() ++ if onClose != nil { ++ onClose(e) ++ } ++ if e != nil { ++ errors.LogInfoInner(ctx, e, "anytls stream ends") ++ } ++} ++ ++type initialReader struct { ++ first buf.MultiBuffer ++ reader buf.Reader ++} ++ ++func (r *initialReader) ReadMultiBuffer() (buf.MultiBuffer, error) { ++ if r.first != nil { ++ b := r.first ++ r.first = nil ++ return b, nil ++ } ++ return r.reader.ReadMultiBuffer() ++} ++func (s *Server) handleStream(ctx context.Context, conn net.Conn, dest M.Socksaddr) error { ++ u, ok := auth.UserFromContext[*User](ctx) ++ if !ok { ++ return errors.New("anytls: missing user") ++ } ++ p := s.policy.ForLevel(u.Level) ++ if in := session.InboundFromContext(ctx); in != nil { ++ cp := *in ++ cp.Name = "anytls" ++ cp.CanSpliceCopy = 3 ++ cp.User = &protocol.MemoryUser{Email: u.Email, Level: u.Level} ++ ctx = session.ContextWithInbound(ctx, &cp) ++ } ++ ctx, cancel := context.WithCancel(ctx) ++ defer cancel() ++ stop := context.AfterFunc(ctx, func() { conn.Close() }) ++ defer stop() ++ target := net.TCPDestination(net.ParseAddress(dest.AddrString()), net.Port(dest.Port)) ++ var reader buf.Reader = buf.NewReader(conn) ++ var writer buf.Writer = buf.NewWriter(conn) ++ var first buf.MultiBuffer ++ if dest.Fqdn == uot.MagicAddress || dest.Fqdn == uot.LegacyMagicAddress { ++ conn.SetReadDeadline(time.Now().Add(p.Timeouts.Handshake)) ++ request := uot.Request{} ++ if dest.Fqdn == uot.MagicAddress { ++ r, e := uot.ReadRequest(conn) ++ if e != nil { ++ return e ++ } ++ request = *r ++ } ++ pc := uot.NewConn(conn, request) ++ pr := &packetReader{pc} ++ var e error ++ first, e = pr.ReadMultiBuffer() ++ if e != nil { ++ return e ++ } ++ target = *first[0].UDP ++ reader = &initialReader{first: first, reader: pr} ++ writer = &packetWriter{pc, socksaddr(target)} ++ conn.SetReadDeadline(time.Time{}) ++ } ++ if !target.IsValid() || target.Port == 0 { ++ buf.ReleaseMulti(first) ++ return errors.New("anytls: invalid destination") ++ } ++ dispatcher, ok := ctx.Value(dispatcherKey{}).(routing.Dispatcher) ++ if !ok { ++ buf.ReleaseMulti(first) ++ return errors.New("anytls: missing dispatcher") ++ } ++ link, e := dispatcher.Dispatch(ctx, target) ++ if e != nil { ++ buf.ReleaseMulti(first) ++ return e ++ } ++ return relay(ctx, reader, link.Writer, link.Reader, writer, func() { conn.Close() }, p) ++} ++func init() { ++ common.Must(common.RegisterConfig((*ServerConfig)(nil), func(ctx context.Context, c interface{}) (interface{}, error) { ++ return NewServer(ctx, c.(*ServerConfig)) ++ })) ++} +--- a/proxy/freedom/freedom.go ++++ b/proxy/freedom/freedom.go +@@ -166,6 +166,9 @@ + if inbound == nil { + return nil + } ++ if inbound.Name == "anytls" { ++ return defaultBlockPrivateRule ++ } + switch inbound.Name { + case "vless-reverse": + return defaultBlockAllRule diff --git a/xray-core/patches/120-restore-vmess-alterid-outbound.patch b/xray-core/patches/120-restore-vmess-alterid-outbound.patch new file mode 100644 index 000000000..3fb0c25c3 --- /dev/null +++ b/xray-core/patches/120-restore-vmess-alterid-outbound.patch @@ -0,0 +1,669 @@ +From: coolsnowwolf +Subject: [PATCH] vmess: restore legacy alterId outbound authentication + +Carry alterId through JSON, protobuf and memory accounts, restoring the +legacy HMAC-MD5 authentication and AES-CFB request/response headers for +explicitly configured nonzero alterId outbounds. Keep alterId=0 on AEAD +and reject legacy inbound settings, whose server support is not restored. +Initialize response keys before the concurrent request/response tasks. +Use the current timestamp, as Mihomo does, for legacy server compatibility. + +Adapt the legacy client handshake from Xray v1.5.5. Cover alternative UUID +vectors, config/protobuf round trips, TCP/UDP payloads, both AEAD payload +ciphers and malformed legacy responses; retain existing AEAD header tests. + +Reference: https://github.com/XTLS/Xray-core/blob/v1.5.5/proxy/vmess/encoding/client.go +Signed-off-by: coolsnowwolf + +--- a/infra/conf/vmess.go ++++ b/infra/conf/vmess.go +@@ -17,6 +17,7 @@ + + type VMessAccount struct { + ID string `json:"id"` ++ AlterID uint16 `json:"alterId"` + Security string `json:"security"` + Experiments string `json:"experiments"` + } +@@ -35,7 +36,8 @@ + st = protocol.SecurityType_AUTO + } + return &vmess.Account{ +- Id: a.ID, ++ Id: a.ID, ++ AlterId: uint32(a.AlterID), + SecuritySettings: &protocol.SecurityConfig{ + Type: st, + }, +@@ -85,6 +87,10 @@ + return errors.New("invalid VMess user").Base(err) + } + ++ if account.AlterID != 0 { ++ return errors.New("legacy VMess alterId is supported for outbounds only") ++ } ++ + u, err := uuid.ParseString(account.ID) + if err != nil { + return err +@@ -114,6 +120,7 @@ + Level uint32 `json:"level"` + Email string `json:"email"` + ID string `json:"id"` ++ AlterID uint16 `json:"alterId"` + Security string `json:"security"` + Experiments string `json:"experiments"` + Receivers []*VMessOutboundTarget `json:"vnext"` +@@ -160,6 +167,7 @@ + account := new(VMessAccount) + if c.Address != nil { + account.ID = c.ID ++ account.AlterID = c.AlterID + account.Security = c.Security + account.Experiments = c.Experiments + } else { +--- a/infra/conf/vmess_legacy_test.go ++++ b/infra/conf/vmess_legacy_test.go +@@ -0,0 +1,69 @@ ++package conf_test ++ ++import ( ++ "encoding/json" ++ "fmt" ++ "testing" ++ ++ "github.com/xtls/xray-core/infra/conf" ++ "github.com/xtls/xray-core/proxy/vmess" ++ "github.com/xtls/xray-core/proxy/vmess/outbound" ++ "google.golang.org/protobuf/proto" ++) ++ ++func TestVMessAlterIDConfig(t *testing.T) { ++ for _, aid := range []int{0, 1, 64} { ++ for _, flat := range []bool{false, true} { ++ t.Run(fmt.Sprintf("%d/flat=%v", aid, flat), func(t *testing.T) { ++ fields := fmt.Sprintf(`"id":"e641f5ad-9397-41e3-bf1a-e8740dfed019","alterId":%d`, aid) ++ raw := `{"address":"127.0.0.1","port":443,` + fields + `}` ++ if !flat { ++ raw = `{"vnext":[{"address":"127.0.0.1","port":443,"users":[{` + fields + `}]}]}` ++ } ++ var config conf.VMessOutboundConfig ++ if err := json.Unmarshal([]byte(raw), &config); err != nil { ++ t.Fatal(err) ++ } ++ message, err := config.Build() ++ if err != nil { ++ t.Fatal(err) ++ } ++ user, err := message.(*outbound.Config).Receiver.User.ToMemoryUser() ++ if err != nil { ++ t.Fatal(err) ++ } ++ account := user.Account.(*vmess.MemoryAccount) ++ if len(account.AlterIDs) != aid { ++ t.Fatalf("lost alterId: %d", len(account.AlterIDs)) ++ } ++ wire, err := proto.Marshal(account.ToProto()) ++ if err != nil { ++ t.Fatal(err) ++ } ++ var decoded vmess.Account ++ if err = proto.Unmarshal(wire, &decoded); err != nil { ++ t.Fatal(err) ++ } ++ if decoded.AlterId != uint32(aid) { ++ t.Fatal("protobuf round trip lost alterId") ++ } ++ }) ++ } ++ } ++ for _, raw := range []string{`{"alterId":-1}`, `{"alterId":65536}`, `{"alterId":1.5}`} { ++ var c conf.VMessOutboundConfig ++ if err := json.Unmarshal([]byte(raw), &c); err == nil { ++ t.Fatalf("accepted %s", raw) ++ } ++ } ++ if _, err := (&vmess.Account{Id: "e641f5ad-9397-41e3-bf1a-e8740dfed019", AlterId: 65536}).AsAccount(); err == nil { ++ t.Fatal("accepted oversized protobuf alterId") ++ } ++ var inbound conf.VMessInboundConfig ++ if err := json.Unmarshal([]byte(`{"clients":[{"id":"e641f5ad-9397-41e3-bf1a-e8740dfed019","alterId":1}]}`), &inbound); err != nil { ++ t.Fatal(err) ++ } ++ if _, err := inbound.Build(); err == nil { ++ t.Fatal("silently accepted unsupported legacy inbound") ++ } ++} +--- a/proxy/vmess/account.proto ++++ b/proxy/vmess/account.proto +@@ -12,6 +12,8 @@ + // ID of the account, in the form of a UUID, e.g., + // "66ad4540-b58c-4ad2-9926-ea63445a9b57". + string id = 1; ++ // Number of alternative IDs. Nonzero enables legacy outbound authentication. ++ uint32 alter_id = 2; + // Security settings. Only applies to client side. + xray.common.protocol.SecurityConfig security_settings = 3; + // Define tests enabled for this account +--- a/proxy/vmess/account.pb.go ++++ b/proxy/vmess/account.pb.go +@@ -27,6 +27,8 @@ + // ID of the account, in the form of a UUID, e.g., + // "66ad4540-b58c-4ad2-9926-ea63445a9b57". + Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` ++ // Number of alternative IDs. Nonzero enables legacy outbound authentication. ++ AlterId uint32 `protobuf:"varint,2,opt,name=alter_id,json=alterId,proto3" json:"alter_id,omitempty"` + // Security settings. Only applies to client side. + SecuritySettings *protocol.SecurityConfig `protobuf:"bytes,3,opt,name=security_settings,json=securitySettings,proto3" json:"security_settings,omitempty"` + // Define tests enabled for this account +@@ -72,6 +74,13 @@ + return "" + } + ++func (x *Account) GetAlterId() uint32 { ++ if x != nil { ++ return x.AlterId ++ } ++ return 0 ++} ++ + func (x *Account) GetSecuritySettings() *protocol.SecurityConfig { + if x != nil { + return x.SecuritySettings +@@ -90,9 +99,10 @@ + + const file_proxy_vmess_account_proto_rawDesc = "" + + "\n" + +- "\x19proxy/vmess/account.proto\x12\x10xray.proxy.vmess\x1a\x1dcommon/protocol/headers.proto\"\x91\x01\n" + ++ "\x19proxy/vmess/account.proto\x12\x10xray.proxy.vmess\x1a\x1dcommon/protocol/headers.proto\"\xac\x01\n" + + "\aAccount\x12\x0e\n" + +- "\x02id\x18\x01 \x01(\tR\x02id\x12Q\n" + ++ "\x02id\x18\x01 \x01(\tR\x02id\x12\x19\n" + ++ "\balter_id\x18\x02 \x01(\rR\aalterId\x12Q\n" + + "\x11security_settings\x18\x03 \x01(\v2$.xray.common.protocol.SecurityConfigR\x10securitySettings\x12#\n" + + "\rtests_enabled\x18\x04 \x01(\tR\ftestsEnabledBR\n" + + "\x14com.xray.proxy.vmessP\x01Z%github.com/xtls/xray-core/proxy/vmess\xaa\x02\x10Xray.Proxy.Vmessb\x06proto3" +--- a/proxy/vmess/account.go ++++ b/proxy/vmess/account.go +@@ -1,8 +1,12 @@ + package vmess + + import ( ++ "bytes" ++ "crypto/md5" + "strings" + ++ "github.com/xtls/xray-core/common/dice" ++ + "google.golang.org/protobuf/proto" + + "github.com/xtls/xray-core/common/errors" +@@ -14,6 +18,8 @@ + type MemoryAccount struct { + // ID is the main ID of the account. + ID *protocol.ID ++ // AlterIDs are used only for legacy outbound authentication. ++ AlterIDs []*protocol.ID + // Security type of the account. Used for client connections. + Security protocol.SecurityType + +@@ -40,6 +46,7 @@ + } + return &Account{ + Id: a.ID.String(), ++ AlterId: uint32(len(a.AlterIDs)), + TestsEnabled: test, + SecuritySettings: &protocol.SecurityConfig{Type: a.Security}, + } +@@ -51,6 +58,9 @@ + if err != nil { + return nil, errors.New("failed to parse ID").Base(err) + } ++ if a.AlterId > 65535 { ++ return nil, errors.New("VMess alterId exceeds 65535") ++ } + protoID := protocol.NewID(id) + var AuthenticatedLength, NoTerminationSignal bool + if strings.Contains(a.TestsEnabled, "AuthenticatedLength") { +@@ -61,8 +71,41 @@ + } + return &MemoryAccount{ + ID: protoID, ++ AlterIDs: newAlterIDs(id, a.AlterId), + Security: a.SecuritySettings.GetSecurityType(), + AuthenticatedLengthExperiment: AuthenticatedLength, + NoTerminationSignal: NoTerminationSignal, + }, nil + } ++ ++// AnyValidID chooses an authentication ID without changing the primary command key. ++func (a *MemoryAccount) AnyValidID() *protocol.ID { ++ if len(a.AlterIDs) == 0 { ++ return a.ID ++ } ++ return a.AlterIDs[dice.Roll(len(a.AlterIDs))] ++} ++ ++// newAlterIDs follows the original VMess alternative UUID derivation. ++func newAlterIDs(previous uuid.UUID, count uint32) []*protocol.ID { ++ if count == 0 { ++ return nil ++ } ++ ids := make([]*protocol.ID, count) ++ for i := range ids { ++ h := md5.New() ++ h.Write(previous.Bytes()) ++ h.Write([]byte("16167dc8-16b6-4e6d-b8bb-65dd68113a81")) ++ var next uuid.UUID ++ for { ++ h.Sum(next[:0]) ++ if !bytes.Equal(next.Bytes(), previous.Bytes()) { ++ break ++ } ++ h.Write([]byte("533eff8a-4113-4b10-b5ce-0f5d76b98cd2")) ++ } ++ ids[i] = protocol.NewID(next) ++ previous = next ++ } ++ return ids ++} +--- a/proxy/vmess/account_legacy_test.go ++++ b/proxy/vmess/account_legacy_test.go +@@ -0,0 +1,19 @@ ++package vmess ++ ++import "testing" ++ ++func TestLegacyAlterIDDerivation(t *testing.T) { ++ a, err := (&Account{Id: "e641f5ad-9397-41e3-bf1a-e8740dfed019", AlterId: 2}).AsAccount() ++ if err != nil { ++ t.Fatal(err) ++ } ++ m := a.(*MemoryAccount) ++ for i, want := range []string{"5c1ef6b5-fd16-7081-c694-c2308d07559b", "283b417b-0e6e-eda7-50b7-fded0002659a"} { ++ if got := m.AlterIDs[i].String(); got != want { ++ t.Fatalf("ID %d: %s != %s", i, got, want) ++ } ++ } ++ if m.ID.String() != "e641f5ad-9397-41e3-bf1a-e8740dfed019" { ++ t.Fatal("primary ID changed") ++ } ++} +--- a/proxy/vmess/encoding/client.go ++++ b/proxy/vmess/encoding/client.go +@@ -3,6 +3,8 @@ + import ( + "bytes" + "context" ++ "crypto/hmac" ++ "crypto/md5" + "crypto/rand" + "crypto/sha256" + "encoding/binary" +@@ -24,6 +26,7 @@ + + // ClientSession stores connection session info for VMess client. + type ClientSession struct { ++ legacy bool + requestBodyKey [16]byte + requestBodyIV [16]byte + responseBodyKey [16]byte +@@ -35,8 +38,8 @@ + } + + // NewClientSession creates a new ClientSession. +-func NewClientSession(ctx context.Context, behaviorSeed int64) *ClientSession { +- session := &ClientSession{} ++func NewClientSession(ctx context.Context, behaviorSeed int64, legacy bool) *ClientSession { ++ session := &ClientSession{legacy: legacy} + + randomBytes := make([]byte, 33) // 16 + 16 + 1 + common.Must2(rand.Read(randomBytes)) +@@ -44,10 +47,15 @@ + copy(session.requestBodyIV[:], randomBytes[16:32]) + session.responseHeader = randomBytes[32] + +- BodyKey := sha256.Sum256(session.requestBodyKey[:]) +- copy(session.responseBodyKey[:], BodyKey[:16]) +- BodyIV := sha256.Sum256(session.requestBodyIV[:]) +- copy(session.responseBodyIV[:], BodyIV[:16]) ++ if legacy { ++ session.responseBodyKey = md5.Sum(session.requestBodyKey[:]) ++ session.responseBodyIV = md5.Sum(session.requestBodyIV[:]) ++ } else { ++ BodyKey := sha256.Sum256(session.requestBodyKey[:]) ++ copy(session.responseBodyKey[:], BodyKey[:16]) ++ BodyIV := sha256.Sum256(session.requestBodyIV[:]) ++ copy(session.responseBodyIV[:], BodyIV[:16]) ++ } + { + var err error + session.readDrainer, err = drain.NewBehaviorSeedLimitedDrainer(behaviorSeed, 18, 3266, 64) +@@ -62,6 +70,15 @@ + + func (c *ClientSession) EncodeRequestHeader(header *protocol.RequestHeader, writer io.Writer) error { + account := header.User.Account.(*vmess.MemoryAccount) ++ var timestamp [8]byte ++ if c.legacy { ++ binary.BigEndian.PutUint64(timestamp[:], uint64(protocol.NowTime())) ++ auth := hmac.New(md5.New, account.AnyValidID().Bytes()) ++ auth.Write(timestamp[:]) ++ if _, err := writer.Write(auth.Sum(nil)); err != nil { ++ return err ++ } ++ } + + buffer := buf.New() + defer buffer.Release() +@@ -93,6 +110,17 @@ + fnv1a.Sum(hashBytes[:0]) + } + ++ if c.legacy { ++ iv := md5.New() ++ for i := 0; i < 4; i++ { ++ iv.Write(timestamp[:]) ++ } ++ stream := crypto.NewAesEncryptionStream(account.ID.CmdKey(), iv.Sum(nil)) ++ stream.XORKeyStream(buffer.Bytes(), buffer.Bytes()) ++ _, err := writer.Write(buffer.Bytes()) ++ return err ++ } ++ + var fixedLengthCmdKey [16]byte + copy(fixedLengthCmdKey[:], account.ID.CmdKey()) + vmessout := vmessaead.SealVMessAEADHeader(fixedLengthCmdKey, buffer.Bytes()) +@@ -163,46 +191,51 @@ + } + + func (c *ClientSession) DecodeResponseHeader(reader io.Reader) (*protocol.ResponseHeader, error) { +- aeadResponseHeaderLengthEncryptionKey := vmessaead.KDF16(c.responseBodyKey[:], vmessaead.KDFSaltConstAEADRespHeaderLenKey) +- aeadResponseHeaderLengthEncryptionIV := vmessaead.KDF(c.responseBodyIV[:], vmessaead.KDFSaltConstAEADRespHeaderLenIV)[:12] +- +- aeadResponseHeaderLengthEncryptionAEAD := crypto.NewAesGcm(aeadResponseHeaderLengthEncryptionKey) +- +- var aeadEncryptedResponseHeaderLength [18]byte +- var decryptedResponseHeaderLength int +- var decryptedResponseHeaderLengthBinaryDeserializeBuffer uint16 +- +- if n, err := io.ReadFull(reader, aeadEncryptedResponseHeaderLength[:]); err != nil { +- c.readDrainer.AcknowledgeReceive(n) +- return nil, drain.WithError(c.readDrainer, reader, errors.New("Unable to Read Header Len").Base(err)) +- } else { // nolint: golint +- c.readDrainer.AcknowledgeReceive(n) +- } +- if decryptedResponseHeaderLengthBinaryBuffer, err := aeadResponseHeaderLengthEncryptionAEAD.Open(nil, aeadResponseHeaderLengthEncryptionIV, aeadEncryptedResponseHeaderLength[:], nil); err != nil { +- return nil, drain.WithError(c.readDrainer, reader, errors.New("Failed To Decrypt Length").Base(err)) +- } else { // nolint: golint +- common.Must(binary.Read(bytes.NewReader(decryptedResponseHeaderLengthBinaryBuffer), binary.BigEndian, &decryptedResponseHeaderLengthBinaryDeserializeBuffer)) +- decryptedResponseHeaderLength = int(decryptedResponseHeaderLengthBinaryDeserializeBuffer) +- } +- +- aeadResponseHeaderPayloadEncryptionKey := vmessaead.KDF16(c.responseBodyKey[:], vmessaead.KDFSaltConstAEADRespHeaderPayloadKey) +- aeadResponseHeaderPayloadEncryptionIV := vmessaead.KDF(c.responseBodyIV[:], vmessaead.KDFSaltConstAEADRespHeaderPayloadIV)[:12] +- +- aeadResponseHeaderPayloadEncryptionAEAD := crypto.NewAesGcm(aeadResponseHeaderPayloadEncryptionKey) +- +- encryptedResponseHeaderBuffer := make([]byte, decryptedResponseHeaderLength+16) +- +- if n, err := io.ReadFull(reader, encryptedResponseHeaderBuffer); err != nil { +- c.readDrainer.AcknowledgeReceive(n) +- return nil, drain.WithError(c.readDrainer, reader, errors.New("Unable to Read Header Data").Base(err)) +- } else { // nolint: golint +- c.readDrainer.AcknowledgeReceive(n) +- } +- +- if decryptedResponseHeaderBuffer, err := aeadResponseHeaderPayloadEncryptionAEAD.Open(nil, aeadResponseHeaderPayloadEncryptionIV, encryptedResponseHeaderBuffer, nil); err != nil { +- return nil, drain.WithError(c.readDrainer, reader, errors.New("Failed To Decrypt Payload").Base(err)) +- } else { // nolint: golint +- c.responseReader = bytes.NewReader(decryptedResponseHeaderBuffer) ++ if c.legacy { ++ stream := crypto.NewAesDecryptionStream(c.responseBodyKey[:], c.responseBodyIV[:]) ++ c.responseReader = crypto.NewCryptionReader(stream, reader) ++ } else { ++ aeadResponseHeaderLengthEncryptionKey := vmessaead.KDF16(c.responseBodyKey[:], vmessaead.KDFSaltConstAEADRespHeaderLenKey) ++ aeadResponseHeaderLengthEncryptionIV := vmessaead.KDF(c.responseBodyIV[:], vmessaead.KDFSaltConstAEADRespHeaderLenIV)[:12] ++ ++ aeadResponseHeaderLengthEncryptionAEAD := crypto.NewAesGcm(aeadResponseHeaderLengthEncryptionKey) ++ ++ var aeadEncryptedResponseHeaderLength [18]byte ++ var decryptedResponseHeaderLength int ++ var decryptedResponseHeaderLengthBinaryDeserializeBuffer uint16 ++ ++ if n, err := io.ReadFull(reader, aeadEncryptedResponseHeaderLength[:]); err != nil { ++ c.readDrainer.AcknowledgeReceive(n) ++ return nil, drain.WithError(c.readDrainer, reader, errors.New("Unable to Read Header Len").Base(err)) ++ } else { // nolint: golint ++ c.readDrainer.AcknowledgeReceive(n) ++ } ++ if decryptedResponseHeaderLengthBinaryBuffer, err := aeadResponseHeaderLengthEncryptionAEAD.Open(nil, aeadResponseHeaderLengthEncryptionIV, aeadEncryptedResponseHeaderLength[:], nil); err != nil { ++ return nil, drain.WithError(c.readDrainer, reader, errors.New("Failed To Decrypt Length").Base(err)) ++ } else { // nolint: golint ++ common.Must(binary.Read(bytes.NewReader(decryptedResponseHeaderLengthBinaryBuffer), binary.BigEndian, &decryptedResponseHeaderLengthBinaryDeserializeBuffer)) ++ decryptedResponseHeaderLength = int(decryptedResponseHeaderLengthBinaryDeserializeBuffer) ++ } ++ ++ aeadResponseHeaderPayloadEncryptionKey := vmessaead.KDF16(c.responseBodyKey[:], vmessaead.KDFSaltConstAEADRespHeaderPayloadKey) ++ aeadResponseHeaderPayloadEncryptionIV := vmessaead.KDF(c.responseBodyIV[:], vmessaead.KDFSaltConstAEADRespHeaderPayloadIV)[:12] ++ ++ aeadResponseHeaderPayloadEncryptionAEAD := crypto.NewAesGcm(aeadResponseHeaderPayloadEncryptionKey) ++ ++ encryptedResponseHeaderBuffer := make([]byte, decryptedResponseHeaderLength+16) ++ ++ if n, err := io.ReadFull(reader, encryptedResponseHeaderBuffer); err != nil { ++ c.readDrainer.AcknowledgeReceive(n) ++ return nil, drain.WithError(c.readDrainer, reader, errors.New("Unable to Read Header Data").Base(err)) ++ } else { // nolint: golint ++ c.readDrainer.AcknowledgeReceive(n) ++ } ++ ++ if decryptedResponseHeaderBuffer, err := aeadResponseHeaderPayloadEncryptionAEAD.Open(nil, aeadResponseHeaderPayloadEncryptionIV, encryptedResponseHeaderBuffer, nil); err != nil { ++ return nil, drain.WithError(c.readDrainer, reader, errors.New("Failed To Decrypt Payload").Base(err)) ++ } else { // nolint: golint ++ c.responseReader = bytes.NewReader(decryptedResponseHeaderBuffer) ++ } + } + + buffer := buf.StackNew() +--- a/proxy/vmess/encoding/encoding_test.go ++++ b/proxy/vmess/encoding/encoding_test.go +@@ -41,7 +41,7 @@ + } + + buffer := buf.New() +- client := NewClientSession(context.TODO(), 0) ++ client := NewClientSession(context.TODO(), 0, false) + common.Must(client.EncodeRequestHeader(expectedRequest, buffer)) + + buffer2 := buf.New() +@@ -90,7 +90,7 @@ + } + + buffer := buf.New() +- client := NewClientSession(context.TODO(), 0) ++ client := NewClientSession(context.TODO(), 0, false) + common.Must(client.EncodeRequestHeader(expectedRequest, buffer)) + + buffer2 := buf.New() +@@ -130,7 +130,7 @@ + } + + buffer := buf.New() +- client := NewClientSession(context.TODO(), 0) ++ client := NewClientSession(context.TODO(), 0, false) + common.Must(client.EncodeRequestHeader(expectedRequest, buffer)) + + buffer2 := buf.New() +--- a/proxy/vmess/encoding/legacy_test.go ++++ b/proxy/vmess/encoding/legacy_test.go +@@ -0,0 +1,159 @@ ++package encoding ++ ++import ( ++ "bytes" ++ "context" ++ "crypto/aes" ++ "crypto/cipher" ++ "crypto/hmac" ++ "crypto/md5" ++ "encoding/binary" ++ "fmt" ++ "hash/fnv" ++ "io" ++ "testing" ++ "time" ++ ++ "github.com/xtls/xray-core/common/buf" ++ "github.com/xtls/xray-core/common/net" ++ "github.com/xtls/xray-core/common/protocol" ++ "github.com/xtls/xray-core/proxy/vmess" ++) ++ ++func legacyRequest(t *testing.T, security protocol.SecurityType, command protocol.RequestCommand) (*ClientSession, *protocol.RequestHeader, []byte) { ++ t.Helper() ++ a, err := (&vmess.Account{Id: "e641f5ad-9397-41e3-bf1a-e8740dfed019", AlterId: 1}).AsAccount() ++ if err != nil { ++ t.Fatal(err) ++ } ++ req := &protocol.RequestHeader{Version: 1, User: &protocol.MemoryUser{Account: a}, Command: command, Address: net.DomainAddress("example.com"), Port: 443, Security: security, Option: protocol.RequestOptionChunkStream | protocol.RequestOptionChunkMasking | protocol.RequestOptionGlobalPadding} ++ c := NewClientSession(context.Background(), 0, true) ++ var wire bytes.Buffer ++ if err := c.EncodeRequestHeader(req, &wire); err != nil { ++ t.Fatal(err) ++ } ++ raw := wire.Bytes() ++ // Independently recover the timestamp from the legacy HMAC-MD5 authenticator. ++ var stamp [8]byte ++ found := false ++ for ts := time.Now().Unix() - 35; ts <= time.Now().Unix()+35; ts++ { ++ binary.BigEndian.PutUint64(stamp[:], uint64(ts)) ++ auth := hmac.New(md5.New, a.(*vmess.MemoryAccount).AlterIDs[0].Bytes()) ++ auth.Write(stamp[:]) ++ if hmac.Equal(auth.Sum(nil), raw[:16]) { ++ found = true ++ break ++ } ++ } ++ if !found { ++ t.Fatal("legacy authentication ID or timestamp mismatch") ++ } ++ iv := md5.Sum(bytes.Repeat(stamp[:], 4)) ++ block, err := aes.NewCipher(a.(*vmess.MemoryAccount).ID.CmdKey()) ++ if err != nil { ++ t.Fatal(err) ++ } ++ header := append([]byte(nil), raw[16:]...) ++ cipher.NewCFBDecrypter(block, iv[:]).XORKeyStream(header, header) ++ h := fnv.New32a() ++ h.Write(header[:len(header)-4]) ++ if binary.BigEndian.Uint32(header[len(header)-4:]) != h.Sum32() { ++ t.Fatal("invalid request header checksum") ++ } ++ if header[0] != 1 || header[37] != byte(command) || header[35]&15 != byte(security) { ++ t.Fatal("invalid request header fields") ++ } ++ return c, req, header ++} ++ ++func TestLegacyVMessTCPAndUDP(t *testing.T) { ++ for _, security := range []protocol.SecurityType{protocol.SecurityType_AES128_GCM, protocol.SecurityType_CHACHA20_POLY1305} { ++ for _, command := range []protocol.RequestCommand{protocol.RequestCommandTCP, protocol.RequestCommandUDP} { ++ t.Run(fmt.Sprintf("%v/%v", security, command), func(t *testing.T) { ++ c, req, header := legacyRequest(t, security, command) ++ server := &ServerSession{} ++ copy(server.requestBodyIV[:], header[1:17]) ++ copy(server.requestBodyKey[:], header[17:33]) ++ server.responseBodyKey = md5.Sum(header[17:33]) ++ server.responseBodyIV = md5.Sum(header[1:17]) ++ var upload, download bytes.Buffer ++ writer, err := c.EncodeRequestBody(req, &upload) ++ if err != nil { ++ t.Fatal(err) ++ } ++ payload := bytes.Repeat([]byte("legacy vmess packet "), 40) ++ if err = writer.WriteMultiBuffer(buf.MultiBuffer{buf.FromBytes(payload)}); err != nil { ++ t.Fatal(err) ++ } ++ reader, err := server.DecodeRequestBody(req, &upload) ++ if err != nil { ++ t.Fatal(err) ++ } ++ assertPacket(t, reader, payload) ++ response := []byte{header[33], 0, 0, 0} ++ block, err := aes.NewCipher(server.responseBodyKey[:]) ++ if err != nil { ++ t.Fatal(err) ++ } ++ cipher.NewCFBEncrypter(block, server.responseBodyIV[:]).XORKeyStream(response, response) ++ download.Write(response) ++ writer, err = server.EncodeResponseBody(req, &download) ++ if err != nil { ++ t.Fatal(err) ++ } ++ if err = writer.WriteMultiBuffer(buf.MultiBuffer{buf.FromBytes(payload)}); err != nil { ++ t.Fatal(err) ++ } ++ if _, err = c.DecodeResponseHeader(&download); err != nil { ++ t.Fatal(err) ++ } ++ reader, err = c.DecodeResponseBody(req, &download) ++ if err != nil { ++ t.Fatal(err) ++ } ++ assertPacket(t, reader, payload) ++ }) ++ } ++ } ++} ++ ++func assertPacket(t *testing.T, r buf.Reader, want []byte) { ++ t.Helper() ++ b, err := r.ReadMultiBuffer() ++ defer buf.ReleaseMulti(b) ++ if err != nil { ++ t.Fatal(err) ++ } ++ var got []byte ++ for _, part := range b { ++ got = append(got, part.Bytes()...) ++ } ++ if !bytes.Equal(got, want) { ++ t.Fatal("payload mismatch") ++ } ++} ++ ++func TestLegacyResponseRejectsInvalidHeader(t *testing.T) { ++ for _, truncated := range []bool{false, true} { ++ c, _, header := legacyRequest(t, protocol.SecurityType_AES128_GCM, protocol.RequestCommandTCP) ++ response := []byte{header[33] ^ 1, 0, 0, 0} ++ block, _ := aes.NewCipher(c.responseBodyKey[:]) ++ cipher.NewCFBEncrypter(block, c.responseBodyIV[:]).XORKeyStream(response, response) ++ if truncated { ++ response = response[:2] ++ } ++ if _, err := c.DecodeResponseHeader(bytes.NewReader(response)); err == nil { ++ t.Fatal("accepted invalid response") ++ } ++ } ++} ++ ++type failedLegacyWriter struct{} ++ ++func (failedLegacyWriter) Write([]byte) (int, error) { return 0, io.ErrClosedPipe } ++func TestLegacyRequestWriteError(t *testing.T) { ++ c, req, _ := legacyRequest(t, protocol.SecurityType_AES128_GCM, protocol.RequestCommandTCP) ++ if err := c.EncodeRequestHeader(req, failedLegacyWriter{}); err != io.ErrClosedPipe { ++ t.Fatalf("got %v", err) ++ } ++} +--- a/proxy/vmess/outbound/outbound.go ++++ b/proxy/vmess/outbound/outbound.go +@@ -132,7 +132,7 @@ + newCtx, newCancel = context.WithCancel(context.Background()) + } + +- session := encoding.NewClientSession(ctx, int64(behaviorSeed)) ++ session := encoding.NewClientSession(ctx, int64(behaviorSeed), len(account.AlterIDs) != 0) + sessionPolicy := h.policyManager.ForLevel(request.User.Level) + + ctx, cancel := context.WithCancel(ctx) diff --git a/xray-core/patches/130-add-naive-proxy.patch b/xray-core/patches/130-add-naive-proxy.patch new file mode 100644 index 000000000..74578e82b --- /dev/null +++ b/xray-core/patches/130-add-naive-proxy.patch @@ -0,0 +1,1648 @@ +From: coolsnowwolf +Subject: [PATCH] proxy: add Naive inbound and Chromium/Cronet outbound + +Adapt sing-box Naive CONNECT authentication, padding and UoT to Xray. +Use the same cronet-go revision and Chromium 154 native libraries for +outbound HTTP/2 and HTTP/3, preserving the actual browser network stack. +Route tunneled TCP/UDP through Xray, retain outbound socket options and +dialer chains, and keep TLS verification mandatory in Cronet. + +Add an HTTP/1.1, HTTP/2 and HTTP/3 inbound transport with per-stream +lifecycle handling. Match Xray's default private-target restrictions. +Naive outbound is opt-in with with_naive_outbound; with_musl selects +static OpenWrt archives. Inbound needs no native library. + +Port source: sing-box dfb80349bf5779ec0a3f834c9ec2794345bff8f0 +Cronet: 4d18a60dc3a8 (native libraries a1cafd93eb1f) +Sing-box-derived code is GPL-3.0-or-later; include its license. +Signed-off-by: coolsnowwolf + +--- a/go.mod ++++ b/go.mod +@@ -18,6 +18,23 @@ + github.com/pires/go-proxyproto v0.16.0 + github.com/refraction-networking/utls v1.8.3-0.20261108164504-a13c59ffe98b + github.com/robfig/cron/v3 v3.0.1 ++ github.com/sagernet/cronet-go v0.0.0-20260929213745-4d18a60dc3a8 ++ github.com/sagernet/cronet-go/lib/linux_386 v0.0.0-20260929213014-a1cafd93eb1f ++ github.com/sagernet/cronet-go/lib/linux_386_musl v0.0.0-20260929213014-a1cafd93eb1f ++ github.com/sagernet/cronet-go/lib/linux_amd64 v0.0.0-20260929213014-a1cafd93eb1f ++ github.com/sagernet/cronet-go/lib/linux_amd64_musl v0.0.0-20260929213014-a1cafd93eb1f ++ github.com/sagernet/cronet-go/lib/linux_arm v0.0.0-20260929213014-a1cafd93eb1f ++ github.com/sagernet/cronet-go/lib/linux_arm64 v0.0.0-20260929213014-a1cafd93eb1f ++ github.com/sagernet/cronet-go/lib/linux_arm64_musl v0.0.0-20260929213014-a1cafd93eb1f ++ github.com/sagernet/cronet-go/lib/linux_arm_musl v0.0.0-20260929213014-a1cafd93eb1f ++ github.com/sagernet/cronet-go/lib/linux_loong64 v0.0.0-20260929213014-a1cafd93eb1f ++ github.com/sagernet/cronet-go/lib/linux_loong64_musl v0.0.0-20260929213014-a1cafd93eb1f ++ github.com/sagernet/cronet-go/lib/linux_mipsle v0.0.0-20260929213014-a1cafd93eb1f ++ github.com/sagernet/cronet-go/lib/linux_mipsle_musl v0.0.0-20260929213014-a1cafd93eb1f ++ github.com/sagernet/cronet-go/lib/linux_riscv64 v0.0.0-20260929213014-a1cafd93eb1f ++ github.com/sagernet/cronet-go/lib/linux_riscv64_musl v0.0.0-20260929213014-a1cafd93eb1f ++ github.com/sagernet/sing v0.8.14 ++ github.com/sagernet/sing-anytls v0.0.0-20260928104022-580984e4d8cb + github.com/stretchr/testify v1.12.1 + github.com/vishvananda/netlink v1.3.1 + github.com/xtls/reality v0.0.0-20261108101329-4bb46b2afd8b +@@ -41,6 +58,7 @@ + ) + + require ( ++ github.com/ebitengine/purego v0.10.0 // indirect + github.com/google/gopacket v1.1.19 // indirect + github.com/huin/goupnp v1.2.0 // indirect + github.com/jackpal/go-nat-pmp v1.0.2 // indirect +@@ -53,8 +71,6 @@ + github.com/pion/logging v0.2.4 // indirect + github.com/pion/transport/v4 v4.1.0 // indirect + github.com/quic-go/qpack v0.6.0 // indirect +- github.com/sagernet/sing v0.8.14 +- github.com/sagernet/sing-anytls v0.0.0-20260928104022-580984e4d8cb + github.com/vishvananda/netns v0.0.5 // indirect + github.com/wlynxg/anet v0.0.5 // indirect + go.yaml.in/yaml/v3 v3.0.5 // indirect +--- a/go.sum ++++ b/go.sum +@@ -5,6 +5,8 @@ + github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= + github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= + github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= ++github.com/ebitengine/purego v0.10.0 h1:QIw4xfpWT6GWTzaW5XEKy3HXoqrJGx1ijYHzTF0/ISU= ++github.com/ebitengine/purego v0.10.0/go.mod h1:iIjxzd6CiRiOG0UyXP+V1+jWqUXVjPKLAI0mRfJZTmQ= + github.com/ghodss/yaml v1.0.1-0.20220118164431-d8423dcdf344 h1:Arcl6UOIS/kgO2nW3A65HN+7CMjSDP/gofXL4CZt1V4= + github.com/ghodss/yaml v1.0.1-0.20220118164431-d8423dcdf344/go.mod h1:GIjDIg/heH5DOkXY3YJ/wNhfHsQHoXGjl8G8amsYQ1I= + github.com/go-quicktest/qt v1.102.0 h1:HSQxCeh5YZH3EL3W39ixjtyaEhcWSXQHtHnMBzSs474= +@@ -73,6 +75,36 @@ + github.com/robfig/cron/v3 v3.0.1/go.mod h1:eQICP3HwyT7UooqI/z+Ov+PtYAWygg1TEWWzGIFLtro= + github.com/rogpeppe/go-internal v1.16.0 h1:O9DK+vNMDVGLr2BeZqmpLeMjiMNkuXfcqntWbZV6S5g= + github.com/rogpeppe/go-internal v1.16.0/go.mod h1:DrUVZyrJU+txYW5/1kwtXQSMFio52ZOxX7yM1VHvnxs= ++github.com/sagernet/cronet-go v0.0.0-20260929213745-4d18a60dc3a8 h1:yW/KNhSxWxllsPjLx5EUPohHLa4Kvzl2Qt9kHkB0ZIc= ++github.com/sagernet/cronet-go v0.0.0-20260929213745-4d18a60dc3a8/go.mod h1:T/mwtrpC4JlWfScw73CmSBvHzIvc7BatQ1MhRr+cYNw= ++github.com/sagernet/cronet-go/lib/linux_386 v0.0.0-20260929213014-a1cafd93eb1f h1:YKTs7860q5YC+arXDoxuAuCq4Ba7hcJnau7/QtkVgcs= ++github.com/sagernet/cronet-go/lib/linux_386 v0.0.0-20260929213014-a1cafd93eb1f/go.mod h1:cGh5hO6eljCo6KMQ/Cel8Xgq4+etL0awZLRBDVG1EZQ= ++github.com/sagernet/cronet-go/lib/linux_386_musl v0.0.0-20260929213014-a1cafd93eb1f h1:GbLerpkeRw1SGLHkwSNZXzR02f4aecpOBscKOp2vRkE= ++github.com/sagernet/cronet-go/lib/linux_386_musl v0.0.0-20260929213014-a1cafd93eb1f/go.mod h1:JFE0/cxaKkx0wqPMZU7MgaplQlU0zudv82dROJjClKU= ++github.com/sagernet/cronet-go/lib/linux_amd64 v0.0.0-20260929213014-a1cafd93eb1f h1:dAbYhebHYrOBOvJux8hcuj4yTEIT+UqZmuTBKsLs6cQ= ++github.com/sagernet/cronet-go/lib/linux_amd64 v0.0.0-20260929213014-a1cafd93eb1f/go.mod h1:vU8VftFeSt7fURCa3JXD6+k6ss1YAX+idQjPvHmJ2tI= ++github.com/sagernet/cronet-go/lib/linux_amd64_musl v0.0.0-20260929213014-a1cafd93eb1f h1:PAK8bwbOxhTdyjnAX/UNLEtbwtN9Hyry4N7RRG8lq30= ++github.com/sagernet/cronet-go/lib/linux_amd64_musl v0.0.0-20260929213014-a1cafd93eb1f/go.mod h1:vCe4OUuL+XOUge9v3MyTD45BnuAXiH+DkjN9quDXJzQ= ++github.com/sagernet/cronet-go/lib/linux_arm v0.0.0-20260929213014-a1cafd93eb1f h1:1z4WrEbt5eB6Arpltl/x4pL/cooe6sn+grHrXk0lDCw= ++github.com/sagernet/cronet-go/lib/linux_arm v0.0.0-20260929213014-a1cafd93eb1f/go.mod h1:w9amBWrvjtohQzBGCKJ7LCh22LhTIJs4sE7cYaKQzM0= ++github.com/sagernet/cronet-go/lib/linux_arm64 v0.0.0-20260929213014-a1cafd93eb1f h1:ka6fV7nmcXuxxxViMv3lcO1VZQ7og9BWDTsChbdOs5o= ++github.com/sagernet/cronet-go/lib/linux_arm64 v0.0.0-20260929213014-a1cafd93eb1f/go.mod h1:TqlsFtcYS/etTeck46kHBeT8Le0Igw1Q/AV88UnMS3s= ++github.com/sagernet/cronet-go/lib/linux_arm64_musl v0.0.0-20260929213014-a1cafd93eb1f h1:+ZJPetIdQY6gSB3oEXcFuN803z7hsochw63LUVNbAAw= ++github.com/sagernet/cronet-go/lib/linux_arm64_musl v0.0.0-20260929213014-a1cafd93eb1f/go.mod h1:B6Qd0vys8sv9OKVRN6J9RqDzYRGE938Fb2zrYdBDyTQ= ++github.com/sagernet/cronet-go/lib/linux_arm_musl v0.0.0-20260929213014-a1cafd93eb1f h1:6h/hBfvE9xr+FszN4fvHPlRuMQmkhveOVnlfPiJcNW0= ++github.com/sagernet/cronet-go/lib/linux_arm_musl v0.0.0-20260929213014-a1cafd93eb1f/go.mod h1:3tXMMFY7AHugOVBZ5Al7cL7JKsnFOe5bMVr0hZPk3ow= ++github.com/sagernet/cronet-go/lib/linux_loong64 v0.0.0-20260929213014-a1cafd93eb1f h1:/Vy00lZZkG5usxUMAD/9vRTT93KvJh8NAO4lP1IZEVU= ++github.com/sagernet/cronet-go/lib/linux_loong64 v0.0.0-20260929213014-a1cafd93eb1f/go.mod h1:Wt5uFdU3tnmm8YzobYewwdF7Mt6SucRQg6xeTNWC3Tk= ++github.com/sagernet/cronet-go/lib/linux_loong64_musl v0.0.0-20260929213014-a1cafd93eb1f h1:r6u8oKJ19t4gNtmggIgFgybaMLa3bliALxFTNN/OUy0= ++github.com/sagernet/cronet-go/lib/linux_loong64_musl v0.0.0-20260929213014-a1cafd93eb1f/go.mod h1:lyIF6wKBLwWa5ZXaAKbAoewewl+yCHo2iYev39Mbj4E= ++github.com/sagernet/cronet-go/lib/linux_mipsle v0.0.0-20260929213014-a1cafd93eb1f h1:kYGMQ9qe7MyK8qpTuFaleAxVrQx9DAez1jNKFCFMLVQ= ++github.com/sagernet/cronet-go/lib/linux_mipsle v0.0.0-20260929213014-a1cafd93eb1f/go.mod h1:RBhSUDAKWq7fswtV4nQUQhuaTLcX3ettR7teA7/yf2w= ++github.com/sagernet/cronet-go/lib/linux_mipsle_musl v0.0.0-20260929213014-a1cafd93eb1f h1:a2/KeGNQagO+eexS97/qykr68YLr616QRFot4aV4sJ4= ++github.com/sagernet/cronet-go/lib/linux_mipsle_musl v0.0.0-20260929213014-a1cafd93eb1f/go.mod h1:wRzoIOGG4xbpp3Gh3triLKwMwYriScXzFtunLYhY4w0= ++github.com/sagernet/cronet-go/lib/linux_riscv64 v0.0.0-20260929213014-a1cafd93eb1f h1:lxJLDTBemaS8j+xdOeK+EdxH4FSEndxNG321AO7f/ds= ++github.com/sagernet/cronet-go/lib/linux_riscv64 v0.0.0-20260929213014-a1cafd93eb1f/go.mod h1:LNiZXmWil1OPwKCheqQjtakZlJuKGFz+iv2eGF76Hhs= ++github.com/sagernet/cronet-go/lib/linux_riscv64_musl v0.0.0-20260929213014-a1cafd93eb1f h1:1ycIIAvgJsm6opK1nrXgle7QVCo9lOtyUGEDEeDOJQQ= ++github.com/sagernet/cronet-go/lib/linux_riscv64_musl v0.0.0-20260929213014-a1cafd93eb1f/go.mod h1:YFDGKTkpkJGc5+hnX/RYosZyTWg9h+68VB55fYRRLYc= + github.com/sagernet/sing v0.8.14 h1:S6Netv4F61uNAuD/sUbHnGuNUEPwtL08Ouk0//CVYgM= + github.com/sagernet/sing v0.8.14/go.mod h1:olXxWQNqRW/l2Q6JI3b2Qmz8iQnIFlOeeH8bx6JhgUA= + github.com/sagernet/sing-anytls v0.0.0-20260928104022-580984e4d8cb h1:n4sF2zv0CR1gcb4awh61t11t0FZmcP40x5enB8HARjE= +--- a/infra/conf/naive.go ++++ b/infra/conf/naive.go +@@ -0,0 +1,87 @@ ++package conf ++ ++import ( ++ "encoding/base64" ++ "fmt" ++ "github.com/xtls/xray-core/proxy/naive" ++ "golang.org/x/net/http/httpguts" ++ "google.golang.org/protobuf/proto" ++ "os" ++ "strings" ++) ++ ++type NaiveAccount struct { ++ Username string `json:"username"` ++ Password string `json:"password"` ++} ++type NaiveServerConfig struct { ++ Users []NaiveAccount `json:"users"` ++ Level uint32 `json:"level"` ++} ++ ++func (c *NaiveServerConfig) Build() (proto.Message, error) { ++ if len(c.Users) == 0 { ++ return nil, fmt.Errorf("naive: users required") ++ } ++ out := &naive.ServerConfig{Level: c.Level} ++ seen := map[string]bool{} ++ for _, u := range c.Users { ++ if u.Username == "" || strings.Contains(u.Username, ":") || u.Password == "" || seen[u.Username] { ++ return nil, fmt.Errorf("naive: invalid or duplicate user") ++ } ++ seen[u.Username] = true ++ out.Users = append(out.Users, &naive.Account{Username: u.Username, Password: u.Password}) ++ } ++ return out, nil ++} ++ ++type NaiveClientConfig struct { ++ Address *Address `json:"address"` ++ Port uint16 `json:"port"` ++ Username string `json:"username"` ++ Password string `json:"password"` ++ ServerName string `json:"serverName"` ++ Certificate []string `json:"certificate"` ++ CertificateFile string `json:"certificateFile"` ++ QUIC bool `json:"quic"` ++ UDPOverTCP bool `json:"udpOverTcp"` ++ Level uint32 `json:"level"` ++ InsecureConcurrency uint32 `json:"insecureConcurrency"` ++ ExtraHeaders map[string]string `json:"extraHeaders"` ++ ReceiveWindow uint64 `json:"receiveWindow"` ++ QUICCongestionControl string `json:"quicCongestionControl"` ++ QUICSessionReceiveWindow uint64 `json:"quicSessionReceiveWindow"` ++ ECHConfigList string `json:"echConfigList"` ++} ++ ++func (c *NaiveClientConfig) Build() (proto.Message, error) { ++ if c.Address == nil || c.Port == 0 || c.Username == "" || strings.Contains(c.Username, ":") || c.Password == "" { ++ return nil, fmt.Errorf("naive: address, port, username and password required") ++ } ++ switch c.QUICCongestionControl { ++ case "", "bbr", "bbr2", "cubic", "reno": ++ default: ++ return nil, fmt.Errorf("naive: invalid QUIC congestion control") ++ } ++ for k, v := range c.ExtraHeaders { ++ if !httpguts.ValidHeaderFieldName(k) || !httpguts.ValidHeaderFieldValue(v) || strings.ContainsAny(k+v, "\r\n") || strings.EqualFold(k, "Proxy-Authorization") || strings.EqualFold(k, "Padding") || strings.EqualFold(k, "Host") { ++ return nil, fmt.Errorf("naive: invalid or reserved extra header %q", k) ++ } ++ } ++ cert := strings.Join(c.Certificate, "\n") ++ if c.CertificateFile != "" { ++ if cert != "" { ++ return nil, fmt.Errorf("naive: specify certificate or certificateFile") ++ } ++ b, e := os.ReadFile(c.CertificateFile) ++ if e != nil { ++ return nil, e ++ } ++ cert = string(b) ++ } ++ ech, e := base64.StdEncoding.DecodeString(c.ECHConfigList) ++ if e != nil { ++ return nil, fmt.Errorf("naive: invalid ECH config: %w", e) ++ } ++ return &naive.ClientConfig{Address: c.Address.Build(), Port: uint32(c.Port), Username: c.Username, Password: c.Password, ServerName: c.ServerName, TrustedRootCertificates: cert, Quic: c.QUIC, UdpOverTcp: c.UDPOverTCP, Level: c.Level, Concurrency: c.InsecureConcurrency, ExtraHeaders: c.ExtraHeaders, ReceiveWindow: c.ReceiveWindow, QuicCongestionControl: c.QUICCongestionControl, QuicSessionReceiveWindow: c.QUICSessionReceiveWindow, EchConfigList: ech}, nil ++} +--- a/infra/conf/transport_internet.go ++++ b/infra/conf/transport_internet.go +@@ -38,6 +38,8 @@ + return "", errors.PrintRemovedFeatureError("QUIC transport (without web service, etc.)", "XHTTP stream-one H3") + case "hysteria": + return "hysteria", nil ++ case "naive": ++ return "naive", nil + case "masque": + return "masque", nil + case "xdrive": +--- a/infra/conf/xray.go ++++ b/infra/conf/xray.go +@@ -27,6 +27,7 @@ + var ( + inboundConfigLoader = NewJSONConfigLoader(ConfigCreatorCache{ + "tunnel": func() interface{} { return new(DokodemoConfig) }, ++ "naive": func() interface{} { return new(NaiveServerConfig) }, + "dokodemo-door": func() interface{} { return new(DokodemoConfig) }, + "http": func() interface{} { return new(HTTPServerConfig) }, + "shadowsocks": func() interface{} { return new(ShadowsocksServerConfig) }, +@@ -54,6 +55,7 @@ + "vless": func() interface{} { return new(VLessOutboundConfig) }, + "vmess": func() interface{} { return new(VMessOutboundConfig) }, + "trojan": func() interface{} { return new(TrojanClientConfig) }, ++ "naive": func() interface{} { return new(NaiveClientConfig) }, + "anytls": func() interface{} { return new(AnyTLSClientConfig) }, + "hysteria": func() interface{} { return new(HysteriaClientConfig) }, + "masque": func() interface{} { return new(MasqueClientConfig) }, +--- a/main/distro/all/all.go ++++ b/main/distro/all/all.go +@@ -43,6 +43,7 @@ + _ "github.com/xtls/xray-core/proxy/http" + _ "github.com/xtls/xray-core/proxy/loopback" + _ "github.com/xtls/xray-core/proxy/masque" ++ _ "github.com/xtls/xray-core/proxy/naive" + _ "github.com/xtls/xray-core/proxy/shadowsocks" + _ "github.com/xtls/xray-core/proxy/socks" + _ "github.com/xtls/xray-core/proxy/trojan" +--- a/proxy/freedom/freedom.go ++++ b/proxy/freedom/freedom.go +@@ -172,7 +172,7 @@ + switch inbound.Name { + case "vless-reverse": + return defaultBlockAllRule +- case "vless", "vmess", "trojan", "hysteria", "wireguard", "masque": ++ case "vless", "vmess", "trojan", "hysteria", "wireguard", "masque", "naive": + return defaultBlockPrivateRule + default: + if strings.HasPrefix(inbound.Name, "shadowsocks") { +--- a/proxy/naive/LICENSE.sing-box ++++ b/proxy/naive/LICENSE.sing-box +@@ -0,0 +1,17 @@ ++Copyright (C) 2022 by nekohasekai ++ ++This program is free software: you can redistribute it and/or modify ++it under the terms of the GNU General Public License as published by ++the Free Software Foundation, either version 3 of the License, or ++(at your option) any later version. ++ ++This program is distributed in the hope that it will be useful, ++but WITHOUT ANY WARRANTY; without even the implied warranty of ++MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++GNU General Public License for more details. ++ ++You should have received a copy of the GNU General Public License ++along with this program. If not, see . ++ ++In addition, no derivative work may use the name or imply association ++with this application without prior consent. +--- a/proxy/naive/address.go ++++ b/proxy/naive/address.go +@@ -0,0 +1,10 @@ ++package naive ++ ++import ( ++ M "github.com/sagernet/sing/common/metadata" ++ "github.com/xtls/xray-core/common/net" ++) ++ ++func socksaddr(d net.Destination) M.Socksaddr { ++ return M.ParseSocksaddrHostPort(d.Address.String(), uint16(d.Port)) ++} +--- a/proxy/naive/client.go ++++ b/proxy/naive/client.go +@@ -0,0 +1,175 @@ ++//go:build with_naive_outbound ++ ++// Adapted from sing-box protocol/naive/outbound.go (GPL-3.0-or-later). ++package naive ++ ++import ( ++ "context" ++ "fmt" ++ "strings" ++ "sync" ++ "time" ++ ++ mdns "github.com/miekg/dns" ++ "github.com/sagernet/cronet-go" ++ M "github.com/sagernet/sing/common/metadata" ++ "github.com/sagernet/sing/common/uot" ++ "github.com/xtls/xray-core/common" ++ "github.com/xtls/xray-core/common/buf" ++ "github.com/xtls/xray-core/common/net" ++ "github.com/xtls/xray-core/common/session" ++ "github.com/xtls/xray-core/core" ++ "github.com/xtls/xray-core/features/dns" ++ "github.com/xtls/xray-core/features/policy" ++ "github.com/xtls/xray-core/transport" ++ "github.com/xtls/xray-core/transport/internet" ++) ++ ++type Client struct { ++ config *ClientConfig ++ options cronet.NaiveClientOptions ++ policy policy.Session ++ mu sync.Mutex ++ client *cronet.NaiveClient ++ closed bool ++ cancel context.CancelFunc ++} ++ ++func NewClient(ctx context.Context, c *ClientConfig) (*Client, error) { ++ if c.Address == nil || c.Port == 0 || c.Port > 65535 || c.Username == "" || c.Password == "" { ++ return nil, fmt.Errorf("naive: invalid server or credentials") ++ } ++ settings, _ := session.StreamSettingsFromContext(ctx).(*internet.MemoryStreamConfig) ++ if settings != nil && (settings.ProtocolName != "tcp" || settings.SecurityType != "") { ++ return nil, fmt.Errorf("naive: use raw/tcp transport without stream security; Cronet handles TLS") ++ } ++ v := core.MustFromContext(ctx) ++ resolver := v.GetFeature(dns.ClientType()).(dns.Client) ++ lifetime, cancel := context.WithCancel(ctx) ++ cc := map[string]cronet.QUICCongestionControl{"": cronet.QUICCongestionControlDefault, "bbr": cronet.QUICCongestionControlBBR, "bbr2": cronet.QUICCongestionControlBBRv2, "cubic": cronet.QUICCongestionControlCubic, "reno": cronet.QUICCongestionControlReno} ++ congestion, ok := cc[c.QuicCongestionControl] ++ if !ok { ++ cancel() ++ return nil, fmt.Errorf("invalid QUIC congestion control") ++ } ++ return &Client{config: c, cancel: cancel, policy: v.GetFeature(policy.ManagerType()).(policy.Manager).ForLevel(c.Level), options: cronet.NaiveClientOptions{ ++ Context: lifetime, ServerAddress: M.ParseSocksaddrHostPort(c.Address.AsAddress().String(), uint16(c.Port)), ServerName: c.ServerName, Username: c.Username, Password: c.Password, TrustedRootCertificates: c.TrustedRootCertificates, QUIC: c.Quic, InsecureConcurrency: int(c.Concurrency), ExtraHeaders: c.ExtraHeaders, ReceiveWindow: c.ReceiveWindow, QUICCongestionControl: congestion, QUICSessionReceiveWindow: c.QuicSessionReceiveWindow, ECHEnabled: len(c.EchConfigList) > 0, ECHConfigList: c.EchConfigList, ++ DNSResolver: func(ctx context.Context, q *mdns.Msg) *mdns.Msg { ++ r := new(mdns.Msg) ++ r.SetReply(q) ++ for _, question := range q.Question { ++ if question.Qtype != mdns.TypeA && question.Qtype != mdns.TypeAAAA { ++ continue ++ } ++ ips, ttl, err := resolver.LookupIP(strings.TrimSuffix(question.Name, "."), dns.IPOption{IPv4Enable: question.Qtype == mdns.TypeA, IPv6Enable: question.Qtype == mdns.TypeAAAA}) ++ if err != nil { ++ r.Rcode = mdns.RcodeServerFailure ++ return r ++ } ++ for _, ip := range ips { ++ h := mdns.RR_Header{Name: question.Name, Rrtype: question.Qtype, Class: mdns.ClassINET, Ttl: ttl} ++ if question.Qtype == mdns.TypeA && ip.To4() != nil { ++ r.Answer = append(r.Answer, &mdns.A{Hdr: h, A: ip.To4()}) ++ } else if question.Qtype == mdns.TypeAAAA && ip.To4() == nil { ++ r.Answer = append(r.Answer, &mdns.AAAA{Hdr: h, AAAA: ip}) ++ } ++ } ++ } ++ return r ++ }}}, nil ++} ++func (c *Client) getClient(d internet.Dialer) (*cronet.NaiveClient, error) { ++ c.mu.Lock() ++ defer c.mu.Unlock() ++ if c.closed { ++ return nil, fmt.Errorf("naive client closed") ++ } ++ if c.client == nil { ++ options := c.options ++ options.Dialer = &cronetDialer{d} ++ cl, e := cronet.NewNaiveClient(options) ++ if e != nil { ++ return nil, e ++ } ++ if e = cl.Start(); e != nil { ++ cl.Close() ++ return nil, e ++ } ++ c.client = cl ++ } ++ return c.client, nil ++} ++func (c *Client) Close() error { ++ c.cancel() ++ c.mu.Lock() ++ c.closed = true ++ cl := c.client ++ c.mu.Unlock() ++ if cl != nil { ++ return cl.Close() ++ } ++ return nil ++} ++func (c *Client) Process(ctx context.Context, link *transport.Link, d internet.Dialer) error { ++ obs := session.OutboundsFromContext(ctx) ++ if len(obs) == 0 { ++ return fmt.Errorf("naive: missing target") ++ } ++ ob := obs[len(obs)-1] ++ target := ob.Target ++ if !target.IsValid() || (target.Network != net.Network_TCP && target.Network != net.Network_UDP) { ++ return fmt.Errorf("naive: invalid target") ++ } ++ if target.Network == net.Network_UDP && !c.config.UdpOverTcp { ++ return fmt.Errorf("naive: UDP requires udpOverTcp") ++ } ++ ob.Name = "naive" ++ ob.CanSpliceCopy = 3 ++ client, err := c.getClient(d) ++ if err != nil { ++ return err ++ } ++ destination := socksaddr(target) ++ streamDestination := destination ++ if target.Network == net.Network_UDP { ++ streamDestination = uot.RequestDestination(uot.Version) ++ } ++ dialCtx, cancelDial := context.WithTimeout(ctx, c.policy.Timeouts.Handshake) ++ conn, err := client.DialContext(dialCtx, "tcp", streamDestination) ++ cancelDial() ++ if err != nil { ++ return err ++ } ++ defer conn.Close() ++ var reader buf.Reader = buf.NewReader(conn) ++ var writer buf.Writer = buf.NewWriter(conn) ++ if target.Network == net.Network_UDP { ++ conn.SetWriteDeadline(time.Now().Add(c.policy.Timeouts.Handshake)) ++ pc, e := (&uot.Client{Version: uot.Version}).DialConn(conn, false, destination) ++ conn.SetWriteDeadline(time.Time{}) ++ if e != nil { ++ return e ++ } ++ reader = &packetReader{conn: pc} ++ writer = &packetWriter{conn: pc, destination: destination} ++ } ++ return relay(ctx, link.Reader, writer, reader, link.Writer, conn, c.policy) ++} ++ ++type cronetDialer struct{ internet.Dialer } ++ ++func (d *cronetDialer) DialContext(ctx context.Context, network string, a M.Socksaddr) (net.Conn, error) { ++ dest := net.TCPDestination(net.ParseAddress(a.AddrString()), net.Port(a.Port)) ++ if network == "udp" { ++ dest.Network = net.Network_UDP ++ } ++ return d.Dial(ctx, dest) ++} ++func (d *cronetDialer) ListenPacket(context.Context, M.Socksaddr) (net.PacketConn, error) { ++ return nil, fmt.Errorf("unconnected UDP is not used by Cronet") ++} ++func init() { ++ common.Must(common.RegisterConfig((*ClientConfig)(nil), func(ctx context.Context, c interface{}) (interface{}, error) { ++ return NewClient(ctx, c.(*ClientConfig)) ++ })) ++} +--- a/proxy/naive/client_stub.go ++++ b/proxy/naive/client_stub.go +@@ -0,0 +1,15 @@ ++//go:build !with_naive_outbound ++ ++package naive ++ ++import ( ++ "context" ++ "fmt" ++ "github.com/xtls/xray-core/common" ++) ++ ++func init() { ++ common.Must(common.RegisterConfig((*ClientConfig)(nil), func(context.Context, interface{}) (interface{}, error) { ++ return nil, fmt.Errorf("Naive outbound requires a Cronet-enabled build (with_naive_outbound)") ++ })) ++} +--- a/proxy/naive/config.pb.go ++++ b/proxy/naive/config.pb.go +@@ -0,0 +1,372 @@ ++// Code generated by protoc-gen-go. DO NOT EDIT. ++// versions: ++// protoc-gen-go v1.36.12 ++// protoc v3.21.12 ++// source: proxy/naive/config.proto ++ ++package naive ++ ++import ( ++ net "github.com/xtls/xray-core/common/net" ++ protoreflect "google.golang.org/protobuf/reflect/protoreflect" ++ protoimpl "google.golang.org/protobuf/runtime/protoimpl" ++ reflect "reflect" ++ sync "sync" ++ unsafe "unsafe" ++) ++ ++const ( ++ // Verify that this generated code is sufficiently up-to-date. ++ _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) ++ // Verify that runtime/protoimpl is sufficiently up-to-date. ++ _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) ++) ++ ++type Account struct { ++ state protoimpl.MessageState `protogen:"open.v1"` ++ Username string `protobuf:"bytes,1,opt,name=username,proto3" json:"username,omitempty"` ++ Password string `protobuf:"bytes,2,opt,name=password,proto3" json:"password,omitempty"` ++ unknownFields protoimpl.UnknownFields ++ sizeCache protoimpl.SizeCache ++} ++ ++func (x *Account) Reset() { ++ *x = Account{} ++ mi := &file_proxy_naive_config_proto_msgTypes[0] ++ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ++ ms.StoreMessageInfo(mi) ++} ++ ++func (x *Account) String() string { ++ return protoimpl.X.MessageStringOf(x) ++} ++ ++func (*Account) ProtoMessage() {} ++ ++func (x *Account) ProtoReflect() protoreflect.Message { ++ mi := &file_proxy_naive_config_proto_msgTypes[0] ++ if x != nil { ++ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ++ if ms.LoadMessageInfo() == nil { ++ ms.StoreMessageInfo(mi) ++ } ++ return ms ++ } ++ return mi.MessageOf(x) ++} ++ ++// Deprecated: Use Account.ProtoReflect.Descriptor instead. ++func (*Account) Descriptor() ([]byte, []int) { ++ return file_proxy_naive_config_proto_rawDescGZIP(), []int{0} ++} ++ ++func (x *Account) GetUsername() string { ++ if x != nil { ++ return x.Username ++ } ++ return "" ++} ++ ++func (x *Account) GetPassword() string { ++ if x != nil { ++ return x.Password ++ } ++ return "" ++} ++ ++type ServerConfig struct { ++ state protoimpl.MessageState `protogen:"open.v1"` ++ Users []*Account `protobuf:"bytes,1,rep,name=users,proto3" json:"users,omitempty"` ++ Level uint32 `protobuf:"varint,2,opt,name=level,proto3" json:"level,omitempty"` ++ unknownFields protoimpl.UnknownFields ++ sizeCache protoimpl.SizeCache ++} ++ ++func (x *ServerConfig) Reset() { ++ *x = ServerConfig{} ++ mi := &file_proxy_naive_config_proto_msgTypes[1] ++ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ++ ms.StoreMessageInfo(mi) ++} ++ ++func (x *ServerConfig) String() string { ++ return protoimpl.X.MessageStringOf(x) ++} ++ ++func (*ServerConfig) ProtoMessage() {} ++ ++func (x *ServerConfig) ProtoReflect() protoreflect.Message { ++ mi := &file_proxy_naive_config_proto_msgTypes[1] ++ if x != nil { ++ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ++ if ms.LoadMessageInfo() == nil { ++ ms.StoreMessageInfo(mi) ++ } ++ return ms ++ } ++ return mi.MessageOf(x) ++} ++ ++// Deprecated: Use ServerConfig.ProtoReflect.Descriptor instead. ++func (*ServerConfig) Descriptor() ([]byte, []int) { ++ return file_proxy_naive_config_proto_rawDescGZIP(), []int{1} ++} ++ ++func (x *ServerConfig) GetUsers() []*Account { ++ if x != nil { ++ return x.Users ++ } ++ return nil ++} ++ ++func (x *ServerConfig) GetLevel() uint32 { ++ if x != nil { ++ return x.Level ++ } ++ return 0 ++} ++ ++type ClientConfig struct { ++ state protoimpl.MessageState `protogen:"open.v1"` ++ Address *net.IPOrDomain `protobuf:"bytes,1,opt,name=address,proto3" json:"address,omitempty"` ++ Port uint32 `protobuf:"varint,2,opt,name=port,proto3" json:"port,omitempty"` ++ Username string `protobuf:"bytes,3,opt,name=username,proto3" json:"username,omitempty"` ++ Password string `protobuf:"bytes,4,opt,name=password,proto3" json:"password,omitempty"` ++ ServerName string `protobuf:"bytes,5,opt,name=server_name,json=serverName,proto3" json:"server_name,omitempty"` ++ TrustedRootCertificates string `protobuf:"bytes,6,opt,name=trusted_root_certificates,json=trustedRootCertificates,proto3" json:"trusted_root_certificates,omitempty"` ++ Quic bool `protobuf:"varint,7,opt,name=quic,proto3" json:"quic,omitempty"` ++ UdpOverTcp bool `protobuf:"varint,8,opt,name=udp_over_tcp,json=udpOverTcp,proto3" json:"udp_over_tcp,omitempty"` ++ Level uint32 `protobuf:"varint,9,opt,name=level,proto3" json:"level,omitempty"` ++ Concurrency uint32 `protobuf:"varint,10,opt,name=concurrency,proto3" json:"concurrency,omitempty"` ++ ExtraHeaders map[string]string `protobuf:"bytes,11,rep,name=extra_headers,json=extraHeaders,proto3" json:"extra_headers,omitempty" protobuf_key:"bytes,1,opt,name=key" protobuf_val:"bytes,2,opt,name=value"` ++ ReceiveWindow uint64 `protobuf:"varint,12,opt,name=receive_window,json=receiveWindow,proto3" json:"receive_window,omitempty"` ++ QuicCongestionControl string `protobuf:"bytes,13,opt,name=quic_congestion_control,json=quicCongestionControl,proto3" json:"quic_congestion_control,omitempty"` ++ QuicSessionReceiveWindow uint64 `protobuf:"varint,14,opt,name=quic_session_receive_window,json=quicSessionReceiveWindow,proto3" json:"quic_session_receive_window,omitempty"` ++ EchConfigList []byte `protobuf:"bytes,15,opt,name=ech_config_list,json=echConfigList,proto3" json:"ech_config_list,omitempty"` ++ unknownFields protoimpl.UnknownFields ++ sizeCache protoimpl.SizeCache ++} ++ ++func (x *ClientConfig) Reset() { ++ *x = ClientConfig{} ++ mi := &file_proxy_naive_config_proto_msgTypes[2] ++ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ++ ms.StoreMessageInfo(mi) ++} ++ ++func (x *ClientConfig) String() string { ++ return protoimpl.X.MessageStringOf(x) ++} ++ ++func (*ClientConfig) ProtoMessage() {} ++ ++func (x *ClientConfig) ProtoReflect() protoreflect.Message { ++ mi := &file_proxy_naive_config_proto_msgTypes[2] ++ if x != nil { ++ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ++ if ms.LoadMessageInfo() == nil { ++ ms.StoreMessageInfo(mi) ++ } ++ return ms ++ } ++ return mi.MessageOf(x) ++} ++ ++// Deprecated: Use ClientConfig.ProtoReflect.Descriptor instead. ++func (*ClientConfig) Descriptor() ([]byte, []int) { ++ return file_proxy_naive_config_proto_rawDescGZIP(), []int{2} ++} ++ ++func (x *ClientConfig) GetAddress() *net.IPOrDomain { ++ if x != nil { ++ return x.Address ++ } ++ return nil ++} ++ ++func (x *ClientConfig) GetPort() uint32 { ++ if x != nil { ++ return x.Port ++ } ++ return 0 ++} ++ ++func (x *ClientConfig) GetUsername() string { ++ if x != nil { ++ return x.Username ++ } ++ return "" ++} ++ ++func (x *ClientConfig) GetPassword() string { ++ if x != nil { ++ return x.Password ++ } ++ return "" ++} ++ ++func (x *ClientConfig) GetServerName() string { ++ if x != nil { ++ return x.ServerName ++ } ++ return "" ++} ++ ++func (x *ClientConfig) GetTrustedRootCertificates() string { ++ if x != nil { ++ return x.TrustedRootCertificates ++ } ++ return "" ++} ++ ++func (x *ClientConfig) GetQuic() bool { ++ if x != nil { ++ return x.Quic ++ } ++ return false ++} ++ ++func (x *ClientConfig) GetUdpOverTcp() bool { ++ if x != nil { ++ return x.UdpOverTcp ++ } ++ return false ++} ++ ++func (x *ClientConfig) GetLevel() uint32 { ++ if x != nil { ++ return x.Level ++ } ++ return 0 ++} ++ ++func (x *ClientConfig) GetConcurrency() uint32 { ++ if x != nil { ++ return x.Concurrency ++ } ++ return 0 ++} ++ ++func (x *ClientConfig) GetExtraHeaders() map[string]string { ++ if x != nil { ++ return x.ExtraHeaders ++ } ++ return nil ++} ++ ++func (x *ClientConfig) GetReceiveWindow() uint64 { ++ if x != nil { ++ return x.ReceiveWindow ++ } ++ return 0 ++} ++ ++func (x *ClientConfig) GetQuicCongestionControl() string { ++ if x != nil { ++ return x.QuicCongestionControl ++ } ++ return "" ++} ++ ++func (x *ClientConfig) GetQuicSessionReceiveWindow() uint64 { ++ if x != nil { ++ return x.QuicSessionReceiveWindow ++ } ++ return 0 ++} ++ ++func (x *ClientConfig) GetEchConfigList() []byte { ++ if x != nil { ++ return x.EchConfigList ++ } ++ return nil ++} ++ ++var File_proxy_naive_config_proto protoreflect.FileDescriptor ++ ++const file_proxy_naive_config_proto_rawDesc = "" + ++ "\n" + ++ "\x18proxy/naive/config.proto\x12\x10xray.proxy.naive\x1a\x18common/net/address.proto\"A\n" + ++ "\aAccount\x12\x1a\n" + ++ "\busername\x18\x01 \x01(\tR\busername\x12\x1a\n" + ++ "\bpassword\x18\x02 \x01(\tR\bpassword\"U\n" + ++ "\fServerConfig\x12/\n" + ++ "\x05users\x18\x01 \x03(\v2\x19.xray.proxy.naive.AccountR\x05users\x12\x14\n" + ++ "\x05level\x18\x02 \x01(\rR\x05level\"\xba\x05\n" + ++ "\fClientConfig\x125\n" + ++ "\aaddress\x18\x01 \x01(\v2\x1b.xray.common.net.IPOrDomainR\aaddress\x12\x12\n" + ++ "\x04port\x18\x02 \x01(\rR\x04port\x12\x1a\n" + ++ "\busername\x18\x03 \x01(\tR\busername\x12\x1a\n" + ++ "\bpassword\x18\x04 \x01(\tR\bpassword\x12\x1f\n" + ++ "\vserver_name\x18\x05 \x01(\tR\n" + ++ "serverName\x12:\n" + ++ "\x19trusted_root_certificates\x18\x06 \x01(\tR\x17trustedRootCertificates\x12\x12\n" + ++ "\x04quic\x18\a \x01(\bR\x04quic\x12 \n" + ++ "\fudp_over_tcp\x18\b \x01(\bR\n" + ++ "udpOverTcp\x12\x14\n" + ++ "\x05level\x18\t \x01(\rR\x05level\x12 \n" + ++ "\vconcurrency\x18\n" + ++ " \x01(\rR\vconcurrency\x12U\n" + ++ "\rextra_headers\x18\v \x03(\v20.xray.proxy.naive.ClientConfig.ExtraHeadersEntryR\fextraHeaders\x12%\n" + ++ "\x0ereceive_window\x18\f \x01(\x04R\rreceiveWindow\x126\n" + ++ "\x17quic_congestion_control\x18\r \x01(\tR\x15quicCongestionControl\x12=\n" + ++ "\x1bquic_session_receive_window\x18\x0e \x01(\x04R\x18quicSessionReceiveWindow\x12&\n" + ++ "\x0fech_config_list\x18\x0f \x01(\fR\rechConfigList\x1a?\n" + ++ "\x11ExtraHeadersEntry\x12\x10\n" + ++ "\x03key\x18\x01 \x01(\tR\x03key\x12\x14\n" + ++ "\x05value\x18\x02 \x01(\tR\x05value:\x028\x01B'Z%github.com/xtls/xray-core/proxy/naiveb\x06proto3" ++ ++var ( ++ file_proxy_naive_config_proto_rawDescOnce sync.Once ++ file_proxy_naive_config_proto_rawDescData []byte ++) ++ ++func file_proxy_naive_config_proto_rawDescGZIP() []byte { ++ file_proxy_naive_config_proto_rawDescOnce.Do(func() { ++ file_proxy_naive_config_proto_rawDescData = protoimpl.X.CompressGZIP(unsafe.Slice(unsafe.StringData(file_proxy_naive_config_proto_rawDesc), len(file_proxy_naive_config_proto_rawDesc))) ++ }) ++ return file_proxy_naive_config_proto_rawDescData ++} ++ ++var file_proxy_naive_config_proto_msgTypes = make([]protoimpl.MessageInfo, 4) ++var file_proxy_naive_config_proto_goTypes = []any{ ++ (*Account)(nil), // 0: xray.proxy.naive.Account ++ (*ServerConfig)(nil), // 1: xray.proxy.naive.ServerConfig ++ (*ClientConfig)(nil), // 2: xray.proxy.naive.ClientConfig ++ nil, // 3: xray.proxy.naive.ClientConfig.ExtraHeadersEntry ++ (*net.IPOrDomain)(nil), // 4: xray.common.net.IPOrDomain ++} ++var file_proxy_naive_config_proto_depIdxs = []int32{ ++ 0, // 0: xray.proxy.naive.ServerConfig.users:type_name -> xray.proxy.naive.Account ++ 4, // 1: xray.proxy.naive.ClientConfig.address:type_name -> xray.common.net.IPOrDomain ++ 3, // 2: xray.proxy.naive.ClientConfig.extra_headers:type_name -> xray.proxy.naive.ClientConfig.ExtraHeadersEntry ++ 3, // [3:3] is the sub-list for method output_type ++ 3, // [3:3] is the sub-list for method input_type ++ 3, // [3:3] is the sub-list for extension type_name ++ 3, // [3:3] is the sub-list for extension extendee ++ 0, // [0:3] is the sub-list for field type_name ++} ++ ++func init() { file_proxy_naive_config_proto_init() } ++func file_proxy_naive_config_proto_init() { ++ if File_proxy_naive_config_proto != nil { ++ return ++ } ++ type x struct{} ++ out := protoimpl.TypeBuilder{ ++ File: protoimpl.DescBuilder{ ++ GoPackagePath: reflect.TypeOf(x{}).PkgPath(), ++ RawDescriptor: unsafe.Slice(unsafe.StringData(file_proxy_naive_config_proto_rawDesc), len(file_proxy_naive_config_proto_rawDesc)), ++ NumEnums: 0, ++ NumMessages: 4, ++ NumExtensions: 0, ++ NumServices: 0, ++ }, ++ GoTypes: file_proxy_naive_config_proto_goTypes, ++ DependencyIndexes: file_proxy_naive_config_proto_depIdxs, ++ MessageInfos: file_proxy_naive_config_proto_msgTypes, ++ }.Build() ++ File_proxy_naive_config_proto = out.File ++ file_proxy_naive_config_proto_goTypes = nil ++ file_proxy_naive_config_proto_depIdxs = nil ++} +--- a/proxy/naive/config.proto ++++ b/proxy/naive/config.proto +@@ -0,0 +1,23 @@ ++syntax = "proto3"; ++package xray.proxy.naive; ++option go_package = "github.com/xtls/xray-core/proxy/naive"; ++import "common/net/address.proto"; ++message Account { string username = 1; string password = 2; } ++message ServerConfig { repeated Account users = 1; uint32 level = 2; } ++message ClientConfig { ++ xray.common.net.IPOrDomain address = 1; ++ uint32 port = 2; ++ string username = 3; ++ string password = 4; ++ string server_name = 5; ++ string trusted_root_certificates = 6; ++ bool quic = 7; ++ bool udp_over_tcp = 8; ++ uint32 level = 9; ++ uint32 concurrency = 10; ++ map extra_headers = 11; ++ uint64 receive_window = 12; ++ string quic_congestion_control = 13; ++ uint64 quic_session_receive_window = 14; ++ bytes ech_config_list = 15; ++} +--- a/proxy/naive/cronet_linux_386.go ++++ b/proxy/naive/cronet_linux_386.go +@@ -0,0 +1,5 @@ ++//go:build with_naive_outbound && linux && !android && 386 && !with_musl ++ ++package naive ++ ++import _ "github.com/sagernet/cronet-go/lib/linux_386" +--- a/proxy/naive/cronet_linux_386_musl.go ++++ b/proxy/naive/cronet_linux_386_musl.go +@@ -0,0 +1,5 @@ ++//go:build with_naive_outbound && linux && !android && 386 && with_musl ++ ++package naive ++ ++import _ "github.com/sagernet/cronet-go/lib/linux_386_musl" +--- a/proxy/naive/cronet_linux_amd64.go ++++ b/proxy/naive/cronet_linux_amd64.go +@@ -0,0 +1,5 @@ ++//go:build with_naive_outbound && linux && !android && amd64 && !with_musl ++ ++package naive ++ ++import _ "github.com/sagernet/cronet-go/lib/linux_amd64" +--- a/proxy/naive/cronet_linux_amd64_musl.go ++++ b/proxy/naive/cronet_linux_amd64_musl.go +@@ -0,0 +1,5 @@ ++//go:build with_naive_outbound && linux && !android && amd64 && with_musl ++ ++package naive ++ ++import _ "github.com/sagernet/cronet-go/lib/linux_amd64_musl" +--- a/proxy/naive/cronet_linux_arm.go ++++ b/proxy/naive/cronet_linux_arm.go +@@ -0,0 +1,5 @@ ++//go:build with_naive_outbound && linux && !android && arm && !with_musl ++ ++package naive ++ ++import _ "github.com/sagernet/cronet-go/lib/linux_arm" +--- a/proxy/naive/cronet_linux_arm64.go ++++ b/proxy/naive/cronet_linux_arm64.go +@@ -0,0 +1,5 @@ ++//go:build with_naive_outbound && linux && !android && arm64 && !with_musl ++ ++package naive ++ ++import _ "github.com/sagernet/cronet-go/lib/linux_arm64" +--- a/proxy/naive/cronet_linux_arm64_musl.go ++++ b/proxy/naive/cronet_linux_arm64_musl.go +@@ -0,0 +1,5 @@ ++//go:build with_naive_outbound && linux && !android && arm64 && with_musl ++ ++package naive ++ ++import _ "github.com/sagernet/cronet-go/lib/linux_arm64_musl" +--- a/proxy/naive/cronet_linux_arm_musl.go ++++ b/proxy/naive/cronet_linux_arm_musl.go +@@ -0,0 +1,5 @@ ++//go:build with_naive_outbound && linux && !android && arm && with_musl ++ ++package naive ++ ++import _ "github.com/sagernet/cronet-go/lib/linux_arm_musl" +--- a/proxy/naive/cronet_linux_loong64.go ++++ b/proxy/naive/cronet_linux_loong64.go +@@ -0,0 +1,5 @@ ++//go:build with_naive_outbound && linux && !android && loong64 && !with_musl ++ ++package naive ++ ++import _ "github.com/sagernet/cronet-go/lib/linux_loong64" +--- a/proxy/naive/cronet_linux_loong64_musl.go ++++ b/proxy/naive/cronet_linux_loong64_musl.go +@@ -0,0 +1,5 @@ ++//go:build with_naive_outbound && linux && !android && loong64 && with_musl ++ ++package naive ++ ++import _ "github.com/sagernet/cronet-go/lib/linux_loong64_musl" +--- a/proxy/naive/cronet_linux_mipsle.go ++++ b/proxy/naive/cronet_linux_mipsle.go +@@ -0,0 +1,5 @@ ++//go:build with_naive_outbound && linux && !android && mipsle && !with_musl ++ ++package naive ++ ++import _ "github.com/sagernet/cronet-go/lib/linux_mipsle" +--- a/proxy/naive/cronet_linux_mipsle_musl.go ++++ b/proxy/naive/cronet_linux_mipsle_musl.go +@@ -0,0 +1,5 @@ ++//go:build with_naive_outbound && linux && !android && mipsle && with_musl ++ ++package naive ++ ++import _ "github.com/sagernet/cronet-go/lib/linux_mipsle_musl" +--- a/proxy/naive/cronet_linux_riscv64.go ++++ b/proxy/naive/cronet_linux_riscv64.go +@@ -0,0 +1,5 @@ ++//go:build with_naive_outbound && linux && !android && riscv64 && !with_musl ++ ++package naive ++ ++import _ "github.com/sagernet/cronet-go/lib/linux_riscv64" +--- a/proxy/naive/cronet_linux_riscv64_musl.go ++++ b/proxy/naive/cronet_linux_riscv64_musl.go +@@ -0,0 +1,5 @@ ++//go:build with_naive_outbound && linux && !android && riscv64 && with_musl ++ ++package naive ++ ++import _ "github.com/sagernet/cronet-go/lib/linux_riscv64_musl" +--- a/proxy/naive/packet.go ++++ b/proxy/naive/packet.go +@@ -0,0 +1,44 @@ ++package naive ++ ++import ( ++ singbuf "github.com/sagernet/sing/common/buf" ++ M "github.com/sagernet/sing/common/metadata" ++ "github.com/sagernet/sing/common/uot" ++ "github.com/xtls/xray-core/common/buf" ++ "github.com/xtls/xray-core/common/net" ++) ++ ++type packetReader struct{ conn *uot.Conn } ++ ++func (r *packetReader) ReadMultiBuffer() (buf.MultiBuffer, error) { ++ // Read one whole datagram, including packets larger than Xray's 8K buffer. ++ packet := singbuf.NewSize(65535) ++ defer packet.Release() ++ address, err := r.conn.ReadPacket(packet) ++ if err != nil { ++ return nil, err ++ } ++ b := buf.FromBytes(append([]byte(nil), packet.Bytes()...)) ++ destination := net.UDPDestination(net.ParseAddress(address.AddrString()), net.Port(address.Port)) ++ b.UDP = &destination ++ return buf.MultiBuffer{b}, nil ++} ++ ++type packetWriter struct { ++ conn *uot.Conn ++ destination M.Socksaddr ++} ++ ++func (w *packetWriter) WriteMultiBuffer(mb buf.MultiBuffer) error { ++ defer buf.ReleaseMulti(mb) ++ for _, b := range mb { ++ destination := w.destination ++ if b.UDP != nil { ++ destination = socksaddr(*b.UDP) ++ } ++ if err := w.conn.WritePacket(singbuf.As(b.Bytes()), destination); err != nil { ++ return err ++ } ++ } ++ return nil ++} +--- a/proxy/naive/padding.go ++++ b/proxy/naive/padding.go +@@ -0,0 +1,93 @@ ++// Adapted from sing-box protocol/naive/inbound_conn.go (GPL-3.0-or-later). ++package naive ++ ++import ( ++ "encoding/binary" ++ "io" ++ "math/rand" ++ "net" ++) ++ ++const paddingCount = 8 ++ ++func generatePaddingHeader() string { ++ p := make([]byte, 30+rand.Intn(32)) ++ bits := rand.Uint64() ++ for i := range 16 { ++ p[i] = "!#$()+<>?@[]^`{}"[bits&15] ++ bits >>= 4 ++ } ++ for i := 16; i < len(p); i++ { ++ p[i] = '~' ++ } ++ return string(p) ++} ++ ++type paddingConn struct { ++ net.Conn ++ readPadding, writePadding, remaining, skip int ++} ++ ++func (c *paddingConn) Read(p []byte) (int, error) { ++ if len(p) == 0 { ++ return 0, nil ++ } ++ for { ++ if c.remaining > 0 { ++ if len(p) > c.remaining { ++ p = p[:c.remaining] ++ } ++ n, e := c.Conn.Read(p) ++ c.remaining -= n ++ if e == io.EOF && c.remaining > 0 { ++ e = io.ErrUnexpectedEOF ++ } ++ return n, e ++ } ++ if c.skip > 0 { ++ _, e := io.CopyN(io.Discard, c.Conn, int64(c.skip)) ++ if e != nil { ++ if e == io.EOF { ++ e = io.ErrUnexpectedEOF ++ } ++ return 0, e ++ } ++ c.skip = 0 ++ } ++ if c.readPadding >= paddingCount { ++ return c.Conn.Read(p) ++ } ++ var h [3]byte ++ if _, e := io.ReadFull(c.Conn, h[:]); e != nil { ++ return 0, e ++ } ++ c.remaining = int(binary.BigEndian.Uint16(h[:2])) ++ c.skip = int(h[2]) ++ c.readPadding++ ++ } ++} ++func (c *paddingConn) Write(p []byte) (n int, err error) { ++ for len(p) > 0 { ++ if c.writePadding >= paddingCount { ++ k, e := c.Conn.Write(p) ++ return n + k, e ++ } ++ k := min(len(p), 65535) ++ pad := rand.Intn(256) ++ frame := make([]byte, 3+k+pad) ++ binary.BigEndian.PutUint16(frame[:2], uint16(k)) ++ frame[2] = byte(pad) ++ copy(frame[3:], p[:k]) ++ written, e := c.Conn.Write(frame) ++ if e == nil && written != len(frame) { ++ e = io.ErrShortWrite ++ } ++ if e != nil { ++ return n, e ++ } ++ c.writePadding++ ++ n += k ++ p = p[k:] ++ } ++ return ++} +--- a/proxy/naive/relay.go ++++ b/proxy/naive/relay.go +@@ -0,0 +1,62 @@ ++package naive ++ ++import ( ++ "context" ++ "github.com/xtls/xray-core/common" ++ "github.com/xtls/xray-core/common/buf" ++ "github.com/xtls/xray-core/common/signal" ++ "github.com/xtls/xray-core/features/policy" ++ "io" ++) ++ ++// Wait for BOTH copy loops before returning: HTTP response writers cease to be ++// valid when ServeHTTP returns. task.Run alone returns before its other task. ++func relay(ctx context.Context, upR buf.Reader, upW buf.Writer, downR buf.Reader, downW buf.Writer, conn io.Closer, p policy.Session) error { ++ ctx, cancel := context.WithCancel(ctx) ++ defer cancel() ++ timer := signal.CancelAfterInactivity(ctx, cancel, p.Timeouts.ConnectionIdle) ++ defer timer.SetTimeout(0) ++ results := make(chan error, 2) ++ go func() { ++ e := buf.Copy(upR, upW, buf.UpdateActivity(timer)) ++ if e == nil { ++ common.Close(upW) ++ } ++ timer.SetTimeout(p.Timeouts.DownlinkOnly) ++ results <- e ++ }() ++ go func() { ++ e := buf.Copy(downR, downW, buf.UpdateActivity(timer)) ++ if e == nil { ++ common.Close(downW) ++ } ++ timer.SetTimeout(p.Timeouts.UplinkOnly) ++ results <- e ++ }() ++ var first error ++ count := 0 ++ for count < 2 { ++ select { ++ case e := <-results: ++ count++ ++ if e != nil { ++ first = e ++ } ++ case <-ctx.Done(): ++ first = ctx.Err() ++ } ++ if first != nil || count == 2 { ++ break ++ } ++ } ++ conn.Close() ++ common.Interrupt(upR) ++ common.Interrupt(upW) ++ common.Interrupt(downR) ++ common.Interrupt(downW) ++ for count < 2 { ++ <-results ++ count++ ++ } ++ return first ++} +--- a/proxy/naive/server.go ++++ b/proxy/naive/server.go +@@ -0,0 +1,122 @@ ++package naive ++ ++import ( ++ "context" ++ "crypto/subtle" ++ "encoding/base64" ++ "errors" ++ "net/http" ++ "strings" ++ ++ "github.com/sagernet/sing/common/uot" ++ "github.com/xtls/xray-core/common" ++ "github.com/xtls/xray-core/common/buf" ++ "github.com/xtls/xray-core/common/net" ++ "github.com/xtls/xray-core/common/protocol" ++ "github.com/xtls/xray-core/common/session" ++ "github.com/xtls/xray-core/core" ++ "github.com/xtls/xray-core/features/policy" ++ "github.com/xtls/xray-core/features/routing" ++ "github.com/xtls/xray-core/transport/internet" ++ nt "github.com/xtls/xray-core/transport/internet/naive" ++ "github.com/xtls/xray-core/transport/internet/stat" ++) ++ ++type Server struct { ++ config *ServerConfig ++ policy policy.Session ++} ++ ++func NewServer(ctx context.Context, c *ServerConfig) (*Server, error) { ++ settings, _ := session.StreamSettingsFromContext(ctx).(*internet.MemoryStreamConfig) ++ if settings == nil || settings.ProtocolName != "naive" { ++ return nil, errors.New("naive inbound requires naive transport") ++ } ++ if len(c.Users) == 0 { ++ return nil, errors.New("naive requires users") ++ } ++ return &Server{config: c, policy: core.MustFromContext(ctx).GetFeature(policy.ManagerType()).(policy.Manager).ForLevel(c.Level)}, nil ++} ++func (*Server) Network() []net.Network { return []net.Network{net.Network_TCP} } ++func (s *Server) Process(ctx context.Context, _ net.Network, conn stat.Connection, d routing.Dispatcher) error { ++ c, ok := stat.TryUnwrapStatsConn(conn).(*nt.Conn) ++ if !ok { ++ return errors.New("naive requires HTTP CONNECT transport") ++ } ++ defer c.Finish() ++ r := c.Request ++ if r.Method != http.MethodConnect || r.Header.Get("Padding") == "" { ++ c.Respond(400, "") ++ return errors.New("invalid naive CONNECT") ++ } ++ raw, e := base64.StdEncoding.DecodeString(strings.TrimPrefix(r.Header.Get("Proxy-Authorization"), "Basic ")) ++ user, pass, valid := strings.Cut(string(raw), ":") ++ auth := 0 ++ if e == nil && valid && strings.HasPrefix(r.Header.Get("Proxy-Authorization"), "Basic ") { ++ for _, a := range s.config.Users { ++ auth |= subtle.ConstantTimeCompare([]byte(user), []byte(a.Username)) & subtle.ConstantTimeCompare([]byte(pass), []byte(a.Password)) ++ } ++ } ++ if auth != 1 { ++ c.Respond(407, "") ++ return errors.New("naive authentication failed") ++ } ++ host := r.Header.Get("-connect-authority") ++ if host == "" { ++ host = r.Host ++ } ++ dest, e := net.ParseDestination("tcp:" + host) ++ if e != nil || dest.Address == nil { ++ c.Respond(400, "") ++ return errors.New("invalid CONNECT authority") ++ } ++ isUOT := dest.Address.String() == uot.MagicAddress || dest.Address.String() == uot.LegacyMagicAddress ++ if dest.Port == 0 && !isUOT { ++ c.Respond(400, "") ++ return errors.New("invalid CONNECT port") ++ } ++ // HTTP/2 requests share a physical connection: copy session state per stream. ++ if in := session.InboundFromContext(ctx); in != nil { ++ copyIn := *in ++ copyIn.Name = "naive" ++ copyIn.CanSpliceCopy = 3 ++ copyIn.User = &protocol.MemoryUser{Email: user, Level: s.config.Level} ++ ctx = session.ContextWithInbound(ctx, ©In) ++ } ++ ctx, cancel := context.WithCancel(ctx) ++ defer cancel() ++ stop := context.AfterFunc(r.Context(), cancel) ++ defer stop() ++ if e = c.Respond(200, generatePaddingHeader()); e != nil { ++ return e ++ } ++ padded := &paddingConn{Conn: conn} ++ var reader buf.Reader = buf.NewReader(padded) ++ var writer buf.Writer = buf.NewWriter(padded) ++ if isUOT { ++ req := &uot.Request{} ++ if dest.Address.String() == uot.MagicAddress { ++ req, e = uot.ReadRequest(padded) ++ if e != nil { ++ return e ++ } ++ } ++ pc := uot.NewConn(padded, *req) ++ reader = &packetReader{conn: pc} ++ writer = &packetWriter{conn: pc, destination: req.Destination} ++ dest = net.UDPDestination(net.ParseAddress("127.0.0.1"), 1) ++ if req.Destination.IsValid() { ++ dest = net.UDPDestination(net.ParseAddress(req.Destination.AddrString()), net.Port(req.Destination.Port)) ++ } ++ } ++ link, err := d.Dispatch(ctx, dest) ++ if err != nil { ++ return err ++ } ++ return relay(ctx, reader, link.Writer, link.Reader, writer, padded, s.policy) ++} ++func init() { ++ common.Must(common.RegisterConfig((*ServerConfig)(nil), func(ctx context.Context, c interface{}) (interface{}, error) { ++ return NewServer(ctx, c.(*ServerConfig)) ++ })) ++} +--- a/transport/internet/naive/config.pb.go ++++ b/transport/internet/naive/config.pb.go +@@ -0,0 +1,113 @@ ++// Code generated by protoc-gen-go. DO NOT EDIT. ++// versions: ++// protoc-gen-go v1.36.12 ++// protoc v3.21.12 ++// source: transport/internet/naive/config.proto ++ ++package naive ++ ++import ( ++ protoreflect "google.golang.org/protobuf/reflect/protoreflect" ++ protoimpl "google.golang.org/protobuf/runtime/protoimpl" ++ reflect "reflect" ++ sync "sync" ++ unsafe "unsafe" ++) ++ ++const ( ++ // Verify that this generated code is sufficiently up-to-date. ++ _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) ++ // Verify that runtime/protoimpl is sufficiently up-to-date. ++ _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) ++) ++ ++type Config struct { ++ state protoimpl.MessageState `protogen:"open.v1"` ++ unknownFields protoimpl.UnknownFields ++ sizeCache protoimpl.SizeCache ++} ++ ++func (x *Config) Reset() { ++ *x = Config{} ++ mi := &file_transport_internet_naive_config_proto_msgTypes[0] ++ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ++ ms.StoreMessageInfo(mi) ++} ++ ++func (x *Config) String() string { ++ return protoimpl.X.MessageStringOf(x) ++} ++ ++func (*Config) ProtoMessage() {} ++ ++func (x *Config) ProtoReflect() protoreflect.Message { ++ mi := &file_transport_internet_naive_config_proto_msgTypes[0] ++ if x != nil { ++ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ++ if ms.LoadMessageInfo() == nil { ++ ms.StoreMessageInfo(mi) ++ } ++ return ms ++ } ++ return mi.MessageOf(x) ++} ++ ++// Deprecated: Use Config.ProtoReflect.Descriptor instead. ++func (*Config) Descriptor() ([]byte, []int) { ++ return file_transport_internet_naive_config_proto_rawDescGZIP(), []int{0} ++} ++ ++var File_transport_internet_naive_config_proto protoreflect.FileDescriptor ++ ++const file_transport_internet_naive_config_proto_rawDesc = "" + ++ "\n" + ++ "%transport/internet/naive/config.proto\x12\x1dxray.transport.internet.naive\"\b\n" + ++ "\x06ConfigB4Z2github.com/xtls/xray-core/transport/internet/naiveb\x06proto3" ++ ++var ( ++ file_transport_internet_naive_config_proto_rawDescOnce sync.Once ++ file_transport_internet_naive_config_proto_rawDescData []byte ++) ++ ++func file_transport_internet_naive_config_proto_rawDescGZIP() []byte { ++ file_transport_internet_naive_config_proto_rawDescOnce.Do(func() { ++ file_transport_internet_naive_config_proto_rawDescData = protoimpl.X.CompressGZIP(unsafe.Slice(unsafe.StringData(file_transport_internet_naive_config_proto_rawDesc), len(file_transport_internet_naive_config_proto_rawDesc))) ++ }) ++ return file_transport_internet_naive_config_proto_rawDescData ++} ++ ++var file_transport_internet_naive_config_proto_msgTypes = make([]protoimpl.MessageInfo, 1) ++var file_transport_internet_naive_config_proto_goTypes = []any{ ++ (*Config)(nil), // 0: xray.transport.internet.naive.Config ++} ++var file_transport_internet_naive_config_proto_depIdxs = []int32{ ++ 0, // [0:0] is the sub-list for method output_type ++ 0, // [0:0] is the sub-list for method input_type ++ 0, // [0:0] is the sub-list for extension type_name ++ 0, // [0:0] is the sub-list for extension extendee ++ 0, // [0:0] is the sub-list for field type_name ++} ++ ++func init() { file_transport_internet_naive_config_proto_init() } ++func file_transport_internet_naive_config_proto_init() { ++ if File_transport_internet_naive_config_proto != nil { ++ return ++ } ++ type x struct{} ++ out := protoimpl.TypeBuilder{ ++ File: protoimpl.DescBuilder{ ++ GoPackagePath: reflect.TypeOf(x{}).PkgPath(), ++ RawDescriptor: unsafe.Slice(unsafe.StringData(file_transport_internet_naive_config_proto_rawDesc), len(file_transport_internet_naive_config_proto_rawDesc)), ++ NumEnums: 0, ++ NumMessages: 1, ++ NumExtensions: 0, ++ NumServices: 0, ++ }, ++ GoTypes: file_transport_internet_naive_config_proto_goTypes, ++ DependencyIndexes: file_transport_internet_naive_config_proto_depIdxs, ++ MessageInfos: file_transport_internet_naive_config_proto_msgTypes, ++ }.Build() ++ File_transport_internet_naive_config_proto = out.File ++ file_transport_internet_naive_config_proto_goTypes = nil ++ file_transport_internet_naive_config_proto_depIdxs = nil ++} +--- a/transport/internet/naive/config.proto ++++ b/transport/internet/naive/config.proto +@@ -0,0 +1,4 @@ ++syntax = "proto3"; ++package xray.transport.internet.naive; ++option go_package = "github.com/xtls/xray-core/transport/internet/naive"; ++message Config {} +--- a/transport/internet/naive/hub.go ++++ b/transport/internet/naive/hub.go +@@ -0,0 +1,197 @@ ++// Naive HTTP CONNECT transport. Protocol authentication belongs to proxy/naive. ++package naive ++ ++import ( ++ "bufio" ++ "context" ++ "crypto/tls" ++ "errors" ++ "io" ++ "net" ++ "net/http" ++ "slices" ++ "sync" ++ "time" ++ ++ "github.com/apernet/quic-go/http3" ++ "github.com/xtls/xray-core/common" ++ xnet "github.com/xtls/xray-core/common/net" ++ "github.com/xtls/xray-core/transport/internet" ++ xtls "github.com/xtls/xray-core/transport/internet/tls" ++ "golang.org/x/net/http2" ++) ++ ++type Conn struct { ++ Request *http.Request ++ writer http.ResponseWriter ++ done chan struct{} ++ once sync.Once ++ closeOnce sync.Once ++ local net.Addr ++ raw net.Conn ++ buffered *bufio.ReadWriter ++} ++ ++func (c *Conn) Respond(status int, padding string) error { ++ if padding != "" { ++ c.writer.Header().Set("Padding", padding) ++ } ++ c.writer.WriteHeader(status) ++ if err := http.NewResponseController(c.writer).Flush(); err != nil { ++ return err ++ } ++ if c.Request.ProtoMajor == 1 && status == 200 { ++ var err error ++ c.raw, c.buffered, err = http.NewResponseController(c.writer).Hijack() ++ return err ++ } ++ return nil ++} ++ ++func (c *Conn) Read(p []byte) (int, error) { ++ if c.raw != nil { ++ return c.buffered.Read(p) ++ } ++ return c.Request.Body.Read(p) ++} ++ ++func (c *Conn) Write(p []byte) (int, error) { ++ if c.raw != nil { ++ return c.raw.Write(p) ++ } ++ n, err := c.writer.Write(p) ++ if err == nil { ++ err = http.NewResponseController(c.writer).Flush() ++ } ++ return n, err ++} ++func (c *Conn) Close() error { ++ c.closeOnce.Do(func() { ++ if c.raw != nil { ++ c.raw.Close() ++ return ++ } ++ c.SetReadDeadline(time.Now()) ++ c.Request.Body.Close() ++ c.SetWriteDeadline(time.Now()) ++ }) ++ return nil ++} ++func (c *Conn) Finish() { c.Close(); c.once.Do(func() { close(c.done) }) } ++ ++func (c *Conn) LocalAddr() net.Addr { return c.local } ++func (c *Conn) RemoteAddr() net.Addr { ++ a, _ := net.ResolveTCPAddr("tcp", c.Request.RemoteAddr) ++ return a ++} ++func (c *Conn) SetReadDeadline(t time.Time) error { ++ if c.raw != nil { ++ return c.raw.SetReadDeadline(t) ++ } ++ return http.NewResponseController(c.writer).SetReadDeadline(t) ++} ++func (c *Conn) SetWriteDeadline(t time.Time) error { ++ if c.raw != nil { ++ return c.raw.SetWriteDeadline(t) ++ } ++ return http.NewResponseController(c.writer).SetWriteDeadline(t) ++} ++func (c *Conn) SetDeadline(t time.Time) error { ++ return errors.Join(c.SetReadDeadline(t), c.SetWriteDeadline(t)) ++} ++ ++type Listener struct { ++ tcp net.Listener ++ udp net.PacketConn ++ h2 *http.Server ++ h3 *http3.Server ++ add internet.ConnHandler ++ ctx context.Context ++ cancel context.CancelFunc ++ addr net.Addr ++} ++ ++func (l *Listener) Addr() net.Addr { return l.addr } ++func (l *Listener) Close() error { ++ l.cancel() ++ if l.h2 != nil { ++ l.h2.Close() ++ } ++ if l.h3 != nil { ++ l.h3.Close() ++ } ++ if l.tcp != nil { ++ l.tcp.Close() ++ } ++ if l.udp != nil { ++ l.udp.Close() ++ } ++ return nil ++} ++func (l *Listener) ServeHTTP(w http.ResponseWriter, r *http.Request) { ++ ++ c := &Conn{Request: r, writer: w, done: make(chan struct{}), local: l.addr} ++ l.add(c) ++ select { ++ case <-c.done: ++ case <-r.Context().Done(): ++ r.Body.Close() ++ <-c.done ++ case <-l.ctx.Done(): ++ r.Body.Close() ++ <-c.done ++ } ++} ++func Listen(ctx context.Context, address xnet.Address, port xnet.Port, settings *internet.MemoryStreamConfig, add internet.ConnHandler) (internet.Listener, error) { ++ tc := xtls.ConfigFromStreamSettings(settings) ++ if tc == nil { ++ return nil, errors.New("naive transport requires TLS") ++ } ++ if address.Family().IsDomain() { ++ return nil, errors.New("naive listen address must be an IP") ++ } ++ l := &Listener{add: add, addr: &net.TCPAddr{IP: address.IP(), Port: int(port)}} ++ l.ctx, l.cancel = context.WithCancel(ctx) ++ h2 := len(tc.NextProtocol) == 0 || slices.Contains(tc.NextProtocol, "h2") || slices.Contains(tc.NextProtocol, "http/1.1") ++ h3 := slices.Contains(tc.NextProtocol, "h3") ++ if !h2 && !h3 { ++ l.Close() ++ return nil, errors.New("naive ALPN must include h2 or h3") ++ } ++ if h2 { ++ raw, err := internet.ListenSystem(ctx, l.addr, settings.SocketSettings) ++ if err != nil { ++ l.Close() ++ return nil, err ++ } ++ cfg := tc.GetTLSConfig() ++ cfg.NextProtos = []string{"h2", "http/1.1"} ++ l.tcp = tls.NewListener(raw, cfg) ++ l.h2 = &http.Server{Handler: l, ReadHeaderTimeout: 15 * time.Second, BaseContext: func(net.Listener) context.Context { return l.ctx }} ++ if err = http2.ConfigureServer(l.h2, &http2.Server{}); err != nil { ++ l.Close() ++ return nil, err ++ } ++ go l.h2.Serve(l.tcp) ++ } ++ if h3 { ++ pc, err := internet.ListenSystemPacket(ctx, &net.UDPAddr{IP: address.IP(), Port: int(port)}, settings.SocketSettings) ++ if err != nil { ++ l.Close() ++ return nil, err ++ } ++ l.udp = pc ++ cfg := tc.GetTLSConfig() ++ cfg.NextProtos = []string{"h3"} ++ l.h3 = &http3.Server{Handler: l, TLSConfig: cfg} ++ go l.h3.Serve(pc) ++ } ++ return l, nil ++} ++ ++var _ io.ReadWriteCloser = (*Conn)(nil) ++ ++func init() { ++ common.Must(internet.RegisterProtocolConfigCreator("naive", func() interface{} { return &Config{} })) ++ common.Must(internet.RegisterTransportListener("naive", Listen)) ++} diff --git a/xray-core/patches/140-add-shadowsocksr-proxy.patch b/xray-core/patches/140-add-shadowsocksr-proxy.patch new file mode 100644 index 000000000..53b9394dd --- /dev/null +++ b/xray-core/patches/140-add-shadowsocksr-proxy.patch @@ -0,0 +1,5117 @@ +From: coolsnowwolf +Subject: [PATCH] proxy: add ShadowsocksR inbound and outbound + +Retain Mihomo v1.19.32 client protocols, obfuscation and stream ciphers. +Add the server counterpart with TCP and native UDP routing, authenticated +multiuser protocols, bounded replay checks and fragmented handshakes. +Keep private-target restrictions and join inbound relay workers on close. +Support origin, auth_sha1_v4, auth_aes128_md5/sha1 and auth_chain_a/b; +plain, HTTP, random_head and TLS ticket camouflage; all existing ciphers. + +Wire format references: shadowsocksrr/shadowsocksr server auth/auth_chain, +and the shadowsocksr-libev server HTTP/TLS patches in this package feed. +Mihomo-derived code is GPL-3.0-or-later; include its license. +Signed-off-by: coolsnowwolf + +--- a/go.mod ++++ b/go.mod +@@ -12,6 +12,7 @@ + github.com/gorilla/websocket v1.5.3 + github.com/klauspost/cpuid/v2 v2.4.2 + github.com/libp2p/go-nat v1.0.1-0.20250821073202-01afc089f138 ++ github.com/metacubex/chacha v0.1.5 + github.com/miekg/dns v1.1.73 + github.com/pelletier/go-toml v1.9.5 + github.com/pion/stun/v3 v3.1.7 +--- a/go.sum ++++ b/go.sum +@@ -47,6 +47,8 @@ + github.com/libp2p/go-nat v1.0.1-0.20250821073202-01afc089f138/go.mod h1:TXQg5tfSy+bUjnhT5728j5j/MBj7keIYqqZ1+8k/ui8= + github.com/libp2p/go-netroute v0.2.1 h1:V8kVrpD8GK0Riv15/7VN6RbUQ3URNZVosw7H2v9tksU= + github.com/libp2p/go-netroute v0.2.1/go.mod h1:hraioZr0fhBjG0ZRXJJ6Zj2IVEVNx6tDTFQfSmcq7mQ= ++github.com/metacubex/chacha v0.1.5 h1:fKWMb/5c7ZrY8Uoqi79PPFxl+qwR7X/q0OrsAubyX2M= ++github.com/metacubex/chacha v0.1.5/go.mod h1:Djn9bPZxLTXbJFSeyo0/qzEzQI+gUSSzttuzZM75GH8= + github.com/miekg/dns v1.1.73 h1:uhT8nJxmTrPJYClxVxTCX+CVn6qnzSiybRk72Z6DgrE= + github.com/miekg/dns v1.1.73/go.mod h1:RW2Obtfd5NZHvOFe3zYG0W8koWOQtAzyHaLo8vASBuQ= + github.com/molecule-man/go-brrr v1.2.0 h1:dOJU45BC3Gc2WXoxAW0rgCAgVuu2gruAOGncfieA0Jw= +--- a/infra/conf/shadowsocksr.go ++++ b/infra/conf/shadowsocksr.go +@@ -0,0 +1,64 @@ ++package conf ++ ++import ( ++ "github.com/xtls/xray-core/common/errors" ++ "github.com/xtls/xray-core/proxy/shadowsocksr" ++ "google.golang.org/protobuf/proto" ++) ++ ++type ShadowsocksRClientConfig struct { ++ Address *Address `json:"address"` ++ Port uint16 `json:"port"` ++ Password string `json:"password"` ++ Method string `json:"method"` ++ Protocol string `json:"protocol"` ++ ProtocolParam string `json:"protocolParam"` ++ Obfs string `json:"obfs"` ++ ObfsParam string `json:"obfsParam"` ++ Level uint32 `json:"level"` ++} ++ ++func (c *ShadowsocksRClientConfig) Build() (proto.Message, error) { ++ if c.Address == nil { ++ return nil, errors.New("shadowsocksr: address is required") ++ } ++ p := c.Protocol ++ if p == "" { ++ p = "origin" ++ } ++ o := c.Obfs ++ if o == "" { ++ o = "plain" ++ } ++ config := &shadowsocksr.ClientConfig{Address: c.Address.Build(), Port: uint32(c.Port), Password: c.Password, Method: c.Method, Protocol: p, ProtocolParam: c.ProtocolParam, Obfs: o, ObfsParam: c.ObfsParam, Level: c.Level} ++ if err := shadowsocksr.Validate(config); err != nil { ++ return nil, err ++ } ++ return config, nil ++} ++ ++type ShadowsocksRServerConfig struct { ++ Password string `json:"password"` ++ Method string `json:"method"` ++ Protocol string `json:"protocol"` ++ ProtocolParam string `json:"protocolParam"` ++ Obfs string `json:"obfs"` ++ ObfsParam string `json:"obfsParam"` ++ Level uint32 `json:"level"` ++ Network *NetworkList `json:"network"` ++} ++ ++func (c *ShadowsocksRServerConfig) Build() (proto.Message, error) { ++ p, o := c.Protocol, c.Obfs ++ if p == "" { ++ p = "origin" ++ } ++ if o == "" { ++ o = "plain" ++ } ++ config := &shadowsocksr.ServerConfig{Password: c.Password, Method: c.Method, Protocol: p, ProtocolParam: c.ProtocolParam, Obfs: o, ObfsParam: c.ObfsParam, Level: c.Level, Network: c.Network.Build()} ++ if err := shadowsocksr.ValidateServer(config); err != nil { ++ return nil, err ++ } ++ return config, nil ++} +--- a/infra/conf/xray.go ++++ b/infra/conf/xray.go +@@ -36,6 +36,7 @@ + "vless": func() interface{} { return new(VLessInboundConfig) }, + "vmess": func() interface{} { return new(VMessInboundConfig) }, + "trojan": func() interface{} { return new(TrojanServerConfig) }, ++ "shadowsocksr": func() interface{} { return new(ShadowsocksRServerConfig) }, + "anytls": func() interface{} { return new(AnyTLSServerConfig) }, + "wireguard": func() interface{} { return &WireGuardConfig{IsClient: false} }, + "hysteria": func() interface{} { return new(HysteriaServerConfig) }, +@@ -44,23 +45,24 @@ + }, "protocol", "settings") + + outboundConfigLoader = NewJSONConfigLoader(ConfigCreatorCache{ +- "block": func() interface{} { return new(BlackholeConfig) }, +- "blackhole": func() interface{} { return new(BlackholeConfig) }, +- "loopback": func() interface{} { return new(LoopbackConfig) }, +- "direct": func() interface{} { return new(FreedomConfig) }, +- "freedom": func() interface{} { return new(FreedomConfig) }, +- "http": func() interface{} { return new(HTTPClientConfig) }, +- "shadowsocks": func() interface{} { return new(ShadowsocksClientConfig) }, +- "socks": func() interface{} { return new(SocksClientConfig) }, +- "vless": func() interface{} { return new(VLessOutboundConfig) }, +- "vmess": func() interface{} { return new(VMessOutboundConfig) }, +- "trojan": func() interface{} { return new(TrojanClientConfig) }, +- "naive": func() interface{} { return new(NaiveClientConfig) }, +- "anytls": func() interface{} { return new(AnyTLSClientConfig) }, +- "hysteria": func() interface{} { return new(HysteriaClientConfig) }, +- "masque": func() interface{} { return new(MasqueClientConfig) }, +- "dns": func() interface{} { return new(DNSOutboundConfig) }, +- "wireguard": func() interface{} { return &WireGuardConfig{IsClient: true} }, ++ "block": func() interface{} { return new(BlackholeConfig) }, ++ "blackhole": func() interface{} { return new(BlackholeConfig) }, ++ "loopback": func() interface{} { return new(LoopbackConfig) }, ++ "direct": func() interface{} { return new(FreedomConfig) }, ++ "freedom": func() interface{} { return new(FreedomConfig) }, ++ "http": func() interface{} { return new(HTTPClientConfig) }, ++ "shadowsocks": func() interface{} { return new(ShadowsocksClientConfig) }, ++ "socks": func() interface{} { return new(SocksClientConfig) }, ++ "vless": func() interface{} { return new(VLessOutboundConfig) }, ++ "vmess": func() interface{} { return new(VMessOutboundConfig) }, ++ "trojan": func() interface{} { return new(TrojanClientConfig) }, ++ "naive": func() interface{} { return new(NaiveClientConfig) }, ++ "shadowsocksr": func() interface{} { return new(ShadowsocksRClientConfig) }, ++ "anytls": func() interface{} { return new(AnyTLSClientConfig) }, ++ "hysteria": func() interface{} { return new(HysteriaClientConfig) }, ++ "masque": func() interface{} { return new(MasqueClientConfig) }, ++ "dns": func() interface{} { return new(DNSOutboundConfig) }, ++ "wireguard": func() interface{} { return &WireGuardConfig{IsClient: true} }, + }, "protocol", "settings") + ) + +--- a/main/distro/all/all.go ++++ b/main/distro/all/all.go +@@ -45,6 +45,7 @@ + _ "github.com/xtls/xray-core/proxy/masque" + _ "github.com/xtls/xray-core/proxy/naive" + _ "github.com/xtls/xray-core/proxy/shadowsocks" ++ _ "github.com/xtls/xray-core/proxy/shadowsocksr" + _ "github.com/xtls/xray-core/proxy/socks" + _ "github.com/xtls/xray-core/proxy/trojan" + _ "github.com/xtls/xray-core/proxy/vless/inbound" +--- a/proxy/freedom/freedom.go ++++ b/proxy/freedom/freedom.go +@@ -166,7 +166,7 @@ + if inbound == nil { + return nil + } +- if inbound.Name == "anytls" { ++ if inbound.Name == "anytls" || inbound.Name == "shadowsocksr" { + return defaultBlockPrivateRule + } + switch inbound.Name { +--- a/proxy/shadowsocksr/LICENSE ++++ b/proxy/shadowsocksr/LICENSE +@@ -0,0 +1,674 @@ ++ GNU GENERAL PUBLIC LICENSE ++ Version 3, 29 June 2007 ++ ++ Copyright (C) 2007 Free Software Foundation, Inc. ++ Everyone is permitted to copy and distribute verbatim copies ++ of this license document, but changing it is not allowed. ++ ++ Preamble ++ ++ The GNU General Public License is a free, copyleft license for ++software and other kinds of works. ++ ++ The licenses for most software and other practical works are designed ++to take away your freedom to share and change the works. By contrast, ++the GNU General Public License is intended to guarantee your freedom to ++share and change all versions of a program--to make sure it remains free ++software for all its users. We, the Free Software Foundation, use the ++GNU General Public License for most of our software; it applies also to ++any other work released this way by its authors. You can apply it to ++your programs, too. ++ ++ When we speak of free software, we are referring to freedom, not ++price. Our General Public Licenses are designed to make sure that you ++have the freedom to distribute copies of free software (and charge for ++them if you wish), that you receive source code or can get it if you ++want it, that you can change the software or use pieces of it in new ++free programs, and that you know you can do these things. ++ ++ To protect your rights, we need to prevent others from denying you ++these rights or asking you to surrender the rights. Therefore, you have ++certain responsibilities if you distribute copies of the software, or if ++you modify it: responsibilities to respect the freedom of others. ++ ++ For example, if you distribute copies of such a program, whether ++gratis or for a fee, you must pass on to the recipients the same ++freedoms that you received. You must make sure that they, too, receive ++or can get the source code. And you must show them these terms so they ++know their rights. ++ ++ Developers that use the GNU GPL protect your rights with two steps: ++(1) assert copyright on the software, and (2) offer you this License ++giving you legal permission to copy, distribute and/or modify it. ++ ++ For the developers' and authors' protection, the GPL clearly explains ++that there is no warranty for this free software. For both users' and ++authors' sake, the GPL requires that modified versions be marked as ++changed, so that their problems will not be attributed erroneously to ++authors of previous versions. ++ ++ Some devices are designed to deny users access to install or run ++modified versions of the software inside them, although the manufacturer ++can do so. This is fundamentally incompatible with the aim of ++protecting users' freedom to change the software. The systematic ++pattern of such abuse occurs in the area of products for individuals to ++use, which is precisely where it is most unacceptable. Therefore, we ++have designed this version of the GPL to prohibit the practice for those ++products. If such problems arise substantially in other domains, we ++stand ready to extend this provision to those domains in future versions ++of the GPL, as needed to protect the freedom of users. ++ ++ Finally, every program is threatened constantly by software patents. ++States should not allow patents to restrict development and use of ++software on general-purpose computers, but in those that do, we wish to ++avoid the special danger that patents applied to a free program could ++make it effectively proprietary. To prevent this, the GPL assures that ++patents cannot be used to render the program non-free. ++ ++ The precise terms and conditions for copying, distribution and ++modification follow. ++ ++ TERMS AND CONDITIONS ++ ++ 0. Definitions. ++ ++ "This License" refers to version 3 of the GNU General Public License. ++ ++ "Copyright" also means copyright-like laws that apply to other kinds of ++works, such as semiconductor masks. ++ ++ "The Program" refers to any copyrightable work licensed under this ++License. Each licensee is addressed as "you". "Licensees" and ++"recipients" may be individuals or organizations. ++ ++ To "modify" a work means to copy from or adapt all or part of the work ++in a fashion requiring copyright permission, other than the making of an ++exact copy. The resulting work is called a "modified version" of the ++earlier work or a work "based on" the earlier work. ++ ++ A "covered work" means either the unmodified Program or a work based ++on the Program. ++ ++ To "propagate" a work means to do anything with it that, without ++permission, would make you directly or secondarily liable for ++infringement under applicable copyright law, except executing it on a ++computer or modifying a private copy. Propagation includes copying, ++distribution (with or without modification), making available to the ++public, and in some countries other activities as well. ++ ++ To "convey" a work means any kind of propagation that enables other ++parties to make or receive copies. Mere interaction with a user through ++a computer network, with no transfer of a copy, is not conveying. ++ ++ An interactive user interface displays "Appropriate Legal Notices" ++to the extent that it includes a convenient and prominently visible ++feature that (1) displays an appropriate copyright notice, and (2) ++tells the user that there is no warranty for the work (except to the ++extent that warranties are provided), that licensees may convey the ++work under this License, and how to view a copy of this License. If ++the interface presents a list of user commands or options, such as a ++menu, a prominent item in the list meets this criterion. ++ ++ 1. Source Code. ++ ++ The "source code" for a work means the preferred form of the work ++for making modifications to it. "Object code" means any non-source ++form of a work. ++ ++ A "Standard Interface" means an interface that either is an official ++standard defined by a recognized standards body, or, in the case of ++interfaces specified for a particular programming language, one that ++is widely used among developers working in that language. ++ ++ The "System Libraries" of an executable work include anything, other ++than the work as a whole, that (a) is included in the normal form of ++packaging a Major Component, but which is not part of that Major ++Component, and (b) serves only to enable use of the work with that ++Major Component, or to implement a Standard Interface for which an ++implementation is available to the public in source code form. A ++"Major Component", in this context, means a major essential component ++(kernel, window system, and so on) of the specific operating system ++(if any) on which the executable work runs, or a compiler used to ++produce the work, or an object code interpreter used to run it. ++ ++ The "Corresponding Source" for a work in object code form means all ++the source code needed to generate, install, and (for an executable ++work) run the object code and to modify the work, including scripts to ++control those activities. However, it does not include the work's ++System Libraries, or general-purpose tools or generally available free ++programs which are used unmodified in performing those activities but ++which are not part of the work. For example, Corresponding Source ++includes interface definition files associated with source files for ++the work, and the source code for shared libraries and dynamically ++linked subprograms that the work is specifically designed to require, ++such as by intimate data communication or control flow between those ++subprograms and other parts of the work. ++ ++ The Corresponding Source need not include anything that users ++can regenerate automatically from other parts of the Corresponding ++Source. ++ ++ The Corresponding Source for a work in source code form is that ++same work. ++ ++ 2. Basic Permissions. ++ ++ All rights granted under this License are granted for the term of ++copyright on the Program, and are irrevocable provided the stated ++conditions are met. This License explicitly affirms your unlimited ++permission to run the unmodified Program. The output from running a ++covered work is covered by this License only if the output, given its ++content, constitutes a covered work. This License acknowledges your ++rights of fair use or other equivalent, as provided by copyright law. ++ ++ You may make, run and propagate covered works that you do not ++convey, without conditions so long as your license otherwise remains ++in force. You may convey covered works to others for the sole purpose ++of having them make modifications exclusively for you, or provide you ++with facilities for running those works, provided that you comply with ++the terms of this License in conveying all material for which you do ++not control copyright. Those thus making or running the covered works ++for you must do so exclusively on your behalf, under your direction ++and control, on terms that prohibit them from making any copies of ++your copyrighted material outside their relationship with you. ++ ++ Conveying under any other circumstances is permitted solely under ++the conditions stated below. Sublicensing is not allowed; section 10 ++makes it unnecessary. ++ ++ 3. Protecting Users' Legal Rights From Anti-Circumvention Law. ++ ++ No covered work shall be deemed part of an effective technological ++measure under any applicable law fulfilling obligations under article ++11 of the WIPO copyright treaty adopted on 20 December 1996, or ++similar laws prohibiting or restricting circumvention of such ++measures. ++ ++ When you convey a covered work, you waive any legal power to forbid ++circumvention of technological measures to the extent such circumvention ++is effected by exercising rights under this License with respect to ++the covered work, and you disclaim any intention to limit operation or ++modification of the work as a means of enforcing, against the work's ++users, your or third parties' legal rights to forbid circumvention of ++technological measures. ++ ++ 4. Conveying Verbatim Copies. ++ ++ You may convey verbatim copies of the Program's source code as you ++receive it, in any medium, provided that you conspicuously and ++appropriately publish on each copy an appropriate copyright notice; ++keep intact all notices stating that this License and any ++non-permissive terms added in accord with section 7 apply to the code; ++keep intact all notices of the absence of any warranty; and give all ++recipients a copy of this License along with the Program. ++ ++ You may charge any price or no price for each copy that you convey, ++and you may offer support or warranty protection for a fee. ++ ++ 5. Conveying Modified Source Versions. ++ ++ You may convey a work based on the Program, or the modifications to ++produce it from the Program, in the form of source code under the ++terms of section 4, provided that you also meet all of these conditions: ++ ++ a) The work must carry prominent notices stating that you modified ++ it, and giving a relevant date. ++ ++ b) The work must carry prominent notices stating that it is ++ released under this License and any conditions added under section ++ 7. This requirement modifies the requirement in section 4 to ++ "keep intact all notices". ++ ++ c) You must license the entire work, as a whole, under this ++ License to anyone who comes into possession of a copy. This ++ License will therefore apply, along with any applicable section 7 ++ additional terms, to the whole of the work, and all its parts, ++ regardless of how they are packaged. This License gives no ++ permission to license the work in any other way, but it does not ++ invalidate such permission if you have separately received it. ++ ++ d) If the work has interactive user interfaces, each must display ++ Appropriate Legal Notices; however, if the Program has interactive ++ interfaces that do not display Appropriate Legal Notices, your ++ work need not make them do so. ++ ++ A compilation of a covered work with other separate and independent ++works, which are not by their nature extensions of the covered work, ++and which are not combined with it such as to form a larger program, ++in or on a volume of a storage or distribution medium, is called an ++"aggregate" if the compilation and its resulting copyright are not ++used to limit the access or legal rights of the compilation's users ++beyond what the individual works permit. Inclusion of a covered work ++in an aggregate does not cause this License to apply to the other ++parts of the aggregate. ++ ++ 6. Conveying Non-Source Forms. ++ ++ You may convey a covered work in object code form under the terms ++of sections 4 and 5, provided that you also convey the ++machine-readable Corresponding Source under the terms of this License, ++in one of these ways: ++ ++ a) Convey the object code in, or embodied in, a physical product ++ (including a physical distribution medium), accompanied by the ++ Corresponding Source fixed on a durable physical medium ++ customarily used for software interchange. ++ ++ b) Convey the object code in, or embodied in, a physical product ++ (including a physical distribution medium), accompanied by a ++ written offer, valid for at least three years and valid for as ++ long as you offer spare parts or customer support for that product ++ model, to give anyone who possesses the object code either (1) a ++ copy of the Corresponding Source for all the software in the ++ product that is covered by this License, on a durable physical ++ medium customarily used for software interchange, for a price no ++ more than your reasonable cost of physically performing this ++ conveying of source, or (2) access to copy the ++ Corresponding Source from a network server at no charge. ++ ++ c) Convey individual copies of the object code with a copy of the ++ written offer to provide the Corresponding Source. This ++ alternative is allowed only occasionally and noncommercially, and ++ only if you received the object code with such an offer, in accord ++ with subsection 6b. ++ ++ d) Convey the object code by offering access from a designated ++ place (gratis or for a charge), and offer equivalent access to the ++ Corresponding Source in the same way through the same place at no ++ further charge. You need not require recipients to copy the ++ Corresponding Source along with the object code. If the place to ++ copy the object code is a network server, the Corresponding Source ++ may be on a different server (operated by you or a third party) ++ that supports equivalent copying facilities, provided you maintain ++ clear directions next to the object code saying where to find the ++ Corresponding Source. Regardless of what server hosts the ++ Corresponding Source, you remain obligated to ensure that it is ++ available for as long as needed to satisfy these requirements. ++ ++ e) Convey the object code using peer-to-peer transmission, provided ++ you inform other peers where the object code and Corresponding ++ Source of the work are being offered to the general public at no ++ charge under subsection 6d. ++ ++ A separable portion of the object code, whose source code is excluded ++from the Corresponding Source as a System Library, need not be ++included in conveying the object code work. ++ ++ A "User Product" is either (1) a "consumer product", which means any ++tangible personal property which is normally used for personal, family, ++or household purposes, or (2) anything designed or sold for incorporation ++into a dwelling. In determining whether a product is a consumer product, ++doubtful cases shall be resolved in favor of coverage. For a particular ++product received by a particular user, "normally used" refers to a ++typical or common use of that class of product, regardless of the status ++of the particular user or of the way in which the particular user ++actually uses, or expects or is expected to use, the product. A product ++is a consumer product regardless of whether the product has substantial ++commercial, industrial or non-consumer uses, unless such uses represent ++the only significant mode of use of the product. ++ ++ "Installation Information" for a User Product means any methods, ++procedures, authorization keys, or other information required to install ++and execute modified versions of a covered work in that User Product from ++a modified version of its Corresponding Source. The information must ++suffice to ensure that the continued functioning of the modified object ++code is in no case prevented or interfered with solely because ++modification has been made. ++ ++ If you convey an object code work under this section in, or with, or ++specifically for use in, a User Product, and the conveying occurs as ++part of a transaction in which the right of possession and use of the ++User Product is transferred to the recipient in perpetuity or for a ++fixed term (regardless of how the transaction is characterized), the ++Corresponding Source conveyed under this section must be accompanied ++by the Installation Information. But this requirement does not apply ++if neither you nor any third party retains the ability to install ++modified object code on the User Product (for example, the work has ++been installed in ROM). ++ ++ The requirement to provide Installation Information does not include a ++requirement to continue to provide support service, warranty, or updates ++for a work that has been modified or installed by the recipient, or for ++the User Product in which it has been modified or installed. Access to a ++network may be denied when the modification itself materially and ++adversely affects the operation of the network or violates the rules and ++protocols for communication across the network. ++ ++ Corresponding Source conveyed, and Installation Information provided, ++in accord with this section must be in a format that is publicly ++documented (and with an implementation available to the public in ++source code form), and must require no special password or key for ++unpacking, reading or copying. ++ ++ 7. Additional Terms. ++ ++ "Additional permissions" are terms that supplement the terms of this ++License by making exceptions from one or more of its conditions. ++Additional permissions that are applicable to the entire Program shall ++be treated as though they were included in this License, to the extent ++that they are valid under applicable law. If additional permissions ++apply only to part of the Program, that part may be used separately ++under those permissions, but the entire Program remains governed by ++this License without regard to the additional permissions. ++ ++ When you convey a copy of a covered work, you may at your option ++remove any additional permissions from that copy, or from any part of ++it. (Additional permissions may be written to require their own ++removal in certain cases when you modify the work.) You may place ++additional permissions on material, added by you to a covered work, ++for which you have or can give appropriate copyright permission. ++ ++ Notwithstanding any other provision of this License, for material you ++add to a covered work, you may (if authorized by the copyright holders of ++that material) supplement the terms of this License with terms: ++ ++ a) Disclaiming warranty or limiting liability differently from the ++ terms of sections 15 and 16 of this License; or ++ ++ b) Requiring preservation of specified reasonable legal notices or ++ author attributions in that material or in the Appropriate Legal ++ Notices displayed by works containing it; or ++ ++ c) Prohibiting misrepresentation of the origin of that material, or ++ requiring that modified versions of such material be marked in ++ reasonable ways as different from the original version; or ++ ++ d) Limiting the use for publicity purposes of names of licensors or ++ authors of the material; or ++ ++ e) Declining to grant rights under trademark law for use of some ++ trade names, trademarks, or service marks; or ++ ++ f) Requiring indemnification of licensors and authors of that ++ material by anyone who conveys the material (or modified versions of ++ it) with contractual assumptions of liability to the recipient, for ++ any liability that these contractual assumptions directly impose on ++ those licensors and authors. ++ ++ All other non-permissive additional terms are considered "further ++restrictions" within the meaning of section 10. If the Program as you ++received it, or any part of it, contains a notice stating that it is ++governed by this License along with a term that is a further ++restriction, you may remove that term. If a license document contains ++a further restriction but permits relicensing or conveying under this ++License, you may add to a covered work material governed by the terms ++of that license document, provided that the further restriction does ++not survive such relicensing or conveying. ++ ++ If you add terms to a covered work in accord with this section, you ++must place, in the relevant source files, a statement of the ++additional terms that apply to those files, or a notice indicating ++where to find the applicable terms. ++ ++ Additional terms, permissive or non-permissive, may be stated in the ++form of a separately written license, or stated as exceptions; ++the above requirements apply either way. ++ ++ 8. Termination. ++ ++ You may not propagate or modify a covered work except as expressly ++provided under this License. Any attempt otherwise to propagate or ++modify it is void, and will automatically terminate your rights under ++this License (including any patent licenses granted under the third ++paragraph of section 11). ++ ++ However, if you cease all violation of this License, then your ++license from a particular copyright holder is reinstated (a) ++provisionally, unless and until the copyright holder explicitly and ++finally terminates your license, and (b) permanently, if the copyright ++holder fails to notify you of the violation by some reasonable means ++prior to 60 days after the cessation. ++ ++ Moreover, your license from a particular copyright holder is ++reinstated permanently if the copyright holder notifies you of the ++violation by some reasonable means, this is the first time you have ++received notice of violation of this License (for any work) from that ++copyright holder, and you cure the violation prior to 30 days after ++your receipt of the notice. ++ ++ Termination of your rights under this section does not terminate the ++licenses of parties who have received copies or rights from you under ++this License. If your rights have been terminated and not permanently ++reinstated, you do not qualify to receive new licenses for the same ++material under section 10. ++ ++ 9. Acceptance Not Required for Having Copies. ++ ++ You are not required to accept this License in order to receive or ++run a copy of the Program. Ancillary propagation of a covered work ++occurring solely as a consequence of using peer-to-peer transmission ++to receive a copy likewise does not require acceptance. However, ++nothing other than this License grants you permission to propagate or ++modify any covered work. These actions infringe copyright if you do ++not accept this License. Therefore, by modifying or propagating a ++covered work, you indicate your acceptance of this License to do so. ++ ++ 10. Automatic Licensing of Downstream Recipients. ++ ++ Each time you convey a covered work, the recipient automatically ++receives a license from the original licensors, to run, modify and ++propagate that work, subject to this License. You are not responsible ++for enforcing compliance by third parties with this License. ++ ++ An "entity transaction" is a transaction transferring control of an ++organization, or substantially all assets of one, or subdividing an ++organization, or merging organizations. If propagation of a covered ++work results from an entity transaction, each party to that ++transaction who receives a copy of the work also receives whatever ++licenses to the work the party's predecessor in interest had or could ++give under the previous paragraph, plus a right to possession of the ++Corresponding Source of the work from the predecessor in interest, if ++the predecessor has it or can get it with reasonable efforts. ++ ++ You may not impose any further restrictions on the exercise of the ++rights granted or affirmed under this License. For example, you may ++not impose a license fee, royalty, or other charge for exercise of ++rights granted under this License, and you may not initiate litigation ++(including a cross-claim or counterclaim in a lawsuit) alleging that ++any patent claim is infringed by making, using, selling, offering for ++sale, or importing the Program or any portion of it. ++ ++ 11. Patents. ++ ++ A "contributor" is a copyright holder who authorizes use under this ++License of the Program or a work on which the Program is based. The ++work thus licensed is called the contributor's "contributor version". ++ ++ A contributor's "essential patent claims" are all patent claims ++owned or controlled by the contributor, whether already acquired or ++hereafter acquired, that would be infringed by some manner, permitted ++by this License, of making, using, or selling its contributor version, ++but do not include claims that would be infringed only as a ++consequence of further modification of the contributor version. For ++purposes of this definition, "control" includes the right to grant ++patent sublicenses in a manner consistent with the requirements of ++this License. ++ ++ Each contributor grants you a non-exclusive, worldwide, royalty-free ++patent license under the contributor's essential patent claims, to ++make, use, sell, offer for sale, import and otherwise run, modify and ++propagate the contents of its contributor version. ++ ++ In the following three paragraphs, a "patent license" is any express ++agreement or commitment, however denominated, not to enforce a patent ++(such as an express permission to practice a patent or covenant not to ++sue for patent infringement). To "grant" such a patent license to a ++party means to make such an agreement or commitment not to enforce a ++patent against the party. ++ ++ If you convey a covered work, knowingly relying on a patent license, ++and the Corresponding Source of the work is not available for anyone ++to copy, free of charge and under the terms of this License, through a ++publicly available network server or other readily accessible means, ++then you must either (1) cause the Corresponding Source to be so ++available, or (2) arrange to deprive yourself of the benefit of the ++patent license for this particular work, or (3) arrange, in a manner ++consistent with the requirements of this License, to extend the patent ++license to downstream recipients. "Knowingly relying" means you have ++actual knowledge that, but for the patent license, your conveying the ++covered work in a country, or your recipient's use of the covered work ++in a country, would infringe one or more identifiable patents in that ++country that you have reason to believe are valid. ++ ++ If, pursuant to or in connection with a single transaction or ++arrangement, you convey, or propagate by procuring conveyance of, a ++covered work, and grant a patent license to some of the parties ++receiving the covered work authorizing them to use, propagate, modify ++or convey a specific copy of the covered work, then the patent license ++you grant is automatically extended to all recipients of the covered ++work and works based on it. ++ ++ A patent license is "discriminatory" if it does not include within ++the scope of its coverage, prohibits the exercise of, or is ++conditioned on the non-exercise of one or more of the rights that are ++specifically granted under this License. You may not convey a covered ++work if you are a party to an arrangement with a third party that is ++in the business of distributing software, under which you make payment ++to the third party based on the extent of your activity of conveying ++the work, and under which the third party grants, to any of the ++parties who would receive the covered work from you, a discriminatory ++patent license (a) in connection with copies of the covered work ++conveyed by you (or copies made from those copies), or (b) primarily ++for and in connection with specific products or compilations that ++contain the covered work, unless you entered into that arrangement, ++or that patent license was granted, prior to 28 March 2007. ++ ++ Nothing in this License shall be construed as excluding or limiting ++any implied license or other defenses to infringement that may ++otherwise be available to you under applicable patent law. ++ ++ 12. No Surrender of Others' Freedom. ++ ++ If conditions are imposed on you (whether by court order, agreement or ++otherwise) that contradict the conditions of this License, they do not ++excuse you from the conditions of this License. If you cannot convey a ++covered work so as to satisfy simultaneously your obligations under this ++License and any other pertinent obligations, then as a consequence you may ++not convey it at all. For example, if you agree to terms that obligate you ++to collect a royalty for further conveying from those to whom you convey ++the Program, the only way you could satisfy both those terms and this ++License would be to refrain entirely from conveying the Program. ++ ++ 13. Use with the GNU Affero General Public License. ++ ++ Notwithstanding any other provision of this License, you have ++permission to link or combine any covered work with a work licensed ++under version 3 of the GNU Affero General Public License into a single ++combined work, and to convey the resulting work. The terms of this ++License will continue to apply to the part which is the covered work, ++but the special requirements of the GNU Affero General Public License, ++section 13, concerning interaction through a network will apply to the ++combination as such. ++ ++ 14. Revised Versions of this License. ++ ++ The Free Software Foundation may publish revised and/or new versions of ++the GNU General Public License from time to time. Such new versions will ++be similar in spirit to the present version, but may differ in detail to ++address new problems or concerns. ++ ++ Each version is given a distinguishing version number. If the ++Program specifies that a certain numbered version of the GNU General ++Public License "or any later version" applies to it, you have the ++option of following the terms and conditions either of that numbered ++version or of any later version published by the Free Software ++Foundation. If the Program does not specify a version number of the ++GNU General Public License, you may choose any version ever published ++by the Free Software Foundation. ++ ++ If the Program specifies that a proxy can decide which future ++versions of the GNU General Public License can be used, that proxy's ++public statement of acceptance of a version permanently authorizes you ++to choose that version for the Program. ++ ++ Later license versions may give you additional or different ++permissions. However, no additional obligations are imposed on any ++author or copyright holder as a result of your choosing to follow a ++later version. ++ ++ 15. Disclaimer of Warranty. ++ ++ THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY ++APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT ++HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY ++OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, ++THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR ++PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM ++IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ++ALL NECESSARY SERVICING, REPAIR OR CORRECTION. ++ ++ 16. Limitation of Liability. ++ ++ IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING ++WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS ++THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY ++GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE ++USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF ++DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD ++PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), ++EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF ++SUCH DAMAGES. ++ ++ 17. Interpretation of Sections 15 and 16. ++ ++ If the disclaimer of warranty and limitation of liability provided ++above cannot be given local legal effect according to their terms, ++reviewing courts shall apply local law that most closely approximates ++an absolute waiver of all civil liability in connection with the ++Program, unless a warranty or assumption of liability accompanies a ++copy of the Program in return for a fee. ++ ++ END OF TERMS AND CONDITIONS ++ ++ How to Apply These Terms to Your New Programs ++ ++ If you develop a new program, and you want it to be of the greatest ++possible use to the public, the best way to achieve this is to make it ++free software which everyone can redistribute and change under these terms. ++ ++ To do so, attach the following notices to the program. It is safest ++to attach them to the start of each source file to most effectively ++state the exclusion of warranty; and each file should have at least ++the "copyright" line and a pointer to where the full notice is found. ++ ++ ++ Copyright (C) ++ ++ This program is free software: you can redistribute it and/or modify ++ it under the terms of the GNU General Public License as published by ++ the Free Software Foundation, either version 3 of the License, or ++ (at your option) any later version. ++ ++ This program is distributed in the hope that it will be useful, ++ but WITHOUT ANY WARRANTY; without even the implied warranty of ++ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++ GNU General Public License for more details. ++ ++ You should have received a copy of the GNU General Public License ++ along with this program. If not, see . ++ ++Also add information on how to contact you by electronic and paper mail. ++ ++ If the program does terminal interaction, make it output a short ++notice like this when it starts in an interactive mode: ++ ++ Copyright (C) ++ This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. ++ This is free software, and you are welcome to redistribute it ++ under certain conditions; type `show c' for details. ++ ++The hypothetical commands `show w' and `show c' should show the appropriate ++parts of the General Public License. Of course, your program's commands ++might be different; for a GUI interface, you would use an "about box". ++ ++ You should also get your employer (if you work as a programmer) or school, ++if any, to sign a "copyright disclaimer" for the program, if necessary. ++For more information on this, and how to apply and follow the GNU GPL, see ++. ++ ++ The GNU General Public License does not permit incorporating your program ++into proprietary programs. If your program is a subroutine library, you ++may consider it more useful to permit linking proprietary applications with ++the library. If this is what you want to do, use the GNU Lesser General ++Public License instead of this License. But first, please read ++. +--- a/proxy/shadowsocksr/cipher/cipher.go ++++ b/proxy/shadowsocksr/cipher/cipher.go +@@ -0,0 +1,110 @@ ++// SPDX-License-Identifier: GPL-3.0-or-later ++// Adapted from MetaCubeX/mihomo v1.19.32. ++package cipher ++ ++import ( ++ "crypto/md5" ++ "errors" ++ "net" ++ "sort" ++ "strings" ++ ++ "github.com/xtls/xray-core/proxy/shadowsocksr/shadowstream" ++) ++ ++type Cipher interface { ++ StreamConnCipher ++ PacketConnCipher ++} ++ ++type StreamConnCipher interface { ++ StreamConn(net.Conn) net.Conn ++} ++ ++type PacketConnCipher interface { ++ PacketConn(net.PacketConn) net.PacketConn ++} ++ ++// ErrCipherNotSupported occurs when a cipher is not supported (likely because of security concerns). ++var ErrCipherNotSupported = errors.New("cipher not supported") ++ ++// List of stream ciphers: key size in bytes and constructor ++var streamList = map[string]struct { ++ KeySize int ++ New func(key []byte) (shadowstream.Cipher, error) ++}{ ++ "RC4-MD5": {16, shadowstream.RC4MD5}, ++ "AES-128-CTR": {16, shadowstream.AESCTR}, ++ "AES-192-CTR": {24, shadowstream.AESCTR}, ++ "AES-256-CTR": {32, shadowstream.AESCTR}, ++ "AES-128-CFB": {16, shadowstream.AESCFB}, ++ "AES-192-CFB": {24, shadowstream.AESCFB}, ++ "AES-256-CFB": {32, shadowstream.AESCFB}, ++ "CHACHA20": {32, shadowstream.ChaCha20}, ++ "CHACHA20-IETF": {32, shadowstream.Chacha20IETF}, ++ "XCHACHA20": {32, shadowstream.Xchacha20}, ++} ++ ++// ListCipher returns a list of available cipher names sorted alphabetically. ++func ListCipher() []string { ++ var l []string ++ for k := range streamList { ++ l = append(l, k) ++ } ++ sort.Strings(l) ++ return l ++} ++ ++// PickCipher returns a Cipher of the given name. Derive key from password if given key is empty. ++func PickCipher(name string, key []byte, password string) (Cipher, error) { ++ name = strings.ToUpper(name) ++ ++ if name == "DUMMY" || name == "NONE" { ++ return &dummy{}, nil ++ } ++ ++ if choice, ok := streamList[name]; ok { ++ if len(key) == 0 { ++ key = Kdf(password, choice.KeySize) ++ } ++ if len(key) != choice.KeySize { ++ return nil, shadowstream.KeySizeError(choice.KeySize) ++ } ++ ciph, err := choice.New(key) ++ return &StreamCipher{Cipher: ciph, Key: key}, err ++ } ++ ++ return nil, ErrCipherNotSupported ++} ++ ++type StreamCipher struct { ++ shadowstream.Cipher ++ ++ Key []byte ++} ++ ++func (ciph *StreamCipher) StreamConn(c net.Conn) net.Conn { return shadowstream.NewConn(c, ciph) } ++func (ciph *StreamCipher) PacketConn(c net.PacketConn) net.PacketConn { ++ return shadowstream.NewPacketConn(c, ciph) ++} ++ ++// dummy cipher does not encrypt ++ ++type dummy struct{} ++ ++func (dummy) StreamConn(c net.Conn) net.Conn { return c } ++func (dummy) PacketConn(c net.PacketConn) net.PacketConn { return c } ++ ++// key-derivation function from original Shadowsocks ++func Kdf(password string, keyLen int) []byte { ++ var b, prev []byte ++ h := md5.New() ++ for len(b) < keyLen { ++ h.Write(prev) ++ h.Write([]byte(password)) ++ b = h.Sum(b) ++ prev = b[len(b)-h.Size():] ++ h.Reset() ++ } ++ return b[:keyLen] ++} +--- a/proxy/shadowsocksr/client.go ++++ b/proxy/shadowsocksr/client.go +@@ -0,0 +1,136 @@ ++package shadowsocksr ++ ++import ( ++ "context" ++ "time" ++ ++ M "github.com/sagernet/sing/common/metadata" ++ "github.com/xtls/xray-core/common" ++ "github.com/xtls/xray-core/common/buf" ++ "github.com/xtls/xray-core/common/errors" ++ "github.com/xtls/xray-core/common/net" ++ "github.com/xtls/xray-core/common/session" ++ "github.com/xtls/xray-core/common/signal" ++ "github.com/xtls/xray-core/common/task" ++ "github.com/xtls/xray-core/core" ++ "github.com/xtls/xray-core/features/policy" ++ C "github.com/xtls/xray-core/proxy/shadowsocksr/cipher" ++ O "github.com/xtls/xray-core/proxy/shadowsocksr/obfs" ++ P "github.com/xtls/xray-core/proxy/shadowsocksr/protocol" ++ "github.com/xtls/xray-core/proxy/shadowsocksr/shadowstream" ++ "github.com/xtls/xray-core/transport" ++ "github.com/xtls/xray-core/transport/internet" ++) ++ ++type Client struct { ++ server net.Destination ++ policy policy.Session ++ cipher C.Cipher ++ obfs O.Obfs ++ protocol P.Protocol ++} ++ ++// Validate checks the same cipher, protocol and obfuscation registry used at runtime. ++func Validate(config *ClientConfig) error { _, err := newClient(config); return err } ++func newClient(config *ClientConfig) (*Client, error) { ++ if config.Address == nil || config.Port == 0 || config.Port > 65535 || config.Password == "" { ++ return nil, errors.New("shadowsocksr: invalid server or password") ++ } ++ cipher, err := C.PickCipher(config.Method, nil, config.Password) ++ if err != nil { ++ return nil, err ++ } ++ key := C.Kdf(config.Password, 16) ++ ivSize := 0 ++ if stream, ok := cipher.(*C.StreamCipher); ok { ++ key = stream.Key ++ ivSize = stream.IVSize() ++ } ++ obfs, overhead, err := O.PickObfs(config.Obfs, &O.Base{Host: config.Address.AsAddress().String(), Port: int(config.Port), Key: key, IVSize: ivSize, Param: config.ObfsParam}) ++ if err != nil { ++ return nil, err ++ } ++ protocol, err := P.PickProtocol(config.Protocol, &P.Base{Key: key, Overhead: overhead, Param: config.ProtocolParam}) ++ if err != nil { ++ return nil, err ++ } ++ return &Client{server: net.TCPDestination(config.Address.AsAddress(), net.Port(config.Port)), cipher: cipher, obfs: obfs, protocol: protocol}, nil ++} ++func NewClient(ctx context.Context, config *ClientConfig) (*Client, error) { ++ c, err := newClient(config) ++ if err != nil { ++ return nil, err ++ } ++ c.policy = core.MustFromContext(ctx).GetFeature(policy.ManagerType()).(policy.Manager).ForLevel(config.Level) ++ return c, nil ++} ++func (c *Client) Process(ctx context.Context, link *transport.Link, dialer internet.Dialer) error { ++ outbounds := session.OutboundsFromContext(ctx) ++ if len(outbounds) == 0 { ++ return errors.New("shadowsocksr: missing target") ++ } ++ ob := outbounds[len(outbounds)-1] ++ target := ob.Target ++ if !target.IsValid() || (target.Network != net.Network_TCP && target.Network != net.Network_UDP) { ++ return errors.New("shadowsocksr: unsupported target") ++ } ++ ob.Name = "shadowsocksr" ++ ob.CanSpliceCopy = 3 ++ server := c.server ++ server.Network = target.Network ++ conn, err := dialer.Dial(ctx, server) ++ if err != nil { ++ return err ++ } ++ defer conn.Close() ++ var reader buf.Reader ++ var writer buf.Writer ++ if target.Network == net.Network_TCP { ++ conn.SetDeadline(time.Now().Add(c.policy.Timeouts.Handshake)) ++ stream := c.cipher.StreamConn(c.obfs.StreamConn(conn)) ++ var iv []byte ++ if sc, ok := stream.(*shadowstream.Conn); ok { ++ iv, err = sc.ObtainWriteIV() ++ if err != nil { ++ return err ++ } ++ } ++ stream = c.protocol.StreamConn(stream, iv) ++ if err = M.SocksaddrSerializer.WriteAddrPort(stream, socksaddr(target)); err != nil { ++ return err ++ } ++ conn.SetDeadline(time.Time{}) ++ reader = buf.NewReader(stream) ++ writer = buf.NewWriter(stream) ++ } else { ++ pc := c.protocol.PacketConn(c.cipher.PacketConn(&connectedPacketConn{Conn: conn})) ++ reader = &packetReader{conn: pc} ++ writer = &packetWriter{conn: pc, server: conn.RemoteAddr(), destination: target} ++ } ++ ctx, cancel := context.WithCancel(ctx) ++ defer cancel() ++ timer := signal.CancelAfterInactivity(ctx, cancel, c.policy.Timeouts.ConnectionIdle) ++ defer timer.SetTimeout(0) ++ request := func() error { ++ defer timer.SetTimeout(c.policy.Timeouts.DownlinkOnly) ++ return buf.Copy(link.Reader, writer, buf.UpdateActivity(timer)) ++ } ++ response := func() error { ++ defer timer.SetTimeout(c.policy.Timeouts.UplinkOnly) ++ return buf.Copy(reader, link.Writer, buf.UpdateActivity(timer)) ++ } ++ if err = task.Run(ctx, request, task.OnSuccess(response, task.Close(link.Writer))); err != nil { ++ common.Interrupt(link.Reader) ++ common.Interrupt(link.Writer) ++ return errors.New("shadowsocksr: connection ends").Base(err) ++ } ++ return nil ++} ++func socksaddr(d net.Destination) M.Socksaddr { ++ return M.ParseSocksaddrHostPort(d.Address.String(), uint16(d.Port)) ++} ++func init() { ++ common.Must(common.RegisterConfig((*ClientConfig)(nil), func(ctx context.Context, config interface{}) (interface{}, error) { ++ return NewClient(ctx, config.(*ClientConfig)) ++ })) ++} +--- a/proxy/shadowsocksr/config.pb.go ++++ b/proxy/shadowsocksr/config.pb.go +@@ -0,0 +1,311 @@ ++// Code generated by protoc-gen-go. DO NOT EDIT. ++// versions: ++// protoc-gen-go v1.36.12 ++// protoc v3.21.12 ++// source: proxy/shadowsocksr/config.proto ++ ++package shadowsocksr ++ ++import ( ++ net "github.com/xtls/xray-core/common/net" ++ protoreflect "google.golang.org/protobuf/reflect/protoreflect" ++ protoimpl "google.golang.org/protobuf/runtime/protoimpl" ++ reflect "reflect" ++ sync "sync" ++ unsafe "unsafe" ++) ++ ++const ( ++ // Verify that this generated code is sufficiently up-to-date. ++ _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) ++ // Verify that runtime/protoimpl is sufficiently up-to-date. ++ _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) ++) ++ ++type ClientConfig struct { ++ state protoimpl.MessageState `protogen:"open.v1"` ++ Address *net.IPOrDomain `protobuf:"bytes,1,opt,name=address,proto3" json:"address,omitempty"` ++ Port uint32 `protobuf:"varint,2,opt,name=port,proto3" json:"port,omitempty"` ++ Password string `protobuf:"bytes,3,opt,name=password,proto3" json:"password,omitempty"` ++ Level uint32 `protobuf:"varint,4,opt,name=level,proto3" json:"level,omitempty"` ++ Method string `protobuf:"bytes,5,opt,name=method,proto3" json:"method,omitempty"` ++ Protocol string `protobuf:"bytes,6,opt,name=protocol,proto3" json:"protocol,omitempty"` ++ ProtocolParam string `protobuf:"bytes,7,opt,name=protocol_param,json=protocolParam,proto3" json:"protocol_param,omitempty"` ++ Obfs string `protobuf:"bytes,8,opt,name=obfs,proto3" json:"obfs,omitempty"` ++ ObfsParam string `protobuf:"bytes,9,opt,name=obfs_param,json=obfsParam,proto3" json:"obfs_param,omitempty"` ++ unknownFields protoimpl.UnknownFields ++ sizeCache protoimpl.SizeCache ++} ++ ++func (x *ClientConfig) Reset() { ++ *x = ClientConfig{} ++ mi := &file_proxy_shadowsocksr_config_proto_msgTypes[0] ++ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ++ ms.StoreMessageInfo(mi) ++} ++ ++func (x *ClientConfig) String() string { ++ return protoimpl.X.MessageStringOf(x) ++} ++ ++func (*ClientConfig) ProtoMessage() {} ++ ++func (x *ClientConfig) ProtoReflect() protoreflect.Message { ++ mi := &file_proxy_shadowsocksr_config_proto_msgTypes[0] ++ if x != nil { ++ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ++ if ms.LoadMessageInfo() == nil { ++ ms.StoreMessageInfo(mi) ++ } ++ return ms ++ } ++ return mi.MessageOf(x) ++} ++ ++// Deprecated: Use ClientConfig.ProtoReflect.Descriptor instead. ++func (*ClientConfig) Descriptor() ([]byte, []int) { ++ return file_proxy_shadowsocksr_config_proto_rawDescGZIP(), []int{0} ++} ++ ++func (x *ClientConfig) GetAddress() *net.IPOrDomain { ++ if x != nil { ++ return x.Address ++ } ++ return nil ++} ++ ++func (x *ClientConfig) GetPort() uint32 { ++ if x != nil { ++ return x.Port ++ } ++ return 0 ++} ++ ++func (x *ClientConfig) GetPassword() string { ++ if x != nil { ++ return x.Password ++ } ++ return "" ++} ++ ++func (x *ClientConfig) GetLevel() uint32 { ++ if x != nil { ++ return x.Level ++ } ++ return 0 ++} ++ ++func (x *ClientConfig) GetMethod() string { ++ if x != nil { ++ return x.Method ++ } ++ return "" ++} ++ ++func (x *ClientConfig) GetProtocol() string { ++ if x != nil { ++ return x.Protocol ++ } ++ return "" ++} ++ ++func (x *ClientConfig) GetProtocolParam() string { ++ if x != nil { ++ return x.ProtocolParam ++ } ++ return "" ++} ++ ++func (x *ClientConfig) GetObfs() string { ++ if x != nil { ++ return x.Obfs ++ } ++ return "" ++} ++ ++func (x *ClientConfig) GetObfsParam() string { ++ if x != nil { ++ return x.ObfsParam ++ } ++ return "" ++} ++ ++type ServerConfig struct { ++ state protoimpl.MessageState `protogen:"open.v1"` ++ Password string `protobuf:"bytes,1,opt,name=password,proto3" json:"password,omitempty"` ++ Level uint32 `protobuf:"varint,2,opt,name=level,proto3" json:"level,omitempty"` ++ Method string `protobuf:"bytes,3,opt,name=method,proto3" json:"method,omitempty"` ++ Protocol string `protobuf:"bytes,4,opt,name=protocol,proto3" json:"protocol,omitempty"` ++ ProtocolParam string `protobuf:"bytes,5,opt,name=protocol_param,json=protocolParam,proto3" json:"protocol_param,omitempty"` ++ Obfs string `protobuf:"bytes,6,opt,name=obfs,proto3" json:"obfs,omitempty"` ++ ObfsParam string `protobuf:"bytes,7,opt,name=obfs_param,json=obfsParam,proto3" json:"obfs_param,omitempty"` ++ Network []net.Network `protobuf:"varint,8,rep,packed,name=network,proto3,enum=xray.common.net.Network" json:"network,omitempty"` ++ unknownFields protoimpl.UnknownFields ++ sizeCache protoimpl.SizeCache ++} ++ ++func (x *ServerConfig) Reset() { ++ *x = ServerConfig{} ++ mi := &file_proxy_shadowsocksr_config_proto_msgTypes[1] ++ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ++ ms.StoreMessageInfo(mi) ++} ++ ++func (x *ServerConfig) String() string { ++ return protoimpl.X.MessageStringOf(x) ++} ++ ++func (*ServerConfig) ProtoMessage() {} ++ ++func (x *ServerConfig) ProtoReflect() protoreflect.Message { ++ mi := &file_proxy_shadowsocksr_config_proto_msgTypes[1] ++ if x != nil { ++ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ++ if ms.LoadMessageInfo() == nil { ++ ms.StoreMessageInfo(mi) ++ } ++ return ms ++ } ++ return mi.MessageOf(x) ++} ++ ++// Deprecated: Use ServerConfig.ProtoReflect.Descriptor instead. ++func (*ServerConfig) Descriptor() ([]byte, []int) { ++ return file_proxy_shadowsocksr_config_proto_rawDescGZIP(), []int{1} ++} ++ ++func (x *ServerConfig) GetPassword() string { ++ if x != nil { ++ return x.Password ++ } ++ return "" ++} ++ ++func (x *ServerConfig) GetLevel() uint32 { ++ if x != nil { ++ return x.Level ++ } ++ return 0 ++} ++ ++func (x *ServerConfig) GetMethod() string { ++ if x != nil { ++ return x.Method ++ } ++ return "" ++} ++ ++func (x *ServerConfig) GetProtocol() string { ++ if x != nil { ++ return x.Protocol ++ } ++ return "" ++} ++ ++func (x *ServerConfig) GetProtocolParam() string { ++ if x != nil { ++ return x.ProtocolParam ++ } ++ return "" ++} ++ ++func (x *ServerConfig) GetObfs() string { ++ if x != nil { ++ return x.Obfs ++ } ++ return "" ++} ++ ++func (x *ServerConfig) GetObfsParam() string { ++ if x != nil { ++ return x.ObfsParam ++ } ++ return "" ++} ++ ++func (x *ServerConfig) GetNetwork() []net.Network { ++ if x != nil { ++ return x.Network ++ } ++ return nil ++} ++ ++var File_proxy_shadowsocksr_config_proto protoreflect.FileDescriptor ++ ++const file_proxy_shadowsocksr_config_proto_rawDesc = "" + ++ "\n" + ++ "\x1fproxy/shadowsocksr/config.proto\x12\x17xray.proxy.shadowsocksr\x1a\x18common/net/address.proto\x1a\x18common/net/network.proto\"\x99\x02\n" + ++ "\fClientConfig\x125\n" + ++ "\aaddress\x18\x01 \x01(\v2\x1b.xray.common.net.IPOrDomainR\aaddress\x12\x12\n" + ++ "\x04port\x18\x02 \x01(\rR\x04port\x12\x1a\n" + ++ "\bpassword\x18\x03 \x01(\tR\bpassword\x12\x14\n" + ++ "\x05level\x18\x04 \x01(\rR\x05level\x12\x16\n" + ++ "\x06method\x18\x05 \x01(\tR\x06method\x12\x1a\n" + ++ "\bprotocol\x18\x06 \x01(\tR\bprotocol\x12%\n" + ++ "\x0eprotocol_param\x18\a \x01(\tR\rprotocolParam\x12\x12\n" + ++ "\x04obfs\x18\b \x01(\tR\x04obfs\x12\x1d\n" + ++ "\n" + ++ "obfs_param\x18\t \x01(\tR\tobfsParam\"\x82\x02\n" + ++ "\fServerConfig\x12\x1a\n" + ++ "\bpassword\x18\x01 \x01(\tR\bpassword\x12\x14\n" + ++ "\x05level\x18\x02 \x01(\rR\x05level\x12\x16\n" + ++ "\x06method\x18\x03 \x01(\tR\x06method\x12\x1a\n" + ++ "\bprotocol\x18\x04 \x01(\tR\bprotocol\x12%\n" + ++ "\x0eprotocol_param\x18\x05 \x01(\tR\rprotocolParam\x12\x12\n" + ++ "\x04obfs\x18\x06 \x01(\tR\x04obfs\x12\x1d\n" + ++ "\n" + ++ "obfs_param\x18\a \x01(\tR\tobfsParam\x122\n" + ++ "\anetwork\x18\b \x03(\x0e2\x18.xray.common.net.NetworkR\anetworkB.Z,github.com/xtls/xray-core/proxy/shadowsocksrb\x06proto3" ++ ++var ( ++ file_proxy_shadowsocksr_config_proto_rawDescOnce sync.Once ++ file_proxy_shadowsocksr_config_proto_rawDescData []byte ++) ++ ++func file_proxy_shadowsocksr_config_proto_rawDescGZIP() []byte { ++ file_proxy_shadowsocksr_config_proto_rawDescOnce.Do(func() { ++ file_proxy_shadowsocksr_config_proto_rawDescData = protoimpl.X.CompressGZIP(unsafe.Slice(unsafe.StringData(file_proxy_shadowsocksr_config_proto_rawDesc), len(file_proxy_shadowsocksr_config_proto_rawDesc))) ++ }) ++ return file_proxy_shadowsocksr_config_proto_rawDescData ++} ++ ++var file_proxy_shadowsocksr_config_proto_msgTypes = make([]protoimpl.MessageInfo, 2) ++var file_proxy_shadowsocksr_config_proto_goTypes = []any{ ++ (*ClientConfig)(nil), // 0: xray.proxy.shadowsocksr.ClientConfig ++ (*ServerConfig)(nil), // 1: xray.proxy.shadowsocksr.ServerConfig ++ (*net.IPOrDomain)(nil), // 2: xray.common.net.IPOrDomain ++ (net.Network)(0), // 3: xray.common.net.Network ++} ++var file_proxy_shadowsocksr_config_proto_depIdxs = []int32{ ++ 2, // 0: xray.proxy.shadowsocksr.ClientConfig.address:type_name -> xray.common.net.IPOrDomain ++ 3, // 1: xray.proxy.shadowsocksr.ServerConfig.network:type_name -> xray.common.net.Network ++ 2, // [2:2] is the sub-list for method output_type ++ 2, // [2:2] is the sub-list for method input_type ++ 2, // [2:2] is the sub-list for extension type_name ++ 2, // [2:2] is the sub-list for extension extendee ++ 0, // [0:2] is the sub-list for field type_name ++} ++ ++func init() { file_proxy_shadowsocksr_config_proto_init() } ++func file_proxy_shadowsocksr_config_proto_init() { ++ if File_proxy_shadowsocksr_config_proto != nil { ++ return ++ } ++ type x struct{} ++ out := protoimpl.TypeBuilder{ ++ File: protoimpl.DescBuilder{ ++ GoPackagePath: reflect.TypeOf(x{}).PkgPath(), ++ RawDescriptor: unsafe.Slice(unsafe.StringData(file_proxy_shadowsocksr_config_proto_rawDesc), len(file_proxy_shadowsocksr_config_proto_rawDesc)), ++ NumEnums: 0, ++ NumMessages: 2, ++ NumExtensions: 0, ++ NumServices: 0, ++ }, ++ GoTypes: file_proxy_shadowsocksr_config_proto_goTypes, ++ DependencyIndexes: file_proxy_shadowsocksr_config_proto_depIdxs, ++ MessageInfos: file_proxy_shadowsocksr_config_proto_msgTypes, ++ }.Build() ++ File_proxy_shadowsocksr_config_proto = out.File ++ file_proxy_shadowsocksr_config_proto_goTypes = nil ++ file_proxy_shadowsocksr_config_proto_depIdxs = nil ++} +--- a/proxy/shadowsocksr/config.proto ++++ b/proxy/shadowsocksr/config.proto +@@ -0,0 +1,26 @@ ++syntax = "proto3"; ++package xray.proxy.shadowsocksr; ++option go_package = "github.com/xtls/xray-core/proxy/shadowsocksr"; ++import "common/net/address.proto"; ++import "common/net/network.proto"; ++message ClientConfig { ++ xray.common.net.IPOrDomain address = 1; ++ uint32 port = 2; ++ string password = 3; ++ uint32 level = 4; ++ string method = 5; ++ string protocol = 6; ++ string protocol_param = 7; ++ string obfs = 8; ++ string obfs_param = 9; ++} ++message ServerConfig { ++ string password = 1; ++ uint32 level = 2; ++ string method = 3; ++ string protocol = 4; ++ string protocol_param = 5; ++ string obfs = 6; ++ string obfs_param = 7; ++ repeated xray.common.net.Network network = 8; ++} +--- a/proxy/shadowsocksr/obfs/base.go ++++ b/proxy/shadowsocksr/obfs/base.go +@@ -0,0 +1,11 @@ ++// SPDX-License-Identifier: GPL-3.0-or-later ++// Adapted from MetaCubeX/mihomo v1.19.32. ++package obfs ++ ++type Base struct { ++ Host string ++ Port int ++ Key []byte ++ IVSize int ++ Param string ++} +--- a/proxy/shadowsocksr/obfs/http_post.go ++++ b/proxy/shadowsocksr/obfs/http_post.go +@@ -0,0 +1,11 @@ ++// SPDX-License-Identifier: GPL-3.0-or-later ++// Adapted from MetaCubeX/mihomo v1.19.32. ++package obfs ++ ++func init() { ++ register("http_post", newHTTPPost, 0) ++} ++ ++func newHTTPPost(b *Base) Obfs { ++ return &httpObfs{Base: b, post: true} ++} +--- a/proxy/shadowsocksr/obfs/http_simple.go ++++ b/proxy/shadowsocksr/obfs/http_simple.go +@@ -0,0 +1,416 @@ ++// SPDX-License-Identifier: GPL-3.0-or-later ++// Adapted from MetaCubeX/mihomo v1.19.32. ++package obfs ++ ++import ( ++ "bufio" ++ "bytes" ++ "encoding/hex" ++ "fmt" ++ "io" ++ randv2 "math/rand/v2" ++ "net" ++ "strconv" ++ "strings" ++ ++ "github.com/xtls/xray-core/proxy/shadowsocksr/pool" ++) ++ ++func init() { ++ register("http_simple", newHTTPSimple, 0) ++} ++ ++type httpObfs struct { ++ *Base ++ post bool ++} ++ ++func newHTTPSimple(b *Base) Obfs { ++ return &httpObfs{Base: b} ++} ++ ++type httpConn struct { ++ net.Conn ++ *httpObfs ++ hasSentHeader bool ++ hasRecvHeader bool ++ buf []byte ++} ++ ++func (h *httpObfs) StreamConn(c net.Conn) net.Conn { ++ return &httpConn{Conn: c, httpObfs: h} ++} ++ ++func (c *httpConn) Read(b []byte) (int, error) { ++ if c.buf != nil { ++ n := copy(b, c.buf) ++ if n == len(c.buf) { ++ c.buf = nil ++ } else { ++ c.buf = c.buf[n:] ++ } ++ return n, nil ++ } ++ ++ if c.hasRecvHeader { ++ return c.Conn.Read(b) ++ } ++ ++ // TCP may fragment the HTTP camouflage header across arbitrary reads. ++ r := bufio.NewReader(c.Conn) ++ total := 0 ++ for { ++ line, err := r.ReadSlice('\n') ++ total += len(line) ++ if total > 32768 { ++ return 0, fmt.Errorf("SSR HTTP header too large") ++ } ++ if err != nil { ++ return 0, err ++ } ++ if bytes.Equal(line, []byte("\r\n")) { ++ break ++ } ++ } ++ c.hasRecvHeader = true ++ if n := r.Buffered(); n > 0 { ++ c.buf = make([]byte, n) ++ if _, err := io.ReadFull(r, c.buf); err != nil { ++ return 0, err ++ } ++ } ++ return c.Read(b) ++} ++ ++func (c *httpConn) Write(b []byte) (int, error) { ++ if c.hasSentHeader { ++ return c.Conn.Write(b) ++ } ++ // 30: head length ++ headLength := c.IVSize + 30 ++ ++ bLength := len(b) ++ headDataLength := bLength ++ if bLength-headLength > 64 { ++ headDataLength = headLength + randv2.IntN(65) ++ } ++ headData := b[:headDataLength] ++ b = b[headDataLength:] ++ ++ var body string ++ host := c.Host ++ if len(c.Param) > 0 { ++ pos := strings.Index(c.Param, "#") ++ if pos != -1 { ++ body = strings.ReplaceAll(c.Param[pos+1:], "\n", "\r\n") ++ body = strings.ReplaceAll(body, "\\n", "\r\n") ++ host = c.Param[:pos] ++ } else { ++ host = c.Param ++ } ++ } ++ hosts := strings.Split(host, ",") ++ host = hosts[randv2.IntN(len(hosts))] ++ ++ buf := pool.GetBuffer() ++ defer pool.PutBuffer(buf) ++ if c.post { ++ buf.WriteString("POST /") ++ } else { ++ buf.WriteString("GET /") ++ } ++ packURLEncodedHeadData(buf, headData) ++ buf.WriteString(" HTTP/1.1\r\nHost: " + host) ++ if c.Port != 80 { ++ buf.WriteString(":" + strconv.Itoa(c.Port)) ++ } ++ buf.WriteString("\r\n") ++ if len(body) > 0 { ++ buf.WriteString(body + "\r\n\r\n") ++ } else { ++ buf.WriteString("User-Agent: ") ++ buf.WriteString(userAgent[randv2.IntN(len(userAgent))]) ++ buf.WriteString("\r\nAccept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8\r\nAccept-Language: en-US,en;q=0.8\r\nAccept-Encoding: gzip, deflate\r\n") ++ if c.post { ++ packBoundary(buf) ++ } ++ buf.WriteString("DNT: 1\r\nConnection: keep-alive\r\n\r\n") ++ } ++ buf.Write(b) ++ _, err := c.Conn.Write(buf.Bytes()) ++ if err != nil { ++ return 0, err ++ } ++ c.hasSentHeader = true ++ return bLength, nil ++} ++ ++func packURLEncodedHeadData(buf *bytes.Buffer, data []byte) { ++ dataLength := len(data) ++ for i := 0; i < dataLength; i++ { ++ buf.WriteRune('%') ++ buf.WriteString(hex.EncodeToString(data[i : i+1])) ++ } ++} ++ ++func packBoundary(buf *bytes.Buffer) { ++ buf.WriteString("Content-Type: multipart/form-data; boundary=") ++ set := "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789" ++ for i := 0; i < 32; i++ { ++ buf.WriteByte(set[randv2.IntN(62)]) ++ } ++ buf.WriteString("\r\n") ++} ++ ++var userAgent = []string{ ++ "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.162 Safari/537.36", ++ "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.85 Safari/537.36", ++ "Mozilla/5.0 (Linux; Android 7.0; Moto C Build/NRD90M.059) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Mobile Safari/537.36", ++ "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36", ++ "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.102 Safari/537.36", ++ "Mozilla/5.0 (Linux; Android 6.0.1; SM-G532M Build/MMB29T; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/55.0.2883.91 Mobile Safari/537.36", ++ "Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/46.0.2490.80 Safari/537.36", ++ "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2272.101 Safari/537.36", ++ "Mozilla/5.0 (Windows NT 6.2; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.102 Safari/537.36", ++ "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/40.0.2214.111 Safari/537.36", ++ "Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.94 Safari/537.36", ++ "Mozilla/5.0 (Linux; Android 5.1.1; SM-J120M Build/LMY47X) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Mobile Safari/537.36", ++ "Mozilla/5.0 (Windows NT 6.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/46.0.2490.80 Safari/537.36", ++ "Mozilla/5.0 (Linux; Android 7.0; Moto G (5) Build/NPPS25.137-93-14) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Mobile Safari/537.36", ++ "Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.106 Safari/537.36", ++ "Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.181 Safari/537.36", ++ "Mozilla/5.0 (Linux; Android 7.0; SM-G570M) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.80 Mobile Safari/537.36", ++ "Mozilla/5.0 (Windows NT 5.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/46.0.2490.80 Safari/537.36", ++ "Mozilla/5.0 (Windows NT 10.0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.102 Safari/537.36", ++ "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/49.0.2623.112 Safari/537.36", ++ "Mozilla/5.0 (Linux; Android 6.0; CAM-L03 Build/HUAWEICAM-L03) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Mobile Safari/537.36", ++ "Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2272.76 Safari/537.36", ++ "Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.117 Safari/537.36", ++ "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/534.3 (KHTML, like Gecko) Chrome/6.0.472.63 Safari/534.3", ++ "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36", ++ "Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.102 Safari/537.36", ++ "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/47.0.2526.106 Safari/537.36", ++ "Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/534.7 (KHTML, like Gecko) Chrome/7.0.517.44 Safari/534.7", ++ "Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.116 Safari/537.36", ++ "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.75 Safari/537.36", ++ "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.71 Safari/537.36", ++ "Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/534.3 (KHTML, like Gecko) Chrome/6.0.472.63 Safari/534.3", ++ "Mozilla/5.0 (Linux; Android 8.0.0; FIG-LX3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.80 Mobile Safari/537.36", ++ "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/40.0.2214.115 Safari/537.36", ++ "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.116 Safari/537.36", ++ "Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/534.10 (KHTML, like Gecko) Chrome/8.0.552.237 Safari/534.10", ++ "Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.90 Safari/537.36", ++ "Mozilla/5.0 (X11; U; Linux x86_64; en-US) AppleWebKit/533.2 (KHTML, like Gecko) Chrome/5.0.342.1 Safari/533.2", ++ "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.102 Safari/537.36", ++ "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/49.0.2623.110 Safari/537.36", ++ "Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.89 Safari/537.36", ++ "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.81 Safari/537.36", ++ "Mozilla/5.0 (X11; Datanyze; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.181 Safari/537.36", ++ "Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36", ++ "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.71 Safari/537.36", ++ "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/35.0.1916.153 Safari/537.36", ++ "Mozilla/5.0 (Linux; Android 5.1.1; SM-J111M Build/LMY47V) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Mobile Safari/537.36", ++ "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/57.0.2987.133 Safari/537.36", ++ "Mozilla/5.0 (Windows NT 6.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.106 Safari/537.36", ++ "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.181 Safari/537.36", ++ "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/37.0.2062.120 Safari/537.36", ++ "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36", ++ "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.84 Safari/537.36", ++ "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.99 Safari/537.36", ++ "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/32.0.1700.107 Safari/537.36", ++ "Mozilla/5.0 (Windows NT 10.0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36", ++ "Mozilla/5.0 (Linux; Android 6.0.1; SM-J700M Build/MMB29K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Mobile Safari/537.36", ++ "Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.63 Safari/537.36", ++ "Mozilla/5.0 (X11; Linux i686) AppleWebKit/534.30 (KHTML, like Gecko) Slackware/Chrome/12.0.742.100 Safari/534.30", ++ "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36", ++ "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/46.0.2490.86 Safari/537.36", ++ "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.167 Safari/537.36", ++ "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/48.0.2564.116 Safari/537.36", ++ "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/50.0.2661.102 Safari/537.36", ++ "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.143 Safari/537.36", ++ "Mozilla/5.0 (X11; Linux i686) AppleWebKit/534.30 (KHTML, like Gecko) Chrome/12.0.742.100 Safari/534.30", ++ "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36", ++ "Mozilla/5.0 (Linux; Android 8.0.0; WAS-LX3 Build/HUAWEIWAS-LX3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Mobile Safari/537.36", ++ "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.99 Safari/537.36", ++ "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/57.0.2987.133 Safari/537.36", ++ "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/49.0.2623.87 Safari/537.36", ++ "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/50.0.2661.102 Safari/537.36", ++ "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/31.0.1650.57 Safari/537.36", ++ "Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.99 Safari/537.36", ++ "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.101 Safari/537.36", ++ "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.1805 Safari/537.36 MVisionPlayer/1.0.0.0", ++ "Mozilla/5.0 (Linux; Android 7.0; TRT-LX3 Build/HUAWEITRT-LX3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Mobile Safari/537.36", ++ "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2272.89 Safari/537.36", ++ "Mozilla/5.0 (Linux; Android 6.0; vivo 1610 Build/MMB29M) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.124 Mobile Safari/537.36", ++ "Mozilla/5.0 (Windows NT 6.2; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36", ++ "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36", ++ "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36", ++ "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/57.0.2987.133 Safari/537.36", ++ "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/47.0.2526.111 Safari/537.36", ++ "Mozilla/5.0 (Linux; Android 4.4.2; de-de; SAMSUNG GT-I9195 Build/KOT49H) AppleWebKit/537.36 (KHTML, like Gecko) Version/1.5 Chrome/28.0.1500.94 Mobile Safari/537.36", ++ "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.110 Safari/537.36", ++ "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.95 Safari/537.36", ++ "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/42.0.2311.90 Safari/537.36", ++ "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/49.0.2623.110 Safari/537.36", ++ "Mozilla/5.0 (Linux; Android 8.0.0; ANE-LX3 Build/HUAWEIANE-LX3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Mobile Safari/537.36", ++ "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/49.0.2623.112 Safari/537.36", ++ "Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36", ++ "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/49.0.2623.87 Safari/537.36", ++ "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.143 Safari/537.36", ++ "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36", ++ "Mozilla/5.0 (X11; U; Linux i586; en-US) AppleWebKit/533.2 (KHTML, like Gecko) Chrome/5.0.342.1 Safari/533.2", ++ "Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/43.0.2357.65 Safari/537.36", ++ "Mozilla/5.0 (Linux; Android 7.0; SM-G610M) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.80 Mobile Safari/537.36", ++ "Mozilla/5.0 (Linux; Android 6.0.1; SM-J500M Build/MMB29M) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Mobile Safari/537.36", ++ "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/534.7 (KHTML, like Gecko) Chrome/7.0.517.44 Safari/534.7", ++ "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2272.104 Safari/537.36", ++ "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.115 Safari/537.36", ++ "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36", ++ "Mozilla/5.0 (Linux; Android 6.0; vivo 1606 Build/MMB29M) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.124 Mobile Safari/537.36", ++ "Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36", ++ "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/42.0.2311.135 Safari/537.36", ++ "Mozilla/5.0 (Linux; Android 7.0; SM-G610M Build/NRD90M) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Mobile Safari/537.36", ++ "Mozilla/5.0 (Linux; Android 7.1; vivo 1716 Build/N2G47H) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/61.0.3163.98 Mobile Safari/537.36", ++ "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36", ++ "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36", ++ "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.93 Safari/537.36", ++ "Mozilla/5.0 (Linux; Android 7.0; SM-G570M Build/NRD90M) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Mobile Safari/537.36", ++ "Mozilla/5.0 (Windows NT 6.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.90 Safari/537.36", ++ "Mozilla/5.0 (Linux; Android 6.0; MYA-L22 Build/HUAWEIMYA-L22) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.84 Mobile Safari/537.36", ++ "Mozilla/5.0 (Linux; Android 5.1; A1601 Build/LMY47I) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.98 Mobile Safari/537.36", ++ "Mozilla/5.0 (Linux; Android 7.0; TRT-LX2 Build/HUAWEITRT-LX2; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/59.0.3071.125 Mobile Safari/537.36", ++ "Mozilla/5.0 (Windows NT 6.2; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36", ++ "Mozilla/5.0 (Windows NT 6.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36", ++ "Mozilla/5.0 (Windows NT 5.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36", ++ "Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.102 Safari/537.36", ++ "Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/534.17 (KHTML, like Gecko) Chrome/10.0.649.0 Safari/534.17", ++ "Mozilla/5.0 (Linux; Android 6.0; CAM-L21 Build/HUAWEICAM-L21; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/62.0.3202.84 Mobile Safari/537.36", ++ "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.94 Safari/537.36", ++ "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/534.24 (KHTML, like Gecko) Chrome/11.0.696.3 Safari/534.24", ++ "Mozilla/5.0 (Linux; Android 7.1.2; Redmi 4X Build/N2G47H) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.111 Mobile Safari/537.36", ++ "Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.106 Safari/537.36", ++ "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.181 Safari/537.36", ++ "Mozilla/5.0 (Linux; Android 4.4.2; SM-G7102 Build/KOT49H) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.84 Mobile Safari/537.36", ++ "Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/48.0.2564.109 Safari/537.36", ++ "Mozilla/5.0 (Linux; Android 5.1; HUAWEI CUN-L22 Build/HUAWEICUN-L22; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/62.0.3202.84 Mobile Safari/537.36", ++ "Mozilla/5.0 (Linux; Android 5.1.1; A37fw Build/LMY47V) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.84 Mobile Safari/537.36", ++ "Mozilla/5.0 (Linux; Android 7.0; SM-J730GM Build/NRD90M) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.111 Mobile Safari/537.36", ++ "Mozilla/5.0 (Linux; Android 7.0; SM-G610F Build/NRD90M) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.111 Mobile Safari/537.36", ++ "Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2272.101 Safari/537.36", ++ "Mozilla/5.0 (Linux; Android 7.1.2; Redmi Note 5A Build/N2G47H; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/63.0.3239.111 Mobile Safari/537.36", ++ "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.77 Safari/537.36", ++ "Mozilla/5.0 (Linux; Android 7.0; Redmi Note 4 Build/NRD90M) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.111 Mobile Safari/537.36", ++ "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/47.0.2526.106 Safari/537.36", ++ "Mozilla/5.0 (Unknown; Linux) AppleWebKit/538.1 (KHTML, like Gecko) Chrome/v1.0.0 Safari/538.1", ++ "Mozilla/5.0 (Linux; Android 7.0; BLL-L22 Build/HUAWEIBLL-L22) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.91 Mobile Safari/537.36", ++ "Mozilla/5.0 (Linux; Android 7.0; SM-J710F Build/NRD90M) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.84 Mobile Safari/537.36", ++ "Mozilla/5.0 (Linux; Android 6.0.1; SM-G532M Build/MMB29T) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.91 Mobile Safari/537.36", ++ "Mozilla/5.0 (Linux; Android 7.1.1; CPH1723 Build/N6F26Q) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/61.0.3163.98 Mobile Safari/537.36", ++ "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2272.118 Safari/537.36", ++ "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/61.0.3163.79 Safari/537.36", ++ "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.101 Safari/537.36", ++ "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/50.0.2661.94 Safari/537.36", ++ "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.139 Safari/537.36", ++ "Mozilla/5.0 (Linux; Android 8.0.0; FIG-LX3 Build/HUAWEIFIG-LX3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Mobile Safari/537.36", ++ "Mozilla/5.0 (Windows; U; Windows NT 6.1; de-DE) AppleWebKit/534.17 (KHTML, like Gecko) Chrome/10.0.649.0 Safari/534.17", ++ "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.116 Safari/537.36", ++ "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.63 Safari/537.36", ++ "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2228.0 Safari/537.36", ++ "Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.67 Safari/537.36", ++ "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.94 Safari/537.36", ++ "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.110 Safari/537.36", ++ "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.99 Safari/537.36", ++ "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.99 Safari/537.36", ++ "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.67 Safari/537.36", ++ "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36", ++ "Mozilla/5.0 (Windows NT 10.0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.67 Safari/537.36", ++ "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.77 Safari/537.36", ++ "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.67 Safari/537.36", ++ "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/43.0.2357.65 Safari/537.36", ++ "Mozilla/5.0 (Linux; Android 7.1; Mi A1 Build/N2G47H) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.83 Mobile Safari/537.36", ++ "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.117 Safari/537.36", ++ "Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/57.0.2987.133 Safari/537.36", ++ "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.181 Safari/537.36", ++ "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/533.4 (KHTML, like Gecko) Chrome/5.0.375.99 Safari/533.4", ++ "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/36.0.1985.125 Safari/537.36", ++ "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.89 Safari/537.36", ++ "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/47.0.2526.111 Safari/537.36 MVisionPlayer/1.0.0.0", ++ "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.103 Safari/537.36", ++ "Mozilla/5.0 (Linux; Android 5.1; A37f Build/LMY47V) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/43.0.2357.93 Mobile Safari/537.36", ++ "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36", ++ "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36", ++ "Mozilla/5.0 (Windows NT 6.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/57.0.2987.133 Safari/537.36", ++ "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.113 Safari/537.36", ++ "Mozilla/5.0 (Windows NT 6.2; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/57.0.2987.133 Safari/537.36", ++ "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/61.0.3163.100 Safari/537.36", ++ "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/46.0.2490.86 Safari/537.36", ++ "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.110 Safari/537.36", ++ "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2272.76 Safari/537.36", ++ "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36", ++ "Mozilla/5.0 (Windows NT 5.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/57.0.2987.133 Safari/537.36", ++ "Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.77 Safari/537.36", ++ "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.102 Safari/537.36", ++ "Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/46.0.2490.80 Safari/537.36", ++ "Mozilla/5.0 (Linux; Android 6.0.1; CPH1607 Build/MMB29M; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/63.0.3239.111 Mobile Safari/537.36", ++ "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.99 Safari/537.36", ++ "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.95 Safari/537.36", ++ "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/61.0.3163.100 Safari/537.36", ++ "Mozilla/5.0 (Linux; Android 6.0.1; vivo 1603 Build/MMB29M) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.83 Mobile Safari/537.36", ++ "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.186 Safari/537.36", ++ "Mozilla/5.0 (Linux; Android 6.0.1; SM-G532M Build/MMB29T) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Mobile Safari/537.36", ++ "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36", ++ "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36", ++ "Mozilla/5.0 (Linux; Android 6.0.1; Redmi 4A Build/MMB29M; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/60.0.3112.116 Mobile Safari/537.36", ++ "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.103 Safari/537.36", ++ "Mozilla/5.0 (Windows NT 6.0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/49.0.2623.112 Safari/537.36", ++ "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.113 Safari/537.36", ++ "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.90 Safari/537.36", ++ "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/44.0.2403.157 Safari/537.36", ++ "Mozilla/5.0 (Windows NT 5.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/46.0.2490.71 Safari/537.36", ++ "Mozilla/5.0 (Windows NT 5.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.90 Safari/537.36", ++ "Mozilla/5.0 (Windows NT 6.2; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.90 Safari/537.36", ++ "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36", ++ "Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.113 Safari/537.36", ++ "Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/42.0.2311.90 Safari/537.36", ++ "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36", ++ "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/57.0.2987.133 Safari/537.36", ++ "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.90 Safari/537.36", ++ "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.77 Safari/537.36", ++ "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36", ++ "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.99 Safari/537.36", ++ "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/61.0.3163.100 Safari/537.36", ++ "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.77 Safari/537.36", ++ "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.102 Safari/537.36", ++ "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.31 (KHTML, like Gecko) Chrome/26.0.1410.64 Safari/537.31", ++ "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.84 Safari/537.36", ++ "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36", ++ "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/57.0.2987.133 Safari/537.36", ++ "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.186 Safari/537.36", ++ "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.115 Safari/537.36", ++ "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36", ++ "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36", ++ "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36", ++ "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/46.0.2490.80 Safari/537.36", ++ "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/36.0.1985.143 Safari/537.36", ++ "Mozilla/5.0 (Windows NT 5.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/49.0.2623.112 Safari/537.36", ++ "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.67 Safari/537.36", ++ "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.181 Safari/537.36", ++ "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.181 Safari/537.36", ++ "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.99 Safari/537.36", ++ "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.116 Safari/537.36", ++ "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.106 Safari/537.36", ++ "Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36", ++ "Mozilla/5.0 (Linux; Android 6.0.1; SM-G532G Build/MMB29T) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.83 Mobile Safari/537.36", ++ "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/48.0.2564.109 Safari/537.36", ++ "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.117 Safari/537.36", ++ "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.139 Safari/537.36", ++ "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.102 Safari/537.36", ++ "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.67 Safari/537.36", ++ "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/34.0.1847.131 Safari/537.36", ++ "Mozilla/5.0 (Linux; Android 6.0; vivo 1713 Build/MRA58K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.124 Mobile Safari/537.36", ++ "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.89 Safari/537.36", ++ "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/46.0.2490.80 Safari/537.36", ++ "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2272.101 Safari/537.36", ++ "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.67 Safari/537.36", ++ "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36", ++} +--- a/proxy/shadowsocksr/obfs/obfs.go ++++ b/proxy/shadowsocksr/obfs/obfs.go +@@ -0,0 +1,44 @@ ++// SPDX-License-Identifier: GPL-3.0-or-later ++// Adapted from MetaCubeX/mihomo v1.19.32. ++package obfs ++ ++import ( ++ "errors" ++ "fmt" ++ "net" ++) ++ ++var ( ++ errTLS12TicketAuthIncorrectMagicNumber = errors.New("tls1.2_ticket_auth incorrect magic number") ++ errTLS12TicketAuthTooShortData = errors.New("tls1.2_ticket_auth too short data") ++ errTLS12TicketAuthHMACError = errors.New("tls1.2_ticket_auth hmac verifying failed") ++) ++ ++type authData struct { ++ clientID [32]byte ++} ++ ++type Obfs interface { ++ StreamConn(net.Conn) net.Conn ++} ++ ++type obfsCreator func(b *Base) Obfs ++ ++var obfsList = make(map[string]struct { ++ overhead int ++ new obfsCreator ++}) ++ ++func register(name string, c obfsCreator, o int) { ++ obfsList[name] = struct { ++ overhead int ++ new obfsCreator ++ }{overhead: o, new: c} ++} ++ ++func PickObfs(name string, b *Base) (Obfs, int, error) { ++ if choice, ok := obfsList[name]; ok { ++ return choice.new(b), choice.overhead, nil ++ } ++ return nil, 0, fmt.Errorf("Obfs %s not supported", name) ++} +--- a/proxy/shadowsocksr/obfs/plain.go ++++ b/proxy/shadowsocksr/obfs/plain.go +@@ -0,0 +1,17 @@ ++// SPDX-License-Identifier: GPL-3.0-or-later ++// Adapted from MetaCubeX/mihomo v1.19.32. ++package obfs ++ ++import "net" ++ ++type plain struct{} ++ ++func init() { ++ register("plain", newPlain, 0) ++} ++ ++func newPlain(b *Base) Obfs { ++ return &plain{} ++} ++ ++func (p *plain) StreamConn(c net.Conn) net.Conn { return c } +--- a/proxy/shadowsocksr/obfs/random_head.go ++++ b/proxy/shadowsocksr/obfs/random_head.go +@@ -0,0 +1,84 @@ ++// SPDX-License-Identifier: GPL-3.0-or-later ++// Adapted from MetaCubeX/mihomo v1.19.32. ++package obfs ++ ++import ( ++ "crypto/rand" ++ "encoding/binary" ++ "hash/crc32" ++ randv2 "math/rand/v2" ++ "net" ++ "sync" ++ "sync/atomic" ++ ++ "github.com/xtls/xray-core/proxy/shadowsocksr/pool" ++) ++ ++func init() { ++ register("random_head", newRandomHead, 0) ++} ++ ++type randomHead struct { ++ *Base ++} ++ ++func newRandomHead(b *Base) Obfs { ++ return &randomHead{Base: b} ++} ++ ++type randomHeadConn struct { ++ net.Conn ++ *randomHead ++ hasSentHeader bool ++ rawTransSent bool ++ rawTransRecv atomic.Bool ++ writeMu sync.Mutex ++ buf []byte ++} ++ ++func (r *randomHead) StreamConn(c net.Conn) net.Conn { ++ return &randomHeadConn{Conn: c, randomHead: r} ++} ++ ++func (c *randomHeadConn) Read(b []byte) (int, error) { ++ if c.rawTransRecv.Load() { ++ return c.Conn.Read(b) ++ } ++ buf := pool.Get(pool.RelayBufferSize) ++ defer pool.Put(buf) ++ if _, err := c.Conn.Read(buf); err != nil { ++ return 0, err ++ } ++ c.rawTransRecv.Store(true) ++ _, err := c.Write(nil) ++ return 0, err ++} ++ ++func (c *randomHeadConn) Write(b []byte) (int, error) { ++ c.writeMu.Lock() ++ defer c.writeMu.Unlock() ++ if c.rawTransSent { ++ if len(b) == 0 { ++ return 0, nil ++ } ++ return c.Conn.Write(b) ++ } ++ c.buf = append(c.buf, b...) ++ if !c.hasSentHeader { ++ c.hasSentHeader = true ++ dataLength := randv2.IntN(96) + 4 ++ buf := pool.Get(dataLength + 4) ++ defer pool.Put(buf) ++ rand.Read(buf[:dataLength]) ++ binary.LittleEndian.PutUint32(buf[dataLength:], 0xffffffff-crc32.ChecksumIEEE(buf[:dataLength])) ++ _, err := c.Conn.Write(buf) ++ return len(b), err ++ } ++ if c.rawTransRecv.Load() { ++ _, err := c.Conn.Write(c.buf) ++ c.buf = nil ++ c.rawTransSent = true ++ return len(b), err ++ } ++ return len(b), nil ++} +--- a/proxy/shadowsocksr/obfs/server.go ++++ b/proxy/shadowsocksr/obfs/server.go +@@ -0,0 +1,257 @@ ++// SPDX-License-Identifier: GPL-3.0-or-later ++// Server counterpart to Mihomo camouflage, checked against the libev server ++// HTTP/TLS implementations and shadowsocksrr's reference server. ++package obfs ++ ++import ( ++ "bufio" ++ "bytes" ++ "crypto/hmac" ++ "crypto/rand" ++ "encoding/binary" ++ "encoding/hex" ++ "errors" ++ "github.com/xtls/xray-core/proxy/shadowsocksr/protocol" ++ "github.com/xtls/xray-core/proxy/shadowsocksr/tools" ++ "hash/crc32" ++ "io" ++ "net" ++ "strings" ++ "time" ++) ++ ++var errServerHandshake = errors.New("shadowsocksr: invalid camouflage handshake") ++ ++type serverConn struct { ++ net.Conn ++ reader io.Reader ++ httpHeader bool ++ tls bool ++ decoded bytes.Buffer ++} ++ ++func (c *serverConn) Read(b []byte) (int, error) { ++ if len(b) == 0 { ++ return 0, nil ++ } ++ if !c.tls { ++ return c.reader.Read(b) ++ } ++ for c.decoded.Len() == 0 { ++ r, e := serverRecord(c.reader, false) ++ if e != nil { ++ return 0, e ++ } ++ if r[0] != 0x17 { ++ return 0, errServerHandshake ++ } ++ c.decoded.Write(r[5:]) ++ } ++ return c.decoded.Read(b) ++} ++func (c *serverConn) Write(b []byte) (int, error) { ++ var out bytes.Buffer ++ if c.httpHeader { ++ c.httpHeader = false ++ out.WriteString("HTTP/1.1 200 OK\r\nConnection: keep-alive\r\nContent-Type: text/html\r\n\r\n") ++ } ++ if c.tls { ++ for p := b; len(p) > 0; { ++ n := len(p) ++ if n > 4096 { ++ n = 4096 ++ } ++ packData(&out, p[:n]) ++ p = p[n:] ++ } ++ } else { ++ out.Write(b) ++ } ++ n, e := c.Conn.Write(out.Bytes()) ++ if e == nil && n != out.Len() { ++ e = io.ErrShortWrite ++ } ++ if e != nil { ++ return 0, e ++ } ++ return len(b), nil ++} ++func serverRecord(r io.Reader, hello bool) ([]byte, error) { ++ var h [5]byte ++ if _, e := io.ReadFull(r, h[:]); e != nil { ++ return nil, e ++ } ++ if h[1] != 3 || (h[2] != 3 && !(hello && h[2] == 1)) { ++ return nil, errServerHandshake ++ } ++ n := int(binary.BigEndian.Uint16(h[3:])) ++ if n > 18432 { ++ return nil, errServerHandshake ++ } ++ b := make([]byte, 5+n) ++ copy(b, h[:]) ++ _, e := io.ReadFull(r, b[5:]) ++ return b, e ++} ++func AcceptServer(c net.Conn, name string, key []byte, param string, cache *protocol.ReplayCache, deadline time.Time) (net.Conn, error) { ++ switch name { ++ case "plain": ++ return c, nil ++ case "http_simple", "http_post": ++ r := bufio.NewReader(c) ++ var header bytes.Buffer ++ for { ++ line, e := r.ReadSlice('\n') ++ if e != nil { ++ return nil, e ++ } ++ header.Write(line) ++ if header.Len() > 32768 { ++ return nil, errServerHandshake ++ } ++ if bytes.Equal(line, []byte("\r\n")) { ++ break ++ } ++ } ++ lines := strings.Split(header.String(), "\r\n") ++ parts := strings.Split(lines[0], " ") ++ if len(parts) != 3 || (parts[0] != "GET" && parts[0] != "POST") || !strings.HasPrefix(parts[1], "/") { ++ return nil, errServerHandshake ++ } ++ // Camouflage carries the initial ciphertext as percent-encoded URL bytes. ++ path := strings.TrimPrefix(parts[1], "/") ++ var first []byte ++ for len(path) > 0 { ++ if len(path) < 3 || path[0] != '%' { ++ return nil, errServerHandshake ++ } ++ v, e := hex.DecodeString(path[1:3]) ++ if e != nil { ++ return nil, e ++ } ++ first = append(first, v[0]) ++ path = path[3:] ++ } ++ if len(first) == 0 { ++ return nil, errServerHandshake ++ } ++ if param != "" { ++ host := "" ++ for _, l := range lines[1:] { ++ if strings.HasPrefix(strings.ToLower(l), "host:") { ++ host = strings.TrimSpace(l[5:]) ++ if h, _, e := net.SplitHostPort(host); e == nil { ++ host = h ++ } ++ } ++ } ++ found := false ++ for _, h := range strings.Split(param, ",") { ++ if strings.EqualFold(strings.TrimSpace(h), host) { ++ found = true ++ } ++ } ++ if !found { ++ return nil, errServerHandshake ++ } ++ } ++ return &serverConn{Conn: c, reader: io.MultiReader(bytes.NewReader(first), r), httpHeader: true}, nil ++ case "random_head": ++ // This legacy header has no length field. A trailing zero CRC byte ++ // leaves the CRC residue unchanged, so a matching prefix is not a ++ // boundary. Read chunks and allow a short quiet interval to collect ++ // fragmented trailing bytes before replying (the peer waits for us). ++ var head [103]byte ++ length := 0 ++ valid := false ++ defer c.SetReadDeadline(deadline) ++ for length < len(head) { ++ if valid { ++ quiet := time.Now().Add(20 * time.Millisecond) ++ if !deadline.IsZero() && deadline.Before(quiet) { ++ quiet = deadline ++ } ++ c.SetReadDeadline(quiet) ++ } else { ++ c.SetReadDeadline(deadline) ++ } ++ n, e := c.Read(head[length:]) ++ length += n ++ valid = length >= 8 && crc32.ChecksumIEEE(head[:length]) == 0xffffffff ++ if e != nil { ++ if ne, ok := e.(net.Error); !ok || !ne.Timeout() || !valid { ++ return nil, e ++ } ++ break ++ } ++ } ++ if !valid { ++ return nil, errServerHandshake ++ } ++ c.SetReadDeadline(deadline) ++ reply := make([]byte, 16) ++ rand.Read(reply) ++ if _, e := c.Write(reply); e != nil { ++ return nil, e ++ } ++ return c, nil ++ case "tls1.2_ticket_auth", "tls1.2_ticket_fastauth": ++ rec, e := serverRecord(c, true) ++ if e != nil { ++ return nil, e ++ } ++ if len(rec) < 76 || rec[0] != 0x16 || rec[5] != 1 || rec[6] != 0 || int(binary.BigEndian.Uint16(rec[7:9])) != len(rec)-9 || rec[9] != 3 || rec[10] != 3 || rec[43] != 32 { ++ return nil, errServerHandshake ++ } ++ id := rec[44:76] ++ macKey := append(append([]byte{}, key...), id...) ++ verify := rec[11:43] ++ if !hmac.Equal(tools.HmacSHA1(macKey, verify[:22])[:10], verify[22:]) || !cache.Accept(verify[:22], int64(binary.BigEndian.Uint32(verify))) { ++ return nil, errServerHandshake ++ } ++ var body bytes.Buffer ++ body.Write([]byte{3, 3}) ++ auth := make([]byte, 22) ++ rand.Read(auth) ++ binary.BigEndian.PutUint32(auth, uint32(time.Now().Unix())) ++ body.Write(auth) ++ body.Write(tools.HmacSHA1(macKey, auth)[:10]) ++ body.WriteByte(32) ++ body.Write(id) ++ body.Write([]byte{0xc0, 0x2f, 0, 0, 5, 0xff, 1, 0, 1, 0}) ++ var out bytes.Buffer ++ out.Write([]byte{0x16, 3, 3}) ++ binary.Write(&out, binary.BigEndian, uint16(body.Len()+4)) ++ out.Write([]byte{2, 0}) ++ binary.Write(&out, binary.BigEndian, uint16(body.Len())) ++ out.Write(body.Bytes()) ++ out.Write([]byte{0x14, 3, 3, 0, 1, 1, 0x16, 3, 3, 0, 32}) ++ finish := make([]byte, 22) ++ rand.Read(finish) ++ out.Write(finish) ++ out.Write(tools.HmacSHA1(macKey, out.Bytes())[:10]) ++ if _, e = c.Write(out.Bytes()); e != nil { ++ return nil, e ++ } ++ change, e := serverRecord(c, false) ++ if e != nil { ++ return nil, e ++ } ++ if !bytes.Equal(change, []byte{0x14, 3, 3, 0, 1, 1}) { ++ return nil, errServerHandshake ++ } ++ fin, e := serverRecord(c, false) ++ if e != nil { ++ return nil, e ++ } ++ if fin[0] != 0x16 || len(fin) < 15 { ++ return nil, errServerHandshake ++ } ++ all := append(change, fin...) ++ if !hmac.Equal(tools.HmacSHA1(macKey, all[:len(all)-10])[:10], all[len(all)-10:]) { ++ return nil, errServerHandshake ++ } ++ return &serverConn{Conn: c, reader: c, tls: true}, nil ++ } ++ return nil, errServerHandshake ++} +--- a/proxy/shadowsocksr/obfs/tls1.2_ticket_auth.go ++++ b/proxy/shadowsocksr/obfs/tls1.2_ticket_auth.go +@@ -0,0 +1,264 @@ ++// SPDX-License-Identifier: GPL-3.0-or-later ++// Adapted from MetaCubeX/mihomo v1.19.32. ++package obfs ++ ++import ( ++ "bytes" ++ "crypto/hmac" ++ "crypto/rand" ++ "encoding/binary" ++ "io" ++ randv2 "math/rand/v2" ++ "net" ++ "strings" ++ "sync" ++ "sync/atomic" ++ "time" ++ ++ "github.com/xtls/xray-core/proxy/shadowsocksr/pool" ++ "github.com/xtls/xray-core/proxy/shadowsocksr/tools" ++) ++ ++func init() { ++ register("tls1.2_ticket_auth", newTLS12Ticket, 5) ++ register("tls1.2_ticket_fastauth", newTLS12Ticket, 5) ++} ++ ++type tls12Ticket struct { ++ *Base ++ *authData ++} ++ ++func newTLS12Ticket(b *Base) Obfs { ++ r := &tls12Ticket{Base: b, authData: &authData{}} ++ rand.Read(r.clientID[:]) ++ return r ++} ++ ++type tls12TicketConn struct { ++ net.Conn ++ *tls12Ticket ++ handshakeStatus atomic.Int32 ++ writeMu sync.Mutex ++ decoded bytes.Buffer ++ sendBuf bytes.Buffer ++} ++ ++func (t *tls12Ticket) StreamConn(c net.Conn) net.Conn { ++ return &tls12TicketConn{Conn: c, tls12Ticket: t} ++} ++ ++// Read complete records so fragmented or coalesced TCP reads cannot corrupt ++// the handshake authentication boundary. ++func (c *tls12TicketConn) readRecord() ([]byte, error) { ++ var header [5]byte ++ if _, err := io.ReadFull(c.Conn, header[:]); err != nil { ++ return nil, err ++ } ++ if header[1] != 3 || header[2] != 3 { ++ return nil, errTLS12TicketAuthIncorrectMagicNumber ++ } ++ n := int(binary.BigEndian.Uint16(header[3:])) ++ if n > 18432 { ++ return nil, errTLS12TicketAuthTooShortData ++ } ++ record := make([]byte, 5+n) ++ copy(record, header[:]) ++ _, err := io.ReadFull(c.Conn, record[5:]) ++ return record, err ++} ++func (c *tls12TicketConn) Read(b []byte) (int, error) { ++ if len(b) == 0 { ++ return 0, nil ++ } ++ if c.handshakeStatus.Load() != 8 { ++ var handshake bytes.Buffer ++ changed := false ++ for i := 0; ; i++ { ++ if i >= 16 { ++ return 0, errTLS12TicketAuthTooShortData ++ } ++ record, err := c.readRecord() ++ if err != nil { ++ return 0, err ++ } ++ handshake.Write(record) ++ if handshake.Len() > 65536 { ++ return 0, errTLS12TicketAuthTooShortData ++ } ++ if record[0] == 0x16 && changed { ++ break ++ } ++ if record[0] == 0x14 { ++ changed = true ++ } else if record[0] != 0x16 { ++ return 0, errTLS12TicketAuthIncorrectMagicNumber ++ } ++ } ++ data := handshake.Bytes() ++ n := len(data) ++ if n < 76 { ++ return 0, errTLS12TicketAuthTooShortData ++ } ++ if !hmac.Equal(data[33:43], c.hmacSHA1(data[11:33])[:10]) || !hmac.Equal(data[n-10:], c.hmacSHA1(data[:n-10])[:10]) { ++ return 0, errTLS12TicketAuthHMACError ++ } ++ if _, err := c.Write(nil); err != nil { ++ return 0, err ++ } ++ } ++ for c.decoded.Len() == 0 { ++ record, err := c.readRecord() ++ if err != nil { ++ return 0, err ++ } ++ if record[0] != 0x17 { ++ return 0, errTLS12TicketAuthIncorrectMagicNumber ++ } ++ c.decoded.Write(record[5:]) ++ } ++ return c.decoded.Read(b) ++} ++ ++func (c *tls12TicketConn) Write(b []byte) (int, error) { ++ c.writeMu.Lock() ++ defer c.writeMu.Unlock() ++ length := len(b) ++ if c.handshakeStatus.Load() == 8 { ++ buf := pool.GetBuffer() ++ defer pool.PutBuffer(buf) ++ for len(b) > 2048 { ++ size := randv2.IntN(4096) + 100 ++ if len(b) < size { ++ size = len(b) ++ } ++ packData(buf, b[:size]) ++ b = b[size:] ++ } ++ if len(b) > 0 { ++ packData(buf, b) ++ } ++ _, err := c.Conn.Write(buf.Bytes()) ++ if err != nil { ++ return 0, err ++ } ++ return length, nil ++ } ++ ++ if len(b) > 0 { ++ packData(&c.sendBuf, b) ++ } ++ ++ if c.handshakeStatus.Load() == 0 { ++ c.handshakeStatus.Store(1) ++ ++ data := pool.GetBuffer() ++ defer pool.PutBuffer(data) ++ ++ data.Write([]byte{3, 3}) ++ c.packAuthData(data) ++ data.WriteByte(0x20) ++ data.Write(c.clientID[:]) ++ data.Write([]byte{0x00, 0x1c, 0xc0, 0x2b, 0xc0, 0x2f, 0xcc, 0xa9, 0xcc, 0xa8, 0xcc, 0x14, 0xcc, 0x13, 0xc0, 0x0a, 0xc0, 0x14, 0xc0, 0x09, 0xc0, 0x13, 0x00, 0x9c, 0x00, 0x35, 0x00, 0x2f, 0x00, 0x0a}) ++ data.Write([]byte{0x1, 0x0}) ++ ++ ext := pool.GetBuffer() ++ defer pool.PutBuffer(ext) ++ ++ host := c.getHost() ++ ext.Write([]byte{0xff, 0x01, 0x00, 0x01, 0x00}) ++ packSNIData(ext, host) ++ ext.Write([]byte{0, 0x17, 0, 0}) ++ c.packTicketBuf(ext, host) ++ ext.Write([]byte{0x00, 0x0d, 0x00, 0x16, 0x00, 0x14, 0x06, 0x01, 0x06, 0x03, 0x05, 0x01, 0x05, 0x03, 0x04, 0x01, 0x04, 0x03, 0x03, 0x01, 0x03, 0x03, 0x02, 0x01, 0x02, 0x03}) ++ ext.Write([]byte{0x00, 0x05, 0x00, 0x05, 0x01, 0x00, 0x00, 0x00, 0x00}) ++ ext.Write([]byte{0x00, 0x12, 0x00, 0x00}) ++ ext.Write([]byte{0x75, 0x50, 0x00, 0x00}) ++ ext.Write([]byte{0x00, 0x0b, 0x00, 0x02, 0x01, 0x00}) ++ ext.Write([]byte{0x00, 0x0a, 0x00, 0x06, 0x00, 0x04, 0x00, 0x17, 0x00, 0x18}) ++ ++ binary.Write(data, binary.BigEndian, uint16(ext.Len())) ++ data.ReadFrom(ext) ++ ++ ret := pool.GetBuffer() ++ defer pool.PutBuffer(ret) ++ ++ ret.Write([]byte{0x16, 3, 1}) ++ binary.Write(ret, binary.BigEndian, uint16(data.Len()+4)) ++ ret.Write([]byte{1, 0}) ++ binary.Write(ret, binary.BigEndian, uint16(data.Len())) ++ ret.ReadFrom(data) ++ ++ _, err := c.Conn.Write(ret.Bytes()) ++ if err != nil { ++ return 0, err ++ } ++ return length, nil ++ } else if c.handshakeStatus.Load() == 1 && len(b) == 0 { ++ buf := pool.GetBuffer() ++ defer pool.PutBuffer(buf) ++ ++ buf.Write([]byte{0x14, 3, 3, 0, 1, 1, 0x16, 3, 3, 0, 0x20}) ++ tools.AppendRandBytes(buf, 22) ++ buf.Write(c.hmacSHA1(buf.Bytes())[:10]) ++ buf.ReadFrom(&c.sendBuf) ++ ++ c.handshakeStatus.Store(8) ++ ++ _, err := c.Conn.Write(buf.Bytes()) ++ return 0, err ++ } ++ return length, nil ++} ++ ++func packData(buf *bytes.Buffer, data []byte) { ++ buf.Write([]byte{0x17, 3, 3}) ++ binary.Write(buf, binary.BigEndian, uint16(len(data))) ++ buf.Write(data) ++} ++ ++func (t *tls12Ticket) packAuthData(buf *bytes.Buffer) { ++ binary.Write(buf, binary.BigEndian, uint32(time.Now().Unix())) ++ tools.AppendRandBytes(buf, 18) ++ buf.Write(t.hmacSHA1(buf.Bytes()[buf.Len()-22:])[:10]) ++} ++ ++func packSNIData(buf *bytes.Buffer, u string) { ++ len := uint16(len(u)) ++ buf.Write([]byte{0, 0}) ++ binary.Write(buf, binary.BigEndian, len+5) ++ binary.Write(buf, binary.BigEndian, len+3) ++ buf.WriteByte(0) ++ binary.Write(buf, binary.BigEndian, len) ++ buf.WriteString(u) ++} ++ ++func (c *tls12TicketConn) packTicketBuf(buf *bytes.Buffer, u string) { ++ length := 16 * (randv2.IntN(17) + 8) ++ buf.Write([]byte{0, 0x23}) ++ binary.Write(buf, binary.BigEndian, uint16(length)) ++ tools.AppendRandBytes(buf, length) ++} ++ ++func (t *tls12Ticket) hmacSHA1(data []byte) []byte { ++ key := pool.Get(len(t.Key) + 32) ++ defer pool.Put(key) ++ copy(key, t.Key) ++ copy(key[len(t.Key):], t.clientID[:]) ++ ++ sha1Data := tools.HmacSHA1(key, data) ++ return sha1Data[:10] ++} ++ ++func (t *tls12Ticket) getHost() string { ++ host := t.Param ++ if len(host) == 0 { ++ host = t.Host ++ } ++ if len(host) > 0 && host[len(host)-1] >= '0' && host[len(host)-1] <= '9' { ++ host = "" ++ } ++ hosts := strings.Split(host, ",") ++ host = hosts[randv2.IntN(len(hosts))] ++ return host ++} +--- a/proxy/shadowsocksr/packet.go ++++ b/proxy/shadowsocksr/packet.go +@@ -0,0 +1,62 @@ ++package shadowsocksr ++ ++import ( ++ "bytes" ++ "net" ++ ++ M "github.com/sagernet/sing/common/metadata" ++ "github.com/xtls/xray-core/common/buf" ++ N "github.com/xtls/xray-core/common/net" ++) ++ ++type connectedPacketConn struct{ net.Conn } ++ ++func (c *connectedPacketConn) ReadFrom(b []byte) (int, net.Addr, error) { ++ n, e := c.Read(b) ++ return n, c.RemoteAddr(), e ++} ++func (c *connectedPacketConn) WriteTo(b []byte, _ net.Addr) (int, error) { return c.Write(b) } ++ ++type packetReader struct{ conn net.PacketConn } ++ ++func (r *packetReader) ReadMultiBuffer() (buf.MultiBuffer, error) { ++ packet := make([]byte, 65535) ++ n, _, err := r.conn.ReadFrom(packet) ++ if err != nil { ++ return nil, err ++ } ++ data := bytes.NewReader(packet[:n]) ++ address, err := M.SocksaddrSerializer.ReadAddrPort(data) ++ if err != nil { ++ return nil, err ++ } ++ b := buf.FromBytes(packet[n-data.Len() : n]) ++ d := N.UDPDestination(N.ParseAddress(address.AddrString()), N.Port(address.Port)) ++ b.UDP = &d ++ return buf.MultiBuffer{b}, nil ++} ++ ++type packetWriter struct { ++ conn net.PacketConn ++ server net.Addr ++ destination N.Destination ++} ++ ++func (w *packetWriter) WriteMultiBuffer(mb buf.MultiBuffer) error { ++ defer buf.ReleaseMulti(mb) ++ for _, b := range mb { ++ d := w.destination ++ if b.UDP != nil { ++ d = *b.UDP ++ } ++ var packet bytes.Buffer ++ if err := M.SocksaddrSerializer.WriteAddrPort(&packet, socksaddr(d)); err != nil { ++ return err ++ } ++ packet.Write(b.Bytes()) ++ if _, err := w.conn.WriteTo(packet.Bytes(), w.server); err != nil { ++ return err ++ } ++ } ++ return nil ++} +--- a/proxy/shadowsocksr/pool/pool.go ++++ b/proxy/shadowsocksr/pool/pool.go +@@ -0,0 +1,31 @@ ++package pool ++ ++import ( ++ "bytes" ++ "sync" ++) ++ ++const RelayBufferSize = 32 * 1024 ++ ++var buffers = sync.Pool{New: func() any { return new(bytes.Buffer) }} ++var packets = sync.Pool{New: func() any { return make([]byte, 65536) }} ++ ++func Get(n int) []byte { ++ if n > 65536 { ++ return make([]byte, n) ++ } ++ return packets.Get().([]byte)[:n] ++} ++func Put(b []byte) { ++ if cap(b) == 65536 { ++ clear(b[:cap(b)]) ++ packets.Put(b[:cap(b)]) ++ } ++} ++func GetBuffer() *bytes.Buffer { return buffers.Get().(*bytes.Buffer) } ++func PutBuffer(b *bytes.Buffer) { ++ b.Reset() ++ if b.Cap() <= 65536 { ++ buffers.Put(b) ++ } ++} +--- a/proxy/shadowsocksr/protocol/auth_aes128_md5.go ++++ b/proxy/shadowsocksr/protocol/auth_aes128_md5.go +@@ -0,0 +1,20 @@ ++// SPDX-License-Identifier: GPL-3.0-or-later ++// Adapted from MetaCubeX/mihomo v1.19.32. ++package protocol ++ ++import "github.com/xtls/xray-core/proxy/shadowsocksr/tools" ++ ++func init() { ++ register("auth_aes128_md5", newAuthAES128MD5, 9) ++} ++ ++func newAuthAES128MD5(b *Base) Protocol { ++ a := &authAES128{ ++ Base: b, ++ authData: &authData{}, ++ authAES128Function: &authAES128Function{salt: "auth_aes128_md5", hmac: tools.HmacMD5, hashDigest: tools.MD5Sum}, ++ userData: &userData{}, ++ } ++ a.initUserData() ++ return a ++} +--- a/proxy/shadowsocksr/protocol/auth_aes128_sha1.go ++++ b/proxy/shadowsocksr/protocol/auth_aes128_sha1.go +@@ -0,0 +1,286 @@ ++// SPDX-License-Identifier: GPL-3.0-or-later ++// Adapted from MetaCubeX/mihomo v1.19.32. ++package protocol ++ ++import ( ++ "bytes" ++ "crypto/rand" ++ "encoding/binary" ++ "log" ++ "math" ++ randv2 "math/rand/v2" ++ "net" ++ "strconv" ++ "strings" ++ ++ "github.com/xtls/xray-core/proxy/shadowsocksr/pool" ++ "github.com/xtls/xray-core/proxy/shadowsocksr/tools" ++) ++ ++type ( ++ hmacMethod func(key, data []byte) []byte ++ hashDigestMethod func([]byte) []byte ++) ++ ++func init() { ++ register("auth_aes128_sha1", newAuthAES128SHA1, 9) ++} ++ ++type authAES128Function struct { ++ salt string ++ hmac hmacMethod ++ hashDigest hashDigestMethod ++} ++ ++type authAES128 struct { ++ *Base ++ *authData ++ *authAES128Function ++ *userData ++ iv []byte ++ hasSentHeader bool ++ rawTrans bool ++ packID uint32 ++ recvID uint32 ++} ++ ++func newAuthAES128SHA1(b *Base) Protocol { ++ a := &authAES128{ ++ Base: b, ++ authData: &authData{}, ++ authAES128Function: &authAES128Function{salt: "auth_aes128_sha1", hmac: tools.HmacSHA1, hashDigest: tools.SHA1Sum}, ++ userData: &userData{}, ++ } ++ a.initUserData() ++ return a ++} ++ ++func (a *authAES128) initUserData() { ++ params := strings.Split(a.Param, ":") ++ if len(params) > 1 { ++ if userID, err := strconv.ParseUint(params[0], 10, 32); err == nil { ++ binary.LittleEndian.PutUint32(a.userID[:], uint32(userID)) ++ a.userKey = a.hashDigest([]byte(params[1])) ++ } else { ++ log.Printf("Wrong protocol-param for %s, only digits are expected before ':'", a.salt) ++ } ++ } ++ if len(a.userKey) == 0 { ++ a.userKey = a.Key ++ rand.Read(a.userID[:]) ++ } ++} ++ ++func (a *authAES128) StreamConn(c net.Conn, iv []byte) net.Conn { ++ p := &authAES128{ ++ Base: a.Base, ++ authData: a.next(), ++ authAES128Function: a.authAES128Function, ++ userData: a.userData, ++ packID: 1, ++ recvID: 1, ++ } ++ p.iv = iv ++ return &Conn{Conn: c, Protocol: p} ++} ++ ++func (a *authAES128) PacketConn(c net.PacketConn) net.PacketConn { ++ p := &authAES128{ ++ Base: a.Base, ++ authAES128Function: a.authAES128Function, ++ userData: a.userData, ++ } ++ return &PacketConn{PacketConn: c, Protocol: p} ++} ++ ++func (a *authAES128) Decode(dst, src *bytes.Buffer) error { ++ if a.rawTrans { ++ dst.ReadFrom(src) ++ return nil ++ } ++ for src.Len() > 4 { ++ macKey := pool.Get(len(a.userKey) + 4) ++ defer pool.Put(macKey) ++ copy(macKey, a.userKey) ++ binary.LittleEndian.PutUint32(macKey[len(a.userKey):], a.recvID) ++ if !bytes.Equal(a.hmac(macKey, src.Bytes()[:2])[:2], src.Bytes()[2:4]) { ++ src.Reset() ++ return errAuthAES128MACError ++ } ++ ++ length := int(binary.LittleEndian.Uint16(src.Bytes()[:2])) ++ if length >= 8192 || length < 7 { ++ a.rawTrans = true ++ src.Reset() ++ return errAuthAES128LengthError ++ } ++ if length > src.Len() { ++ break ++ } ++ ++ if !bytes.Equal(a.hmac(macKey, src.Bytes()[:length-4])[:4], src.Bytes()[length-4:length]) { ++ a.rawTrans = true ++ src.Reset() ++ return errAuthAES128ChksumError ++ } ++ ++ a.recvID++ ++ ++ pos := int(src.Bytes()[4]) ++ if pos < 255 { ++ pos += 4 ++ } else { ++ pos = int(binary.LittleEndian.Uint16(src.Bytes()[5:7])) + 4 ++ } ++ if pos < 5 || pos > length-4 { ++ return errAuthAES128LengthError ++ } ++ dst.Write(src.Bytes()[pos : length-4]) ++ src.Next(length) ++ } ++ return nil ++} ++ ++func (a *authAES128) Encode(buf *bytes.Buffer, b []byte) error { ++ fullDataLength := len(b) ++ if !a.hasSentHeader { ++ dataLength := getDataLength(b) ++ a.packAuthData(buf, b[:dataLength]) ++ b = b[dataLength:] ++ a.hasSentHeader = true ++ } ++ for len(b) > 8100 { ++ a.packData(buf, b[:8100], fullDataLength) ++ b = b[8100:] ++ } ++ if len(b) > 0 { ++ a.packData(buf, b, fullDataLength) ++ } ++ return nil ++} ++ ++func (a *authAES128) DecodePacket(b []byte) ([]byte, error) { ++ if len(b) < 4 { ++ return nil, errAuthAES128LengthError ++ } ++ if !bytes.Equal(a.hmac(a.Key, b[:len(b)-4])[:4], b[len(b)-4:]) { ++ return nil, errAuthAES128ChksumError ++ } ++ return b[:len(b)-4], nil ++} ++ ++func (a *authAES128) EncodePacket(buf *bytes.Buffer, b []byte) error { ++ buf.Write(b) ++ buf.Write(a.userID[:]) ++ buf.Write(a.hmac(a.userKey, buf.Bytes())[:4]) ++ return nil ++} ++ ++func (a *authAES128) packData(poolBuf *bytes.Buffer, data []byte, fullDataLength int) { ++ dataLength := len(data) ++ randDataLength := a.getRandDataLengthForPackData(dataLength, fullDataLength) ++ /* ++ 2: uint16 LittleEndian packedDataLength ++ 2: hmac of packedDataLength ++ 3: maxRandDataLengthPrefix (min:1) ++ 4: hmac of packedData except the last 4 bytes ++ */ ++ packedDataLength := 2 + 2 + 3 + randDataLength + dataLength + 4 ++ if randDataLength < 128 { ++ packedDataLength -= 2 ++ } ++ ++ macKey := pool.Get(len(a.userKey) + 4) ++ defer pool.Put(macKey) ++ copy(macKey, a.userKey) ++ binary.LittleEndian.PutUint32(macKey[len(a.userKey):], a.packID) ++ a.packID++ ++ ++ binary.Write(poolBuf, binary.LittleEndian, uint16(packedDataLength)) ++ poolBuf.Write(a.hmac(macKey, poolBuf.Bytes()[poolBuf.Len()-2:])[:2]) ++ a.packRandData(poolBuf, randDataLength) ++ poolBuf.Write(data) ++ poolBuf.Write(a.hmac(macKey, poolBuf.Bytes()[poolBuf.Len()-packedDataLength+4:])[:4]) ++} ++ ++func trapezoidRandom(max int, d float64) int { ++ base := randv2.Float64() ++ if d-0 > 1e-6 { ++ a := 1 - d ++ base = (math.Sqrt(a*a+4*d*base) - a) / (2 * d) ++ } ++ return int(base * float64(max)) ++} ++ ++func (a *authAES128) getRandDataLengthForPackData(dataLength, fullDataLength int) int { ++ if fullDataLength >= 32*1024-a.Overhead { ++ return 0 ++ } ++ // 1460: tcp_mss ++ revLength := 1460 - dataLength - 9 ++ if revLength == 0 { ++ return 0 ++ } ++ if revLength < 0 { ++ if revLength > -1460 { ++ return trapezoidRandom(revLength+1460, -0.3) ++ } ++ return randv2.IntN(32) ++ } ++ if dataLength > 900 { ++ return randv2.IntN(revLength) ++ } ++ return trapezoidRandom(revLength, -0.3) ++} ++ ++func (a *authAES128) packAuthData(poolBuf *bytes.Buffer, data []byte) { ++ if len(data) == 0 { ++ return ++ } ++ dataLength := len(data) ++ randDataLength := a.getRandDataLengthForPackAuthData(dataLength) ++ /* ++ 7: checkHead(1) and hmac of checkHead(6) ++ 4: userID ++ 16: encrypted data of authdata(12), uint16 BigEndian packedDataLength(2) and uint16 BigEndian randDataLength(2) ++ 4: hmac of userID and encrypted data ++ 4: hmac of packedAuthData except the last 4 bytes ++ */ ++ packedAuthDataLength := 7 + 4 + 16 + 4 + randDataLength + dataLength + 4 ++ ++ macKey := pool.Get(len(a.iv) + len(a.Key)) ++ defer pool.Put(macKey) ++ copy(macKey, a.iv) ++ copy(macKey[len(a.iv):], a.Key) ++ ++ poolBuf.WriteByte(byte(randv2.IntN(256))) ++ poolBuf.Write(a.hmac(macKey, poolBuf.Bytes())[:6]) ++ poolBuf.Write(a.userID[:]) ++ err := a.authData.putEncryptedData(poolBuf, a.userKey, [2]int{packedAuthDataLength, randDataLength}, a.salt) ++ if err != nil { ++ poolBuf.Reset() ++ return ++ } ++ poolBuf.Write(a.hmac(macKey, poolBuf.Bytes()[7:])[:4]) ++ tools.AppendRandBytes(poolBuf, randDataLength) ++ poolBuf.Write(data) ++ poolBuf.Write(a.hmac(a.userKey, poolBuf.Bytes())[:4]) ++} ++ ++func (a *authAES128) getRandDataLengthForPackAuthData(size int) int { ++ if size > 400 { ++ return randv2.IntN(512) ++ } ++ return randv2.IntN(1024) ++} ++ ++func (a *authAES128) packRandData(poolBuf *bytes.Buffer, size int) { ++ if size < 128 { ++ poolBuf.WriteByte(byte(size + 1)) ++ tools.AppendRandBytes(poolBuf, size) ++ return ++ } ++ poolBuf.WriteByte(255) ++ binary.Write(poolBuf, binary.LittleEndian, uint16(size+3)) ++ tools.AppendRandBytes(poolBuf, size) ++} +--- a/proxy/shadowsocksr/protocol/auth_chain_a.go ++++ b/proxy/shadowsocksr/protocol/auth_chain_a.go +@@ -0,0 +1,328 @@ ++// SPDX-License-Identifier: GPL-3.0-or-later ++// Adapted from MetaCubeX/mihomo v1.19.32. ++package protocol ++ ++import ( ++ "bytes" ++ "crypto/cipher" ++ "crypto/rand" ++ "crypto/rc4" ++ "encoding/base64" ++ "encoding/binary" ++ "errors" ++ "log" ++ "net" ++ "strconv" ++ "strings" ++ ++ core "github.com/xtls/xray-core/proxy/shadowsocksr/cipher" ++ "github.com/xtls/xray-core/proxy/shadowsocksr/pool" ++ "github.com/xtls/xray-core/proxy/shadowsocksr/tools" ++) ++ ++func init() { ++ register("auth_chain_a", newAuthChainA, 4) ++} ++ ++type randDataLengthMethod func(int, []byte, *tools.XorShift128Plus) int ++ ++type authChainA struct { ++ *Base ++ *authData ++ *userData ++ iv []byte ++ salt string ++ hasSentHeader bool ++ serverSide bool ++ rawTrans bool ++ lastClientHash []byte ++ lastServerHash []byte ++ encrypter cipher.Stream ++ decrypter cipher.Stream ++ randomClient tools.XorShift128Plus ++ randomServer tools.XorShift128Plus ++ randDataLength randDataLengthMethod ++ packID uint32 ++ recvID uint32 ++} ++ ++func newAuthChainA(b *Base) Protocol { ++ a := &authChainA{ ++ Base: b, ++ authData: &authData{}, ++ userData: &userData{}, ++ salt: "auth_chain_a", ++ } ++ a.initUserData() ++ return a ++} ++ ++func (a *authChainA) initUserData() { ++ params := strings.Split(a.Param, ":") ++ if len(params) > 1 { ++ if userID, err := strconv.ParseUint(params[0], 10, 32); err == nil { ++ binary.LittleEndian.PutUint32(a.userID[:], uint32(userID)) ++ a.userKey = []byte(params[1]) ++ } else { ++ log.Printf("Wrong protocol-param for %s, only digits are expected before ':'", a.salt) ++ } ++ } ++ if len(a.userKey) == 0 { ++ a.userKey = a.Key ++ rand.Read(a.userID[:]) ++ } ++} ++ ++func (a *authChainA) StreamConn(c net.Conn, iv []byte) net.Conn { ++ p := &authChainA{ ++ Base: a.Base, ++ authData: a.next(), ++ userData: a.userData, ++ salt: a.salt, ++ packID: 1, ++ recvID: 1, ++ } ++ p.iv = iv ++ p.randDataLength = p.getRandLength ++ return &Conn{Conn: c, Protocol: p} ++} ++ ++func (a *authChainA) PacketConn(c net.PacketConn) net.PacketConn { ++ p := &authChainA{ ++ Base: a.Base, ++ salt: a.salt, ++ userData: a.userData, ++ } ++ return &PacketConn{PacketConn: c, Protocol: p} ++} ++ ++func (a *authChainA) Decode(dst, src *bytes.Buffer) error { ++ if a.rawTrans { ++ dst.ReadFrom(src) ++ return nil ++ } ++ for src.Len() > 4 { ++ macKey := pool.Get(len(a.userKey) + 4) ++ defer pool.Put(macKey) ++ copy(macKey, a.userKey) ++ binary.LittleEndian.PutUint32(macKey[len(a.userKey):], a.recvID) ++ ++ dataLength := int(binary.LittleEndian.Uint16(src.Bytes()[:2]) ^ binary.LittleEndian.Uint16(a.lastServerHash[14:16])) ++ randDataLength := a.randDataLength(dataLength, a.lastServerHash, &a.randomServer) ++ length := dataLength + randDataLength ++ // Temporary workaround for https://github.com/metacubex/mihomo/issues/1352 ++ if dataLength < 0 || randDataLength < 0 || length < 0 { ++ return errors.New("ssr crashing blocked") ++ } ++ ++ if length >= 4096 { ++ a.rawTrans = true ++ src.Reset() ++ return errAuthChainLengthError ++ } ++ ++ if 4+length > src.Len() { ++ break ++ } ++ ++ serverHash := tools.HmacMD5(macKey, src.Bytes()[:length+2]) ++ if !bytes.Equal(serverHash[:2], src.Bytes()[length+2:length+4]) { ++ a.rawTrans = true ++ src.Reset() ++ return errAuthChainChksumError ++ } ++ a.lastServerHash = serverHash ++ ++ pos := 2 ++ if dataLength > 0 && randDataLength > 0 { ++ pos += getRandStartPos(randDataLength, &a.randomServer) ++ } ++ // Temporary workaround for https://github.com/metacubex/mihomo/issues/1352 ++ if pos < 0 || dataLength < 0 || pos+dataLength > length+2 || (!a.serverSide && a.recvID == 1 && dataLength < 2) { ++ return errors.New("ssr crashing blocked") ++ } ++ ++ wantedData := src.Bytes()[pos : pos+dataLength] ++ a.decrypter.XORKeyStream(wantedData, wantedData) ++ if !a.serverSide && a.recvID == 1 { ++ dst.Write(wantedData[2:]) ++ } else { ++ dst.Write(wantedData) ++ } ++ a.recvID++ ++ src.Next(length + 4) ++ } ++ return nil ++} ++ ++func (a *authChainA) Encode(buf *bytes.Buffer, b []byte) error { ++ if a.serverSide && a.packID == 1 { ++ b = append([]byte{0xb4, 0x05}, b...) ++ } ++ if !a.hasSentHeader { ++ dataLength := getDataLength(b) ++ a.packAuthData(buf, b[:dataLength]) ++ b = b[dataLength:] ++ a.hasSentHeader = true ++ } ++ for len(b) > 2800 { ++ a.packData(buf, b[:2800]) ++ b = b[2800:] ++ } ++ if len(b) > 0 { ++ a.packData(buf, b) ++ } ++ return nil ++} ++ ++func (a *authChainA) DecodePacket(b []byte) ([]byte, error) { ++ if len(b) < 9 { ++ return nil, errAuthChainLengthError ++ } ++ if !bytes.Equal(tools.HmacMD5(a.userKey, b[:len(b)-1])[:1], b[len(b)-1:]) { ++ return nil, errAuthChainChksumError ++ } ++ md5Data := tools.HmacMD5(a.Key, b[len(b)-8:len(b)-1]) ++ ++ randDataLength := udpGetRandLength(md5Data, &a.randomServer) ++ ++ key := core.Kdf(base64.StdEncoding.EncodeToString(a.userKey)+base64.StdEncoding.EncodeToString(md5Data), 16) ++ rc4Cipher, err := rc4.NewCipher(key) ++ if err != nil { ++ return nil, err ++ } ++ if randDataLength > len(b)-8 { ++ return nil, errAuthChainLengthError ++ } ++ wantedData := b[:len(b)-8-randDataLength] ++ rc4Cipher.XORKeyStream(wantedData, wantedData) ++ return wantedData, nil ++} ++ ++func (a *authChainA) EncodePacket(buf *bytes.Buffer, b []byte) error { ++ authData := pool.Get(3) ++ defer pool.Put(authData) ++ rand.Read(authData) ++ ++ md5Data := tools.HmacMD5(a.Key, authData) ++ ++ randDataLength := udpGetRandLength(md5Data, &a.randomClient) ++ ++ key := core.Kdf(base64.StdEncoding.EncodeToString(a.userKey)+base64.StdEncoding.EncodeToString(md5Data), 16) ++ rc4Cipher, err := rc4.NewCipher(key) ++ if err != nil { ++ return err ++ } ++ rc4Cipher.XORKeyStream(b, b) ++ ++ buf.Write(b) ++ tools.AppendRandBytes(buf, randDataLength) ++ buf.Write(authData) ++ binary.Write(buf, binary.LittleEndian, binary.LittleEndian.Uint32(a.userID[:])^binary.LittleEndian.Uint32(md5Data[:4])) ++ buf.Write(tools.HmacMD5(a.userKey, buf.Bytes())[:1]) ++ return nil ++} ++ ++func (a *authChainA) packAuthData(poolBuf *bytes.Buffer, data []byte) { ++ /* ++ dataLength := len(data) ++ 12: checkHead(4) and hmac of checkHead(8) ++ 4: uint32 LittleEndian uid (uid = userID ^ last client hash) ++ 16: encrypted data of authdata(12), uint16 LittleEndian overhead(2) and uint16 LittleEndian number zero(2) ++ 4: last server hash(4) ++ packedAuthDataLength := 12 + 4 + 16 + 4 + dataLength ++ */ ++ ++ macKey := pool.Get(len(a.iv) + len(a.Key)) ++ defer pool.Put(macKey) ++ copy(macKey, a.iv) ++ copy(macKey[len(a.iv):], a.Key) ++ ++ // check head ++ tools.AppendRandBytes(poolBuf, 4) ++ a.lastClientHash = tools.HmacMD5(macKey, poolBuf.Bytes()) ++ a.initRC4Cipher() ++ poolBuf.Write(a.lastClientHash[:8]) ++ // uid ++ binary.Write(poolBuf, binary.LittleEndian, binary.LittleEndian.Uint32(a.userID[:])^binary.LittleEndian.Uint32(a.lastClientHash[8:12])) ++ // encrypted data ++ err := a.putEncryptedData(poolBuf, a.userKey, [2]int{a.Overhead, 0}, a.salt) ++ if err != nil { ++ poolBuf.Reset() ++ return ++ } ++ // last server hash ++ a.lastServerHash = tools.HmacMD5(a.userKey, poolBuf.Bytes()[12:]) ++ poolBuf.Write(a.lastServerHash[:4]) ++ // packed data ++ a.packData(poolBuf, data) ++} ++ ++func (a *authChainA) packData(poolBuf *bytes.Buffer, data []byte) { ++ a.encrypter.XORKeyStream(data, data) ++ ++ macKey := pool.Get(len(a.userKey) + 4) ++ defer pool.Put(macKey) ++ copy(macKey, a.userKey) ++ binary.LittleEndian.PutUint32(macKey[len(a.userKey):], a.packID) ++ a.packID++ ++ ++ length := uint16(len(data)) ^ binary.LittleEndian.Uint16(a.lastClientHash[14:16]) ++ ++ originalLength := poolBuf.Len() ++ binary.Write(poolBuf, binary.LittleEndian, length) ++ a.putMixedRandDataAndData(poolBuf, data) ++ a.lastClientHash = tools.HmacMD5(macKey, poolBuf.Bytes()[originalLength:]) ++ poolBuf.Write(a.lastClientHash[:2]) ++} ++ ++func (a *authChainA) putMixedRandDataAndData(poolBuf *bytes.Buffer, data []byte) { ++ randDataLength := a.randDataLength(len(data), a.lastClientHash, &a.randomClient) ++ if len(data) == 0 { ++ tools.AppendRandBytes(poolBuf, randDataLength) ++ return ++ } ++ if randDataLength > 0 { ++ startPos := getRandStartPos(randDataLength, &a.randomClient) ++ tools.AppendRandBytes(poolBuf, startPos) ++ poolBuf.Write(data) ++ tools.AppendRandBytes(poolBuf, randDataLength-startPos) ++ return ++ } ++ poolBuf.Write(data) ++} ++ ++func getRandStartPos(length int, random *tools.XorShift128Plus) int { ++ if length == 0 { ++ return 0 ++ } ++ return int(int64(random.Next()%8589934609) % int64(length)) ++} ++ ++func (a *authChainA) getRandLength(length int, lastHash []byte, random *tools.XorShift128Plus) int { ++ if length > 1440 { ++ return 0 ++ } ++ random.InitFromBinAndLength(lastHash, length) ++ if length > 1300 { ++ return int(random.Next() % 31) ++ } ++ if length > 900 { ++ return int(random.Next() % 127) ++ } ++ if length > 400 { ++ return int(random.Next() % 521) ++ } ++ return int(random.Next() % 1021) ++} ++ ++func (a *authChainA) initRC4Cipher() { ++ key := core.Kdf(base64.StdEncoding.EncodeToString(a.userKey)+base64.StdEncoding.EncodeToString(a.lastClientHash), 16) ++ a.encrypter, _ = rc4.NewCipher(key) ++ a.decrypter, _ = rc4.NewCipher(key) ++} ++ ++func udpGetRandLength(lastHash []byte, random *tools.XorShift128Plus) int { ++ random.InitFromBin(lastHash) ++ return int(random.Next() % 127) ++} +--- a/proxy/shadowsocksr/protocol/auth_chain_b.go ++++ b/proxy/shadowsocksr/protocol/auth_chain_b.go +@@ -0,0 +1,99 @@ ++// SPDX-License-Identifier: GPL-3.0-or-later ++// Adapted from MetaCubeX/mihomo v1.19.32. ++package protocol ++ ++import ( ++ "net" ++ "sort" ++ ++ "github.com/xtls/xray-core/proxy/shadowsocksr/tools" ++) ++ ++func init() { ++ register("auth_chain_b", newAuthChainB, 4) ++} ++ ++type authChainB struct { ++ *authChainA ++ dataSizeList []int ++ dataSizeList2 []int ++} ++ ++func newAuthChainB(b *Base) Protocol { ++ a := &authChainB{ ++ authChainA: &authChainA{ ++ Base: b, ++ authData: &authData{}, ++ userData: &userData{}, ++ salt: "auth_chain_b", ++ }, ++ } ++ a.initUserData() ++ return a ++} ++ ++func (a *authChainB) StreamConn(c net.Conn, iv []byte) net.Conn { ++ p := &authChainB{ ++ authChainA: &authChainA{ ++ Base: a.Base, ++ authData: a.next(), ++ userData: a.userData, ++ salt: a.salt, ++ packID: 1, ++ recvID: 1, ++ }, ++ } ++ p.iv = iv ++ p.randDataLength = p.getRandLength ++ p.initDataSize() ++ return &Conn{Conn: c, Protocol: p} ++} ++ ++func (a *authChainB) initDataSize() { ++ a.dataSizeList = a.dataSizeList[:0] ++ a.dataSizeList2 = a.dataSizeList2[:0] ++ ++ a.randomServer.InitFromBin(a.Key) ++ length := a.randomServer.Next()%8 + 4 ++ for ; length > 0; length-- { ++ a.dataSizeList = append(a.dataSizeList, int(a.randomServer.Next()%2340%2040%1440)) ++ } ++ sort.Ints(a.dataSizeList) ++ ++ length = a.randomServer.Next()%16 + 8 ++ for ; length > 0; length-- { ++ a.dataSizeList2 = append(a.dataSizeList2, int(a.randomServer.Next()%2340%2040%1440)) ++ } ++ sort.Ints(a.dataSizeList2) ++} ++ ++func (a *authChainB) getRandLength(length int, lashHash []byte, random *tools.XorShift128Plus) int { ++ if length >= 1440 { ++ return 0 ++ } ++ random.InitFromBinAndLength(lashHash, length) ++ pos := sort.Search(len(a.dataSizeList), func(i int) bool { return a.dataSizeList[i] >= length+a.Overhead }) ++ finalPos := pos + int(random.Next()%uint64(len(a.dataSizeList))) ++ if finalPos < len(a.dataSizeList) { ++ return a.dataSizeList[finalPos] - length - a.Overhead ++ } ++ ++ pos = sort.Search(len(a.dataSizeList2), func(i int) bool { return a.dataSizeList2[i] >= length+a.Overhead }) ++ finalPos = pos + int(random.Next()%uint64(len(a.dataSizeList2))) ++ if finalPos < len(a.dataSizeList2) { ++ return a.dataSizeList2[finalPos] - length - a.Overhead ++ } ++ if finalPos < pos+len(a.dataSizeList2)-1 { ++ return 0 ++ } ++ if length > 1300 { ++ return int(random.Next() % 31) ++ } ++ if length > 900 { ++ return int(random.Next() % 127) ++ } ++ if length > 400 { ++ return int(random.Next() % 521) ++ } ++ return int(random.Next() % 1021) ++} +--- a/proxy/shadowsocksr/protocol/auth_sha1_v4.go ++++ b/proxy/shadowsocksr/protocol/auth_sha1_v4.go +@@ -0,0 +1,187 @@ ++// SPDX-License-Identifier: GPL-3.0-or-later ++// Adapted from MetaCubeX/mihomo v1.19.32. ++package protocol ++ ++import ( ++ "bytes" ++ "encoding/binary" ++ "hash/adler32" ++ "hash/crc32" ++ randv2 "math/rand/v2" ++ "net" ++ ++ "github.com/xtls/xray-core/proxy/shadowsocksr/pool" ++ "github.com/xtls/xray-core/proxy/shadowsocksr/tools" ++) ++ ++func init() { ++ register("auth_sha1_v4", newAuthSHA1V4, 7) ++} ++ ++type authSHA1V4 struct { ++ *Base ++ *authData ++ iv []byte ++ hasSentHeader bool ++ rawTrans bool ++} ++ ++func newAuthSHA1V4(b *Base) Protocol { ++ return &authSHA1V4{Base: b, authData: &authData{}} ++} ++ ++func (a *authSHA1V4) StreamConn(c net.Conn, iv []byte) net.Conn { ++ p := &authSHA1V4{Base: a.Base, authData: a.next()} ++ p.iv = iv ++ return &Conn{Conn: c, Protocol: p} ++} ++ ++func (a *authSHA1V4) PacketConn(c net.PacketConn) net.PacketConn { ++ return c ++} ++ ++func (a *authSHA1V4) Decode(dst, src *bytes.Buffer) error { ++ if a.rawTrans { ++ dst.ReadFrom(src) ++ return nil ++ } ++ for src.Len() > 4 { ++ if uint16(crc32.ChecksumIEEE(src.Bytes()[:2])&0xffff) != binary.LittleEndian.Uint16(src.Bytes()[2:4]) { ++ src.Reset() ++ return errAuthSHA1V4CRC32Error ++ } ++ ++ length := int(binary.BigEndian.Uint16(src.Bytes()[:2])) ++ if length >= 8192 || length < 7 { ++ a.rawTrans = true ++ src.Reset() ++ return errAuthSHA1V4LengthError ++ } ++ if length > src.Len() { ++ break ++ } ++ ++ if adler32.Checksum(src.Bytes()[:length-4]) != binary.LittleEndian.Uint32(src.Bytes()[length-4:length]) { ++ a.rawTrans = true ++ src.Reset() ++ return errAuthSHA1V4Adler32Error ++ } ++ ++ pos := int(src.Bytes()[4]) ++ if pos < 255 { ++ pos += 4 ++ } else { ++ pos = int(binary.BigEndian.Uint16(src.Bytes()[5:7])) + 4 ++ } ++ if pos < 5 || pos > length-4 { ++ return errAuthSHA1V4LengthError ++ } ++ dst.Write(src.Bytes()[pos : length-4]) ++ src.Next(length) ++ } ++ return nil ++} ++ ++func (a *authSHA1V4) Encode(buf *bytes.Buffer, b []byte) error { ++ if !a.hasSentHeader { ++ dataLength := getDataLength(b) ++ ++ a.packAuthData(buf, b[:dataLength]) ++ b = b[dataLength:] ++ ++ a.hasSentHeader = true ++ } ++ for len(b) > 8100 { ++ a.packData(buf, b[:8100]) ++ b = b[8100:] ++ } ++ if len(b) > 0 { ++ a.packData(buf, b) ++ } ++ ++ return nil ++} ++ ++func (a *authSHA1V4) DecodePacket(b []byte) ([]byte, error) { return b, nil } ++ ++func (a *authSHA1V4) EncodePacket(buf *bytes.Buffer, b []byte) error { ++ buf.Write(b) ++ return nil ++} ++ ++func (a *authSHA1V4) packData(poolBuf *bytes.Buffer, data []byte) { ++ dataLength := len(data) ++ randDataLength := a.getRandDataLength(dataLength) ++ /* ++ 2: uint16 BigEndian packedDataLength ++ 2: uint16 LittleEndian crc32Data & 0xffff ++ 3: maxRandDataLengthPrefix (min:1) ++ 4: adler32Data ++ */ ++ packedDataLength := 2 + 2 + 3 + randDataLength + dataLength + 4 ++ if randDataLength < 128 { ++ packedDataLength -= 2 ++ } ++ ++ binary.Write(poolBuf, binary.BigEndian, uint16(packedDataLength)) ++ binary.Write(poolBuf, binary.LittleEndian, uint16(crc32.ChecksumIEEE(poolBuf.Bytes()[poolBuf.Len()-2:])&0xffff)) ++ a.packRandData(poolBuf, randDataLength) ++ poolBuf.Write(data) ++ binary.Write(poolBuf, binary.LittleEndian, adler32.Checksum(poolBuf.Bytes()[poolBuf.Len()-packedDataLength+4:])) ++} ++ ++func (a *authSHA1V4) packAuthData(poolBuf *bytes.Buffer, data []byte) { ++ dataLength := len(data) ++ randDataLength := a.getRandDataLength(12 + dataLength) ++ /* ++ 2: uint16 BigEndian packedAuthDataLength ++ 4: uint32 LittleEndian crc32Data ++ 3: maxRandDataLengthPrefix (min: 1) ++ 12: authDataLength ++ 10: hmacSHA1DataLength ++ */ ++ packedAuthDataLength := 2 + 4 + 3 + randDataLength + 12 + dataLength + 10 ++ if randDataLength < 128 { ++ packedAuthDataLength -= 2 ++ } ++ ++ salt := []byte("auth_sha1_v4") ++ crcData := pool.Get(len(salt) + len(a.Key) + 2) ++ defer pool.Put(crcData) ++ binary.BigEndian.PutUint16(crcData, uint16(packedAuthDataLength)) ++ copy(crcData[2:], salt) ++ copy(crcData[2+len(salt):], a.Key) ++ ++ key := pool.Get(len(a.iv) + len(a.Key)) ++ defer pool.Put(key) ++ copy(key, a.iv) ++ copy(key[len(a.iv):], a.Key) ++ ++ poolBuf.Write(crcData[:2]) ++ binary.Write(poolBuf, binary.LittleEndian, crc32.ChecksumIEEE(crcData)) ++ a.packRandData(poolBuf, randDataLength) ++ a.putAuthData(poolBuf) ++ poolBuf.Write(data) ++ poolBuf.Write(tools.HmacSHA1(key, poolBuf.Bytes()[poolBuf.Len()-packedAuthDataLength+10:])[:10]) ++} ++ ++func (a *authSHA1V4) packRandData(poolBuf *bytes.Buffer, size int) { ++ if size < 128 { ++ poolBuf.WriteByte(byte(size + 1)) ++ tools.AppendRandBytes(poolBuf, size) ++ return ++ } ++ poolBuf.WriteByte(255) ++ binary.Write(poolBuf, binary.BigEndian, uint16(size+3)) ++ tools.AppendRandBytes(poolBuf, size) ++} ++ ++func (a *authSHA1V4) getRandDataLength(size int) int { ++ if size > 1200 { ++ return 0 ++ } ++ if size > 400 { ++ return randv2.IntN(256) ++ } ++ return randv2.IntN(512) ++} +--- a/proxy/shadowsocksr/protocol/base.go ++++ b/proxy/shadowsocksr/protocol/base.go +@@ -0,0 +1,80 @@ ++// SPDX-License-Identifier: GPL-3.0-or-later ++// Adapted from MetaCubeX/mihomo v1.19.32. ++package protocol ++ ++import ( ++ "bytes" ++ "crypto/aes" ++ "crypto/cipher" ++ "crypto/rand" ++ "encoding/base64" ++ "encoding/binary" ++ "log" ++ randv2 "math/rand/v2" ++ "sync" ++ "time" ++ ++ core "github.com/xtls/xray-core/proxy/shadowsocksr/cipher" ++ "github.com/xtls/xray-core/proxy/shadowsocksr/pool" ++) ++ ++type Base struct { ++ Key []byte ++ Overhead int ++ Param string ++} ++ ++type userData struct { ++ userKey []byte ++ userID [4]byte ++} ++ ++type authData struct { ++ clientID [4]byte ++ connectionID uint32 ++ mutex sync.Mutex ++} ++ ++func (a *authData) next() *authData { ++ r := &authData{} ++ a.mutex.Lock() ++ defer a.mutex.Unlock() ++ if a.connectionID > 0xff000000 || a.connectionID == 0 { ++ rand.Read(a.clientID[:]) ++ a.connectionID = randv2.Uint32() & 0xffffff ++ } ++ a.connectionID++ ++ copy(r.clientID[:], a.clientID[:]) ++ r.connectionID = a.connectionID ++ return r ++} ++ ++func (a *authData) putAuthData(buf *bytes.Buffer) { ++ binary.Write(buf, binary.LittleEndian, uint32(time.Now().Unix())) ++ buf.Write(a.clientID[:]) ++ binary.Write(buf, binary.LittleEndian, a.connectionID) ++} ++ ++func (a *authData) putEncryptedData(b *bytes.Buffer, userKey []byte, paddings [2]int, salt string) error { ++ encrypt := pool.Get(16) ++ defer pool.Put(encrypt) ++ binary.LittleEndian.PutUint32(encrypt, uint32(time.Now().Unix())) ++ copy(encrypt[4:], a.clientID[:]) ++ binary.LittleEndian.PutUint32(encrypt[8:], a.connectionID) ++ binary.LittleEndian.PutUint16(encrypt[12:], uint16(paddings[0])) ++ binary.LittleEndian.PutUint16(encrypt[14:], uint16(paddings[1])) ++ ++ cipherKey := core.Kdf(base64.StdEncoding.EncodeToString(userKey)+salt, 16) ++ block, err := aes.NewCipher(cipherKey) ++ if err != nil { ++ log.Printf("New cipher error: %s", err.Error()) ++ return err ++ } ++ iv := bytes.Repeat([]byte{0}, 16) ++ cbcCipher := cipher.NewCBCEncrypter(block, iv) ++ ++ cbcCipher.CryptBlocks(encrypt, encrypt) ++ ++ b.Write(encrypt) ++ return nil ++} +--- a/proxy/shadowsocksr/protocol/origin.go ++++ b/proxy/shadowsocksr/protocol/origin.go +@@ -0,0 +1,35 @@ ++// SPDX-License-Identifier: GPL-3.0-or-later ++// Adapted from MetaCubeX/mihomo v1.19.32. ++package protocol ++ ++import ( ++ "bytes" ++ "net" ++) ++ ++type origin struct{} ++ ++func init() { register("origin", newOrigin, 0) } ++ ++func newOrigin(b *Base) Protocol { return &origin{} } ++ ++func (o *origin) StreamConn(c net.Conn, iv []byte) net.Conn { return c } ++ ++func (o *origin) PacketConn(c net.PacketConn) net.PacketConn { return c } ++ ++func (o *origin) Decode(dst, src *bytes.Buffer) error { ++ dst.ReadFrom(src) ++ return nil ++} ++ ++func (o *origin) Encode(buf *bytes.Buffer, b []byte) error { ++ buf.Write(b) ++ return nil ++} ++ ++func (o *origin) DecodePacket(b []byte) ([]byte, error) { return b, nil } ++ ++func (o *origin) EncodePacket(buf *bytes.Buffer, b []byte) error { ++ buf.Write(b) ++ return nil ++} +--- a/proxy/shadowsocksr/protocol/packet.go ++++ b/proxy/shadowsocksr/protocol/packet.go +@@ -0,0 +1,38 @@ ++// SPDX-License-Identifier: GPL-3.0-or-later ++// Adapted from MetaCubeX/mihomo v1.19.32. ++package protocol ++ ++import ( ++ "net" ++ ++ "github.com/xtls/xray-core/proxy/shadowsocksr/pool" ++) ++ ++type PacketConn struct { ++ net.PacketConn ++ Protocol ++} ++ ++func (c *PacketConn) WriteTo(b []byte, addr net.Addr) (int, error) { ++ buf := pool.GetBuffer() ++ defer pool.PutBuffer(buf) ++ err := c.EncodePacket(buf, b) ++ if err != nil { ++ return 0, err ++ } ++ _, err = c.PacketConn.WriteTo(buf.Bytes(), addr) ++ return len(b), err ++} ++ ++func (c *PacketConn) ReadFrom(b []byte) (int, net.Addr, error) { ++ n, addr, err := c.PacketConn.ReadFrom(b) ++ if err != nil { ++ return n, addr, err ++ } ++ decoded, err := c.DecodePacket(b[:n]) ++ if err != nil { ++ return n, addr, err ++ } ++ copy(b, decoded) ++ return len(decoded), addr, nil ++} +--- a/proxy/shadowsocksr/protocol/protocol.go ++++ b/proxy/shadowsocksr/protocol/protocol.go +@@ -0,0 +1,78 @@ ++// SPDX-License-Identifier: GPL-3.0-or-later ++// Adapted from MetaCubeX/mihomo v1.19.32. ++package protocol ++ ++import ( ++ "bytes" ++ "errors" ++ "fmt" ++ randv2 "math/rand/v2" ++ "net" ++) ++ ++var ( ++ errAuthSHA1V4CRC32Error = errors.New("auth_sha1_v4 decode data wrong crc32") ++ errAuthSHA1V4LengthError = errors.New("auth_sha1_v4 decode data wrong length") ++ errAuthSHA1V4Adler32Error = errors.New("auth_sha1_v4 decode data wrong adler32") ++ errAuthAES128MACError = errors.New("auth_aes128 decode data wrong mac") ++ errAuthAES128LengthError = errors.New("auth_aes128 decode data wrong length") ++ errAuthAES128ChksumError = errors.New("auth_aes128 decode data wrong checksum") ++ errAuthChainLengthError = errors.New("auth_chain decode data wrong length") ++ errAuthChainChksumError = errors.New("auth_chain decode data wrong checksum") ++) ++ ++type Protocol interface { ++ StreamConn(net.Conn, []byte) net.Conn ++ PacketConn(net.PacketConn) net.PacketConn ++ Decode(dst, src *bytes.Buffer) error ++ Encode(buf *bytes.Buffer, b []byte) error ++ DecodePacket([]byte) ([]byte, error) ++ EncodePacket(buf *bytes.Buffer, b []byte) error ++} ++ ++type protocolCreator func(b *Base) Protocol ++ ++var protocolList = make(map[string]struct { ++ overhead int ++ new protocolCreator ++}) ++ ++func register(name string, c protocolCreator, o int) { ++ protocolList[name] = struct { ++ overhead int ++ new protocolCreator ++ }{overhead: o, new: c} ++} ++ ++func PickProtocol(name string, b *Base) (Protocol, error) { ++ if choice, ok := protocolList[name]; ok { ++ b.Overhead += choice.overhead ++ return choice.new(b), nil ++ } ++ return nil, fmt.Errorf("protocol %s not supported", name) ++} ++ ++func getHeadSize(b []byte, defaultValue int) int { ++ if len(b) < 2 { ++ return defaultValue ++ } ++ headType := b[0] & 7 ++ switch headType { ++ case 1: ++ return 7 ++ case 4: ++ return 19 ++ case 3: ++ return 4 + int(b[1]) ++ } ++ return defaultValue ++} ++ ++func getDataLength(b []byte) int { ++ bLength := len(b) ++ dataLength := getHeadSize(b, 30) + randv2.IntN(32) ++ if bLength < dataLength { ++ return bLength ++ } ++ return dataLength ++} +--- a/proxy/shadowsocksr/protocol/server.go ++++ b/proxy/shadowsocksr/protocol/server.go +@@ -0,0 +1,338 @@ ++// SPDX-License-Identifier: GPL-3.0-or-later ++// Server framing complements the Mihomo client implementation. Wire format ++// checked against shadowsocksrr/shadowsocksr obfsplugin auth and auth_chain. ++package protocol ++ ++import ( ++ "crypto/aes" ++ "crypto/cipher" ++ "crypto/hmac" ++ "crypto/rand" ++ "crypto/rc4" ++ "encoding/base64" ++ "encoding/binary" ++ "errors" ++ "fmt" ++ core "github.com/xtls/xray-core/proxy/shadowsocksr/cipher" ++ "github.com/xtls/xray-core/proxy/shadowsocksr/tools" ++ "hash/crc32" ++ "io" ++ "net" ++ "strconv" ++ "strings" ++ "sync" ++ "time" ++) ++ ++var errServerAuth = errors.New("shadowsocksr: invalid authentication or framing") ++ ++// ReplayCache is per listener and bounded. Fail closed at capacity; entries ++// remain until their timestamp can no longer pass the authentication window. ++type ReplayCache struct { ++ mu sync.Mutex ++ entries map[string]int64 ++ sweep int64 ++} ++ ++func (r *ReplayCache) Accept(token []byte, timestamp int64) bool { ++ now := time.Now().Unix() ++ if timestamp < now-300 || timestamp > now+300 { ++ return false ++ } ++ r.mu.Lock() ++ defer r.mu.Unlock() ++ if r.entries == nil { ++ r.entries = make(map[string]int64) ++ } ++ if now > r.sweep { ++ for k, t := range r.entries { ++ if t < now { ++ delete(r.entries, k) ++ } ++ } ++ r.sweep = now + 30 ++ } ++ k := string(token) ++ if _, ok := r.entries[k]; ok { ++ return false ++ } ++ if len(r.entries) >= 65536 { ++ return false ++ } ++ r.entries[k] = timestamp + 301 ++ return true ++} ++ ++// ServerUsers accepts the traditional "max_clients#uid:password,..." form. ++// The max_clients prefix is checked but the listener uses a bounded replay cache. ++func ServerUsers(param string) (map[uint32][]byte, error) { ++ users := map[uint32][]byte{} ++ if param == "" { ++ return users, nil ++ } ++ if a, b, ok := strings.Cut(param, "#"); ok { ++ n, e := strconv.ParseUint(a, 10, 32) ++ if e != nil || n == 0 { ++ return nil, errServerAuth ++ } ++ param = b ++ } else if !strings.Contains(param, ":") { ++ n, e := strconv.ParseUint(param, 10, 32) ++ if e != nil || n == 0 { ++ return nil, errServerAuth ++ } ++ return users, nil ++ } ++ for _, v := range strings.Split(param, ",") { ++ id, p, ok := strings.Cut(v, ":") ++ n, e := strconv.ParseUint(id, 10, 32) ++ if !ok || e != nil || p == "" || users[uint32(n)] != nil { ++ return nil, errServerAuth ++ } ++ users[uint32(n)] = []byte(p) ++ } ++ return users, nil ++} ++func serverUser(key []byte, users map[uint32][]byte, id uint32, hash hashDigestMethod) ([]byte, error) { ++ if len(users) == 0 { ++ return key, nil ++ } ++ p, ok := users[id] ++ if !ok { ++ return nil, errServerAuth ++ } ++ if hash != nil { ++ return hash(p), nil ++ } ++ return p, nil ++} ++func authBlock(b, key []byte, salt string) []byte { ++ block, _ := aes.NewCipher(core.Kdf(base64.StdEncoding.EncodeToString(key)+salt, 16)) ++ out := make([]byte, 16) ++ cipher.NewCBCDecrypter(block, make([]byte, 16)).CryptBlocks(out, b) ++ return out ++} ++func acceptAuth(cache *ReplayCache, head, user []byte) bool { ++ token := append(append([]byte{}, user...), head[4:12]...) ++ return cache.Accept(token, int64(binary.LittleEndian.Uint32(head))) ++} ++func readN(c io.Reader, n int) ([]byte, error) { ++ b := make([]byte, n) ++ _, e := io.ReadFull(c, b) ++ return b, e ++} ++ ++// AcceptServer completes authentication before exposing a stream to routing. ++func AcceptServer(c net.Conn, name string, b *Base, iv []byte, users map[uint32][]byte, cache *ReplayCache) (net.Conn, error) { ++ if name == "origin" { ++ return c, nil ++ } ++ p, e := PickProtocol(name, b) ++ if e != nil { ++ return nil, e ++ } ++ var data []byte ++ switch a := p.(type) { ++ case *authSHA1V4: ++ head, e := readN(c, 7) ++ if e != nil { ++ return nil, e ++ } ++ n := int(binary.BigEndian.Uint16(head)) ++ if n < 29 || n >= 8192 { ++ return nil, errServerAuth ++ } ++ check := append(append(append([]byte{}, head[:2]...), []byte(name)...), b.Key...) ++ if binary.LittleEndian.Uint32(head[2:6]) != crc32.ChecksumIEEE(check) { ++ return nil, errServerAuth ++ } ++ rest, e := readN(c, n-7) ++ if e != nil { ++ return nil, e ++ } ++ head = append(head, rest...) ++ if !hmac.Equal(tools.HmacSHA1(append(append([]byte{}, iv...), b.Key...), head[:n-10])[:10], head[n-10:]) { ++ return nil, errServerAuth ++ } ++ pos := 6 + int(head[6]) ++ if head[6] == 255 { ++ pos = 6 + int(binary.BigEndian.Uint16(head[7:9])) ++ } ++ if pos < 7 || pos+12 > n-10 || !acceptAuth(cache, head[pos:pos+12], nil) { ++ return nil, errServerAuth ++ } ++ data = append([]byte{}, head[pos+12:n-10]...) ++ a.hasSentHeader = true ++ case *authAES128: ++ head, e := readN(c, 31) ++ if e != nil { ++ return nil, e ++ } ++ macKey := append(append([]byte{}, iv...), b.Key...) ++ if !hmac.Equal(a.hmac(macKey, head[:1])[:6], head[1:7]) || !hmac.Equal(a.hmac(macKey, head[7:27])[:4], head[27:31]) { ++ return nil, fmt.Errorf("%w: AES header MAC (prefix=%t body=%t)", errServerAuth, hmac.Equal(a.hmac(macKey, head[:1])[:6], head[1:7]), hmac.Equal(a.hmac(macKey, head[7:27])[:4], head[27:31])) ++ } ++ a.userKey, e = serverUser(b.Key, users, binary.LittleEndian.Uint32(head[7:11]), a.hashDigest) ++ if e != nil { ++ return nil, e ++ } ++ plain := authBlock(head[11:27], a.userKey, a.salt) ++ n := int(binary.LittleEndian.Uint16(plain[12:])) ++ padding := int(binary.LittleEndian.Uint16(plain[14:])) ++ if n < 35 || n >= 8192 || padding > n-35 { ++ return nil, fmt.Errorf("%w: AES header lengths", errServerAuth) ++ } ++ rest, e := readN(c, n-31) ++ if e != nil { ++ return nil, e ++ } ++ head = append(head, rest...) ++ if !hmac.Equal(a.hmac(a.userKey, head[:n-4])[:4], head[n-4:]) { ++ return nil, fmt.Errorf("%w: AES packet checksum", errServerAuth) ++ } ++ if !acceptAuth(cache, plain, head[7:11]) { ++ return nil, fmt.Errorf("%w: replay or timestamp", errServerAuth) ++ } ++ data = append([]byte{}, head[31+padding:n-4]...) ++ a.hasSentHeader = true ++ a.packID = 1 ++ a.recvID = 1 ++ case *authChainA: ++ if e = acceptChain(c, a, nil, iv, users, cache); e != nil { ++ return nil, e ++ } ++ case *authChainB: ++ if e = acceptChain(c, a.authChainA, a, iv, users, cache); e != nil { ++ return nil, e ++ } ++ default: ++ return nil, errServerAuth ++ } ++ conn := &Conn{Conn: c, Protocol: p} ++ conn.decoded.Write(data) ++ return conn, nil ++} ++func acceptChain(c net.Conn, a *authChainA, b *authChainB, iv []byte, users map[uint32][]byte, cache *ReplayCache) error { ++ head, e := readN(c, 36) ++ if e != nil { ++ return e ++ } ++ ch := tools.HmacMD5(append(append([]byte{}, iv...), a.Key...), head[:4]) ++ if !hmac.Equal(ch[:8], head[4:12]) { ++ return errServerAuth ++ } ++ id := binary.LittleEndian.Uint32(head[12:16]) ^ binary.LittleEndian.Uint32(ch[8:12]) ++ a.userKey, e = serverUser(a.Key, users, id, nil) ++ if e != nil { ++ return e ++ } ++ sh := tools.HmacMD5(a.userKey, head[12:32]) ++ if !hmac.Equal(sh[:4], head[32:36]) { ++ return errServerAuth ++ } ++ plain := authBlock(head[16:32], a.userKey, a.salt) ++ var uid [4]byte ++ binary.LittleEndian.PutUint32(uid[:], id) ++ overhead := int(binary.LittleEndian.Uint16(plain[12:])) ++ if overhead < 4 || overhead > 1024 || binary.LittleEndian.Uint16(plain[14:]) != 0 || !acceptAuth(cache, plain, uid[:]) { ++ return errServerAuth ++ } ++ a.Overhead = overhead ++ a.lastClientHash = ch ++ a.initRC4Cipher() ++ // Client-oriented codec fields become transmit/receive hashes on the server. ++ a.lastClientHash = sh ++ a.lastServerHash = ch ++ a.packID = 1 ++ a.recvID = 1 ++ a.hasSentHeader = true ++ a.serverSide = true ++ a.randDataLength = a.getRandLength ++ if b != nil { ++ b.initDataSize() ++ a.randDataLength = b.getRandLength ++ } ++ return nil ++} ++ ++// Packet decoding is stateless per datagram; return a response encoder bound to ++// the authenticated user so concurrent users cannot share mutable cipher state. ++func DecodeServerPacket(name string, key []byte, users map[uint32][]byte, b []byte) ([]byte, func([]byte) ([]byte, error), error) { ++ identity := func(p []byte) ([]byte, error) { return p, nil } ++ switch name { ++ case "origin", "auth_sha1_v4": ++ return b, identity, nil ++ case "auth_aes128_md5", "auth_aes128_sha1": ++ if len(b) < 8 { ++ return nil, nil, errServerAuth ++ } ++ hm := tools.HmacSHA1 ++ hash := tools.SHA1Sum ++ if name == "auth_aes128_md5" { ++ hm = tools.HmacMD5 ++ hash = tools.MD5Sum ++ } ++ uk, e := serverUser(key, users, binary.LittleEndian.Uint32(b[len(b)-8:]), hash) ++ if e != nil { ++ return nil, nil, e ++ } ++ if !hmac.Equal(hm(uk, b[:len(b)-4])[:4], b[len(b)-4:]) { ++ return nil, nil, errServerAuth ++ } ++ return b[:len(b)-8], func(p []byte) ([]byte, error) { return append(p, hm(key, p)[:4]...), nil }, nil ++ case "auth_chain_a", "auth_chain_b": ++ if len(b) < 8 { ++ return nil, nil, errServerAuth ++ } ++ digest := tools.HmacMD5(key, b[len(b)-8:len(b)-5]) ++ id := binary.LittleEndian.Uint32(b[len(b)-5:]) ^ binary.LittleEndian.Uint32(digest) ++ uk, e := serverUser(key, users, id, nil) ++ if e != nil { ++ return nil, nil, e ++ } ++ if !hmac.Equal(tools.HmacMD5(uk, b[:len(b)-1])[:1], b[len(b)-1:]) { ++ return nil, nil, errServerAuth ++ } ++ var random tools.XorShift128Plus ++ padding := udpGetRandLength(digest, &random) ++ if padding > len(b)-8 { ++ return nil, nil, errServerAuth ++ } ++ p := b[:len(b)-8-padding] ++ crypt, _ := rc4.NewCipher(core.Kdf(base64.StdEncoding.EncodeToString(uk)+base64.StdEncoding.EncodeToString(digest), 16)) ++ crypt.XORKeyStream(p, p) ++ return p, func(p []byte) ([]byte, error) { ++ auth := make([]byte, 7) ++ if _, e := rand.Read(auth); e != nil { ++ return nil, e ++ } ++ d := tools.HmacMD5(key, auth) ++ var r tools.XorShift128Plus ++ n := udpGetRandLength(d, &r) ++ out := make([]byte, len(p)+n) ++ crypt, _ := rc4.NewCipher(core.Kdf(base64.StdEncoding.EncodeToString(uk)+base64.StdEncoding.EncodeToString(d), 16)) ++ crypt.XORKeyStream(out, p) ++ rand.Read(out[len(p):]) ++ out = append(out, auth...) ++ return append(out, tools.HmacMD5(uk, out)[:1]...), nil ++ }, nil ++ } ++ return nil, nil, errServerAuth ++} ++ ++func ServerPacketUserID(name string, key, b []byte) (uint32, error) { ++ switch name { ++ case "auth_aes128_md5", "auth_aes128_sha1": ++ if len(b) < 8 { ++ return 0, errServerAuth ++ } ++ return binary.LittleEndian.Uint32(b[len(b)-8:]), nil ++ case "auth_chain_a", "auth_chain_b": ++ if len(b) < 8 { ++ return 0, errServerAuth ++ } ++ h := tools.HmacMD5(key, b[len(b)-8:len(b)-5]) ++ return binary.LittleEndian.Uint32(b[len(b)-5:]) ^ binary.LittleEndian.Uint32(h), nil ++ } ++ return 0, nil ++} +--- a/proxy/shadowsocksr/protocol/stream.go ++++ b/proxy/shadowsocksr/protocol/stream.go +@@ -0,0 +1,60 @@ ++// SPDX-License-Identifier: GPL-3.0-or-later ++// Adapted from MetaCubeX/mihomo v1.19.32. ++package protocol ++ ++import ( ++ "bytes" ++ "io" ++ "net" ++ ++ "github.com/xtls/xray-core/proxy/shadowsocksr/pool" ++) ++ ++type Conn struct { ++ net.Conn ++ Protocol ++ decoded bytes.Buffer ++ underDecoded bytes.Buffer ++ readErr error ++} ++ ++func (c *Conn) Read(b []byte) (int, error) { ++ if len(b) == 0 { ++ return 0, nil ++ } ++ for c.decoded.Len() == 0 { ++ if c.readErr != nil { ++ if c.underDecoded.Len() > 0 && c.readErr == io.EOF { ++ return 0, io.ErrUnexpectedEOF ++ } ++ return 0, c.readErr ++ } ++ data := pool.Get(pool.RelayBufferSize) ++ n, err := c.Conn.Read(data) ++ c.readErr = err ++ c.underDecoded.Write(data[:n]) ++ pool.Put(data) ++ if err := c.Decode(&c.decoded, &c.underDecoded); err != nil { ++ return 0, err ++ } ++ } ++ return c.decoded.Read(b) ++} ++ ++func (c *Conn) Write(b []byte) (int, error) { ++ bLength := len(b) ++ buf := pool.GetBuffer() ++ defer pool.PutBuffer(buf) ++ err := c.Encode(buf, b) ++ if err != nil { ++ return 0, err ++ } ++ n, err := c.Conn.Write(buf.Bytes()) ++ if err == nil && n != buf.Len() { ++ err = io.ErrShortWrite ++ } ++ if err != nil { ++ return 0, err ++ } ++ return bLength, nil ++} +--- a/proxy/shadowsocksr/relay.go ++++ b/proxy/shadowsocksr/relay.go +@@ -0,0 +1,60 @@ ++package shadowsocksr ++ ++import ( ++ "context" ++ "github.com/xtls/xray-core/common" ++ "github.com/xtls/xray-core/common/buf" ++ "github.com/xtls/xray-core/common/signal" ++ "github.com/xtls/xray-core/features/policy" ++) ++ ++// Stop blocked reads and join both copy loops before releasing stream state. ++func relay(ctx context.Context, upR buf.Reader, upW buf.Writer, downR buf.Reader, downW buf.Writer, stopIO func(), p policy.Session) error { ++ ctx, cancel := context.WithCancel(ctx) ++ defer cancel() ++ timer := signal.CancelAfterInactivity(ctx, cancel, p.Timeouts.ConnectionIdle) ++ defer timer.SetTimeout(0) ++ results := make(chan error, 2) ++ go func() { ++ e := buf.Copy(upR, upW, buf.UpdateActivity(timer)) ++ if e == nil { ++ common.Close(upW) ++ } ++ timer.SetTimeout(p.Timeouts.DownlinkOnly) ++ results <- e ++ }() ++ go func() { ++ e := buf.Copy(downR, downW, buf.UpdateActivity(timer)) ++ if e == nil { ++ common.Close(downW) ++ } ++ timer.SetTimeout(p.Timeouts.UplinkOnly) ++ results <- e ++ }() ++ var first error ++ count := 0 ++ for count < 2 { ++ select { ++ case e := <-results: ++ count++ ++ if e != nil { ++ first = e ++ } ++ case <-ctx.Done(): ++ first = ctx.Err() ++ } ++ if first != nil || count == 2 { ++ break ++ } ++ } ++ stopIO() ++ common.Interrupt(upR) ++ common.Interrupt(upW) ++ common.Interrupt(downR) ++ common.Interrupt(downW) ++ for count < 2 { ++ <-results ++ count++ ++ } ++ return first ++} +--- a/proxy/shadowsocksr/server.go ++++ b/proxy/shadowsocksr/server.go +@@ -0,0 +1,240 @@ ++package shadowsocksr ++ ++import ( ++ "bytes" ++ "context" ++ M "github.com/sagernet/sing/common/metadata" ++ "github.com/xtls/xray-core/common" ++ "github.com/xtls/xray-core/common/buf" ++ "github.com/xtls/xray-core/common/errors" ++ "github.com/xtls/xray-core/common/net" ++ "github.com/xtls/xray-core/common/protocol" ++ udp_proto "github.com/xtls/xray-core/common/protocol/udp" ++ "github.com/xtls/xray-core/common/session" ++ "github.com/xtls/xray-core/core" ++ "github.com/xtls/xray-core/features/policy" ++ "github.com/xtls/xray-core/features/routing" ++ C "github.com/xtls/xray-core/proxy/shadowsocksr/cipher" ++ O "github.com/xtls/xray-core/proxy/shadowsocksr/obfs" ++ P "github.com/xtls/xray-core/proxy/shadowsocksr/protocol" ++ "github.com/xtls/xray-core/proxy/shadowsocksr/shadowstream" ++ "github.com/xtls/xray-core/transport/internet/stat" ++ "github.com/xtls/xray-core/transport/internet/udp" ++ "io" ++ "strings" ++ "time" ++) ++ ++type Server struct { ++ config *ServerConfig ++ cipher C.Cipher ++ key []byte ++ users map[uint32][]byte ++ overhead int ++ policy policy.Session ++ replay, obfsReplay P.ReplayCache ++} ++ ++func ValidateServer(c *ServerConfig) error { _, e := newServer(c); return e } ++func newServer(c *ServerConfig) (*Server, error) { ++ if c.Password == "" { ++ return nil, errors.New("shadowsocksr: password required") ++ } ++ for _, n := range c.Network { ++ if n != net.Network_TCP && n != net.Network_UDP { ++ return nil, errors.New("shadowsocksr: invalid network") ++ } ++ } ++ cipher, e := C.PickCipher(c.Method, nil, c.Password) ++ if e != nil { ++ return nil, e ++ } ++ key := C.Kdf(c.Password, 16) ++ ivSize := 0 ++ if sc, ok := cipher.(*C.StreamCipher); ok { ++ key = sc.Key ++ ivSize = sc.IVSize() ++ } ++ _, overhead, e := O.PickObfs(c.Obfs, &O.Base{Key: key, IVSize: ivSize}) ++ if e != nil { ++ return nil, e ++ } ++ if _, e = P.PickProtocol(c.Protocol, &P.Base{Key: key, Overhead: overhead}); e != nil { ++ return nil, e ++ } ++ users, e := P.ServerUsers(c.ProtocolParam) ++ if e != nil { ++ return nil, e ++ } ++ if len(users) > 0 && !strings.HasPrefix(c.Protocol, "auth_aes128_") && !strings.HasPrefix(c.Protocol, "auth_chain_") { ++ return nil, errors.New("shadowsocksr: protocol does not support users") ++ } ++ return &Server{config: c, cipher: cipher, key: key, users: users, overhead: overhead}, nil ++} ++func NewServer(ctx context.Context, c *ServerConfig) (*Server, error) { ++ s, e := newServer(c) ++ if e != nil { ++ return nil, e ++ } ++ s.policy = core.MustFromContext(ctx).GetFeature(policy.ManagerType()).(policy.Manager).ForLevel(c.Level) ++ return s, nil ++} ++func (s *Server) Network() []net.Network { ++ if len(s.config.Network) == 0 { ++ return []net.Network{net.Network_TCP} ++ } ++ return s.config.Network ++} ++func (s *Server) Process(ctx context.Context, network net.Network, conn stat.Connection, d routing.Dispatcher) error { ++ defer conn.Close() ++ ctx, cancel := context.WithCancel(ctx) ++ defer cancel() ++ done := make(chan struct{}) ++ stop := context.AfterFunc(ctx, func() { conn.Close(); close(done) }) ++ defer func() { ++ if !stop() { ++ <-done ++ } ++ }() ++ if in := session.InboundFromContext(ctx); in != nil { ++ cp := *in ++ cp.Name = "shadowsocksr" ++ cp.CanSpliceCopy = 3 ++ cp.User = &protocol.MemoryUser{Level: s.config.Level} ++ ctx = session.ContextWithInbound(ctx, &cp) ++ } ++ if network == net.Network_UDP { ++ return s.processUDP(ctx, conn, d) ++ } ++ if network != net.Network_TCP { ++ return errors.New("shadowsocksr: invalid network") ++ } ++ deadline := time.Now().Add(s.policy.Timeouts.Handshake) ++ conn.SetDeadline(deadline) ++ stream, e := O.AcceptServer(conn, s.config.Obfs, s.key, s.config.ObfsParam, &s.obfsReplay, deadline) ++ if e != nil { ++ return e ++ } ++ stream = s.cipher.StreamConn(stream) ++ var iv []byte ++ if sc, ok := stream.(*shadowstream.Conn); ok { ++ iv, e = sc.ObtainReadIV() ++ if e != nil { ++ return e ++ } ++ } ++ stream, e = P.AcceptServer(stream, s.config.Protocol, &P.Base{Key: s.key, Overhead: s.overhead}, iv, s.users, &s.replay) ++ if e != nil { ++ return e ++ } ++ addr, e := M.SocksaddrSerializer.ReadAddrPort(stream) ++ if e != nil { ++ return e ++ } ++ target := net.TCPDestination(net.ParseAddress(addr.AddrString()), net.Port(addr.Port)) ++ if !target.IsValid() || target.Port == 0 { ++ return errors.New("shadowsocksr: invalid destination") ++ } ++ conn.SetDeadline(time.Time{}) ++ link, e := d.Dispatch(ctx, target) ++ if e != nil { ++ return e ++ } ++ return relay(ctx, buf.NewReader(stream), link.Writer, link.Reader, buf.NewWriter(stream), func() { conn.Close() }, s.policy) ++} ++func (s *Server) processUDP(ctx context.Context, conn stat.Connection, d routing.Dispatcher) error { ++ var encoder func([]byte) ([]byte, error) ++ var userID uint32 ++ haveUser := false ++ // One UDP source is bound to its first authenticated user. The dispatcher ++ // preserves per-packet destinations; the response encoder is immutable. ++ var dispatch *udp.Dispatcher ++ defer func() { ++ if dispatch != nil { ++ dispatch.RemoveRay() ++ } ++ }() ++ reader := buf.NewPacketReader(conn) ++ var pending buf.MultiBuffer ++ defer func() { buf.ReleaseMulti(pending) }() ++ for { ++ conn.SetReadDeadline(time.Now().Add(s.policy.Timeouts.ConnectionIdle)) ++ var e error ++ if len(pending) == 0 { ++ pending, e = reader.ReadMultiBuffer() ++ } ++ if e != nil { ++ if e == io.EOF { ++ return nil ++ } ++ return e ++ } ++ if len(pending) == 0 { ++ continue ++ } ++ packet := append([]byte{}, pending[0].Bytes()...) ++ pending[0].Release() ++ pending = pending[1:] ++ if sc, ok := s.cipher.(*C.StreamCipher); ok { ++ packet, e = shadowstream.UnpackInplace(packet, sc) ++ if e != nil { ++ continue ++ } ++ } ++ uid, e := P.ServerPacketUserID(s.config.Protocol, s.key, packet) ++ if e != nil { ++ continue ++ } ++ if len(s.users) == 0 { ++ uid = 0 ++ } ++ if haveUser && uid != userID { ++ continue ++ } ++ payload, encode, e := P.DecodeServerPacket(s.config.Protocol, s.key, s.users, packet) ++ if e != nil { ++ continue ++ } ++ r := bytes.NewReader(payload) ++ addr, e := M.SocksaddrSerializer.ReadAddrPort(r) ++ if e != nil { ++ continue ++ } ++ target := net.UDPDestination(net.ParseAddress(addr.AddrString()), net.Port(addr.Port)) ++ if !target.IsValid() || target.Port == 0 { ++ continue ++ } ++ if !haveUser { ++ encoder = encode ++ userID = uid ++ haveUser = true ++ dispatch = udp.NewDispatcher(d, func(_ context.Context, p *udp_proto.Packet) { ++ defer p.Payload.Release() ++ var out bytes.Buffer ++ if e := M.SocksaddrSerializer.WriteAddrPort(&out, socksaddr(p.Source)); e != nil { ++ return ++ } ++ out.Write(p.Payload.Bytes()) ++ data, e := encoder(out.Bytes()) ++ if e != nil { ++ return ++ } ++ if sc, ok := s.cipher.(*C.StreamCipher); ok { ++ data, e = shadowstream.Pack(make([]byte, len(data)+sc.IVSize()), data, sc) ++ if e != nil { ++ return ++ } ++ } ++ conn.Write(data) ++ }) ++ } ++ b := buf.FromBytes(append([]byte{}, payload[len(payload)-r.Len():]...)) ++ b.UDP = &target ++ dispatch.Dispatch(ctx, target, b) ++ } ++} ++func init() { ++ common.Must(common.RegisterConfig((*ServerConfig)(nil), func(ctx context.Context, c interface{}) (interface{}, error) { ++ return NewServer(ctx, c.(*ServerConfig)) ++ })) ++} +--- a/proxy/shadowsocksr/shadowstream/chacha20.go ++++ b/proxy/shadowsocksr/shadowstream/chacha20.go +@@ -0,0 +1,57 @@ ++// SPDX-License-Identifier: GPL-3.0-or-later ++// Adapted from MetaCubeX/mihomo v1.19.32. ++package shadowstream ++ ++import ( ++ "crypto/cipher" ++ ++ "github.com/metacubex/chacha" ++) ++ ++func newChaCha20(nonce, key []byte) cipher.Stream { ++ c, err := chacha.NewChaCha20IgnoreCounterOverflow(nonce, key) ++ if err != nil { ++ panic(err) // should never happen ++ } ++ return c ++} ++ ++type chacha20key []byte ++ ++func (k chacha20key) IVSize() int { return chacha.NonceSize } ++func (k chacha20key) Encrypter(iv []byte) cipher.Stream { return newChaCha20(iv, k) } ++func (k chacha20key) Decrypter(iv []byte) cipher.Stream { return k.Encrypter(iv) } ++ ++func ChaCha20(key []byte) (Cipher, error) { ++ if len(key) != chacha.KeySize { ++ return nil, KeySizeError(chacha.KeySize) ++ } ++ return chacha20key(key), nil ++} ++ ++// IETF-variant of chacha20 ++type chacha20ietfkey []byte ++ ++func (k chacha20ietfkey) IVSize() int { return chacha.INonceSize } ++func (k chacha20ietfkey) Decrypter(iv []byte) cipher.Stream { return k.Encrypter(iv) } ++func (k chacha20ietfkey) Encrypter(iv []byte) cipher.Stream { return newChaCha20(iv, k) } ++ ++func Chacha20IETF(key []byte) (Cipher, error) { ++ if len(key) != chacha.KeySize { ++ return nil, KeySizeError(chacha.KeySize) ++ } ++ return chacha20ietfkey(key), nil ++} ++ ++type xchacha20key []byte ++ ++func (k xchacha20key) IVSize() int { return chacha.XNonceSize } ++func (k xchacha20key) Decrypter(iv []byte) cipher.Stream { return k.Encrypter(iv) } ++func (k xchacha20key) Encrypter(iv []byte) cipher.Stream { return newChaCha20(iv, k) } ++ ++func Xchacha20(key []byte) (Cipher, error) { ++ if len(key) != chacha.KeySize { ++ return nil, KeySizeError(chacha.KeySize) ++ } ++ return xchacha20key(key), nil ++} +--- a/proxy/shadowsocksr/shadowstream/cipher.go ++++ b/proxy/shadowsocksr/shadowstream/cipher.go +@@ -0,0 +1,77 @@ ++// SPDX-License-Identifier: GPL-3.0-or-later ++// Adapted from MetaCubeX/mihomo v1.19.32. ++package shadowstream ++ ++import ( ++ "crypto/aes" ++ "crypto/cipher" ++ "crypto/md5" ++ "crypto/rc4" ++ "strconv" ++) ++ ++// Cipher generates a pair of stream ciphers for encryption and decryption. ++type Cipher interface { ++ IVSize() int ++ Encrypter(iv []byte) cipher.Stream ++ Decrypter(iv []byte) cipher.Stream ++} ++ ++type KeySizeError int ++ ++func (e KeySizeError) Error() string { ++ return "key size error: need " + strconv.Itoa(int(e)) + " bytes" ++} ++ ++// CTR mode ++type ctrStream struct{ cipher.Block } ++ ++func (b *ctrStream) IVSize() int { return b.BlockSize() } ++func (b *ctrStream) Decrypter(iv []byte) cipher.Stream { return b.Encrypter(iv) } ++func (b *ctrStream) Encrypter(iv []byte) cipher.Stream { return cipher.NewCTR(b.Block, iv) } ++ ++func AESCTR(key []byte) (Cipher, error) { ++ blk, err := aes.NewCipher(key) ++ if err != nil { ++ return nil, err ++ } ++ return &ctrStream{blk}, nil ++} ++ ++// CFB mode ++type cfbStream struct{ cipher.Block } ++ ++func (b *cfbStream) IVSize() int { return b.BlockSize() } ++func (b *cfbStream) Decrypter(iv []byte) cipher.Stream { return cipher.NewCFBDecrypter(b.Block, iv) } ++func (b *cfbStream) Encrypter(iv []byte) cipher.Stream { return cipher.NewCFBEncrypter(b.Block, iv) } ++ ++func AESCFB(key []byte) (Cipher, error) { ++ blk, err := aes.NewCipher(key) ++ if err != nil { ++ return nil, err ++ } ++ return &cfbStream{blk}, nil ++} ++ ++type rc4Md5Key []byte ++ ++func (k rc4Md5Key) IVSize() int { ++ return 16 ++} ++ ++func (k rc4Md5Key) Encrypter(iv []byte) cipher.Stream { ++ h := md5.New() ++ h.Write([]byte(k)) ++ h.Write(iv) ++ rc4key := h.Sum(nil) ++ c, _ := rc4.NewCipher(rc4key) ++ return c ++} ++ ++func (k rc4Md5Key) Decrypter(iv []byte) cipher.Stream { ++ return k.Encrypter(iv) ++} ++ ++func RC4MD5(key []byte) (Cipher, error) { ++ return rc4Md5Key(key), nil ++} +--- a/proxy/shadowsocksr/shadowstream/packet.go ++++ b/proxy/shadowsocksr/shadowstream/packet.go +@@ -0,0 +1,93 @@ ++// SPDX-License-Identifier: GPL-3.0-or-later ++// Adapted from MetaCubeX/mihomo v1.19.32. ++package shadowstream ++ ++import ( ++ "crypto/rand" ++ "errors" ++ "io" ++ "net" ++ ++ "github.com/xtls/xray-core/proxy/shadowsocksr/pool" ++) ++ ++// ErrShortPacket means the packet is too short to be a valid encrypted packet. ++var ErrShortPacket = errors.New("short packet") ++ ++// Pack encrypts plaintext using stream cipher s and a random IV. ++// Returns a slice of dst containing random IV and ciphertext. ++// Ensure len(dst) >= s.IVSize() + len(plaintext). ++func Pack(dst, plaintext []byte, s Cipher) ([]byte, error) { ++ if len(dst) < s.IVSize()+len(plaintext) { ++ return nil, io.ErrShortBuffer ++ } ++ iv := dst[:s.IVSize()] ++ _, err := rand.Read(iv) ++ if err != nil { ++ return nil, err ++ } ++ s.Encrypter(iv).XORKeyStream(dst[len(iv):], plaintext) ++ return dst[:len(iv)+len(plaintext)], nil ++} ++ ++// UnpackInplace decrypts pkt using stream cipher s. ++// Returns a slice of pkt containing decrypted plaintext. ++// Note: The data in the input dst will be changed ++func UnpackInplace(pkt []byte, s Cipher) ([]byte, error) { ++ if len(pkt) < s.IVSize() { ++ return nil, ErrShortPacket ++ } ++ iv, dst := pkt[:s.IVSize()], pkt[s.IVSize():] ++ s.Decrypter(iv).XORKeyStream(dst, dst) ++ return dst, nil ++} ++ ++// Unpack decrypts pkt using stream cipher s. ++// Returns a slice of dst containing decrypted plaintext. ++func Unpack(dst, pkt []byte, s Cipher) ([]byte, error) { ++ if len(pkt) < s.IVSize() { ++ return nil, ErrShortPacket ++ } ++ if len(dst) < len(pkt)-s.IVSize() { ++ return nil, io.ErrShortBuffer ++ } ++ iv := pkt[:s.IVSize()] ++ s.Decrypter(iv).XORKeyStream(dst, pkt[len(iv):]) ++ return dst[:len(pkt)-len(iv)], nil ++} ++ ++type PacketConn struct { ++ net.PacketConn ++ Cipher ++} ++ ++// NewPacketConn wraps an net.PacketConn with stream cipher encryption/decryption. ++func NewPacketConn(c net.PacketConn, ciph Cipher) *PacketConn { ++ return &PacketConn{PacketConn: c, Cipher: ciph} ++} ++ ++const maxPacketSize = 64 * 1024 ++ ++func (c *PacketConn) WriteTo(b []byte, addr net.Addr) (int, error) { ++ buf := pool.Get(maxPacketSize) ++ defer pool.Put(buf) ++ buf, err := Pack(buf, b, c.Cipher) ++ if err != nil { ++ return 0, err ++ } ++ _, err = c.PacketConn.WriteTo(buf, addr) ++ return len(b), err ++} ++ ++func (c *PacketConn) ReadFrom(b []byte) (int, net.Addr, error) { ++ n, addr, err := c.PacketConn.ReadFrom(b) ++ if err != nil { ++ return n, addr, err ++ } ++ bb, err := UnpackInplace(b[:n], c.Cipher) ++ if err != nil { ++ return n, addr, err ++ } ++ copy(b, bb) ++ return len(bb), addr, err ++} +--- a/proxy/shadowsocksr/shadowstream/stream.go ++++ b/proxy/shadowsocksr/shadowstream/stream.go +@@ -0,0 +1,199 @@ ++// SPDX-License-Identifier: GPL-3.0-or-later ++// Adapted from MetaCubeX/mihomo v1.19.32. ++package shadowstream ++ ++import ( ++ "crypto/cipher" ++ "crypto/rand" ++ "io" ++ "net" ++) ++ ++const bufSize = 2048 ++ ++type Writer struct { ++ io.Writer ++ cipher.Stream ++ buf [bufSize]byte ++} ++ ++// NewWriter wraps an io.Writer with stream cipher encryption. ++func NewWriter(w io.Writer, s cipher.Stream) *Writer { return &Writer{Writer: w, Stream: s} } ++ ++func (w *Writer) Write(p []byte) (n int, err error) { ++ buf := w.buf[:] ++ for nw := 0; n < len(p) && err == nil; n += nw { ++ end := n + len(buf) ++ if end > len(p) { ++ end = len(p) ++ } ++ w.XORKeyStream(buf, p[n:end]) ++ nw, err = w.Writer.Write(buf[:end-n]) ++ if err == nil && nw != end-n { ++ err = io.ErrShortWrite ++ } ++ } ++ return ++} ++ ++func (w *Writer) ReadFrom(r io.Reader) (n int64, err error) { ++ buf := w.buf[:] ++ for { ++ nr, er := r.Read(buf) ++ n += int64(nr) ++ b := buf[:nr] ++ w.XORKeyStream(b, b) ++ if _, err = w.Writer.Write(b); err != nil { ++ return ++ } ++ if er != nil { ++ if er != io.EOF { // ignore EOF as per io.ReaderFrom contract ++ err = er ++ } ++ return ++ } ++ } ++} ++ ++type Reader struct { ++ io.Reader ++ cipher.Stream ++ buf [bufSize]byte ++} ++ ++// NewReader wraps an io.Reader with stream cipher decryption. ++func NewReader(r io.Reader, s cipher.Stream) *Reader { return &Reader{Reader: r, Stream: s} } ++ ++func (r *Reader) Read(p []byte) (n int, err error) { ++ n, err = r.Reader.Read(p) ++ r.XORKeyStream(p[:n], p[:n]) ++ return ++} ++ ++func (r *Reader) WriteTo(w io.Writer) (n int64, err error) { ++ buf := r.buf[:] ++ for { ++ nr, er := r.Reader.Read(buf) ++ if nr > 0 { ++ r.XORKeyStream(buf, buf[:nr]) ++ nw, ew := w.Write(buf[:nr]) ++ n += int64(nw) ++ if ew != nil { ++ err = ew ++ return ++ } ++ } ++ if er != nil { ++ if er != io.EOF { // ignore EOF as per io.Copy contract (using src.WriteTo shortcut) ++ err = er ++ } ++ return ++ } ++ } ++} ++ ++// A Conn represents a Shadowsocks connection. It implements the net.Conn interface. ++type Conn struct { ++ net.Conn ++ Cipher ++ r *Reader ++ w *Writer ++ readIV []byte ++ writeIV []byte ++} ++ ++// NewConn wraps a stream-oriented net.Conn with stream cipher encryption/decryption. ++func NewConn(c net.Conn, ciph Cipher) *Conn { return &Conn{Conn: c, Cipher: ciph} } ++ ++func (c *Conn) initReader() error { ++ if c.r == nil { ++ iv, err := c.ObtainReadIV() ++ if err != nil { ++ return err ++ } ++ c.r = NewReader(c.Conn, c.Decrypter(iv)) ++ } ++ return nil ++} ++ ++func (c *Conn) Read(b []byte) (int, error) { ++ if c.r == nil { ++ if err := c.initReader(); err != nil { ++ return 0, err ++ } ++ } ++ return c.r.Read(b) ++} ++ ++func (c *Conn) WriteTo(w io.Writer) (int64, error) { ++ if c.r == nil { ++ if err := c.initReader(); err != nil { ++ return 0, err ++ } ++ } ++ return c.r.WriteTo(w) ++} ++ ++func (c *Conn) initWriter() error { ++ if c.w == nil { ++ iv, err := c.ObtainWriteIV() ++ if err != nil { ++ return err ++ } ++ if _, err := c.Conn.Write(iv); err != nil { ++ return err ++ } ++ c.w = NewWriter(c.Conn, c.Encrypter(iv)) ++ } ++ return nil ++} ++ ++func (c *Conn) Write(b []byte) (int, error) { ++ if c.w == nil { ++ if err := c.initWriter(); err != nil { ++ return 0, err ++ } ++ } ++ return c.w.Write(b) ++} ++ ++func (c *Conn) ReadFrom(r io.Reader) (int64, error) { ++ if c.w == nil { ++ if err := c.initWriter(); err != nil { ++ return 0, err ++ } ++ } ++ return c.w.ReadFrom(r) ++} ++ ++func (c *Conn) ObtainWriteIV() ([]byte, error) { ++ if len(c.writeIV) == c.IVSize() { ++ return c.writeIV, nil ++ } ++ ++ iv := make([]byte, c.IVSize()) ++ ++ if _, err := rand.Read(iv); err != nil { ++ return nil, err ++ } ++ ++ c.writeIV = iv ++ ++ return iv, nil ++} ++ ++func (c *Conn) ObtainReadIV() ([]byte, error) { ++ if len(c.readIV) == c.IVSize() { ++ return c.readIV, nil ++ } ++ ++ iv := make([]byte, c.IVSize()) ++ ++ if _, err := io.ReadFull(c.Conn, iv); err != nil { ++ return nil, err ++ } ++ ++ c.readIV = iv ++ ++ return iv, nil ++} +--- a/proxy/shadowsocksr/tools/bufPool.go ++++ b/proxy/shadowsocksr/tools/bufPool.go +@@ -0,0 +1,13 @@ ++// SPDX-License-Identifier: GPL-3.0-or-later ++// Adapted from MetaCubeX/mihomo v1.19.32. ++package tools ++ ++import ( ++ "bytes" ++ "crypto/rand" ++ "io" ++) ++ ++func AppendRandBytes(b *bytes.Buffer, length int) { ++ b.ReadFrom(io.LimitReader(rand.Reader, int64(length))) ++} +--- a/proxy/shadowsocksr/tools/crypto.go ++++ b/proxy/shadowsocksr/tools/crypto.go +@@ -0,0 +1,35 @@ ++// SPDX-License-Identifier: GPL-3.0-or-later ++// Adapted from MetaCubeX/mihomo v1.19.32. ++package tools ++ ++import ( ++ "crypto/hmac" ++ "crypto/md5" ++ "crypto/sha1" ++) ++ ++const HmacSHA1Len = 10 ++ ++func HmacMD5(key, data []byte) []byte { ++ hmacMD5 := hmac.New(md5.New, key) ++ hmacMD5.Write(data) ++ return hmacMD5.Sum(nil) ++} ++ ++func HmacSHA1(key, data []byte) []byte { ++ hmacSHA1 := hmac.New(sha1.New, key) ++ hmacSHA1.Write(data) ++ return hmacSHA1.Sum(nil) ++} ++ ++func MD5Sum(b []byte) []byte { ++ h := md5.New() ++ h.Write(b) ++ return h.Sum(nil) ++} ++ ++func SHA1Sum(b []byte) []byte { ++ h := sha1.New() ++ h.Write(b) ++ return h.Sum(nil) ++} +--- a/proxy/shadowsocksr/tools/random.go ++++ b/proxy/shadowsocksr/tools/random.go +@@ -0,0 +1,59 @@ ++// SPDX-License-Identifier: GPL-3.0-or-later ++// Adapted from MetaCubeX/mihomo v1.19.32. ++package tools ++ ++import ( ++ "encoding/binary" ++ ++ "github.com/xtls/xray-core/proxy/shadowsocksr/pool" ++) ++ ++// XorShift128Plus - a pseudorandom number generator ++type XorShift128Plus struct { ++ s [2]uint64 ++} ++ ++func (r *XorShift128Plus) Next() uint64 { ++ x := r.s[0] ++ y := r.s[1] ++ r.s[0] = y ++ x ^= x << 23 ++ x ^= y ^ (x >> 17) ^ (y >> 26) ++ r.s[1] = x ++ return x + y ++} ++ ++func (r *XorShift128Plus) InitFromBin(bin []byte) { ++ var full []byte ++ if len(bin) < 16 { ++ full := pool.Get(16)[:0] ++ defer pool.Put(full) ++ full = append(full, bin...) ++ for len(full) < 16 { ++ full = append(full, 0) ++ } ++ } else { ++ full = bin ++ } ++ r.s[0] = binary.LittleEndian.Uint64(full[:8]) ++ r.s[1] = binary.LittleEndian.Uint64(full[8:16]) ++} ++ ++func (r *XorShift128Plus) InitFromBinAndLength(bin []byte, length int) { ++ var full []byte ++ if len(bin) < 16 { ++ full := pool.Get(16)[:0] ++ defer pool.Put(full) ++ full = append(full, bin...) ++ for len(full) < 16 { ++ full = append(full, 0) ++ } ++ } ++ full = bin ++ binary.LittleEndian.PutUint16(full, uint16(length)) ++ r.s[0] = binary.LittleEndian.Uint64(full[:8]) ++ r.s[1] = binary.LittleEndian.Uint64(full[8:16]) ++ for i := 0; i < 4; i++ { ++ r.Next() ++ } ++} diff --git a/xray-core/patches/150-add-tuic-proxy.patch b/xray-core/patches/150-add-tuic-proxy.patch new file mode 100644 index 000000000..0166996e3 --- /dev/null +++ b/xray-core/patches/150-add-tuic-proxy.patch @@ -0,0 +1,2314 @@ +From: coolsnowwolf +Subject: [PATCH] proxy: add Mihomo TUIC v4/v5 inbound and outbound + +Use the pinned Mihomo v1.19.32 TUIC implementation and its QUIC/TLS stack. +Adapt authenticated streams and UDP associations to Xray routing. Support +v4 tokens and v5 UUID/password users, native datagrams and QUIC stream UDP, +congestion control, early handshakes, reusable clients and socket options. +Join packet copy loops before closing upstream packet state and preserve +Xray private-target restrictions on the TUIC inbound. + +Mihomo is GPL-3.0-or-later; include its license with the adapter. +Signed-off-by: coolsnowwolf + +--- a/go.mod ++++ b/go.mod +@@ -3,9 +3,11 @@ + go 1.27 + + require ( ++ github.com/andybalholm/brotli v1.2.3 // indirect + github.com/apernet/quic-go v0.61.1-0.20260806010916-184d081eef3e + github.com/bufbuild/protocompile v0.14.1 + github.com/ghodss/yaml v1.0.1-0.20220118164431-d8423dcdf344 ++ github.com/gofrs/uuid/v5 v5.4.0 + github.com/golang/mock v1.7.0-rc.1 + github.com/google/go-cmp v0.7.0 + github.com/google/uuid v1.6.0 +@@ -13,6 +15,9 @@ + github.com/klauspost/cpuid/v2 v2.4.2 + github.com/libp2p/go-nat v1.0.1-0.20250821073202-01afc089f138 + github.com/metacubex/chacha v0.1.5 ++ github.com/metacubex/mihomo v1.19.32 ++ github.com/metacubex/quic-go v0.61.1-0.20260727080200-2548683b76f4 ++ github.com/metacubex/tls v0.1.8 + github.com/miekg/dns v1.1.73 + github.com/pelletier/go-toml v1.9.5 + github.com/pion/stun/v3 v3.1.7 +@@ -40,10 +45,10 @@ + github.com/vishvananda/netlink v1.3.1 + github.com/xtls/reality v0.0.0-20261108101329-4bb46b2afd8b + github.com/yuin/gopher-lua v1.1.2 +- go4.org/netipx v0.0.0-20231129151722-fdeea329fbba ++ go4.org/netipx v0.0.0-20260823151212-3075585bcbeb + golang.org/x/crypto v0.58.0 + golang.org/x/crypto/x509roots/fallback v0.0.0-20261020153306-9f2b28d4331a +- golang.org/x/exp v0.0.0-20240506185415-9bf2ced13842 ++ golang.org/x/exp v0.0.0-20240904232852-e7e105dedf7e + golang.org/x/net v0.62.0 + golang.org/x/sync v0.24.0 + golang.org/x/sys v0.49.0 +@@ -59,6 +64,7 @@ + ) + + require ( ++ github.com/bahlo/generic-list-go v0.2.0 // indirect + github.com/ebitengine/purego v0.10.0 // indirect + github.com/google/gopacket v1.1.19 // indirect + github.com/huin/goupnp v1.2.0 // indirect +@@ -68,10 +74,24 @@ + github.com/koron/go-ssdp v0.0.4 // indirect + github.com/libp2p/go-netroute v0.2.1 // indirect + github.com/molecule-man/go-brrr v1.2.0 // indirect ++ github.com/metacubex/bart v0.29.0 // indirect ++ github.com/metacubex/blake3 v0.1.0 // indirect ++ github.com/metacubex/cpu v0.1.2 // indirect ++ github.com/metacubex/hkdf v0.1.0 // indirect ++ github.com/metacubex/hpke v0.1.0 // indirect ++ github.com/metacubex/http v0.1.8 // indirect ++ github.com/metacubex/mlkem v0.1.0 // indirect ++ github.com/metacubex/randv2 v0.2.0 // indirect ++ github.com/metacubex/sing v0.5.8 // indirect ++ github.com/metacubex/tfo-go v0.0.0-20260623020846-376a77860b8c // indirect ++ github.com/metacubex/wireguard-go v0.0.0-20250820062549-a6cecdd7f57f // indirect ++ github.com/openacid/low v0.1.21 // indirect + github.com/pion/dtls/v3 v3.1.5 // indirect + github.com/pion/logging v0.2.4 // indirect + github.com/pion/transport/v4 v4.1.0 // indirect + github.com/quic-go/qpack v0.6.0 // indirect ++ github.com/samber/lo v1.53.0 // indirect ++ github.com/sirupsen/logrus v1.9.4 // indirect + github.com/vishvananda/netns v0.0.5 // indirect + github.com/wlynxg/anet v0.0.5 // indirect + go.yaml.in/yaml/v3 v3.0.5 // indirect +--- a/go.sum ++++ b/go.sum +@@ -1,22 +1,31 @@ ++github.com/andybalholm/brotli v1.2.3 h1:8H1qwOkl2LPfjf3YezB90JnCliZb6SInJ/OJkEbA5NQ= ++github.com/andybalholm/brotli v1.2.3/go.mod h1:rzTDkvFWvIrjDXZHkuS16NPggd91W3kUSvPlQ1pLaKY= + github.com/apernet/quic-go v0.61.1-0.20260806010916-184d081eef3e h1:5mgtR5gwIgBKMiGI1QdXldZZ+SNor06Nbu1wCBulQBg= + github.com/apernet/quic-go v0.61.1-0.20260806010916-184d081eef3e/go.mod h1:x7qxEvX6MCVtDuBKHj3E+88+BtrbEMuAL5qGUKItjW8= ++github.com/bahlo/generic-list-go v0.2.0 h1:5sz/EEAK+ls5wF+NeqDpk5+iNdMDXrh3z3nPnH1Wvgk= ++github.com/bahlo/generic-list-go v0.2.0/go.mod h1:2KvAjgMlE5NNynlg/5iLrrCCZ2+5xWbdbCW3pNTGyYg= ++github.com/blang/semver v3.5.1+incompatible/go.mod h1:kRBLl5iJ+tD4TcOOxsy/0fnwebNt5EWlYSAyrTnjyyk= + github.com/bufbuild/protocompile v0.14.1 h1:iA73zAf/fyljNjQKwYzUHD6AD4R8KMasmwa/FBatYVw= + github.com/bufbuild/protocompile v0.14.1/go.mod h1:ppVdAIhbr2H8asPk6k4pY7t9zB1OU5DoEw9xY/FUi1c= + github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= + github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= + github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= ++github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= + github.com/ebitengine/purego v0.10.0 h1:QIw4xfpWT6GWTzaW5XEKy3HXoqrJGx1ijYHzTF0/ISU= + github.com/ebitengine/purego v0.10.0/go.mod h1:iIjxzd6CiRiOG0UyXP+V1+jWqUXVjPKLAI0mRfJZTmQ= + github.com/ghodss/yaml v1.0.1-0.20220118164431-d8423dcdf344 h1:Arcl6UOIS/kgO2nW3A65HN+7CMjSDP/gofXL4CZt1V4= + github.com/ghodss/yaml v1.0.1-0.20220118164431-d8423dcdf344/go.mod h1:GIjDIg/heH5DOkXY3YJ/wNhfHsQHoXGjl8G8amsYQ1I= + github.com/go-quicktest/qt v1.102.0 h1:HSQxCeh5YZH3EL3W39ixjtyaEhcWSXQHtHnMBzSs474= + github.com/go-quicktest/qt v1.102.0/go.mod h1:p4lGIVX+8Wa6ZPNDvqcxq36XpUDLh42FLetFU7odllI= ++github.com/gofrs/uuid/v5 v5.4.0 h1:EfbpCTjqMuGyq5ZJwxqzn3Cbr2d0rUZU7v5ycAk/e/0= ++github.com/gofrs/uuid/v5 v5.4.0/go.mod h1:CDOjlDMVAtN56jqyRUZh58JT31Tiw7/oQyEXZV+9bD8= + github.com/golang/mock v1.7.0-rc.1 h1:YojYx61/OLFsiv6Rw1Z96LpldJIy31o+UHmwAUMJ6/U= + github.com/golang/mock v1.7.0-rc.1/go.mod h1:s42URUywIqd+OcERslBJvOjepvNymP31m3q8d/GkuRs= ++github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= + github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek= + github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps= +-github.com/google/btree v1.1.2 h1:xf4v41cLI2Z6FxbKm+8Bu+m8ifhj15JuZ9sa0jZCMUU= +-github.com/google/btree v1.1.2/go.mod h1:qOPhT0dTNdNzV6Z/lhRX0YXUafgPLFUh+gZMl761Gm4= ++github.com/google/btree v1.1.3 h1:CVpQJjYgC4VbzxeGVHfvZrv1ctoYCAI8vbl07Fcxlyg= ++github.com/google/btree v1.1.3/go.mod h1:qOPhT0dTNdNzV6Z/lhRX0YXUafgPLFUh+gZMl761Gm4= + github.com/google/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8= + github.com/google/go-cmp v0.7.0/go.mod h1:pXiqmnSA92OHEEa9HXL2W4E7lf9JzCmGVUdgjX3N/iU= + github.com/google/gopacket v1.1.19 h1:ves8RnFZPGiFnTS0uPQStjwru6uO6h+nlr9j6fL7kF8= +@@ -47,10 +56,43 @@ + github.com/libp2p/go-nat v1.0.1-0.20250821073202-01afc089f138/go.mod h1:TXQg5tfSy+bUjnhT5728j5j/MBj7keIYqqZ1+8k/ui8= + github.com/libp2p/go-netroute v0.2.1 h1:V8kVrpD8GK0Riv15/7VN6RbUQ3URNZVosw7H2v9tksU= + github.com/libp2p/go-netroute v0.2.1/go.mod h1:hraioZr0fhBjG0ZRXJJ6Zj2IVEVNx6tDTFQfSmcq7mQ= ++github.com/metacubex/bart v0.29.0 h1:yVc/lLdDqn+7FShI0qUghStHl0/d3mn4EH/I5R5niKk= ++github.com/metacubex/bart v0.29.0/go.mod h1:DCcyfP4MC+Zy7sLK7XeGuMw+P5K9mIRsYOBgiE8icsI= ++github.com/metacubex/blake3 v0.1.0 h1:KGnjh/56REO7U+cgZA8dnBhxdP7jByrG7hTP+bu6cqY= ++github.com/metacubex/blake3 v0.1.0/go.mod h1:CCkLdzFrqf7xmxCdhQFvJsRRV2mwOLDoSPg6vUTB9Uk= + github.com/metacubex/chacha v0.1.5 h1:fKWMb/5c7ZrY8Uoqi79PPFxl+qwR7X/q0OrsAubyX2M= + github.com/metacubex/chacha v0.1.5/go.mod h1:Djn9bPZxLTXbJFSeyo0/qzEzQI+gUSSzttuzZM75GH8= ++github.com/metacubex/cpu v0.1.2 h1:xJHPWLkGilSWm6vEvzz8Loe+UusODRkVnuXz96TWAZo= ++github.com/metacubex/cpu v0.1.2/go.mod h1:09VEt4dSRLR+bOA8l4w4NDuzGZ8n5dkMv7e8axgEeTU= ++github.com/metacubex/hkdf v0.1.0 h1:fPA6VzXK8cU1foc/TOmGCDmSa7pZbxlnqhl3RNsthaA= ++github.com/metacubex/hkdf v0.1.0/go.mod h1:3seEfds3smgTAXqUGn+tgEJH3uXdsUjOiduG/2EtvZ4= ++github.com/metacubex/hpke v0.1.0 h1:gu2jUNhraehWi0P/z5HX2md3d7L1FhPQE6/Q0E9r9xQ= ++github.com/metacubex/hpke v0.1.0/go.mod h1:vfDm6gfgrwlXUxKDkWbcE44hXtmc1uxLDm2BcR11b3U= ++github.com/metacubex/http v0.1.8 h1:d91onDan2ZXYE8W/uAy5oFmXHH2xi1L7LbGPV5EmCM0= ++github.com/metacubex/http v0.1.8/go.mod h1:Nxx0zZAo2AhRfanyL+fmmK6ACMtVsfpwIl1aFAik2Eg= ++github.com/metacubex/mihomo v1.19.32 h1:uD7ZC3P77isWD554NNvtee65L+99+/C5hyc+Lk8rVEk= ++github.com/metacubex/mihomo v1.19.32/go.mod h1:d7xWi5iEktkC9PqXkD/Vo4AEcb0Q92XikfLoySUDWls= ++github.com/metacubex/mlkem v0.1.0 h1:wFClitonSFcmipzzQvax75beLQU+D7JuC+VK1RzSL8I= ++github.com/metacubex/mlkem v0.1.0/go.mod h1:amhaXZVeYNShuy9BILcR7P0gbeo/QLZsnqCdL8U2PDQ= ++github.com/metacubex/quic-go v0.61.1-0.20260727080200-2548683b76f4 h1:7oX6CpHVqoUXNyyt0MTuO5ywd1qVe1S1t3jXWMW7bYc= ++github.com/metacubex/quic-go v0.61.1-0.20260727080200-2548683b76f4/go.mod h1:KTmibo7vZo0gCxdFWrPEQ/u/RGt92mJkrXDE2Qg2/AU= ++github.com/metacubex/randv2 v0.2.0 h1:uP38uBvV2SxYfLj53kuvAjbND4RUDfFJjwr4UigMiLs= ++github.com/metacubex/randv2 v0.2.0/go.mod h1:kFi2SzrQ5WuneuoLLCMkABtiBu6VRrMrWFqSPyj2cxY= ++github.com/metacubex/sing v0.5.8 h1:OwJDSPP+pza6Ywt7NMR4kEYq+UNrsIywSk/eAMlqxz8= ++github.com/metacubex/sing v0.5.8/go.mod h1:ypf0mjwlZm0sKdQSY+yQvmsbWa0hNPtkeqyRMGgoN+w= ++github.com/metacubex/tfo-go v0.0.0-20260623020846-376a77860b8c h1:+2C1UshSLzaogLY/IDz1XhOLxjhs3rkhVHB4eCN9Zto= ++github.com/metacubex/tfo-go v0.0.0-20260623020846-376a77860b8c/go.mod h1:l9oLnLoEXyGZ5RVLsh7QCC5XsouTUyKk4F2nLm2DHLw= ++github.com/metacubex/tls v0.1.8 h1:BHF2payjtxC7wdR3tnq8vl3FAgEQB6/pPjP2tJNTsP4= ++github.com/metacubex/tls v0.1.8/go.mod h1:0XeVdL0cBw+8i5Hqy3lVeP9IyD/LFTq02ExvHM6rzEM= ++github.com/metacubex/wireguard-go v0.0.0-20250820062549-a6cecdd7f57f h1:FGBPRb1zUabhPhDrlKEjQ9lgIwQ6cHL4x8M9lrERhbk= ++github.com/metacubex/wireguard-go v0.0.0-20250820062549-a6cecdd7f57f/go.mod h1:oPGcV994OGJedmmxrcK9+ni7jUEMGhR+uVQAdaduIP4= + github.com/miekg/dns v1.1.73 h1:uhT8nJxmTrPJYClxVxTCX+CVn6qnzSiybRk72Z6DgrE= + github.com/miekg/dns v1.1.73/go.mod h1:RW2Obtfd5NZHvOFe3zYG0W8koWOQtAzyHaLo8vASBuQ= ++github.com/openacid/errors v0.8.1/go.mod h1:GUQEJJOJE3W9skHm8E8Y4phdl2LLEN8iD7c5gcGgdx0= ++github.com/openacid/low v0.1.21 h1:Tr2GNu4N/+rGRYdOsEHOE89cxUIaDViZbVmKz29uKGo= ++github.com/openacid/low v0.1.21/go.mod h1:q+MsKI6Pz2xsCkzV4BLj7NR5M4EX0sGz5AqotpZDVh0= ++github.com/openacid/must v0.1.3/go.mod h1:luPiXCuJlEo3UUFQngVQokV0MPGryeYvtCbQPs3U1+I= ++github.com/openacid/testkeys v0.1.6/go.mod h1:MfA7cACzBpbiwekivj8StqX0WIRmqlMsci1c37CA3Do= + github.com/molecule-man/go-brrr v1.2.0 h1:dOJU45BC3Gc2WXoxAW0rgCAgVuu2gruAOGncfieA0Jw= + github.com/molecule-man/go-brrr v1.2.0/go.mod h1:7ybW6/7gA3oKY45jOfVNjSJDtrr6ea4tzbsTkjmQDC4= + github.com/pelletier/go-toml v1.9.5 h1:4yBQzkHv+7BHq2PQUZF3Mx0IYxG7LsP222s7Agd3ve8= +@@ -67,6 +109,8 @@ + github.com/pion/transport/v4 v4.1.0/go.mod h1:06hFI+jCFcok2X2MekVufNZ/uzNZXivGBPfviSVcjgM= + github.com/pires/go-proxyproto v0.16.0 h1:9KYT/fM3wpjT8bdMEj/7FBcoiUG1KyzEjRYnPu+vz7A= + github.com/pires/go-proxyproto v0.16.0/go.mod h1:n7yhg8yIfNl3KgYDCwBzmeUHNpKTVnUhcWpc7rV4RW4= ++github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= ++github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= + github.com/quic-go/go-ossfuzz-seeds v0.1.0 h1:APacT+iIaNF6fd8AGEiN3bT/Jtkd2jz4v4TzM7MFjy0= + github.com/quic-go/go-ossfuzz-seeds v0.1.0/go.mod h1:3IOHRbJIc+L6YKMwfDtJAM9Vj9k0YY4muhuyUYk5tbk= + github.com/quic-go/qpack v0.6.0 h1:g7W+BMYynC1LbYLSqRt8PBg5Tgwxn214ZZR34VIOjz8= +@@ -111,8 +155,16 @@ + github.com/sagernet/sing v0.8.14/go.mod h1:olXxWQNqRW/l2Q6JI3b2Qmz8iQnIFlOeeH8bx6JhgUA= + github.com/sagernet/sing-anytls v0.0.0-20260928104022-580984e4d8cb h1:n4sF2zv0CR1gcb4awh61t11t0FZmcP40x5enB8HARjE= + github.com/sagernet/sing-anytls v0.0.0-20260928104022-580984e4d8cb/go.mod h1:VRKLnj0ObEsN228h+zuzf91p+6sjtYE8SBaLPVsBy5o= ++github.com/samber/lo v1.53.0 h1:t975lj2py4kJPQ6haz1QMgtId2gtmfktACxIXArw3HM= ++github.com/samber/lo v1.53.0/go.mod h1:4+MXEGsJzbKGaUEQFKBq2xtfuznW9oz/WrgyzMzRoM0= ++github.com/sirupsen/logrus v1.9.4 h1:TsZE7l11zFCLZnZ+teH4Umoq5BhEIfIzfRDZ1Uzql2w= ++github.com/sirupsen/logrus v1.9.4/go.mod h1:ftWc9WdOfJ0a92nsE2jF5u5ZwH8Bv2zdeOC42RjbV2g= ++github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= + github.com/stretchr/testify v1.12.1 h1:EuwCh5fleGS7H32xRwO3wRGT7DxrDhLAT6FF8MpWDWE= + github.com/stretchr/testify v1.12.1/go.mod h1:MDEgiDPPsNp5cuIrHPPCyornHKgEVbtFUmoNlxoYthg= ++github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= ++github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= ++github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= + github.com/vishvananda/netlink v1.3.1 h1:3AEMt62VKqz90r0tmNhog0r/PpWKmrEShJU0wJW6bV0= + github.com/vishvananda/netlink v1.3.1/go.mod h1:ARtKouGSTGchR8aMwmkzC0qiNPrrWO5JS/XMVl45+b4= + github.com/vishvananda/netns v0.0.5 h1:DfiHV+j8bA32MFM7bfEunvT8IAqQ/NzSJHtcmW5zdEY= +@@ -129,16 +181,16 @@ + go.uber.org/mock v0.5.2/go.mod h1:wLlUxC2vVTPTaE3UD51E0BGOAElKrILxhVSDYQLld5o= + go.yaml.in/yaml/v3 v3.0.5 h1:N6y/pJk8buWs9NY5ERU2HSMfm+IuD/OtfdAnq6kESPw= + go.yaml.in/yaml/v3 v3.0.5/go.mod h1:HVTZu1O7/Vkt2N+BFy8Zza+lnLsABggaTM2ZpNIGuKg= +-go4.org/netipx v0.0.0-20231129151722-fdeea329fbba h1:0b9z3AuHCjxk0x/opv64kcgZLBseWJUpBw5I82+2U4M= +-go4.org/netipx v0.0.0-20231129151722-fdeea329fbba/go.mod h1:PLyyIXexvUFg3Owu6p/WfdlivPbZJsZdgWZlrGope/Y= ++go4.org/netipx v0.0.0-20260823151212-3075585bcbeb h1:XBM4hvfwGAttkkiTIFfeigdfcL1xIfdKXqFdgiHGtDs= ++go4.org/netipx v0.0.0-20260823151212-3075585bcbeb/go.mod h1:PLyyIXexvUFg3Owu6p/WfdlivPbZJsZdgWZlrGope/Y= + golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= + golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= + golang.org/x/crypto v0.58.0 h1:COkYLr4k7nDI4r6QtMML2AfzeIswWHAJthLS6K/M/54= + golang.org/x/crypto v0.58.0/go.mod h1:Xh+kl5A+M0gMiWDytH2Hhr5Z7WbNCpv/eB/EFgfSk+w= + golang.org/x/crypto/x509roots/fallback v0.0.0-20261020153306-9f2b28d4331a h1:V5oicZXS0oqZx30gY/apgSVD7YvNBfrIOdcMnlelJY4= + golang.org/x/crypto/x509roots/fallback v0.0.0-20261020153306-9f2b28d4331a/go.mod h1:HPze8vhfG6fO06AM+VSvxRm4E3+5Yk375mgrJ5M2z1E= +-golang.org/x/exp v0.0.0-20240506185415-9bf2ced13842 h1:vr/HnozRka3pE4EsMEg1lgkXJkTFJCVUX+S/ZT6wYzM= +-golang.org/x/exp v0.0.0-20240506185415-9bf2ced13842/go.mod h1:XtvwrStGgqGPLc4cjQfWqZHG1YFdYs6swckp8vpsjnc= ++golang.org/x/exp v0.0.0-20240904232852-e7e105dedf7e h1:I88y4caeGeuDQxgdoFPUq097j7kNfw6uvuiNxUBfcBk= ++golang.org/x/exp v0.0.0-20240904232852-e7e105dedf7e/go.mod h1:akd2r19cwCdwSwWeIdzYQGa/EZZyqcOdwWiwj5L5eKQ= + golang.org/x/lint v0.0.0-20200302205851-738671d3881b/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= + golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= + golang.org/x/mod v0.5.1/go.mod h1:5OXOZSfqPIIbmVBIIKWRFfZjPR0E5r58TLhUjH0a2Ro= +@@ -157,8 +209,8 @@ + golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= + golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= + golang.org/x/sys v0.0.0-20211019181941-9d821ace8654/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +-golang.org/x/sys v0.2.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= + golang.org/x/sys v0.10.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= ++golang.org/x/sys v0.2.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= + golang.org/x/sys v0.49.0 h1:XbzkgYJHdqh/8m2Uu0W/dQv8nktxx4BFHp1M0gROTXA= + golang.org/x/sys v0.49.0/go.mod h1:hNLxWAXmnKAxqDtdwIYC4bM9oQPEecfsnNMuSxOs3og= + golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= +@@ -200,6 +252,7 @@ + gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= + gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= + gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= ++gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= + gvisor.dev/gvisor v0.0.0-20260122175437-89a5d21be8f0 h1:Lk6hARj5UPY47dBep70OD/TIMwikJ5fGUGX0Rm3Xigk= + gvisor.dev/gvisor v0.0.0-20260122175437-89a5d21be8f0/go.mod h1:QkHjoMIBaYtpVufgwv3keYAbln78mBoCuShZrPrer1Q= + h12.io/socks v1.0.3 h1:Ka3qaQewws4j4/eDQnOdpr4wXsC//dXtWvftlIcCQUo= +--- a/infra/conf/transport_internet.go ++++ b/infra/conf/transport_internet.go +@@ -38,6 +38,8 @@ + return "", errors.PrintRemovedFeatureError("QUIC transport (without web service, etc.)", "XHTTP stream-one H3") + case "hysteria": + return "hysteria", nil ++ case "tuic": ++ return "tuic", nil + case "naive": + return "naive", nil + case "masque": +--- a/infra/conf/tuic.go ++++ b/infra/conf/tuic.go +@@ -0,0 +1,145 @@ ++package conf ++ ++import ( ++ "github.com/gofrs/uuid/v5" ++ "github.com/xtls/xray-core/common/errors" ++ P "github.com/xtls/xray-core/proxy/tuic" ++ T "github.com/xtls/xray-core/transport/internet/tuic" ++ "google.golang.org/protobuf/proto" ++ "strings" ++) ++ ++func tuicCC(s string) (string, error) { ++ if s == "" { ++ return "cubic", nil ++ } ++ switch s { ++ case "cubic", "new_reno", "bbr", "bbr_meta_v1", "bbr_meta_v2": ++ return s, nil ++ } ++ return "", errors.New("tuic: unsupported congestion control") ++} ++ ++type TUICClientConfig struct { ++ Address *Address `json:"address"` ++ Port uint16 `json:"port"` ++ Version uint32 `json:"version"` ++ Token string `json:"token"` ++ UUID string `json:"uuid"` ++ Password string `json:"password"` ++ ServerName string `json:"serverName"` ++ CertificateFile string `json:"certificateFile"` ++ AllowInsecure bool `json:"allowInsecure"` ++ ALPN []string `json:"alpn"` ++ CongestionControl string `json:"congestionControl"` ++ UDPRelayMode string `json:"udpRelayMode"` ++ ReduceRTT bool `json:"reduceRtt"` ++ FastOpen bool `json:"fastOpen"` ++ HeartbeatInterval uint32 `json:"heartbeatInterval"` ++ RequestTimeout uint32 `json:"requestTimeout"` ++ MaxOpenStreams uint32 `json:"maxOpenStreams"` ++ MaxUDPRelayPacketSize uint32 `json:"maxUdpRelayPacketSize"` ++ Level uint32 `json:"level"` ++} ++ ++func (c *TUICClientConfig) Build() (proto.Message, error) { ++ if c.Address == nil || c.Port == 0 { ++ return nil, errors.New("tuic: address and port required") ++ } ++ v := c.Version ++ if v == 0 { ++ v = 5 ++ if c.Token != "" { ++ v = 4 ++ } ++ } ++ if v == 4 { ++ if c.Token == "" || c.UUID != "" || c.Password != "" { ++ return nil, errors.New("tuic v4 requires token only") ++ } ++ } else if v == 5 { ++ if _, e := uuid.FromString(c.UUID); e != nil || c.Password == "" || c.Token != "" { ++ return nil, errors.New("tuic v5 requires UUID and password") ++ } ++ } else { ++ return nil, errors.New("tuic version must be 4 or 5") ++ } ++ cc, e := tuicCC(c.CongestionControl) ++ if e != nil { ++ return nil, e ++ } ++ mode := c.UDPRelayMode ++ if mode == "" { ++ mode = "native" ++ } ++ if mode != "native" && mode != "quic" { ++ return nil, errors.New("tuic: invalid UDP relay mode") ++ } ++ heartbeat := c.HeartbeatInterval ++ if heartbeat == 0 { ++ heartbeat = 10000 ++ } ++ timeout := c.RequestTimeout ++ if timeout == 0 { ++ timeout = 8000 ++ } ++ streams := c.MaxOpenStreams ++ if streams == 0 { ++ streams = 100 ++ } ++ if streams < 2 { ++ return nil, errors.New("tuic: maxOpenStreams must be at least 2") ++ } ++ size := c.MaxUDPRelayPacketSize ++ if size == 0 { ++ size = 1200 ++ } ++ if size < 256 || size > 1252 { ++ return nil, errors.New("tuic: UDP relay packet size must be 256..1252") ++ } ++ return &P.ClientConfig{Address: c.Address.Build(), Port: uint32(c.Port), Version: v, Token: c.Token, Uuid: c.UUID, Password: c.Password, ServerName: c.ServerName, CertificateFile: c.CertificateFile, AllowInsecure: c.AllowInsecure, Alpn: c.ALPN, CongestionControl: cc, UdpRelayMode: mode, ReduceRtt: c.ReduceRTT, FastOpen: c.FastOpen, HeartbeatInterval: heartbeat, RequestTimeout: timeout, MaxOpenStreams: streams, MaxUdpRelayPacketSize: size, Level: c.Level}, nil ++} ++ ++type TUICServerConfig struct { ++ Tokens []string `json:"tokens"` ++ Users map[string]string `json:"users"` ++ CertificateFile string `json:"certificateFile"` ++ KeyFile string `json:"keyFile"` ++ ALPN []string `json:"alpn"` ++ CongestionControl string `json:"congestionControl"` ++ AuthenticationTimeout uint32 `json:"authenticationTimeout"` ++ MaxUDPRelayPacketSize uint32 `json:"maxUdpRelayPacketSize"` ++ Level uint32 `json:"level"` ++} ++ ++func (c *TUICServerConfig) Build() (proto.Message, error) { ++ if len(c.Tokens)+len(c.Users) == 0 || c.CertificateFile == "" || c.KeyFile == "" { ++ return nil, errors.New("tuic: credentials and TLS certificate/key required") ++ } ++ for _, t := range c.Tokens { ++ if strings.TrimSpace(t) == "" { ++ return nil, errors.New("tuic: empty token") ++ } ++ } ++ for id, p := range c.Users { ++ if _, e := uuid.FromString(id); e != nil || p == "" { ++ return nil, errors.New("tuic: invalid user") ++ } ++ } ++ cc, e := tuicCC(c.CongestionControl) ++ if e != nil { ++ return nil, e ++ } ++ timeout := c.AuthenticationTimeout ++ if timeout == 0 { ++ timeout = 3000 ++ } ++ size := c.MaxUDPRelayPacketSize ++ if size == 0 { ++ size = 1200 ++ } ++ if size < 256 || size > 1252 { ++ return nil, errors.New("tuic: invalid UDP packet size") ++ } ++ return &T.Config{Tokens: c.Tokens, Users: c.Users, CertificateFile: c.CertificateFile, KeyFile: c.KeyFile, Alpn: c.ALPN, CongestionControl: cc, AuthenticationTimeout: timeout, MaxUdpRelayPacketSize: size, Level: c.Level}, nil ++} +--- a/infra/conf/xray.go ++++ b/infra/conf/xray.go +@@ -27,6 +27,7 @@ + var ( + inboundConfigLoader = NewJSONConfigLoader(ConfigCreatorCache{ + "tunnel": func() interface{} { return new(DokodemoConfig) }, ++ "tuic": func() interface{} { return new(TUICServerConfig) }, + "naive": func() interface{} { return new(NaiveServerConfig) }, + "dokodemo-door": func() interface{} { return new(DokodemoConfig) }, + "http": func() interface{} { return new(HTTPServerConfig) }, +@@ -57,6 +58,7 @@ + "vmess": func() interface{} { return new(VMessOutboundConfig) }, + "trojan": func() interface{} { return new(TrojanClientConfig) }, + "naive": func() interface{} { return new(NaiveClientConfig) }, ++ "tuic": func() interface{} { return new(TUICClientConfig) }, + "shadowsocksr": func() interface{} { return new(ShadowsocksRClientConfig) }, + "anytls": func() interface{} { return new(AnyTLSClientConfig) }, + "hysteria": func() interface{} { return new(HysteriaClientConfig) }, +--- a/main/distro/all/all.go ++++ b/main/distro/all/all.go +@@ -48,6 +48,7 @@ + _ "github.com/xtls/xray-core/proxy/shadowsocksr" + _ "github.com/xtls/xray-core/proxy/socks" + _ "github.com/xtls/xray-core/proxy/trojan" ++ _ "github.com/xtls/xray-core/proxy/tuic" + _ "github.com/xtls/xray-core/proxy/vless/inbound" + _ "github.com/xtls/xray-core/proxy/vless/outbound" + _ "github.com/xtls/xray-core/proxy/vmess/inbound" +--- a/proxy/freedom/freedom.go ++++ b/proxy/freedom/freedom.go +@@ -172,7 +172,7 @@ + switch inbound.Name { + case "vless-reverse": + return defaultBlockAllRule +- case "vless", "vmess", "trojan", "hysteria", "wireguard", "masque", "naive": ++ case "vless", "vmess", "trojan", "hysteria", "wireguard", "masque", "naive", "tuic": + return defaultBlockPrivateRule + default: + if strings.HasPrefix(inbound.Name, "shadowsocks") { +--- a/proxy/tuic/LICENSE.mihomo ++++ b/proxy/tuic/LICENSE.mihomo +@@ -0,0 +1,674 @@ ++ GNU GENERAL PUBLIC LICENSE ++ Version 3, 29 June 2007 ++ ++ Copyright (C) 2007 Free Software Foundation, Inc. ++ Everyone is permitted to copy and distribute verbatim copies ++ of this license document, but changing it is not allowed. ++ ++ Preamble ++ ++ The GNU General Public License is a free, copyleft license for ++software and other kinds of works. ++ ++ The licenses for most software and other practical works are designed ++to take away your freedom to share and change the works. By contrast, ++the GNU General Public License is intended to guarantee your freedom to ++share and change all versions of a program--to make sure it remains free ++software for all its users. We, the Free Software Foundation, use the ++GNU General Public License for most of our software; it applies also to ++any other work released this way by its authors. You can apply it to ++your programs, too. ++ ++ When we speak of free software, we are referring to freedom, not ++price. Our General Public Licenses are designed to make sure that you ++have the freedom to distribute copies of free software (and charge for ++them if you wish), that you receive source code or can get it if you ++want it, that you can change the software or use pieces of it in new ++free programs, and that you know you can do these things. ++ ++ To protect your rights, we need to prevent others from denying you ++these rights or asking you to surrender the rights. Therefore, you have ++certain responsibilities if you distribute copies of the software, or if ++you modify it: responsibilities to respect the freedom of others. ++ ++ For example, if you distribute copies of such a program, whether ++gratis or for a fee, you must pass on to the recipients the same ++freedoms that you received. You must make sure that they, too, receive ++or can get the source code. And you must show them these terms so they ++know their rights. ++ ++ Developers that use the GNU GPL protect your rights with two steps: ++(1) assert copyright on the software, and (2) offer you this License ++giving you legal permission to copy, distribute and/or modify it. ++ ++ For the developers' and authors' protection, the GPL clearly explains ++that there is no warranty for this free software. For both users' and ++authors' sake, the GPL requires that modified versions be marked as ++changed, so that their problems will not be attributed erroneously to ++authors of previous versions. ++ ++ Some devices are designed to deny users access to install or run ++modified versions of the software inside them, although the manufacturer ++can do so. This is fundamentally incompatible with the aim of ++protecting users' freedom to change the software. The systematic ++pattern of such abuse occurs in the area of products for individuals to ++use, which is precisely where it is most unacceptable. Therefore, we ++have designed this version of the GPL to prohibit the practice for those ++products. If such problems arise substantially in other domains, we ++stand ready to extend this provision to those domains in future versions ++of the GPL, as needed to protect the freedom of users. ++ ++ Finally, every program is threatened constantly by software patents. ++States should not allow patents to restrict development and use of ++software on general-purpose computers, but in those that do, we wish to ++avoid the special danger that patents applied to a free program could ++make it effectively proprietary. To prevent this, the GPL assures that ++patents cannot be used to render the program non-free. ++ ++ The precise terms and conditions for copying, distribution and ++modification follow. ++ ++ TERMS AND CONDITIONS ++ ++ 0. Definitions. ++ ++ "This License" refers to version 3 of the GNU General Public License. ++ ++ "Copyright" also means copyright-like laws that apply to other kinds of ++works, such as semiconductor masks. ++ ++ "The Program" refers to any copyrightable work licensed under this ++License. Each licensee is addressed as "you". "Licensees" and ++"recipients" may be individuals or organizations. ++ ++ To "modify" a work means to copy from or adapt all or part of the work ++in a fashion requiring copyright permission, other than the making of an ++exact copy. The resulting work is called a "modified version" of the ++earlier work or a work "based on" the earlier work. ++ ++ A "covered work" means either the unmodified Program or a work based ++on the Program. ++ ++ To "propagate" a work means to do anything with it that, without ++permission, would make you directly or secondarily liable for ++infringement under applicable copyright law, except executing it on a ++computer or modifying a private copy. Propagation includes copying, ++distribution (with or without modification), making available to the ++public, and in some countries other activities as well. ++ ++ To "convey" a work means any kind of propagation that enables other ++parties to make or receive copies. Mere interaction with a user through ++a computer network, with no transfer of a copy, is not conveying. ++ ++ An interactive user interface displays "Appropriate Legal Notices" ++to the extent that it includes a convenient and prominently visible ++feature that (1) displays an appropriate copyright notice, and (2) ++tells the user that there is no warranty for the work (except to the ++extent that warranties are provided), that licensees may convey the ++work under this License, and how to view a copy of this License. If ++the interface presents a list of user commands or options, such as a ++menu, a prominent item in the list meets this criterion. ++ ++ 1. Source Code. ++ ++ The "source code" for a work means the preferred form of the work ++for making modifications to it. "Object code" means any non-source ++form of a work. ++ ++ A "Standard Interface" means an interface that either is an official ++standard defined by a recognized standards body, or, in the case of ++interfaces specified for a particular programming language, one that ++is widely used among developers working in that language. ++ ++ The "System Libraries" of an executable work include anything, other ++than the work as a whole, that (a) is included in the normal form of ++packaging a Major Component, but which is not part of that Major ++Component, and (b) serves only to enable use of the work with that ++Major Component, or to implement a Standard Interface for which an ++implementation is available to the public in source code form. A ++"Major Component", in this context, means a major essential component ++(kernel, window system, and so on) of the specific operating system ++(if any) on which the executable work runs, or a compiler used to ++produce the work, or an object code interpreter used to run it. ++ ++ The "Corresponding Source" for a work in object code form means all ++the source code needed to generate, install, and (for an executable ++work) run the object code and to modify the work, including scripts to ++control those activities. However, it does not include the work's ++System Libraries, or general-purpose tools or generally available free ++programs which are used unmodified in performing those activities but ++which are not part of the work. For example, Corresponding Source ++includes interface definition files associated with source files for ++the work, and the source code for shared libraries and dynamically ++linked subprograms that the work is specifically designed to require, ++such as by intimate data communication or control flow between those ++subprograms and other parts of the work. ++ ++ The Corresponding Source need not include anything that users ++can regenerate automatically from other parts of the Corresponding ++Source. ++ ++ The Corresponding Source for a work in source code form is that ++same work. ++ ++ 2. Basic Permissions. ++ ++ All rights granted under this License are granted for the term of ++copyright on the Program, and are irrevocable provided the stated ++conditions are met. This License explicitly affirms your unlimited ++permission to run the unmodified Program. The output from running a ++covered work is covered by this License only if the output, given its ++content, constitutes a covered work. This License acknowledges your ++rights of fair use or other equivalent, as provided by copyright law. ++ ++ You may make, run and propagate covered works that you do not ++convey, without conditions so long as your license otherwise remains ++in force. You may convey covered works to others for the sole purpose ++of having them make modifications exclusively for you, or provide you ++with facilities for running those works, provided that you comply with ++the terms of this License in conveying all material for which you do ++not control copyright. Those thus making or running the covered works ++for you must do so exclusively on your behalf, under your direction ++and control, on terms that prohibit them from making any copies of ++your copyrighted material outside their relationship with you. ++ ++ Conveying under any other circumstances is permitted solely under ++the conditions stated below. Sublicensing is not allowed; section 10 ++makes it unnecessary. ++ ++ 3. Protecting Users' Legal Rights From Anti-Circumvention Law. ++ ++ No covered work shall be deemed part of an effective technological ++measure under any applicable law fulfilling obligations under article ++11 of the WIPO copyright treaty adopted on 20 December 1996, or ++similar laws prohibiting or restricting circumvention of such ++measures. ++ ++ When you convey a covered work, you waive any legal power to forbid ++circumvention of technological measures to the extent such circumvention ++is effected by exercising rights under this License with respect to ++the covered work, and you disclaim any intention to limit operation or ++modification of the work as a means of enforcing, against the work's ++users, your or third parties' legal rights to forbid circumvention of ++technological measures. ++ ++ 4. Conveying Verbatim Copies. ++ ++ You may convey verbatim copies of the Program's source code as you ++receive it, in any medium, provided that you conspicuously and ++appropriately publish on each copy an appropriate copyright notice; ++keep intact all notices stating that this License and any ++non-permissive terms added in accord with section 7 apply to the code; ++keep intact all notices of the absence of any warranty; and give all ++recipients a copy of this License along with the Program. ++ ++ You may charge any price or no price for each copy that you convey, ++and you may offer support or warranty protection for a fee. ++ ++ 5. Conveying Modified Source Versions. ++ ++ You may convey a work based on the Program, or the modifications to ++produce it from the Program, in the form of source code under the ++terms of section 4, provided that you also meet all of these conditions: ++ ++ a) The work must carry prominent notices stating that you modified ++ it, and giving a relevant date. ++ ++ b) The work must carry prominent notices stating that it is ++ released under this License and any conditions added under section ++ 7. This requirement modifies the requirement in section 4 to ++ "keep intact all notices". ++ ++ c) You must license the entire work, as a whole, under this ++ License to anyone who comes into possession of a copy. This ++ License will therefore apply, along with any applicable section 7 ++ additional terms, to the whole of the work, and all its parts, ++ regardless of how they are packaged. This License gives no ++ permission to license the work in any other way, but it does not ++ invalidate such permission if you have separately received it. ++ ++ d) If the work has interactive user interfaces, each must display ++ Appropriate Legal Notices; however, if the Program has interactive ++ interfaces that do not display Appropriate Legal Notices, your ++ work need not make them do so. ++ ++ A compilation of a covered work with other separate and independent ++works, which are not by their nature extensions of the covered work, ++and which are not combined with it such as to form a larger program, ++in or on a volume of a storage or distribution medium, is called an ++"aggregate" if the compilation and its resulting copyright are not ++used to limit the access or legal rights of the compilation's users ++beyond what the individual works permit. Inclusion of a covered work ++in an aggregate does not cause this License to apply to the other ++parts of the aggregate. ++ ++ 6. Conveying Non-Source Forms. ++ ++ You may convey a covered work in object code form under the terms ++of sections 4 and 5, provided that you also convey the ++machine-readable Corresponding Source under the terms of this License, ++in one of these ways: ++ ++ a) Convey the object code in, or embodied in, a physical product ++ (including a physical distribution medium), accompanied by the ++ Corresponding Source fixed on a durable physical medium ++ customarily used for software interchange. ++ ++ b) Convey the object code in, or embodied in, a physical product ++ (including a physical distribution medium), accompanied by a ++ written offer, valid for at least three years and valid for as ++ long as you offer spare parts or customer support for that product ++ model, to give anyone who possesses the object code either (1) a ++ copy of the Corresponding Source for all the software in the ++ product that is covered by this License, on a durable physical ++ medium customarily used for software interchange, for a price no ++ more than your reasonable cost of physically performing this ++ conveying of source, or (2) access to copy the ++ Corresponding Source from a network server at no charge. ++ ++ c) Convey individual copies of the object code with a copy of the ++ written offer to provide the Corresponding Source. This ++ alternative is allowed only occasionally and noncommercially, and ++ only if you received the object code with such an offer, in accord ++ with subsection 6b. ++ ++ d) Convey the object code by offering access from a designated ++ place (gratis or for a charge), and offer equivalent access to the ++ Corresponding Source in the same way through the same place at no ++ further charge. You need not require recipients to copy the ++ Corresponding Source along with the object code. If the place to ++ copy the object code is a network server, the Corresponding Source ++ may be on a different server (operated by you or a third party) ++ that supports equivalent copying facilities, provided you maintain ++ clear directions next to the object code saying where to find the ++ Corresponding Source. Regardless of what server hosts the ++ Corresponding Source, you remain obligated to ensure that it is ++ available for as long as needed to satisfy these requirements. ++ ++ e) Convey the object code using peer-to-peer transmission, provided ++ you inform other peers where the object code and Corresponding ++ Source of the work are being offered to the general public at no ++ charge under subsection 6d. ++ ++ A separable portion of the object code, whose source code is excluded ++from the Corresponding Source as a System Library, need not be ++included in conveying the object code work. ++ ++ A "User Product" is either (1) a "consumer product", which means any ++tangible personal property which is normally used for personal, family, ++or household purposes, or (2) anything designed or sold for incorporation ++into a dwelling. In determining whether a product is a consumer product, ++doubtful cases shall be resolved in favor of coverage. For a particular ++product received by a particular user, "normally used" refers to a ++typical or common use of that class of product, regardless of the status ++of the particular user or of the way in which the particular user ++actually uses, or expects or is expected to use, the product. A product ++is a consumer product regardless of whether the product has substantial ++commercial, industrial or non-consumer uses, unless such uses represent ++the only significant mode of use of the product. ++ ++ "Installation Information" for a User Product means any methods, ++procedures, authorization keys, or other information required to install ++and execute modified versions of a covered work in that User Product from ++a modified version of its Corresponding Source. The information must ++suffice to ensure that the continued functioning of the modified object ++code is in no case prevented or interfered with solely because ++modification has been made. ++ ++ If you convey an object code work under this section in, or with, or ++specifically for use in, a User Product, and the conveying occurs as ++part of a transaction in which the right of possession and use of the ++User Product is transferred to the recipient in perpetuity or for a ++fixed term (regardless of how the transaction is characterized), the ++Corresponding Source conveyed under this section must be accompanied ++by the Installation Information. But this requirement does not apply ++if neither you nor any third party retains the ability to install ++modified object code on the User Product (for example, the work has ++been installed in ROM). ++ ++ The requirement to provide Installation Information does not include a ++requirement to continue to provide support service, warranty, or updates ++for a work that has been modified or installed by the recipient, or for ++the User Product in which it has been modified or installed. Access to a ++network may be denied when the modification itself materially and ++adversely affects the operation of the network or violates the rules and ++protocols for communication across the network. ++ ++ Corresponding Source conveyed, and Installation Information provided, ++in accord with this section must be in a format that is publicly ++documented (and with an implementation available to the public in ++source code form), and must require no special password or key for ++unpacking, reading or copying. ++ ++ 7. Additional Terms. ++ ++ "Additional permissions" are terms that supplement the terms of this ++License by making exceptions from one or more of its conditions. ++Additional permissions that are applicable to the entire Program shall ++be treated as though they were included in this License, to the extent ++that they are valid under applicable law. If additional permissions ++apply only to part of the Program, that part may be used separately ++under those permissions, but the entire Program remains governed by ++this License without regard to the additional permissions. ++ ++ When you convey a copy of a covered work, you may at your option ++remove any additional permissions from that copy, or from any part of ++it. (Additional permissions may be written to require their own ++removal in certain cases when you modify the work.) You may place ++additional permissions on material, added by you to a covered work, ++for which you have or can give appropriate copyright permission. ++ ++ Notwithstanding any other provision of this License, for material you ++add to a covered work, you may (if authorized by the copyright holders of ++that material) supplement the terms of this License with terms: ++ ++ a) Disclaiming warranty or limiting liability differently from the ++ terms of sections 15 and 16 of this License; or ++ ++ b) Requiring preservation of specified reasonable legal notices or ++ author attributions in that material or in the Appropriate Legal ++ Notices displayed by works containing it; or ++ ++ c) Prohibiting misrepresentation of the origin of that material, or ++ requiring that modified versions of such material be marked in ++ reasonable ways as different from the original version; or ++ ++ d) Limiting the use for publicity purposes of names of licensors or ++ authors of the material; or ++ ++ e) Declining to grant rights under trademark law for use of some ++ trade names, trademarks, or service marks; or ++ ++ f) Requiring indemnification of licensors and authors of that ++ material by anyone who conveys the material (or modified versions of ++ it) with contractual assumptions of liability to the recipient, for ++ any liability that these contractual assumptions directly impose on ++ those licensors and authors. ++ ++ All other non-permissive additional terms are considered "further ++restrictions" within the meaning of section 10. If the Program as you ++received it, or any part of it, contains a notice stating that it is ++governed by this License along with a term that is a further ++restriction, you may remove that term. If a license document contains ++a further restriction but permits relicensing or conveying under this ++License, you may add to a covered work material governed by the terms ++of that license document, provided that the further restriction does ++not survive such relicensing or conveying. ++ ++ If you add terms to a covered work in accord with this section, you ++must place, in the relevant source files, a statement of the ++additional terms that apply to those files, or a notice indicating ++where to find the applicable terms. ++ ++ Additional terms, permissive or non-permissive, may be stated in the ++form of a separately written license, or stated as exceptions; ++the above requirements apply either way. ++ ++ 8. Termination. ++ ++ You may not propagate or modify a covered work except as expressly ++provided under this License. Any attempt otherwise to propagate or ++modify it is void, and will automatically terminate your rights under ++this License (including any patent licenses granted under the third ++paragraph of section 11). ++ ++ However, if you cease all violation of this License, then your ++license from a particular copyright holder is reinstated (a) ++provisionally, unless and until the copyright holder explicitly and ++finally terminates your license, and (b) permanently, if the copyright ++holder fails to notify you of the violation by some reasonable means ++prior to 60 days after the cessation. ++ ++ Moreover, your license from a particular copyright holder is ++reinstated permanently if the copyright holder notifies you of the ++violation by some reasonable means, this is the first time you have ++received notice of violation of this License (for any work) from that ++copyright holder, and you cure the violation prior to 30 days after ++your receipt of the notice. ++ ++ Termination of your rights under this section does not terminate the ++licenses of parties who have received copies or rights from you under ++this License. If your rights have been terminated and not permanently ++reinstated, you do not qualify to receive new licenses for the same ++material under section 10. ++ ++ 9. Acceptance Not Required for Having Copies. ++ ++ You are not required to accept this License in order to receive or ++run a copy of the Program. Ancillary propagation of a covered work ++occurring solely as a consequence of using peer-to-peer transmission ++to receive a copy likewise does not require acceptance. However, ++nothing other than this License grants you permission to propagate or ++modify any covered work. These actions infringe copyright if you do ++not accept this License. Therefore, by modifying or propagating a ++covered work, you indicate your acceptance of this License to do so. ++ ++ 10. Automatic Licensing of Downstream Recipients. ++ ++ Each time you convey a covered work, the recipient automatically ++receives a license from the original licensors, to run, modify and ++propagate that work, subject to this License. You are not responsible ++for enforcing compliance by third parties with this License. ++ ++ An "entity transaction" is a transaction transferring control of an ++organization, or substantially all assets of one, or subdividing an ++organization, or merging organizations. If propagation of a covered ++work results from an entity transaction, each party to that ++transaction who receives a copy of the work also receives whatever ++licenses to the work the party's predecessor in interest had or could ++give under the previous paragraph, plus a right to possession of the ++Corresponding Source of the work from the predecessor in interest, if ++the predecessor has it or can get it with reasonable efforts. ++ ++ You may not impose any further restrictions on the exercise of the ++rights granted or affirmed under this License. For example, you may ++not impose a license fee, royalty, or other charge for exercise of ++rights granted under this License, and you may not initiate litigation ++(including a cross-claim or counterclaim in a lawsuit) alleging that ++any patent claim is infringed by making, using, selling, offering for ++sale, or importing the Program or any portion of it. ++ ++ 11. Patents. ++ ++ A "contributor" is a copyright holder who authorizes use under this ++License of the Program or a work on which the Program is based. The ++work thus licensed is called the contributor's "contributor version". ++ ++ A contributor's "essential patent claims" are all patent claims ++owned or controlled by the contributor, whether already acquired or ++hereafter acquired, that would be infringed by some manner, permitted ++by this License, of making, using, or selling its contributor version, ++but do not include claims that would be infringed only as a ++consequence of further modification of the contributor version. For ++purposes of this definition, "control" includes the right to grant ++patent sublicenses in a manner consistent with the requirements of ++this License. ++ ++ Each contributor grants you a non-exclusive, worldwide, royalty-free ++patent license under the contributor's essential patent claims, to ++make, use, sell, offer for sale, import and otherwise run, modify and ++propagate the contents of its contributor version. ++ ++ In the following three paragraphs, a "patent license" is any express ++agreement or commitment, however denominated, not to enforce a patent ++(such as an express permission to practice a patent or covenant not to ++sue for patent infringement). To "grant" such a patent license to a ++party means to make such an agreement or commitment not to enforce a ++patent against the party. ++ ++ If you convey a covered work, knowingly relying on a patent license, ++and the Corresponding Source of the work is not available for anyone ++to copy, free of charge and under the terms of this License, through a ++publicly available network server or other readily accessible means, ++then you must either (1) cause the Corresponding Source to be so ++available, or (2) arrange to deprive yourself of the benefit of the ++patent license for this particular work, or (3) arrange, in a manner ++consistent with the requirements of this License, to extend the patent ++license to downstream recipients. "Knowingly relying" means you have ++actual knowledge that, but for the patent license, your conveying the ++covered work in a country, or your recipient's use of the covered work ++in a country, would infringe one or more identifiable patents in that ++country that you have reason to believe are valid. ++ ++ If, pursuant to or in connection with a single transaction or ++arrangement, you convey, or propagate by procuring conveyance of, a ++covered work, and grant a patent license to some of the parties ++receiving the covered work authorizing them to use, propagate, modify ++or convey a specific copy of the covered work, then the patent license ++you grant is automatically extended to all recipients of the covered ++work and works based on it. ++ ++ A patent license is "discriminatory" if it does not include within ++the scope of its coverage, prohibits the exercise of, or is ++conditioned on the non-exercise of one or more of the rights that are ++specifically granted under this License. You may not convey a covered ++work if you are a party to an arrangement with a third party that is ++in the business of distributing software, under which you make payment ++to the third party based on the extent of your activity of conveying ++the work, and under which the third party grants, to any of the ++parties who would receive the covered work from you, a discriminatory ++patent license (a) in connection with copies of the covered work ++conveyed by you (or copies made from those copies), or (b) primarily ++for and in connection with specific products or compilations that ++contain the covered work, unless you entered into that arrangement, ++or that patent license was granted, prior to 28 March 2007. ++ ++ Nothing in this License shall be construed as excluding or limiting ++any implied license or other defenses to infringement that may ++otherwise be available to you under applicable patent law. ++ ++ 12. No Surrender of Others' Freedom. ++ ++ If conditions are imposed on you (whether by court order, agreement or ++otherwise) that contradict the conditions of this License, they do not ++excuse you from the conditions of this License. If you cannot convey a ++covered work so as to satisfy simultaneously your obligations under this ++License and any other pertinent obligations, then as a consequence you may ++not convey it at all. For example, if you agree to terms that obligate you ++to collect a royalty for further conveying from those to whom you convey ++the Program, the only way you could satisfy both those terms and this ++License would be to refrain entirely from conveying the Program. ++ ++ 13. Use with the GNU Affero General Public License. ++ ++ Notwithstanding any other provision of this License, you have ++permission to link or combine any covered work with a work licensed ++under version 3 of the GNU Affero General Public License into a single ++combined work, and to convey the resulting work. The terms of this ++License will continue to apply to the part which is the covered work, ++but the special requirements of the GNU Affero General Public License, ++section 13, concerning interaction through a network will apply to the ++combination as such. ++ ++ 14. Revised Versions of this License. ++ ++ The Free Software Foundation may publish revised and/or new versions of ++the GNU General Public License from time to time. Such new versions will ++be similar in spirit to the present version, but may differ in detail to ++address new problems or concerns. ++ ++ Each version is given a distinguishing version number. If the ++Program specifies that a certain numbered version of the GNU General ++Public License "or any later version" applies to it, you have the ++option of following the terms and conditions either of that numbered ++version or of any later version published by the Free Software ++Foundation. If the Program does not specify a version number of the ++GNU General Public License, you may choose any version ever published ++by the Free Software Foundation. ++ ++ If the Program specifies that a proxy can decide which future ++versions of the GNU General Public License can be used, that proxy's ++public statement of acceptance of a version permanently authorizes you ++to choose that version for the Program. ++ ++ Later license versions may give you additional or different ++permissions. However, no additional obligations are imposed on any ++author or copyright holder as a result of your choosing to follow a ++later version. ++ ++ 15. Disclaimer of Warranty. ++ ++ THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY ++APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT ++HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY ++OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, ++THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR ++PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM ++IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ++ALL NECESSARY SERVICING, REPAIR OR CORRECTION. ++ ++ 16. Limitation of Liability. ++ ++ IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING ++WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS ++THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY ++GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE ++USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF ++DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD ++PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), ++EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF ++SUCH DAMAGES. ++ ++ 17. Interpretation of Sections 15 and 16. ++ ++ If the disclaimer of warranty and limitation of liability provided ++above cannot be given local legal effect according to their terms, ++reviewing courts shall apply local law that most closely approximates ++an absolute waiver of all civil liability in connection with the ++Program, unless a warranty or assumption of liability accompanies a ++copy of the Program in return for a fee. ++ ++ END OF TERMS AND CONDITIONS ++ ++ How to Apply These Terms to Your New Programs ++ ++ If you develop a new program, and you want it to be of the greatest ++possible use to the public, the best way to achieve this is to make it ++free software which everyone can redistribute and change under these terms. ++ ++ To do so, attach the following notices to the program. It is safest ++to attach them to the start of each source file to most effectively ++state the exclusion of warranty; and each file should have at least ++the "copyright" line and a pointer to where the full notice is found. ++ ++ ++ Copyright (C) ++ ++ This program is free software: you can redistribute it and/or modify ++ it under the terms of the GNU General Public License as published by ++ the Free Software Foundation, either version 3 of the License, or ++ (at your option) any later version. ++ ++ This program is distributed in the hope that it will be useful, ++ but WITHOUT ANY WARRANTY; without even the implied warranty of ++ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++ GNU General Public License for more details. ++ ++ You should have received a copy of the GNU General Public License ++ along with this program. If not, see . ++ ++Also add information on how to contact you by electronic and paper mail. ++ ++ If the program does terminal interaction, make it output a short ++notice like this when it starts in an interactive mode: ++ ++ Copyright (C) ++ This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. ++ This is free software, and you are welcome to redistribute it ++ under certain conditions; type `show c' for details. ++ ++The hypothetical commands `show w' and `show c' should show the appropriate ++parts of the General Public License. Of course, your program's commands ++might be different; for a GUI interface, you would use an "about box". ++ ++ You should also get your employer (if you work as a programmer) or school, ++if any, to sign a "copyright disclaimer" for the program, if necessary. ++For more information on this, and how to apply and follow the GNU GPL, see ++. ++ ++ The GNU General Public License does not permit incorporating your program ++into proprietary programs. If your program is a subroutine library, you ++may consider it more useful to permit linking proprietary applications with ++the library. If this is what you want to do, use the GNU Lesser General ++Public License instead of this License. But first, please read ++. +--- a/proxy/tuic/client.go ++++ b/proxy/tuic/client.go +@@ -0,0 +1,230 @@ ++package tuic ++ ++import ( ++ "context" ++ "crypto/x509" ++ stderrors "errors" ++ "github.com/gofrs/uuid/v5" ++ C "github.com/metacubex/mihomo/constant" ++ T "github.com/metacubex/mihomo/transport/tuic" ++ TC "github.com/metacubex/mihomo/transport/tuic/common" ++ Q "github.com/metacubex/quic-go" ++ TLS "github.com/metacubex/tls" ++ "github.com/xtls/xray-core/common" ++ "github.com/xtls/xray-core/common/buf" ++ "github.com/xtls/xray-core/common/errors" ++ "github.com/xtls/xray-core/common/net" ++ "github.com/xtls/xray-core/common/session" ++ "github.com/xtls/xray-core/core" ++ "github.com/xtls/xray-core/features/policy" ++ "github.com/xtls/xray-core/transport" ++ "github.com/xtls/xray-core/transport/internet" ++ "net/netip" ++ "os" ++ "sync" ++ "time" ++) ++ ++type Client struct { ++ config *ClientConfig ++ tls *TLS.Config ++ policy policy.Session ++ mu sync.Mutex ++ clients []T.Client ++ udpClients map[T.Client]bool ++ closed bool ++ connections map[*Q.Conn]struct{} ++} ++ ++func NewClient(ctx context.Context, c *ClientConfig) (*Client, error) { ++ if c.Address == nil || c.Port == 0 || c.Port > 65535 { ++ return nil, errors.New("tuic: invalid server") ++ } ++ name := c.ServerName ++ if name == "" { ++ name = c.Address.AsAddress().String() ++ } ++ tls := &TLS.Config{ServerName: name, InsecureSkipVerify: c.AllowInsecure, NextProtos: c.Alpn, MinVersion: TLS.VersionTLS13} ++ if len(tls.NextProtos) == 0 { ++ tls.NextProtos = []string{"h3"} ++ } ++ if c.CertificateFile != "" { ++ pem, err := os.ReadFile(c.CertificateFile) ++ if err != nil { ++ return nil, err ++ } ++ roots, err := x509.SystemCertPool() ++ if err != nil { ++ roots = x509.NewCertPool() ++ } ++ if !roots.AppendCertsFromPEM(pem) { ++ return nil, errors.New("tuic: invalid CA") ++ } ++ tls.RootCAs = roots ++ } ++ return &Client{config: c, tls: tls, policy: core.MustFromContext(ctx).GetFeature(policy.ManagerType()).(policy.Manager).ForLevel(c.Level)}, nil ++} ++func (c *Client) Close() error { ++ c.mu.Lock() ++ defer c.mu.Unlock() ++ c.closed = true ++ for conn := range c.connections { ++ conn.CloseWithError(0, "outbound closed") ++ } ++ for _, v := range c.clients { ++ v.Close() ++ } ++ c.clients = nil ++ return nil ++} ++func (c *Client) newClient(dialer internet.Dialer, udp bool, force bool) (T.Client, error) { ++ c.mu.Lock() ++ defer c.mu.Unlock() ++ if c.closed { ++ return nil, errors.New("tuic: closed") ++ } ++ active := c.clients[:0] ++ for _, v := range c.clients { ++ if v.OpenStreams() == 0 && !v.LastVisited().IsZero() && time.Since(v.LastVisited()) > 10*time.Minute { ++ v.Close() ++ delete(c.udpClients, v) ++ } else { ++ active = append(active, v) ++ } ++ } ++ c.clients = active ++ for _, v := range c.clients { ++ if !force && c.udpClients[v] == udp && v.OpenStreams()+1 < int64(c.config.MaxOpenStreams) { ++ v.SetLastVisited(time.Now()) ++ return v, nil ++ } ++ } ++ if c.udpClients == nil { ++ c.udpClients = make(map[T.Client]bool) ++ } ++ conf := c.config ++ dial := func(ctx context.Context) (*Q.Conn, error) { ++ raw, err := dialer.Dial(ctx, net.UDPDestination(conf.Address.AsAddress(), net.Port(conf.Port))) ++ if err != nil { ++ return nil, err ++ } ++ pc := &connectedPacketConn{Conn: raw} ++ qc := &Q.Config{EnableDatagrams: true, MaxIncomingStreams: 1024, MaxIncomingUniStreams: 1024, KeepAlivePeriod: time.Duration(conf.HeartbeatInterval) * time.Millisecond, MaxDatagramFrameSize: 1400, InitialStreamReceiveWindow: TC.DefaultStreamReceiveWindow / 10, MaxStreamReceiveWindow: TC.DefaultStreamReceiveWindow, InitialConnectionReceiveWindow: TC.DefaultConnectionReceiveWindow / 10, MaxConnectionReceiveWindow: TC.DefaultConnectionReceiveWindow} ++ tr := &Q.Transport{Conn: pc} ++ var conn *Q.Conn ++ if conf.ReduceRtt { ++ conn, err = tr.DialEarly(ctx, raw.RemoteAddr(), c.tls, qc) ++ } else { ++ conn, err = tr.Dial(ctx, raw.RemoteAddr(), c.tls, qc) ++ } ++ if err != nil { ++ tr.Close() ++ raw.Close() ++ return nil, err ++ } ++ c.mu.Lock() ++ if c.closed { ++ c.mu.Unlock() ++ conn.CloseWithError(0, "closed") ++ tr.Close() ++ raw.Close() ++ return nil, errors.New("tuic: closed") ++ } ++ if c.connections == nil { ++ c.connections = make(map[*Q.Conn]struct{}) ++ } ++ c.connections[conn] = struct{}{} ++ c.mu.Unlock() ++ TC.SetCongestionController(conn, conf.CongestionControl, 32, "") ++ go func() { ++ <-conn.Context().Done() ++ c.mu.Lock() ++ delete(c.connections, conn) ++ c.mu.Unlock() ++ tr.Close() ++ raw.Close() ++ }() ++ return conn, nil ++ } ++ mode := T.NATIVE ++ if conf.UdpRelayMode == "quic" { ++ mode = T.QUIC ++ } ++ var v T.Client ++ if conf.Version == 4 { ++ v = T.NewClientV4(&T.ClientOptionV4{Token: T.GenTKN(conf.Token), UdpRelayMode: mode, RequestTimeout: time.Duration(conf.RequestTimeout) * time.Millisecond, FastOpen: conf.FastOpen, MaxOpenStreams: int64(conf.MaxOpenStreams), MaxUdpRelayPacketSize: int(conf.MaxUdpRelayPacketSize)}, udp, dial) ++ } else { ++ id, _ := uuid.FromString(conf.Uuid) ++ v = T.NewClientV5(&T.ClientOptionV5{Uuid: id, Password: conf.Password, UdpRelayMode: mode, MaxOpenStreams: int64(conf.MaxOpenStreams), MaxUdpRelayPacketSize: int(conf.MaxUdpRelayPacketSize)}, udp, dial) ++ } ++ v.SetLastVisited(time.Now()) ++ c.clients = append(c.clients, v) ++ c.udpClients[v] = udp ++ return v, nil ++} ++func metadata(d net.Destination) *C.Metadata { ++ m := &C.Metadata{DstPort: uint16(d.Port)} ++ if d.Address.Family().IsDomain() { ++ m.Host = d.Address.Domain() ++ } else { ++ m.DstIP, _ = netip.AddrFromSlice(d.Address.IP()) ++ } ++ return m ++} ++func (c *Client) Process(ctx context.Context, link *transport.Link, dialer internet.Dialer) error { ++ obs := session.OutboundsFromContext(ctx) ++ if len(obs) == 0 { ++ return errors.New("tuic: missing target") ++ } ++ ob := obs[len(obs)-1] ++ target := ob.Target ++ if !target.IsValid() || (target.Network != net.Network_TCP && target.Network != net.Network_UDP) { ++ return errors.New("tuic: invalid target") ++ } ++ ob.Name = "tuic" ++ ob.CanSpliceCopy = 3 ++ v, err := c.newClient(dialer, target.Network == net.Network_UDP, false) ++ if err != nil { ++ return err ++ } ++ var reader buf.Reader ++ var writer buf.Writer ++ var stopIO func() ++ if target.Network == net.Network_TCP { ++ conn, e := v.DialContext(ctx, metadata(target)) ++ if stderrors.Is(e, T.TooManyOpenStreams) { ++ v, e = c.newClient(dialer, false, true) ++ if e == nil { ++ conn, e = v.DialContext(ctx, metadata(target)) ++ } ++ } ++ if e != nil { ++ return e ++ } ++ defer conn.Close() ++ stopIO = func() { conn.SetDeadline(time.Now()) } ++ reader = buf.NewReader(conn) ++ writer = buf.NewWriter(conn) ++ } else { ++ pc, e := v.ListenPacket(ctx, metadata(target)) ++ if stderrors.Is(e, T.TooManyOpenStreams) { ++ v, e = c.newClient(dialer, true, true) ++ if e == nil { ++ pc, e = v.ListenPacket(ctx, metadata(target)) ++ } ++ } ++ if e != nil { ++ return e ++ } ++ defer pc.Close() ++ stopIO = func() { pc.SetReadDeadline(time.Now()) } ++ reader = &packetReader{conn: pc} ++ writer = &packetWriter{conn: pc, destination: target} ++ } ++ return relay(ctx, link.Reader, writer, reader, link.Writer, stopIO, c.policy) ++} ++func init() { ++ common.Must(common.RegisterConfig((*ClientConfig)(nil), func(ctx context.Context, c interface{}) (interface{}, error) { ++ return NewClient(ctx, c.(*ClientConfig)) ++ })) ++} +--- a/proxy/tuic/config.pb.go ++++ b/proxy/tuic/config.pb.go +@@ -0,0 +1,290 @@ ++// Code generated by protoc-gen-go. DO NOT EDIT. ++// versions: ++// protoc-gen-go v1.36.12 ++// protoc v3.21.12 ++// source: proxy/tuic/config.proto ++ ++package tuic ++ ++import ( ++ net "github.com/xtls/xray-core/common/net" ++ protoreflect "google.golang.org/protobuf/reflect/protoreflect" ++ protoimpl "google.golang.org/protobuf/runtime/protoimpl" ++ reflect "reflect" ++ sync "sync" ++ unsafe "unsafe" ++) ++ ++const ( ++ // Verify that this generated code is sufficiently up-to-date. ++ _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) ++ // Verify that runtime/protoimpl is sufficiently up-to-date. ++ _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) ++) ++ ++type ClientConfig struct { ++ state protoimpl.MessageState `protogen:"open.v1"` ++ Address *net.IPOrDomain `protobuf:"bytes,1,opt,name=address,proto3" json:"address,omitempty"` ++ Port uint32 `protobuf:"varint,2,opt,name=port,proto3" json:"port,omitempty"` ++ Version uint32 `protobuf:"varint,3,opt,name=version,proto3" json:"version,omitempty"` ++ Token string `protobuf:"bytes,4,opt,name=token,proto3" json:"token,omitempty"` ++ Uuid string `protobuf:"bytes,5,opt,name=uuid,proto3" json:"uuid,omitempty"` ++ Password string `protobuf:"bytes,6,opt,name=password,proto3" json:"password,omitempty"` ++ ServerName string `protobuf:"bytes,7,opt,name=server_name,json=serverName,proto3" json:"server_name,omitempty"` ++ CertificateFile string `protobuf:"bytes,8,opt,name=certificate_file,json=certificateFile,proto3" json:"certificate_file,omitempty"` ++ AllowInsecure bool `protobuf:"varint,9,opt,name=allow_insecure,json=allowInsecure,proto3" json:"allow_insecure,omitempty"` ++ Alpn []string `protobuf:"bytes,10,rep,name=alpn,proto3" json:"alpn,omitempty"` ++ CongestionControl string `protobuf:"bytes,11,opt,name=congestion_control,json=congestionControl,proto3" json:"congestion_control,omitempty"` ++ UdpRelayMode string `protobuf:"bytes,12,opt,name=udp_relay_mode,json=udpRelayMode,proto3" json:"udp_relay_mode,omitempty"` ++ ReduceRtt bool `protobuf:"varint,13,opt,name=reduce_rtt,json=reduceRtt,proto3" json:"reduce_rtt,omitempty"` ++ FastOpen bool `protobuf:"varint,14,opt,name=fast_open,json=fastOpen,proto3" json:"fast_open,omitempty"` ++ HeartbeatInterval uint32 `protobuf:"varint,15,opt,name=heartbeat_interval,json=heartbeatInterval,proto3" json:"heartbeat_interval,omitempty"` ++ RequestTimeout uint32 `protobuf:"varint,16,opt,name=request_timeout,json=requestTimeout,proto3" json:"request_timeout,omitempty"` ++ MaxOpenStreams uint32 `protobuf:"varint,17,opt,name=max_open_streams,json=maxOpenStreams,proto3" json:"max_open_streams,omitempty"` ++ MaxUdpRelayPacketSize uint32 `protobuf:"varint,18,opt,name=max_udp_relay_packet_size,json=maxUdpRelayPacketSize,proto3" json:"max_udp_relay_packet_size,omitempty"` ++ Level uint32 `protobuf:"varint,19,opt,name=level,proto3" json:"level,omitempty"` ++ unknownFields protoimpl.UnknownFields ++ sizeCache protoimpl.SizeCache ++} ++ ++func (x *ClientConfig) Reset() { ++ *x = ClientConfig{} ++ mi := &file_proxy_tuic_config_proto_msgTypes[0] ++ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ++ ms.StoreMessageInfo(mi) ++} ++ ++func (x *ClientConfig) String() string { ++ return protoimpl.X.MessageStringOf(x) ++} ++ ++func (*ClientConfig) ProtoMessage() {} ++ ++func (x *ClientConfig) ProtoReflect() protoreflect.Message { ++ mi := &file_proxy_tuic_config_proto_msgTypes[0] ++ if x != nil { ++ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ++ if ms.LoadMessageInfo() == nil { ++ ms.StoreMessageInfo(mi) ++ } ++ return ms ++ } ++ return mi.MessageOf(x) ++} ++ ++// Deprecated: Use ClientConfig.ProtoReflect.Descriptor instead. ++func (*ClientConfig) Descriptor() ([]byte, []int) { ++ return file_proxy_tuic_config_proto_rawDescGZIP(), []int{0} ++} ++ ++func (x *ClientConfig) GetAddress() *net.IPOrDomain { ++ if x != nil { ++ return x.Address ++ } ++ return nil ++} ++ ++func (x *ClientConfig) GetPort() uint32 { ++ if x != nil { ++ return x.Port ++ } ++ return 0 ++} ++ ++func (x *ClientConfig) GetVersion() uint32 { ++ if x != nil { ++ return x.Version ++ } ++ return 0 ++} ++ ++func (x *ClientConfig) GetToken() string { ++ if x != nil { ++ return x.Token ++ } ++ return "" ++} ++ ++func (x *ClientConfig) GetUuid() string { ++ if x != nil { ++ return x.Uuid ++ } ++ return "" ++} ++ ++func (x *ClientConfig) GetPassword() string { ++ if x != nil { ++ return x.Password ++ } ++ return "" ++} ++ ++func (x *ClientConfig) GetServerName() string { ++ if x != nil { ++ return x.ServerName ++ } ++ return "" ++} ++ ++func (x *ClientConfig) GetCertificateFile() string { ++ if x != nil { ++ return x.CertificateFile ++ } ++ return "" ++} ++ ++func (x *ClientConfig) GetAllowInsecure() bool { ++ if x != nil { ++ return x.AllowInsecure ++ } ++ return false ++} ++ ++func (x *ClientConfig) GetAlpn() []string { ++ if x != nil { ++ return x.Alpn ++ } ++ return nil ++} ++ ++func (x *ClientConfig) GetCongestionControl() string { ++ if x != nil { ++ return x.CongestionControl ++ } ++ return "" ++} ++ ++func (x *ClientConfig) GetUdpRelayMode() string { ++ if x != nil { ++ return x.UdpRelayMode ++ } ++ return "" ++} ++ ++func (x *ClientConfig) GetReduceRtt() bool { ++ if x != nil { ++ return x.ReduceRtt ++ } ++ return false ++} ++ ++func (x *ClientConfig) GetFastOpen() bool { ++ if x != nil { ++ return x.FastOpen ++ } ++ return false ++} ++ ++func (x *ClientConfig) GetHeartbeatInterval() uint32 { ++ if x != nil { ++ return x.HeartbeatInterval ++ } ++ return 0 ++} ++ ++func (x *ClientConfig) GetRequestTimeout() uint32 { ++ if x != nil { ++ return x.RequestTimeout ++ } ++ return 0 ++} ++ ++func (x *ClientConfig) GetMaxOpenStreams() uint32 { ++ if x != nil { ++ return x.MaxOpenStreams ++ } ++ return 0 ++} ++ ++func (x *ClientConfig) GetMaxUdpRelayPacketSize() uint32 { ++ if x != nil { ++ return x.MaxUdpRelayPacketSize ++ } ++ return 0 ++} ++ ++func (x *ClientConfig) GetLevel() uint32 { ++ if x != nil { ++ return x.Level ++ } ++ return 0 ++} ++ ++var File_proxy_tuic_config_proto protoreflect.FileDescriptor ++ ++const file_proxy_tuic_config_proto_rawDesc = "" + ++ "\n" + ++ "\x17proxy/tuic/config.proto\x12\x0fxray.proxy.tuic\x1a\x18common/net/address.proto\"\xa3\x05\n" + ++ "\fClientConfig\x125\n" + ++ "\aaddress\x18\x01 \x01(\v2\x1b.xray.common.net.IPOrDomainR\aaddress\x12\x12\n" + ++ "\x04port\x18\x02 \x01(\rR\x04port\x12\x18\n" + ++ "\aversion\x18\x03 \x01(\rR\aversion\x12\x14\n" + ++ "\x05token\x18\x04 \x01(\tR\x05token\x12\x12\n" + ++ "\x04uuid\x18\x05 \x01(\tR\x04uuid\x12\x1a\n" + ++ "\bpassword\x18\x06 \x01(\tR\bpassword\x12\x1f\n" + ++ "\vserver_name\x18\a \x01(\tR\n" + ++ "serverName\x12)\n" + ++ "\x10certificate_file\x18\b \x01(\tR\x0fcertificateFile\x12%\n" + ++ "\x0eallow_insecure\x18\t \x01(\bR\rallowInsecure\x12\x12\n" + ++ "\x04alpn\x18\n" + ++ " \x03(\tR\x04alpn\x12-\n" + ++ "\x12congestion_control\x18\v \x01(\tR\x11congestionControl\x12$\n" + ++ "\x0eudp_relay_mode\x18\f \x01(\tR\fudpRelayMode\x12\x1d\n" + ++ "\n" + ++ "reduce_rtt\x18\r \x01(\bR\treduceRtt\x12\x1b\n" + ++ "\tfast_open\x18\x0e \x01(\bR\bfastOpen\x12-\n" + ++ "\x12heartbeat_interval\x18\x0f \x01(\rR\x11heartbeatInterval\x12'\n" + ++ "\x0frequest_timeout\x18\x10 \x01(\rR\x0erequestTimeout\x12(\n" + ++ "\x10max_open_streams\x18\x11 \x01(\rR\x0emaxOpenStreams\x128\n" + ++ "\x19max_udp_relay_packet_size\x18\x12 \x01(\rR\x15maxUdpRelayPacketSize\x12\x14\n" + ++ "\x05level\x18\x13 \x01(\rR\x05levelB&Z$github.com/xtls/xray-core/proxy/tuicb\x06proto3" ++ ++var ( ++ file_proxy_tuic_config_proto_rawDescOnce sync.Once ++ file_proxy_tuic_config_proto_rawDescData []byte ++) ++ ++func file_proxy_tuic_config_proto_rawDescGZIP() []byte { ++ file_proxy_tuic_config_proto_rawDescOnce.Do(func() { ++ file_proxy_tuic_config_proto_rawDescData = protoimpl.X.CompressGZIP(unsafe.Slice(unsafe.StringData(file_proxy_tuic_config_proto_rawDesc), len(file_proxy_tuic_config_proto_rawDesc))) ++ }) ++ return file_proxy_tuic_config_proto_rawDescData ++} ++ ++var file_proxy_tuic_config_proto_msgTypes = make([]protoimpl.MessageInfo, 1) ++var file_proxy_tuic_config_proto_goTypes = []any{ ++ (*ClientConfig)(nil), // 0: xray.proxy.tuic.ClientConfig ++ (*net.IPOrDomain)(nil), // 1: xray.common.net.IPOrDomain ++} ++var file_proxy_tuic_config_proto_depIdxs = []int32{ ++ 1, // 0: xray.proxy.tuic.ClientConfig.address:type_name -> xray.common.net.IPOrDomain ++ 1, // [1:1] is the sub-list for method output_type ++ 1, // [1:1] is the sub-list for method input_type ++ 1, // [1:1] is the sub-list for extension type_name ++ 1, // [1:1] is the sub-list for extension extendee ++ 0, // [0:1] is the sub-list for field type_name ++} ++ ++func init() { file_proxy_tuic_config_proto_init() } ++func file_proxy_tuic_config_proto_init() { ++ if File_proxy_tuic_config_proto != nil { ++ return ++ } ++ type x struct{} ++ out := protoimpl.TypeBuilder{ ++ File: protoimpl.DescBuilder{ ++ GoPackagePath: reflect.TypeOf(x{}).PkgPath(), ++ RawDescriptor: unsafe.Slice(unsafe.StringData(file_proxy_tuic_config_proto_rawDesc), len(file_proxy_tuic_config_proto_rawDesc)), ++ NumEnums: 0, ++ NumMessages: 1, ++ NumExtensions: 0, ++ NumServices: 0, ++ }, ++ GoTypes: file_proxy_tuic_config_proto_goTypes, ++ DependencyIndexes: file_proxy_tuic_config_proto_depIdxs, ++ MessageInfos: file_proxy_tuic_config_proto_msgTypes, ++ }.Build() ++ File_proxy_tuic_config_proto = out.File ++ file_proxy_tuic_config_proto_goTypes = nil ++ file_proxy_tuic_config_proto_depIdxs = nil ++} +--- a/proxy/tuic/config.proto ++++ b/proxy/tuic/config.proto +@@ -0,0 +1,25 @@ ++syntax = "proto3"; ++package xray.proxy.tuic; ++option go_package = "github.com/xtls/xray-core/proxy/tuic"; ++import "common/net/address.proto"; ++message ClientConfig { ++ xray.common.net.IPOrDomain address = 1; ++ uint32 port = 2; ++ uint32 version = 3; ++ string token = 4; ++ string uuid = 5; ++ string password = 6; ++ string server_name = 7; ++ string certificate_file = 8; ++ bool allow_insecure = 9; ++ repeated string alpn = 10; ++ string congestion_control = 11; ++ string udp_relay_mode = 12; ++ bool reduce_rtt = 13; ++ bool fast_open = 14; ++ uint32 heartbeat_interval = 15; ++ uint32 request_timeout = 16; ++ uint32 max_open_streams = 17; ++ uint32 max_udp_relay_packet_size = 18; ++ uint32 level = 19; ++} +--- a/proxy/tuic/packet.go ++++ b/proxy/tuic/packet.go +@@ -0,0 +1,51 @@ ++package tuic ++ ++import ( ++ M "github.com/sagernet/sing/common/metadata" ++ "github.com/xtls/xray-core/common/buf" ++ N "github.com/xtls/xray-core/common/net" ++ "net" ++) ++ ++type connectedPacketConn struct{ net.Conn } ++ ++func (c *connectedPacketConn) ReadFrom(b []byte) (int, net.Addr, error) { ++ n, e := c.Read(b) ++ return n, c.RemoteAddr(), e ++} ++func (c *connectedPacketConn) WriteTo(b []byte, _ net.Addr) (int, error) { return c.Write(b) } ++ ++type packetReader struct{ conn net.PacketConn } ++ ++func (r *packetReader) ReadMultiBuffer() (buf.MultiBuffer, error) { ++ data := make([]byte, 65535) ++ n, a, e := r.conn.ReadFrom(data) ++ if e != nil { ++ return nil, e ++ } ++ b := buf.FromBytes(data[:n]) ++ m := M.SocksaddrFromNet(a) ++ d := N.UDPDestination(N.ParseAddress(m.AddrString()), N.Port(m.Port)) ++ b.UDP = &d ++ return buf.MultiBuffer{b}, nil ++} ++ ++type packetWriter struct { ++ conn net.PacketConn ++ destination N.Destination ++} ++ ++func (w *packetWriter) WriteMultiBuffer(mb buf.MultiBuffer) error { ++ defer buf.ReleaseMulti(mb) ++ for _, b := range mb { ++ d := w.destination ++ if b.UDP != nil { ++ d = *b.UDP ++ } ++ a := M.ParseSocksaddrHostPort(d.Address.String(), uint16(d.Port)) ++ if _, e := w.conn.WriteTo(b.Bytes(), a); e != nil { ++ return e ++ } ++ } ++ return nil ++} +--- a/proxy/tuic/relay.go ++++ b/proxy/tuic/relay.go +@@ -0,0 +1,60 @@ ++package tuic ++ ++import ( ++ "context" ++ "github.com/xtls/xray-core/common" ++ "github.com/xtls/xray-core/common/buf" ++ "github.com/xtls/xray-core/common/signal" ++ "github.com/xtls/xray-core/features/policy" ++) ++ ++// Stop blocked reads and join both copy loops before closing Mihomo packet state. ++func relay(ctx context.Context, upR buf.Reader, upW buf.Writer, downR buf.Reader, downW buf.Writer, stopIO func(), p policy.Session) error { ++ ctx, cancel := context.WithCancel(ctx) ++ defer cancel() ++ timer := signal.CancelAfterInactivity(ctx, cancel, p.Timeouts.ConnectionIdle) ++ defer timer.SetTimeout(0) ++ results := make(chan error, 2) ++ go func() { ++ e := buf.Copy(upR, upW, buf.UpdateActivity(timer)) ++ if e == nil { ++ common.Close(upW) ++ } ++ timer.SetTimeout(p.Timeouts.DownlinkOnly) ++ results <- e ++ }() ++ go func() { ++ e := buf.Copy(downR, downW, buf.UpdateActivity(timer)) ++ if e == nil { ++ common.Close(downW) ++ } ++ timer.SetTimeout(p.Timeouts.UplinkOnly) ++ results <- e ++ }() ++ var first error ++ count := 0 ++ for count < 2 { ++ select { ++ case e := <-results: ++ count++ ++ if e != nil { ++ first = e ++ } ++ case <-ctx.Done(): ++ first = ctx.Err() ++ } ++ if first != nil || count == 2 { ++ break ++ } ++ } ++ stopIO() ++ common.Interrupt(upR) ++ common.Interrupt(upW) ++ common.Interrupt(downR) ++ common.Interrupt(downW) ++ for count < 2 { ++ <-results ++ count++ ++ } ++ return first ++} +--- a/proxy/tuic/server.go ++++ b/proxy/tuic/server.go +@@ -0,0 +1,96 @@ ++package tuic ++ ++import ( ++ "context" ++ M "github.com/sagernet/sing/common/metadata" ++ "github.com/xtls/xray-core/common" ++ "github.com/xtls/xray-core/common/buf" ++ "github.com/xtls/xray-core/common/errors" ++ "github.com/xtls/xray-core/common/net" ++ "github.com/xtls/xray-core/common/protocol" ++ "github.com/xtls/xray-core/common/session" ++ "github.com/xtls/xray-core/common/signal" ++ "github.com/xtls/xray-core/common/task" ++ "github.com/xtls/xray-core/features/routing" ++ "github.com/xtls/xray-core/transport/internet" ++ "github.com/xtls/xray-core/transport/internet/stat" ++ T "github.com/xtls/xray-core/transport/internet/tuic" ++ "time" ++) ++ ++type Server struct{ config *T.Config } ++ ++func (s *Server) Network() []net.Network { return []net.Network{net.Network_TCP} } ++func (s *Server) Process(ctx context.Context, _ net.Network, conn stat.Connection, d routing.Dispatcher) error { ++ c, ok := stat.TryUnwrapStatsConn(conn).(*T.Conn) ++ if !ok { ++ return errors.New("tuic: requires TUIC transport") ++ } ++ defer c.Close() ++ if in := session.InboundFromContext(ctx); in != nil { ++ copy := *in ++ copy.Name = "tuic" ++ copy.User = &protocol.MemoryUser{Email: c.User, Level: s.config.Level} ++ ctx = session.ContextWithInbound(ctx, ©) ++ } ++ ctx, cancel := context.WithCancel(ctx) ++ defer cancel() ++ stop := context.AfterFunc(ctx, func() { c.Close() }) ++ defer stop() ++ timer := signal.CancelAfterInactivity(ctx, cancel, 5*time.Minute) ++ defer timer.SetTimeout(0) ++ link, err := d.Dispatch(ctx, c.Target) ++ if err != nil { ++ return err ++ } ++ var reader buf.Reader = buf.NewReader(c) ++ var writer buf.Writer = buf.NewWriter(c) ++ if c.Packets != nil { ++ reader = &inPacketReader{c} ++ writer = &inPacketWriter{c} ++ } ++ err = task.Run(ctx, func() error { return buf.Copy(reader, link.Writer, buf.UpdateActivity(timer)) }, task.OnSuccess(func() error { return buf.Copy(link.Reader, writer, buf.UpdateActivity(timer)) }, task.Close(link.Writer))) ++ common.Interrupt(link.Reader) ++ common.Interrupt(link.Writer) ++ return err ++} ++ ++type inPacketReader struct{ c *T.Conn } ++ ++func (r *inPacketReader) ReadMultiBuffer() (buf.MultiBuffer, error) { ++ p, e := r.c.ReadPacket() ++ if e != nil { ++ return nil, e ++ } ++ b := buf.FromBytes(append([]byte(nil), p.Packet.Data()...)) ++ p.Packet.Drop() ++ b.UDP = &p.Target ++ return buf.MultiBuffer{b}, nil ++} ++ ++type inPacketWriter struct{ c *T.Conn } ++ ++func (w *inPacketWriter) WriteMultiBuffer(mb buf.MultiBuffer) error { ++ defer buf.ReleaseMulti(mb) ++ for _, b := range mb { ++ d := w.c.Target ++ if b.UDP != nil { ++ d = *b.UDP ++ } ++ a := M.ParseSocksaddrHostPort(d.Address.String(), uint16(d.Port)) ++ if e := w.c.WritePacket(b.Bytes(), a); e != nil { ++ return e ++ } ++ } ++ return nil ++} ++func init() { ++ common.Must(common.RegisterConfig((*T.Config)(nil), func(ctx context.Context, c interface{}) (interface{}, error) { ++ m, _ := session.StreamSettingsFromContext(ctx).(*internet.MemoryStreamConfig) ++ if m == nil || m.ProtocolName != "tuic" { ++ return nil, errors.New("tuic inbound requires network tuic") ++ } ++ m.ProtocolSettings = c ++ return &Server{c.(*T.Config)}, nil ++ })) ++} +--- a/transport/internet/tuic/config.pb.go ++++ b/transport/internet/tuic/config.pb.go +@@ -0,0 +1,200 @@ ++// Code generated by protoc-gen-go. DO NOT EDIT. ++// versions: ++// protoc-gen-go v1.36.12 ++// protoc v3.21.12 ++// source: transport/internet/tuic/config.proto ++ ++package tuic ++ ++import ( ++ protoreflect "google.golang.org/protobuf/reflect/protoreflect" ++ protoimpl "google.golang.org/protobuf/runtime/protoimpl" ++ reflect "reflect" ++ sync "sync" ++ unsafe "unsafe" ++) ++ ++const ( ++ // Verify that this generated code is sufficiently up-to-date. ++ _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) ++ // Verify that runtime/protoimpl is sufficiently up-to-date. ++ _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) ++) ++ ++type Config struct { ++ state protoimpl.MessageState `protogen:"open.v1"` ++ Tokens []string `protobuf:"bytes,1,rep,name=tokens,proto3" json:"tokens,omitempty"` ++ Users map[string]string `protobuf:"bytes,2,rep,name=users,proto3" json:"users,omitempty" protobuf_key:"bytes,1,opt,name=key" protobuf_val:"bytes,2,opt,name=value"` ++ CertificateFile string `protobuf:"bytes,3,opt,name=certificate_file,json=certificateFile,proto3" json:"certificate_file,omitempty"` ++ KeyFile string `protobuf:"bytes,4,opt,name=key_file,json=keyFile,proto3" json:"key_file,omitempty"` ++ Alpn []string `protobuf:"bytes,5,rep,name=alpn,proto3" json:"alpn,omitempty"` ++ CongestionControl string `protobuf:"bytes,6,opt,name=congestion_control,json=congestionControl,proto3" json:"congestion_control,omitempty"` ++ AuthenticationTimeout uint32 `protobuf:"varint,7,opt,name=authentication_timeout,json=authenticationTimeout,proto3" json:"authentication_timeout,omitempty"` ++ MaxUdpRelayPacketSize uint32 `protobuf:"varint,8,opt,name=max_udp_relay_packet_size,json=maxUdpRelayPacketSize,proto3" json:"max_udp_relay_packet_size,omitempty"` ++ Level uint32 `protobuf:"varint,9,opt,name=level,proto3" json:"level,omitempty"` ++ unknownFields protoimpl.UnknownFields ++ sizeCache protoimpl.SizeCache ++} ++ ++func (x *Config) Reset() { ++ *x = Config{} ++ mi := &file_transport_internet_tuic_config_proto_msgTypes[0] ++ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ++ ms.StoreMessageInfo(mi) ++} ++ ++func (x *Config) String() string { ++ return protoimpl.X.MessageStringOf(x) ++} ++ ++func (*Config) ProtoMessage() {} ++ ++func (x *Config) ProtoReflect() protoreflect.Message { ++ mi := &file_transport_internet_tuic_config_proto_msgTypes[0] ++ if x != nil { ++ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ++ if ms.LoadMessageInfo() == nil { ++ ms.StoreMessageInfo(mi) ++ } ++ return ms ++ } ++ return mi.MessageOf(x) ++} ++ ++// Deprecated: Use Config.ProtoReflect.Descriptor instead. ++func (*Config) Descriptor() ([]byte, []int) { ++ return file_transport_internet_tuic_config_proto_rawDescGZIP(), []int{0} ++} ++ ++func (x *Config) GetTokens() []string { ++ if x != nil { ++ return x.Tokens ++ } ++ return nil ++} ++ ++func (x *Config) GetUsers() map[string]string { ++ if x != nil { ++ return x.Users ++ } ++ return nil ++} ++ ++func (x *Config) GetCertificateFile() string { ++ if x != nil { ++ return x.CertificateFile ++ } ++ return "" ++} ++ ++func (x *Config) GetKeyFile() string { ++ if x != nil { ++ return x.KeyFile ++ } ++ return "" ++} ++ ++func (x *Config) GetAlpn() []string { ++ if x != nil { ++ return x.Alpn ++ } ++ return nil ++} ++ ++func (x *Config) GetCongestionControl() string { ++ if x != nil { ++ return x.CongestionControl ++ } ++ return "" ++} ++ ++func (x *Config) GetAuthenticationTimeout() uint32 { ++ if x != nil { ++ return x.AuthenticationTimeout ++ } ++ return 0 ++} ++ ++func (x *Config) GetMaxUdpRelayPacketSize() uint32 { ++ if x != nil { ++ return x.MaxUdpRelayPacketSize ++ } ++ return 0 ++} ++ ++func (x *Config) GetLevel() uint32 { ++ if x != nil { ++ return x.Level ++ } ++ return 0 ++} ++ ++var File_transport_internet_tuic_config_proto protoreflect.FileDescriptor ++ ++const file_transport_internet_tuic_config_proto_rawDesc = "" + ++ "\n" + ++ "$transport/internet/tuic/config.proto\x12\x1cxray.transport.internet.tuic\"\xb1\x03\n" + ++ "\x06Config\x12\x16\n" + ++ "\x06tokens\x18\x01 \x03(\tR\x06tokens\x12E\n" + ++ "\x05users\x18\x02 \x03(\v2/.xray.transport.internet.tuic.Config.UsersEntryR\x05users\x12)\n" + ++ "\x10certificate_file\x18\x03 \x01(\tR\x0fcertificateFile\x12\x19\n" + ++ "\bkey_file\x18\x04 \x01(\tR\akeyFile\x12\x12\n" + ++ "\x04alpn\x18\x05 \x03(\tR\x04alpn\x12-\n" + ++ "\x12congestion_control\x18\x06 \x01(\tR\x11congestionControl\x125\n" + ++ "\x16authentication_timeout\x18\a \x01(\rR\x15authenticationTimeout\x128\n" + ++ "\x19max_udp_relay_packet_size\x18\b \x01(\rR\x15maxUdpRelayPacketSize\x12\x14\n" + ++ "\x05level\x18\t \x01(\rR\x05level\x1a8\n" + ++ "\n" + ++ "UsersEntry\x12\x10\n" + ++ "\x03key\x18\x01 \x01(\tR\x03key\x12\x14\n" + ++ "\x05value\x18\x02 \x01(\tR\x05value:\x028\x01B3Z1github.com/xtls/xray-core/transport/internet/tuicb\x06proto3" ++ ++var ( ++ file_transport_internet_tuic_config_proto_rawDescOnce sync.Once ++ file_transport_internet_tuic_config_proto_rawDescData []byte ++) ++ ++func file_transport_internet_tuic_config_proto_rawDescGZIP() []byte { ++ file_transport_internet_tuic_config_proto_rawDescOnce.Do(func() { ++ file_transport_internet_tuic_config_proto_rawDescData = protoimpl.X.CompressGZIP(unsafe.Slice(unsafe.StringData(file_transport_internet_tuic_config_proto_rawDesc), len(file_transport_internet_tuic_config_proto_rawDesc))) ++ }) ++ return file_transport_internet_tuic_config_proto_rawDescData ++} ++ ++var file_transport_internet_tuic_config_proto_msgTypes = make([]protoimpl.MessageInfo, 2) ++var file_transport_internet_tuic_config_proto_goTypes = []any{ ++ (*Config)(nil), // 0: xray.transport.internet.tuic.Config ++ nil, // 1: xray.transport.internet.tuic.Config.UsersEntry ++} ++var file_transport_internet_tuic_config_proto_depIdxs = []int32{ ++ 1, // 0: xray.transport.internet.tuic.Config.users:type_name -> xray.transport.internet.tuic.Config.UsersEntry ++ 1, // [1:1] is the sub-list for method output_type ++ 1, // [1:1] is the sub-list for method input_type ++ 1, // [1:1] is the sub-list for extension type_name ++ 1, // [1:1] is the sub-list for extension extendee ++ 0, // [0:1] is the sub-list for field type_name ++} ++ ++func init() { file_transport_internet_tuic_config_proto_init() } ++func file_transport_internet_tuic_config_proto_init() { ++ if File_transport_internet_tuic_config_proto != nil { ++ return ++ } ++ type x struct{} ++ out := protoimpl.TypeBuilder{ ++ File: protoimpl.DescBuilder{ ++ GoPackagePath: reflect.TypeOf(x{}).PkgPath(), ++ RawDescriptor: unsafe.Slice(unsafe.StringData(file_transport_internet_tuic_config_proto_rawDesc), len(file_transport_internet_tuic_config_proto_rawDesc)), ++ NumEnums: 0, ++ NumMessages: 2, ++ NumExtensions: 0, ++ NumServices: 0, ++ }, ++ GoTypes: file_transport_internet_tuic_config_proto_goTypes, ++ DependencyIndexes: file_transport_internet_tuic_config_proto_depIdxs, ++ MessageInfos: file_transport_internet_tuic_config_proto_msgTypes, ++ }.Build() ++ File_transport_internet_tuic_config_proto = out.File ++ file_transport_internet_tuic_config_proto_goTypes = nil ++ file_transport_internet_tuic_config_proto_depIdxs = nil ++} +--- a/transport/internet/tuic/config.proto ++++ b/transport/internet/tuic/config.proto +@@ -0,0 +1,14 @@ ++syntax = "proto3"; ++package xray.transport.internet.tuic; ++option go_package = "github.com/xtls/xray-core/transport/internet/tuic"; ++message Config { ++ repeated string tokens = 1; ++ map users = 2; ++ string certificate_file = 3; ++ string key_file = 4; ++ repeated string alpn = 5; ++ string congestion_control = 6; ++ uint32 authentication_timeout = 7; ++ uint32 max_udp_relay_packet_size = 8; ++ uint32 level = 9; ++} +--- a/transport/internet/tuic/hub.go ++++ b/transport/internet/tuic/hub.go +@@ -0,0 +1,218 @@ ++package tuic ++ ++import ( ++ "context" ++ "errors" ++ "github.com/gofrs/uuid/v5" ++ I "github.com/metacubex/mihomo/adapter/inbound" ++ C "github.com/metacubex/mihomo/constant" ++ S "github.com/metacubex/mihomo/transport/socks5" ++ T "github.com/metacubex/mihomo/transport/tuic" ++ Q "github.com/metacubex/quic-go" ++ TLS "github.com/metacubex/tls" ++ "github.com/xtls/xray-core/common" ++ N "github.com/xtls/xray-core/common/net" ++ "github.com/xtls/xray-core/transport/internet" ++ "io" ++ "net" ++ "sync" ++ "time" ++) ++ ++type Datagram struct { ++ Packet C.UDPPacket ++ Target N.Destination ++} ++type Conn struct { ++ net.Conn ++ Target N.Destination ++ Packets chan Datagram ++ ctx context.Context ++ cancel context.CancelFunc ++ local, remote net.Addr ++ User string ++ mu sync.Mutex ++ last C.UDPPacket ++ packetMu sync.Mutex ++} ++ ++func (c *Conn) ReadPacket() (Datagram, error) { ++ select { ++ case p := <-c.Packets: ++ c.mu.Lock() ++ c.last = p.Packet ++ c.mu.Unlock() ++ return p, nil ++ case <-c.ctx.Done(): ++ return Datagram{}, io.EOF ++ } ++} ++func (c *Conn) WritePacket(b []byte, a net.Addr) error { ++ c.mu.Lock() ++ p := c.last ++ c.mu.Unlock() ++ if p == nil { ++ return errors.New("tuic: no UDP association") ++ } ++ _, e := p.WriteBack(b, a) ++ return e ++} ++func (c *Conn) Close() error { ++ if c.cancel != nil { ++ c.packetMu.Lock() ++ defer c.packetMu.Unlock() ++ c.cancel() ++ for { ++ select { ++ case p := <-c.Packets: ++ p.Packet.Drop() ++ default: ++ return nil ++ } ++ } ++ } ++ return c.Conn.Close() ++} ++func (c *Conn) LocalAddr() net.Addr { ++ if c.Packets != nil { ++ return c.local ++ } ++ return c.Conn.LocalAddr() ++} ++func (c *Conn) RemoteAddr() net.Addr { ++ if c.Packets != nil { ++ if raw, ok := c.remote.(interface{ RawAddr() net.Addr }); ok { ++ return raw.RawAddr() ++ } ++ return c.remote ++ } ++ return c.Conn.RemoteAddr() ++} ++func (c *Conn) SetDeadline(t time.Time) error { ++ if c.Packets != nil { ++ return nil ++ } ++ return c.Conn.SetDeadline(t) ++} ++func (c *Conn) SetReadDeadline(t time.Time) error { ++ if c.Packets != nil { ++ return nil ++ } ++ return c.Conn.SetReadDeadline(t) ++} ++func (c *Conn) SetWriteDeadline(t time.Time) error { ++ if c.Packets != nil { ++ return nil ++ } ++ return c.Conn.SetWriteDeadline(t) ++} ++ ++type Listener struct { ++ server *T.Server ++ pc net.PacketConn ++ cancel context.CancelFunc ++} ++ ++func (l *Listener) Addr() net.Addr { return l.pc.LocalAddr() } ++func (l *Listener) Close() error { l.cancel(); return errors.Join(l.server.Close(), l.pc.Close()) } ++func target(a S.Addr, network N.Network) (N.Destination, error) { ++ d, e := N.ParseDestination("tcp:" + a.String()) ++ d.Network = network ++ return d, e ++} ++func Listen(ctx context.Context, address N.Address, port N.Port, settings *internet.MemoryStreamConfig, add internet.ConnHandler) (internet.Listener, error) { ++ c := settings.ProtocolSettings.(*Config) ++ cert, e := TLS.LoadX509KeyPair(c.CertificateFile, c.KeyFile) ++ if e != nil { ++ return nil, e ++ } ++ alpn := c.Alpn ++ if len(alpn) == 0 { ++ alpn = []string{"h3"} ++ } ++ pc, e := internet.ListenSystemPacket(ctx, &net.UDPAddr{IP: address.IP(), Port: int(port)}, settings.SocketSettings) ++ if e != nil { ++ return nil, e ++ } ++ ctx, cancel := context.WithCancel(ctx) ++ var mu sync.Mutex ++ associations := map[string]*Conn{} ++ option := &T.ServerOption{TlsConfig: &TLS.Config{Certificates: []TLS.Certificate{cert}, NextProtos: alpn, MinVersion: TLS.VersionTLS13}, QuicConfig: &Q.Config{EnableDatagrams: true, Allow0RTT: true, MaxIncomingStreams: 1024, MaxIncomingUniStreams: 1024, MaxDatagramFrameSize: 1400}, CongestionController: c.CongestionControl, AuthenticationTimeout: time.Duration(c.AuthenticationTimeout) * time.Millisecond, MaxUdpRelayPacketSize: int(c.MaxUdpRelayPacketSize), Users: map[[16]byte]string{}} ++ for _, token := range c.Tokens { ++ option.Tokens = append(option.Tokens, T.GenTKN(token)) ++ } ++ for id, pass := range c.Users { ++ u, err := uuid.FromString(id) ++ if err != nil { ++ cancel() ++ pc.Close() ++ return nil, err ++ } ++ option.Users[u] = pass ++ } ++ user := func(a []I.Addition) string { m := &C.Metadata{}; I.ApplyAdditions(m, a...); return m.InUser } ++ option.HandleTcpFn = func(conn net.Conn, a S.Addr, adds ...I.Addition) error { ++ d, err := target(a, N.Network_TCP) ++ if err != nil { ++ conn.Close() ++ return err ++ } ++ add(&Conn{Conn: conn, Target: d, User: user(adds)}) ++ return nil ++ } ++ option.HandleUdpFn = func(a S.Addr, p C.UDPPacket, adds ...I.Addition) error { ++ d, err := target(a, N.Network_UDP) ++ if err != nil { ++ p.Drop() ++ return err ++ } ++ key := p.LocalAddr().String() + "|" + user(adds) ++ mu.Lock() ++ conn := associations[key] ++ if conn != nil && conn.ctx.Err() != nil { ++ delete(associations, key) ++ conn = nil ++ } ++ if conn == nil { ++ cc, stop := context.WithCancel(ctx) ++ conn = &Conn{Target: d, Packets: make(chan Datagram, 64), ctx: cc, cancel: stop, local: pc.LocalAddr(), remote: p.LocalAddr(), User: user(adds)} ++ associations[key] = conn ++ add(conn) ++ go func(cn *Conn) { ++ <-cn.ctx.Done() ++ mu.Lock() ++ if associations[key] == cn { ++ delete(associations, key) ++ } ++ mu.Unlock() ++ cn.Close() ++ }(conn) ++ } ++ mu.Unlock() ++ conn.packetMu.Lock() ++ if conn.ctx.Err() != nil { ++ p.Drop() ++ } else { ++ select { ++ case conn.Packets <- Datagram{p, d}: ++ default: ++ p.Drop() ++ } ++ } ++ conn.packetMu.Unlock() ++ return nil ++ } ++ server, err := T.NewServer(option, pc) ++ if err != nil { ++ cancel() ++ pc.Close() ++ return nil, err ++ } ++ l := &Listener{server: server, pc: pc, cancel: cancel} ++ go server.Serve() ++ return l, nil ++} ++func init() { ++ common.Must(internet.RegisterProtocolConfigCreator("tuic", func() interface{} { return &Config{} })) ++ common.Must(internet.RegisterTransportListener("tuic", Listen)) ++} diff --git a/xray-core/patches/160-add-snell-proxy.patch b/xray-core/patches/160-add-snell-proxy.patch new file mode 100644 index 000000000..63e365cf0 --- /dev/null +++ b/xray-core/patches/160-add-snell-proxy.patch @@ -0,0 +1,1642 @@ +From: coolsnowwolf +Subject: [PATCH] proxy: add Mihomo Snell inbound and outbound + +Reuse the pinned Mihomo v1.19.32 Snell encryption and framing implementation. +Support v1-v4 and v5's v4-compatible path, TCP, UDP for v3+, HTTP/TLS obfs, +and reusable TCP sessions. Adapt requests to Xray routing and socket options. +Join relay loops before recycling connections and retain private-target rules. + +Signed-off-by: coolsnowwolf + +--- a/go.mod ++++ b/go.mod +@@ -94,6 +94,7 @@ + github.com/sirupsen/logrus v1.9.4 // indirect + github.com/vishvananda/netns v0.0.5 // indirect + github.com/wlynxg/anet v0.0.5 // indirect ++ gitlab.com/go-extension/aes-ccm v0.0.0-20230221065045-e58665ef23c7 // indirect + go.yaml.in/yaml/v3 v3.0.5 // indirect + golang.org/x/text v0.43.0 // indirect + golang.org/x/tools v0.51.0 // indirect +--- a/go.sum ++++ b/go.sum +@@ -177,6 +177,8 @@ + github.com/yuin/gopher-lua v0.0.0-20190206043414-8bfc7677f583/go.mod h1:gqRgreBUhTSL0GeU64rtZ3Uq3wtjOa/TB2YfrtkCbVQ= + github.com/yuin/gopher-lua v1.1.2 h1:yF/FjE3hD65tBbt0VXLE13HWS9h34fdzJmrWRXwobGA= + github.com/yuin/gopher-lua v1.1.2/go.mod h1:7aRmXIWl37SqRf0koeyylBEzJ+aPt8A+mmkQ4f1ntR8= ++gitlab.com/go-extension/aes-ccm v0.0.0-20230221065045-e58665ef23c7 h1:UNrDfkQqiEYzdMlNsVvBYOAJWZjdktqFE9tQh5BT2+4= ++gitlab.com/go-extension/aes-ccm v0.0.0-20230221065045-e58665ef23c7/go.mod h1:E+rxHvJG9H6PUdzq9NRG6csuLN3XUx98BfGOVWNYnXs= + go.uber.org/mock v0.5.2 h1:LbtPTcP8A5k9WPXj54PPPbjcI4Y6lhyOZXn+VS7wNko= + go.uber.org/mock v0.5.2/go.mod h1:wLlUxC2vVTPTaE3UD51E0BGOAElKrILxhVSDYQLld5o= + go.yaml.in/yaml/v3 v3.0.5 h1:N6y/pJk8buWs9NY5ERU2HSMfm+IuD/OtfdAnq6kESPw= +--- a/infra/conf/snell.go ++++ b/infra/conf/snell.go +@@ -0,0 +1,72 @@ ++package conf ++ ++import ( ++ "github.com/xtls/xray-core/common/errors" ++ S "github.com/xtls/xray-core/proxy/snell" ++ "google.golang.org/protobuf/proto" ++) ++ ++type SnellClientConfig struct { ++ Address *Address `json:"address"` ++ Port uint16 `json:"port"` ++ PSK string `json:"psk"` ++ Version uint32 `json:"version"` ++ Obfs string `json:"obfs"` ++ ObfsHost string `json:"obfsHost"` ++ Reuse bool `json:"reuse"` ++ Level uint32 `json:"level"` ++} ++ ++func snellSettings(psk string, version uint32, obfs string) (uint32, error) { ++ if psk == "" { ++ return 0, errors.New("snell: psk required") ++ } ++ if version == 0 { ++ version = 4 ++ } ++ if version < 1 || version > 5 { ++ return 0, errors.New("snell: version must be 1..5") ++ } ++ switch obfs { ++ case "", "http", "tls": ++ default: ++ return 0, errors.New("snell: unsupported obfs") ++ } ++ return version, nil ++} ++func (c *SnellClientConfig) Build() (proto.Message, error) { ++ v, e := snellSettings(c.PSK, c.Version, c.Obfs) ++ if e != nil { ++ return nil, e ++ } ++ if c.Address == nil || c.Port == 0 { ++ return nil, errors.New("snell: address and port required") ++ } ++ if c.Reuse && v != 2 && v < 4 { ++ return nil, errors.New("snell: reuse requires version 2, 4 or 5") ++ } ++ host := c.ObfsHost ++ if host == "" { ++ host = "bing.com" ++ } ++ return &S.ClientConfig{Address: c.Address.Build(), Port: uint32(c.Port), Psk: c.PSK, Version: v, Obfs: c.Obfs, ObfsHost: host, Reuse: c.Reuse, Level: c.Level}, nil ++} ++ ++type SnellServerConfig struct { ++ PSK string `json:"psk"` ++ Version uint32 `json:"version"` ++ Obfs string `json:"obfs"` ++ UDP bool `json:"udp"` ++ Level uint32 `json:"level"` ++} ++ ++func (c *SnellServerConfig) Build() (proto.Message, error) { ++ v, e := snellSettings(c.PSK, c.Version, c.Obfs) ++ if e != nil { ++ return nil, e ++ } ++ if c.UDP && v < 3 { ++ return nil, errors.New("snell: UDP requires version 3 or later") ++ } ++ return &S.ServerConfig{Psk: c.PSK, Version: v, Obfs: c.Obfs, Udp: c.UDP, Level: c.Level}, nil ++} +--- a/infra/conf/xray.go ++++ b/infra/conf/xray.go +@@ -28,6 +28,7 @@ + inboundConfigLoader = NewJSONConfigLoader(ConfigCreatorCache{ + "tunnel": func() interface{} { return new(DokodemoConfig) }, + "tuic": func() interface{} { return new(TUICServerConfig) }, ++ "snell": func() interface{} { return new(SnellServerConfig) }, + "naive": func() interface{} { return new(NaiveServerConfig) }, + "dokodemo-door": func() interface{} { return new(DokodemoConfig) }, + "http": func() interface{} { return new(HTTPServerConfig) }, +@@ -59,6 +60,7 @@ + "trojan": func() interface{} { return new(TrojanClientConfig) }, + "naive": func() interface{} { return new(NaiveClientConfig) }, + "tuic": func() interface{} { return new(TUICClientConfig) }, ++ "snell": func() interface{} { return new(SnellClientConfig) }, + "shadowsocksr": func() interface{} { return new(ShadowsocksRClientConfig) }, + "anytls": func() interface{} { return new(AnyTLSClientConfig) }, + "hysteria": func() interface{} { return new(HysteriaClientConfig) }, +--- a/main/distro/all/all.go ++++ b/main/distro/all/all.go +@@ -46,6 +46,7 @@ + _ "github.com/xtls/xray-core/proxy/naive" + _ "github.com/xtls/xray-core/proxy/shadowsocks" + _ "github.com/xtls/xray-core/proxy/shadowsocksr" ++ _ "github.com/xtls/xray-core/proxy/snell" + _ "github.com/xtls/xray-core/proxy/socks" + _ "github.com/xtls/xray-core/proxy/trojan" + _ "github.com/xtls/xray-core/proxy/tuic" +--- a/proxy/freedom/freedom.go ++++ b/proxy/freedom/freedom.go +@@ -172,7 +172,7 @@ + switch inbound.Name { + case "vless-reverse": + return defaultBlockAllRule +- case "vless", "vmess", "trojan", "hysteria", "wireguard", "masque", "naive", "tuic": ++ case "vless", "vmess", "trojan", "hysteria", "wireguard", "masque", "naive", "tuic", "snell": + return defaultBlockPrivateRule + default: + if strings.HasPrefix(inbound.Name, "shadowsocks") { +--- a/proxy/snell/LICENSE.mihomo ++++ b/proxy/snell/LICENSE.mihomo +@@ -0,0 +1,674 @@ ++ GNU GENERAL PUBLIC LICENSE ++ Version 3, 29 June 2007 ++ ++ Copyright (C) 2007 Free Software Foundation, Inc. ++ Everyone is permitted to copy and distribute verbatim copies ++ of this license document, but changing it is not allowed. ++ ++ Preamble ++ ++ The GNU General Public License is a free, copyleft license for ++software and other kinds of works. ++ ++ The licenses for most software and other practical works are designed ++to take away your freedom to share and change the works. By contrast, ++the GNU General Public License is intended to guarantee your freedom to ++share and change all versions of a program--to make sure it remains free ++software for all its users. We, the Free Software Foundation, use the ++GNU General Public License for most of our software; it applies also to ++any other work released this way by its authors. You can apply it to ++your programs, too. ++ ++ When we speak of free software, we are referring to freedom, not ++price. Our General Public Licenses are designed to make sure that you ++have the freedom to distribute copies of free software (and charge for ++them if you wish), that you receive source code or can get it if you ++want it, that you can change the software or use pieces of it in new ++free programs, and that you know you can do these things. ++ ++ To protect your rights, we need to prevent others from denying you ++these rights or asking you to surrender the rights. Therefore, you have ++certain responsibilities if you distribute copies of the software, or if ++you modify it: responsibilities to respect the freedom of others. ++ ++ For example, if you distribute copies of such a program, whether ++gratis or for a fee, you must pass on to the recipients the same ++freedoms that you received. You must make sure that they, too, receive ++or can get the source code. And you must show them these terms so they ++know their rights. ++ ++ Developers that use the GNU GPL protect your rights with two steps: ++(1) assert copyright on the software, and (2) offer you this License ++giving you legal permission to copy, distribute and/or modify it. ++ ++ For the developers' and authors' protection, the GPL clearly explains ++that there is no warranty for this free software. For both users' and ++authors' sake, the GPL requires that modified versions be marked as ++changed, so that their problems will not be attributed erroneously to ++authors of previous versions. ++ ++ Some devices are designed to deny users access to install or run ++modified versions of the software inside them, although the manufacturer ++can do so. This is fundamentally incompatible with the aim of ++protecting users' freedom to change the software. The systematic ++pattern of such abuse occurs in the area of products for individuals to ++use, which is precisely where it is most unacceptable. Therefore, we ++have designed this version of the GPL to prohibit the practice for those ++products. If such problems arise substantially in other domains, we ++stand ready to extend this provision to those domains in future versions ++of the GPL, as needed to protect the freedom of users. ++ ++ Finally, every program is threatened constantly by software patents. ++States should not allow patents to restrict development and use of ++software on general-purpose computers, but in those that do, we wish to ++avoid the special danger that patents applied to a free program could ++make it effectively proprietary. To prevent this, the GPL assures that ++patents cannot be used to render the program non-free. ++ ++ The precise terms and conditions for copying, distribution and ++modification follow. ++ ++ TERMS AND CONDITIONS ++ ++ 0. Definitions. ++ ++ "This License" refers to version 3 of the GNU General Public License. ++ ++ "Copyright" also means copyright-like laws that apply to other kinds of ++works, such as semiconductor masks. ++ ++ "The Program" refers to any copyrightable work licensed under this ++License. Each licensee is addressed as "you". "Licensees" and ++"recipients" may be individuals or organizations. ++ ++ To "modify" a work means to copy from or adapt all or part of the work ++in a fashion requiring copyright permission, other than the making of an ++exact copy. The resulting work is called a "modified version" of the ++earlier work or a work "based on" the earlier work. ++ ++ A "covered work" means either the unmodified Program or a work based ++on the Program. ++ ++ To "propagate" a work means to do anything with it that, without ++permission, would make you directly or secondarily liable for ++infringement under applicable copyright law, except executing it on a ++computer or modifying a private copy. Propagation includes copying, ++distribution (with or without modification), making available to the ++public, and in some countries other activities as well. ++ ++ To "convey" a work means any kind of propagation that enables other ++parties to make or receive copies. Mere interaction with a user through ++a computer network, with no transfer of a copy, is not conveying. ++ ++ An interactive user interface displays "Appropriate Legal Notices" ++to the extent that it includes a convenient and prominently visible ++feature that (1) displays an appropriate copyright notice, and (2) ++tells the user that there is no warranty for the work (except to the ++extent that warranties are provided), that licensees may convey the ++work under this License, and how to view a copy of this License. If ++the interface presents a list of user commands or options, such as a ++menu, a prominent item in the list meets this criterion. ++ ++ 1. Source Code. ++ ++ The "source code" for a work means the preferred form of the work ++for making modifications to it. "Object code" means any non-source ++form of a work. ++ ++ A "Standard Interface" means an interface that either is an official ++standard defined by a recognized standards body, or, in the case of ++interfaces specified for a particular programming language, one that ++is widely used among developers working in that language. ++ ++ The "System Libraries" of an executable work include anything, other ++than the work as a whole, that (a) is included in the normal form of ++packaging a Major Component, but which is not part of that Major ++Component, and (b) serves only to enable use of the work with that ++Major Component, or to implement a Standard Interface for which an ++implementation is available to the public in source code form. A ++"Major Component", in this context, means a major essential component ++(kernel, window system, and so on) of the specific operating system ++(if any) on which the executable work runs, or a compiler used to ++produce the work, or an object code interpreter used to run it. ++ ++ The "Corresponding Source" for a work in object code form means all ++the source code needed to generate, install, and (for an executable ++work) run the object code and to modify the work, including scripts to ++control those activities. However, it does not include the work's ++System Libraries, or general-purpose tools or generally available free ++programs which are used unmodified in performing those activities but ++which are not part of the work. For example, Corresponding Source ++includes interface definition files associated with source files for ++the work, and the source code for shared libraries and dynamically ++linked subprograms that the work is specifically designed to require, ++such as by intimate data communication or control flow between those ++subprograms and other parts of the work. ++ ++ The Corresponding Source need not include anything that users ++can regenerate automatically from other parts of the Corresponding ++Source. ++ ++ The Corresponding Source for a work in source code form is that ++same work. ++ ++ 2. Basic Permissions. ++ ++ All rights granted under this License are granted for the term of ++copyright on the Program, and are irrevocable provided the stated ++conditions are met. This License explicitly affirms your unlimited ++permission to run the unmodified Program. The output from running a ++covered work is covered by this License only if the output, given its ++content, constitutes a covered work. This License acknowledges your ++rights of fair use or other equivalent, as provided by copyright law. ++ ++ You may make, run and propagate covered works that you do not ++convey, without conditions so long as your license otherwise remains ++in force. You may convey covered works to others for the sole purpose ++of having them make modifications exclusively for you, or provide you ++with facilities for running those works, provided that you comply with ++the terms of this License in conveying all material for which you do ++not control copyright. Those thus making or running the covered works ++for you must do so exclusively on your behalf, under your direction ++and control, on terms that prohibit them from making any copies of ++your copyrighted material outside their relationship with you. ++ ++ Conveying under any other circumstances is permitted solely under ++the conditions stated below. Sublicensing is not allowed; section 10 ++makes it unnecessary. ++ ++ 3. Protecting Users' Legal Rights From Anti-Circumvention Law. ++ ++ No covered work shall be deemed part of an effective technological ++measure under any applicable law fulfilling obligations under article ++11 of the WIPO copyright treaty adopted on 20 December 1996, or ++similar laws prohibiting or restricting circumvention of such ++measures. ++ ++ When you convey a covered work, you waive any legal power to forbid ++circumvention of technological measures to the extent such circumvention ++is effected by exercising rights under this License with respect to ++the covered work, and you disclaim any intention to limit operation or ++modification of the work as a means of enforcing, against the work's ++users, your or third parties' legal rights to forbid circumvention of ++technological measures. ++ ++ 4. Conveying Verbatim Copies. ++ ++ You may convey verbatim copies of the Program's source code as you ++receive it, in any medium, provided that you conspicuously and ++appropriately publish on each copy an appropriate copyright notice; ++keep intact all notices stating that this License and any ++non-permissive terms added in accord with section 7 apply to the code; ++keep intact all notices of the absence of any warranty; and give all ++recipients a copy of this License along with the Program. ++ ++ You may charge any price or no price for each copy that you convey, ++and you may offer support or warranty protection for a fee. ++ ++ 5. Conveying Modified Source Versions. ++ ++ You may convey a work based on the Program, or the modifications to ++produce it from the Program, in the form of source code under the ++terms of section 4, provided that you also meet all of these conditions: ++ ++ a) The work must carry prominent notices stating that you modified ++ it, and giving a relevant date. ++ ++ b) The work must carry prominent notices stating that it is ++ released under this License and any conditions added under section ++ 7. This requirement modifies the requirement in section 4 to ++ "keep intact all notices". ++ ++ c) You must license the entire work, as a whole, under this ++ License to anyone who comes into possession of a copy. This ++ License will therefore apply, along with any applicable section 7 ++ additional terms, to the whole of the work, and all its parts, ++ regardless of how they are packaged. This License gives no ++ permission to license the work in any other way, but it does not ++ invalidate such permission if you have separately received it. ++ ++ d) If the work has interactive user interfaces, each must display ++ Appropriate Legal Notices; however, if the Program has interactive ++ interfaces that do not display Appropriate Legal Notices, your ++ work need not make them do so. ++ ++ A compilation of a covered work with other separate and independent ++works, which are not by their nature extensions of the covered work, ++and which are not combined with it such as to form a larger program, ++in or on a volume of a storage or distribution medium, is called an ++"aggregate" if the compilation and its resulting copyright are not ++used to limit the access or legal rights of the compilation's users ++beyond what the individual works permit. Inclusion of a covered work ++in an aggregate does not cause this License to apply to the other ++parts of the aggregate. ++ ++ 6. Conveying Non-Source Forms. ++ ++ You may convey a covered work in object code form under the terms ++of sections 4 and 5, provided that you also convey the ++machine-readable Corresponding Source under the terms of this License, ++in one of these ways: ++ ++ a) Convey the object code in, or embodied in, a physical product ++ (including a physical distribution medium), accompanied by the ++ Corresponding Source fixed on a durable physical medium ++ customarily used for software interchange. ++ ++ b) Convey the object code in, or embodied in, a physical product ++ (including a physical distribution medium), accompanied by a ++ written offer, valid for at least three years and valid for as ++ long as you offer spare parts or customer support for that product ++ model, to give anyone who possesses the object code either (1) a ++ copy of the Corresponding Source for all the software in the ++ product that is covered by this License, on a durable physical ++ medium customarily used for software interchange, for a price no ++ more than your reasonable cost of physically performing this ++ conveying of source, or (2) access to copy the ++ Corresponding Source from a network server at no charge. ++ ++ c) Convey individual copies of the object code with a copy of the ++ written offer to provide the Corresponding Source. This ++ alternative is allowed only occasionally and noncommercially, and ++ only if you received the object code with such an offer, in accord ++ with subsection 6b. ++ ++ d) Convey the object code by offering access from a designated ++ place (gratis or for a charge), and offer equivalent access to the ++ Corresponding Source in the same way through the same place at no ++ further charge. You need not require recipients to copy the ++ Corresponding Source along with the object code. If the place to ++ copy the object code is a network server, the Corresponding Source ++ may be on a different server (operated by you or a third party) ++ that supports equivalent copying facilities, provided you maintain ++ clear directions next to the object code saying where to find the ++ Corresponding Source. Regardless of what server hosts the ++ Corresponding Source, you remain obligated to ensure that it is ++ available for as long as needed to satisfy these requirements. ++ ++ e) Convey the object code using peer-to-peer transmission, provided ++ you inform other peers where the object code and Corresponding ++ Source of the work are being offered to the general public at no ++ charge under subsection 6d. ++ ++ A separable portion of the object code, whose source code is excluded ++from the Corresponding Source as a System Library, need not be ++included in conveying the object code work. ++ ++ A "User Product" is either (1) a "consumer product", which means any ++tangible personal property which is normally used for personal, family, ++or household purposes, or (2) anything designed or sold for incorporation ++into a dwelling. In determining whether a product is a consumer product, ++doubtful cases shall be resolved in favor of coverage. For a particular ++product received by a particular user, "normally used" refers to a ++typical or common use of that class of product, regardless of the status ++of the particular user or of the way in which the particular user ++actually uses, or expects or is expected to use, the product. A product ++is a consumer product regardless of whether the product has substantial ++commercial, industrial or non-consumer uses, unless such uses represent ++the only significant mode of use of the product. ++ ++ "Installation Information" for a User Product means any methods, ++procedures, authorization keys, or other information required to install ++and execute modified versions of a covered work in that User Product from ++a modified version of its Corresponding Source. The information must ++suffice to ensure that the continued functioning of the modified object ++code is in no case prevented or interfered with solely because ++modification has been made. ++ ++ If you convey an object code work under this section in, or with, or ++specifically for use in, a User Product, and the conveying occurs as ++part of a transaction in which the right of possession and use of the ++User Product is transferred to the recipient in perpetuity or for a ++fixed term (regardless of how the transaction is characterized), the ++Corresponding Source conveyed under this section must be accompanied ++by the Installation Information. But this requirement does not apply ++if neither you nor any third party retains the ability to install ++modified object code on the User Product (for example, the work has ++been installed in ROM). ++ ++ The requirement to provide Installation Information does not include a ++requirement to continue to provide support service, warranty, or updates ++for a work that has been modified or installed by the recipient, or for ++the User Product in which it has been modified or installed. Access to a ++network may be denied when the modification itself materially and ++adversely affects the operation of the network or violates the rules and ++protocols for communication across the network. ++ ++ Corresponding Source conveyed, and Installation Information provided, ++in accord with this section must be in a format that is publicly ++documented (and with an implementation available to the public in ++source code form), and must require no special password or key for ++unpacking, reading or copying. ++ ++ 7. Additional Terms. ++ ++ "Additional permissions" are terms that supplement the terms of this ++License by making exceptions from one or more of its conditions. ++Additional permissions that are applicable to the entire Program shall ++be treated as though they were included in this License, to the extent ++that they are valid under applicable law. If additional permissions ++apply only to part of the Program, that part may be used separately ++under those permissions, but the entire Program remains governed by ++this License without regard to the additional permissions. ++ ++ When you convey a copy of a covered work, you may at your option ++remove any additional permissions from that copy, or from any part of ++it. (Additional permissions may be written to require their own ++removal in certain cases when you modify the work.) You may place ++additional permissions on material, added by you to a covered work, ++for which you have or can give appropriate copyright permission. ++ ++ Notwithstanding any other provision of this License, for material you ++add to a covered work, you may (if authorized by the copyright holders of ++that material) supplement the terms of this License with terms: ++ ++ a) Disclaiming warranty or limiting liability differently from the ++ terms of sections 15 and 16 of this License; or ++ ++ b) Requiring preservation of specified reasonable legal notices or ++ author attributions in that material or in the Appropriate Legal ++ Notices displayed by works containing it; or ++ ++ c) Prohibiting misrepresentation of the origin of that material, or ++ requiring that modified versions of such material be marked in ++ reasonable ways as different from the original version; or ++ ++ d) Limiting the use for publicity purposes of names of licensors or ++ authors of the material; or ++ ++ e) Declining to grant rights under trademark law for use of some ++ trade names, trademarks, or service marks; or ++ ++ f) Requiring indemnification of licensors and authors of that ++ material by anyone who conveys the material (or modified versions of ++ it) with contractual assumptions of liability to the recipient, for ++ any liability that these contractual assumptions directly impose on ++ those licensors and authors. ++ ++ All other non-permissive additional terms are considered "further ++restrictions" within the meaning of section 10. If the Program as you ++received it, or any part of it, contains a notice stating that it is ++governed by this License along with a term that is a further ++restriction, you may remove that term. If a license document contains ++a further restriction but permits relicensing or conveying under this ++License, you may add to a covered work material governed by the terms ++of that license document, provided that the further restriction does ++not survive such relicensing or conveying. ++ ++ If you add terms to a covered work in accord with this section, you ++must place, in the relevant source files, a statement of the ++additional terms that apply to those files, or a notice indicating ++where to find the applicable terms. ++ ++ Additional terms, permissive or non-permissive, may be stated in the ++form of a separately written license, or stated as exceptions; ++the above requirements apply either way. ++ ++ 8. Termination. ++ ++ You may not propagate or modify a covered work except as expressly ++provided under this License. Any attempt otherwise to propagate or ++modify it is void, and will automatically terminate your rights under ++this License (including any patent licenses granted under the third ++paragraph of section 11). ++ ++ However, if you cease all violation of this License, then your ++license from a particular copyright holder is reinstated (a) ++provisionally, unless and until the copyright holder explicitly and ++finally terminates your license, and (b) permanently, if the copyright ++holder fails to notify you of the violation by some reasonable means ++prior to 60 days after the cessation. ++ ++ Moreover, your license from a particular copyright holder is ++reinstated permanently if the copyright holder notifies you of the ++violation by some reasonable means, this is the first time you have ++received notice of violation of this License (for any work) from that ++copyright holder, and you cure the violation prior to 30 days after ++your receipt of the notice. ++ ++ Termination of your rights under this section does not terminate the ++licenses of parties who have received copies or rights from you under ++this License. If your rights have been terminated and not permanently ++reinstated, you do not qualify to receive new licenses for the same ++material under section 10. ++ ++ 9. Acceptance Not Required for Having Copies. ++ ++ You are not required to accept this License in order to receive or ++run a copy of the Program. Ancillary propagation of a covered work ++occurring solely as a consequence of using peer-to-peer transmission ++to receive a copy likewise does not require acceptance. However, ++nothing other than this License grants you permission to propagate or ++modify any covered work. These actions infringe copyright if you do ++not accept this License. Therefore, by modifying or propagating a ++covered work, you indicate your acceptance of this License to do so. ++ ++ 10. Automatic Licensing of Downstream Recipients. ++ ++ Each time you convey a covered work, the recipient automatically ++receives a license from the original licensors, to run, modify and ++propagate that work, subject to this License. You are not responsible ++for enforcing compliance by third parties with this License. ++ ++ An "entity transaction" is a transaction transferring control of an ++organization, or substantially all assets of one, or subdividing an ++organization, or merging organizations. If propagation of a covered ++work results from an entity transaction, each party to that ++transaction who receives a copy of the work also receives whatever ++licenses to the work the party's predecessor in interest had or could ++give under the previous paragraph, plus a right to possession of the ++Corresponding Source of the work from the predecessor in interest, if ++the predecessor has it or can get it with reasonable efforts. ++ ++ You may not impose any further restrictions on the exercise of the ++rights granted or affirmed under this License. For example, you may ++not impose a license fee, royalty, or other charge for exercise of ++rights granted under this License, and you may not initiate litigation ++(including a cross-claim or counterclaim in a lawsuit) alleging that ++any patent claim is infringed by making, using, selling, offering for ++sale, or importing the Program or any portion of it. ++ ++ 11. Patents. ++ ++ A "contributor" is a copyright holder who authorizes use under this ++License of the Program or a work on which the Program is based. The ++work thus licensed is called the contributor's "contributor version". ++ ++ A contributor's "essential patent claims" are all patent claims ++owned or controlled by the contributor, whether already acquired or ++hereafter acquired, that would be infringed by some manner, permitted ++by this License, of making, using, or selling its contributor version, ++but do not include claims that would be infringed only as a ++consequence of further modification of the contributor version. For ++purposes of this definition, "control" includes the right to grant ++patent sublicenses in a manner consistent with the requirements of ++this License. ++ ++ Each contributor grants you a non-exclusive, worldwide, royalty-free ++patent license under the contributor's essential patent claims, to ++make, use, sell, offer for sale, import and otherwise run, modify and ++propagate the contents of its contributor version. ++ ++ In the following three paragraphs, a "patent license" is any express ++agreement or commitment, however denominated, not to enforce a patent ++(such as an express permission to practice a patent or covenant not to ++sue for patent infringement). To "grant" such a patent license to a ++party means to make such an agreement or commitment not to enforce a ++patent against the party. ++ ++ If you convey a covered work, knowingly relying on a patent license, ++and the Corresponding Source of the work is not available for anyone ++to copy, free of charge and under the terms of this License, through a ++publicly available network server or other readily accessible means, ++then you must either (1) cause the Corresponding Source to be so ++available, or (2) arrange to deprive yourself of the benefit of the ++patent license for this particular work, or (3) arrange, in a manner ++consistent with the requirements of this License, to extend the patent ++license to downstream recipients. "Knowingly relying" means you have ++actual knowledge that, but for the patent license, your conveying the ++covered work in a country, or your recipient's use of the covered work ++in a country, would infringe one or more identifiable patents in that ++country that you have reason to believe are valid. ++ ++ If, pursuant to or in connection with a single transaction or ++arrangement, you convey, or propagate by procuring conveyance of, a ++covered work, and grant a patent license to some of the parties ++receiving the covered work authorizing them to use, propagate, modify ++or convey a specific copy of the covered work, then the patent license ++you grant is automatically extended to all recipients of the covered ++work and works based on it. ++ ++ A patent license is "discriminatory" if it does not include within ++the scope of its coverage, prohibits the exercise of, or is ++conditioned on the non-exercise of one or more of the rights that are ++specifically granted under this License. You may not convey a covered ++work if you are a party to an arrangement with a third party that is ++in the business of distributing software, under which you make payment ++to the third party based on the extent of your activity of conveying ++the work, and under which the third party grants, to any of the ++parties who would receive the covered work from you, a discriminatory ++patent license (a) in connection with copies of the covered work ++conveyed by you (or copies made from those copies), or (b) primarily ++for and in connection with specific products or compilations that ++contain the covered work, unless you entered into that arrangement, ++or that patent license was granted, prior to 28 March 2007. ++ ++ Nothing in this License shall be construed as excluding or limiting ++any implied license or other defenses to infringement that may ++otherwise be available to you under applicable patent law. ++ ++ 12. No Surrender of Others' Freedom. ++ ++ If conditions are imposed on you (whether by court order, agreement or ++otherwise) that contradict the conditions of this License, they do not ++excuse you from the conditions of this License. If you cannot convey a ++covered work so as to satisfy simultaneously your obligations under this ++License and any other pertinent obligations, then as a consequence you may ++not convey it at all. For example, if you agree to terms that obligate you ++to collect a royalty for further conveying from those to whom you convey ++the Program, the only way you could satisfy both those terms and this ++License would be to refrain entirely from conveying the Program. ++ ++ 13. Use with the GNU Affero General Public License. ++ ++ Notwithstanding any other provision of this License, you have ++permission to link or combine any covered work with a work licensed ++under version 3 of the GNU Affero General Public License into a single ++combined work, and to convey the resulting work. The terms of this ++License will continue to apply to the part which is the covered work, ++but the special requirements of the GNU Affero General Public License, ++section 13, concerning interaction through a network will apply to the ++combination as such. ++ ++ 14. Revised Versions of this License. ++ ++ The Free Software Foundation may publish revised and/or new versions of ++the GNU General Public License from time to time. Such new versions will ++be similar in spirit to the present version, but may differ in detail to ++address new problems or concerns. ++ ++ Each version is given a distinguishing version number. If the ++Program specifies that a certain numbered version of the GNU General ++Public License "or any later version" applies to it, you have the ++option of following the terms and conditions either of that numbered ++version or of any later version published by the Free Software ++Foundation. If the Program does not specify a version number of the ++GNU General Public License, you may choose any version ever published ++by the Free Software Foundation. ++ ++ If the Program specifies that a proxy can decide which future ++versions of the GNU General Public License can be used, that proxy's ++public statement of acceptance of a version permanently authorizes you ++to choose that version for the Program. ++ ++ Later license versions may give you additional or different ++permissions. However, no additional obligations are imposed on any ++author or copyright holder as a result of your choosing to follow a ++later version. ++ ++ 15. Disclaimer of Warranty. ++ ++ THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY ++APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT ++HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY ++OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, ++THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR ++PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM ++IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ++ALL NECESSARY SERVICING, REPAIR OR CORRECTION. ++ ++ 16. Limitation of Liability. ++ ++ IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING ++WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS ++THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY ++GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE ++USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF ++DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD ++PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), ++EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF ++SUCH DAMAGES. ++ ++ 17. Interpretation of Sections 15 and 16. ++ ++ If the disclaimer of warranty and limitation of liability provided ++above cannot be given local legal effect according to their terms, ++reviewing courts shall apply local law that most closely approximates ++an absolute waiver of all civil liability in connection with the ++Program, unless a warranty or assumption of liability accompanies a ++copy of the Program in return for a fee. ++ ++ END OF TERMS AND CONDITIONS ++ ++ How to Apply These Terms to Your New Programs ++ ++ If you develop a new program, and you want it to be of the greatest ++possible use to the public, the best way to achieve this is to make it ++free software which everyone can redistribute and change under these terms. ++ ++ To do so, attach the following notices to the program. It is safest ++to attach them to the start of each source file to most effectively ++state the exclusion of warranty; and each file should have at least ++the "copyright" line and a pointer to where the full notice is found. ++ ++ ++ Copyright (C) ++ ++ This program is free software: you can redistribute it and/or modify ++ it under the terms of the GNU General Public License as published by ++ the Free Software Foundation, either version 3 of the License, or ++ (at your option) any later version. ++ ++ This program is distributed in the hope that it will be useful, ++ but WITHOUT ANY WARRANTY; without even the implied warranty of ++ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++ GNU General Public License for more details. ++ ++ You should have received a copy of the GNU General Public License ++ along with this program. If not, see . ++ ++Also add information on how to contact you by electronic and paper mail. ++ ++ If the program does terminal interaction, make it output a short ++notice like this when it starts in an interactive mode: ++ ++ Copyright (C) ++ This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. ++ This is free software, and you are welcome to redistribute it ++ under certain conditions; type `show c' for details. ++ ++The hypothetical commands `show w' and `show c' should show the appropriate ++parts of the General Public License. Of course, your program's commands ++might be different; for a GUI interface, you would use an "about box". ++ ++ You should also get your employer (if you work as a programmer) or school, ++if any, to sign a "copyright disclaimer" for the program, if necessary. ++For more information on this, and how to apply and follow the GNU GPL, see ++. ++ ++ The GNU General Public License does not permit incorporating your program ++into proprietary programs. If your program is a subroutine library, you ++may consider it more useful to permit linking proprietary applications with ++the library. If this is what you want to do, use the GNU Lesser General ++Public License instead of this License. But first, please read ++. +--- a/proxy/snell/client.go ++++ b/proxy/snell/client.go +@@ -0,0 +1,176 @@ ++package snell ++ ++import ( ++ "context" ++ "io" ++ "sync" ++ "time" ++ ++ O "github.com/metacubex/mihomo/transport/simple-obfs" ++ S "github.com/metacubex/mihomo/transport/snell" ++ "github.com/xtls/xray-core/common" ++ "github.com/xtls/xray-core/common/buf" ++ "github.com/xtls/xray-core/common/errors" ++ "github.com/xtls/xray-core/common/net" ++ "github.com/xtls/xray-core/common/session" ++ "github.com/xtls/xray-core/core" ++ "github.com/xtls/xray-core/features/policy" ++ "github.com/xtls/xray-core/transport" ++ "github.com/xtls/xray-core/transport/internet" ++) ++ ++type Client struct { ++ config *ClientConfig ++ policy policy.Session ++ mu sync.Mutex ++ pool *S.Pool ++ conns map[*trackedConn]struct{} ++ closed bool ++} ++type trackedConn struct { ++ net.Conn ++ owner *Client ++ once sync.Once ++} ++ ++func (c *trackedConn) Close() error { ++ var err error ++ c.once.Do(func() { err = c.Conn.Close(); c.owner.mu.Lock(); delete(c.owner.conns, c); c.owner.mu.Unlock() }) ++ return err ++} ++func (c *Client) Close() error { ++ c.mu.Lock() ++ c.closed = true ++ conns := make([]*trackedConn, 0, len(c.conns)) ++ for conn := range c.conns { ++ conns = append(conns, conn) ++ } ++ c.mu.Unlock() ++ for _, conn := range conns { ++ conn.Close() ++ } ++ return nil ++} ++func (c *Client) dial(ctx context.Context, dialer internet.Dialer) (*S.Snell, error) { ++ raw, e := dialer.Dial(ctx, net.TCPDestination(c.config.Address.AsAddress(), net.Port(c.config.Port))) ++ if e != nil { ++ return nil, e ++ } ++ tracked := &trackedConn{Conn: raw, owner: c} ++ c.mu.Lock() ++ if c.closed { ++ c.mu.Unlock() ++ raw.Close() ++ return nil, io.ErrClosedPipe ++ } ++ c.conns[tracked] = struct{}{} ++ c.mu.Unlock() ++ var conn net.Conn = tracked ++ switch c.config.Obfs { ++ case "http": ++ conn = O.NewHTTPObfs(conn, c.config.ObfsHost, net.Port(c.config.Port).String()) ++ case "tls": ++ conn = O.NewTLSObfs(conn, c.config.ObfsHost) ++ } ++ return S.StreamConn(conn, []byte(c.config.Psk), int(c.config.Version)), nil ++} ++ ++type closeWriter struct { ++ buf.Writer ++ close func() error ++} ++ ++func (w *closeWriter) Close() error { return w.close() } ++ ++func (c *Client) Process(ctx context.Context, link *transport.Link, dialer internet.Dialer) error { ++ obs := session.OutboundsFromContext(ctx) ++ if len(obs) == 0 { ++ return errors.New("snell: missing target") ++ } ++ ob := obs[len(obs)-1] ++ target := ob.Target ++ if !target.IsValid() || (target.Network != net.Network_TCP && target.Network != net.Network_UDP) { ++ return errors.New("snell: invalid target") ++ } ++ if target.Network == net.Network_UDP && c.config.Version < 3 { ++ return errors.New("snell: UDP requires version 3 or later") ++ } ++ if len(target.Address.String()) > 255 { ++ return errors.New("snell: target host too long") ++ } ++ ob.Name = "snell" ++ ob.CanSpliceCopy = 3 ++ var conn net.Conn ++ var err error ++ reuse := target.Network == net.Network_TCP && (c.config.Version == 2 || c.config.Reuse) ++ if reuse { ++ c.mu.Lock() ++ if c.closed { ++ c.mu.Unlock() ++ return io.ErrClosedPipe ++ } ++ if c.pool == nil { ++ c.pool = S.NewPool(func(ctx context.Context) (*S.Snell, error) { return c.dial(ctx, dialer) }) ++ } ++ pool := c.pool ++ c.mu.Unlock() ++ conn, err = pool.GetContext(ctx) ++ } else { ++ conn, err = c.dial(ctx, dialer) ++ } ++ if err != nil { ++ return err ++ } ++ defer conn.Close() ++ cancelDone := make(chan struct{}) ++ stop := context.AfterFunc(ctx, func() { conn.SetDeadline(time.Now()); close(cancelDone) }) ++ defer func() { ++ if !stop() { ++ <-cancelDone ++ } ++ }() ++ conn.SetDeadline(time.Now().Add(c.policy.Timeouts.Handshake)) ++ var reader buf.Reader ++ var writer buf.Writer ++ if target.Network == net.Network_TCP { ++ err = S.WriteHeaderWithReuse(conn, addressHost(target.Address), uint(target.Port), int(c.config.Version), reuse) ++ if err != nil { ++ return err ++ } ++ if pc, ok := conn.(*S.PoolConn); ok { ++ pc.MarkReusable() ++ } ++ reader = buf.NewReader(conn) ++ writer = buf.NewWriter(conn) ++ if pc, ok := conn.(*S.PoolConn); ok { ++ writer = &closeWriter{writer, pc.CloseWrite} ++ } ++ } else { ++ if err = S.WriteUDPHeader(conn, int(c.config.Version)); err != nil { ++ return err ++ } ++ if c.config.Version >= 4 { ++ if err = conn.(*S.Snell).ReadReply(); err != nil { ++ return err ++ } ++ } ++ pc := S.PacketConn(conn) ++ reader = &packetReader{pc} ++ writer = &packetWriter{pc, target} ++ } ++ conn.SetDeadline(time.Time{}) ++ return relay(ctx, link.Reader, writer, reader, link.Writer, func() { conn.SetReadDeadline(time.Now()) }, c.policy) ++} ++func init() { ++ common.Must(common.RegisterConfig((*ClientConfig)(nil), func(ctx context.Context, c interface{}) (interface{}, error) { ++ config := c.(*ClientConfig) ++ return &Client{config: config, policy: core.MustFromContext(ctx).GetFeature(policy.ManagerType()).(policy.Manager).ForLevel(config.Level), conns: make(map[*trackedConn]struct{})}, nil ++ })) ++} ++ ++func addressHost(a net.Address) string { ++ if a.Family().IsIP() { ++ return a.IP().String() ++ } ++ return a.Domain() ++} +--- a/proxy/snell/config.pb.go ++++ b/proxy/snell/config.pb.go +@@ -0,0 +1,271 @@ ++// Code generated by protoc-gen-go. DO NOT EDIT. ++// versions: ++// protoc-gen-go v1.36.12 ++// protoc v3.21.12 ++// source: proxy/snell/config.proto ++ ++package snell ++ ++import ( ++ net "github.com/xtls/xray-core/common/net" ++ protoreflect "google.golang.org/protobuf/reflect/protoreflect" ++ protoimpl "google.golang.org/protobuf/runtime/protoimpl" ++ reflect "reflect" ++ sync "sync" ++ unsafe "unsafe" ++) ++ ++const ( ++ // Verify that this generated code is sufficiently up-to-date. ++ _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) ++ // Verify that runtime/protoimpl is sufficiently up-to-date. ++ _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) ++) ++ ++type ClientConfig struct { ++ state protoimpl.MessageState `protogen:"open.v1"` ++ Address *net.IPOrDomain `protobuf:"bytes,1,opt,name=address,proto3" json:"address,omitempty"` ++ Port uint32 `protobuf:"varint,2,opt,name=port,proto3" json:"port,omitempty"` ++ Psk string `protobuf:"bytes,3,opt,name=psk,proto3" json:"psk,omitempty"` ++ Version uint32 `protobuf:"varint,4,opt,name=version,proto3" json:"version,omitempty"` ++ Obfs string `protobuf:"bytes,5,opt,name=obfs,proto3" json:"obfs,omitempty"` ++ ObfsHost string `protobuf:"bytes,6,opt,name=obfs_host,json=obfsHost,proto3" json:"obfs_host,omitempty"` ++ Reuse bool `protobuf:"varint,7,opt,name=reuse,proto3" json:"reuse,omitempty"` ++ Level uint32 `protobuf:"varint,8,opt,name=level,proto3" json:"level,omitempty"` ++ unknownFields protoimpl.UnknownFields ++ sizeCache protoimpl.SizeCache ++} ++ ++func (x *ClientConfig) Reset() { ++ *x = ClientConfig{} ++ mi := &file_proxy_snell_config_proto_msgTypes[0] ++ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ++ ms.StoreMessageInfo(mi) ++} ++ ++func (x *ClientConfig) String() string { ++ return protoimpl.X.MessageStringOf(x) ++} ++ ++func (*ClientConfig) ProtoMessage() {} ++ ++func (x *ClientConfig) ProtoReflect() protoreflect.Message { ++ mi := &file_proxy_snell_config_proto_msgTypes[0] ++ if x != nil { ++ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ++ if ms.LoadMessageInfo() == nil { ++ ms.StoreMessageInfo(mi) ++ } ++ return ms ++ } ++ return mi.MessageOf(x) ++} ++ ++// Deprecated: Use ClientConfig.ProtoReflect.Descriptor instead. ++func (*ClientConfig) Descriptor() ([]byte, []int) { ++ return file_proxy_snell_config_proto_rawDescGZIP(), []int{0} ++} ++ ++func (x *ClientConfig) GetAddress() *net.IPOrDomain { ++ if x != nil { ++ return x.Address ++ } ++ return nil ++} ++ ++func (x *ClientConfig) GetPort() uint32 { ++ if x != nil { ++ return x.Port ++ } ++ return 0 ++} ++ ++func (x *ClientConfig) GetPsk() string { ++ if x != nil { ++ return x.Psk ++ } ++ return "" ++} ++ ++func (x *ClientConfig) GetVersion() uint32 { ++ if x != nil { ++ return x.Version ++ } ++ return 0 ++} ++ ++func (x *ClientConfig) GetObfs() string { ++ if x != nil { ++ return x.Obfs ++ } ++ return "" ++} ++ ++func (x *ClientConfig) GetObfsHost() string { ++ if x != nil { ++ return x.ObfsHost ++ } ++ return "" ++} ++ ++func (x *ClientConfig) GetReuse() bool { ++ if x != nil { ++ return x.Reuse ++ } ++ return false ++} ++ ++func (x *ClientConfig) GetLevel() uint32 { ++ if x != nil { ++ return x.Level ++ } ++ return 0 ++} ++ ++type ServerConfig struct { ++ state protoimpl.MessageState `protogen:"open.v1"` ++ Psk string `protobuf:"bytes,1,opt,name=psk,proto3" json:"psk,omitempty"` ++ Version uint32 `protobuf:"varint,2,opt,name=version,proto3" json:"version,omitempty"` ++ Obfs string `protobuf:"bytes,3,opt,name=obfs,proto3" json:"obfs,omitempty"` ++ Udp bool `protobuf:"varint,4,opt,name=udp,proto3" json:"udp,omitempty"` ++ Level uint32 `protobuf:"varint,5,opt,name=level,proto3" json:"level,omitempty"` ++ unknownFields protoimpl.UnknownFields ++ sizeCache protoimpl.SizeCache ++} ++ ++func (x *ServerConfig) Reset() { ++ *x = ServerConfig{} ++ mi := &file_proxy_snell_config_proto_msgTypes[1] ++ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ++ ms.StoreMessageInfo(mi) ++} ++ ++func (x *ServerConfig) String() string { ++ return protoimpl.X.MessageStringOf(x) ++} ++ ++func (*ServerConfig) ProtoMessage() {} ++ ++func (x *ServerConfig) ProtoReflect() protoreflect.Message { ++ mi := &file_proxy_snell_config_proto_msgTypes[1] ++ if x != nil { ++ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ++ if ms.LoadMessageInfo() == nil { ++ ms.StoreMessageInfo(mi) ++ } ++ return ms ++ } ++ return mi.MessageOf(x) ++} ++ ++// Deprecated: Use ServerConfig.ProtoReflect.Descriptor instead. ++func (*ServerConfig) Descriptor() ([]byte, []int) { ++ return file_proxy_snell_config_proto_rawDescGZIP(), []int{1} ++} ++ ++func (x *ServerConfig) GetPsk() string { ++ if x != nil { ++ return x.Psk ++ } ++ return "" ++} ++ ++func (x *ServerConfig) GetVersion() uint32 { ++ if x != nil { ++ return x.Version ++ } ++ return 0 ++} ++ ++func (x *ServerConfig) GetObfs() string { ++ if x != nil { ++ return x.Obfs ++ } ++ return "" ++} ++ ++func (x *ServerConfig) GetUdp() bool { ++ if x != nil { ++ return x.Udp ++ } ++ return false ++} ++ ++func (x *ServerConfig) GetLevel() uint32 { ++ if x != nil { ++ return x.Level ++ } ++ return 0 ++} ++ ++var File_proxy_snell_config_proto protoreflect.FileDescriptor ++ ++const file_proxy_snell_config_proto_rawDesc = "" + ++ "\n" + ++ "\x18proxy/snell/config.proto\x12\x10xray.proxy.snell\x1a\x18common/net/address.proto\"\xe2\x01\n" + ++ "\fClientConfig\x125\n" + ++ "\aaddress\x18\x01 \x01(\v2\x1b.xray.common.net.IPOrDomainR\aaddress\x12\x12\n" + ++ "\x04port\x18\x02 \x01(\rR\x04port\x12\x10\n" + ++ "\x03psk\x18\x03 \x01(\tR\x03psk\x12\x18\n" + ++ "\aversion\x18\x04 \x01(\rR\aversion\x12\x12\n" + ++ "\x04obfs\x18\x05 \x01(\tR\x04obfs\x12\x1b\n" + ++ "\tobfs_host\x18\x06 \x01(\tR\bobfsHost\x12\x14\n" + ++ "\x05reuse\x18\a \x01(\bR\x05reuse\x12\x14\n" + ++ "\x05level\x18\b \x01(\rR\x05level\"v\n" + ++ "\fServerConfig\x12\x10\n" + ++ "\x03psk\x18\x01 \x01(\tR\x03psk\x12\x18\n" + ++ "\aversion\x18\x02 \x01(\rR\aversion\x12\x12\n" + ++ "\x04obfs\x18\x03 \x01(\tR\x04obfs\x12\x10\n" + ++ "\x03udp\x18\x04 \x01(\bR\x03udp\x12\x14\n" + ++ "\x05level\x18\x05 \x01(\rR\x05levelB'Z%github.com/xtls/xray-core/proxy/snellb\x06proto3" ++ ++var ( ++ file_proxy_snell_config_proto_rawDescOnce sync.Once ++ file_proxy_snell_config_proto_rawDescData []byte ++) ++ ++func file_proxy_snell_config_proto_rawDescGZIP() []byte { ++ file_proxy_snell_config_proto_rawDescOnce.Do(func() { ++ file_proxy_snell_config_proto_rawDescData = protoimpl.X.CompressGZIP(unsafe.Slice(unsafe.StringData(file_proxy_snell_config_proto_rawDesc), len(file_proxy_snell_config_proto_rawDesc))) ++ }) ++ return file_proxy_snell_config_proto_rawDescData ++} ++ ++var file_proxy_snell_config_proto_msgTypes = make([]protoimpl.MessageInfo, 2) ++var file_proxy_snell_config_proto_goTypes = []any{ ++ (*ClientConfig)(nil), // 0: xray.proxy.snell.ClientConfig ++ (*ServerConfig)(nil), // 1: xray.proxy.snell.ServerConfig ++ (*net.IPOrDomain)(nil), // 2: xray.common.net.IPOrDomain ++} ++var file_proxy_snell_config_proto_depIdxs = []int32{ ++ 2, // 0: xray.proxy.snell.ClientConfig.address:type_name -> xray.common.net.IPOrDomain ++ 1, // [1:1] is the sub-list for method output_type ++ 1, // [1:1] is the sub-list for method input_type ++ 1, // [1:1] is the sub-list for extension type_name ++ 1, // [1:1] is the sub-list for extension extendee ++ 0, // [0:1] is the sub-list for field type_name ++} ++ ++func init() { file_proxy_snell_config_proto_init() } ++func file_proxy_snell_config_proto_init() { ++ if File_proxy_snell_config_proto != nil { ++ return ++ } ++ type x struct{} ++ out := protoimpl.TypeBuilder{ ++ File: protoimpl.DescBuilder{ ++ GoPackagePath: reflect.TypeOf(x{}).PkgPath(), ++ RawDescriptor: unsafe.Slice(unsafe.StringData(file_proxy_snell_config_proto_rawDesc), len(file_proxy_snell_config_proto_rawDesc)), ++ NumEnums: 0, ++ NumMessages: 2, ++ NumExtensions: 0, ++ NumServices: 0, ++ }, ++ GoTypes: file_proxy_snell_config_proto_goTypes, ++ DependencyIndexes: file_proxy_snell_config_proto_depIdxs, ++ MessageInfos: file_proxy_snell_config_proto_msgTypes, ++ }.Build() ++ File_proxy_snell_config_proto = out.File ++ file_proxy_snell_config_proto_goTypes = nil ++ file_proxy_snell_config_proto_depIdxs = nil ++} +--- a/proxy/snell/config.proto ++++ b/proxy/snell/config.proto +@@ -0,0 +1,21 @@ ++syntax = "proto3"; ++package xray.proxy.snell; ++option go_package = "github.com/xtls/xray-core/proxy/snell"; ++import "common/net/address.proto"; ++message ClientConfig { ++ xray.common.net.IPOrDomain address = 1; ++ uint32 port = 2; ++ string psk = 3; ++ uint32 version = 4; ++ string obfs = 5; ++ string obfs_host = 6; ++ bool reuse = 7; ++ uint32 level = 8; ++} ++message ServerConfig { ++ string psk = 1; ++ uint32 version = 2; ++ string obfs = 3; ++ bool udp = 4; ++ uint32 level = 5; ++} +--- a/proxy/snell/packet.go ++++ b/proxy/snell/packet.go +@@ -0,0 +1,43 @@ ++package snell ++ ++import ( ++ M "github.com/sagernet/sing/common/metadata" ++ "github.com/xtls/xray-core/common/buf" ++ N "github.com/xtls/xray-core/common/net" ++ "net" ++) ++ ++type packetReader struct{ conn net.PacketConn } ++ ++func (r *packetReader) ReadMultiBuffer() (buf.MultiBuffer, error) { ++ data := make([]byte, 65535) ++ n, a, e := r.conn.ReadFrom(data) ++ if e != nil { ++ return nil, e ++ } ++ b := buf.FromBytes(data[:n]) ++ m := M.SocksaddrFromNet(a) ++ d := N.UDPDestination(N.ParseAddress(m.AddrString()), N.Port(m.Port)) ++ b.UDP = &d ++ return buf.MultiBuffer{b}, nil ++} ++ ++type packetWriter struct { ++ conn net.PacketConn ++ destination N.Destination ++} ++ ++func (w *packetWriter) WriteMultiBuffer(mb buf.MultiBuffer) error { ++ defer buf.ReleaseMulti(mb) ++ for _, b := range mb { ++ d := w.destination ++ if b.UDP != nil { ++ d = *b.UDP ++ } ++ a := M.ParseSocksaddrHostPort(d.Address.String(), uint16(d.Port)) ++ if _, e := w.conn.WriteTo(b.Bytes(), a); e != nil { ++ return e ++ } ++ } ++ return nil ++} +--- a/proxy/snell/relay.go ++++ b/proxy/snell/relay.go +@@ -0,0 +1,60 @@ ++package snell ++ ++import ( ++ "context" ++ "github.com/xtls/xray-core/common" ++ "github.com/xtls/xray-core/common/buf" ++ "github.com/xtls/xray-core/common/signal" ++ "github.com/xtls/xray-core/features/policy" ++) ++ ++// Stop blocked reads and join both copy loops before closing Mihomo packet state. ++func relay(ctx context.Context, upR buf.Reader, upW buf.Writer, downR buf.Reader, downW buf.Writer, stopIO func(), p policy.Session) error { ++ ctx, cancel := context.WithCancel(ctx) ++ defer cancel() ++ timer := signal.CancelAfterInactivity(ctx, cancel, p.Timeouts.ConnectionIdle) ++ defer timer.SetTimeout(0) ++ results := make(chan error, 2) ++ go func() { ++ e := buf.Copy(upR, upW, buf.UpdateActivity(timer)) ++ if e == nil { ++ common.Close(upW) ++ } ++ timer.SetTimeout(p.Timeouts.DownlinkOnly) ++ results <- e ++ }() ++ go func() { ++ e := buf.Copy(downR, downW, buf.UpdateActivity(timer)) ++ if e == nil { ++ common.Close(downW) ++ } ++ timer.SetTimeout(p.Timeouts.UplinkOnly) ++ results <- e ++ }() ++ var first error ++ count := 0 ++ for count < 2 { ++ select { ++ case e := <-results: ++ count++ ++ if e != nil { ++ first = e ++ } ++ case <-ctx.Done(): ++ first = ctx.Err() ++ } ++ if first != nil || count == 2 { ++ break ++ } ++ } ++ stopIO() ++ common.Interrupt(upR) ++ common.Interrupt(upW) ++ common.Interrupt(downR) ++ common.Interrupt(downW) ++ for count < 2 { ++ <-results ++ count++ ++ } ++ return first ++} +--- a/proxy/snell/server.go ++++ b/proxy/snell/server.go +@@ -0,0 +1,231 @@ ++package snell ++ ++import ( ++ "context" ++ "encoding/binary" ++ stderrors "errors" ++ "io" ++ "sync" ++ "sync/atomic" ++ "time" ++ ++ A "github.com/metacubex/mihomo/transport/shadowsocks/shadowaead" ++ O "github.com/metacubex/mihomo/transport/simple-obfs" ++ S "github.com/metacubex/mihomo/transport/snell" ++ M "github.com/sagernet/sing/common/metadata" ++ "github.com/xtls/xray-core/common" ++ "github.com/xtls/xray-core/common/buf" ++ "github.com/xtls/xray-core/common/errors" ++ "github.com/xtls/xray-core/common/net" ++ "github.com/xtls/xray-core/common/protocol" ++ "github.com/xtls/xray-core/common/session" ++ "github.com/xtls/xray-core/core" ++ "github.com/xtls/xray-core/features/policy" ++ "github.com/xtls/xray-core/features/routing" ++ "github.com/xtls/xray-core/transport/internet/stat" ++) ++ ++type Server struct { ++ config *ServerConfig ++ policy policy.Session ++} ++ ++func (s *Server) Network() []net.Network { return []net.Network{net.Network_TCP} } ++func (s *Server) Process(ctx context.Context, _ net.Network, raw stat.Connection, d routing.Dispatcher) error { ++ var conn net.Conn = raw ++ switch s.config.Obfs { ++ case "http": ++ conn = O.NewHTTPObfsServer(conn) ++ case "tls": ++ conn = O.NewTLSObfsServer(conn) ++ } ++ stream := S.ServerStreamConn(conn, []byte(s.config.Psk), int(s.config.Version)) ++ defer stream.Close() ++ cancelDone := make(chan struct{}) ++ stop := context.AfterFunc(ctx, func() { stream.SetDeadline(time.Now()); close(cancelDone) }) ++ defer func() { ++ if !stop() { ++ <-cancelDone ++ } ++ }() ++ if in := session.InboundFromContext(ctx); in != nil { ++ cp := *in ++ cp.Name = "snell" ++ cp.CanSpliceCopy = 3 ++ cp.User = &protocol.MemoryUser{Level: s.config.Level} ++ ctx = session.ContextWithInbound(ctx, &cp) ++ } ++ for { ++ stream.SetDeadline(time.Now().Add(s.policy.Timeouts.Handshake)) ++ var head [2]byte ++ if _, e := io.ReadFull(stream, head[:]); e != nil { ++ return e ++ } ++ if head[0] != S.Version { ++ return errors.New("snell: invalid protocol version") ++ } ++ cmd := head[1] ++ if cmd == S.CommandPing { ++ _, e := stream.Write([]byte{S.CommandPong}) ++ return e ++ } ++ var size [1]byte ++ if _, e := io.ReadFull(stream, size[:]); e != nil { ++ return e ++ } ++ if _, e := io.CopyN(io.Discard, stream, int64(size[0])); e != nil { ++ return e ++ } ++ if cmd == S.CommandUDP { ++ if !s.config.Udp || s.config.Version < 3 { ++ return errors.New("snell: UDP disabled") ++ } ++ if _, e := stream.Write([]byte{S.CommandTunnel}); e != nil { ++ return e ++ } ++ stream.SetDeadline(time.Time{}) ++ pc := &serverPacketConn{Conn: stream, stream: stream} ++ reader := &packetReader{pc} ++ // Wait for the first target under the handshake timeout. ++ stream.SetReadDeadline(time.Now().Add(s.policy.Timeouts.Handshake)) ++ first, e := reader.ReadMultiBuffer() ++ if e != nil { ++ return e ++ } ++ stream.SetReadDeadline(time.Time{}) ++ target := *first[0].UDP ++ link, e := d.Dispatch(ctx, target) ++ if e != nil { ++ buf.ReleaseMulti(first) ++ return e ++ } ++ return relay(ctx, &firstReader{first: first, reader: reader}, link.Writer, link.Reader, &packetWriter{pc, target}, func() { ++ stream.SetReadDeadline(time.Now()) ++ stream.SetWriteDeadline(time.Now().Add(s.policy.Timeouts.Handshake)) ++ }, s.policy) ++ } ++ if cmd != S.CommandConnect && cmd != S.CommandConnectV2 { ++ return errors.New("snell: invalid command") ++ } ++ if _, e := io.ReadFull(stream, size[:]); e != nil { ++ return e ++ } ++ if size[0] == 0 { ++ return errors.New("snell: empty host") ++ } ++ host := make([]byte, int(size[0])) ++ if _, e := io.ReadFull(stream, host); e != nil { ++ return e ++ } ++ var port [2]byte ++ if _, e := io.ReadFull(stream, port[:]); e != nil { ++ return e ++ } ++ target := net.TCPDestination(net.ParseAddress(string(host)), net.Port(binary.BigEndian.Uint16(port[:]))) ++ if target.Port == 0 { ++ return errors.New("snell: invalid port") ++ } ++ requestCtx, cancel := context.WithCancel(ctx) ++ link, e := d.Dispatch(requestCtx, target) ++ if e != nil { ++ cancel() ++ return e ++ } ++ if _, e = stream.Write([]byte{S.CommandTunnel}); e != nil { ++ cancel() ++ common.Interrupt(link.Reader) ++ common.Interrupt(link.Writer) ++ return e ++ } ++ stream.SetDeadline(time.Time{}) ++ reuse := cmd == S.CommandConnectV2 ++ var writer buf.Writer = buf.NewWriter(stream) ++ ++ var endOnce sync.Once ++ var endErr error ++ endReply := func() error { endOnce.Do(func() { _, endErr = stream.Write(nil) }); return endErr } ++ if reuse { ++ writer = &closeWriter{writer, endReply} ++ } ++ request := &requestConn{Conn: stream} ++ e = relay(requestCtx, buf.NewReader(request), link.Writer, link.Reader, writer, func() { ++ stream.SetReadDeadline(time.Now()) ++ stream.SetWriteDeadline(time.Now().Add(s.policy.Timeouts.Handshake)) ++ }, s.policy) ++ cancel() ++ ++ if !reuse || !request.ended.Load() || ctx.Err() != nil { ++ return e ++ } ++ // Routing may finish on its downlink timeout after the peer's zero chunk. ++ // All copy loops have joined, so end this response before reading the next request. ++ stream.SetDeadline(time.Now().Add(s.policy.Timeouts.Handshake)) ++ if err := endReply(); err != nil { ++ return err ++ } ++ stream.SetDeadline(time.Time{}) ++ } ++} ++ ++type requestConn struct { ++ net.Conn ++ ended atomic.Bool ++} ++ ++func (c *requestConn) Read(p []byte) (int, error) { ++ n, e := c.Conn.Read(p) ++ if stderrors.Is(e, A.ErrZeroChunk) { ++ e = io.EOF ++ c.ended.Store(true) ++ } ++ return n, e ++} ++ ++type firstReader struct { ++ first buf.MultiBuffer ++ reader buf.Reader ++} ++ ++func (r *firstReader) ReadMultiBuffer() (buf.MultiBuffer, error) { ++ if r.first != nil { ++ b := r.first ++ r.first = nil ++ return b, nil ++ } ++ return r.reader.ReadMultiBuffer() ++} ++ ++type serverPacketConn struct { ++ net.Conn ++ stream *S.Snell ++} ++ ++func (c *serverPacketConn) ReadFrom(b []byte) (int, net.Addr, error) { ++ data := make([]byte, 0x3fff) ++ n, e := c.stream.Read(data) ++ if e != nil { ++ return 0, nil, e ++ } ++ p, e := S.ParseUDPRequest(data[:n]) ++ if e != nil { ++ return 0, nil, e ++ } ++ host := p.Host ++ if p.Ip.IsValid() { ++ host = p.Ip.String() ++ } ++ if p.Port == 0 { ++ return 0, nil, errors.New("snell: invalid UDP port") ++ } ++ a := M.ParseSocksaddrHostPort(host, p.Port) ++ return copy(b, p.Payload), a, nil ++} ++func (c *serverPacketConn) WriteTo(b []byte, a net.Addr) (int, error) { ++ return S.WritePacketResponse(c.stream, a, b) ++} ++func init() { ++ common.Must(common.RegisterConfig((*ServerConfig)(nil), func(ctx context.Context, c interface{}) (interface{}, error) { ++ config := c.(*ServerConfig) ++ return &Server{config, core.MustFromContext(ctx).GetFeature(policy.ManagerType()).(policy.Manager).ForLevel(config.Level)}, nil ++ })) ++} diff --git a/xray-core/patches/170-add-shadowtls-transport.patch b/xray-core/patches/170-add-shadowtls-transport.patch new file mode 100644 index 000000000..217b46d75 --- /dev/null +++ b/xray-core/patches/170-add-shadowtls-transport.patch @@ -0,0 +1,2732 @@ +From: coolsnowwolf +Subject: [PATCH] transport: add Mihomo ShadowTLS inbound and outbound + +Port ShadowTLS v1/v2/v3 framing and authentication from Mihomo v1.19.32. +Add RAW/TCP security settings, metacubex uTLS client fingerprints, certificate +verification, multi-user v3 authentication and SNI-selected handshake servers. +Bound handshakes, cancel pending connections when listeners close, and retain +Xray routing and socket options. ShadowTLS does not encrypt inner payloads; +use an encrypted inner protocol. Native UDP is not wrapped by ShadowTLS. + +Signed-off-by: coolsnowwolf + +--- a/go.mod ++++ b/go.mod +@@ -18,6 +18,7 @@ + github.com/metacubex/mihomo v1.19.32 + github.com/metacubex/quic-go v0.61.1-0.20260727080200-2548683b76f4 + github.com/metacubex/tls v0.1.8 ++ github.com/metacubex/utls v1.8.8 + github.com/miekg/dns v1.1.73 + github.com/pelletier/go-toml v1.9.5 + github.com/pion/stun/v3 v3.1.7 +--- a/go.sum ++++ b/go.sum +@@ -84,6 +84,8 @@ + github.com/metacubex/tfo-go v0.0.0-20260623020846-376a77860b8c/go.mod h1:l9oLnLoEXyGZ5RVLsh7QCC5XsouTUyKk4F2nLm2DHLw= + github.com/metacubex/tls v0.1.8 h1:BHF2payjtxC7wdR3tnq8vl3FAgEQB6/pPjP2tJNTsP4= + github.com/metacubex/tls v0.1.8/go.mod h1:0XeVdL0cBw+8i5Hqy3lVeP9IyD/LFTq02ExvHM6rzEM= ++github.com/metacubex/utls v1.8.8 h1:7fiMYahL+tT1I/vG1MWidv88r/3A5NnPrurjzApZGyQ= ++github.com/metacubex/utls v1.8.8/go.mod h1:kncGGVhFaoGn5M3pFe3SXhZCzsbCJayNOH4UEqTKTko= + github.com/metacubex/wireguard-go v0.0.0-20250820062549-a6cecdd7f57f h1:FGBPRb1zUabhPhDrlKEjQ9lgIwQ6cHL4x8M9lrERhbk= + github.com/metacubex/wireguard-go v0.0.0-20250820062549-a6cecdd7f57f/go.mod h1:oPGcV994OGJedmmxrcK9+ni7jUEMGhR+uVQAdaduIP4= + github.com/miekg/dns v1.1.73 h1:uhT8nJxmTrPJYClxVxTCX+CVn6qnzSiybRk72Z6DgrE= +--- a/infra/conf/shadowtls.go ++++ b/infra/conf/shadowtls.go +@@ -0,0 +1,48 @@ ++package conf ++ ++import ( ++ "github.com/xtls/xray-core/transport/internet/shadowtls" ++ "os" ++) ++ ++type ShadowTLSUser struct { ++ Name string `json:"name"` ++ Password string `json:"password"` ++} ++type ShadowTLSConfig struct { ++ Version uint32 `json:"version"` ++ Password string `json:"password"` ++ ServerName string `json:"serverName"` ++ Fingerprint string `json:"fingerprint"` ++ AllowInsecure bool `json:"allowInsecure"` ++ ALPN []string `json:"alpn"` ++ CertificateFiles []string `json:"certificateFiles"` ++ StrictMode bool `json:"strictMode"` ++ Handshake string `json:"handshake"` ++ Users []ShadowTLSUser `json:"users"` ++ HandshakeForServerName map[string]string `json:"handshakeForServerName"` ++ WildcardSNI string `json:"wildcardSni"` ++ HandshakeTimeout uint32 `json:"handshakeTimeout"` ++} ++ ++func (c *ShadowTLSConfig) Build() (*shadowtls.Config, error) { ++ version := c.Version ++ if version == 0 { ++ version = 3 ++ } ++ cfg := &shadowtls.Config{Version: version, Password: c.Password, ServerName: c.ServerName, Fingerprint: c.Fingerprint, AllowInsecure: c.AllowInsecure, Alpn: c.ALPN, StrictMode: c.StrictMode, Handshake: c.Handshake, HandshakeForServerName: c.HandshakeForServerName, WildcardSni: c.WildcardSNI, HandshakeTimeout: c.HandshakeTimeout} ++ for _, u := range c.Users { ++ cfg.Users = append(cfg.Users, &shadowtls.User{Name: u.Name, Password: u.Password}) ++ } ++ for _, file := range c.CertificateFiles { ++ pem, err := os.ReadFile(file) ++ if err != nil { ++ return nil, err ++ } ++ cfg.Certificates = append(cfg.Certificates, pem) ++ } ++ if err := cfg.Validate(); err != nil { ++ return nil, err ++ } ++ return cfg, nil ++} +--- a/infra/conf/transport_internet.go ++++ b/infra/conf/transport_internet.go +@@ -52,6 +52,7 @@ + } + + type StreamConfig struct { ++ ShadowTLSSettings *ShadowTLSConfig `json:"shadowtlsSettings"` + Address *Address `json:"address"` + Port uint16 `json:"port"` + Method *TransportProtocol `json:"method"` +@@ -131,6 +132,20 @@ + } + tm := serial.ToTypedMessage(ts) + config.SecuritySettings = append(config.SecuritySettings, tm) ++ config.SecurityType = tm.Type ++ case "shadowtls", "shadow-tls": ++ if config.ProtocolName != "tcp" { ++ return nil, errors.New("ShadowTLS only supports RAW/TCP") ++ } ++ if c.ShadowTLSSettings == nil { ++ return nil, errors.New("ShadowTLS: empty shadowtlsSettings") ++ } ++ ts, err := c.ShadowTLSSettings.Build() ++ if err != nil { ++ return nil, err ++ } ++ tm := serial.ToTypedMessage(ts) ++ config.SecuritySettings = append(config.SecuritySettings, tm) + config.SecurityType = tm.Type + case "xtls": + return nil, errors.PrintRemovedFeatureError(`Legacy XTLS`, `xtls-rprx-vision with TLS or REALITY`) +--- a/transport/internet/shadowtls/LICENSE.mihomo ++++ b/transport/internet/shadowtls/LICENSE.mihomo +@@ -0,0 +1,674 @@ ++ GNU GENERAL PUBLIC LICENSE ++ Version 3, 29 June 2007 ++ ++ Copyright (C) 2007 Free Software Foundation, Inc. ++ Everyone is permitted to copy and distribute verbatim copies ++ of this license document, but changing it is not allowed. ++ ++ Preamble ++ ++ The GNU General Public License is a free, copyleft license for ++software and other kinds of works. ++ ++ The licenses for most software and other practical works are designed ++to take away your freedom to share and change the works. By contrast, ++the GNU General Public License is intended to guarantee your freedom to ++share and change all versions of a program--to make sure it remains free ++software for all its users. We, the Free Software Foundation, use the ++GNU General Public License for most of our software; it applies also to ++any other work released this way by its authors. You can apply it to ++your programs, too. ++ ++ When we speak of free software, we are referring to freedom, not ++price. Our General Public Licenses are designed to make sure that you ++have the freedom to distribute copies of free software (and charge for ++them if you wish), that you receive source code or can get it if you ++want it, that you can change the software or use pieces of it in new ++free programs, and that you know you can do these things. ++ ++ To protect your rights, we need to prevent others from denying you ++these rights or asking you to surrender the rights. Therefore, you have ++certain responsibilities if you distribute copies of the software, or if ++you modify it: responsibilities to respect the freedom of others. ++ ++ For example, if you distribute copies of such a program, whether ++gratis or for a fee, you must pass on to the recipients the same ++freedoms that you received. You must make sure that they, too, receive ++or can get the source code. And you must show them these terms so they ++know their rights. ++ ++ Developers that use the GNU GPL protect your rights with two steps: ++(1) assert copyright on the software, and (2) offer you this License ++giving you legal permission to copy, distribute and/or modify it. ++ ++ For the developers' and authors' protection, the GPL clearly explains ++that there is no warranty for this free software. For both users' and ++authors' sake, the GPL requires that modified versions be marked as ++changed, so that their problems will not be attributed erroneously to ++authors of previous versions. ++ ++ Some devices are designed to deny users access to install or run ++modified versions of the software inside them, although the manufacturer ++can do so. This is fundamentally incompatible with the aim of ++protecting users' freedom to change the software. The systematic ++pattern of such abuse occurs in the area of products for individuals to ++use, which is precisely where it is most unacceptable. Therefore, we ++have designed this version of the GPL to prohibit the practice for those ++products. If such problems arise substantially in other domains, we ++stand ready to extend this provision to those domains in future versions ++of the GPL, as needed to protect the freedom of users. ++ ++ Finally, every program is threatened constantly by software patents. ++States should not allow patents to restrict development and use of ++software on general-purpose computers, but in those that do, we wish to ++avoid the special danger that patents applied to a free program could ++make it effectively proprietary. To prevent this, the GPL assures that ++patents cannot be used to render the program non-free. ++ ++ The precise terms and conditions for copying, distribution and ++modification follow. ++ ++ TERMS AND CONDITIONS ++ ++ 0. Definitions. ++ ++ "This License" refers to version 3 of the GNU General Public License. ++ ++ "Copyright" also means copyright-like laws that apply to other kinds of ++works, such as semiconductor masks. ++ ++ "The Program" refers to any copyrightable work licensed under this ++License. Each licensee is addressed as "you". "Licensees" and ++"recipients" may be individuals or organizations. ++ ++ To "modify" a work means to copy from or adapt all or part of the work ++in a fashion requiring copyright permission, other than the making of an ++exact copy. The resulting work is called a "modified version" of the ++earlier work or a work "based on" the earlier work. ++ ++ A "covered work" means either the unmodified Program or a work based ++on the Program. ++ ++ To "propagate" a work means to do anything with it that, without ++permission, would make you directly or secondarily liable for ++infringement under applicable copyright law, except executing it on a ++computer or modifying a private copy. Propagation includes copying, ++distribution (with or without modification), making available to the ++public, and in some countries other activities as well. ++ ++ To "convey" a work means any kind of propagation that enables other ++parties to make or receive copies. Mere interaction with a user through ++a computer network, with no transfer of a copy, is not conveying. ++ ++ An interactive user interface displays "Appropriate Legal Notices" ++to the extent that it includes a convenient and prominently visible ++feature that (1) displays an appropriate copyright notice, and (2) ++tells the user that there is no warranty for the work (except to the ++extent that warranties are provided), that licensees may convey the ++work under this License, and how to view a copy of this License. If ++the interface presents a list of user commands or options, such as a ++menu, a prominent item in the list meets this criterion. ++ ++ 1. Source Code. ++ ++ The "source code" for a work means the preferred form of the work ++for making modifications to it. "Object code" means any non-source ++form of a work. ++ ++ A "Standard Interface" means an interface that either is an official ++standard defined by a recognized standards body, or, in the case of ++interfaces specified for a particular programming language, one that ++is widely used among developers working in that language. ++ ++ The "System Libraries" of an executable work include anything, other ++than the work as a whole, that (a) is included in the normal form of ++packaging a Major Component, but which is not part of that Major ++Component, and (b) serves only to enable use of the work with that ++Major Component, or to implement a Standard Interface for which an ++implementation is available to the public in source code form. A ++"Major Component", in this context, means a major essential component ++(kernel, window system, and so on) of the specific operating system ++(if any) on which the executable work runs, or a compiler used to ++produce the work, or an object code interpreter used to run it. ++ ++ The "Corresponding Source" for a work in object code form means all ++the source code needed to generate, install, and (for an executable ++work) run the object code and to modify the work, including scripts to ++control those activities. However, it does not include the work's ++System Libraries, or general-purpose tools or generally available free ++programs which are used unmodified in performing those activities but ++which are not part of the work. For example, Corresponding Source ++includes interface definition files associated with source files for ++the work, and the source code for shared libraries and dynamically ++linked subprograms that the work is specifically designed to require, ++such as by intimate data communication or control flow between those ++subprograms and other parts of the work. ++ ++ The Corresponding Source need not include anything that users ++can regenerate automatically from other parts of the Corresponding ++Source. ++ ++ The Corresponding Source for a work in source code form is that ++same work. ++ ++ 2. Basic Permissions. ++ ++ All rights granted under this License are granted for the term of ++copyright on the Program, and are irrevocable provided the stated ++conditions are met. This License explicitly affirms your unlimited ++permission to run the unmodified Program. The output from running a ++covered work is covered by this License only if the output, given its ++content, constitutes a covered work. This License acknowledges your ++rights of fair use or other equivalent, as provided by copyright law. ++ ++ You may make, run and propagate covered works that you do not ++convey, without conditions so long as your license otherwise remains ++in force. You may convey covered works to others for the sole purpose ++of having them make modifications exclusively for you, or provide you ++with facilities for running those works, provided that you comply with ++the terms of this License in conveying all material for which you do ++not control copyright. Those thus making or running the covered works ++for you must do so exclusively on your behalf, under your direction ++and control, on terms that prohibit them from making any copies of ++your copyrighted material outside their relationship with you. ++ ++ Conveying under any other circumstances is permitted solely under ++the conditions stated below. Sublicensing is not allowed; section 10 ++makes it unnecessary. ++ ++ 3. Protecting Users' Legal Rights From Anti-Circumvention Law. ++ ++ No covered work shall be deemed part of an effective technological ++measure under any applicable law fulfilling obligations under article ++11 of the WIPO copyright treaty adopted on 20 December 1996, or ++similar laws prohibiting or restricting circumvention of such ++measures. ++ ++ When you convey a covered work, you waive any legal power to forbid ++circumvention of technological measures to the extent such circumvention ++is effected by exercising rights under this License with respect to ++the covered work, and you disclaim any intention to limit operation or ++modification of the work as a means of enforcing, against the work's ++users, your or third parties' legal rights to forbid circumvention of ++technological measures. ++ ++ 4. Conveying Verbatim Copies. ++ ++ You may convey verbatim copies of the Program's source code as you ++receive it, in any medium, provided that you conspicuously and ++appropriately publish on each copy an appropriate copyright notice; ++keep intact all notices stating that this License and any ++non-permissive terms added in accord with section 7 apply to the code; ++keep intact all notices of the absence of any warranty; and give all ++recipients a copy of this License along with the Program. ++ ++ You may charge any price or no price for each copy that you convey, ++and you may offer support or warranty protection for a fee. ++ ++ 5. Conveying Modified Source Versions. ++ ++ You may convey a work based on the Program, or the modifications to ++produce it from the Program, in the form of source code under the ++terms of section 4, provided that you also meet all of these conditions: ++ ++ a) The work must carry prominent notices stating that you modified ++ it, and giving a relevant date. ++ ++ b) The work must carry prominent notices stating that it is ++ released under this License and any conditions added under section ++ 7. This requirement modifies the requirement in section 4 to ++ "keep intact all notices". ++ ++ c) You must license the entire work, as a whole, under this ++ License to anyone who comes into possession of a copy. This ++ License will therefore apply, along with any applicable section 7 ++ additional terms, to the whole of the work, and all its parts, ++ regardless of how they are packaged. This License gives no ++ permission to license the work in any other way, but it does not ++ invalidate such permission if you have separately received it. ++ ++ d) If the work has interactive user interfaces, each must display ++ Appropriate Legal Notices; however, if the Program has interactive ++ interfaces that do not display Appropriate Legal Notices, your ++ work need not make them do so. ++ ++ A compilation of a covered work with other separate and independent ++works, which are not by their nature extensions of the covered work, ++and which are not combined with it such as to form a larger program, ++in or on a volume of a storage or distribution medium, is called an ++"aggregate" if the compilation and its resulting copyright are not ++used to limit the access or legal rights of the compilation's users ++beyond what the individual works permit. Inclusion of a covered work ++in an aggregate does not cause this License to apply to the other ++parts of the aggregate. ++ ++ 6. Conveying Non-Source Forms. ++ ++ You may convey a covered work in object code form under the terms ++of sections 4 and 5, provided that you also convey the ++machine-readable Corresponding Source under the terms of this License, ++in one of these ways: ++ ++ a) Convey the object code in, or embodied in, a physical product ++ (including a physical distribution medium), accompanied by the ++ Corresponding Source fixed on a durable physical medium ++ customarily used for software interchange. ++ ++ b) Convey the object code in, or embodied in, a physical product ++ (including a physical distribution medium), accompanied by a ++ written offer, valid for at least three years and valid for as ++ long as you offer spare parts or customer support for that product ++ model, to give anyone who possesses the object code either (1) a ++ copy of the Corresponding Source for all the software in the ++ product that is covered by this License, on a durable physical ++ medium customarily used for software interchange, for a price no ++ more than your reasonable cost of physically performing this ++ conveying of source, or (2) access to copy the ++ Corresponding Source from a network server at no charge. ++ ++ c) Convey individual copies of the object code with a copy of the ++ written offer to provide the Corresponding Source. This ++ alternative is allowed only occasionally and noncommercially, and ++ only if you received the object code with such an offer, in accord ++ with subsection 6b. ++ ++ d) Convey the object code by offering access from a designated ++ place (gratis or for a charge), and offer equivalent access to the ++ Corresponding Source in the same way through the same place at no ++ further charge. You need not require recipients to copy the ++ Corresponding Source along with the object code. If the place to ++ copy the object code is a network server, the Corresponding Source ++ may be on a different server (operated by you or a third party) ++ that supports equivalent copying facilities, provided you maintain ++ clear directions next to the object code saying where to find the ++ Corresponding Source. Regardless of what server hosts the ++ Corresponding Source, you remain obligated to ensure that it is ++ available for as long as needed to satisfy these requirements. ++ ++ e) Convey the object code using peer-to-peer transmission, provided ++ you inform other peers where the object code and Corresponding ++ Source of the work are being offered to the general public at no ++ charge under subsection 6d. ++ ++ A separable portion of the object code, whose source code is excluded ++from the Corresponding Source as a System Library, need not be ++included in conveying the object code work. ++ ++ A "User Product" is either (1) a "consumer product", which means any ++tangible personal property which is normally used for personal, family, ++or household purposes, or (2) anything designed or sold for incorporation ++into a dwelling. In determining whether a product is a consumer product, ++doubtful cases shall be resolved in favor of coverage. For a particular ++product received by a particular user, "normally used" refers to a ++typical or common use of that class of product, regardless of the status ++of the particular user or of the way in which the particular user ++actually uses, or expects or is expected to use, the product. A product ++is a consumer product regardless of whether the product has substantial ++commercial, industrial or non-consumer uses, unless such uses represent ++the only significant mode of use of the product. ++ ++ "Installation Information" for a User Product means any methods, ++procedures, authorization keys, or other information required to install ++and execute modified versions of a covered work in that User Product from ++a modified version of its Corresponding Source. The information must ++suffice to ensure that the continued functioning of the modified object ++code is in no case prevented or interfered with solely because ++modification has been made. ++ ++ If you convey an object code work under this section in, or with, or ++specifically for use in, a User Product, and the conveying occurs as ++part of a transaction in which the right of possession and use of the ++User Product is transferred to the recipient in perpetuity or for a ++fixed term (regardless of how the transaction is characterized), the ++Corresponding Source conveyed under this section must be accompanied ++by the Installation Information. But this requirement does not apply ++if neither you nor any third party retains the ability to install ++modified object code on the User Product (for example, the work has ++been installed in ROM). ++ ++ The requirement to provide Installation Information does not include a ++requirement to continue to provide support service, warranty, or updates ++for a work that has been modified or installed by the recipient, or for ++the User Product in which it has been modified or installed. Access to a ++network may be denied when the modification itself materially and ++adversely affects the operation of the network or violates the rules and ++protocols for communication across the network. ++ ++ Corresponding Source conveyed, and Installation Information provided, ++in accord with this section must be in a format that is publicly ++documented (and with an implementation available to the public in ++source code form), and must require no special password or key for ++unpacking, reading or copying. ++ ++ 7. Additional Terms. ++ ++ "Additional permissions" are terms that supplement the terms of this ++License by making exceptions from one or more of its conditions. ++Additional permissions that are applicable to the entire Program shall ++be treated as though they were included in this License, to the extent ++that they are valid under applicable law. If additional permissions ++apply only to part of the Program, that part may be used separately ++under those permissions, but the entire Program remains governed by ++this License without regard to the additional permissions. ++ ++ When you convey a copy of a covered work, you may at your option ++remove any additional permissions from that copy, or from any part of ++it. (Additional permissions may be written to require their own ++removal in certain cases when you modify the work.) You may place ++additional permissions on material, added by you to a covered work, ++for which you have or can give appropriate copyright permission. ++ ++ Notwithstanding any other provision of this License, for material you ++add to a covered work, you may (if authorized by the copyright holders of ++that material) supplement the terms of this License with terms: ++ ++ a) Disclaiming warranty or limiting liability differently from the ++ terms of sections 15 and 16 of this License; or ++ ++ b) Requiring preservation of specified reasonable legal notices or ++ author attributions in that material or in the Appropriate Legal ++ Notices displayed by works containing it; or ++ ++ c) Prohibiting misrepresentation of the origin of that material, or ++ requiring that modified versions of such material be marked in ++ reasonable ways as different from the original version; or ++ ++ d) Limiting the use for publicity purposes of names of licensors or ++ authors of the material; or ++ ++ e) Declining to grant rights under trademark law for use of some ++ trade names, trademarks, or service marks; or ++ ++ f) Requiring indemnification of licensors and authors of that ++ material by anyone who conveys the material (or modified versions of ++ it) with contractual assumptions of liability to the recipient, for ++ any liability that these contractual assumptions directly impose on ++ those licensors and authors. ++ ++ All other non-permissive additional terms are considered "further ++restrictions" within the meaning of section 10. If the Program as you ++received it, or any part of it, contains a notice stating that it is ++governed by this License along with a term that is a further ++restriction, you may remove that term. If a license document contains ++a further restriction but permits relicensing or conveying under this ++License, you may add to a covered work material governed by the terms ++of that license document, provided that the further restriction does ++not survive such relicensing or conveying. ++ ++ If you add terms to a covered work in accord with this section, you ++must place, in the relevant source files, a statement of the ++additional terms that apply to those files, or a notice indicating ++where to find the applicable terms. ++ ++ Additional terms, permissive or non-permissive, may be stated in the ++form of a separately written license, or stated as exceptions; ++the above requirements apply either way. ++ ++ 8. Termination. ++ ++ You may not propagate or modify a covered work except as expressly ++provided under this License. Any attempt otherwise to propagate or ++modify it is void, and will automatically terminate your rights under ++this License (including any patent licenses granted under the third ++paragraph of section 11). ++ ++ However, if you cease all violation of this License, then your ++license from a particular copyright holder is reinstated (a) ++provisionally, unless and until the copyright holder explicitly and ++finally terminates your license, and (b) permanently, if the copyright ++holder fails to notify you of the violation by some reasonable means ++prior to 60 days after the cessation. ++ ++ Moreover, your license from a particular copyright holder is ++reinstated permanently if the copyright holder notifies you of the ++violation by some reasonable means, this is the first time you have ++received notice of violation of this License (for any work) from that ++copyright holder, and you cure the violation prior to 30 days after ++your receipt of the notice. ++ ++ Termination of your rights under this section does not terminate the ++licenses of parties who have received copies or rights from you under ++this License. If your rights have been terminated and not permanently ++reinstated, you do not qualify to receive new licenses for the same ++material under section 10. ++ ++ 9. Acceptance Not Required for Having Copies. ++ ++ You are not required to accept this License in order to receive or ++run a copy of the Program. Ancillary propagation of a covered work ++occurring solely as a consequence of using peer-to-peer transmission ++to receive a copy likewise does not require acceptance. However, ++nothing other than this License grants you permission to propagate or ++modify any covered work. These actions infringe copyright if you do ++not accept this License. Therefore, by modifying or propagating a ++covered work, you indicate your acceptance of this License to do so. ++ ++ 10. Automatic Licensing of Downstream Recipients. ++ ++ Each time you convey a covered work, the recipient automatically ++receives a license from the original licensors, to run, modify and ++propagate that work, subject to this License. You are not responsible ++for enforcing compliance by third parties with this License. ++ ++ An "entity transaction" is a transaction transferring control of an ++organization, or substantially all assets of one, or subdividing an ++organization, or merging organizations. If propagation of a covered ++work results from an entity transaction, each party to that ++transaction who receives a copy of the work also receives whatever ++licenses to the work the party's predecessor in interest had or could ++give under the previous paragraph, plus a right to possession of the ++Corresponding Source of the work from the predecessor in interest, if ++the predecessor has it or can get it with reasonable efforts. ++ ++ You may not impose any further restrictions on the exercise of the ++rights granted or affirmed under this License. For example, you may ++not impose a license fee, royalty, or other charge for exercise of ++rights granted under this License, and you may not initiate litigation ++(including a cross-claim or counterclaim in a lawsuit) alleging that ++any patent claim is infringed by making, using, selling, offering for ++sale, or importing the Program or any portion of it. ++ ++ 11. Patents. ++ ++ A "contributor" is a copyright holder who authorizes use under this ++License of the Program or a work on which the Program is based. The ++work thus licensed is called the contributor's "contributor version". ++ ++ A contributor's "essential patent claims" are all patent claims ++owned or controlled by the contributor, whether already acquired or ++hereafter acquired, that would be infringed by some manner, permitted ++by this License, of making, using, or selling its contributor version, ++but do not include claims that would be infringed only as a ++consequence of further modification of the contributor version. For ++purposes of this definition, "control" includes the right to grant ++patent sublicenses in a manner consistent with the requirements of ++this License. ++ ++ Each contributor grants you a non-exclusive, worldwide, royalty-free ++patent license under the contributor's essential patent claims, to ++make, use, sell, offer for sale, import and otherwise run, modify and ++propagate the contents of its contributor version. ++ ++ In the following three paragraphs, a "patent license" is any express ++agreement or commitment, however denominated, not to enforce a patent ++(such as an express permission to practice a patent or covenant not to ++sue for patent infringement). To "grant" such a patent license to a ++party means to make such an agreement or commitment not to enforce a ++patent against the party. ++ ++ If you convey a covered work, knowingly relying on a patent license, ++and the Corresponding Source of the work is not available for anyone ++to copy, free of charge and under the terms of this License, through a ++publicly available network server or other readily accessible means, ++then you must either (1) cause the Corresponding Source to be so ++available, or (2) arrange to deprive yourself of the benefit of the ++patent license for this particular work, or (3) arrange, in a manner ++consistent with the requirements of this License, to extend the patent ++license to downstream recipients. "Knowingly relying" means you have ++actual knowledge that, but for the patent license, your conveying the ++covered work in a country, or your recipient's use of the covered work ++in a country, would infringe one or more identifiable patents in that ++country that you have reason to believe are valid. ++ ++ If, pursuant to or in connection with a single transaction or ++arrangement, you convey, or propagate by procuring conveyance of, a ++covered work, and grant a patent license to some of the parties ++receiving the covered work authorizing them to use, propagate, modify ++or convey a specific copy of the covered work, then the patent license ++you grant is automatically extended to all recipients of the covered ++work and works based on it. ++ ++ A patent license is "discriminatory" if it does not include within ++the scope of its coverage, prohibits the exercise of, or is ++conditioned on the non-exercise of one or more of the rights that are ++specifically granted under this License. You may not convey a covered ++work if you are a party to an arrangement with a third party that is ++in the business of distributing software, under which you make payment ++to the third party based on the extent of your activity of conveying ++the work, and under which the third party grants, to any of the ++parties who would receive the covered work from you, a discriminatory ++patent license (a) in connection with copies of the covered work ++conveyed by you (or copies made from those copies), or (b) primarily ++for and in connection with specific products or compilations that ++contain the covered work, unless you entered into that arrangement, ++or that patent license was granted, prior to 28 March 2007. ++ ++ Nothing in this License shall be construed as excluding or limiting ++any implied license or other defenses to infringement that may ++otherwise be available to you under applicable patent law. ++ ++ 12. No Surrender of Others' Freedom. ++ ++ If conditions are imposed on you (whether by court order, agreement or ++otherwise) that contradict the conditions of this License, they do not ++excuse you from the conditions of this License. If you cannot convey a ++covered work so as to satisfy simultaneously your obligations under this ++License and any other pertinent obligations, then as a consequence you may ++not convey it at all. For example, if you agree to terms that obligate you ++to collect a royalty for further conveying from those to whom you convey ++the Program, the only way you could satisfy both those terms and this ++License would be to refrain entirely from conveying the Program. ++ ++ 13. Use with the GNU Affero General Public License. ++ ++ Notwithstanding any other provision of this License, you have ++permission to link or combine any covered work with a work licensed ++under version 3 of the GNU Affero General Public License into a single ++combined work, and to convey the resulting work. The terms of this ++License will continue to apply to the part which is the covered work, ++but the special requirements of the GNU Affero General Public License, ++section 13, concerning interaction through a network will apply to the ++combination as such. ++ ++ 14. Revised Versions of this License. ++ ++ The Free Software Foundation may publish revised and/or new versions of ++the GNU General Public License from time to time. Such new versions will ++be similar in spirit to the present version, but may differ in detail to ++address new problems or concerns. ++ ++ Each version is given a distinguishing version number. If the ++Program specifies that a certain numbered version of the GNU General ++Public License "or any later version" applies to it, you have the ++option of following the terms and conditions either of that numbered ++version or of any later version published by the Free Software ++Foundation. If the Program does not specify a version number of the ++GNU General Public License, you may choose any version ever published ++by the Free Software Foundation. ++ ++ If the Program specifies that a proxy can decide which future ++versions of the GNU General Public License can be used, that proxy's ++public statement of acceptance of a version permanently authorizes you ++to choose that version for the Program. ++ ++ Later license versions may give you additional or different ++permissions. However, no additional obligations are imposed on any ++author or copyright holder as a result of your choosing to follow a ++later version. ++ ++ 15. Disclaimer of Warranty. ++ ++ THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY ++APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT ++HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY ++OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, ++THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR ++PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM ++IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ++ALL NECESSARY SERVICING, REPAIR OR CORRECTION. ++ ++ 16. Limitation of Liability. ++ ++ IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING ++WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS ++THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY ++GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE ++USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF ++DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD ++PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), ++EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF ++SUCH DAMAGES. ++ ++ 17. Interpretation of Sections 15 and 16. ++ ++ If the disclaimer of warranty and limitation of liability provided ++above cannot be given local legal effect according to their terms, ++reviewing courts shall apply local law that most closely approximates ++an absolute waiver of all civil liability in connection with the ++Program, unless a warranty or assumption of liability accompanies a ++copy of the Program in return for a fee. ++ ++ END OF TERMS AND CONDITIONS ++ ++ How to Apply These Terms to Your New Programs ++ ++ If you develop a new program, and you want it to be of the greatest ++possible use to the public, the best way to achieve this is to make it ++free software which everyone can redistribute and change under these terms. ++ ++ To do so, attach the following notices to the program. It is safest ++to attach them to the start of each source file to most effectively ++state the exclusion of warranty; and each file should have at least ++the "copyright" line and a pointer to where the full notice is found. ++ ++ ++ Copyright (C) ++ ++ This program is free software: you can redistribute it and/or modify ++ it under the terms of the GNU General Public License as published by ++ the Free Software Foundation, either version 3 of the License, or ++ (at your option) any later version. ++ ++ This program is distributed in the hope that it will be useful, ++ but WITHOUT ANY WARRANTY; without even the implied warranty of ++ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++ GNU General Public License for more details. ++ ++ You should have received a copy of the GNU General Public License ++ along with this program. If not, see . ++ ++Also add information on how to contact you by electronic and paper mail. ++ ++ If the program does terminal interaction, make it output a short ++notice like this when it starts in an interactive mode: ++ ++ Copyright (C) ++ This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. ++ This is free software, and you are welcome to redistribute it ++ under certain conditions; type `show c' for details. ++ ++The hypothetical commands `show w' and `show c' should show the appropriate ++parts of the General Public License. Of course, your program's commands ++might be different; for a GUI interface, you would use an "about box". ++ ++ You should also get your employer (if you work as a programmer) or school, ++if any, to sign a "copyright disclaimer" for the program, if necessary. ++For more information on this, and how to apply and follow the GNU GPL, see ++. ++ ++ The GNU General Public License does not permit incorporating your program ++into proprietary programs. If your program is a subroutine library, you ++may consider it more useful to permit linking proprietary applications with ++the library. If this is what you want to do, use the GNU Lesser General ++Public License instead of this License. But first, please read ++. +--- a/transport/internet/shadowtls/config.go ++++ b/transport/internet/shadowtls/config.go +@@ -0,0 +1,223 @@ ++package shadowtls ++ ++import ( ++ "context" ++ "crypto/x509" ++ "fmt" ++ "net" ++ "slices" ++ "strings" ++ "time" ++ ++ utls "github.com/metacubex/utls" ++ xnet "github.com/xtls/xray-core/common/net" ++ "github.com/xtls/xray-core/transport/internet" ++ protocol "github.com/xtls/xray-core/transport/internet/shadowtls/protocol" ++) ++ ++func ConfigFromStreamSettings(settings *internet.MemoryStreamConfig) *Config { ++ if settings == nil { ++ return nil ++ } ++ c, _ := settings.SecuritySettings.(*Config) ++ return c ++} ++func (c *Config) Timeout() time.Duration { ++ if c.HandshakeTimeout == 0 { ++ return 15 * time.Second ++ } ++ return time.Duration(c.HandshakeTimeout) * time.Second ++} ++ ++func (c *Config) Validate() error { ++ if c.Version < 1 || c.Version > 3 { ++ return fmt.Errorf("shadowtls: version must be 1, 2 or 3") ++ } ++ if c.HandshakeTimeout > 300 { ++ return fmt.Errorf("shadowtls: handshakeTimeout must not exceed 300 seconds") ++ } ++ if (c.Version == 2 && c.Password == "") || (c.Version == 3 && c.Password == "" && len(c.Users) == 0) { ++ return fmt.Errorf("shadowtls: password or users required") ++ } ++ for _, u := range c.Users { ++ if u == nil || u.Password == "" { ++ return fmt.Errorf("shadowtls: empty user password") ++ } ++ } ++ if _, err := fingerprint(c.Fingerprint); err != nil { ++ return err ++ } ++ switch c.WildcardSni { ++ case "", "off", "authed", "all": ++ default: ++ return fmt.Errorf("shadowtls: invalid wildcardSni") ++ } ++ for _, addr := range c.HandshakeForServerName { ++ if err := checkAddress(addr); err != nil { ++ return err ++ } ++ } ++ for name := range c.HandshakeForServerName { ++ if name == "" { ++ return fmt.Errorf("shadowtls: empty handshake server name") ++ } ++ } ++ if c.Handshake != "" { ++ if err := checkAddress(c.Handshake); err != nil { ++ return err ++ } ++ } ++ _, err := c.roots() ++ return err ++} ++func checkAddress(addr string) error { ++ d, err := xnet.ParseDestination("tcp:" + addr) ++ if err != nil || d.Port == 0 || d.Address == nil { ++ return fmt.Errorf("shadowtls: invalid handshake address %q", addr) ++ } ++ return nil ++} ++func (c *Config) roots() (*x509.CertPool, error) { ++ if len(c.Certificates) == 0 { ++ return nil, nil ++ } ++ pool, err := x509.SystemCertPool() ++ if err != nil { ++ pool = x509.NewCertPool() ++ } ++ for _, pem := range c.Certificates { ++ if !pool.AppendCertsFromPEM(pem) { ++ return nil, fmt.Errorf("shadowtls: invalid CA certificate") ++ } ++ } ++ return pool, nil ++} ++func fingerprint(name string) (*utls.ClientHelloID, error) { ++ ids := map[string]utls.ClientHelloID{"chrome": utls.HelloChrome_Auto, "firefox": utls.HelloFirefox_Auto, "safari": utls.HelloSafari_Auto, "ios": utls.HelloIOS_Auto, "android": utls.HelloAndroid_11_OkHttp, "edge": utls.HelloEdge_Auto, "360": utls.Hello360_Auto, "qq": utls.HelloQQ_Auto, "chrome120": utls.HelloChrome_120, "firefox120": utls.HelloFirefox_120, "safari16": utls.HelloSafari_16_0, "randomized": utls.HelloRandomized} ++ switch name { ++ case "", "none", "golang": ++ return nil, nil ++ } ++ id, ok := ids[name] ++ if !ok { ++ return nil, fmt.Errorf("shadowtls: unknown fingerprint %q", name) ++ } ++ return &id, nil ++} ++ ++func (c *Config) Client(ctx context.Context, conn net.Conn, dest xnet.Destination) (net.Conn, error) { ++ if err := c.Validate(); err != nil { ++ return nil, err ++ } ++ if c.Version > 1 && c.Password == "" { ++ return nil, fmt.Errorf("shadowtls: outbound password required") ++ } ++ host := c.ServerName ++ if host == "" { ++ host = dest.Address.String() ++ } ++ roots, err := c.roots() ++ if err != nil { ++ return nil, err ++ } ++ fp, err := fingerprint(c.Fingerprint) ++ if err != nil { ++ return nil, err ++ } ++ alpn := c.Alpn ++ if len(alpn) == 0 { ++ alpn = protocol.DefaultALPN ++ } ++ client, err := protocol.NewClient(protocol.ClientConfig{Version: int(c.Version), Password: c.Password, StrictMode: c.StrictMode, TLSHandshake: func(ctx context.Context, raw net.Conn, generator protocol.TLSSessionIDGeneratorFunc) error { ++ tc := &utls.Config{ServerName: host, RootCAs: roots, InsecureSkipVerify: c.AllowInsecure, MinVersion: utls.VersionTLS12, NextProtos: alpn, SessionIDGenerator: generator} ++ if c.Version == 1 { ++ tc.MaxVersion = utls.VersionTLS12 ++ return utls.Client(raw, tc).HandshakeContext(ctx) ++ } ++ // V2 cannot authenticate a handshake using the post-quantum key share. ++ if c.Version == 2 { ++ tc.CurvePreferences = []utls.CurveID{utls.X25519, utls.CurveP256, utls.CurveP384} ++ } ++ if fp == nil { ++ return utls.Client(raw, tc).HandshakeContext(ctx) ++ } ++ uc := utls.UClient(raw, tc, *fp) ++ if err := uc.BuildHandshakeState(); err != nil { ++ return err ++ } ++ for _, extension := range uc.Extensions { ++ switch e := extension.(type) { ++ case *utls.ALPNExtension: ++ if len(c.Alpn) > 0 { ++ e.AlpnProtocols = append([]string(nil), alpn...) ++ } ++ case *utls.SupportedCurvesExtension: ++ if c.Version == 2 { ++ e.Curves = slices.DeleteFunc(e.Curves, func(v utls.CurveID) bool { return v == utls.X25519MLKEM768 }) ++ } ++ case *utls.KeyShareExtension: ++ if c.Version == 2 { ++ e.KeyShares = slices.DeleteFunc(e.KeyShares, func(v utls.KeyShare) bool { return v.Group == utls.X25519MLKEM768 }) ++ } ++ } ++ } ++ if err := uc.BuildHandshakeState(); err != nil { ++ return err ++ } ++ return uc.HandshakeContext(ctx) ++ }}) ++ if err != nil { ++ return nil, err ++ } ++ ctx, cancel := context.WithTimeout(ctx, c.Timeout()) ++ defer cancel() ++ stop := context.AfterFunc(ctx, func() { conn.Close() }) ++ result, err := client.DialContextConn(ctx, conn) ++ if !stop() && err == nil { ++ err = ctx.Err() ++ } ++ return result, err ++} ++ ++type handshakeConn struct { ++ net.Conn ++ stop func() bool ++} ++ ++func (c *handshakeConn) Close() error { c.stop(); return c.Conn.Close() } ++func (c *Config) ServerConfig(sockopt *internet.SocketConfig) (*protocol.ServerConfig, error) { ++ if err := c.Validate(); err != nil { ++ return nil, err ++ } ++ dial := func(ctx context.Context, network, addr string) (net.Conn, error) { ++ dest, err := xnet.ParseDestination("tcp:" + addr) ++ if err != nil { ++ return nil, err ++ } ++ conn, err := internet.DialSystem(ctx, dest, sockopt) ++ if err != nil { ++ return nil, err ++ } ++ return &handshakeConn{Conn: conn, stop: context.AfterFunc(ctx, func() { conn.Close() })}, nil ++ } ++ handshake := protocol.HandshakeConfig{Server: c.Handshake, DialContext: dial} ++ custom := make(map[string]protocol.HandshakeConfig, len(c.HandshakeForServerName)) ++ for name, addr := range c.HandshakeForServerName { ++ custom[name] = protocol.HandshakeConfig{Server: addr, DialContext: dial} ++ } ++ users := make([]protocol.User, 0, len(c.Users)+1) ++ for _, u := range c.Users { ++ users = append(users, protocol.User{Name: u.Name, Password: u.Password}) ++ } ++ if len(users) == 0 && c.Password != "" { ++ users = append(users, protocol.User{Password: c.Password}) ++ } ++ wildcard := protocol.WildcardSNIOff ++ switch strings.ToLower(c.WildcardSni) { ++ case "authed": ++ wildcard = protocol.WildcardSNIAuthed ++ case "all": ++ wildcard = protocol.WildcardSNIAll ++ } ++ return protocol.NewServerConfig(int(c.Version), c.Password, users, handshake, custom, c.StrictMode, wildcard) ++} +--- a/transport/internet/shadowtls/config.pb.go ++++ b/transport/internet/shadowtls/config.pb.go +@@ -0,0 +1,295 @@ ++// Code generated by protoc-gen-go. DO NOT EDIT. ++// versions: ++// protoc-gen-go v1.36.12 ++// protoc v3.21.12 ++// source: transport/internet/shadowtls/config.proto ++ ++package shadowtls ++ ++import ( ++ protoreflect "google.golang.org/protobuf/reflect/protoreflect" ++ protoimpl "google.golang.org/protobuf/runtime/protoimpl" ++ reflect "reflect" ++ sync "sync" ++ unsafe "unsafe" ++) ++ ++const ( ++ // Verify that this generated code is sufficiently up-to-date. ++ _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) ++ // Verify that runtime/protoimpl is sufficiently up-to-date. ++ _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) ++) ++ ++type User struct { ++ state protoimpl.MessageState `protogen:"open.v1"` ++ Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` ++ Password string `protobuf:"bytes,2,opt,name=password,proto3" json:"password,omitempty"` ++ unknownFields protoimpl.UnknownFields ++ sizeCache protoimpl.SizeCache ++} ++ ++func (x *User) Reset() { ++ *x = User{} ++ mi := &file_transport_internet_shadowtls_config_proto_msgTypes[0] ++ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ++ ms.StoreMessageInfo(mi) ++} ++ ++func (x *User) String() string { ++ return protoimpl.X.MessageStringOf(x) ++} ++ ++func (*User) ProtoMessage() {} ++ ++func (x *User) ProtoReflect() protoreflect.Message { ++ mi := &file_transport_internet_shadowtls_config_proto_msgTypes[0] ++ if x != nil { ++ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ++ if ms.LoadMessageInfo() == nil { ++ ms.StoreMessageInfo(mi) ++ } ++ return ms ++ } ++ return mi.MessageOf(x) ++} ++ ++// Deprecated: Use User.ProtoReflect.Descriptor instead. ++func (*User) Descriptor() ([]byte, []int) { ++ return file_transport_internet_shadowtls_config_proto_rawDescGZIP(), []int{0} ++} ++ ++func (x *User) GetName() string { ++ if x != nil { ++ return x.Name ++ } ++ return "" ++} ++ ++func (x *User) GetPassword() string { ++ if x != nil { ++ return x.Password ++ } ++ return "" ++} ++ ++type Config struct { ++ state protoimpl.MessageState `protogen:"open.v1"` ++ Version uint32 `protobuf:"varint,1,opt,name=version,proto3" json:"version,omitempty"` ++ Password string `protobuf:"bytes,2,opt,name=password,proto3" json:"password,omitempty"` ++ ServerName string `protobuf:"bytes,3,opt,name=server_name,json=serverName,proto3" json:"server_name,omitempty"` ++ Fingerprint string `protobuf:"bytes,4,opt,name=fingerprint,proto3" json:"fingerprint,omitempty"` ++ AllowInsecure bool `protobuf:"varint,5,opt,name=allow_insecure,json=allowInsecure,proto3" json:"allow_insecure,omitempty"` ++ Alpn []string `protobuf:"bytes,6,rep,name=alpn,proto3" json:"alpn,omitempty"` ++ Certificates [][]byte `protobuf:"bytes,7,rep,name=certificates,proto3" json:"certificates,omitempty"` ++ StrictMode bool `protobuf:"varint,8,opt,name=strict_mode,json=strictMode,proto3" json:"strict_mode,omitempty"` ++ Handshake string `protobuf:"bytes,9,opt,name=handshake,proto3" json:"handshake,omitempty"` ++ Users []*User `protobuf:"bytes,10,rep,name=users,proto3" json:"users,omitempty"` ++ HandshakeForServerName map[string]string `protobuf:"bytes,11,rep,name=handshake_for_server_name,json=handshakeForServerName,proto3" json:"handshake_for_server_name,omitempty" protobuf_key:"bytes,1,opt,name=key" protobuf_val:"bytes,2,opt,name=value"` ++ WildcardSni string `protobuf:"bytes,12,opt,name=wildcard_sni,json=wildcardSni,proto3" json:"wildcard_sni,omitempty"` ++ HandshakeTimeout uint32 `protobuf:"varint,13,opt,name=handshake_timeout,json=handshakeTimeout,proto3" json:"handshake_timeout,omitempty"` ++ unknownFields protoimpl.UnknownFields ++ sizeCache protoimpl.SizeCache ++} ++ ++func (x *Config) Reset() { ++ *x = Config{} ++ mi := &file_transport_internet_shadowtls_config_proto_msgTypes[1] ++ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ++ ms.StoreMessageInfo(mi) ++} ++ ++func (x *Config) String() string { ++ return protoimpl.X.MessageStringOf(x) ++} ++ ++func (*Config) ProtoMessage() {} ++ ++func (x *Config) ProtoReflect() protoreflect.Message { ++ mi := &file_transport_internet_shadowtls_config_proto_msgTypes[1] ++ if x != nil { ++ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ++ if ms.LoadMessageInfo() == nil { ++ ms.StoreMessageInfo(mi) ++ } ++ return ms ++ } ++ return mi.MessageOf(x) ++} ++ ++// Deprecated: Use Config.ProtoReflect.Descriptor instead. ++func (*Config) Descriptor() ([]byte, []int) { ++ return file_transport_internet_shadowtls_config_proto_rawDescGZIP(), []int{1} ++} ++ ++func (x *Config) GetVersion() uint32 { ++ if x != nil { ++ return x.Version ++ } ++ return 0 ++} ++ ++func (x *Config) GetPassword() string { ++ if x != nil { ++ return x.Password ++ } ++ return "" ++} ++ ++func (x *Config) GetServerName() string { ++ if x != nil { ++ return x.ServerName ++ } ++ return "" ++} ++ ++func (x *Config) GetFingerprint() string { ++ if x != nil { ++ return x.Fingerprint ++ } ++ return "" ++} ++ ++func (x *Config) GetAllowInsecure() bool { ++ if x != nil { ++ return x.AllowInsecure ++ } ++ return false ++} ++ ++func (x *Config) GetAlpn() []string { ++ if x != nil { ++ return x.Alpn ++ } ++ return nil ++} ++ ++func (x *Config) GetCertificates() [][]byte { ++ if x != nil { ++ return x.Certificates ++ } ++ return nil ++} ++ ++func (x *Config) GetStrictMode() bool { ++ if x != nil { ++ return x.StrictMode ++ } ++ return false ++} ++ ++func (x *Config) GetHandshake() string { ++ if x != nil { ++ return x.Handshake ++ } ++ return "" ++} ++ ++func (x *Config) GetUsers() []*User { ++ if x != nil { ++ return x.Users ++ } ++ return nil ++} ++ ++func (x *Config) GetHandshakeForServerName() map[string]string { ++ if x != nil { ++ return x.HandshakeForServerName ++ } ++ return nil ++} ++ ++func (x *Config) GetWildcardSni() string { ++ if x != nil { ++ return x.WildcardSni ++ } ++ return "" ++} ++ ++func (x *Config) GetHandshakeTimeout() uint32 { ++ if x != nil { ++ return x.HandshakeTimeout ++ } ++ return 0 ++} ++ ++var File_transport_internet_shadowtls_config_proto protoreflect.FileDescriptor ++ ++const file_transport_internet_shadowtls_config_proto_rawDesc = "" + ++ "\n" + ++ ")transport/internet/shadowtls/config.proto\x12!xray.transport.internet.shadowtls\"6\n" + ++ "\x04User\x12\x12\n" + ++ "\x04name\x18\x01 \x01(\tR\x04name\x12\x1a\n" + ++ "\bpassword\x18\x02 \x01(\tR\bpassword\"\xfc\x04\n" + ++ "\x06Config\x12\x18\n" + ++ "\aversion\x18\x01 \x01(\rR\aversion\x12\x1a\n" + ++ "\bpassword\x18\x02 \x01(\tR\bpassword\x12\x1f\n" + ++ "\vserver_name\x18\x03 \x01(\tR\n" + ++ "serverName\x12 \n" + ++ "\vfingerprint\x18\x04 \x01(\tR\vfingerprint\x12%\n" + ++ "\x0eallow_insecure\x18\x05 \x01(\bR\rallowInsecure\x12\x12\n" + ++ "\x04alpn\x18\x06 \x03(\tR\x04alpn\x12\"\n" + ++ "\fcertificates\x18\a \x03(\fR\fcertificates\x12\x1f\n" + ++ "\vstrict_mode\x18\b \x01(\bR\n" + ++ "strictMode\x12\x1c\n" + ++ "\thandshake\x18\t \x01(\tR\thandshake\x12=\n" + ++ "\x05users\x18\n" + ++ " \x03(\v2'.xray.transport.internet.shadowtls.UserR\x05users\x12\x80\x01\n" + ++ "\x19handshake_for_server_name\x18\v \x03(\v2E.xray.transport.internet.shadowtls.Config.HandshakeForServerNameEntryR\x16handshakeForServerName\x12!\n" + ++ "\fwildcard_sni\x18\f \x01(\tR\vwildcardSni\x12+\n" + ++ "\x11handshake_timeout\x18\r \x01(\rR\x10handshakeTimeout\x1aI\n" + ++ "\x1bHandshakeForServerNameEntry\x12\x10\n" + ++ "\x03key\x18\x01 \x01(\tR\x03key\x12\x14\n" + ++ "\x05value\x18\x02 \x01(\tR\x05value:\x028\x01B8Z6github.com/xtls/xray-core/transport/internet/shadowtlsb\x06proto3" ++ ++var ( ++ file_transport_internet_shadowtls_config_proto_rawDescOnce sync.Once ++ file_transport_internet_shadowtls_config_proto_rawDescData []byte ++) ++ ++func file_transport_internet_shadowtls_config_proto_rawDescGZIP() []byte { ++ file_transport_internet_shadowtls_config_proto_rawDescOnce.Do(func() { ++ file_transport_internet_shadowtls_config_proto_rawDescData = protoimpl.X.CompressGZIP(unsafe.Slice(unsafe.StringData(file_transport_internet_shadowtls_config_proto_rawDesc), len(file_transport_internet_shadowtls_config_proto_rawDesc))) ++ }) ++ return file_transport_internet_shadowtls_config_proto_rawDescData ++} ++ ++var file_transport_internet_shadowtls_config_proto_msgTypes = make([]protoimpl.MessageInfo, 3) ++var file_transport_internet_shadowtls_config_proto_goTypes = []any{ ++ (*User)(nil), // 0: xray.transport.internet.shadowtls.User ++ (*Config)(nil), // 1: xray.transport.internet.shadowtls.Config ++ nil, // 2: xray.transport.internet.shadowtls.Config.HandshakeForServerNameEntry ++} ++var file_transport_internet_shadowtls_config_proto_depIdxs = []int32{ ++ 0, // 0: xray.transport.internet.shadowtls.Config.users:type_name -> xray.transport.internet.shadowtls.User ++ 2, // 1: xray.transport.internet.shadowtls.Config.handshake_for_server_name:type_name -> xray.transport.internet.shadowtls.Config.HandshakeForServerNameEntry ++ 2, // [2:2] is the sub-list for method output_type ++ 2, // [2:2] is the sub-list for method input_type ++ 2, // [2:2] is the sub-list for extension type_name ++ 2, // [2:2] is the sub-list for extension extendee ++ 0, // [0:2] is the sub-list for field type_name ++} ++ ++func init() { file_transport_internet_shadowtls_config_proto_init() } ++func file_transport_internet_shadowtls_config_proto_init() { ++ if File_transport_internet_shadowtls_config_proto != nil { ++ return ++ } ++ type x struct{} ++ out := protoimpl.TypeBuilder{ ++ File: protoimpl.DescBuilder{ ++ GoPackagePath: reflect.TypeOf(x{}).PkgPath(), ++ RawDescriptor: unsafe.Slice(unsafe.StringData(file_transport_internet_shadowtls_config_proto_rawDesc), len(file_transport_internet_shadowtls_config_proto_rawDesc)), ++ NumEnums: 0, ++ NumMessages: 3, ++ NumExtensions: 0, ++ NumServices: 0, ++ }, ++ GoTypes: file_transport_internet_shadowtls_config_proto_goTypes, ++ DependencyIndexes: file_transport_internet_shadowtls_config_proto_depIdxs, ++ MessageInfos: file_transport_internet_shadowtls_config_proto_msgTypes, ++ }.Build() ++ File_transport_internet_shadowtls_config_proto = out.File ++ file_transport_internet_shadowtls_config_proto_goTypes = nil ++ file_transport_internet_shadowtls_config_proto_depIdxs = nil ++} +--- a/transport/internet/shadowtls/config.proto ++++ b/transport/internet/shadowtls/config.proto +@@ -0,0 +1,19 @@ ++syntax = "proto3"; ++package xray.transport.internet.shadowtls; ++option go_package = "github.com/xtls/xray-core/transport/internet/shadowtls"; ++message User { string name = 1; string password = 2; } ++message Config { ++ uint32 version = 1; ++ string password = 2; ++ string server_name = 3; ++ string fingerprint = 4; ++ bool allow_insecure = 5; ++ repeated string alpn = 6; ++ repeated bytes certificates = 7; ++ bool strict_mode = 8; ++ string handshake = 9; ++ repeated User users = 10; ++ map handshake_for_server_name = 11; ++ string wildcard_sni = 12; ++ uint32 handshake_timeout = 13; ++} +--- a/transport/internet/shadowtls/protocol/client.go ++++ b/transport/internet/shadowtls/protocol/client.go +@@ -0,0 +1,103 @@ ++// Adapted from MetaCubeX/mihomo v1.19.32; GPL-3.0-or-later. ++package shadowtls ++ ++import ( ++ "context" ++ "crypto/hmac" ++ "crypto/sha1" ++ "errors" ++ "fmt" ++ "net" ++) ++ ++const Mode = "shadow-tls" ++ ++var ( ++ DefaultALPN = []string{"h2", "http/1.1"} ++ WsALPN = []string{"http/1.1"} ++) ++ ++type TLSSessionIDGeneratorFunc func(clientHello []byte, sessionID []byte) error ++ ++type TLSHandshakeFunc func( ++ ctx context.Context, ++ conn net.Conn, ++ sessionIDGenerator TLSSessionIDGeneratorFunc, // for shadow-tls version 3 ++) error ++ ++type ClientConfig struct { ++ Version int ++ Password string ++ StrictMode bool ++ TLSHandshake TLSHandshakeFunc ++} ++ ++type Client struct { ++ version int ++ password string ++ strictMode bool ++ tlsHandshake TLSHandshakeFunc ++} ++ ++func NewClient(config ClientConfig) (*Client, error) { ++ if err := checkVersion(config.Version); err != nil { ++ return nil, err ++ } ++ return &Client{ ++ version: config.Version, ++ password: config.Password, ++ strictMode: config.StrictMode, ++ tlsHandshake: config.TLSHandshake, ++ }, nil ++} ++ ++func (c *Client) SetHandshakeFunc(handshakeFunc TLSHandshakeFunc) { ++ c.tlsHandshake = handshakeFunc ++} ++ ++func (c *Client) DialContextConn(ctx context.Context, conn net.Conn) (net.Conn, error) { ++ if conn == nil || c.tlsHandshake == nil { ++ return nil, errors.New("shadow-tls: connection and TLS handshake are required") ++ } ++ switch c.version { ++ case 1: ++ if err := c.tlsHandshake(ctx, conn, nil); err != nil { ++ return nil, err ++ } ++ return conn, nil ++ case 2: ++ hashConn := newHashReadConn(conn, c.password) ++ if err := c.tlsHandshake(ctx, hashConn, nil); err != nil { ++ return nil, err ++ } ++ return newClientConn(hashConn), nil ++ case 3: ++ stream := newStreamWrapper(conn, c.password) ++ if err := c.tlsHandshake(ctx, stream, generateSessionID(c.password)); err != nil { ++ return nil, err ++ } ++ isTLS13, authorized, serverRandom, readHMAC := stream.Authorized() ++ if c.strictMode && !isTLS13 { ++ return nil, errors.New("shadow-tls: TLS 1.3 is not supported") ++ } ++ if !authorized { ++ return nil, errors.New("shadow-tls: traffic hijacked") ++ } ++ hmacAdd := hmac.New(sha1.New, []byte(c.password)) ++ _, _ = hmacAdd.Write(serverRandom) ++ _, _ = hmacAdd.Write([]byte("C")) ++ hmacVerify := hmac.New(sha1.New, []byte(c.password)) ++ _, _ = hmacVerify.Write(serverRandom) ++ _, _ = hmacVerify.Write([]byte("S")) ++ return newVerifiedConn(conn, hmacAdd, hmacVerify, readHMAC), nil ++ default: ++ panic("unreachable") ++ } ++} ++ ++func checkVersion(version int) error { ++ if version < 1 || version > 3 { ++ return fmt.Errorf("shadow-tls: unknown protocol version: %d", version) ++ } ++ return nil ++} +--- a/transport/internet/shadowtls/protocol/net.go ++++ b/transport/internet/shadowtls/protocol/net.go +@@ -0,0 +1,34 @@ ++package shadowtls ++ ++import ( ++ "bytes" ++ "context" ++ "io" ++ "net" ++) ++ ++type cachedConn struct { ++ net.Conn ++ prefix *bytes.Reader ++} ++ ++func newCachedConn(conn net.Conn, prefix []byte) net.Conn { ++ return &cachedConn{Conn: conn, prefix: bytes.NewReader(prefix)} ++} ++func (c *cachedConn) Read(b []byte) (int, error) { ++ if c.prefix.Len() > 0 { ++ return c.prefix.Read(b) ++ } ++ return c.Conn.Read(b) ++} ++func relayContext(ctx context.Context, a, b net.Conn) error { ++ stop := context.AfterFunc(ctx, func() { a.Close(); b.Close() }) ++ defer stop() ++ done := make(chan error, 1) ++ go func() { _, err := io.Copy(a, b); closeWrite(a); done <- err }() ++ _, err := io.Copy(b, a) ++ closeWrite(b) ++ return joinCopyErrors(err, <-done) ++} ++ ++func (c *cachedConn) Upstream() any { return c.Conn } +--- a/transport/internet/shadowtls/protocol/protocol.go ++++ b/transport/internet/shadowtls/protocol/protocol.go +@@ -0,0 +1,194 @@ ++// Adapted from MetaCubeX/mihomo v1.19.32; GPL-3.0-or-later. ++package shadowtls ++ ++import ( ++ "encoding/binary" ++ "errors" ++ "fmt" ++ "io" ++ "net" ++) ++ ++const ( ++ tlsRandomSize = 32 ++ tlsHeaderSize = 5 ++ tlsSessionIDSize = 32 ++ ++ clientHello = 1 ++ serverHello = 2 ++ ++ changeCipherSpec = 20 ++ alert = 21 ++ handshake = 22 ++ applicationData = 23 ++ ++ serverRandomIndex = tlsHeaderSize + 1 + 3 + 2 ++ sessionIDLengthIndex = tlsHeaderSize + 1 + 3 + 2 + tlsRandomSize ++ tlsHMACHeaderSize = tlsHeaderSize + hmacSize ++ hmacSize = 4 ++ maxTLSPlaintext = 16384 ++) ++ ++func readFrame(reader io.Reader) ([]byte, error) { ++ var header [tlsHeaderSize]byte ++ if _, err := io.ReadFull(reader, header[:]); err != nil { ++ return nil, err ++ } ++ length := int(binary.BigEndian.Uint16(header[3:])) ++ frame := make([]byte, tlsHeaderSize+length) ++ copy(frame, header[:]) ++ if _, err := io.ReadFull(reader, frame[tlsHeaderSize:]); err != nil { ++ return nil, err ++ } ++ return frame, nil ++} ++ ++func copyUntilHandshakeFinished(dst io.Writer, src io.Reader) error { ++ seenChangeCipherSpec := false ++ for { ++ frame, err := readFrame(src) ++ if err != nil { ++ return err ++ } ++ if _, err = dst.Write(frame); err != nil { ++ return err ++ } ++ if frame[0] != handshake { ++ if frame[0] != changeCipherSpec { ++ return fmt.Errorf("shadow-tls: unexpected TLS record type: %d", frame[0]) ++ } ++ if !seenChangeCipherSpec { ++ seenChangeCipherSpec = true ++ continue ++ } ++ } ++ if seenChangeCipherSpec { ++ return nil ++ } ++ } ++} ++ ++func extractServerName(frame []byte) (string, error) { ++ if len(frame) < tlsHeaderSize+4 || frame[0] != handshake || frame[tlsHeaderSize] != clientHello { ++ return "", errors.New("shadow-tls: invalid ClientHello") ++ } ++ helloLength := int(frame[tlsHeaderSize+1])<<16 | int(frame[tlsHeaderSize+2])<<8 | int(frame[tlsHeaderSize+3]) ++ hello := frame[tlsHeaderSize+4:] ++ if helloLength > len(hello) { ++ return "", io.ErrUnexpectedEOF ++ } ++ hello = hello[:helloLength] ++ if len(hello) < 2+tlsRandomSize+1 { ++ return "", io.ErrUnexpectedEOF ++ } ++ offset := 2 + tlsRandomSize ++ sessionIDLength := int(hello[offset]) ++ offset++ ++ if offset+sessionIDLength+2 > len(hello) { ++ return "", io.ErrUnexpectedEOF ++ } ++ offset += sessionIDLength ++ cipherSuitesLength := int(binary.BigEndian.Uint16(hello[offset:])) ++ offset += 2 ++ if offset+cipherSuitesLength+1 > len(hello) { ++ return "", io.ErrUnexpectedEOF ++ } ++ offset += cipherSuitesLength ++ compressionMethodsLength := int(hello[offset]) ++ offset++ ++ if offset+compressionMethodsLength == len(hello) { ++ return "", errors.New("shadow-tls: ClientHello has no SNI") ++ } ++ if offset+compressionMethodsLength+2 > len(hello) { ++ return "", io.ErrUnexpectedEOF ++ } ++ offset += compressionMethodsLength ++ extensionsLength := int(binary.BigEndian.Uint16(hello[offset:])) ++ offset += 2 ++ if offset+extensionsLength > len(hello) { ++ return "", io.ErrUnexpectedEOF ++ } ++ extensions := hello[offset : offset+extensionsLength] ++ for len(extensions) >= 4 { ++ extensionType := binary.BigEndian.Uint16(extensions) ++ extensionLength := int(binary.BigEndian.Uint16(extensions[2:])) ++ extensions = extensions[4:] ++ if extensionLength > len(extensions) { ++ return "", io.ErrUnexpectedEOF ++ } ++ if extensionType == 0 { ++ return parseServerNameExtension(extensions[:extensionLength]) ++ } ++ extensions = extensions[extensionLength:] ++ } ++ return "", errors.New("shadow-tls: ClientHello has no SNI") ++} ++ ++func parseServerNameExtension(extension []byte) (string, error) { ++ if len(extension) < 2 { ++ return "", io.ErrUnexpectedEOF ++ } ++ listLength := int(binary.BigEndian.Uint16(extension)) ++ if listLength > len(extension)-2 { ++ return "", io.ErrUnexpectedEOF ++ } ++ list := extension[2 : 2+listLength] ++ for len(list) >= 3 { ++ nameType := list[0] ++ nameLength := int(binary.BigEndian.Uint16(list[1:])) ++ list = list[3:] ++ if nameLength > len(list) { ++ return "", io.ErrUnexpectedEOF ++ } ++ if nameType == 0 && nameLength > 0 { ++ return string(list[:nameLength]), nil ++ } ++ list = list[nameLength:] ++ } ++ return "", errors.New("shadow-tls: ClientHello has no host name") ++} ++ ++func extractServerRandom(frame []byte) []byte { ++ if len(frame) < serverRandomIndex+tlsRandomSize || frame[0] != handshake || frame[tlsHeaderSize] != serverHello { ++ return nil ++ } ++ return append([]byte(nil), frame[serverRandomIndex:serverRandomIndex+tlsRandomSize]...) ++} ++ ++func isServerHelloSupportTLS13(frame []byte) bool { ++ if len(frame) <= sessionIDLengthIndex || frame[0] != handshake || frame[tlsHeaderSize] != serverHello { ++ return false ++ } ++ offset := sessionIDLengthIndex ++ sessionIDLength := int(frame[offset]) ++ offset++ ++ if offset+sessionIDLength+3+2 > len(frame) { ++ return false ++ } ++ offset += sessionIDLength + 3 ++ extensionsLength := int(binary.BigEndian.Uint16(frame[offset:])) ++ offset += 2 ++ if offset+extensionsLength > len(frame) { ++ return false ++ } ++ extensions := frame[offset : offset+extensionsLength] ++ for len(extensions) >= 4 { ++ extensionType := binary.BigEndian.Uint16(extensions) ++ extensionLength := int(binary.BigEndian.Uint16(extensions[2:])) ++ extensions = extensions[4:] ++ if extensionLength > len(extensions) { ++ return false ++ } ++ if extensionType == 43 { ++ return extensionLength == 2 && binary.BigEndian.Uint16(extensions[:2]) == 0x0304 ++ } ++ extensions = extensions[extensionLength:] ++ } ++ return false ++} ++ ++func writeBuffers(writer io.Writer, buffers ...[]byte) error { ++ netBuffers := net.Buffers(buffers) ++ _, err := netBuffers.WriteTo(writer) ++ return err ++} +--- a/transport/internet/shadowtls/protocol/server.go ++++ b/transport/internet/shadowtls/protocol/server.go +@@ -0,0 +1,397 @@ ++// Adapted from MetaCubeX/mihomo v1.19.32; GPL-3.0-or-later. ++package shadowtls ++ ++import ( ++ "context" ++ "crypto/hmac" ++ "crypto/sha1" ++ "errors" ++ "fmt" ++ "hash" ++ "io" ++ "net" ++ "os" ++ "strings" ++ "time" ++) ++ ++var ErrFallbackCompleted = errors.New("shadow-tls: connection relayed to fallback") ++ ++type WildcardSNI int ++ ++const ( ++ WildcardSNIOff WildcardSNI = iota ++ WildcardSNIAuthed ++ WildcardSNIAll ++) ++ ++type User struct { ++ Name string ++ Password string ++} ++ ++type HandshakeConfig struct { ++ Server string ++ DialContext func(ctx context.Context, network, address string) (net.Conn, error) ++} ++ ++type ServerConfig struct { ++ version int ++ password string // for protocol version 2 ++ users []User // for protocol version 3 ++ handshake HandshakeConfig ++ handshakeForServerName map[string]HandshakeConfig // for protocol version 2/3 ++ strictMode bool // for protocol version 3 ++ wildcardSNI WildcardSNI // for protocol version 3 ++} ++ ++func NewServerConfig( ++ version int, ++ password string, ++ users []User, ++ handshake HandshakeConfig, ++ handshakeForServerName map[string]HandshakeConfig, ++ strictMode bool, ++ wildcardSNI WildcardSNI, ++) (*ServerConfig, error) { ++ if err := checkVersion(version); err != nil { ++ return nil, err ++ } ++ if version == 3 && len(users) == 0 { ++ return nil, errors.New("shadow-tls: at least one user is required") ++ } ++ if wildcardSNI < WildcardSNIOff || wildcardSNI > WildcardSNIAll { ++ return nil, errors.New("shadow-tls: invalid wildcard SNI mode") ++ } ++ if !handshake.valid() && wildcardSNI == WildcardSNIOff { ++ return nil, errors.New("shadow-tls: missing default handshake information") ++ } ++ if version < 3 && !handshake.valid() { ++ return nil, errors.New("shadow-tls: missing default handshake information") ++ } ++ for serverName, handshakeConfig := range handshakeForServerName { ++ if serverName == "" || !handshakeConfig.valid() { ++ return nil, fmt.Errorf("shadow-tls: invalid handshake for server name %q", serverName) ++ } ++ } ++ return &ServerConfig{ ++ version: version, ++ password: password, ++ users: append([]User(nil), users...), ++ handshake: handshake, ++ handshakeForServerName: cloneHandshakeMap(handshakeForServerName), ++ strictMode: strictMode, ++ wildcardSNI: wildcardSNI, ++ }, nil ++} ++ ++func Server(ctx context.Context, conn net.Conn, config *ServerConfig) (net.Conn, error) { ++ if conn == nil || config == nil { ++ return nil, errors.New("shadow-tls: nil connection or server config") ++ } ++ var ( ++ serverConn net.Conn ++ user string ++ err error ++ ) ++ switch config.version { ++ case 1: ++ serverConn, user, err = config.serverV1(ctx, conn) ++ case 2: ++ serverConn, user, err = config.serverV2(ctx, conn) ++ case 3: ++ serverConn, user, err = config.serverV3(ctx, conn) ++ default: ++ panic("unreachable") ++ } ++ if err != nil || user == "" { ++ return serverConn, err ++ } ++ return &authenticatedConn{Conn: serverConn, user: user}, nil ++} ++ ++func (s *ServerConfig) serverV1(ctx context.Context, conn net.Conn) (net.Conn, string, error) { ++ handshakeConn, err := s.handshake.dial(ctx) ++ if err != nil { ++ return nil, "", fmt.Errorf("shadow-tls: dial handshake server: %w", err) ++ } ++ defer handshakeConn.Close() ++ if err = relayHandshake(conn, handshakeConn); err != nil { ++ return nil, "", fmt.Errorf("shadow-tls: relay handshake: %w", err) ++ } ++ return conn, "", nil ++} ++ ++func (s *ServerConfig) serverV2(ctx context.Context, conn net.Conn) (net.Conn, string, error) { ++ clientHello, err := readFrame(conn) ++ if err != nil { ++ return nil, "", fmt.Errorf("shadow-tls: read client handshake: %w", err) ++ } ++ handshakeConfig := s.selectHandshake(clientHello) ++ handshakeConn, err := handshakeConfig.dial(ctx) ++ if err != nil { ++ return nil, "", fmt.Errorf("shadow-tls: dial handshake server: %w", err) ++ } ++ hashConn := newHashWriteConn(conn, s.password) ++ serverCopyDone := make(chan error, 1) ++ go func() { ++ _, copyErr := io.Copy(hashConn, handshakeConn) ++ serverCopyDone <- copyErr ++ }() ++ ++ request, err := copyUntilHandshakeFinishedV2( ++ handshakeConn, ++ newCachedConn(conn, clientHello), ++ hashConn, ++ 2, ++ ) ++ if err == nil { ++ _ = handshakeConn.Close() ++ <-serverCopyDone ++ return newCachedConn(newConn(conn), request), "", nil ++ } ++ if errors.Is(err, os.ErrPermission) { ++ hashConn.Fallback() ++ clientCopyDone := make(chan error, 1) ++ go func() { ++ _, copyErr := io.Copy(handshakeConn, conn) ++ clientCopyDone <- copyErr ++ }() ++ var clientCopyErr, serverCopyErr error ++ select { ++ case clientCopyErr = <-clientCopyDone: ++ finishCopyDirection(handshakeConn, conn, clientCopyErr) ++ serverCopyErr = <-serverCopyDone ++ case serverCopyErr = <-serverCopyDone: ++ finishCopyDirection(conn, handshakeConn, serverCopyErr) ++ clientCopyErr = <-clientCopyDone ++ } ++ _ = handshakeConn.Close() ++ if relayErr := joinCopyErrors(clientCopyErr, serverCopyErr); relayErr != nil { ++ return nil, "", relayErr ++ } ++ return nil, "", ErrFallbackCompleted ++ } ++ _ = handshakeConn.Close() ++ <-serverCopyDone ++ return nil, "", err ++} ++ ++func (s *ServerConfig) serverV3(ctx context.Context, conn net.Conn) (net.Conn, string, error) { ++ clientHello, err := readFrame(conn) ++ if err != nil { ++ return nil, "", fmt.Errorf("shadow-tls: read client handshake: %w", err) ++ } ++ serverName, err := extractServerName(clientHello) ++ if err != nil { ++ return nil, "", fmt.Errorf("shadow-tls: extract server name: %w", err) ++ } ++ user, authErr := verifyClientHello(clientHello, s.users) ++ handshakeConfig := s.selectV3Handshake(serverName, authErr == nil) ++ if authErr != nil { ++ return nil, "", s.relayFallback(ctx, conn, clientHello, handshakeConfig) ++ } ++ ++ handshakeConn, err := handshakeConfig.dial(ctx) ++ if err != nil { ++ return nil, "", fmt.Errorf("shadow-tls: dial handshake server: %w", err) ++ } ++ defer handshakeConn.Close() ++ if _, err = handshakeConn.Write(clientHello); err != nil { ++ return nil, "", fmt.Errorf("shadow-tls: write client handshake: %w", err) ++ } ++ serverHello, err := readFrame(handshakeConn) ++ if err != nil { ++ return nil, "", fmt.Errorf("shadow-tls: read server handshake: %w", err) ++ } ++ if _, err = conn.Write(serverHello); err != nil { ++ return nil, "", fmt.Errorf("shadow-tls: write server handshake: %w", err) ++ } ++ serverRandom := extractServerRandom(serverHello) ++ if serverRandom == nil { ++ if err = relayContext(ctx, conn, handshakeConn); err != nil { ++ return nil, "", err ++ } ++ return nil, "", ErrFallbackCompleted ++ } ++ if s.strictMode && !isServerHelloSupportTLS13(serverHello) { ++ if err = relayContext(ctx, conn, handshakeConn); err != nil { ++ return nil, "", err ++ } ++ return nil, "", ErrFallbackCompleted ++ } ++ ++ hmacWrite := hmac.New(sha1.New, []byte(user.Password)) ++ _, _ = hmacWrite.Write(serverRandom) ++ hmacAdd := hmac.New(sha1.New, []byte(user.Password)) ++ _, _ = hmacAdd.Write(serverRandom) ++ _, _ = hmacAdd.Write([]byte("S")) ++ hmacVerify := hmac.New(sha1.New, []byte(user.Password)) ++ resetVerify := func() { hmacReset(hmacVerify, serverRandom, 'C') } ++ request, err := relayV3Handshake(conn, handshakeConn, user.Password, serverRandom, hmacWrite, hmacVerify, resetVerify) ++ if err != nil { ++ return nil, "", fmt.Errorf("shadow-tls: relay handshake: %w", err) ++ } ++ return newCachedConn(newVerifiedConn(conn, hmacAdd, hmacVerify, nil), request), user.Name, nil ++} ++ ++func (s *ServerConfig) relayFallback(ctx context.Context, conn net.Conn, prefix []byte, handshakeConfig HandshakeConfig) error { ++ handshakeConn, err := handshakeConfig.dial(ctx) ++ if err != nil { ++ return fmt.Errorf("shadow-tls: dial fallback server: %w", err) ++ } ++ defer handshakeConn.Close() ++ if err = relayContext(ctx, newCachedConn(conn, prefix), handshakeConn); err != nil { ++ return err ++ } ++ return ErrFallbackCompleted ++} ++ ++func (s *ServerConfig) selectHandshake(clientHello []byte) HandshakeConfig { ++ serverName, err := extractServerName(clientHello) ++ if err == nil { ++ if custom, found := s.handshakeForServerName[serverName]; found { ++ return custom ++ } ++ } ++ return s.handshake ++} ++ ++func (s *ServerConfig) selectV3Handshake(serverName string, authenticated bool) HandshakeConfig { ++ if custom, found := s.handshakeForServerName[serverName]; found { ++ return custom ++ } ++ handshakeConfig := s.handshake ++ if s.wildcardSNI == WildcardSNIAll || (authenticated && s.wildcardSNI == WildcardSNIAuthed) { ++ handshakeConfig.Server = net.JoinHostPort(serverName, "443") ++ } ++ return handshakeConfig ++} ++ ++type authenticatedConn struct { ++ net.Conn ++ user string ++} ++ ++func (c *authenticatedConn) Upstream() any { return c.Conn } ++ ++func (c HandshakeConfig) valid() bool { ++ return c.Server != "" && c.DialContext != nil ++} ++ ++func (c HandshakeConfig) dial(ctx context.Context) (net.Conn, error) { ++ if !c.valid() { ++ return nil, errors.New("shadow-tls: missing handshake information") ++ } ++ return c.DialContext(ctx, "tcp", c.Server) ++} ++ ++func cloneHandshakeMap(source map[string]HandshakeConfig) map[string]HandshakeConfig { ++ if source == nil { ++ return nil ++ } ++ cloned := make(map[string]HandshakeConfig, len(source)) ++ for key, value := range source { ++ cloned[key] = value ++ } ++ return cloned ++} ++ ++func relayHandshake(clientConn, serverConn net.Conn) error { ++ type result struct { ++ err error ++ } ++ results := make(chan result, 2) ++ go func() { ++ results <- result{err: copyUntilHandshakeFinished(serverConn, clientConn)} ++ }() ++ go func() { ++ results <- result{err: copyUntilHandshakeFinished(clientConn, serverConn)} ++ }() ++ first := <-results ++ if first.err != nil { ++ _ = clientConn.SetDeadline(time.Now()) ++ _ = serverConn.Close() ++ } ++ second := <-results ++ if first.err != nil { ++ return first.err ++ } ++ return second.err ++} ++ ++func relayV3Handshake(clientConn, serverConn net.Conn, password string, serverRandom []byte, hmacWrite, hmacVerify hash.Hash, resetVerify func()) ([]byte, error) { ++ type result struct { ++ request []byte ++ client bool ++ err error ++ } ++ results := make(chan result, 2) ++ go func() { ++ request, err := copyByFrameUntilHMACMatches(clientConn, serverConn, hmacVerify, resetVerify) ++ results <- result{request: request, client: true, err: err} ++ }() ++ go func() { ++ err := copyByFrameWithModification(serverConn, clientConn, password, serverRandom, hmacWrite) ++ results <- result{err: err} ++ }() ++ first := <-results ++ if first.client && first.err == nil { ++ _ = serverConn.Close() ++ <-results ++ return first.request, nil ++ } ++ _ = serverConn.Close() ++ _ = clientConn.SetDeadline(time.Now()) ++ second := <-results ++ if first.err != nil { ++ return nil, first.err ++ } ++ return nil, second.err ++} ++ ++func finishCopyDirection(dst, src net.Conn, err error) { ++ if err == nil { ++ closeWrite(dst) ++ return ++ } ++ _ = dst.Close() ++ _ = src.Close() ++} ++ ++func closeWrite(conn net.Conn) { ++ if closer, ok := conn.(interface{ CloseWrite() error }); ok { ++ _ = closer.CloseWrite() ++ return ++ } ++ _ = conn.Close() ++} ++ ++func joinCopyErrors(copyErrors ...error) error { ++ var result error ++ for _, err := range copyErrors { ++ if err == nil || errors.Is(err, io.EOF) || errors.Is(err, net.ErrClosed) || errors.Is(err, os.ErrDeadlineExceeded) { ++ continue ++ } ++ if strings.Contains(err.Error(), "use of closed network connection") { ++ continue ++ } ++ result = errors.Join(result, err) ++ } ++ return result ++} ++ ++// UserFromConn returns the authenticated ShadowTLS v3 user through wrappers. ++func UserFromConn(conn net.Conn) (string, bool) { ++ for conn != nil { ++ if authenticated, ok := conn.(*authenticatedConn); ok { ++ return authenticated.user, true ++ } ++ wrapper, ok := conn.(interface{ Upstream() any }) ++ if !ok { ++ break ++ } ++ conn, _ = wrapper.Upstream().(net.Conn) ++ } ++ return "", false ++} +--- a/transport/internet/shadowtls/protocol/v2.go ++++ b/transport/internet/shadowtls/protocol/v2.go +@@ -0,0 +1,208 @@ ++// Adapted from MetaCubeX/mihomo v1.19.32; GPL-3.0-or-later. ++package shadowtls ++ ++import ( ++ "bytes" ++ "crypto/hmac" ++ "crypto/sha1" ++ "encoding/binary" ++ "fmt" ++ "hash" ++ "io" ++ "net" ++ "os" ++ "sync" ++) ++ ++type hashReadConn struct { ++ net.Conn ++ hmac hash.Hash ++} ++ ++func newHashReadConn(conn net.Conn, password string) *hashReadConn { ++ return &hashReadConn{Conn: conn, hmac: hmac.New(sha1.New, []byte(password))} ++} ++ ++func (c *hashReadConn) Read(p []byte) (int, error) { ++ n, err := c.Conn.Read(p) ++ if n > 0 { ++ _, _ = c.hmac.Write(p[:n]) ++ } ++ return n, err ++} ++ ++func (c *hashReadConn) Sum() []byte { ++ return append([]byte(nil), c.hmac.Sum(nil)[:8]...) ++} ++ ++type hashWriteConn struct { ++ net.Conn ++ mu sync.Mutex ++ hmac hash.Hash ++ hasContent bool ++ lastSum []byte ++} ++ ++func newHashWriteConn(conn net.Conn, password string) *hashWriteConn { ++ return &hashWriteConn{Conn: conn, hmac: hmac.New(sha1.New, []byte(password))} ++} ++ ++func (c *hashWriteConn) Write(p []byte) (int, error) { ++ c.mu.Lock() ++ defer c.mu.Unlock() ++ n, err := c.Conn.Write(p) ++ if c.hmac != nil && n > 0 { ++ if c.hasContent { ++ c.lastSum = append(c.lastSum[:0], c.hmac.Sum(nil)[:8]...) ++ } ++ _, _ = c.hmac.Write(p[:n]) ++ c.hasContent = true ++ } ++ return n, err ++} ++ ++func (c *hashWriteConn) sums() (current, previous []byte, hasContent bool) { ++ c.mu.Lock() ++ defer c.mu.Unlock() ++ if c.hmac != nil { ++ current = append([]byte(nil), c.hmac.Sum(nil)[:8]...) ++ } ++ previous = append([]byte(nil), c.lastSum...) ++ return current, previous, c.hasContent ++} ++ ++func (c *hashWriteConn) Fallback() { ++ c.mu.Lock() ++ c.hmac = nil ++ c.mu.Unlock() ++} ++ ++type shadowConn struct { ++ net.Conn ++ readRemaining int ++ readHeader [tlsHeaderSize]byte ++ readHeaderOffset int ++ writeMu sync.Mutex ++} ++ ++func newConn(conn net.Conn) *shadowConn { ++ return &shadowConn{Conn: conn} ++} ++ ++func (c *shadowConn) Read(p []byte) (int, error) { ++ if c.readRemaining > 0 { ++ if len(p) > c.readRemaining { ++ p = p[:c.readRemaining] ++ } ++ n, err := c.Conn.Read(p) ++ c.readRemaining -= n ++ return n, err ++ } ++ // Keep an incomplete header so a read deadline only interrupts the current Read. ++ n, err := io.ReadFull(c.Conn, c.readHeader[c.readHeaderOffset:]) ++ c.readHeaderOffset += n ++ if err != nil { ++ return 0, err ++ } ++ c.readHeaderOffset = 0 ++ if c.readHeader[0] != applicationData { ++ return 0, fmt.Errorf("shadow-tls: unexpected TLS record type: %d", c.readHeader[0]) ++ } ++ length := int(binary.BigEndian.Uint16(c.readHeader[3:])) ++ readLength := len(p) ++ if readLength > length { ++ readLength = length ++ } ++ n, err = c.Conn.Read(p[:readLength]) ++ c.readRemaining = length - n ++ return n, err ++} ++ ++func (c *shadowConn) Write(p []byte) (int, error) { ++ c.writeMu.Lock() ++ defer c.writeMu.Unlock() ++ total := len(p) ++ if total == 0 { ++ if err := c.writeRecord(nil); err != nil { ++ return 0, err ++ } ++ return 0, nil ++ } ++ for len(p) > 0 { ++ length := len(p) ++ if length > maxTLSPlaintext { ++ length = maxTLSPlaintext ++ } ++ if err := c.writeRecord(p[:length]); err != nil { ++ return total - len(p), err ++ } ++ p = p[length:] ++ } ++ return total, nil ++} ++ ++func (c *shadowConn) writeRecord(p []byte) error { ++ var header [tlsHeaderSize]byte ++ header[0] = applicationData ++ header[1] = 3 ++ header[2] = 3 ++ binary.BigEndian.PutUint16(header[3:], uint16(len(p))) ++ return writeBuffers(c.Conn, header[:], p) ++} ++ ++func (c *shadowConn) Upstream() any { return c.Conn } ++ ++type clientConn struct { ++ *shadowConn ++ mu sync.Mutex ++ hashConn *hashReadConn ++} ++ ++func newClientConn(hashConn *hashReadConn) *clientConn { ++ return &clientConn{shadowConn: newConn(hashConn.Conn), hashConn: hashConn} ++} ++ ++func (c *clientConn) Write(p []byte) (int, error) { ++ c.mu.Lock() ++ defer c.mu.Unlock() ++ if c.hashConn == nil { ++ return c.shadowConn.Write(p) ++ } ++ prefixed := make([]byte, 8+len(p)) ++ copy(prefixed, c.hashConn.Sum()) ++ copy(prefixed[8:], p) ++ c.hashConn = nil ++ if _, err := c.shadowConn.Write(prefixed); err != nil { ++ return 0, err ++ } ++ return len(p), nil ++} ++ ++func copyUntilHandshakeFinishedV2(dst net.Conn, src io.Reader, hashConn *hashWriteConn, fallbackAfter int) ([]byte, error) { ++ applicationDataCount := 0 ++ for { ++ frame, err := readFrame(src) ++ if err != nil { ++ return nil, err ++ } ++ if frame[0] == applicationData { ++ payload := frame[tlsHeaderSize:] ++ current, previous, hasContent := hashConn.sums() ++ if hasContent && len(payload) >= 8 { ++ if bytes.Equal(payload[:8], current) { ++ return append([]byte(nil), payload[8:]...), nil ++ } ++ if len(previous) > 0 && bytes.Equal(payload[:8], previous) { ++ return append([]byte(nil), payload[8:]...), nil ++ } ++ } ++ applicationDataCount++ ++ } ++ if _, err = dst.Write(frame); err != nil { ++ return nil, err ++ } ++ if applicationDataCount > fallbackAfter { ++ return nil, os.ErrPermission ++ } ++ } ++} +--- a/transport/internet/shadowtls/protocol/v3.go ++++ b/transport/internet/shadowtls/protocol/v3.go +@@ -0,0 +1,332 @@ ++// Adapted from MetaCubeX/mihomo v1.19.32; GPL-3.0-or-later. ++package shadowtls ++ ++import ( ++ "crypto/hmac" ++ "crypto/rand" ++ "crypto/sha1" ++ "crypto/sha256" ++ "encoding/binary" ++ "errors" ++ "fmt" ++ "hash" ++ "io" ++ "net" ++ "sync" ++) ++ ++func generateSessionID(password string) TLSSessionIDGeneratorFunc { ++ return func(clientHello []byte, sessionID []byte) error { ++ const sessionIDStart = 1 + 3 + 2 + tlsRandomSize + 1 ++ if len(clientHello) < sessionIDStart+tlsSessionIDSize || len(sessionID) < tlsSessionIDSize { ++ return errors.New("shadow-tls: unexpected ClientHello length") ++ } ++ if _, err := rand.Read(sessionID[:tlsSessionIDSize-hmacSize]); err != nil { ++ return err ++ } ++ for i := tlsSessionIDSize - hmacSize; i < tlsSessionIDSize; i++ { ++ sessionID[i] = 0 ++ } ++ h := hmac.New(sha1.New, []byte(password)) ++ _, _ = h.Write(clientHello[:sessionIDStart]) ++ _, _ = h.Write(sessionID[:tlsSessionIDSize]) ++ _, _ = h.Write(clientHello[sessionIDStart+tlsSessionIDSize:]) ++ copy(sessionID[tlsSessionIDSize-hmacSize:], h.Sum(nil)[:hmacSize]) ++ return nil ++ } ++} ++ ++type streamWrapper struct { ++ net.Conn ++ password string ++ pending []byte ++ serverRandom []byte ++ readHMAC hash.Hash ++ readHMACKey []byte ++ isTLS13 bool ++ authorized bool ++} ++ ++func newStreamWrapper(conn net.Conn, password string) *streamWrapper { ++ return &streamWrapper{Conn: conn, password: password} ++} ++ ++func (c *streamWrapper) Authorized() (bool, bool, []byte, hash.Hash) { ++ return c.isTLS13, c.authorized, c.serverRandom, c.readHMAC ++} ++ ++func (c *streamWrapper) Read(p []byte) (int, error) { ++ if len(c.pending) > 0 { ++ return c.readPending(p), nil ++ } ++ frame, err := readFrame(c.Conn) ++ if err != nil { ++ return 0, err ++ } ++ switch frame[0] { ++ case handshake: ++ // Mirror the server's one-shot seed: only initialize the HMAC chain on the first ++ // ServerHello so a TLS 1.3 HelloRetryRequest (RFC 8446 section 4.1.4) aligns both peers. ++ if len(frame) >= serverRandomIndex+tlsRandomSize && frame[tlsHeaderSize] == serverHello && c.readHMAC == nil { ++ c.serverRandom = append([]byte(nil), frame[serverRandomIndex:serverRandomIndex+tlsRandomSize]...) ++ c.readHMAC = hmac.New(sha1.New, []byte(c.password)) ++ _, _ = c.readHMAC.Write(c.serverRandom) ++ c.readHMACKey = kdf(c.password, c.serverRandom) ++ c.isTLS13 = isServerHelloSupportTLS13(frame) ++ c.authorized = !c.isTLS13 ++ } ++ case applicationData: ++ c.authorized = false ++ if len(frame) > tlsHMACHeaderSize && c.readHMAC != nil { ++ _, _ = c.readHMAC.Write(frame[tlsHMACHeaderSize:]) ++ if !hmac.Equal(c.readHMAC.Sum(nil)[:hmacSize], frame[tlsHeaderSize:tlsHMACHeaderSize]) { ++ return 0, errors.New("shadow-tls v3: HMAC mismatch, possible data corruption") ++ } ++ xorSlice(frame[tlsHMACHeaderSize:], c.readHMACKey) ++ copy(frame[hmacSize:hmacSize+tlsHeaderSize], frame[:tlsHeaderSize]) ++ frame = frame[hmacSize:] ++ binary.BigEndian.PutUint16(frame[3:5], uint16(len(frame)-tlsHeaderSize)) ++ c.authorized = true ++ } ++ } ++ c.pending = frame ++ return c.readPending(p), nil ++} ++ ++func (c *streamWrapper) readPending(p []byte) int { ++ n := copy(p, c.pending) ++ c.pending = c.pending[n:] ++ return n ++} ++ ++type verifiedConn struct { ++ net.Conn ++ writeMu sync.Mutex ++ hmacAdd hash.Hash ++ hmacVerify hash.Hash ++ hmacIgnore hash.Hash ++ pending []byte ++ readBuffer []byte ++ readOffset int ++} ++ ++func newVerifiedConn(conn net.Conn, hmacAdd, hmacVerify, hmacIgnore hash.Hash) *verifiedConn { ++ return &verifiedConn{ ++ Conn: conn, ++ hmacAdd: hmacAdd, ++ hmacVerify: hmacVerify, ++ hmacIgnore: hmacIgnore, ++ } ++} ++ ++func (c *verifiedConn) Read(p []byte) (int, error) { ++ if len(c.pending) > 0 { ++ return c.readPending(p), nil ++ } ++ for { ++ frame, err := c.readRecord() ++ if err != nil { ++ var netErr net.Error ++ if errors.As(err, &netErr) && netErr.Timeout() { ++ return 0, err ++ } ++ sendAlert(c.Conn) ++ return 0, err ++ } ++ switch frame[0] { ++ case alert: ++ return 0, fmt.Errorf("shadow-tls: remote alert: %w", net.ErrClosed) ++ case applicationData: ++ if c.hmacIgnore != nil { ++ if verifyApplicationData(frame, c.hmacIgnore, false) { ++ continue ++ } ++ c.hmacIgnore = nil ++ } ++ if !verifyApplicationData(frame, c.hmacVerify, true) { ++ sendAlert(c.Conn) ++ return 0, errors.New("shadow-tls: application data verification failed") ++ } ++ c.pending = frame[tlsHMACHeaderSize:] ++ return c.readPending(p), nil ++ default: ++ sendAlert(c.Conn) ++ return 0, fmt.Errorf("shadow-tls: unexpected TLS record type: %d", frame[0]) ++ } ++ } ++} ++ ++func (c *verifiedConn) readRecord() ([]byte, error) { ++ // Keep an incomplete record so a read deadline only interrupts the current Read. ++ if c.readBuffer == nil { ++ c.readBuffer = make([]byte, tlsHeaderSize) ++ } ++ if c.readOffset < tlsHeaderSize { ++ n, err := io.ReadFull(c.Conn, c.readBuffer[c.readOffset:tlsHeaderSize]) ++ c.readOffset += n ++ if err != nil { ++ return nil, err ++ } ++ length := int(binary.BigEndian.Uint16(c.readBuffer[3:])) ++ c.readBuffer = append(c.readBuffer, make([]byte, length)...) ++ } ++ if c.readOffset < len(c.readBuffer) { ++ n, err := io.ReadFull(c.Conn, c.readBuffer[c.readOffset:]) ++ c.readOffset += n ++ if err != nil { ++ return nil, err ++ } ++ } ++ frame := c.readBuffer ++ c.readBuffer = nil ++ c.readOffset = 0 ++ return frame, nil ++} ++ ++func (c *verifiedConn) readPending(p []byte) int { ++ n := copy(p, c.pending) ++ c.pending = c.pending[n:] ++ return n ++} ++ ++func (c *verifiedConn) Write(p []byte) (int, error) { ++ c.writeMu.Lock() ++ defer c.writeMu.Unlock() ++ total := len(p) ++ for len(p) > 0 { ++ length := len(p) ++ if length > maxTLSPlaintext { ++ length = maxTLSPlaintext ++ } ++ if err := c.writeRecord(p[:length]); err != nil { ++ return total - len(p), err ++ } ++ p = p[length:] ++ } ++ return total, nil ++} ++ ++func (c *verifiedConn) writeRecord(p []byte) error { ++ var header [tlsHMACHeaderSize]byte ++ header[0] = applicationData ++ header[1] = 3 ++ header[2] = 3 ++ binary.BigEndian.PutUint16(header[3:tlsHeaderSize], uint16(hmacSize+len(p))) ++ _, _ = c.hmacAdd.Write(p) ++ hmacHash := c.hmacAdd.Sum(nil)[:hmacSize] ++ _, _ = c.hmacAdd.Write(hmacHash) ++ copy(header[tlsHeaderSize:], hmacHash) ++ return writeBuffers(c.Conn, header[:], p) ++} ++ ++func (c *verifiedConn) Upstream() any { return c.Conn } ++ ++func verifyApplicationData(frame []byte, h hash.Hash, update bool) bool { ++ if len(frame) < tlsHMACHeaderSize || frame[0] != applicationData || frame[1] != 3 || frame[2] != 3 { ++ return false ++ } ++ _, _ = h.Write(frame[tlsHMACHeaderSize:]) ++ hmacHash := h.Sum(nil)[:hmacSize] ++ if update { ++ _, _ = h.Write(hmacHash) ++ } ++ return hmac.Equal(frame[tlsHeaderSize:tlsHMACHeaderSize], hmacHash) ++} ++ ++func verifyClientHello(frame []byte, users []User) (*User, error) { ++ const minLength = tlsHeaderSize + 1 + 3 + 2 + tlsRandomSize + 1 + tlsSessionIDSize ++ const hmacIndex = sessionIDLengthIndex + 1 + tlsSessionIDSize - hmacSize ++ if len(frame) < minLength { ++ return nil, io.ErrUnexpectedEOF ++ } ++ if frame[0] != handshake || frame[tlsHeaderSize] != clientHello { ++ return nil, errors.New("shadow-tls: unexpected ClientHello record") ++ } ++ if frame[sessionIDLengthIndex] != tlsSessionIDSize { ++ return nil, errors.New("shadow-tls: unexpected session ID length") ++ } ++ for i := range users { ++ user := &users[i] ++ h := hmac.New(sha1.New, []byte(user.Password)) ++ _, _ = h.Write(frame[tlsHeaderSize:hmacIndex]) ++ _, _ = h.Write([]byte{0, 0, 0, 0}) ++ _, _ = h.Write(frame[hmacIndex+hmacSize:]) ++ if hmac.Equal(frame[hmacIndex:hmacIndex+hmacSize], h.Sum(nil)[:hmacSize]) { ++ return user, nil ++ } ++ } ++ return nil, errors.New("shadow-tls: ClientHello HMAC mismatch") ++} ++ ++func copyByFrameUntilHMACMatches(conn, handshakeConn net.Conn, hmacVerify hash.Hash, hmacReset func()) ([]byte, error) { ++ for { ++ frame, err := readFrame(conn) ++ if err != nil { ++ return nil, fmt.Errorf("shadow-tls: read client record: %w", err) ++ } ++ if len(frame) > tlsHMACHeaderSize && frame[0] == applicationData { ++ hmacReset() ++ _, _ = hmacVerify.Write(frame[tlsHMACHeaderSize:]) ++ hmacHash := hmacVerify.Sum(nil)[:hmacSize] ++ if hmac.Equal(hmacHash, frame[tlsHeaderSize:tlsHMACHeaderSize]) { ++ hmacReset() ++ _, _ = hmacVerify.Write(frame[tlsHMACHeaderSize:]) ++ _, _ = hmacVerify.Write(frame[tlsHeaderSize:tlsHMACHeaderSize]) ++ return append([]byte(nil), frame[tlsHMACHeaderSize:]...), nil ++ } ++ } ++ if _, err = handshakeConn.Write(frame); err != nil { ++ return nil, fmt.Errorf("shadow-tls: write client record: %w", err) ++ } ++ } ++} ++ ++func copyByFrameWithModification(conn, handshakeConn net.Conn, password string, serverRandom []byte, hmacWrite hash.Hash) error { ++ writeKey := kdf(password, serverRandom) ++ for { ++ frame, err := readFrame(conn) ++ if err != nil { ++ return fmt.Errorf("shadow-tls: read server record: %w", err) ++ } ++ if frame[0] != applicationData { ++ if _, err = handshakeConn.Write(frame); err != nil { ++ return fmt.Errorf("shadow-tls: write server record: %w", err) ++ } ++ continue ++ } ++ xorSlice(frame[tlsHeaderSize:], writeKey) ++ _, _ = hmacWrite.Write(frame[tlsHeaderSize:]) ++ binary.BigEndian.PutUint16(frame[3:5], uint16(len(frame)-tlsHeaderSize+hmacSize)) ++ hmacHash := hmacWrite.Sum(nil)[:hmacSize] ++ if err = writeBuffers(handshakeConn, frame[:tlsHeaderSize], hmacHash, frame[tlsHeaderSize:]); err != nil { ++ return fmt.Errorf("shadow-tls: write modified server record: %w", err) ++ } ++ } ++} ++ ++func kdf(password string, serverRandom []byte) []byte { ++ hasher := sha256.New() ++ _, _ = hasher.Write([]byte(password)) ++ _, _ = hasher.Write(serverRandom) ++ return hasher.Sum(nil) ++} ++ ++func xorSlice(data, key []byte) { ++ for i := range data { ++ data[i] ^= key[i%len(key)] ++ } ++} ++ ++func sendAlert(writer io.Writer) { ++ const recordSize = 31 ++ record := [recordSize]byte{alert, 3, 3, 0, recordSize - tlsHeaderSize} ++ if _, err := rand.Read(record[tlsHeaderSize:]); err == nil { ++ _, _ = writer.Write(record[:]) ++ } ++} ++ ++func hmacReset(h hash.Hash, serverRandom []byte, side byte) { ++ h.Reset() ++ _, _ = h.Write(serverRandom) ++ _, _ = h.Write([]byte{side}) ++} +--- a/transport/internet/tcp/dialer.go ++++ b/transport/internet/tcp/dialer.go +@@ -12,6 +12,7 @@ + "github.com/xtls/xray-core/common/session" + "github.com/xtls/xray-core/transport/internet" + "github.com/xtls/xray-core/transport/internet/reality" ++ "github.com/xtls/xray-core/transport/internet/shadowtls" + "github.com/xtls/xray-core/transport/internet/stat" + "github.com/xtls/xray-core/transport/internet/tls" + ) +@@ -98,6 +99,14 @@ + } + } + ++ if config := shadowtls.ConfigFromStreamSettings(streamSettings); config != nil { ++ raw := conn ++ conn, err = config.Client(ctx, raw, dest) ++ if err != nil { ++ raw.Close() ++ return nil, err ++ } ++ } + tcpSettings := streamSettings.ProtocolSettings.(*Config) + if tcpSettings.HeaderSettings != nil { + headerConfig, err := tcpSettings.HeaderSettings.GetInstance() +--- a/transport/internet/tcp/hub.go ++++ b/transport/internet/tcp/hub.go +@@ -12,12 +12,18 @@ + "github.com/xtls/xray-core/common/net" + "github.com/xtls/xray-core/transport/internet" + "github.com/xtls/xray-core/transport/internet/reality" ++ "github.com/xtls/xray-core/transport/internet/shadowtls" ++ shadowprotocol "github.com/xtls/xray-core/transport/internet/shadowtls/protocol" + "github.com/xtls/xray-core/transport/internet/stat" + "github.com/xtls/xray-core/transport/internet/tls" + ) + + // Listener is an internet.Listener that listens for TCP connections. + type Listener struct { ++ shadowConfig *shadowprotocol.ServerConfig ++ shadowTimeout time.Duration ++ ctx context.Context ++ cancel context.CancelFunc + listener net.Listener + tlsConfig *gotls.Config + realityConfig *goreality.Config +@@ -31,6 +37,15 @@ + l := &Listener{ + addConn: handler, + } ++ ++ if config := shadowtls.ConfigFromStreamSettings(streamSettings); config != nil { ++ var err error ++ l.shadowConfig, err = config.ServerConfig(streamSettings.SocketSettings) ++ if err != nil { ++ return nil, err ++ } ++ l.shadowTimeout = config.Timeout() ++ } + tcpSettings := streamSettings.ProtocolSettings.(*Config) + l.config = tcpSettings + if l.config != nil { +@@ -83,6 +98,7 @@ + l.authConfig = auth + } + ++ l.ctx, l.cancel = context.WithCancel(ctx) + go l.keepAccepting() + return l, nil + } +@@ -102,7 +118,19 @@ + continue + } + +- go func() { ++ go func(conn net.Conn) { ++ if v.shadowConfig != nil { ++ ctx, cancel := context.WithTimeout(v.ctx, v.shadowTimeout) ++ stop := context.AfterFunc(ctx, func() { conn.Close() }) ++ wrapped, handshakeErr := shadowprotocol.Server(ctx, conn, v.shadowConfig) ++ stopped := stop() ++ cancel() ++ if handshakeErr != nil || !stopped { ++ conn.Close() ++ return ++ } ++ conn = wrapped ++ } + if v.tlsConfig != nil { + conn = tls.Server(conn, v.tlsConfig) + } else if v.realityConfig != nil { +@@ -115,7 +143,7 @@ + conn = v.authConfig.Server(conn) + } + v.addConn(stat.Connection(conn)) +- }() ++ }(conn) + } + } + +@@ -126,6 +154,7 @@ + + // Close implements internet.Listener.Close. + func (v *Listener) Close() error { ++ v.cancel() + return v.listener.Close() + } + diff --git a/xray-core/patches/180-add-kcptun-transport.patch b/xray-core/patches/180-add-kcptun-transport.patch new file mode 100644 index 000000000..d9148ec3c --- /dev/null +++ b/xray-core/patches/180-add-kcptun-transport.patch @@ -0,0 +1,2009 @@ +From: coolsnowwolf +Subject: [PATCH] transport: add Mihomo-compatible Kcptun inbound and outbound + +Port Mihomo v1.19.32 Kcptun settings, cipher selection, FEC, compression and +smux v1/v2 as a separate UDP-based reliable stream transport. Preserve mKCP. +Own client pools per outbound and destination, reclaim expired sessions and +close pooled sockets with their outbound. Track and close accepted server +sessions and adapt stream addresses for Xray protocols. Use Xray socket +options, outbound gateway selection and finalmask packet wrappers. + +Signed-off-by: coolsnowwolf + +--- a/app/proxyman/outbound/handler.go ++++ b/app/proxyman/outbound/handler.go +@@ -329,6 +329,7 @@ + + // Close implements common.Closable. + func (h *Handler) Close() error { ++ common.Close(h.streamSettings) + common.Close(h.mux) + common.Close(h.proxy) + return nil +--- a/go.mod ++++ b/go.mod +@@ -9,14 +9,17 @@ + github.com/ghodss/yaml v1.0.1-0.20220118164431-d8423dcdf344 + github.com/gofrs/uuid/v5 v5.4.0 + github.com/golang/mock v1.7.0-rc.1 ++ github.com/golang/snappy v1.0.0 + github.com/google/go-cmp v0.7.0 + github.com/google/uuid v1.6.0 + github.com/gorilla/websocket v1.5.3 + github.com/klauspost/cpuid/v2 v2.4.2 + github.com/libp2p/go-nat v1.0.1-0.20250821073202-01afc089f138 + github.com/metacubex/chacha v0.1.5 ++ github.com/metacubex/kcp-go v0.0.0-20260105040817-550693377604 + github.com/metacubex/mihomo v1.19.32 + github.com/metacubex/quic-go v0.61.1-0.20260727080200-2548683b76f4 ++ github.com/metacubex/smux v0.0.0-20260105030934-d0c8756d3141 + github.com/metacubex/tls v0.1.8 + github.com/metacubex/utls v1.8.8 + github.com/miekg/dns v1.1.73 +@@ -72,6 +75,7 @@ + github.com/jackpal/go-nat-pmp v1.0.2 // indirect + github.com/juju/ratelimit v1.0.2 // indirect + github.com/klauspost/compress v1.20.1 // indirect ++ github.com/klauspost/reedsolomon v1.12.3 // indirect + github.com/koron/go-ssdp v0.0.4 // indirect + github.com/libp2p/go-netroute v0.2.1 // indirect + github.com/molecule-man/go-brrr v1.2.0 // indirect +@@ -98,6 +102,7 @@ + gitlab.com/go-extension/aes-ccm v0.0.0-20230221065045-e58665ef23c7 // indirect + go.yaml.in/yaml/v3 v3.0.5 // indirect + golang.org/x/text v0.43.0 // indirect ++ golang.org/x/time v0.14.0 // indirect + golang.org/x/tools v0.51.0 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20260817212433-ac3dfec99bb1 // indirect + google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.6.2 // indirect +--- a/go.sum ++++ b/go.sum +@@ -24,6 +24,8 @@ + github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= + github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek= + github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps= ++github.com/golang/snappy v1.0.0 h1:Oy607GVXHs7RtbggtPBnr2RmDArIsAefDwvrdWvRhGs= ++github.com/golang/snappy v1.0.0/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= + github.com/google/btree v1.1.3 h1:CVpQJjYgC4VbzxeGVHfvZrv1ctoYCAI8vbl07Fcxlyg= + github.com/google/btree v1.1.3/go.mod h1:qOPhT0dTNdNzV6Z/lhRX0YXUafgPLFUh+gZMl761Gm4= + github.com/google/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8= +@@ -46,6 +48,8 @@ + github.com/klauspost/compress v1.20.1/go.mod h1:LUdAzn7YLVvxLpc7y3V1m40wESHTgc1422pwwBSKYuI= + github.com/klauspost/cpuid/v2 v2.4.2 h1:xRw7IZEsAgVCp6trS/DgWbTAqpixhmywgVgBjYGg1bQ= + github.com/klauspost/cpuid/v2 v2.4.2/go.mod h1:19jmZ9mjzoF//ddRSUsv0zfBTJWh3QJh9FNxZTMrGxU= ++github.com/klauspost/reedsolomon v1.12.3 h1:tzUznbfc3OFwJaTebv/QdhnFf2Xvb7gZ24XaHLBPmdc= ++github.com/klauspost/reedsolomon v1.12.3/go.mod h1:3K5rXwABAvzGeR01r6pWZieUALXO/Tq7bFKGIb4m4WI= + github.com/koron/go-ssdp v0.0.4 h1:1IDwrghSKYM7yLf7XCzbByg2sJ/JcNOZRXS2jczTwz0= + github.com/koron/go-ssdp v0.0.4/go.mod h1:oDXq+E5IL5q0U8uSBcoAXzTzInwy5lEgC91HoKtbmZk= + github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= +@@ -70,6 +74,8 @@ + github.com/metacubex/hpke v0.1.0/go.mod h1:vfDm6gfgrwlXUxKDkWbcE44hXtmc1uxLDm2BcR11b3U= + github.com/metacubex/http v0.1.8 h1:d91onDan2ZXYE8W/uAy5oFmXHH2xi1L7LbGPV5EmCM0= + github.com/metacubex/http v0.1.8/go.mod h1:Nxx0zZAo2AhRfanyL+fmmK6ACMtVsfpwIl1aFAik2Eg= ++github.com/metacubex/kcp-go v0.0.0-20260105040817-550693377604 h1:hJwCVlE3ojViC35MGHB+FBr8TuIf3BUFn2EQ1VIamsI= ++github.com/metacubex/kcp-go v0.0.0-20260105040817-550693377604/go.mod h1:lpmN3m269b3V5jFCWtffqBLS4U3QQoIid9ugtO+OhVc= + github.com/metacubex/mihomo v1.19.32 h1:uD7ZC3P77isWD554NNvtee65L+99+/C5hyc+Lk8rVEk= + github.com/metacubex/mihomo v1.19.32/go.mod h1:d7xWi5iEktkC9PqXkD/Vo4AEcb0Q92XikfLoySUDWls= + github.com/metacubex/mlkem v0.1.0 h1:wFClitonSFcmipzzQvax75beLQU+D7JuC+VK1RzSL8I= +@@ -80,6 +86,8 @@ + github.com/metacubex/randv2 v0.2.0/go.mod h1:kFi2SzrQ5WuneuoLLCMkABtiBu6VRrMrWFqSPyj2cxY= + github.com/metacubex/sing v0.5.8 h1:OwJDSPP+pza6Ywt7NMR4kEYq+UNrsIywSk/eAMlqxz8= + github.com/metacubex/sing v0.5.8/go.mod h1:ypf0mjwlZm0sKdQSY+yQvmsbWa0hNPtkeqyRMGgoN+w= ++github.com/metacubex/smux v0.0.0-20260105030934-d0c8756d3141 h1:DK2l6m2Fc85H2BhiAPgbJygiWhesPlfGmF+9Vw6ARdk= ++github.com/metacubex/smux v0.0.0-20260105030934-d0c8756d3141/go.mod h1:/yI4OiGOSn0SURhZdJF3CbtPg3nwK700bG8TZLMBvAg= + github.com/metacubex/tfo-go v0.0.0-20260623020846-376a77860b8c h1:+2C1UshSLzaogLY/IDz1XhOLxjhs3rkhVHB4eCN9Zto= + github.com/metacubex/tfo-go v0.0.0-20260623020846-376a77860b8c/go.mod h1:l9oLnLoEXyGZ5RVLsh7QCC5XsouTUyKk4F2nLm2DHLw= + github.com/metacubex/tls v0.1.8 h1:BHF2payjtxC7wdR3tnq8vl3FAgEQB6/pPjP2tJNTsP4= +--- a/infra/conf/kcptun.go ++++ b/infra/conf/kcptun.go +@@ -0,0 +1,13 @@ ++package conf ++ ++import "github.com/xtls/xray-core/transport/internet/kcptun" ++ ++type KcptunConfig kcptun.Config ++ ++func (c *KcptunConfig) Build() (*kcptun.Config, error) { ++ cfg := (*kcptun.Config)(c) ++ if _, err := cfg.Build(); err != nil { ++ return nil, err ++ } ++ return cfg, nil ++} +--- a/infra/conf/transport_internet.go ++++ b/infra/conf/transport_internet.go +@@ -21,6 +21,8 @@ + return "tcp", nil + case "xhttp", "splithttp": + return "splithttp", nil ++ case "kcptun": ++ return "kcptun", nil + case "kcp", "mkcp": + return "mkcp", nil + case "grpc": +@@ -52,6 +54,7 @@ + } + + type StreamConfig struct { ++ KcptunSettings *KcptunConfig `json:"kcptunSettings"` + ShadowTLSSettings *ShadowTLSConfig `json:"shadowtlsSettings"` + Address *Address `json:"address"` + Port uint16 `json:"port"` +@@ -95,6 +98,9 @@ + config.ProtocolName = protocol + } + ++ if config.ProtocolName == "kcptun" && c.Security != "" && c.Security != "none" { ++ return nil, errors.New("Kcptun does not support additional stream security") ++ } + var xdriveH3 bool + switch strings.ToLower(c.Security) { + case "", "none": +@@ -179,6 +185,17 @@ + Settings: serial.ToTypedMessage(hs), + }) + } ++ if config.ProtocolName == "kcptun" { ++ settings := c.KcptunSettings ++ if settings == nil { ++ settings = &KcptunConfig{} ++ } ++ ts, err := settings.Build() ++ if err != nil { ++ return nil, err ++ } ++ config.TransportSettings = append(config.TransportSettings, &internet.TransportConfig{ProtocolName: "kcptun", Settings: serial.ToTypedMessage(ts)}) ++ } + if c.KCPSettings != nil { + ts, err := c.KCPSettings.Build() + if err != nil { +--- a/main/distro/all/all.go ++++ b/main/distro/all/all.go +@@ -60,6 +60,7 @@ + _ "github.com/xtls/xray-core/transport/internet/grpc" + _ "github.com/xtls/xray-core/transport/internet/httpupgrade" + _ "github.com/xtls/xray-core/transport/internet/kcp" ++ _ "github.com/xtls/xray-core/transport/internet/kcptun" + _ "github.com/xtls/xray-core/transport/internet/masque" + _ "github.com/xtls/xray-core/transport/internet/reality" + _ "github.com/xtls/xray-core/transport/internet/splithttp" +--- a/transport/internet/kcptun/LICENSE.kcptun ++++ b/transport/internet/kcptun/LICENSE.kcptun +@@ -0,0 +1,9 @@ ++The MIT License (MIT) ++ ++Copyright (c) 2016 xtaci ++ ++Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: ++ ++The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. ++ ++THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +--- a/transport/internet/kcptun/LICENSE.mihomo ++++ b/transport/internet/kcptun/LICENSE.mihomo +@@ -0,0 +1,674 @@ ++ GNU GENERAL PUBLIC LICENSE ++ Version 3, 29 June 2007 ++ ++ Copyright (C) 2007 Free Software Foundation, Inc. ++ Everyone is permitted to copy and distribute verbatim copies ++ of this license document, but changing it is not allowed. ++ ++ Preamble ++ ++ The GNU General Public License is a free, copyleft license for ++software and other kinds of works. ++ ++ The licenses for most software and other practical works are designed ++to take away your freedom to share and change the works. By contrast, ++the GNU General Public License is intended to guarantee your freedom to ++share and change all versions of a program--to make sure it remains free ++software for all its users. We, the Free Software Foundation, use the ++GNU General Public License for most of our software; it applies also to ++any other work released this way by its authors. You can apply it to ++your programs, too. ++ ++ When we speak of free software, we are referring to freedom, not ++price. Our General Public Licenses are designed to make sure that you ++have the freedom to distribute copies of free software (and charge for ++them if you wish), that you receive source code or can get it if you ++want it, that you can change the software or use pieces of it in new ++free programs, and that you know you can do these things. ++ ++ To protect your rights, we need to prevent others from denying you ++these rights or asking you to surrender the rights. Therefore, you have ++certain responsibilities if you distribute copies of the software, or if ++you modify it: responsibilities to respect the freedom of others. ++ ++ For example, if you distribute copies of such a program, whether ++gratis or for a fee, you must pass on to the recipients the same ++freedoms that you received. You must make sure that they, too, receive ++or can get the source code. And you must show them these terms so they ++know their rights. ++ ++ Developers that use the GNU GPL protect your rights with two steps: ++(1) assert copyright on the software, and (2) offer you this License ++giving you legal permission to copy, distribute and/or modify it. ++ ++ For the developers' and authors' protection, the GPL clearly explains ++that there is no warranty for this free software. For both users' and ++authors' sake, the GPL requires that modified versions be marked as ++changed, so that their problems will not be attributed erroneously to ++authors of previous versions. ++ ++ Some devices are designed to deny users access to install or run ++modified versions of the software inside them, although the manufacturer ++can do so. This is fundamentally incompatible with the aim of ++protecting users' freedom to change the software. The systematic ++pattern of such abuse occurs in the area of products for individuals to ++use, which is precisely where it is most unacceptable. Therefore, we ++have designed this version of the GPL to prohibit the practice for those ++products. If such problems arise substantially in other domains, we ++stand ready to extend this provision to those domains in future versions ++of the GPL, as needed to protect the freedom of users. ++ ++ Finally, every program is threatened constantly by software patents. ++States should not allow patents to restrict development and use of ++software on general-purpose computers, but in those that do, we wish to ++avoid the special danger that patents applied to a free program could ++make it effectively proprietary. To prevent this, the GPL assures that ++patents cannot be used to render the program non-free. ++ ++ The precise terms and conditions for copying, distribution and ++modification follow. ++ ++ TERMS AND CONDITIONS ++ ++ 0. Definitions. ++ ++ "This License" refers to version 3 of the GNU General Public License. ++ ++ "Copyright" also means copyright-like laws that apply to other kinds of ++works, such as semiconductor masks. ++ ++ "The Program" refers to any copyrightable work licensed under this ++License. Each licensee is addressed as "you". "Licensees" and ++"recipients" may be individuals or organizations. ++ ++ To "modify" a work means to copy from or adapt all or part of the work ++in a fashion requiring copyright permission, other than the making of an ++exact copy. The resulting work is called a "modified version" of the ++earlier work or a work "based on" the earlier work. ++ ++ A "covered work" means either the unmodified Program or a work based ++on the Program. ++ ++ To "propagate" a work means to do anything with it that, without ++permission, would make you directly or secondarily liable for ++infringement under applicable copyright law, except executing it on a ++computer or modifying a private copy. Propagation includes copying, ++distribution (with or without modification), making available to the ++public, and in some countries other activities as well. ++ ++ To "convey" a work means any kind of propagation that enables other ++parties to make or receive copies. Mere interaction with a user through ++a computer network, with no transfer of a copy, is not conveying. ++ ++ An interactive user interface displays "Appropriate Legal Notices" ++to the extent that it includes a convenient and prominently visible ++feature that (1) displays an appropriate copyright notice, and (2) ++tells the user that there is no warranty for the work (except to the ++extent that warranties are provided), that licensees may convey the ++work under this License, and how to view a copy of this License. If ++the interface presents a list of user commands or options, such as a ++menu, a prominent item in the list meets this criterion. ++ ++ 1. Source Code. ++ ++ The "source code" for a work means the preferred form of the work ++for making modifications to it. "Object code" means any non-source ++form of a work. ++ ++ A "Standard Interface" means an interface that either is an official ++standard defined by a recognized standards body, or, in the case of ++interfaces specified for a particular programming language, one that ++is widely used among developers working in that language. ++ ++ The "System Libraries" of an executable work include anything, other ++than the work as a whole, that (a) is included in the normal form of ++packaging a Major Component, but which is not part of that Major ++Component, and (b) serves only to enable use of the work with that ++Major Component, or to implement a Standard Interface for which an ++implementation is available to the public in source code form. A ++"Major Component", in this context, means a major essential component ++(kernel, window system, and so on) of the specific operating system ++(if any) on which the executable work runs, or a compiler used to ++produce the work, or an object code interpreter used to run it. ++ ++ The "Corresponding Source" for a work in object code form means all ++the source code needed to generate, install, and (for an executable ++work) run the object code and to modify the work, including scripts to ++control those activities. However, it does not include the work's ++System Libraries, or general-purpose tools or generally available free ++programs which are used unmodified in performing those activities but ++which are not part of the work. For example, Corresponding Source ++includes interface definition files associated with source files for ++the work, and the source code for shared libraries and dynamically ++linked subprograms that the work is specifically designed to require, ++such as by intimate data communication or control flow between those ++subprograms and other parts of the work. ++ ++ The Corresponding Source need not include anything that users ++can regenerate automatically from other parts of the Corresponding ++Source. ++ ++ The Corresponding Source for a work in source code form is that ++same work. ++ ++ 2. Basic Permissions. ++ ++ All rights granted under this License are granted for the term of ++copyright on the Program, and are irrevocable provided the stated ++conditions are met. This License explicitly affirms your unlimited ++permission to run the unmodified Program. The output from running a ++covered work is covered by this License only if the output, given its ++content, constitutes a covered work. This License acknowledges your ++rights of fair use or other equivalent, as provided by copyright law. ++ ++ You may make, run and propagate covered works that you do not ++convey, without conditions so long as your license otherwise remains ++in force. You may convey covered works to others for the sole purpose ++of having them make modifications exclusively for you, or provide you ++with facilities for running those works, provided that you comply with ++the terms of this License in conveying all material for which you do ++not control copyright. Those thus making or running the covered works ++for you must do so exclusively on your behalf, under your direction ++and control, on terms that prohibit them from making any copies of ++your copyrighted material outside their relationship with you. ++ ++ Conveying under any other circumstances is permitted solely under ++the conditions stated below. Sublicensing is not allowed; section 10 ++makes it unnecessary. ++ ++ 3. Protecting Users' Legal Rights From Anti-Circumvention Law. ++ ++ No covered work shall be deemed part of an effective technological ++measure under any applicable law fulfilling obligations under article ++11 of the WIPO copyright treaty adopted on 20 December 1996, or ++similar laws prohibiting or restricting circumvention of such ++measures. ++ ++ When you convey a covered work, you waive any legal power to forbid ++circumvention of technological measures to the extent such circumvention ++is effected by exercising rights under this License with respect to ++the covered work, and you disclaim any intention to limit operation or ++modification of the work as a means of enforcing, against the work's ++users, your or third parties' legal rights to forbid circumvention of ++technological measures. ++ ++ 4. Conveying Verbatim Copies. ++ ++ You may convey verbatim copies of the Program's source code as you ++receive it, in any medium, provided that you conspicuously and ++appropriately publish on each copy an appropriate copyright notice; ++keep intact all notices stating that this License and any ++non-permissive terms added in accord with section 7 apply to the code; ++keep intact all notices of the absence of any warranty; and give all ++recipients a copy of this License along with the Program. ++ ++ You may charge any price or no price for each copy that you convey, ++and you may offer support or warranty protection for a fee. ++ ++ 5. Conveying Modified Source Versions. ++ ++ You may convey a work based on the Program, or the modifications to ++produce it from the Program, in the form of source code under the ++terms of section 4, provided that you also meet all of these conditions: ++ ++ a) The work must carry prominent notices stating that you modified ++ it, and giving a relevant date. ++ ++ b) The work must carry prominent notices stating that it is ++ released under this License and any conditions added under section ++ 7. This requirement modifies the requirement in section 4 to ++ "keep intact all notices". ++ ++ c) You must license the entire work, as a whole, under this ++ License to anyone who comes into possession of a copy. This ++ License will therefore apply, along with any applicable section 7 ++ additional terms, to the whole of the work, and all its parts, ++ regardless of how they are packaged. This License gives no ++ permission to license the work in any other way, but it does not ++ invalidate such permission if you have separately received it. ++ ++ d) If the work has interactive user interfaces, each must display ++ Appropriate Legal Notices; however, if the Program has interactive ++ interfaces that do not display Appropriate Legal Notices, your ++ work need not make them do so. ++ ++ A compilation of a covered work with other separate and independent ++works, which are not by their nature extensions of the covered work, ++and which are not combined with it such as to form a larger program, ++in or on a volume of a storage or distribution medium, is called an ++"aggregate" if the compilation and its resulting copyright are not ++used to limit the access or legal rights of the compilation's users ++beyond what the individual works permit. Inclusion of a covered work ++in an aggregate does not cause this License to apply to the other ++parts of the aggregate. ++ ++ 6. Conveying Non-Source Forms. ++ ++ You may convey a covered work in object code form under the terms ++of sections 4 and 5, provided that you also convey the ++machine-readable Corresponding Source under the terms of this License, ++in one of these ways: ++ ++ a) Convey the object code in, or embodied in, a physical product ++ (including a physical distribution medium), accompanied by the ++ Corresponding Source fixed on a durable physical medium ++ customarily used for software interchange. ++ ++ b) Convey the object code in, or embodied in, a physical product ++ (including a physical distribution medium), accompanied by a ++ written offer, valid for at least three years and valid for as ++ long as you offer spare parts or customer support for that product ++ model, to give anyone who possesses the object code either (1) a ++ copy of the Corresponding Source for all the software in the ++ product that is covered by this License, on a durable physical ++ medium customarily used for software interchange, for a price no ++ more than your reasonable cost of physically performing this ++ conveying of source, or (2) access to copy the ++ Corresponding Source from a network server at no charge. ++ ++ c) Convey individual copies of the object code with a copy of the ++ written offer to provide the Corresponding Source. This ++ alternative is allowed only occasionally and noncommercially, and ++ only if you received the object code with such an offer, in accord ++ with subsection 6b. ++ ++ d) Convey the object code by offering access from a designated ++ place (gratis or for a charge), and offer equivalent access to the ++ Corresponding Source in the same way through the same place at no ++ further charge. You need not require recipients to copy the ++ Corresponding Source along with the object code. If the place to ++ copy the object code is a network server, the Corresponding Source ++ may be on a different server (operated by you or a third party) ++ that supports equivalent copying facilities, provided you maintain ++ clear directions next to the object code saying where to find the ++ Corresponding Source. Regardless of what server hosts the ++ Corresponding Source, you remain obligated to ensure that it is ++ available for as long as needed to satisfy these requirements. ++ ++ e) Convey the object code using peer-to-peer transmission, provided ++ you inform other peers where the object code and Corresponding ++ Source of the work are being offered to the general public at no ++ charge under subsection 6d. ++ ++ A separable portion of the object code, whose source code is excluded ++from the Corresponding Source as a System Library, need not be ++included in conveying the object code work. ++ ++ A "User Product" is either (1) a "consumer product", which means any ++tangible personal property which is normally used for personal, family, ++or household purposes, or (2) anything designed or sold for incorporation ++into a dwelling. In determining whether a product is a consumer product, ++doubtful cases shall be resolved in favor of coverage. For a particular ++product received by a particular user, "normally used" refers to a ++typical or common use of that class of product, regardless of the status ++of the particular user or of the way in which the particular user ++actually uses, or expects or is expected to use, the product. A product ++is a consumer product regardless of whether the product has substantial ++commercial, industrial or non-consumer uses, unless such uses represent ++the only significant mode of use of the product. ++ ++ "Installation Information" for a User Product means any methods, ++procedures, authorization keys, or other information required to install ++and execute modified versions of a covered work in that User Product from ++a modified version of its Corresponding Source. The information must ++suffice to ensure that the continued functioning of the modified object ++code is in no case prevented or interfered with solely because ++modification has been made. ++ ++ If you convey an object code work under this section in, or with, or ++specifically for use in, a User Product, and the conveying occurs as ++part of a transaction in which the right of possession and use of the ++User Product is transferred to the recipient in perpetuity or for a ++fixed term (regardless of how the transaction is characterized), the ++Corresponding Source conveyed under this section must be accompanied ++by the Installation Information. But this requirement does not apply ++if neither you nor any third party retains the ability to install ++modified object code on the User Product (for example, the work has ++been installed in ROM). ++ ++ The requirement to provide Installation Information does not include a ++requirement to continue to provide support service, warranty, or updates ++for a work that has been modified or installed by the recipient, or for ++the User Product in which it has been modified or installed. Access to a ++network may be denied when the modification itself materially and ++adversely affects the operation of the network or violates the rules and ++protocols for communication across the network. ++ ++ Corresponding Source conveyed, and Installation Information provided, ++in accord with this section must be in a format that is publicly ++documented (and with an implementation available to the public in ++source code form), and must require no special password or key for ++unpacking, reading or copying. ++ ++ 7. Additional Terms. ++ ++ "Additional permissions" are terms that supplement the terms of this ++License by making exceptions from one or more of its conditions. ++Additional permissions that are applicable to the entire Program shall ++be treated as though they were included in this License, to the extent ++that they are valid under applicable law. If additional permissions ++apply only to part of the Program, that part may be used separately ++under those permissions, but the entire Program remains governed by ++this License without regard to the additional permissions. ++ ++ When you convey a copy of a covered work, you may at your option ++remove any additional permissions from that copy, or from any part of ++it. (Additional permissions may be written to require their own ++removal in certain cases when you modify the work.) You may place ++additional permissions on material, added by you to a covered work, ++for which you have or can give appropriate copyright permission. ++ ++ Notwithstanding any other provision of this License, for material you ++add to a covered work, you may (if authorized by the copyright holders of ++that material) supplement the terms of this License with terms: ++ ++ a) Disclaiming warranty or limiting liability differently from the ++ terms of sections 15 and 16 of this License; or ++ ++ b) Requiring preservation of specified reasonable legal notices or ++ author attributions in that material or in the Appropriate Legal ++ Notices displayed by works containing it; or ++ ++ c) Prohibiting misrepresentation of the origin of that material, or ++ requiring that modified versions of such material be marked in ++ reasonable ways as different from the original version; or ++ ++ d) Limiting the use for publicity purposes of names of licensors or ++ authors of the material; or ++ ++ e) Declining to grant rights under trademark law for use of some ++ trade names, trademarks, or service marks; or ++ ++ f) Requiring indemnification of licensors and authors of that ++ material by anyone who conveys the material (or modified versions of ++ it) with contractual assumptions of liability to the recipient, for ++ any liability that these contractual assumptions directly impose on ++ those licensors and authors. ++ ++ All other non-permissive additional terms are considered "further ++restrictions" within the meaning of section 10. If the Program as you ++received it, or any part of it, contains a notice stating that it is ++governed by this License along with a term that is a further ++restriction, you may remove that term. If a license document contains ++a further restriction but permits relicensing or conveying under this ++License, you may add to a covered work material governed by the terms ++of that license document, provided that the further restriction does ++not survive such relicensing or conveying. ++ ++ If you add terms to a covered work in accord with this section, you ++must place, in the relevant source files, a statement of the ++additional terms that apply to those files, or a notice indicating ++where to find the applicable terms. ++ ++ Additional terms, permissive or non-permissive, may be stated in the ++form of a separately written license, or stated as exceptions; ++the above requirements apply either way. ++ ++ 8. Termination. ++ ++ You may not propagate or modify a covered work except as expressly ++provided under this License. Any attempt otherwise to propagate or ++modify it is void, and will automatically terminate your rights under ++this License (including any patent licenses granted under the third ++paragraph of section 11). ++ ++ However, if you cease all violation of this License, then your ++license from a particular copyright holder is reinstated (a) ++provisionally, unless and until the copyright holder explicitly and ++finally terminates your license, and (b) permanently, if the copyright ++holder fails to notify you of the violation by some reasonable means ++prior to 60 days after the cessation. ++ ++ Moreover, your license from a particular copyright holder is ++reinstated permanently if the copyright holder notifies you of the ++violation by some reasonable means, this is the first time you have ++received notice of violation of this License (for any work) from that ++copyright holder, and you cure the violation prior to 30 days after ++your receipt of the notice. ++ ++ Termination of your rights under this section does not terminate the ++licenses of parties who have received copies or rights from you under ++this License. If your rights have been terminated and not permanently ++reinstated, you do not qualify to receive new licenses for the same ++material under section 10. ++ ++ 9. Acceptance Not Required for Having Copies. ++ ++ You are not required to accept this License in order to receive or ++run a copy of the Program. Ancillary propagation of a covered work ++occurring solely as a consequence of using peer-to-peer transmission ++to receive a copy likewise does not require acceptance. However, ++nothing other than this License grants you permission to propagate or ++modify any covered work. These actions infringe copyright if you do ++not accept this License. Therefore, by modifying or propagating a ++covered work, you indicate your acceptance of this License to do so. ++ ++ 10. Automatic Licensing of Downstream Recipients. ++ ++ Each time you convey a covered work, the recipient automatically ++receives a license from the original licensors, to run, modify and ++propagate that work, subject to this License. You are not responsible ++for enforcing compliance by third parties with this License. ++ ++ An "entity transaction" is a transaction transferring control of an ++organization, or substantially all assets of one, or subdividing an ++organization, or merging organizations. If propagation of a covered ++work results from an entity transaction, each party to that ++transaction who receives a copy of the work also receives whatever ++licenses to the work the party's predecessor in interest had or could ++give under the previous paragraph, plus a right to possession of the ++Corresponding Source of the work from the predecessor in interest, if ++the predecessor has it or can get it with reasonable efforts. ++ ++ You may not impose any further restrictions on the exercise of the ++rights granted or affirmed under this License. For example, you may ++not impose a license fee, royalty, or other charge for exercise of ++rights granted under this License, and you may not initiate litigation ++(including a cross-claim or counterclaim in a lawsuit) alleging that ++any patent claim is infringed by making, using, selling, offering for ++sale, or importing the Program or any portion of it. ++ ++ 11. Patents. ++ ++ A "contributor" is a copyright holder who authorizes use under this ++License of the Program or a work on which the Program is based. The ++work thus licensed is called the contributor's "contributor version". ++ ++ A contributor's "essential patent claims" are all patent claims ++owned or controlled by the contributor, whether already acquired or ++hereafter acquired, that would be infringed by some manner, permitted ++by this License, of making, using, or selling its contributor version, ++but do not include claims that would be infringed only as a ++consequence of further modification of the contributor version. For ++purposes of this definition, "control" includes the right to grant ++patent sublicenses in a manner consistent with the requirements of ++this License. ++ ++ Each contributor grants you a non-exclusive, worldwide, royalty-free ++patent license under the contributor's essential patent claims, to ++make, use, sell, offer for sale, import and otherwise run, modify and ++propagate the contents of its contributor version. ++ ++ In the following three paragraphs, a "patent license" is any express ++agreement or commitment, however denominated, not to enforce a patent ++(such as an express permission to practice a patent or covenant not to ++sue for patent infringement). To "grant" such a patent license to a ++party means to make such an agreement or commitment not to enforce a ++patent against the party. ++ ++ If you convey a covered work, knowingly relying on a patent license, ++and the Corresponding Source of the work is not available for anyone ++to copy, free of charge and under the terms of this License, through a ++publicly available network server or other readily accessible means, ++then you must either (1) cause the Corresponding Source to be so ++available, or (2) arrange to deprive yourself of the benefit of the ++patent license for this particular work, or (3) arrange, in a manner ++consistent with the requirements of this License, to extend the patent ++license to downstream recipients. "Knowingly relying" means you have ++actual knowledge that, but for the patent license, your conveying the ++covered work in a country, or your recipient's use of the covered work ++in a country, would infringe one or more identifiable patents in that ++country that you have reason to believe are valid. ++ ++ If, pursuant to or in connection with a single transaction or ++arrangement, you convey, or propagate by procuring conveyance of, a ++covered work, and grant a patent license to some of the parties ++receiving the covered work authorizing them to use, propagate, modify ++or convey a specific copy of the covered work, then the patent license ++you grant is automatically extended to all recipients of the covered ++work and works based on it. ++ ++ A patent license is "discriminatory" if it does not include within ++the scope of its coverage, prohibits the exercise of, or is ++conditioned on the non-exercise of one or more of the rights that are ++specifically granted under this License. You may not convey a covered ++work if you are a party to an arrangement with a third party that is ++in the business of distributing software, under which you make payment ++to the third party based on the extent of your activity of conveying ++the work, and under which the third party grants, to any of the ++parties who would receive the covered work from you, a discriminatory ++patent license (a) in connection with copies of the covered work ++conveyed by you (or copies made from those copies), or (b) primarily ++for and in connection with specific products or compilations that ++contain the covered work, unless you entered into that arrangement, ++or that patent license was granted, prior to 28 March 2007. ++ ++ Nothing in this License shall be construed as excluding or limiting ++any implied license or other defenses to infringement that may ++otherwise be available to you under applicable patent law. ++ ++ 12. No Surrender of Others' Freedom. ++ ++ If conditions are imposed on you (whether by court order, agreement or ++otherwise) that contradict the conditions of this License, they do not ++excuse you from the conditions of this License. If you cannot convey a ++covered work so as to satisfy simultaneously your obligations under this ++License and any other pertinent obligations, then as a consequence you may ++not convey it at all. For example, if you agree to terms that obligate you ++to collect a royalty for further conveying from those to whom you convey ++the Program, the only way you could satisfy both those terms and this ++License would be to refrain entirely from conveying the Program. ++ ++ 13. Use with the GNU Affero General Public License. ++ ++ Notwithstanding any other provision of this License, you have ++permission to link or combine any covered work with a work licensed ++under version 3 of the GNU Affero General Public License into a single ++combined work, and to convey the resulting work. The terms of this ++License will continue to apply to the part which is the covered work, ++but the special requirements of the GNU Affero General Public License, ++section 13, concerning interaction through a network will apply to the ++combination as such. ++ ++ 14. Revised Versions of this License. ++ ++ The Free Software Foundation may publish revised and/or new versions of ++the GNU General Public License from time to time. Such new versions will ++be similar in spirit to the present version, but may differ in detail to ++address new problems or concerns. ++ ++ Each version is given a distinguishing version number. If the ++Program specifies that a certain numbered version of the GNU General ++Public License "or any later version" applies to it, you have the ++option of following the terms and conditions either of that numbered ++version or of any later version published by the Free Software ++Foundation. If the Program does not specify a version number of the ++GNU General Public License, you may choose any version ever published ++by the Free Software Foundation. ++ ++ If the Program specifies that a proxy can decide which future ++versions of the GNU General Public License can be used, that proxy's ++public statement of acceptance of a version permanently authorizes you ++to choose that version for the Program. ++ ++ Later license versions may give you additional or different ++permissions. However, no additional obligations are imposed on any ++author or copyright holder as a result of your choosing to follow a ++later version. ++ ++ 15. Disclaimer of Warranty. ++ ++ THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY ++APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT ++HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY ++OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, ++THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR ++PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM ++IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ++ALL NECESSARY SERVICING, REPAIR OR CORRECTION. ++ ++ 16. Limitation of Liability. ++ ++ IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING ++WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS ++THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY ++GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE ++USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF ++DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD ++PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), ++EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF ++SUCH DAMAGES. ++ ++ 17. Interpretation of Sections 15 and 16. ++ ++ If the disclaimer of warranty and limitation of liability provided ++above cannot be given local legal effect according to their terms, ++reviewing courts shall apply local law that most closely approximates ++an absolute waiver of all civil liability in connection with the ++Program, unless a warranty or assumption of liability accompanies a ++copy of the Program in return for a fee. ++ ++ END OF TERMS AND CONDITIONS ++ ++ How to Apply These Terms to Your New Programs ++ ++ If you develop a new program, and you want it to be of the greatest ++possible use to the public, the best way to achieve this is to make it ++free software which everyone can redistribute and change under these terms. ++ ++ To do so, attach the following notices to the program. It is safest ++to attach them to the start of each source file to most effectively ++state the exclusion of warranty; and each file should have at least ++the "copyright" line and a pointer to where the full notice is found. ++ ++ ++ Copyright (C) ++ ++ This program is free software: you can redistribute it and/or modify ++ it under the terms of the GNU General Public License as published by ++ the Free Software Foundation, either version 3 of the License, or ++ (at your option) any later version. ++ ++ This program is distributed in the hope that it will be useful, ++ but WITHOUT ANY WARRANTY; without even the implied warranty of ++ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++ GNU General Public License for more details. ++ ++ You should have received a copy of the GNU General Public License ++ along with this program. If not, see . ++ ++Also add information on how to contact you by electronic and paper mail. ++ ++ If the program does terminal interaction, make it output a short ++notice like this when it starts in an interactive mode: ++ ++ Copyright (C) ++ This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. ++ This is free software, and you are welcome to redistribute it ++ under certain conditions; type `show c' for details. ++ ++The hypothetical commands `show w' and `show c' should show the appropriate ++parts of the General Public License. Of course, your program's commands ++might be different; for a GUI interface, you would use an "about box". ++ ++ You should also get your employer (if you work as a programmer) or school, ++if any, to sign a "copyright disclaimer" for the program, if necessary. ++For more information on this, and how to apply and follow the GNU GPL, see ++. ++ ++ The GNU General Public License does not permit incorporating your program ++into proprietary programs. If your program is a subroutine library, you ++may consider it more useful to permit linking proprietary applications with ++the library. If this is what you want to do, use the GNU Lesser General ++Public License instead of this License. But first, please read ++. +--- a/transport/internet/kcptun/config.go ++++ b/transport/internet/kcptun/config.go +@@ -0,0 +1,43 @@ ++package kcptun ++ ++import ( ++ "github.com/xtls/xray-core/common" ++ "github.com/xtls/xray-core/transport/internet" ++ protocol "github.com/xtls/xray-core/transport/internet/kcptun/protocol" ++) ++ ++const protocolName = "kcptun" ++ ++func (c *Config) Build() (protocol.Config, error) { ++ cfg := protocol.Config{ ++ Key: c.Key, ++ Crypt: c.Crypt, ++ Mode: c.Mode, ++ Conn: int(c.Conn), ++ AutoExpire: int(c.Autoexpire), ++ ScavengeTTL: int(c.Scavengettl), ++ MTU: int(c.Mtu), ++ RateLimit: int(c.Ratelimit), ++ SndWnd: int(c.Sndwnd), ++ RcvWnd: int(c.Rcvwnd), ++ DataShard: int(c.Datashard), ++ ParityShard: int(c.Parityshard), ++ DSCP: int(c.Dscp), ++ NoComp: c.Nocomp, ++ AckNodelay: c.Acknodelay, ++ NoDelay: int(c.Nodelay), ++ Interval: int(c.Interval), ++ Resend: int(c.Resend), ++ NoCongestion: int(c.Nc), ++ SockBuf: int(c.Sockbuf), ++ SmuxVer: int(c.Smuxver), ++ SmuxBuf: int(c.Smuxbuf), ++ FrameSize: int(c.Framesize), ++ StreamBuf: int(c.Streambuf), ++ KeepAlive: int(c.Keepalive), ++ } ++ return protocol.Normalize(cfg) ++} ++func init() { ++ common.Must(internet.RegisterProtocolConfigCreator(protocolName, func() interface{} { return new(Config) })) ++} +--- a/transport/internet/kcptun/config.pb.go ++++ b/transport/internet/kcptun/config.pb.go +@@ -0,0 +1,343 @@ ++// Code generated by protoc-gen-go. DO NOT EDIT. ++// versions: ++// protoc-gen-go v1.36.12 ++// protoc v3.21.12 ++// source: transport/internet/kcptun/config.proto ++ ++package kcptun ++ ++import ( ++ protoreflect "google.golang.org/protobuf/reflect/protoreflect" ++ protoimpl "google.golang.org/protobuf/runtime/protoimpl" ++ reflect "reflect" ++ sync "sync" ++ unsafe "unsafe" ++) ++ ++const ( ++ // Verify that this generated code is sufficiently up-to-date. ++ _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) ++ // Verify that runtime/protoimpl is sufficiently up-to-date. ++ _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) ++) ++ ++type Config struct { ++ state protoimpl.MessageState `protogen:"open.v1"` ++ Key string `protobuf:"bytes,1,opt,name=key,proto3" json:"key,omitempty"` ++ Crypt string `protobuf:"bytes,2,opt,name=crypt,proto3" json:"crypt,omitempty"` ++ Mode string `protobuf:"bytes,3,opt,name=mode,proto3" json:"mode,omitempty"` ++ Conn int32 `protobuf:"varint,4,opt,name=conn,proto3" json:"conn,omitempty"` ++ Autoexpire int32 `protobuf:"varint,5,opt,name=autoexpire,proto3" json:"autoexpire,omitempty"` ++ Scavengettl int32 `protobuf:"varint,6,opt,name=scavengettl,proto3" json:"scavengettl,omitempty"` ++ Mtu int32 `protobuf:"varint,7,opt,name=mtu,proto3" json:"mtu,omitempty"` ++ Ratelimit int32 `protobuf:"varint,8,opt,name=ratelimit,proto3" json:"ratelimit,omitempty"` ++ Sndwnd int32 `protobuf:"varint,9,opt,name=sndwnd,proto3" json:"sndwnd,omitempty"` ++ Rcvwnd int32 `protobuf:"varint,10,opt,name=rcvwnd,proto3" json:"rcvwnd,omitempty"` ++ Datashard int32 `protobuf:"varint,11,opt,name=datashard,proto3" json:"datashard,omitempty"` ++ Parityshard int32 `protobuf:"varint,12,opt,name=parityshard,proto3" json:"parityshard,omitempty"` ++ Dscp int32 `protobuf:"varint,13,opt,name=dscp,proto3" json:"dscp,omitempty"` ++ Nocomp bool `protobuf:"varint,14,opt,name=nocomp,proto3" json:"nocomp,omitempty"` ++ Acknodelay bool `protobuf:"varint,15,opt,name=acknodelay,proto3" json:"acknodelay,omitempty"` ++ Nodelay int32 `protobuf:"varint,16,opt,name=nodelay,proto3" json:"nodelay,omitempty"` ++ Interval int32 `protobuf:"varint,17,opt,name=interval,proto3" json:"interval,omitempty"` ++ Resend int32 `protobuf:"varint,18,opt,name=resend,proto3" json:"resend,omitempty"` ++ Nc int32 `protobuf:"varint,19,opt,name=nc,proto3" json:"nc,omitempty"` ++ Sockbuf int32 `protobuf:"varint,20,opt,name=sockbuf,proto3" json:"sockbuf,omitempty"` ++ Smuxver int32 `protobuf:"varint,21,opt,name=smuxver,proto3" json:"smuxver,omitempty"` ++ Smuxbuf int32 `protobuf:"varint,22,opt,name=smuxbuf,proto3" json:"smuxbuf,omitempty"` ++ Framesize int32 `protobuf:"varint,23,opt,name=framesize,proto3" json:"framesize,omitempty"` ++ Streambuf int32 `protobuf:"varint,24,opt,name=streambuf,proto3" json:"streambuf,omitempty"` ++ Keepalive int32 `protobuf:"varint,25,opt,name=keepalive,proto3" json:"keepalive,omitempty"` ++ unknownFields protoimpl.UnknownFields ++ sizeCache protoimpl.SizeCache ++} ++ ++func (x *Config) Reset() { ++ *x = Config{} ++ mi := &file_transport_internet_kcptun_config_proto_msgTypes[0] ++ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ++ ms.StoreMessageInfo(mi) ++} ++ ++func (x *Config) String() string { ++ return protoimpl.X.MessageStringOf(x) ++} ++ ++func (*Config) ProtoMessage() {} ++ ++func (x *Config) ProtoReflect() protoreflect.Message { ++ mi := &file_transport_internet_kcptun_config_proto_msgTypes[0] ++ if x != nil { ++ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ++ if ms.LoadMessageInfo() == nil { ++ ms.StoreMessageInfo(mi) ++ } ++ return ms ++ } ++ return mi.MessageOf(x) ++} ++ ++// Deprecated: Use Config.ProtoReflect.Descriptor instead. ++func (*Config) Descriptor() ([]byte, []int) { ++ return file_transport_internet_kcptun_config_proto_rawDescGZIP(), []int{0} ++} ++ ++func (x *Config) GetKey() string { ++ if x != nil { ++ return x.Key ++ } ++ return "" ++} ++ ++func (x *Config) GetCrypt() string { ++ if x != nil { ++ return x.Crypt ++ } ++ return "" ++} ++ ++func (x *Config) GetMode() string { ++ if x != nil { ++ return x.Mode ++ } ++ return "" ++} ++ ++func (x *Config) GetConn() int32 { ++ if x != nil { ++ return x.Conn ++ } ++ return 0 ++} ++ ++func (x *Config) GetAutoexpire() int32 { ++ if x != nil { ++ return x.Autoexpire ++ } ++ return 0 ++} ++ ++func (x *Config) GetScavengettl() int32 { ++ if x != nil { ++ return x.Scavengettl ++ } ++ return 0 ++} ++ ++func (x *Config) GetMtu() int32 { ++ if x != nil { ++ return x.Mtu ++ } ++ return 0 ++} ++ ++func (x *Config) GetRatelimit() int32 { ++ if x != nil { ++ return x.Ratelimit ++ } ++ return 0 ++} ++ ++func (x *Config) GetSndwnd() int32 { ++ if x != nil { ++ return x.Sndwnd ++ } ++ return 0 ++} ++ ++func (x *Config) GetRcvwnd() int32 { ++ if x != nil { ++ return x.Rcvwnd ++ } ++ return 0 ++} ++ ++func (x *Config) GetDatashard() int32 { ++ if x != nil { ++ return x.Datashard ++ } ++ return 0 ++} ++ ++func (x *Config) GetParityshard() int32 { ++ if x != nil { ++ return x.Parityshard ++ } ++ return 0 ++} ++ ++func (x *Config) GetDscp() int32 { ++ if x != nil { ++ return x.Dscp ++ } ++ return 0 ++} ++ ++func (x *Config) GetNocomp() bool { ++ if x != nil { ++ return x.Nocomp ++ } ++ return false ++} ++ ++func (x *Config) GetAcknodelay() bool { ++ if x != nil { ++ return x.Acknodelay ++ } ++ return false ++} ++ ++func (x *Config) GetNodelay() int32 { ++ if x != nil { ++ return x.Nodelay ++ } ++ return 0 ++} ++ ++func (x *Config) GetInterval() int32 { ++ if x != nil { ++ return x.Interval ++ } ++ return 0 ++} ++ ++func (x *Config) GetResend() int32 { ++ if x != nil { ++ return x.Resend ++ } ++ return 0 ++} ++ ++func (x *Config) GetNc() int32 { ++ if x != nil { ++ return x.Nc ++ } ++ return 0 ++} ++ ++func (x *Config) GetSockbuf() int32 { ++ if x != nil { ++ return x.Sockbuf ++ } ++ return 0 ++} ++ ++func (x *Config) GetSmuxver() int32 { ++ if x != nil { ++ return x.Smuxver ++ } ++ return 0 ++} ++ ++func (x *Config) GetSmuxbuf() int32 { ++ if x != nil { ++ return x.Smuxbuf ++ } ++ return 0 ++} ++ ++func (x *Config) GetFramesize() int32 { ++ if x != nil { ++ return x.Framesize ++ } ++ return 0 ++} ++ ++func (x *Config) GetStreambuf() int32 { ++ if x != nil { ++ return x.Streambuf ++ } ++ return 0 ++} ++ ++func (x *Config) GetKeepalive() int32 { ++ if x != nil { ++ return x.Keepalive ++ } ++ return 0 ++} ++ ++var File_transport_internet_kcptun_config_proto protoreflect.FileDescriptor ++ ++const file_transport_internet_kcptun_config_proto_rawDesc = "" + ++ "\n" + ++ "&transport/internet/kcptun/config.proto\x12\x1exray.transport.internet.kcptun\"\x8c\x05\n" + ++ "\x06Config\x12\x10\n" + ++ "\x03key\x18\x01 \x01(\tR\x03key\x12\x14\n" + ++ "\x05crypt\x18\x02 \x01(\tR\x05crypt\x12\x12\n" + ++ "\x04mode\x18\x03 \x01(\tR\x04mode\x12\x12\n" + ++ "\x04conn\x18\x04 \x01(\x05R\x04conn\x12\x1e\n" + ++ "\n" + ++ "autoexpire\x18\x05 \x01(\x05R\n" + ++ "autoexpire\x12 \n" + ++ "\vscavengettl\x18\x06 \x01(\x05R\vscavengettl\x12\x10\n" + ++ "\x03mtu\x18\a \x01(\x05R\x03mtu\x12\x1c\n" + ++ "\tratelimit\x18\b \x01(\x05R\tratelimit\x12\x16\n" + ++ "\x06sndwnd\x18\t \x01(\x05R\x06sndwnd\x12\x16\n" + ++ "\x06rcvwnd\x18\n" + ++ " \x01(\x05R\x06rcvwnd\x12\x1c\n" + ++ "\tdatashard\x18\v \x01(\x05R\tdatashard\x12 \n" + ++ "\vparityshard\x18\f \x01(\x05R\vparityshard\x12\x12\n" + ++ "\x04dscp\x18\r \x01(\x05R\x04dscp\x12\x16\n" + ++ "\x06nocomp\x18\x0e \x01(\bR\x06nocomp\x12\x1e\n" + ++ "\n" + ++ "acknodelay\x18\x0f \x01(\bR\n" + ++ "acknodelay\x12\x18\n" + ++ "\anodelay\x18\x10 \x01(\x05R\anodelay\x12\x1a\n" + ++ "\binterval\x18\x11 \x01(\x05R\binterval\x12\x16\n" + ++ "\x06resend\x18\x12 \x01(\x05R\x06resend\x12\x0e\n" + ++ "\x02nc\x18\x13 \x01(\x05R\x02nc\x12\x18\n" + ++ "\asockbuf\x18\x14 \x01(\x05R\asockbuf\x12\x18\n" + ++ "\asmuxver\x18\x15 \x01(\x05R\asmuxver\x12\x18\n" + ++ "\asmuxbuf\x18\x16 \x01(\x05R\asmuxbuf\x12\x1c\n" + ++ "\tframesize\x18\x17 \x01(\x05R\tframesize\x12\x1c\n" + ++ "\tstreambuf\x18\x18 \x01(\x05R\tstreambuf\x12\x1c\n" + ++ "\tkeepalive\x18\x19 \x01(\x05R\tkeepaliveB5Z3github.com/xtls/xray-core/transport/internet/kcptunb\x06proto3" ++ ++var ( ++ file_transport_internet_kcptun_config_proto_rawDescOnce sync.Once ++ file_transport_internet_kcptun_config_proto_rawDescData []byte ++) ++ ++func file_transport_internet_kcptun_config_proto_rawDescGZIP() []byte { ++ file_transport_internet_kcptun_config_proto_rawDescOnce.Do(func() { ++ file_transport_internet_kcptun_config_proto_rawDescData = protoimpl.X.CompressGZIP(unsafe.Slice(unsafe.StringData(file_transport_internet_kcptun_config_proto_rawDesc), len(file_transport_internet_kcptun_config_proto_rawDesc))) ++ }) ++ return file_transport_internet_kcptun_config_proto_rawDescData ++} ++ ++var file_transport_internet_kcptun_config_proto_msgTypes = make([]protoimpl.MessageInfo, 1) ++var file_transport_internet_kcptun_config_proto_goTypes = []any{ ++ (*Config)(nil), // 0: xray.transport.internet.kcptun.Config ++} ++var file_transport_internet_kcptun_config_proto_depIdxs = []int32{ ++ 0, // [0:0] is the sub-list for method output_type ++ 0, // [0:0] is the sub-list for method input_type ++ 0, // [0:0] is the sub-list for extension type_name ++ 0, // [0:0] is the sub-list for extension extendee ++ 0, // [0:0] is the sub-list for field type_name ++} ++ ++func init() { file_transport_internet_kcptun_config_proto_init() } ++func file_transport_internet_kcptun_config_proto_init() { ++ if File_transport_internet_kcptun_config_proto != nil { ++ return ++ } ++ type x struct{} ++ out := protoimpl.TypeBuilder{ ++ File: protoimpl.DescBuilder{ ++ GoPackagePath: reflect.TypeOf(x{}).PkgPath(), ++ RawDescriptor: unsafe.Slice(unsafe.StringData(file_transport_internet_kcptun_config_proto_rawDesc), len(file_transport_internet_kcptun_config_proto_rawDesc)), ++ NumEnums: 0, ++ NumMessages: 1, ++ NumExtensions: 0, ++ NumServices: 0, ++ }, ++ GoTypes: file_transport_internet_kcptun_config_proto_goTypes, ++ DependencyIndexes: file_transport_internet_kcptun_config_proto_depIdxs, ++ MessageInfos: file_transport_internet_kcptun_config_proto_msgTypes, ++ }.Build() ++ File_transport_internet_kcptun_config_proto = out.File ++ file_transport_internet_kcptun_config_proto_goTypes = nil ++ file_transport_internet_kcptun_config_proto_depIdxs = nil ++} +--- a/transport/internet/kcptun/config.proto ++++ b/transport/internet/kcptun/config.proto +@@ -0,0 +1,30 @@ ++syntax = "proto3"; ++package xray.transport.internet.kcptun; ++option go_package = "github.com/xtls/xray-core/transport/internet/kcptun"; ++message Config { ++ string key = 1; ++ string crypt = 2; ++ string mode = 3; ++ int32 conn = 4; ++ int32 autoexpire = 5; ++ int32 scavengettl = 6; ++ int32 mtu = 7; ++ int32 ratelimit = 8; ++ int32 sndwnd = 9; ++ int32 rcvwnd = 10; ++ int32 datashard = 11; ++ int32 parityshard = 12; ++ int32 dscp = 13; ++ bool nocomp = 14; ++ bool acknodelay = 15; ++ int32 nodelay = 16; ++ int32 interval = 17; ++ int32 resend = 18; ++ int32 nc = 19; ++ int32 sockbuf = 20; ++ int32 smuxver = 21; ++ int32 smuxbuf = 22; ++ int32 framesize = 23; ++ int32 streambuf = 24; ++ int32 keepalive = 25; ++} +--- a/transport/internet/kcptun/dialer.go ++++ b/transport/internet/kcptun/dialer.go +@@ -0,0 +1,60 @@ ++package kcptun ++ ++import ( ++ "context" ++ "github.com/xtls/xray-core/common" ++ xnet "github.com/xtls/xray-core/common/net" ++ "github.com/xtls/xray-core/common/session" ++ "github.com/xtls/xray-core/transport/internet" ++ protocol "github.com/xtls/xray-core/transport/internet/kcptun/protocol" ++ "github.com/xtls/xray-core/transport/internet/stat" ++ "io" ++ "net" ++) ++ ++type connectedPacket struct{ net.Conn } ++ ++func (c *connectedPacket) ReadFrom(b []byte) (int, net.Addr, error) { ++ n, err := c.Read(b) ++ return n, c.RemoteAddr(), err ++} ++func (c *connectedPacket) WriteTo(b []byte, _ net.Addr) (int, error) { return c.Write(b) } ++ ++func Dial(ctx context.Context, dest xnet.Destination, settings *internet.MemoryStreamConfig) (stat.Connection, error) { ++ cfg, err := settings.ProtocolSettings.(*Config).Build() ++ if err != nil { ++ return nil, err ++ } ++ dest.Network = xnet.Network_UDP ++ key := "kcptun:" + dest.String() ++ if outbounds := session.OutboundsFromContext(ctx); len(outbounds) > 0 { ++ if gateway := outbounds[len(outbounds)-1].Gateway; gateway != nil { ++ key += "/" + gateway.String() ++ } ++ } ++ owner, err := settings.TransportClient(key, func() (io.Closer, error) { return protocol.NewClient(cfg) }) ++ if err != nil { ++ return nil, err ++ } ++ stream, err := owner.(*protocol.Client).OpenStream(ctx, func(ctx context.Context) (net.PacketConn, net.Addr, error) { ++ var conn net.Conn ++ var err error ++ if settings.FinalMask != nil { ++ conn, err = settings.FinalMask.DialUDP(ctx, dest) ++ } else { ++ conn, err = internet.DialSystem(ctx, dest, settings.SocketSettings) ++ } ++ if err != nil { ++ return nil, nil, err ++ } ++ if pc, ok := conn.(*xnet.PacketConnWrapper); ok { ++ return pc.PacketConn, pc.Dest, nil ++ } ++ return &connectedPacket{Conn: conn}, conn.RemoteAddr(), nil ++ }) ++ if err != nil { ++ return nil, err ++ } ++ return &streamConn{Conn: stream}, nil ++} ++func init() { common.Must(internet.RegisterTransportDialer(protocolName, Dial)) } +--- a/transport/internet/kcptun/hub.go ++++ b/transport/internet/kcptun/hub.go +@@ -0,0 +1,38 @@ ++package kcptun ++ ++import ( ++ "context" ++ "github.com/xtls/xray-core/common" ++ "github.com/xtls/xray-core/common/errors" ++ xnet "github.com/xtls/xray-core/common/net" ++ "github.com/xtls/xray-core/transport/internet" ++ protocol "github.com/xtls/xray-core/transport/internet/kcptun/protocol" ++ "net" ++) ++ ++func Listen(ctx context.Context, address xnet.Address, port xnet.Port, settings *internet.MemoryStreamConfig, handler internet.ConnHandler) (internet.Listener, error) { ++ if address.Family().IsDomain() || port == 0 { ++ return nil, errors.New("kcptun: UDP listener requires an IP and port") ++ } ++ cfg, err := settings.ProtocolSettings.(*Config).Build() ++ if err != nil { ++ return nil, err ++ } ++ var pc net.PacketConn ++ addr := &net.UDPAddr{IP: address.IP(), Port: int(port)} ++ if settings.FinalMask != nil { ++ pc, err = settings.FinalMask.ListenPacket(ctx, addr) ++ } else { ++ pc, err = internet.ListenSystemPacket(ctx, addr, settings.SocketSettings) ++ } ++ if err != nil { ++ return nil, err ++ } ++ server, err := protocol.NewServer(pc, cfg, func(conn net.Conn) { handler(&streamConn{Conn: conn}) }) ++ if err != nil { ++ return nil, err ++ } ++ errors.LogInfo(ctx, "listening Kcptun on ", server.Addr()) ++ return server, nil ++} ++func init() { common.Must(internet.RegisterTransportListener(protocolName, Listen)) } +--- a/transport/internet/kcptun/protocol/client.go ++++ b/transport/internet/kcptun/protocol/client.go +@@ -0,0 +1,135 @@ ++// Adapted from MetaCubeX/mihomo v1.19.32; GPL-3.0-or-later. ++package kcptun ++ ++import ( ++ "context" ++ kcp "github.com/metacubex/kcp-go" ++ "github.com/metacubex/smux" ++ "math/rand/v2" ++ "net" ++ "sync" ++ "time" ++) ++ ++type DialFn func(context.Context) (net.PacketConn, net.Addr, error) ++type timedSession struct { ++ session *smux.Session ++ expiry time.Time ++} ++type Client struct { ++ config Config ++ block kcp.BlockCrypt ++ ctx context.Context ++ cancel context.CancelFunc ++ done chan struct{} ++ mu sync.Mutex ++ slots []timedSession ++ sessions map[*smux.Session]time.Time ++ next int ++} ++ ++func NewClient(cfg Config) (*Client, error) { ++ cfg, err := Normalize(cfg) ++ if err != nil { ++ return nil, err ++ } ++ ctx, cancel := context.WithCancel(context.Background()) ++ c := &Client{config: cfg, block: cfg.NewBlock(), ctx: ctx, cancel: cancel, done: make(chan struct{}), slots: make([]timedSession, cfg.Conn), sessions: make(map[*smux.Session]time.Time)} ++ go c.scavenge() ++ return c, nil ++} ++func (c *Client) Close() error { c.cancel(); <-c.done; return nil } ++func (c *Client) scavenge() { ++ ticker := time.NewTicker(time.Second) ++ defer ticker.Stop() ++ defer close(c.done) ++ for { ++ select { ++ case <-c.ctx.Done(): ++ c.mu.Lock() ++ for session := range c.sessions { ++ session.Close() ++ } ++ clear(c.sessions) ++ c.mu.Unlock() ++ return ++ case now := <-ticker.C: ++ c.mu.Lock() ++ for session, expiry := range c.sessions { ++ if session.IsClosed() || (!expiry.IsZero() && now.After(expiry)) { ++ session.Close() ++ delete(c.sessions, session) ++ } ++ } ++ c.mu.Unlock() ++ } ++ } ++} ++func (c *Client) createConn(ctx context.Context, dial DialFn) (*smux.Session, error) { ++ pc, addr, err := dial(ctx) ++ if err != nil { ++ return nil, err ++ } ++ conn, err := kcp.NewConn4(rand.Uint32(), addr, c.block, c.config.DataShard, c.config.ParityShard, true, pc) ++ if err != nil { ++ pc.Close() ++ return nil, err ++ } ++ c.config.Apply(conn) ++ _ = conn.SetDSCP(c.config.DSCP) ++ _ = conn.SetReadBuffer(c.config.SockBuf) ++ _ = conn.SetWriteBuffer(c.config.SockBuf) ++ var raw net.Conn = conn ++ if !c.config.NoComp { ++ raw = NewCompStream(raw) ++ } ++ mux, err := smux.Client(raw, c.config.SmuxConfig()) ++ if err != nil { ++ raw.Close() ++ return nil, err ++ } ++ return mux, nil ++} ++func (c *Client) OpenStream(ctx context.Context, dial DialFn) (*smux.Stream, error) { ++ if err := ctx.Err(); err != nil { ++ return nil, err ++ } ++ ctx, cancel := context.WithCancel(ctx) ++ defer cancel() ++ stop := context.AfterFunc(c.ctx, cancel) ++ defer stop() ++ c.mu.Lock() ++ if c.ctx.Err() != nil { ++ c.mu.Unlock() ++ return nil, net.ErrClosed ++ } ++ idx := c.next ++ c.next = (c.next + 1) % len(c.slots) ++ slot := &c.slots[idx] ++ if slot.session == nil || slot.session.IsClosed() || (c.config.AutoExpire > 0 && time.Now().After(slot.expiry)) { ++ mux, err := c.createConn(ctx, dial) ++ if err != nil { ++ c.mu.Unlock() ++ return nil, err ++ } ++ slot.session = mux ++ expiry := time.Time{} ++ if c.config.AutoExpire > 0 { ++ slot.expiry = time.Now().Add(time.Duration(c.config.AutoExpire) * time.Second) ++ expiry = slot.expiry.Add(time.Duration(c.config.ScavengeTTL) * time.Second) ++ } ++ c.sessions[mux] = expiry ++ } ++ mux := slot.session ++ c.mu.Unlock() ++ stream, err := mux.OpenStream() ++ if err != nil { ++ mux.Close() ++ return nil, err ++ } ++ if err := ctx.Err(); err != nil { ++ stream.Close() ++ return nil, err ++ } ++ return stream, nil ++} +--- a/transport/internet/kcptun/protocol/common.go ++++ b/transport/internet/kcptun/protocol/common.go +@@ -0,0 +1,147 @@ ++// Adapted from MetaCubeX/mihomo v1.19.32; GPL-3.0-or-later. ++package kcptun ++ ++import ( ++ "crypto/sha1" ++ ++ "github.com/metacubex/kcp-go" ++ "golang.org/x/crypto/pbkdf2" ++) ++ ++const ( ++ // SALT is use for pbkdf2 key expansion ++ SALT = "kcp-go" ++ // maximum supported smux version ++ maxSmuxVer = 2 ++ // scavenger check period ++ scavengePeriod = 5 ++) ++ ++type Config struct { ++ Key string `json:"key"` ++ Crypt string `json:"crypt"` ++ Mode string `json:"mode"` ++ Conn int `json:"conn"` ++ AutoExpire int `json:"autoexpire"` ++ ScavengeTTL int `json:"scavengettl"` ++ MTU int `json:"mtu"` ++ RateLimit int `json:"ratelimit"` ++ SndWnd int `json:"sndwnd"` ++ RcvWnd int `json:"rcvwnd"` ++ DataShard int `json:"datashard"` ++ ParityShard int `json:"parityshard"` ++ DSCP int `json:"dscp"` ++ NoComp bool `json:"nocomp"` ++ AckNodelay bool `json:"acknodelay"` ++ NoDelay int `json:"nodelay"` ++ Interval int `json:"interval"` ++ Resend int `json:"resend"` ++ NoCongestion int `json:"nc"` ++ SockBuf int `json:"sockbuf"` ++ SmuxVer int `json:"smuxver"` ++ SmuxBuf int `json:"smuxbuf"` ++ FrameSize int `json:"framesize"` ++ StreamBuf int `json:"streambuf"` ++ KeepAlive int `json:"keepalive"` ++} ++ ++func (config *Config) FillDefaults() { ++ if config.Key == "" { ++ config.Key = "it's a secrect" ++ } ++ if config.Crypt == "" { ++ config.Crypt = "aes" ++ } ++ if config.Mode == "" { ++ config.Mode = "fast" ++ } ++ if config.Conn == 0 { ++ config.Conn = 1 ++ } ++ if config.ScavengeTTL == 0 { ++ config.ScavengeTTL = 600 ++ } ++ if config.MTU == 0 { ++ config.MTU = 1350 ++ } ++ if config.SndWnd == 0 { ++ config.SndWnd = 128 ++ } ++ if config.RcvWnd == 0 { ++ config.RcvWnd = 512 ++ } ++ if config.DataShard == 0 { ++ config.DataShard = 10 ++ } ++ if config.ParityShard == 0 { ++ config.ParityShard = 3 ++ } ++ if config.Interval == 0 { ++ config.Interval = 50 ++ } ++ if config.SockBuf == 0 { ++ config.SockBuf = 4194304 ++ } ++ if config.SmuxVer == 0 { ++ config.SmuxVer = 1 ++ } ++ if config.SmuxBuf == 0 { ++ config.SmuxBuf = 4194304 ++ } ++ if config.FrameSize == 0 { ++ config.FrameSize = 8192 ++ } ++ if config.StreamBuf == 0 { ++ config.StreamBuf = 2097152 ++ } ++ if config.KeepAlive == 0 { ++ config.KeepAlive = 10 ++ } ++ switch config.Mode { ++ case "normal": ++ config.NoDelay, config.Interval, config.Resend, config.NoCongestion = 0, 40, 2, 1 ++ case "fast": ++ config.NoDelay, config.Interval, config.Resend, config.NoCongestion = 0, 30, 2, 1 ++ case "fast2": ++ config.NoDelay, config.Interval, config.Resend, config.NoCongestion = 1, 20, 2, 1 ++ case "fast3": ++ config.NoDelay, config.Interval, config.Resend, config.NoCongestion = 1, 10, 2, 1 ++ } ++ ++} ++ ++func (config *Config) NewBlock() (block kcp.BlockCrypt) { ++ pass := pbkdf2.Key([]byte(config.Key), []byte(SALT), 4096, 32, sha1.New) ++ switch config.Crypt { ++ case "null": ++ block = nil ++ case "tea": ++ block, _ = kcp.NewTEABlockCrypt(pass[:16]) ++ case "xor": ++ block, _ = kcp.NewSimpleXORBlockCrypt(pass) ++ case "none": ++ block, _ = kcp.NewNoneBlockCrypt(pass) ++ case "aes-128": ++ block, _ = kcp.NewAESBlockCrypt(pass[:16]) ++ case "aes-192": ++ block, _ = kcp.NewAESBlockCrypt(pass[:24]) ++ case "blowfish": ++ block, _ = kcp.NewBlowfishBlockCrypt(pass) ++ case "twofish": ++ block, _ = kcp.NewTwofishBlockCrypt(pass) ++ case "cast5": ++ block, _ = kcp.NewCast5BlockCrypt(pass[:16]) ++ case "3des": ++ block, _ = kcp.NewTripleDESBlockCrypt(pass[:24]) ++ case "xtea": ++ block, _ = kcp.NewXTEABlockCrypt(pass[:16]) ++ case "salsa20": ++ block, _ = kcp.NewSalsa20BlockCrypt(pass) ++ case "aes-128-gcm": ++ block, _ = kcp.NewAESGCMCrypt(pass[:16]) ++ default: ++ config.Crypt = "aes" ++ block, _ = kcp.NewAESBlockCrypt(pass) ++ } ++ return ++} +--- a/transport/internet/kcptun/protocol/comp.go ++++ b/transport/internet/kcptun/protocol/comp.go +@@ -0,0 +1,64 @@ ++// Adapted from MetaCubeX/mihomo v1.19.32; GPL-3.0-or-later. ++package kcptun ++ ++import ( ++ "net" ++ "time" ++ ++ "github.com/golang/snappy" ++) ++ ++// CompStream is a net.Conn wrapper that compresses data using snappy ++type CompStream struct { ++ conn net.Conn ++ w *snappy.Writer ++ r *snappy.Reader ++} ++ ++func (c *CompStream) Read(p []byte) (n int, err error) { ++ return c.r.Read(p) ++} ++ ++func (c *CompStream) Write(p []byte) (n int, err error) { ++ if _, err := c.w.Write(p); err != nil { ++ return 0, err ++ } ++ ++ if err := c.w.Flush(); err != nil { ++ return 0, err ++ } ++ return len(p), err ++} ++ ++func (c *CompStream) Close() error { ++ return c.conn.Close() ++} ++ ++func (c *CompStream) LocalAddr() net.Addr { ++ return c.conn.LocalAddr() ++} ++ ++func (c *CompStream) RemoteAddr() net.Addr { ++ return c.conn.RemoteAddr() ++} ++ ++func (c *CompStream) SetDeadline(t time.Time) error { ++ return c.conn.SetDeadline(t) ++} ++ ++func (c *CompStream) SetReadDeadline(t time.Time) error { ++ return c.conn.SetReadDeadline(t) ++} ++ ++func (c *CompStream) SetWriteDeadline(t time.Time) error { ++ return c.conn.SetWriteDeadline(t) ++} ++ ++// NewCompStream creates a new stream that compresses data using snappy ++func NewCompStream(conn net.Conn) *CompStream { ++ c := new(CompStream) ++ c.conn = conn ++ c.w = snappy.NewBufferedWriter(conn) ++ c.r = snappy.NewReader(conn) ++ return c ++} +--- a/transport/internet/kcptun/protocol/doc.go ++++ b/transport/internet/kcptun/protocol/doc.go +@@ -0,0 +1,6 @@ ++// Adapted from MetaCubeX/mihomo v1.19.32; GPL-3.0-or-later. ++// Package kcptun copy and modify from: ++// https://github.com/xtaci/kcptun/tree/f54f35175bed6ddda4e47aa35c9d7ae8b7e7eb85 ++// adopt for mihomo ++// without SM4,QPP,tcpraw support ++package kcptun +--- a/transport/internet/kcptun/protocol/server.go ++++ b/transport/internet/kcptun/protocol/server.go +@@ -0,0 +1,95 @@ ++// Adapted from MetaCubeX/mihomo v1.19.32; GPL-3.0-or-later. ++package kcptun ++ ++import ( ++ kcp "github.com/metacubex/kcp-go" ++ "github.com/metacubex/smux" ++ "net" ++ "sync" ++) ++ ++type Server struct { ++ config Config ++ listener *kcp.Listener ++ pc net.PacketConn ++ mu sync.Mutex ++ closed bool ++ connections map[*kcp.UDPSession]struct{} ++ wg sync.WaitGroup ++ once sync.Once ++} ++ ++func NewServer(pc net.PacketConn, cfg Config, handler func(net.Conn)) (*Server, error) { ++ cfg, err := Normalize(cfg) ++ if err != nil { ++ pc.Close() ++ return nil, err ++ } ++ listener, err := kcp.ServeConn(cfg.NewBlock(), cfg.DataShard, cfg.ParityShard, pc) ++ if err != nil { ++ pc.Close() ++ return nil, err ++ } ++ _ = listener.SetDSCP(cfg.DSCP) ++ _ = listener.SetReadBuffer(cfg.SockBuf) ++ _ = listener.SetWriteBuffer(cfg.SockBuf) ++ s := &Server{config: cfg, listener: listener, pc: pc, connections: make(map[*kcp.UDPSession]struct{})} ++ s.wg.Add(1) ++ go s.serve(handler) ++ return s, nil ++} ++func (s *Server) Addr() net.Addr { return s.pc.LocalAddr() } ++func (s *Server) Close() error { ++ s.once.Do(func() { ++ s.mu.Lock() ++ s.closed = true ++ s.listener.Close() ++ s.pc.Close() ++ for conn := range s.connections { ++ conn.Close() ++ } ++ s.mu.Unlock() ++ }) ++ s.wg.Wait() ++ return nil ++} ++func (s *Server) serve(handler func(net.Conn)) { ++ defer s.wg.Done() ++ for { ++ conn, err := s.listener.AcceptKCP() ++ if err != nil { ++ return ++ } ++ s.mu.Lock() ++ if s.closed { ++ s.mu.Unlock() ++ conn.Close() ++ return ++ } ++ s.connections[conn] = struct{}{} ++ s.wg.Add(1) ++ s.mu.Unlock() ++ go s.serveConn(conn, handler) ++ } ++} ++func (s *Server) serveConn(conn *kcp.UDPSession, handler func(net.Conn)) { ++ defer s.wg.Done() ++ defer func() { conn.Close(); s.mu.Lock(); delete(s.connections, conn); s.mu.Unlock() }() ++ s.config.Apply(conn) ++ var raw net.Conn = conn ++ if !s.config.NoComp { ++ raw = NewCompStream(raw) ++ } ++ mux, err := smux.Server(raw, s.config.SmuxConfig()) ++ if err != nil { ++ return ++ } ++ defer mux.Close() ++ for { ++ stream, err := mux.AcceptStream() ++ if err != nil { ++ return ++ } ++ go handler(stream) ++ } ++} +--- a/transport/internet/kcptun/protocol/settings.go ++++ b/transport/internet/kcptun/protocol/settings.go +@@ -0,0 +1,69 @@ ++package kcptun ++ ++import ( ++ "fmt" ++ kcp "github.com/metacubex/kcp-go" ++ "github.com/metacubex/smux" ++ "time" ++) ++ ++// Normalize preserves Mihomo defaults and rejects invalid settings before opening sockets. ++func Normalize(c Config) (Config, error) { ++ c.FillDefaults() ++ switch c.Crypt { ++ case "aes", "aes-128", "aes-192", "aes-128-gcm", "null", "none", "tea", "xor", "blowfish", "twofish", "cast5", "3des", "xtea", "salsa20": ++ default: ++ return c, fmt.Errorf("kcptun: unknown crypt %q", c.Crypt) ++ } ++ switch c.Mode { ++ case "normal", "fast", "fast2", "fast3", "manual": ++ default: ++ return c, fmt.Errorf("kcptun: unknown mode %q", c.Mode) ++ } ++ if c.Conn < 1 || c.Conn > 256 { ++ return c, fmt.Errorf("kcptun: conn must be 1..256") ++ } ++ if c.MTU < 256 || c.MTU > 1500 { ++ return c, fmt.Errorf("kcptun: mtu must be 256..1500") ++ } ++ if !(c.DataShard == -1 && c.ParityShard == -1) && (c.DataShard < 1 || c.ParityShard < 1 || c.DataShard+c.ParityShard > 256) { ++ return c, fmt.Errorf("kcptun: invalid FEC shard counts") ++ } ++ if c.SndWnd < 1 || c.RcvWnd < 1 || c.SndWnd > 65535 || c.RcvWnd > 65535 { ++ return c, fmt.Errorf("kcptun: invalid windows") ++ } ++ if c.AutoExpire < 0 || c.ScavengeTTL < 0 || c.RateLimit < 0 || c.SockBuf < 1 || c.SockBuf > 1<<28 || c.DSCP < 0 || c.DSCP > 63 { ++ return c, fmt.Errorf("kcptun: invalid socket or expiry settings") ++ } ++ if c.NoDelay < 0 || c.NoDelay > 1 || c.NoCongestion < 0 || c.NoCongestion > 1 || c.Interval < 1 || c.Interval > 5000 || c.Resend < 0 || c.Resend > 2 { ++ return c, fmt.Errorf("kcptun: invalid manual timing") ++ } ++ if c.KeepAlive < 1 || c.KeepAlive > 3600 || c.SmuxBuf > 1<<28 { ++ return c, fmt.Errorf("kcptun: invalid smux limits") ++ } ++ if err := smux.VerifyConfig(c.SmuxConfig()); err != nil { ++ return c, fmt.Errorf("kcptun: %w", err) ++ } ++ return c, nil ++} ++func (c *Config) SmuxConfig() *smux.Config { ++ cfg := smux.DefaultConfig() ++ cfg.Version = c.SmuxVer ++ cfg.MaxReceiveBuffer = c.SmuxBuf ++ cfg.MaxStreamBuffer = c.StreamBuf ++ cfg.MaxFrameSize = c.FrameSize ++ cfg.KeepAliveInterval = time.Duration(c.KeepAlive) * time.Second ++ if cfg.KeepAliveInterval >= cfg.KeepAliveTimeout { ++ cfg.KeepAliveTimeout = 3 * cfg.KeepAliveInterval ++ } ++ return cfg ++} ++func (c *Config) Apply(conn *kcp.UDPSession) { ++ conn.SetStreamMode(true) ++ conn.SetWriteDelay(false) ++ conn.SetNoDelay(c.NoDelay, c.Interval, c.Resend, c.NoCongestion) ++ conn.SetWindowSize(c.SndWnd, c.RcvWnd) ++ conn.SetMtu(c.MTU) ++ conn.SetACKNoDelay(c.AckNodelay) ++ conn.SetRateLimit(uint32(c.RateLimit)) ++} +--- a/transport/internet/kcptun/stream.go ++++ b/transport/internet/kcptun/stream.go +@@ -0,0 +1,15 @@ ++package kcptun ++ ++import "net" ++ ++// Kcptun carries a reliable stream; Xray's stream protocols expect TCP addresses. ++type streamConn struct{ net.Conn } ++ ++func tcpAddr(addr net.Addr) net.Addr { ++ if udp, ok := addr.(*net.UDPAddr); ok { ++ return &net.TCPAddr{IP: udp.IP, Port: udp.Port, Zone: udp.Zone} ++ } ++ return addr ++} ++func (c *streamConn) LocalAddr() net.Addr { return tcpAddr(c.Conn.LocalAddr()) } ++func (c *streamConn) RemoteAddr() net.Addr { return tcpAddr(c.Conn.RemoteAddr()) } +--- a/transport/internet/memory_settings.go ++++ b/transport/internet/memory_settings.go +@@ -12,6 +12,7 @@ + + // MemoryStreamConfig is a parsed form of StreamConfig. It is used to reduce the number of Protobuf parses. + type MemoryStreamConfig struct { ++ clients transportClients + Destination *net.Destination + ProtocolName string + ProtocolSettings interface{} +--- a/transport/internet/transport_clients.go ++++ b/transport/internet/transport_clients.go +@@ -0,0 +1,57 @@ ++package internet ++ ++import ( ++ "errors" ++ "io" ++ "sync" ++) ++ ++// transportClients owns pooled transport connections for a single outbound. ++// Keeping ownership here prevents sharing credentials or sockets across outbounds. ++type transportClients struct { ++ mu sync.Mutex ++ closed bool ++ values map[string]io.Closer ++} ++ ++func (s *MemoryStreamConfig) TransportClient(key string, create func() (io.Closer, error)) (io.Closer, error) { ++ s.clients.mu.Lock() ++ defer s.clients.mu.Unlock() ++ if s.clients.closed { ++ return nil, io.ErrClosedPipe ++ } ++ if value := s.clients.values[key]; value != nil { ++ return value, nil ++ } ++ if len(s.clients.values) >= 256 { ++ return nil, errors.New("too many transport client destinations") ++ } ++ value, err := create() ++ if err != nil { ++ return nil, err ++ } ++ if s.clients.values == nil { ++ s.clients.values = make(map[string]io.Closer) ++ } ++ s.clients.values[key] = value ++ return value, nil ++} ++ ++func (s *MemoryStreamConfig) Close() error { ++ if s == nil { ++ return nil ++ } ++ s.clients.mu.Lock() ++ s.clients.closed = true ++ values := s.clients.values ++ s.clients.values = nil ++ s.clients.mu.Unlock() ++ var result error ++ for _, value := range values { ++ result = errors.Join(result, value.Close()) ++ } ++ if s.DownloadSettings != nil { ++ result = errors.Join(result, s.DownloadSettings.Close()) ++ } ++ return result ++} diff --git a/xray-core/patches/190-an7581-eip93-aes-gcm.patch b/xray-core/patches/190-an7581-eip93-aes-gcm.patch new file mode 100644 index 000000000..0fcff739a --- /dev/null +++ b/xray-core/patches/190-an7581-eip93-aes-gcm.patch @@ -0,0 +1,515 @@ +From: coolsnowwolf +Subject: [PATCH] build: add AN7581-only EIP93 hybrid AES-GCM overlay + +Keep the shared Go toolchain unchanged. Select the AF_ALG backend only on +AN7581 without ARM AES instructions, with per-key verification and software +fallback. AN7583 remains on the normal path pending separate measurements. + +Signed-off-by: coolsnowwolf + +--- a/tools/eip93/eip93_linux_arm64.go ++++ b/tools/eip93/eip93_linux_arm64.go +@@ -0,0 +1,294 @@ ++// Copyright 2026 coolsnowwolf ++// SPDX-License-Identifier: BSD-3-Clause ++//go:build linux && arm64 && !purego ++ ++package gcm ++ ++import ( ++ "bytes" ++ "crypto/internal/fips140" ++ "crypto/internal/fips140/aes" ++ "crypto/internal/fips140deps/cpu" ++ "encoding/binary" ++ "os" ++ "runtime" ++ "sync" ++ "sync/atomic" ++ "syscall" ++ "unsafe" ++) ++ ++const eip93SOL = 279 ++const eip93Min = 4096 ++const eip93Max = 32768 ++const eip93MaxSockets = 128 ++ ++var eip93Detected sync.Once ++var eip93Allowed bool ++var eip93Sockets atomic.Int32 ++var eip93Notice sync.Once ++ ++func eip93Compatible(data []byte) bool { ++ if len(data) == 0 || data[len(data)-1] != 0 { ++ return false ++ } ++ found := false ++ for _, s := range bytes.Split(data, []byte{0}) { ++ switch string(s) { ++ case "airoha,an7583", "airoha,en7583": ++ return false ++ case "airoha,an7581", "airoha,en7581": ++ found = true ++ } ++ } ++ return found ++} ++ ++func eip93Enabled() bool { ++ eip93Detected.Do(func() { ++ if fips140.Enabled || cpu.ARM64HasAES || os.Getenv("XRAY_EIP93") == "off" { ++ return ++ } ++ for _, path := range []string{"/sys/firmware/devicetree/base/compatible", "/proc/device-tree/compatible"} { ++ b, err := os.ReadFile(path) ++ if err == nil { ++ eip93Allowed = eip93Compatible(b) ++ return ++ } ++ } ++ }) ++ return eip93Allowed ++} ++ ++type eip93State struct { ++ mu sync.Mutex ++ key [32]byte ++ keyLen int ++ fd int ++ disabled bool ++ input, output []byte ++} ++ ++func newEIP93State(g *GCM) *eip93State { ++ if g.nonceSize != 12 || g.tagSize != 16 || !eip93Enabled() { ++ return nil ++ } ++ // Only the generic ARM64 schedule is used: its first Nk big-endian words ++ // are the original AES key. Never interpret an instruction-specific schedule. ++ schedule := aes.EncryptionKeySchedule(&g.cipher) ++ keyLen := (len(schedule)/4 - 7) * 4 ++ if keyLen != 16 && keyLen != 24 && keyLen != 32 { ++ return nil ++ } ++ s := &eip93State{keyLen: keyLen, fd: -1} ++ for i := 0; i < keyLen/4; i++ { ++ binary.BigEndian.PutUint32(s.key[i*4:], schedule[i]) ++ } ++ runtime.SetFinalizer(s, func(s *eip93State) { s.close(); clear(s.key[:]) }) ++ return s ++} ++ ++func (s *eip93State) close() { ++ if s.fd >= 0 { ++ syscall.Close(s.fd) ++ s.fd = -1 ++ eip93Sockets.Add(-1) ++ } ++ clear(s.input) ++ clear(s.output) ++} ++ ++func eip93Cmsg(kind int32, data []byte) []byte { ++ b := make([]byte, syscall.CmsgSpace(len(data))) ++ h := (*syscall.Cmsghdr)(unsafe.Pointer(&b[0])) ++ h.Level = eip93SOL ++ h.Type = kind ++ h.SetLen(syscall.CmsgLen(len(data))) ++ copy(b[syscall.CmsgLen(0):], data) ++ return b ++} ++func eip93U32(v uint32) []byte { b := make([]byte, 4); binary.LittleEndian.PutUint32(b, v); return b } ++ ++// Linux 5.4 uses the CryptoAPI GHASH driver; Linux 7.3 uses the library. ++func eip93Bind(bind func(string) syscall.Errno) syscall.Errno { ++ var errno syscall.Errno ++ for _, name := range []string{ ++ "gcm_base(ctr(aes-eip93),ghash-generic)", ++ "gcm_base(ctr(aes-eip93),ghash-lib)", ++ } { ++ errno = bind(name) ++ if errno == 0 { ++ return 0 ++ } ++ } ++ return errno ++} ++ ++func (s *eip93State) connect() error { ++ if eip93Sockets.Add(1) > eip93MaxSockets { ++ eip93Sockets.Add(-1) ++ return syscall.EMFILE ++ } ++ success := false ++ defer func() { ++ if !success { ++ eip93Sockets.Add(-1) ++ } ++ }() ++ fd, err := syscall.Socket(38, syscall.SOCK_SEQPACKET|syscall.SOCK_CLOEXEC, 0) ++ if err != nil { ++ return err ++ } ++ defer syscall.Close(fd) ++ var sa [88]byte ++ binary.LittleEndian.PutUint16(sa[:], 38) ++ copy(sa[2:16], "aead") ++ // Try both exact EIP93 compositions even when a kernel policy or driver ++ // rejects the first one. Never substitute a generic software CTR driver. ++ errno := eip93Bind(func(name string) syscall.Errno { ++ clear(sa[24:]) ++ copy(sa[24:], name) ++ _, _, errno := syscall.Syscall(syscall.SYS_BIND, uintptr(fd), uintptr(unsafe.Pointer(&sa[0])), uintptr(len(sa))) ++ return errno ++ }) ++ if errno != 0 { ++ return errno ++ } ++ _, _, errno = syscall.Syscall6(syscall.SYS_SETSOCKOPT, uintptr(fd), eip93SOL, 1, uintptr(unsafe.Pointer(&s.key[0])), uintptr(s.keyLen), 0) ++ runtime.KeepAlive(s) ++ if errno != 0 { ++ return errno ++ } ++ _, _, errno = syscall.Syscall6(syscall.SYS_SETSOCKOPT, uintptr(fd), eip93SOL, 5, 0, 16, 0) ++ if errno != 0 { ++ return errno ++ } ++ op, _, errno := syscall.Syscall6(syscall.SYS_ACCEPT4, uintptr(fd), 0, 0, syscall.SOCK_CLOEXEC, 0, 0) ++ if errno != 0 { ++ return errno ++ } ++ for _, option := range []int{syscall.SO_RCVTIMEO, syscall.SO_SNDTIMEO} { ++ if err = syscall.SetsockoptTimeval(int(op), syscall.SOL_SOCKET, option, &syscall.Timeval{Sec: 1}); err != nil { ++ syscall.Close(int(op)) ++ return err ++ } ++ } ++ s.fd = int(op) ++ success = true ++ clear(s.key[:]) ++ return nil ++} ++ ++// exchange never exposes plaintext until the kernel has authenticated it. ++// It also never modifies the caller's buffers before a complete operation, ++// so a syscall failure can safely fall back to the original implementation. ++func (s *eip93State) exchange(nonce, src, aad []byte, decrypt bool) ([]byte, error) { ++ inLen := len(aad) + len(src) ++ outLen := inLen + 16 ++ if decrypt { ++ outLen = inLen - 16 ++ } ++ if cap(s.input) < inLen { ++ s.input = make([]byte, inLen) ++ } else { ++ s.input = s.input[:inLen] ++ } ++ if cap(s.output) < outLen { ++ s.output = make([]byte, outLen) ++ } else { ++ s.output = s.output[:outLen] ++ } ++ copy(s.input, aad) ++ copy(s.input[len(aad):], src) ++ op := uint32(1) ++ if decrypt { ++ op = 0 ++ } ++ ctl := eip93Cmsg(3, eip93U32(op)) ++ iv := append(eip93U32(12), nonce...) ++ ctl = append(ctl, eip93Cmsg(2, iv)...) ++ ctl = append(ctl, eip93Cmsg(4, eip93U32(uint32(len(aad))))...) ++ n, err := syscall.SendmsgN(s.fd, s.input, ctl, nil, 0) ++ if err != nil { ++ return nil, err ++ } ++ if n != inLen { ++ return nil, syscall.EIO ++ } ++ n, err = syscall.Read(s.fd, s.output) ++ if err != nil { ++ return nil, err ++ } ++ if n != outLen { ++ return nil, syscall.EIO ++ } ++ return s.output[len(aad):], nil ++} ++ ++func (s *eip93State) selftest(g *GCM) bool { ++ var nonce [12]byte ++ n, _, errno := syscall.Syscall(syscall.SYS_GETRANDOM, uintptr(unsafe.Pointer(&nonce[0])), uintptr(len(nonce)), 0) ++ if errno != 0 || n != uintptr(len(nonce)) { ++ return false ++ } ++ aad := []byte("EIP93 selftest") ++ plain := make([]byte, 257) ++ for i := range plain { ++ plain[i] = byte(i * 7) ++ } ++ expected := make([]byte, len(plain)+16) ++ sealGeneric(expected, g, nonce[:], plain, aad) ++ got, err := s.exchange(nonce[:], plain, aad, false) ++ if err != nil || !bytes.Equal(got, expected) { ++ return false ++ } ++ got, err = s.exchange(nonce[:], expected, aad, true) ++ if err != nil || !bytes.Equal(got, plain) { ++ return false ++ } ++ expected[len(expected)-1] ^= 1 ++ _, err = s.exchange(nonce[:], expected, aad, true) ++ return err == syscall.EBADMSG ++} ++ ++// Return handled=false for unsupported sizes and operational failures. ++// Authentication failures are handled=true, valid=false, never successes. ++func (s *eip93State) crypt(g *GCM, out, nonce, src, aad []byte, decrypt bool) (handled, valid bool) { ++ n := len(src) ++ if decrypt { ++ n -= 16 ++ } ++ if n < eip93Min || n > eip93Max || len(aad) > 256 || len(nonce) != 12 { ++ return false, false ++ } ++ s.mu.Lock() ++ defer s.mu.Unlock() ++ defer runtime.KeepAlive(s) ++ if s.disabled { ++ return false, false ++ } ++ if s.fd < 0 { ++ if s.connect() != nil || !s.selftest(g) { ++ s.close() ++ clear(s.key[:]) ++ s.disabled = true ++ return false, false ++ } ++ eip93Notice.Do(func() { println("Xray EIP93: AN7581 AES-GCM hybrid backend enabled (AF_ALG CTR + CPU GHASH)") }) ++ } ++ result, err := s.exchange(nonce, src, aad, decrypt) ++ if decrypt && err == syscall.EBADMSG { ++ clear(s.input) ++ clear(s.output) ++ return true, false ++ } ++ if err != nil { ++ s.close() ++ s.disabled = true ++ return false, false ++ } ++ copy(out, result) ++ clear(s.input) ++ clear(s.output) ++ return true, true ++} +--- a/tools/eip93/eip93_linux_arm64_test.go ++++ b/tools/eip93/eip93_linux_arm64_test.go +@@ -0,0 +1,153 @@ ++// Copyright 2026 coolsnowwolf ++// SPDX-License-Identifier: BSD-3-Clause ++//go:build linux && arm64 && !purego ++ ++package gcm ++ ++import ( ++ "bytes" ++ "crypto/internal/fips140/aes" ++ "sync" ++ "syscall" ++ "testing" ++) ++ ++func TestEIP93DTGate(t *testing.T) { ++ for _, tc := range []struct { ++ dt string ++ want bool ++ }{ ++ {"nokia,xg-040g-md-ubi\x00airoha,an7581\x00", true}, ++ {"airoha,en7581\x00", true}, {"airoha,an7583\x00", false}, ++ {"airoha,an7581\x00airoha,en7583\x00", false}, ++ {"airoha,an7581", false}, {"", false}, {"vendor,an7581\x00", false}, {"airoha,an75810\x00", false}, ++ } { ++ if eip93Compatible([]byte(tc.dt)) != tc.want { ++ t.Fatalf("gate %q", tc.dt) ++ } ++ } ++} ++ ++func TestEIP93Hardware(t *testing.T) { ++ if !eip93Enabled() { ++ t.Skip("requires AN7581 with EIP93 backend enabled") ++ } ++ for _, keyLen := range []int{16, 24, 32} { ++ key := make([]byte, keyLen) ++ for i := range key { ++ key[i] = byte(i + 1) ++ } ++ block, err := aes.New(key) ++ if err != nil { ++ t.Fatal(err) ++ } ++ g, err := New(block, 12, 16) ++ if err != nil { ++ t.Fatal(err) ++ } ++ if g.eip93 == nil { ++ t.Fatal("backend not selected") ++ } ++ for _, n := range []int{0, 1, 15, 16, 17, 4095, 4096, 4097, 16384, 16385, 32768, 32769} { ++ plain := make([]byte, n) ++ for i := range plain { ++ plain[i] = byte(i * 7) ++ } ++ nonce := make([]byte, 12) ++ nonce[0] = byte(n) ++ nonce[1] = byte(n >> 8) ++ aad := []byte("authentication data") ++ want := make([]byte, n+16) ++ sealGeneric(want, g, nonce, plain, aad) ++ got := g.Seal(nil, nonce, plain, aad) ++ if !bytes.Equal(got, want) { ++ t.Fatalf("seal key=%d n=%d", keyLen, n) ++ } ++ buf := append([]byte(nil), got...) ++ out, err := g.Open(buf[:0], nonce, buf, aad) ++ if err != nil || !bytes.Equal(out, plain) { ++ t.Fatalf("inplace open key=%d n=%d err=%v", keyLen, n, err) ++ } ++ buf = make([]byte, n, n+16) ++ copy(buf, plain) ++ got = g.Seal(buf[:0], nonce, buf, aad) ++ if !bytes.Equal(got, want) { ++ t.Fatalf("inplace seal key=%d n=%d", keyLen, n) ++ } ++ got[len(got)-1] ^= 1 ++ out, err = g.Open(nil, nonce, got, aad) ++ if err == nil || out != nil { ++ t.Fatal("corrupt tag accepted") ++ } ++ } ++ if g.eip93.fd < 0 || g.eip93.disabled { ++ t.Fatal("hardware failed or fell back") ++ } ++ var wg sync.WaitGroup ++ for worker := 0; worker < 8; worker++ { ++ wg.Add(1) ++ go func(id int) { ++ defer wg.Done() ++ for i := 0; i < 20; i++ { ++ nonce := make([]byte, 12) ++ nonce[0] = byte(id + 64) ++ nonce[1] = byte(i) ++ plain := bytes.Repeat([]byte{byte(id)}, 8192) ++ got := g.Seal(nil, nonce, plain, nil) ++ out, err := g.Open(nil, nonce, got, nil) ++ if err != nil || !bytes.Equal(out, plain) { ++ t.Error("concurrent roundtrip") ++ } ++ } ++ }(worker) ++ } ++ wg.Wait() ++ // A closed operation fd must cause a safe software fallback, without ++ // returning partial plaintext or leaking the global socket reservation. ++ syscall.Close(g.eip93.fd) ++ plain := make([]byte, 8192) ++ nonce := make([]byte, 12) ++ want := make([]byte, len(plain)+16) ++ sealGeneric(want, g, nonce, plain, nil) ++ if got := g.Seal(nil, nonce, plain, nil); !bytes.Equal(got, want) || !g.eip93.disabled { ++ t.Fatal("closed-fd fallback") ++ } ++ for _, nt := range [][2]int{{8, 16}, {12, 12}} { ++ other, err := New(block, nt[0], nt[1]) ++ if err != nil || other.eip93 != nil { ++ t.Fatal("nonstandard GCM must use software") ++ } ++ } ++ } ++ if n := eip93Sockets.Load(); n != 0 { ++ t.Fatalf("socket reservations leaked: %d", n) ++ } ++} ++ ++func TestEIP93BindFallback(t *testing.T) { ++ for _, first := range []syscall.Errno{0, syscall.ENOENT, syscall.EINVAL, syscall.ENODEV, syscall.EACCES, syscall.EPERM} { ++ for _, second := range []syscall.Errno{0, syscall.ENOENT} { ++ calls := 0 ++ err := eip93Bind(func(name string) syscall.Errno { ++ calls++ ++ if calls == 1 { ++ if name != "gcm_base(ctr(aes-eip93),ghash-generic)" { ++ t.Fatal(name) ++ } ++ return first ++ } ++ if name != "gcm_base(ctr(aes-eip93),ghash-lib)" { ++ t.Fatal(name) ++ } ++ return second ++ }) ++ want, count := second, 2 ++ if first == 0 { ++ want, count = 0, 1 ++ } ++ if err != want || calls != count { ++ t.Fatalf("first=%v second=%v: err=%v calls=%d", first, second, err, calls) ++ } ++ } ++ } ++} +--- a/tools/eip93/eip93_stub.go ++++ b/tools/eip93/eip93_stub.go +@@ -0,0 +1,12 @@ ++// Copyright 2026 coolsnowwolf ++// SPDX-License-Identifier: BSD-3-Clause ++//go:build !linux || !arm64 || purego ++ ++package gcm ++ ++type eip93State struct{} ++ ++func newEIP93State(g *GCM) *eip93State { return nil } ++func (*eip93State) crypt(g *GCM, out, nonce, src, aad []byte, decrypt bool) (bool, bool) { ++ return false, false ++} +--- a/tools/eip93/overlay.py ++++ b/tools/eip93/overlay.py +@@ -0,0 +1,35 @@ ++#!/usr/bin/env python3 ++"""Generate an Xray-only Go overlay; never modify the shared Go toolchain.""" ++import argparse ++import json ++from pathlib import Path ++import subprocess ++ ++parser=argparse.ArgumentParser() ++parser.add_argument('--go',required=True) ++parser.add_argument('--out',required=True) ++args=parser.parse_args() ++root=Path(subprocess.check_output([args.go,'env','GOROOT'],text=True).strip()).resolve() ++source=root/'src/crypto/internal/fips140/aes/gcm' ++out=Path(args.out).resolve();out.mkdir(parents=True,exist_ok=True) ++replacements={} ++def change(name,edits): ++ text=(source/name).read_text() ++ for old,new in edits: ++ if text.count(old)!=1: ++ raise SystemExit('EIP93 overlay: unsupported Go source in '+name+'; review before enabling acceleration') ++ text=text.replace(old,new,1) ++ dst=out/name;dst.write_text(text) ++ replacements[str(source/name)]=str(dst) ++change('gcm.go',[('\tgcmPlatformData\n','\tgcmPlatformData\n\teip93 *eip93State\n')]) ++change('gcm_asm.go',[ ++ ('func initGCM(g *GCM) {\n\tif !supportsAESGCM {\n\t\treturn', ++ 'func initGCM(g *GCM) {\n\tif !supportsAESGCM {\n\t\tg.eip93 = newEIP93State(g)\n\t\treturn'), ++ ('\t\tsealGeneric(out, g, nonce, plaintext, data)', ++ '\t\tif g.eip93 != nil {\n\t\t\tif handled, _ := g.eip93.crypt(g, out, nonce, plaintext, data, false); handled { return }\n\t\t}\n\t\tsealGeneric(out, g, nonce, plaintext, data)'), ++ ('\t\treturn openGeneric(out, g, nonce, ciphertext, data)', ++ '\t\tif g.eip93 != nil {\n\t\t\tif handled, valid := g.eip93.crypt(g, out, nonce, ciphertext, data, true); handled {\n\t\t\t\tif !valid { return errOpen }; return nil\n\t\t\t}\n\t\t}\n\t\treturn openGeneric(out, g, nonce, ciphertext, data)')]) ++for name in ['eip93_linux_arm64.go','eip93_stub.go','eip93_linux_arm64_test.go']: ++ dst=out/name;dst.write_text((Path(__file__).parent/name).read_text()) ++ replacements[str(source/name)]=str(dst) ++(out/'overlay.json').write_text(json.dumps({'Replace':replacements},indent=2)+'\n')