From 7d88eac7d4597fc012c590b02f555d56e5923a2f Mon Sep 17 00:00:00 2001 From: "github-action[bot]" Date: Thu, 21 Aug 2025 20:41:19 +0200 Subject: [PATCH] Update On Thu Aug 21 20:41:19 CEST 2025 --- .github/update.log | 1 + brook/docs/images/user-system.png | Bin 0 -> 292730 bytes clash-meta/common/net/deadline/conn.go | 4 + clash-meta/component/generater/types.go | 97 ------- .../component/{generater => generator}/cmd.go | 31 ++- clash-meta/component/generator/x25519.go | 27 ++ clash-meta/docs/config.yaml | 16 +- clash-meta/go.mod | 2 +- clash-meta/go.sum | 4 +- clash-meta/listener/inbound/common_test.go | 9 +- clash-meta/listener/inbound/vless_test.go | 53 ++-- clash-meta/main.go | 4 +- .../transport/vless/encryption/client.go | 33 ++- .../transport/vless/encryption/common.go | 2 +- clash-meta/transport/vless/encryption/doc.go | 1 + .../transport/vless/encryption/factory.go | 69 +++-- clash-meta/transport/vless/encryption/key.go | 53 +++- .../transport/vless/encryption/server.go | 36 ++- clash-meta/transport/vless/encryption/xor.go | 118 ++++++-- clash-nyanpasu/frontend/nyanpasu/package.json | 4 +- clash-nyanpasu/manifest/version.json | 4 +- clash-nyanpasu/package.json | 6 +- clash-nyanpasu/pnpm-lock.yaml | 258 +++++++++--------- lede/package/boot/uboot-sunxi/Makefile | 25 ++ lede/package/boot/uboot-sunxi/uEnv-a64.txt | 5 +- .../package/boot/uboot-sunxi/uEnv-default.txt | 4 +- lede/package/boot/uboot-sunxi/uEnv-h6.txt | 5 +- lede/package/boot/uboot-sunxi/uEnv-h616.txt | 5 +- .../boot/uboot-sunxi/uEnv-pangolin.txt | 4 +- lede/target/linux/sunxi/cortexa7/config-6.12 | 1 + lede/target/linux/sunxi/image/Makefile | 11 +- lede/target/linux/sunxi/image/cortexa53.mk | 11 +- lede/target/linux/sunxi/image/cortexa7.mk | 57 ++++ lede/target/linux/sunxi/image/cortexa8.mk | 6 + mihomo/common/net/deadline/conn.go | 4 + mihomo/component/generater/types.go | 97 ------- .../component/{generater => generator}/cmd.go | 31 ++- mihomo/component/generator/x25519.go | 27 ++ mihomo/docs/config.yaml | 16 +- mihomo/go.mod | 2 +- mihomo/go.sum | 4 +- mihomo/listener/inbound/common_test.go | 9 +- mihomo/listener/inbound/vless_test.go | 53 ++-- mihomo/main.go | 4 +- mihomo/transport/vless/encryption/client.go | 33 ++- mihomo/transport/vless/encryption/common.go | 2 +- mihomo/transport/vless/encryption/doc.go | 1 + mihomo/transport/vless/encryption/factory.go | 69 +++-- mihomo/transport/vless/encryption/key.go | 53 +++- mihomo/transport/vless/encryption/server.go | 36 ++- mihomo/transport/vless/encryption/xor.go | 118 ++++++-- openwrt-packages/adguardhome/Makefile | 6 +- openwrt-packages/ddns-go/Makefile | 4 +- openwrt-packages/quickstart/Makefile | 4 +- .../model/cbi/passwall/client/type/ray.lua | 5 +- .../cbi/passwall/client/type/sing-box.lua | 5 +- sing-box/clients/android/version.properties | 4 +- sing-box/dns/transport/local/local_darwin.go | 3 +- .../transport/local/local_resolved_linux.go | 111 ++++++-- sing-box/docs/changelog.md | 8 + .../resources/view/fchomo/global.js | 8 +- small/luci-app-fchomo/root/etc/init.d/fchomo | 2 +- .../root/etc/uci-defaults/99_luci-app-fchomo | 6 +- .../uci-defaults/99_luci-app-fchomo-migration | 3 + .../luci-static/resources/tools/nikki.js | 9 +- .../model/cbi/passwall/client/type/ray.lua | 5 +- .../cbi/passwall/client/type/sing-box.lua | 5 +- small/nikki/files/nikki.conf | 2 + small/sing-box/Makefile | 4 +- small/v2ray-geodata/Makefile | 4 +- v2rayn/.github/workflows/build-linux.yml | 36 ++- v2rayn/package-rhel.sh | 35 ++- .../Assets/GlobalResources.axaml | 1 + xray-core/go.mod | 2 +- xray-core/go.sum | 4 +- yt-dlp/yt_dlp/extractor/youtube/_base.py | 3 +- 76 files changed, 1126 insertions(+), 678 deletions(-) create mode 100644 brook/docs/images/user-system.png delete mode 100644 clash-meta/component/generater/types.go rename clash-meta/component/{generater => generator}/cmd.go (58%) create mode 100644 clash-meta/component/generator/x25519.go delete mode 100644 mihomo/component/generater/types.go rename mihomo/component/{generater => generator}/cmd.go (58%) create mode 100644 mihomo/component/generator/x25519.go diff --git a/.github/update.log b/.github/update.log index 46b0b6f095..d072464c43 100644 --- a/.github/update.log +++ b/.github/update.log @@ -1096,3 +1096,4 @@ Update On Sun Aug 17 20:39:03 CEST 2025 Update On Mon Aug 18 20:42:30 CEST 2025 Update On Tue Aug 19 20:36:45 CEST 2025 Update On Wed Aug 20 20:53:01 CEST 2025 +Update On Thu Aug 21 20:41:11 CEST 2025 diff --git a/brook/docs/images/user-system.png b/brook/docs/images/user-system.png new file mode 100644 index 0000000000000000000000000000000000000000..cda5e2f85e04781eae896717294e86977cb5edb7 GIT binary patch literal 292730 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 z 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 literal 0 HcmV?d00001 diff --git a/clash-meta/common/net/deadline/conn.go b/clash-meta/common/net/deadline/conn.go index 01519e941c..aafad9e4ab 100644 --- a/clash-meta/common/net/deadline/conn.go +++ b/clash-meta/common/net/deadline/conn.go @@ -149,6 +149,10 @@ func (c *Conn) ReaderReplaceable() bool { return c.disablePipe.Load() || c.deadline.Load().IsZero() } +func (c *Conn) WriterReplaceable() bool { + return true +} + func (c *Conn) Upstream() any { return c.ExtendedConn } diff --git a/clash-meta/component/generater/types.go b/clash-meta/component/generater/types.go deleted file mode 100644 index 06f59e9468..0000000000 --- a/clash-meta/component/generater/types.go +++ /dev/null @@ -1,97 +0,0 @@ -// Copy from https://github.com/WireGuard/wgctrl-go/blob/a9ab2273dd1075ea74b88c76f8757f8b4003fcbf/wgtypes/types.go#L71-L155 - -package generater - -import ( - "crypto/rand" - "encoding/base64" - "fmt" - - "golang.org/x/crypto/curve25519" -) - -// KeyLen is the expected key length for a WireGuard key. -const KeyLen = 32 // wgh.KeyLen - -// A Key is a public, private, or pre-shared secret key. The Key constructor -// functions in this package can be used to create Keys suitable for each of -// these applications. -type Key [KeyLen]byte - -// GenerateKey generates a Key suitable for use as a pre-shared secret key from -// a cryptographically safe source. -// -// The output Key should not be used as a private key; use GeneratePrivateKey -// instead. -func GenerateKey() (Key, error) { - b := make([]byte, KeyLen) - if _, err := rand.Read(b); err != nil { - return Key{}, fmt.Errorf("wgtypes: failed to read random bytes: %v", err) - } - - return NewKey(b) -} - -// GeneratePrivateKey generates a Key suitable for use as a private key from a -// cryptographically safe source. -func GeneratePrivateKey() (Key, error) { - key, err := GenerateKey() - if err != nil { - return Key{}, err - } - - // Modify random bytes using algorithm described at: - // https://cr.yp.to/ecdh.html. - key[0] &= 248 - key[31] &= 127 - key[31] |= 64 - - return key, nil -} - -// NewKey creates a Key from an existing byte slice. The byte slice must be -// exactly 32 bytes in length. -func NewKey(b []byte) (Key, error) { - if len(b) != KeyLen { - return Key{}, fmt.Errorf("wgtypes: incorrect key size: %d", len(b)) - } - - var k Key - copy(k[:], b) - - return k, nil -} - -// ParseKey parses a Key from a base64-encoded string, as produced by the -// Key.String method. -func ParseKey(s string) (Key, error) { - b, err := base64.StdEncoding.DecodeString(s) - if err != nil { - return Key{}, fmt.Errorf("wgtypes: failed to parse base64-encoded key: %v", err) - } - - return NewKey(b) -} - -// PublicKey computes a public key from the private key k. -// -// PublicKey should only be called when k is a private key. -func (k Key) PublicKey() Key { - var ( - pub [KeyLen]byte - priv = [KeyLen]byte(k) - ) - - // ScalarBaseMult uses the correct base value per https://cr.yp.to/ecdh.html, - // so no need to specify it. - curve25519.ScalarBaseMult(&pub, &priv) - - return Key(pub) -} - -// String returns the base64-encoded string representation of a Key. -// -// ParseKey can be used to produce a new Key from this string. -func (k Key) String() string { - return base64.StdEncoding.EncodeToString(k[:]) -} diff --git a/clash-meta/component/generater/cmd.go b/clash-meta/component/generator/cmd.go similarity index 58% rename from clash-meta/component/generater/cmd.go rename to clash-meta/component/generator/cmd.go index 2bd5b9cd86..537fba91bb 100644 --- a/clash-meta/component/generater/cmd.go +++ b/clash-meta/component/generator/cmd.go @@ -1,4 +1,4 @@ -package generater +package generator import ( "encoding/base64" @@ -12,7 +12,7 @@ import ( func Main(args []string) { if len(args) < 1 { - panic("Using: generate uuid/reality-keypair/wg-keypair/ech-keypair/vless-mlkem768") + panic("Using: generate uuid/reality-keypair/wg-keypair/ech-keypair/vless-mlkem768/vless-x25519") } switch args[0] { case "uuid": @@ -22,20 +22,19 @@ func Main(args []string) { } fmt.Println(newUUID.String()) case "reality-keypair": - privateKey, err := GeneratePrivateKey() + privateKey, err := GenX25519PrivateKey() if err != nil { panic(err) } - publicKey := privateKey.PublicKey() - fmt.Println("PrivateKey: " + base64.RawURLEncoding.EncodeToString(privateKey[:])) - fmt.Println("PublicKey: " + base64.RawURLEncoding.EncodeToString(publicKey[:])) + fmt.Println("PrivateKey: " + base64.RawURLEncoding.EncodeToString(privateKey.Bytes())) + fmt.Println("PublicKey: " + base64.RawURLEncoding.EncodeToString(privateKey.PublicKey().Bytes())) case "wg-keypair": - privateKey, err := GeneratePrivateKey() + privateKey, err := GenX25519PrivateKey() if err != nil { panic(err) } - fmt.Println("PrivateKey: " + privateKey.String()) - fmt.Println("PublicKey: " + privateKey.PublicKey().String()) + fmt.Println("PrivateKey: " + base64.StdEncoding.EncodeToString(privateKey.Bytes())) + fmt.Println("PublicKey: " + base64.StdEncoding.EncodeToString(privateKey.PublicKey().Bytes())) case "ech-keypair": if len(args) < 2 { panic("Using: generate ech-keypair ") @@ -51,11 +50,23 @@ func Main(args []string) { if len(args) > 1 { seed = args[1] } - seedBase64, clientBase64, err := encryption.GenMLKEM768(seed) + seedBase64, clientBase64, hash11Base64, err := encryption.GenMLKEM768(seed) if err != nil { panic(err) } fmt.Println("Seed: " + seedBase64) fmt.Println("Client: " + clientBase64) + fmt.Println("Hash11: " + hash11Base64) + case "vless-x25519": + var privateKey string + if len(args) > 1 { + privateKey = args[1] + } + privateKeyBase64, passwordBase64, err := encryption.GenX25519(privateKey) + if err != nil { + panic(err) + } + fmt.Println("PrivateKey: " + privateKeyBase64) + fmt.Println("Password: " + passwordBase64) } } diff --git a/clash-meta/component/generator/x25519.go b/clash-meta/component/generator/x25519.go new file mode 100644 index 0000000000..e99fff2bae --- /dev/null +++ b/clash-meta/component/generator/x25519.go @@ -0,0 +1,27 @@ +package generator + +import ( + "crypto/ecdh" + "crypto/rand" +) + +const X25519KeySize = 32 + +func GenX25519PrivateKey() (*ecdh.PrivateKey, error) { + var privateKey [X25519KeySize]byte + _, err := rand.Read(privateKey[:]) + if err != nil { + return nil, err + } + + // Avoid generating equivalent X25519 private keys + // https://github.com/XTLS/Xray-core/pull/1747 + // + // Modify random bytes using algorithm described at: + // https://cr.yp.to/ecdh.html. + privateKey[0] &= 248 + privateKey[31] &= 127 + privateKey[31] |= 64 + + return ecdh.X25519().NewPrivateKey(privateKey[:]) +} diff --git a/clash-meta/docs/config.yaml b/clash-meta/docs/config.yaml index 80af843bf9..0313bee71f 100644 --- a/clash-meta/docs/config.yaml +++ b/clash-meta/docs/config.yaml @@ -638,8 +638,12 @@ proxies: # socks5 port: 443 uuid: uuid network: tcp - encryption: "8min-vless-mlkem768client-bas64RawURLEncoding" # 复用八分钟后协商新的 sharedKey,需小于服务端的值 - # encryption: "8min-xored-mlkem768client-bas64RawURLEncoding" + # ------------------------- + # vless encryption客户端配置: + # (只使用 1-RTT 模式 / 复用八分钟后协商新的 baseKey,周期需小于服务端的值) + # / 是只能选一个,后面是 base64RawURLEncoding,使用 mihomo generate vless-x25519 和 mihomo generate vless-mlkem768 生成,替换值时需去掉括号 + # ------------------------- + encryption: "1rtt/8min.native/divide/random.mlkem768Client.(X25519 Password).(ML-KEM-768 Client)" tls: false #可以不开启tls udp: true @@ -1359,8 +1363,12 @@ listeners: flow: xtls-rprx-vision # ws-path: "/" # 如果不为空则开启 websocket 传输层 # grpc-service-name: "GunService" # 如果不为空则开启 grpc 传输层 - # decryption: "10min-vless-mlkem768seed-bas64RawURLEncoding" # 同时允许 1-RTT 模式与十分钟复用的 0-RTT 模式, 后面base64字符串可由可由 mihomo generate vless-mlkem768 命令生成 - # decryption: "10min-xored-mlkem768seed-bas64RawURLEncoding" + # ------------------------- + # vless encryption服务端配置: + # (只允许 1-RTT 模式 / 同时允许 1-RTT 模式与十分钟复用的 0-RTT 模式;原生外观 / ECH 式 XOR / 全随机数) + # / 是只能选一个,后面是 base64RawURLEncoding,使用 mihomo generate vless-x25519 和 mihomo generate vless-mlkem768 生成,替换值时需去掉括号 + # ------------------------- + # decryption: "1rtt/10min.native/divide/random.mlkem768Seed.(X25519 PrivateKey).(ML-KEM-768 Seed)" # 下面两项如果填写则开启 tls(需要同时填写) # certificate: ./server.crt # private-key: ./server.key diff --git a/clash-meta/go.mod b/clash-meta/go.mod index 5695c7827e..57c10000ba 100644 --- a/clash-meta/go.mod +++ b/clash-meta/go.mod @@ -31,7 +31,7 @@ require ( github.com/metacubex/sing-shadowsocks2 v0.2.6 github.com/metacubex/sing-shadowtls v0.0.0-20250503063515-5d9f966d17a2 github.com/metacubex/sing-tun v0.4.7 - github.com/metacubex/sing-vmess v0.2.4-0.20250819151326-51d195aac5db + github.com/metacubex/sing-vmess v0.2.4-0.20250821024956-97839f31a65d github.com/metacubex/sing-wireguard v0.0.0-20250503063753-2dc62acc626f github.com/metacubex/smux v0.0.0-20250503055512-501391591dee github.com/metacubex/tfo-go v0.0.0-20250516165257-e29c16ae41d4 diff --git a/clash-meta/go.sum b/clash-meta/go.sum index 69811ad2ba..d8bfd9a592 100644 --- a/clash-meta/go.sum +++ b/clash-meta/go.sum @@ -131,8 +131,8 @@ github.com/metacubex/sing-shadowtls v0.0.0-20250503063515-5d9f966d17a2 h1:gXU+MY github.com/metacubex/sing-shadowtls v0.0.0-20250503063515-5d9f966d17a2/go.mod h1:mbfboaXauKJNIHJYxQRa+NJs4JU9NZfkA+I33dS2+9E= github.com/metacubex/sing-tun v0.4.7 h1:ZDY/W+1c7PeWWKeKRyUo18fySF/TWjB0i5ui81Ar778= github.com/metacubex/sing-tun v0.4.7/go.mod h1:xHecZRwBnKWe6zG9amAK9cXf91lF6blgjBqm+VvOrmU= -github.com/metacubex/sing-vmess v0.2.4-0.20250819151326-51d195aac5db h1:W7VKxR0r5IR+56Lblx2iyrEaykx0esdQwTQbkSrSaek= -github.com/metacubex/sing-vmess v0.2.4-0.20250819151326-51d195aac5db/go.mod h1:21R5R1u90uUvBQF0owoooEu96/SAYYD56nDrwm6nFaM= +github.com/metacubex/sing-vmess v0.2.4-0.20250821024956-97839f31a65d h1:jchYEho5+kTmok4aTMflqJyTRnqVPTOVeC1RFXxuw9A= +github.com/metacubex/sing-vmess v0.2.4-0.20250821024956-97839f31a65d/go.mod h1:21R5R1u90uUvBQF0owoooEu96/SAYYD56nDrwm6nFaM= github.com/metacubex/sing-wireguard v0.0.0-20250503063753-2dc62acc626f h1:Sr/DYKYofKHKc4GF3qkRGNuj6XA6c0eqPgEDN+VAsYU= github.com/metacubex/sing-wireguard v0.0.0-20250503063753-2dc62acc626f/go.mod h1:jpAkVLPnCpGSfNyVmj6Cq4YbuZsFepm/Dc+9BAOcR80= github.com/metacubex/smux v0.0.0-20250503055512-501391591dee h1:lp6hJ+4wCLZu113awp7P6odM2okB5s60HUyF0FMqKmo= diff --git a/clash-meta/listener/inbound/common_test.go b/clash-meta/listener/inbound/common_test.go index 5b838bd303..75b98e0bc4 100644 --- a/clash-meta/listener/inbound/common_test.go +++ b/clash-meta/listener/inbound/common_test.go @@ -21,7 +21,7 @@ import ( "github.com/metacubex/mihomo/component/ca" "github.com/metacubex/mihomo/component/dialer" "github.com/metacubex/mihomo/component/ech" - "github.com/metacubex/mihomo/component/generater" + "github.com/metacubex/mihomo/component/generator" tlsC "github.com/metacubex/mihomo/component/tls" C "github.com/metacubex/mihomo/constant" @@ -48,13 +48,12 @@ var echConfigBase64, echKeyPem, _ = ech.GenECHConfig(echPublicSni) func init() { rand.Read(httpData) - privateKey, err := generater.GeneratePrivateKey() + privateKey, err := generator.GenX25519PrivateKey() if err != nil { panic(err) } - publicKey := privateKey.PublicKey() - realityPrivateKey = base64.RawURLEncoding.EncodeToString(privateKey[:]) - realityPublickey = base64.RawURLEncoding.EncodeToString(publicKey[:]) + realityPrivateKey = base64.RawURLEncoding.EncodeToString(privateKey.Bytes()) + realityPublickey = base64.RawURLEncoding.EncodeToString(privateKey.PublicKey().Bytes()) } type TestTunnel struct { diff --git a/clash-meta/listener/inbound/vless_test.go b/clash-meta/listener/inbound/vless_test.go index f3fcd39cb0..4ac9654b3b 100644 --- a/clash-meta/listener/inbound/vless_test.go +++ b/clash-meta/listener/inbound/vless_test.go @@ -89,39 +89,38 @@ func TestInboundVless_TLS(t *testing.T) { } func TestInboundVless_Encryption(t *testing.T) { - seedBase64, clientBase64, err := encryption.GenMLKEM768("") + seedBase64, clientBase64, _, err := encryption.GenMLKEM768("") if err != nil { t.Fatal(err) return } - t.Run("-vless-", func(t *testing.T) { - inboundOptions := inbound.VlessOption{ - Decryption: "10min-vless-mlkem768seed-" + seedBase64, - } - outboundOptions := outbound.VlessOption{ - Encryption: "8min-vless-mlkem768client-" + clientBase64, - } - testInboundVless(t, inboundOptions, outboundOptions) - t.Run("xtls-rprx-vision", func(t *testing.T) { - outboundOptions := outboundOptions - outboundOptions.Flow = "xtls-rprx-vision" + privateKeyBase64, passwordBase64, err := encryption.GenX25519("") + if err != nil { + t.Fatal(err) + return + } + var modes = []string{ + "native", + "divide", + "random", + } + for i := range modes { + mode := modes[i] + t.Run(mode, func(t *testing.T) { + inboundOptions := inbound.VlessOption{ + Decryption: "10min." + mode + ".mlkem768Seed." + privateKeyBase64 + "." + seedBase64, + } + outboundOptions := outbound.VlessOption{ + Encryption: "8min." + mode + ".mlkem768Client." + passwordBase64 + "." + clientBase64, + } testInboundVless(t, inboundOptions, outboundOptions) + t.Run("xtls-rprx-vision", func(t *testing.T) { + outboundOptions := outboundOptions + outboundOptions.Flow = "xtls-rprx-vision" + testInboundVless(t, inboundOptions, outboundOptions) + }) }) - }) - t.Run("-xored-", func(t *testing.T) { - inboundOptions := inbound.VlessOption{ - Decryption: "10min-xored-mlkem768seed-" + seedBase64, - } - outboundOptions := outbound.VlessOption{ - Encryption: "8min-xored-mlkem768client-" + clientBase64, - } - testInboundVless(t, inboundOptions, outboundOptions) - t.Run("xtls-rprx-vision", func(t *testing.T) { - outboundOptions := outboundOptions - outboundOptions.Flow = "xtls-rprx-vision" - testInboundVless(t, inboundOptions, outboundOptions) - }) - }) + } } func TestInboundVless_Wss1(t *testing.T) { diff --git a/clash-meta/main.go b/clash-meta/main.go index 3bc3d74f73..6a85e5df79 100644 --- a/clash-meta/main.go +++ b/clash-meta/main.go @@ -14,7 +14,7 @@ import ( "strings" "syscall" - "github.com/metacubex/mihomo/component/generater" + "github.com/metacubex/mihomo/component/generator" "github.com/metacubex/mihomo/component/geodata" "github.com/metacubex/mihomo/component/updater" "github.com/metacubex/mihomo/config" @@ -73,7 +73,7 @@ func main() { } if len(os.Args) > 1 && os.Args[1] == "generate" { - generater.Main(os.Args[2:]) + generator.Main(os.Args[2:]) return } diff --git a/clash-meta/transport/vless/encryption/client.go b/clash-meta/transport/vless/encryption/client.go index ecf20692ea..dfa4fa63b7 100644 --- a/clash-meta/transport/vless/encryption/client.go +++ b/clash-meta/transport/vless/encryption/client.go @@ -3,6 +3,7 @@ package encryption import ( "bytes" "crypto/cipher" + "crypto/ecdh" "crypto/rand" "errors" "fmt" @@ -40,7 +41,8 @@ type ClientInstance struct { sync.RWMutex nfsEKey *mlkem.EncapsulationKey768 hash11 [11]byte // no more capacity - xorKey []byte + xorMode uint32 + xorPKey *ecdh.PublicKey minutes time.Duration expire time.Time baseKey []byte @@ -60,22 +62,23 @@ type ClientConn struct { input bytes.Reader // peerCache } -func (i *ClientInstance) Init(nfsEKeyBytes []byte, xor uint32, minutes time.Duration) (err error) { +func (i *ClientInstance) Init(nfsEKeyBytes, xorPKeyBytes []byte, xorMode, minutes uint32) (err error) { if i.nfsEKey != nil { err = errors.New("already initialized") return } - i.nfsEKey, err = mlkem.NewEncapsulationKey768(nfsEKeyBytes) - if err != nil { + if i.nfsEKey, err = mlkem.NewEncapsulationKey768(nfsEKeyBytes); err != nil { return } hash32 := sha3.Sum256(nfsEKeyBytes) copy(i.hash11[:], hash32[:]) - if xor > 0 { - xorKey := sha3.Sum256(nfsEKeyBytes) - i.xorKey = xorKey[:] + if xorMode > 0 { + i.xorMode = xorMode + if i.xorPKey, err = ecdh.X25519().NewPublicKey(xorPKeyBytes); err != nil { + return + } } - i.minutes = minutes + i.minutes = time.Duration(minutes) * time.Minute return } @@ -83,8 +86,8 @@ func (i *ClientInstance) Handshake(conn net.Conn) (*ClientConn, error) { if i.nfsEKey == nil { return nil, errors.New("uninitialized") } - if i.xorKey != nil { - conn = NewXorConn(conn, i.xorKey) + if i.xorMode > 0 { + conn, _ = NewXorConn(conn, i.xorMode, i.xorPKey, nil) } c := &ClientConn{Conn: conn} @@ -145,7 +148,7 @@ func (i *ClientInstance) Handshake(conn net.Conn) (*ClientConn, error) { } c.baseKey = append(pfsKey, nfsKey...) - VLESS, _ := NewAead(ClientCipher, c.baseKey, encapsulatedPfsKey, encapsulatedNfsKey).Open(nil, append(i.hash11[:], ClientCipher), c.ticket[11:], pfsEKeyBytes) + VLESS, _ := NewAEAD(ClientCipher, c.baseKey, encapsulatedPfsKey, encapsulatedNfsKey).Open(nil, append(i.hash11[:], ClientCipher), c.ticket[11:], pfsEKeyBytes) if !bytes.Equal(VLESS, []byte("VLESS")) { return nil, errors.New("invalid server") } @@ -180,7 +183,7 @@ func (c *ClientConn) Write(b []byte) (int, error) { rand.Read(c.random) copy(data[5+32:], c.random) EncodeHeader(data[5+32+32:], 23, len(b)+16) - c.aead = NewAead(ClientCipher, c.baseKey, c.random, c.ticket) + c.aead = NewAEAD(ClientCipher, c.baseKey, c.random, c.ticket) c.nonce = make([]byte, 12) c.aead.Seal(data[:5+32+32+5], c.nonce, b, data[5+32+32:5+32+32+5]) } else { @@ -188,7 +191,7 @@ func (c *ClientConn) Write(b []byte) (int, error) { EncodeHeader(data, 23, len(b)+16) c.aead.Seal(data[:5], c.nonce, b, data[:5]) if bytes.Equal(c.nonce, MaxNonce) { - c.aead = NewAead(ClientCipher, c.baseKey, data[5:], data[:5]) + c.aead = NewAEAD(ClientCipher, c.baseKey, data[5:], data[:5]) } } IncreaseNonce(c.nonce) @@ -229,7 +232,7 @@ func (c *ClientConn) Read(b []byte) (int, error) { if c.random == nil { return 0, errors.New("empty c.random") } - c.peerAead = NewAead(ClientCipher, c.baseKey, peerRandomHello, c.random) + c.peerAead = NewAEAD(ClientCipher, c.baseKey, peerRandomHello, c.random) c.peerNonce = make([]byte, 12) } if c.input.Len() > 0 { @@ -252,7 +255,7 @@ func (c *ClientConn) Read(b []byte) (int, error) { } var peerAead cipher.AEAD if bytes.Equal(c.peerNonce, MaxNonce) { - peerAead = NewAead(ClientCipher, c.baseKey, peerData, h) + peerAead = NewAEAD(ClientCipher, c.baseKey, peerData, h) } _, err = c.peerAead.Open(dst[:0], c.peerNonce, peerData, h) if peerAead != nil { diff --git a/clash-meta/transport/vless/encryption/common.go b/clash-meta/transport/vless/encryption/common.go index a67a616927..d383d22e98 100644 --- a/clash-meta/transport/vless/encryption/common.go +++ b/clash-meta/transport/vless/encryption/common.go @@ -73,7 +73,7 @@ func ReadAndDiscardPaddings(conn net.Conn) (h []byte, t byte, l int, err error) } } -func NewAead(c byte, secret, salt, info []byte) (aead cipher.AEAD) { +func NewAEAD(c byte, secret, salt, info []byte) (aead cipher.AEAD) { key := make([]byte, 32) hkdf.New(sha3.New256, secret, salt, info).Read(key) if c&1 == 1 { diff --git a/clash-meta/transport/vless/encryption/doc.go b/clash-meta/transport/vless/encryption/doc.go index 6f0c8f7039..10cd320b2b 100644 --- a/clash-meta/transport/vless/encryption/doc.go +++ b/clash-meta/transport/vless/encryption/doc.go @@ -14,4 +14,5 @@ // https://github.com/XTLS/Xray-core/commit/d1fb48521271251a8c74bd64fcc2fc8700717a3b // https://github.com/XTLS/Xray-core/commit/49580705f6029648399304b816a2737f991582a8 // https://github.com/XTLS/Xray-core/commit/84835bec7d0d8555d0dd30953ed26a272de814c4 +// https://github.com/XTLS/Xray-core/commit/373558ed7abdbac3de41745cf30ec04c9adde604 package encryption diff --git a/clash-meta/transport/vless/encryption/factory.go b/clash-meta/transport/vless/encryption/factory.go index 4988dbbfb9..d7e4c7e003 100644 --- a/clash-meta/transport/vless/encryption/factory.go +++ b/clash-meta/transport/vless/encryption/factory.go @@ -5,7 +5,6 @@ import ( "fmt" "strconv" "strings" - "time" ) // NewClient new client from encryption string @@ -15,7 +14,7 @@ func NewClient(encryption string) (*ClientInstance, error) { case "", "none": // We will not reject empty string like xray-core does, because we need to ensure compatibility return nil, nil } - if s := strings.SplitN(encryption, "-", 4); len(s) == 4 && s[2] == "mlkem768client" { + if s := strings.Split(encryption, "."); len(s) == 5 && s[2] == "mlkem768Client" { var minutes uint32 if s[0] != "1rtt" { t := strings.TrimSuffix(s[0], "min") @@ -28,27 +27,35 @@ func NewClient(encryption string) (*ClientInstance, error) { } minutes = uint32(i) } - var xor uint32 + var xorMode uint32 switch s[1] { - case "vless": - case "xored": - xor = 1 + case "native": + case "divide": + xorMode = 1 + case "random": + xorMode = 2 default: return nil, fmt.Errorf("invaild vless encryption value: %s", encryption) } - b, err := base64.RawURLEncoding.DecodeString(s[3]) + xorPKeyBytes, err := base64.RawURLEncoding.DecodeString(s[3]) if err != nil { return nil, fmt.Errorf("invaild vless encryption value: %s", encryption) } - if len(b) == MLKEM768ClientLength { - client := &ClientInstance{} - if err = client.Init(b, xor, time.Duration(minutes)*time.Minute); err != nil { - return nil, fmt.Errorf("failed to use mlkem768seed: %w", err) - } - return client, nil - } else { + if len(xorPKeyBytes) != X25519PasswordSize { return nil, fmt.Errorf("invaild vless encryption value: %s", encryption) } + nfsEKeyBytes, err := base64.RawURLEncoding.DecodeString(s[4]) + if err != nil { + return nil, fmt.Errorf("invaild vless encryption value: %s", encryption) + } + if len(nfsEKeyBytes) != MLKEM768ClientLength { + return nil, fmt.Errorf("invaild vless encryption value: %s", encryption) + } + client := &ClientInstance{} + if err = client.Init(nfsEKeyBytes, xorPKeyBytes, xorMode, minutes); err != nil { + return nil, fmt.Errorf("failed to use mlkem768seed: %w", err) + } + return client, nil } return nil, fmt.Errorf("invaild vless encryption value: %s", encryption) } @@ -60,7 +67,7 @@ func NewServer(decryption string) (*ServerInstance, error) { case "", "none": // We will not reject empty string like xray-core does, because we need to ensure compatibility return nil, nil } - if s := strings.SplitN(decryption, "-", 4); len(s) == 4 && s[2] == "mlkem768seed" { + if s := strings.Split(decryption, "."); len(s) == 5 && s[2] == "mlkem768Seed" { var minutes uint32 if s[0] != "1rtt" { t := strings.TrimSuffix(s[0], "min") @@ -73,27 +80,35 @@ func NewServer(decryption string) (*ServerInstance, error) { } minutes = uint32(i) } - var xor uint32 + var xorMode uint32 switch s[1] { - case "vless": - case "xored": - xor = 1 + case "native": + case "divide": + xorMode = 1 + case "random": + xorMode = 2 default: return nil, fmt.Errorf("invaild vless decryption value: %s", decryption) } - b, err := base64.RawURLEncoding.DecodeString(s[3]) + xorSKeyBytes, err := base64.RawURLEncoding.DecodeString(s[3]) if err != nil { return nil, fmt.Errorf("invaild vless decryption value: %s", decryption) } - if len(b) == MLKEM768SeedLength { - server := &ServerInstance{} - if err = server.Init(b, xor, time.Duration(minutes)*time.Minute); err != nil { - return nil, fmt.Errorf("failed to use mlkem768seed: %w", err) - } - return server, nil - } else { + if len(xorSKeyBytes) != X25519PrivateKeySize { return nil, fmt.Errorf("invaild vless decryption value: %s", decryption) } + nfsDKeySeed, err := base64.RawURLEncoding.DecodeString(s[4]) + if err != nil { + return nil, fmt.Errorf("invaild vless decryption value: %s", decryption) + } + if len(nfsDKeySeed) != MLKEM768SeedLength { + return nil, fmt.Errorf("invaild vless decryption value: %s", decryption) + } + server := &ServerInstance{} + if err = server.Init(nfsDKeySeed, xorSKeyBytes, xorMode, minutes); err != nil { + return nil, fmt.Errorf("failed to use mlkem768seed: %w", err) + } + return server, nil } return nil, fmt.Errorf("invaild vless decryption value: %s", decryption) } diff --git a/clash-meta/transport/vless/encryption/key.go b/clash-meta/transport/vless/encryption/key.go index 69b5289579..03ff284ef4 100644 --- a/clash-meta/transport/vless/encryption/key.go +++ b/clash-meta/transport/vless/encryption/key.go @@ -1,25 +1,29 @@ package encryption import ( + "crypto/ecdh" "crypto/rand" "encoding/base64" "fmt" "github.com/metacubex/utls/mlkem" + "golang.org/x/crypto/sha3" ) const MLKEM768SeedLength = mlkem.SeedSize const MLKEM768ClientLength = mlkem.EncapsulationKeySize768 +const X25519PasswordSize = 32 +const X25519PrivateKeySize = 32 -func GenMLKEM768(seedStr string) (seedBase64, clientBase64 string, err error) { - var seed [64]byte +func GenMLKEM768(seedStr string) (seedBase64, clientBase64, hash11Base64 string, err error) { + var seed [MLKEM768SeedLength]byte if len(seedStr) > 0 { s, _ := base64.RawURLEncoding.DecodeString(seedStr) - if len(s) != 64 { + if len(s) != MLKEM768SeedLength { err = fmt.Errorf("invalid length of ML-KEM-768 seed: %s", seedStr) return } - seed = [64]byte(s) + seed = [MLKEM768SeedLength]byte(s) } else { _, err = rand.Read(seed[:]) if err != nil { @@ -28,8 +32,45 @@ func GenMLKEM768(seedStr string) (seedBase64, clientBase64 string, err error) { } key, _ := mlkem.NewDecapsulationKey768(seed[:]) - pub := key.EncapsulationKey() + client := key.EncapsulationKey().Bytes() + hash32 := sha3.Sum256(client) seedBase64 = base64.RawURLEncoding.EncodeToString(seed[:]) - clientBase64 = base64.RawURLEncoding.EncodeToString(pub.Bytes()) + clientBase64 = base64.RawURLEncoding.EncodeToString(client) + hash11Base64 = base64.RawURLEncoding.EncodeToString(hash32[:11]) + return +} + +func GenX25519(privateKeyStr string) (privateKeyBase64, passwordBase64 string, err error) { + var privateKey [X25519PrivateKeySize]byte + if len(privateKeyStr) > 0 { + s, _ := base64.RawURLEncoding.DecodeString(privateKeyStr) + if len(s) != X25519PrivateKeySize { + err = fmt.Errorf("invalid length of X25519 private key: %s", privateKeyStr) + return + } + privateKey = [X25519PrivateKeySize]byte(s) + } else { + _, err = rand.Read(privateKey[:]) + if err != nil { + return + } + } + + // Avoid generating equivalent X25519 private keys + // https://github.com/XTLS/Xray-core/pull/1747 + // + // Modify random bytes using algorithm described at: + // https://cr.yp.to/ecdh.html. + privateKey[0] &= 248 + privateKey[31] &= 127 + privateKey[31] |= 64 + + key, err := ecdh.X25519().NewPrivateKey(privateKey[:]) + if err != nil { + fmt.Println(err.Error()) + return + } + privateKeyBase64 = base64.RawURLEncoding.EncodeToString(privateKey[:]) + passwordBase64 = base64.RawURLEncoding.EncodeToString(key.PublicKey().Bytes()) return } diff --git a/clash-meta/transport/vless/encryption/server.go b/clash-meta/transport/vless/encryption/server.go index ea72f2f5cf..baa8432cd0 100644 --- a/clash-meta/transport/vless/encryption/server.go +++ b/clash-meta/transport/vless/encryption/server.go @@ -3,6 +3,7 @@ package encryption import ( "bytes" "crypto/cipher" + "crypto/ecdh" "crypto/rand" "errors" "fmt" @@ -26,7 +27,8 @@ type ServerInstance struct { sync.RWMutex nfsDKey *mlkem.DecapsulationKey768 hash11 [11]byte // no more capacity - xorKey []byte + xorMode uint32 + xorSKey *ecdh.PrivateKey minutes time.Duration sessions map[[32]byte]*ServerSession closed bool @@ -45,23 +47,24 @@ type ServerConn struct { nonce []byte } -func (i *ServerInstance) Init(nfsDKeySeed []byte, xor uint32, minutes time.Duration) (err error) { +func (i *ServerInstance) Init(nfsDKeySeed, xorSKeyBytes []byte, xorMode, minutes uint32) (err error) { if i.nfsDKey != nil { err = errors.New("already initialized") return } - i.nfsDKey, err = mlkem.NewDecapsulationKey768(nfsDKeySeed) - if err != nil { + if i.nfsDKey, err = mlkem.NewDecapsulationKey768(nfsDKeySeed); err != nil { return } hash32 := sha3.Sum256(i.nfsDKey.EncapsulationKey().Bytes()) copy(i.hash11[:], hash32[:]) - if xor > 0 { - xorKey := sha3.Sum256(i.nfsDKey.EncapsulationKey().Bytes()) - i.xorKey = xorKey[:] + if xorMode > 0 { + i.xorMode = xorMode + if i.xorSKey, err = ecdh.X25519().NewPrivateKey(xorSKeyBytes); err != nil { + return + } } if minutes > 0 { - i.minutes = minutes + i.minutes = time.Duration(minutes) * time.Minute i.sessions = make(map[[32]byte]*ServerSession) go func() { for { @@ -95,8 +98,11 @@ func (i *ServerInstance) Handshake(conn net.Conn) (*ServerConn, error) { if i.nfsDKey == nil { return nil, errors.New("uninitialized") } - if i.xorKey != nil { - conn = NewXorConn(conn, i.xorKey) + if i.xorMode > 0 { + var err error + if conn, err = NewXorConn(conn, i.xorMode, nil, i.xorSKey); err != nil { + return nil, err + } } c := &ServerConn{Conn: conn} @@ -167,7 +173,7 @@ func (i *ServerInstance) Handshake(conn net.Conn) (*ServerConn, error) { pfsKey, encapsulatedPfsKey := pfsEKey.Encapsulate() c.baseKey = append(pfsKey, nfsKey...) - c.ticket = append(i.hash11[:], NewAead(c.cipher, c.baseKey, encapsulatedPfsKey, encapsulatedNfsKey).Seal(nil, peerClientHello[:12], []byte("VLESS"), pfsEKeyBytes)...) + c.ticket = append(i.hash11[:], NewAEAD(c.cipher, c.baseKey, encapsulatedPfsKey, encapsulatedNfsKey).Seal(nil, peerClientHello[:12], []byte("VLESS"), pfsEKeyBytes)...) paddingLen := randBetween(100, 1000) @@ -221,7 +227,7 @@ func (c *ServerConn) Read(b []byte) (int, error) { } c.peerRandom = peerTicketHello[32:] } - c.peerAead = NewAead(c.cipher, c.baseKey, c.peerRandom, c.ticket) + c.peerAead = NewAEAD(c.cipher, c.baseKey, c.peerRandom, c.ticket) c.peerNonce = make([]byte, 12) } if c.input.Len() > 0 { @@ -244,7 +250,7 @@ func (c *ServerConn) Read(b []byte) (int, error) { } var peerAead cipher.AEAD if bytes.Equal(c.peerNonce, MaxNonce) { - peerAead = NewAead(c.cipher, c.baseKey, peerData, h) + peerAead = NewAEAD(c.cipher, c.baseKey, peerData, h) } _, err = c.peerAead.Open(dst[:0], c.peerNonce, peerData, h) if peerAead != nil { @@ -280,7 +286,7 @@ func (c *ServerConn) Write(b []byte) (int, error) { EncodeHeader(data, 0, 32) rand.Read(data[5 : 5+32]) EncodeHeader(data[5+32:], 23, len(b)+16) - c.aead = NewAead(c.cipher, c.baseKey, data[5:5+32], c.peerRandom) + c.aead = NewAEAD(c.cipher, c.baseKey, data[5:5+32], c.peerRandom) c.nonce = make([]byte, 12) c.aead.Seal(data[:5+32+5], c.nonce, b, data[5+32:5+32+5]) } else { @@ -288,7 +294,7 @@ func (c *ServerConn) Write(b []byte) (int, error) { EncodeHeader(data, 23, len(b)+16) c.aead.Seal(data[:5], c.nonce, b, data[:5]) if bytes.Equal(c.nonce, MaxNonce) { - c.aead = NewAead(c.cipher, c.baseKey, data[5:], data[:5]) + c.aead = NewAEAD(c.cipher, c.baseKey, data[5:], data[:5]) } } IncreaseNonce(c.nonce) diff --git a/clash-meta/transport/vless/encryption/xor.go b/clash-meta/transport/vless/encryption/xor.go index caad12bf07..88bd76982e 100644 --- a/clash-meta/transport/vless/encryption/xor.go +++ b/clash-meta/transport/vless/encryption/xor.go @@ -3,13 +3,21 @@ package encryption import ( "crypto/aes" "crypto/cipher" + "crypto/ecdh" "crypto/rand" + "errors" "io" "net" + + "golang.org/x/crypto/hkdf" + "golang.org/x/crypto/sha3" ) type XorConn struct { net.Conn + Divide bool + + head []byte key []byte ctr cipher.Stream peerCtr cipher.Stream @@ -25,8 +33,55 @@ type XorConn struct { in_skip int } -func NewXorConn(conn net.Conn, key []byte) *XorConn { - return &XorConn{Conn: conn, key: key} +func NewCTR(key, iv []byte, isServer bool) cipher.Stream { + info := "CLIENT" + if isServer { + info = "SERVER" // avoids attackers sending traffic back to the client, though the encryption layer has its own protection + } + hkdf.New(sha3.New256, key, iv, []byte(info)).Read(key) // avoids using pKey directly if attackers sent the basepoint, or whaterver they like + block, _ := aes.NewCipher(key) + return cipher.NewCTR(block, iv) +} + +func NewXorConn(conn net.Conn, mode uint32, pKey *ecdh.PublicKey, sKey *ecdh.PrivateKey) (*XorConn, error) { + if mode == 0 || (pKey == nil && sKey == nil) || (pKey != nil && sKey != nil) { + return nil, errors.New("invalid parameters") + } + c := &XorConn{ + Conn: conn, + Divide: mode == 1, + isHeader: true, + out_header: make([]byte, 0, 5), // important + in_header: make([]byte, 0, 5), // important + } + if pKey != nil { + c.head = make([]byte, 16+32) + rand.Read(c.head) + eSKey, _ := ecdh.X25519().GenerateKey(rand.Reader) + NewCTR(pKey.Bytes(), c.head[:16], false).XORKeyStream(c.head[16:], eSKey.PublicKey().Bytes()) // make X25519 public key distinguishable from random bytes + c.key, _ = eSKey.ECDH(pKey) + c.ctr = NewCTR(c.key, c.head[:16], false) + } + if sKey != nil { + peerHead := make([]byte, 16+32) + if _, err := io.ReadFull(c.Conn, peerHead); err != nil { + return nil, err + } + NewCTR(sKey.PublicKey().Bytes(), peerHead[:16], false).XORKeyStream(peerHead[16:], peerHead[16:]) // we don't use buggy elligator, because we have PSK :) + ePKey, err := ecdh.X25519().NewPublicKey(peerHead[16:]) + if err != nil { + return nil, err + } + key, err := sKey.ECDH(ePKey) + if err != nil { + return nil, err + } + c.peerCtr = NewCTR(key, peerHead[:16], false) + c.head = make([]byte, 16) + rand.Read(c.head) // make sure the server always replies random bytes even when received replays, though it is not important + c.ctr = NewCTR(key, c.head, true) // the same key links the upload & download, though the encryption layer has its own link + } + return c, nil //chacha20.NewUnauthenticatedCipher() } @@ -35,13 +90,6 @@ func (c *XorConn) Write(b []byte) (int, error) { // whole one/two records return 0, nil } if !c.out_after0 { - var iv []byte - if c.ctr == nil { - block, _ := aes.NewCipher(c.key) - iv = make([]byte, 16) - rand.Read(iv) - c.ctr = cipher.NewCTR(block, iv) - } t, l, _ := DecodeHeader(b) if t == 23 { // single 23 l = 5 @@ -49,20 +97,24 @@ func (c *XorConn) Write(b []byte) (int, error) { // whole one/two records l += 10 if t == 0 { c.out_after0 = true - c.out_header = make([]byte, 0, 5) // important + if c.Divide { + l -= 5 + } } } c.ctr.XORKeyStream(b[:l], b[:l]) // caller MUST discard b - if iv != nil { - b = append(iv, b...) + l = len(b) + if c.head != nil { + b = append(c.head, b...) + c.head = nil } if _, err := c.Conn.Write(b); err != nil { return 0, err } - if iv != nil { - b = b[16:] // for len(b) - } - return len(b), nil + return l, nil + } + if c.Divide { + return c.Conn.Write(b) } for p := b; ; { // for XTLS if len(p) <= c.out_skip { @@ -93,14 +145,12 @@ func (c *XorConn) Read(b []byte) (int, error) { // 5-bytes, data, 5-bytes... return 0, nil } if !c.in_after0 || !c.isHeader { - if c.peerCtr == nil { + if c.peerCtr == nil { // for client peerIv := make([]byte, 16) if _, err := io.ReadFull(c.Conn, peerIv); err != nil { return 0, err } - block, _ := aes.NewCipher(c.key) - c.peerCtr = cipher.NewCTR(block, peerIv) - c.isHeader = true + c.peerCtr = NewCTR(c.key, peerIv, true) } if _, err := io.ReadFull(c.Conn, b); err != nil { return 0, err @@ -117,7 +167,6 @@ func (c *XorConn) Read(b []byte) (int, error) { // 5-bytes, data, 5-bytes... c.isHeader = false if t == 0 { c.in_after0 = true - c.in_header = make([]byte, 0, 5) // important } } } else { @@ -125,6 +174,9 @@ func (c *XorConn) Read(b []byte) (int, error) { // 5-bytes, data, 5-bytes... } return len(b), nil } + if c.Divide { + return c.Conn.Read(b) + } n, err := c.Conn.Read(b) for p := b[:n]; ; { // for XTLS if len(p) <= c.in_skip { @@ -146,3 +198,27 @@ func (c *XorConn) Read(b []byte) (int, error) { // 5-bytes, data, 5-bytes... } return n, err } + +func (c *XorConn) WriterReplaceable() bool { + if !c.Divide { // never replaceable + return false + } + if !c.out_after0 { + return false + } + return true +} + +func (c *XorConn) ReaderReplaceable() bool { + if !c.Divide { // never replaceable + return false + } + if !c.in_after0 || !c.isHeader { + return false + } + return true +} + +func (c *XorConn) Upstream() any { + return c.Conn +} diff --git a/clash-nyanpasu/frontend/nyanpasu/package.json b/clash-nyanpasu/frontend/nyanpasu/package.json index 214ad1edd0..5e2bd7f52a 100644 --- a/clash-nyanpasu/frontend/nyanpasu/package.json +++ b/clash-nyanpasu/frontend/nyanpasu/package.json @@ -19,7 +19,7 @@ "@mui/icons-material": "7.3.1", "@mui/lab": "7.0.0-beta.16", "@mui/material": "7.3.1", - "@mui/x-date-pickers": "8.10.0", + "@mui/x-date-pickers": "8.10.2", "@nyanpasu/interface": "workspace:^", "@nyanpasu/ui": "workspace:^", "@tailwindcss/postcss": "4.1.12", @@ -78,7 +78,7 @@ "@vitejs/plugin-react-swc": "4.0.1", "change-case": "5.4.4", "clsx": "2.1.1", - "core-js": "3.45.0", + "core-js": "3.45.1", "filesize": "11.0.2", "meta-json-schema": "1.19.12", "monaco-yaml": "5.4.0", diff --git a/clash-nyanpasu/manifest/version.json b/clash-nyanpasu/manifest/version.json index e9e7d5f2f9..8f6621fcca 100644 --- a/clash-nyanpasu/manifest/version.json +++ b/clash-nyanpasu/manifest/version.json @@ -2,7 +2,7 @@ "manifest_version": 1, "latest": { "mihomo": "v1.19.12", - "mihomo_alpha": "alpha-2790481", + "mihomo_alpha": "alpha-5f09db2", "clash_rs": "v0.9.0", "clash_premium": "2023-09-05-gdcc8d87", "clash_rs_alpha": "0.9.0-alpha+sha.51d55ef" @@ -69,5 +69,5 @@ "linux-armv7hf": "clash-armv7-unknown-linux-gnueabihf" } }, - "updated_at": "2025-08-19T22:21:14.276Z" + "updated_at": "2025-08-20T22:21:19.472Z" } diff --git a/clash-nyanpasu/package.json b/clash-nyanpasu/package.json index 36ed6a72a3..b38352fc39 100644 --- a/clash-nyanpasu/package.json +++ b/clash-nyanpasu/package.json @@ -67,8 +67,8 @@ "@types/fs-extra": "11.0.4", "@types/lodash-es": "4.17.12", "@types/node": "22.17.2", - "@typescript-eslint/eslint-plugin": "8.39.1", - "@typescript-eslint/parser": "8.39.1", + "@typescript-eslint/eslint-plugin": "8.40.0", + "@typescript-eslint/parser": "8.40.0", "autoprefixer": "10.4.21", "conventional-changelog-conventionalcommits": "9.1.0", "cross-env": "10.0.0", @@ -107,7 +107,7 @@ "tailwindcss": "4.1.12", "tsx": "4.20.4", "typescript": "5.9.2", - "typescript-eslint": "8.39.1" + "typescript-eslint": "8.40.0" }, "packageManager": "pnpm@10.14.0", "engines": { diff --git a/clash-nyanpasu/pnpm-lock.yaml b/clash-nyanpasu/pnpm-lock.yaml index 95af83b32b..f3ecfaef6e 100644 --- a/clash-nyanpasu/pnpm-lock.yaml +++ b/clash-nyanpasu/pnpm-lock.yaml @@ -50,11 +50,11 @@ importers: specifier: 22.17.2 version: 22.17.2 '@typescript-eslint/eslint-plugin': - specifier: 8.39.1 - version: 8.39.1(@typescript-eslint/parser@8.39.1(eslint@9.33.0(jiti@2.5.1))(typescript@5.9.2))(eslint@9.33.0(jiti@2.5.1))(typescript@5.9.2) + specifier: 8.40.0 + version: 8.40.0(@typescript-eslint/parser@8.40.0(eslint@9.33.0(jiti@2.5.1))(typescript@5.9.2))(eslint@9.33.0(jiti@2.5.1))(typescript@5.9.2) '@typescript-eslint/parser': - specifier: 8.39.1 - version: 8.39.1(eslint@9.33.0(jiti@2.5.1))(typescript@5.9.2) + specifier: 8.40.0 + version: 8.40.0(eslint@9.33.0(jiti@2.5.1))(typescript@5.9.2) autoprefixer: specifier: 10.4.21 version: 10.4.21(postcss@8.5.6) @@ -75,13 +75,13 @@ importers: version: 10.1.8(eslint@9.33.0(jiti@2.5.1)) eslint-import-resolver-alias: specifier: 1.1.2 - version: 1.1.2(eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.39.1(eslint@9.33.0(jiti@2.5.1))(typescript@5.9.2))(eslint@9.33.0(jiti@2.5.1))) + version: 1.1.2(eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.40.0(eslint@9.33.0(jiti@2.5.1))(typescript@5.9.2))(eslint@9.33.0(jiti@2.5.1))) eslint-plugin-html: specifier: 8.1.3 version: 8.1.3 eslint-plugin-import: specifier: 2.32.0 - version: 2.32.0(@typescript-eslint/parser@8.39.1(eslint@9.33.0(jiti@2.5.1))(typescript@5.9.2))(eslint@9.33.0(jiti@2.5.1)) + version: 2.32.0(@typescript-eslint/parser@8.40.0(eslint@9.33.0(jiti@2.5.1))(typescript@5.9.2))(eslint@9.33.0(jiti@2.5.1)) eslint-plugin-n: specifier: 17.21.3 version: 17.21.3(eslint@9.33.0(jiti@2.5.1))(typescript@5.9.2) @@ -111,7 +111,7 @@ importers: version: 16.1.5 neostandard: specifier: 0.12.2 - version: 0.12.2(@typescript-eslint/utils@8.39.1(eslint@9.33.0(jiti@2.5.1))(typescript@5.9.2))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.39.1(eslint@9.33.0(jiti@2.5.1))(typescript@5.9.2))(eslint@9.33.0(jiti@2.5.1)))(eslint@9.33.0(jiti@2.5.1))(typescript@5.9.2) + version: 0.12.2(@typescript-eslint/utils@8.40.0(eslint@9.33.0(jiti@2.5.1))(typescript@5.9.2))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.40.0(eslint@9.33.0(jiti@2.5.1))(typescript@5.9.2))(eslint@9.33.0(jiti@2.5.1)))(eslint@9.33.0(jiti@2.5.1))(typescript@5.9.2) npm-run-all2: specifier: 8.0.4 version: 8.0.4 @@ -170,8 +170,8 @@ importers: specifier: 5.9.2 version: 5.9.2 typescript-eslint: - specifier: 8.39.1 - version: 8.39.1(eslint@9.33.0(jiti@2.5.1))(typescript@5.9.2) + specifier: 8.40.0 + version: 8.40.0(eslint@9.33.0(jiti@2.5.1))(typescript@5.9.2) frontend/interface: dependencies: @@ -237,8 +237,8 @@ importers: specifier: 7.3.1 version: 7.3.1(@emotion/react@11.14.0(@types/react@19.1.10)(react@19.1.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.1.10)(react@19.1.1))(@types/react@19.1.10)(react@19.1.1))(@types/react@19.1.10)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) '@mui/x-date-pickers': - specifier: 8.10.0 - version: 8.10.0(@emotion/react@11.14.0(@types/react@19.1.10)(react@19.1.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.1.10)(react@19.1.1))(@types/react@19.1.10)(react@19.1.1))(@mui/material@7.3.1(@emotion/react@11.14.0(@types/react@19.1.10)(react@19.1.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.1.10)(react@19.1.1))(@types/react@19.1.10)(react@19.1.1))(@types/react@19.1.10)(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(@mui/system@7.3.1(@emotion/react@11.14.0(@types/react@19.1.10)(react@19.1.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.1.10)(react@19.1.1))(@types/react@19.1.10)(react@19.1.1))(@types/react@19.1.10)(react@19.1.1))(@types/react@19.1.10)(dayjs@1.11.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + specifier: 8.10.2 + version: 8.10.2(@emotion/react@11.14.0(@types/react@19.1.10)(react@19.1.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.1.10)(react@19.1.1))(@types/react@19.1.10)(react@19.1.1))(@mui/material@7.3.1(@emotion/react@11.14.0(@types/react@19.1.10)(react@19.1.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.1.10)(react@19.1.1))(@types/react@19.1.10)(react@19.1.1))(@types/react@19.1.10)(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(@mui/system@7.3.1(@emotion/react@11.14.0(@types/react@19.1.10)(react@19.1.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.1.10)(react@19.1.1))(@types/react@19.1.10)(react@19.1.1))(@types/react@19.1.10)(react@19.1.1))(@types/react@19.1.10)(dayjs@1.11.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) '@nyanpasu/interface': specifier: workspace:^ version: link:../interface @@ -286,7 +286,7 @@ importers: version: 0.4.0 material-react-table: specifier: npm:@greenhat616/material-react-table@4.0.0 - version: '@greenhat616/material-react-table@4.0.0(098023d060c5c1c6a96afb3bdaa051b0)' + version: '@greenhat616/material-react-table@4.0.0(d0e09da0dd57ee89e64ea69924c8dcff)' monaco-editor: specifier: 0.52.2 version: 0.52.2 @@ -307,7 +307,7 @@ importers: version: 1.6.5(react-dom@19.1.1(react@19.1.1))(react@19.1.1) react-hook-form-mui: specifier: 7.6.2 - version: 7.6.2(aea177882beb7723aeada5c99e57089b) + version: 7.6.2(8d03dcd7938824115d8443966a6d9038) react-i18next: specifier: 15.6.1 version: 15.6.1(i18next@25.3.6(typescript@5.9.2))(react-dom@19.1.1(react@19.1.1))(react@19.1.1)(typescript@5.9.2) @@ -409,8 +409,8 @@ importers: specifier: 2.1.1 version: 2.1.1 core-js: - specifier: 3.45.0 - version: 3.45.0 + specifier: 3.45.1 + version: 3.45.1 filesize: specifier: 11.0.2 version: 11.0.2 @@ -1970,8 +1970,8 @@ packages: '@types/react': optional: true - '@mui/x-date-pickers@8.10.0': - resolution: {integrity: sha512-3nY+SS2/JtqcptQodECIyWKsTvPBDAcXKkyW65R4rQUCrnV6tuzriSrzy/FEYqTK0hyXYPIGJhQ6A0FbtQ9AkQ==} + '@mui/x-date-pickers@8.10.2': + resolution: {integrity: sha512-eS5t1jUojN/jL2FeJ8gtpCBxIEswUp9kLjM64aJ5LUKrNgM7X9dwsEHyplS+x07kWLiEAhO3nX3mepnS3Z43qg==} engines: {node: '>=14.0.0'} peerDependencies: '@emotion/react': ^11.9.0 @@ -2007,8 +2007,8 @@ packages: moment-jalaali: optional: true - '@mui/x-internals@8.10.0': - resolution: {integrity: sha512-stYhWBeCKfV2/ltAWShZ3ZJ51otbqpMpC+krWWoIsxM8TuvGzwXw5YMU9L2fTb8hRstsiOCQfEzIn12Ii7+N0Q==} + '@mui/x-internals@8.10.2': + resolution: {integrity: sha512-dlC0BQRRBdiWtqn1yDppaHYRUjU3OuPWTxy0UtqxDaJjJf4pfR8ALr243nbxgJAFqvQyWPWyO4A6p9x9eJMJEQ==} engines: {node: '>=14.0.0'} peerDependencies: react: ^17.0.0 || ^18.0.0 || ^19.0.0 @@ -3427,16 +3427,16 @@ packages: '@types/yauzl@2.10.3': resolution: {integrity: sha512-oJoftv0LSuaDZE3Le4DbKX+KS9G36NzOeSap90UIK0yMA/NhKJhqlSGtNDORNRaIbQfzjXDrQa0ytJ6mNRGz/Q==} - '@typescript-eslint/eslint-plugin@8.39.1': - resolution: {integrity: sha512-yYegZ5n3Yr6eOcqgj2nJH8cH/ZZgF+l0YIdKILSDjYFRjgYQMgv/lRjV5Z7Up04b9VYUondt8EPMqg7kTWgJ2g==} + '@typescript-eslint/eslint-plugin@8.40.0': + resolution: {integrity: sha512-w/EboPlBwnmOBtRbiOvzjD+wdiZdgFeo17lkltrtn7X37vagKKWJABvyfsJXTlHe6XBzugmYgd4A4nW+k8Mixw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: - '@typescript-eslint/parser': ^8.39.1 + '@typescript-eslint/parser': ^8.40.0 eslint: ^8.57.0 || ^9.0.0 typescript: '>=4.8.4 <6.0.0' - '@typescript-eslint/parser@8.39.1': - resolution: {integrity: sha512-pUXGCuHnnKw6PyYq93lLRiZm3vjuslIy7tus1lIQTYVK9bL8XBgJnCWm8a0KcTtHC84Yya1Q6rtll+duSMj0dg==} + '@typescript-eslint/parser@8.40.0': + resolution: {integrity: sha512-jCNyAuXx8dr5KJMkecGmZ8KI61KBUhkCob+SD+C+I5+Y1FWI2Y3QmY4/cxMCC5WAsZqoEtEETVhUiUMIGCf6Bw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 @@ -3448,8 +3448,8 @@ packages: peerDependencies: typescript: '>=4.8.4 <5.9.0' - '@typescript-eslint/project-service@8.39.1': - resolution: {integrity: sha512-8fZxek3ONTwBu9ptw5nCKqZOSkXshZB7uAxuFF0J/wTMkKydjXCzqqga7MlFMpHi9DoG4BadhmTkITBcg8Aybw==} + '@typescript-eslint/project-service@8.40.0': + resolution: {integrity: sha512-/A89vz7Wf5DEXsGVvcGdYKbVM9F7DyFXj52lNYUDS1L9yJfqjW/fIp5PgMuEJL/KeqVTe2QSbXAGUZljDUpArw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: '>=4.8.4 <6.0.0' @@ -3458,8 +3458,8 @@ packages: resolution: {integrity: sha512-WJw3AVlFFcdT9Ri1xs/lg8LwDqgekWXWhH3iAF+1ZM+QPd7oxQ6jvtW/JPwzAScxitILUIFs0/AnQ/UWHzbATQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/scope-manager@8.39.1': - resolution: {integrity: sha512-RkBKGBrjgskFGWuyUGz/EtD8AF/GW49S21J8dvMzpJitOF1slLEbbHnNEtAHtnDAnx8qDEdRrULRnWVx27wGBw==} + '@typescript-eslint/scope-manager@8.40.0': + resolution: {integrity: sha512-y9ObStCcdCiZKzwqsE8CcpyuVMwRouJbbSrNuThDpv16dFAj429IkM6LNb1dZ2m7hK5fHyzNcErZf7CEeKXR4w==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@typescript-eslint/tsconfig-utils@8.38.0': @@ -3468,20 +3468,20 @@ packages: peerDependencies: typescript: '>=4.8.4 <5.9.0' - '@typescript-eslint/tsconfig-utils@8.39.0': - resolution: {integrity: sha512-Fd3/QjmFV2sKmvv3Mrj8r6N8CryYiCS8Wdb/6/rgOXAWGcFuc+VkQuG28uk/4kVNVZBQuuDHEDUpo/pQ32zsIQ==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - peerDependencies: - typescript: '>=4.8.4 <6.0.0' - '@typescript-eslint/tsconfig-utils@8.39.1': resolution: {integrity: sha512-ePUPGVtTMR8XMU2Hee8kD0Pu4NDE1CN9Q1sxGSGd/mbOtGZDM7pnhXNJnzW63zk/q+Z54zVzj44HtwXln5CvHA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: '>=4.8.4 <6.0.0' - '@typescript-eslint/type-utils@8.39.1': - resolution: {integrity: sha512-gu9/ahyatyAdQbKeHnhT4R+y3YLtqqHyvkfDxaBYk97EcbfChSJXyaJnIL3ygUv7OuZatePHmQvuH5ru0lnVeA==} + '@typescript-eslint/tsconfig-utils@8.40.0': + resolution: {integrity: sha512-jtMytmUaG9d/9kqSl/W3E3xaWESo4hFDxAIHGVW/WKKtQhesnRIJSAJO6XckluuJ6KDB5woD1EiqknriCtAmcw==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + typescript: '>=4.8.4 <6.0.0' + + '@typescript-eslint/type-utils@8.40.0': + resolution: {integrity: sha512-eE60cK4KzAc6ZrzlJnflXdrMqOBaugeukWICO2rB0KNvwdIMaEaYiywwHMzA1qFpTxrLhN9Lp4E/00EgWcD3Ow==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 @@ -3495,22 +3495,22 @@ packages: resolution: {integrity: sha512-wzkUfX3plUqij4YwWaJyqhiPE5UCRVlFpKn1oCRn2O1bJ592XxWJj8ROQ3JD5MYXLORW84063z3tZTb/cs4Tyw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/types@8.39.0': - resolution: {integrity: sha512-ArDdaOllnCj3yn/lzKn9s0pBQYmmyme/v1HbGIGB0GB/knFI3fWMHloC+oYTJW46tVbYnGKTMDK4ah1sC2v0Kg==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/types@8.39.1': resolution: {integrity: sha512-7sPDKQQp+S11laqTrhHqeAbsCfMkwJMrV7oTDvtDds4mEofJYir414bYKUEb8YPUm9QL3U+8f6L6YExSoAGdQw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@typescript-eslint/types@8.40.0': + resolution: {integrity: sha512-ETdbFlgbAmXHyFPwqUIYrfc12ArvpBhEVgGAxVYSwli26dn8Ko+lIo4Su9vI9ykTZdJn+vJprs/0eZU0YMAEQg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@typescript-eslint/typescript-estree@8.38.0': resolution: {integrity: sha512-fooELKcAKzxux6fA6pxOflpNS0jc+nOQEEOipXFNjSlBS6fqrJOVY/whSn70SScHrcJ2LDsxWrneFoWYSVfqhQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: '>=4.8.4 <5.9.0' - '@typescript-eslint/typescript-estree@8.39.1': - resolution: {integrity: sha512-EKkpcPuIux48dddVDXyQBlKdeTPMmALqBUbEk38McWv0qVEZwOpVJBi7ugK5qVNgeuYjGNQxrrnoM/5+TI/BPw==} + '@typescript-eslint/typescript-estree@8.40.0': + resolution: {integrity: sha512-k1z9+GJReVVOkc1WfVKs1vBrR5MIKKbdAjDTPvIK3L8De6KbFfPFt6BKpdkdk7rZS2GtC/m6yI5MYX+UsuvVYQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: '>=4.8.4 <6.0.0' @@ -3522,8 +3522,8 @@ packages: eslint: ^8.57.0 || ^9.0.0 typescript: '>=4.8.4 <5.9.0' - '@typescript-eslint/utils@8.39.1': - resolution: {integrity: sha512-VF5tZ2XnUSTuiqZFXCZfZs1cgkdd3O/sSYmdo2EpSyDlC86UM/8YytTmKnehOW3TGAlivqTDT6bS87B/GQ/jyg==} + '@typescript-eslint/utils@8.40.0': + resolution: {integrity: sha512-Cgzi2MXSZyAUOY+BFwGs17s7ad/7L+gKt6Y8rAVVWS+7o6wrjeFN4nVfTpbE25MNcxyJ+iYUXflbs2xR9h4UBg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 @@ -3533,8 +3533,8 @@ packages: resolution: {integrity: sha512-pWrTcoFNWuwHlA9CvlfSsGWs14JxfN1TH25zM5L7o0pRLhsoZkDnTsXfQRJBEWJoV5DL0jf+Z+sxiud+K0mq1g==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/visitor-keys@8.39.1': - resolution: {integrity: sha512-W8FQi6kEh2e8zVhQ0eeRnxdvIoOkAp/CPAahcNio6nO9dsIwb9b34z90KOlheoyuVf6LSOEdjlkxSkapNEc+4A==} + '@typescript-eslint/visitor-keys@8.40.0': + resolution: {integrity: sha512-8CZ47QwalyRjsypfwnbI3hKy5gJDPmrkLjkgMxhi0+DZZ2QNx2naS6/hWoVYUHU7LU2zleF68V9miaVZvhFfTA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@ungap/structured-clone@1.2.0': @@ -4253,8 +4253,8 @@ packages: core-js-compat@3.44.0: resolution: {integrity: sha512-JepmAj2zfl6ogy34qfWtcE7nHKAJnKsQFRn++scjVS2bZFllwptzw61BZcZFYBPpUznLfAvh0LGhxKppk04ClA==} - core-js@3.45.0: - resolution: {integrity: sha512-c2KZL9lP4DjkN3hk/an4pWn5b5ZefhRJnAc42n6LJ19kSnbeRbdQZE5dSeE2LBol1OwJD3X1BQvFTAsa8ReeDA==} + core-js@3.45.1: + resolution: {integrity: sha512-L4NPsJlCfZsPeXukyzHFlg/i7IIVwHSItR0wg0FLNqYClJ4MQYTYLbC7EkjKYRLZF2iof2MUgN0EGy7MdQFChg==} cosmiconfig-typescript-loader@6.1.0: resolution: {integrity: sha512-tJ1w35ZRUiM5FeTzT7DtYWAFFv37ZLqSRkGi2oeCK1gPhvaWjkAtfXvLmvE1pRfxxp9aQo6ba/Pvg1dKj05D4g==} @@ -8133,8 +8133,8 @@ packages: typedarray-to-buffer@3.1.5: resolution: {integrity: sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==} - typescript-eslint@8.39.1: - resolution: {integrity: sha512-GDUv6/NDYngUlNvwaHM1RamYftxf782IyEDbdj3SeaIHHv8fNQVRC++fITT7kUJV/5rIA/tkoRSSskt6osEfqg==} + typescript-eslint@8.40.0: + resolution: {integrity: sha512-Xvd2l+ZmFDPEt4oj1QEXzA4A2uUK6opvKu3eGN9aGjB8au02lIVcLyi375w94hHyejTOmzIU77L8ol2sRg9n7Q==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 @@ -8765,7 +8765,7 @@ snapshots: '@babel/generator@7.17.7': dependencies: - '@babel/types': 7.28.1 + '@babel/types': 7.28.2 jsesc: 2.5.2 source-map: 0.5.7 optional: true @@ -8856,20 +8856,20 @@ snapshots: '@babel/helper-environment-visitor@7.24.7': dependencies: - '@babel/types': 7.28.1 + '@babel/types': 7.28.2 optional: true '@babel/helper-function-name@7.24.7': dependencies: '@babel/template': 7.27.2 - '@babel/types': 7.28.1 + '@babel/types': 7.28.2 optional: true '@babel/helper-globals@7.28.0': {} '@babel/helper-hoist-variables@7.24.7': dependencies: - '@babel/types': 7.28.1 + '@babel/types': 7.28.2 optional: true '@babel/helper-member-expression-to-functions@7.25.9': @@ -8982,7 +8982,7 @@ snapshots: '@babel/helper-split-export-declaration@7.24.7': dependencies: - '@babel/types': 7.28.1 + '@babel/types': 7.28.2 optional: true '@babel/helper-string-parser@7.27.1': {} @@ -9574,13 +9574,13 @@ snapshots: '@babel/traverse@7.23.2': dependencies: '@babel/code-frame': 7.27.1 - '@babel/generator': 7.28.0 + '@babel/generator': 7.28.3 '@babel/helper-environment-visitor': 7.24.7 '@babel/helper-function-name': 7.24.7 '@babel/helper-hoist-variables': 7.24.7 '@babel/helper-split-export-declaration': 7.24.7 - '@babel/parser': 7.28.0 - '@babel/types': 7.28.1 + '@babel/parser': 7.28.3 + '@babel/types': 7.28.2 debug: 4.4.1 globals: 11.12.0 transitivePeerDependencies: @@ -10032,13 +10032,13 @@ snapshots: '@fastify/busboy@2.1.1': {} - '@greenhat616/material-react-table@4.0.0(098023d060c5c1c6a96afb3bdaa051b0)': + '@greenhat616/material-react-table@4.0.0(d0e09da0dd57ee89e64ea69924c8dcff)': dependencies: '@emotion/react': 11.14.0(@types/react@19.1.10)(react@19.1.1) '@emotion/styled': 11.14.1(@emotion/react@11.14.0(@types/react@19.1.10)(react@19.1.1))(@types/react@19.1.10)(react@19.1.1) '@mui/icons-material': 7.3.1(@mui/material@7.3.1(@emotion/react@11.14.0(@types/react@19.1.10)(react@19.1.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.1.10)(react@19.1.1))(@types/react@19.1.10)(react@19.1.1))(@types/react@19.1.10)(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(@types/react@19.1.10)(react@19.1.1) '@mui/material': 7.3.1(@emotion/react@11.14.0(@types/react@19.1.10)(react@19.1.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.1.10)(react@19.1.1))(@types/react@19.1.10)(react@19.1.1))(@types/react@19.1.10)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) - '@mui/x-date-pickers': 8.10.0(@emotion/react@11.14.0(@types/react@19.1.10)(react@19.1.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.1.10)(react@19.1.1))(@types/react@19.1.10)(react@19.1.1))(@mui/material@7.3.1(@emotion/react@11.14.0(@types/react@19.1.10)(react@19.1.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.1.10)(react@19.1.1))(@types/react@19.1.10)(react@19.1.1))(@types/react@19.1.10)(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(@mui/system@7.3.1(@emotion/react@11.14.0(@types/react@19.1.10)(react@19.1.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.1.10)(react@19.1.1))(@types/react@19.1.10)(react@19.1.1))(@types/react@19.1.10)(react@19.1.1))(@types/react@19.1.10)(dayjs@1.11.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + '@mui/x-date-pickers': 8.10.2(@emotion/react@11.14.0(@types/react@19.1.10)(react@19.1.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.1.10)(react@19.1.1))(@types/react@19.1.10)(react@19.1.1))(@mui/material@7.3.1(@emotion/react@11.14.0(@types/react@19.1.10)(react@19.1.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.1.10)(react@19.1.1))(@types/react@19.1.10)(react@19.1.1))(@types/react@19.1.10)(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(@mui/system@7.3.1(@emotion/react@11.14.0(@types/react@19.1.10)(react@19.1.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.1.10)(react@19.1.1))(@types/react@19.1.10)(react@19.1.1))(@types/react@19.1.10)(react@19.1.1))(@types/react@19.1.10)(dayjs@1.11.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) '@tanstack/match-sorter-utils': 8.19.4 '@tanstack/react-table': 8.21.3(react-dom@19.1.1(react@19.1.1))(react@19.1.1) '@tanstack/react-virtual': 3.13.9(react-dom@19.1.1(react@19.1.1))(react@19.1.1) @@ -10286,13 +10286,13 @@ snapshots: optionalDependencies: '@types/react': 19.1.10 - '@mui/x-date-pickers@8.10.0(@emotion/react@11.14.0(@types/react@19.1.10)(react@19.1.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.1.10)(react@19.1.1))(@types/react@19.1.10)(react@19.1.1))(@mui/material@7.3.1(@emotion/react@11.14.0(@types/react@19.1.10)(react@19.1.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.1.10)(react@19.1.1))(@types/react@19.1.10)(react@19.1.1))(@types/react@19.1.10)(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(@mui/system@7.3.1(@emotion/react@11.14.0(@types/react@19.1.10)(react@19.1.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.1.10)(react@19.1.1))(@types/react@19.1.10)(react@19.1.1))(@types/react@19.1.10)(react@19.1.1))(@types/react@19.1.10)(dayjs@1.11.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)': + '@mui/x-date-pickers@8.10.2(@emotion/react@11.14.0(@types/react@19.1.10)(react@19.1.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.1.10)(react@19.1.1))(@types/react@19.1.10)(react@19.1.1))(@mui/material@7.3.1(@emotion/react@11.14.0(@types/react@19.1.10)(react@19.1.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.1.10)(react@19.1.1))(@types/react@19.1.10)(react@19.1.1))(@types/react@19.1.10)(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(@mui/system@7.3.1(@emotion/react@11.14.0(@types/react@19.1.10)(react@19.1.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.1.10)(react@19.1.1))(@types/react@19.1.10)(react@19.1.1))(@types/react@19.1.10)(react@19.1.1))(@types/react@19.1.10)(dayjs@1.11.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)': dependencies: '@babel/runtime': 7.28.2 '@mui/material': 7.3.1(@emotion/react@11.14.0(@types/react@19.1.10)(react@19.1.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.1.10)(react@19.1.1))(@types/react@19.1.10)(react@19.1.1))(@types/react@19.1.10)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) '@mui/system': 7.3.1(@emotion/react@11.14.0(@types/react@19.1.10)(react@19.1.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.1.10)(react@19.1.1))(@types/react@19.1.10)(react@19.1.1))(@types/react@19.1.10)(react@19.1.1) '@mui/utils': 7.3.1(@types/react@19.1.10)(react@19.1.1) - '@mui/x-internals': 8.10.0(@types/react@19.1.10)(react@19.1.1) + '@mui/x-internals': 8.10.2(@types/react@19.1.10)(react@19.1.1) '@types/react-transition-group': 4.4.12(@types/react@19.1.10) clsx: 2.1.1 prop-types: 15.8.1 @@ -10306,7 +10306,7 @@ snapshots: transitivePeerDependencies: - '@types/react' - '@mui/x-internals@8.10.0(@types/react@19.1.10)(react@19.1.1)': + '@mui/x-internals@8.10.2(@types/react@19.1.10)(react@19.1.1)': dependencies: '@babel/runtime': 7.28.2 '@mui/utils': 7.3.1(@types/react@19.1.10)(react@19.1.1) @@ -11377,7 +11377,7 @@ snapshots: '@trivago/prettier-plugin-sort-imports@4.3.0(prettier@3.6.2)': dependencies: '@babel/generator': 7.17.7 - '@babel/parser': 7.28.0 + '@babel/parser': 7.28.3 '@babel/traverse': 7.23.2 '@babel/types': 7.17.0 javascript-natural-sort: 0.7.1 @@ -11657,14 +11657,14 @@ snapshots: '@types/node': 22.17.2 optional: true - '@typescript-eslint/eslint-plugin@8.39.1(@typescript-eslint/parser@8.39.1(eslint@9.33.0(jiti@2.5.1))(typescript@5.9.2))(eslint@9.33.0(jiti@2.5.1))(typescript@5.9.2)': + '@typescript-eslint/eslint-plugin@8.40.0(@typescript-eslint/parser@8.40.0(eslint@9.33.0(jiti@2.5.1))(typescript@5.9.2))(eslint@9.33.0(jiti@2.5.1))(typescript@5.9.2)': dependencies: '@eslint-community/regexpp': 4.12.1 - '@typescript-eslint/parser': 8.39.1(eslint@9.33.0(jiti@2.5.1))(typescript@5.9.2) - '@typescript-eslint/scope-manager': 8.39.1 - '@typescript-eslint/type-utils': 8.39.1(eslint@9.33.0(jiti@2.5.1))(typescript@5.9.2) - '@typescript-eslint/utils': 8.39.1(eslint@9.33.0(jiti@2.5.1))(typescript@5.9.2) - '@typescript-eslint/visitor-keys': 8.39.1 + '@typescript-eslint/parser': 8.40.0(eslint@9.33.0(jiti@2.5.1))(typescript@5.9.2) + '@typescript-eslint/scope-manager': 8.40.0 + '@typescript-eslint/type-utils': 8.40.0(eslint@9.33.0(jiti@2.5.1))(typescript@5.9.2) + '@typescript-eslint/utils': 8.40.0(eslint@9.33.0(jiti@2.5.1))(typescript@5.9.2) + '@typescript-eslint/visitor-keys': 8.40.0 eslint: 9.33.0(jiti@2.5.1) graphemer: 1.4.0 ignore: 7.0.5 @@ -11674,12 +11674,12 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/parser@8.39.1(eslint@9.33.0(jiti@2.5.1))(typescript@5.9.2)': + '@typescript-eslint/parser@8.40.0(eslint@9.33.0(jiti@2.5.1))(typescript@5.9.2)': dependencies: - '@typescript-eslint/scope-manager': 8.39.1 - '@typescript-eslint/types': 8.39.1 - '@typescript-eslint/typescript-estree': 8.39.1(typescript@5.9.2) - '@typescript-eslint/visitor-keys': 8.39.1 + '@typescript-eslint/scope-manager': 8.40.0 + '@typescript-eslint/types': 8.40.0 + '@typescript-eslint/typescript-estree': 8.40.0(typescript@5.9.2) + '@typescript-eslint/visitor-keys': 8.40.0 debug: 4.4.1 eslint: 9.33.0(jiti@2.5.1) typescript: 5.9.2 @@ -11688,17 +11688,17 @@ snapshots: '@typescript-eslint/project-service@8.38.0(typescript@5.9.2)': dependencies: - '@typescript-eslint/tsconfig-utils': 8.39.0(typescript@5.9.2) - '@typescript-eslint/types': 8.39.0 + '@typescript-eslint/tsconfig-utils': 8.39.1(typescript@5.9.2) + '@typescript-eslint/types': 8.39.1 debug: 4.4.1 typescript: 5.9.2 transitivePeerDependencies: - supports-color - '@typescript-eslint/project-service@8.39.1(typescript@5.9.2)': + '@typescript-eslint/project-service@8.40.0(typescript@5.9.2)': dependencies: - '@typescript-eslint/tsconfig-utils': 8.39.1(typescript@5.9.2) - '@typescript-eslint/types': 8.39.1 + '@typescript-eslint/tsconfig-utils': 8.40.0(typescript@5.9.2) + '@typescript-eslint/types': 8.40.0 debug: 4.4.1 typescript: 5.9.2 transitivePeerDependencies: @@ -11709,28 +11709,28 @@ snapshots: '@typescript-eslint/types': 8.38.0 '@typescript-eslint/visitor-keys': 8.38.0 - '@typescript-eslint/scope-manager@8.39.1': + '@typescript-eslint/scope-manager@8.40.0': dependencies: - '@typescript-eslint/types': 8.39.1 - '@typescript-eslint/visitor-keys': 8.39.1 + '@typescript-eslint/types': 8.40.0 + '@typescript-eslint/visitor-keys': 8.40.0 '@typescript-eslint/tsconfig-utils@8.38.0(typescript@5.9.2)': dependencies: typescript: 5.9.2 - '@typescript-eslint/tsconfig-utils@8.39.0(typescript@5.9.2)': - dependencies: - typescript: 5.9.2 - '@typescript-eslint/tsconfig-utils@8.39.1(typescript@5.9.2)': dependencies: typescript: 5.9.2 - '@typescript-eslint/type-utils@8.39.1(eslint@9.33.0(jiti@2.5.1))(typescript@5.9.2)': + '@typescript-eslint/tsconfig-utils@8.40.0(typescript@5.9.2)': dependencies: - '@typescript-eslint/types': 8.39.1 - '@typescript-eslint/typescript-estree': 8.39.1(typescript@5.9.2) - '@typescript-eslint/utils': 8.39.1(eslint@9.33.0(jiti@2.5.1))(typescript@5.9.2) + typescript: 5.9.2 + + '@typescript-eslint/type-utils@8.40.0(eslint@9.33.0(jiti@2.5.1))(typescript@5.9.2)': + dependencies: + '@typescript-eslint/types': 8.40.0 + '@typescript-eslint/typescript-estree': 8.40.0(typescript@5.9.2) + '@typescript-eslint/utils': 8.40.0(eslint@9.33.0(jiti@2.5.1))(typescript@5.9.2) debug: 4.4.1 eslint: 9.33.0(jiti@2.5.1) ts-api-utils: 2.1.0(typescript@5.9.2) @@ -11742,10 +11742,10 @@ snapshots: '@typescript-eslint/types@8.38.0': {} - '@typescript-eslint/types@8.39.0': {} - '@typescript-eslint/types@8.39.1': {} + '@typescript-eslint/types@8.40.0': {} + '@typescript-eslint/typescript-estree@8.38.0(typescript@5.9.2)': dependencies: '@typescript-eslint/project-service': 8.38.0(typescript@5.9.2) @@ -11762,12 +11762,12 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/typescript-estree@8.39.1(typescript@5.9.2)': + '@typescript-eslint/typescript-estree@8.40.0(typescript@5.9.2)': dependencies: - '@typescript-eslint/project-service': 8.39.1(typescript@5.9.2) - '@typescript-eslint/tsconfig-utils': 8.39.1(typescript@5.9.2) - '@typescript-eslint/types': 8.39.1 - '@typescript-eslint/visitor-keys': 8.39.1 + '@typescript-eslint/project-service': 8.40.0(typescript@5.9.2) + '@typescript-eslint/tsconfig-utils': 8.40.0(typescript@5.9.2) + '@typescript-eslint/types': 8.40.0 + '@typescript-eslint/visitor-keys': 8.40.0 debug: 4.4.1 fast-glob: 3.3.3 is-glob: 4.0.3 @@ -11789,12 +11789,12 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/utils@8.39.1(eslint@9.33.0(jiti@2.5.1))(typescript@5.9.2)': + '@typescript-eslint/utils@8.40.0(eslint@9.33.0(jiti@2.5.1))(typescript@5.9.2)': dependencies: '@eslint-community/eslint-utils': 4.7.0(eslint@9.33.0(jiti@2.5.1)) - '@typescript-eslint/scope-manager': 8.39.1 - '@typescript-eslint/types': 8.39.1 - '@typescript-eslint/typescript-estree': 8.39.1(typescript@5.9.2) + '@typescript-eslint/scope-manager': 8.40.0 + '@typescript-eslint/types': 8.40.0 + '@typescript-eslint/typescript-estree': 8.40.0(typescript@5.9.2) eslint: 9.33.0(jiti@2.5.1) typescript: 5.9.2 transitivePeerDependencies: @@ -11805,9 +11805,9 @@ snapshots: '@typescript-eslint/types': 8.38.0 eslint-visitor-keys: 4.2.1 - '@typescript-eslint/visitor-keys@8.39.1': + '@typescript-eslint/visitor-keys@8.40.0': dependencies: - '@typescript-eslint/types': 8.39.1 + '@typescript-eslint/types': 8.40.0 eslint-visitor-keys: 4.2.1 '@ungap/structured-clone@1.2.0': {} @@ -11881,7 +11881,7 @@ snapshots: babel-plugin-polyfill-regenerator: 0.6.5(@babel/core@7.28.0) browserslist: 4.25.1 browserslist-to-esbuild: 2.1.1(browserslist@4.25.1) - core-js: 3.45.0 + core-js: 3.45.1 magic-string: 0.30.17 regenerator-runtime: 0.14.1 systemjs: 6.15.1 @@ -12584,7 +12584,7 @@ snapshots: dependencies: browserslist: 4.25.1 - core-js@3.45.0: {} + core-js@3.45.1: {} cosmiconfig-typescript-loader@6.1.0(@types/node@22.17.2)(cosmiconfig@9.0.0(typescript@5.9.2))(typescript@5.9.2): dependencies: @@ -13397,9 +13397,9 @@ snapshots: optionalDependencies: unrs-resolver: 1.10.1 - eslint-import-resolver-alias@1.1.2(eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.39.1(eslint@9.33.0(jiti@2.5.1))(typescript@5.9.2))(eslint@9.33.0(jiti@2.5.1))): + eslint-import-resolver-alias@1.1.2(eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.40.0(eslint@9.33.0(jiti@2.5.1))(typescript@5.9.2))(eslint@9.33.0(jiti@2.5.1))): dependencies: - eslint-plugin-import: 2.32.0(@typescript-eslint/parser@8.39.1(eslint@9.33.0(jiti@2.5.1))(typescript@5.9.2))(eslint@9.33.0(jiti@2.5.1)) + eslint-plugin-import: 2.32.0(@typescript-eslint/parser@8.40.0(eslint@9.33.0(jiti@2.5.1))(typescript@5.9.2))(eslint@9.33.0(jiti@2.5.1)) eslint-import-resolver-node@0.3.9: dependencies: @@ -13409,7 +13409,7 @@ snapshots: transitivePeerDependencies: - supports-color - eslint-import-resolver-typescript@3.10.1(eslint-plugin-import-x@4.16.1(@typescript-eslint/utils@8.39.1(eslint@9.33.0(jiti@2.5.1))(typescript@5.9.2))(eslint-import-resolver-node@0.3.9)(eslint@9.33.0(jiti@2.5.1)))(eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.39.1(eslint@9.33.0(jiti@2.5.1))(typescript@5.9.2))(eslint@9.33.0(jiti@2.5.1)))(eslint@9.33.0(jiti@2.5.1)): + eslint-import-resolver-typescript@3.10.1(eslint-plugin-import-x@4.16.1(@typescript-eslint/utils@8.40.0(eslint@9.33.0(jiti@2.5.1))(typescript@5.9.2))(eslint-import-resolver-node@0.3.9)(eslint@9.33.0(jiti@2.5.1)))(eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.40.0(eslint@9.33.0(jiti@2.5.1))(typescript@5.9.2))(eslint@9.33.0(jiti@2.5.1)))(eslint@9.33.0(jiti@2.5.1)): dependencies: '@nolyfill/is-core-module': 1.0.39 debug: 4.4.1 @@ -13420,16 +13420,16 @@ snapshots: tinyglobby: 0.2.14 unrs-resolver: 1.10.1 optionalDependencies: - eslint-plugin-import: 2.32.0(@typescript-eslint/parser@8.39.1(eslint@9.33.0(jiti@2.5.1))(typescript@5.9.2))(eslint@9.33.0(jiti@2.5.1)) - eslint-plugin-import-x: 4.16.1(@typescript-eslint/utils@8.39.1(eslint@9.33.0(jiti@2.5.1))(typescript@5.9.2))(eslint-import-resolver-node@0.3.9)(eslint@9.33.0(jiti@2.5.1)) + eslint-plugin-import: 2.32.0(@typescript-eslint/parser@8.40.0(eslint@9.33.0(jiti@2.5.1))(typescript@5.9.2))(eslint@9.33.0(jiti@2.5.1)) + eslint-plugin-import-x: 4.16.1(@typescript-eslint/utils@8.40.0(eslint@9.33.0(jiti@2.5.1))(typescript@5.9.2))(eslint-import-resolver-node@0.3.9)(eslint@9.33.0(jiti@2.5.1)) transitivePeerDependencies: - supports-color - eslint-module-utils@2.12.1(@typescript-eslint/parser@8.39.1(eslint@9.33.0(jiti@2.5.1))(typescript@5.9.2))(eslint-import-resolver-node@0.3.9)(eslint@9.33.0(jiti@2.5.1)): + eslint-module-utils@2.12.1(@typescript-eslint/parser@8.40.0(eslint@9.33.0(jiti@2.5.1))(typescript@5.9.2))(eslint-import-resolver-node@0.3.9)(eslint@9.33.0(jiti@2.5.1)): dependencies: debug: 3.2.7 optionalDependencies: - '@typescript-eslint/parser': 8.39.1(eslint@9.33.0(jiti@2.5.1))(typescript@5.9.2) + '@typescript-eslint/parser': 8.40.0(eslint@9.33.0(jiti@2.5.1))(typescript@5.9.2) eslint: 9.33.0(jiti@2.5.1) eslint-import-resolver-node: 0.3.9 transitivePeerDependencies: @@ -13446,7 +13446,7 @@ snapshots: dependencies: htmlparser2: 10.0.0 - eslint-plugin-import-x@4.16.1(@typescript-eslint/utils@8.39.1(eslint@9.33.0(jiti@2.5.1))(typescript@5.9.2))(eslint-import-resolver-node@0.3.9)(eslint@9.33.0(jiti@2.5.1)): + eslint-plugin-import-x@4.16.1(@typescript-eslint/utils@8.40.0(eslint@9.33.0(jiti@2.5.1))(typescript@5.9.2))(eslint-import-resolver-node@0.3.9)(eslint@9.33.0(jiti@2.5.1)): dependencies: '@typescript-eslint/types': 8.35.1 comment-parser: 1.4.1 @@ -13459,12 +13459,12 @@ snapshots: stable-hash-x: 0.2.0 unrs-resolver: 1.10.1 optionalDependencies: - '@typescript-eslint/utils': 8.39.1(eslint@9.33.0(jiti@2.5.1))(typescript@5.9.2) + '@typescript-eslint/utils': 8.40.0(eslint@9.33.0(jiti@2.5.1))(typescript@5.9.2) eslint-import-resolver-node: 0.3.9 transitivePeerDependencies: - supports-color - eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.39.1(eslint@9.33.0(jiti@2.5.1))(typescript@5.9.2))(eslint@9.33.0(jiti@2.5.1)): + eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.40.0(eslint@9.33.0(jiti@2.5.1))(typescript@5.9.2))(eslint@9.33.0(jiti@2.5.1)): dependencies: '@rtsao/scc': 1.1.0 array-includes: 3.1.9 @@ -13475,7 +13475,7 @@ snapshots: doctrine: 2.1.0 eslint: 9.33.0(jiti@2.5.1) eslint-import-resolver-node: 0.3.9 - eslint-module-utils: 2.12.1(@typescript-eslint/parser@8.39.1(eslint@9.33.0(jiti@2.5.1))(typescript@5.9.2))(eslint-import-resolver-node@0.3.9)(eslint@9.33.0(jiti@2.5.1)) + eslint-module-utils: 2.12.1(@typescript-eslint/parser@8.40.0(eslint@9.33.0(jiti@2.5.1))(typescript@5.9.2))(eslint-import-resolver-node@0.3.9)(eslint@9.33.0(jiti@2.5.1)) hasown: 2.0.2 is-core-module: 2.16.1 is-glob: 4.0.3 @@ -13487,7 +13487,7 @@ snapshots: string.prototype.trimend: 1.0.9 tsconfig-paths: 3.15.0 optionalDependencies: - '@typescript-eslint/parser': 8.39.1(eslint@9.33.0(jiti@2.5.1))(typescript@5.9.2) + '@typescript-eslint/parser': 8.40.0(eslint@9.33.0(jiti@2.5.1))(typescript@5.9.2) transitivePeerDependencies: - eslint-import-resolver-typescript - eslint-import-resolver-webpack @@ -15286,20 +15286,20 @@ snapshots: sax: 1.3.0 optional: true - neostandard@0.12.2(@typescript-eslint/utils@8.39.1(eslint@9.33.0(jiti@2.5.1))(typescript@5.9.2))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.39.1(eslint@9.33.0(jiti@2.5.1))(typescript@5.9.2))(eslint@9.33.0(jiti@2.5.1)))(eslint@9.33.0(jiti@2.5.1))(typescript@5.9.2): + neostandard@0.12.2(@typescript-eslint/utils@8.40.0(eslint@9.33.0(jiti@2.5.1))(typescript@5.9.2))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.40.0(eslint@9.33.0(jiti@2.5.1))(typescript@5.9.2))(eslint@9.33.0(jiti@2.5.1)))(eslint@9.33.0(jiti@2.5.1))(typescript@5.9.2): dependencies: '@humanwhocodes/gitignore-to-minimatch': 1.0.2 '@stylistic/eslint-plugin': 2.11.0(eslint@9.33.0(jiti@2.5.1))(typescript@5.9.2) eslint: 9.33.0(jiti@2.5.1) - eslint-import-resolver-typescript: 3.10.1(eslint-plugin-import-x@4.16.1(@typescript-eslint/utils@8.39.1(eslint@9.33.0(jiti@2.5.1))(typescript@5.9.2))(eslint-import-resolver-node@0.3.9)(eslint@9.33.0(jiti@2.5.1)))(eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.39.1(eslint@9.33.0(jiti@2.5.1))(typescript@5.9.2))(eslint@9.33.0(jiti@2.5.1)))(eslint@9.33.0(jiti@2.5.1)) - eslint-plugin-import-x: 4.16.1(@typescript-eslint/utils@8.39.1(eslint@9.33.0(jiti@2.5.1))(typescript@5.9.2))(eslint-import-resolver-node@0.3.9)(eslint@9.33.0(jiti@2.5.1)) + eslint-import-resolver-typescript: 3.10.1(eslint-plugin-import-x@4.16.1(@typescript-eslint/utils@8.40.0(eslint@9.33.0(jiti@2.5.1))(typescript@5.9.2))(eslint-import-resolver-node@0.3.9)(eslint@9.33.0(jiti@2.5.1)))(eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.40.0(eslint@9.33.0(jiti@2.5.1))(typescript@5.9.2))(eslint@9.33.0(jiti@2.5.1)))(eslint@9.33.0(jiti@2.5.1)) + eslint-plugin-import-x: 4.16.1(@typescript-eslint/utils@8.40.0(eslint@9.33.0(jiti@2.5.1))(typescript@5.9.2))(eslint-import-resolver-node@0.3.9)(eslint@9.33.0(jiti@2.5.1)) eslint-plugin-n: 17.21.3(eslint@9.33.0(jiti@2.5.1))(typescript@5.9.2) eslint-plugin-promise: 7.2.1(eslint@9.33.0(jiti@2.5.1)) eslint-plugin-react: 7.37.5(eslint@9.33.0(jiti@2.5.1)) find-up: 5.0.0 globals: 15.15.0 peowly: 1.3.2 - typescript-eslint: 8.39.1(eslint@9.33.0(jiti@2.5.1))(typescript@5.9.2) + typescript-eslint: 8.40.0(eslint@9.33.0(jiti@2.5.1))(typescript@5.9.2) transitivePeerDependencies: - '@typescript-eslint/utils' - eslint-import-resolver-node @@ -15847,14 +15847,14 @@ snapshots: react: 19.1.1 react-dom: 19.1.1(react@19.1.1) - react-hook-form-mui@7.6.2(aea177882beb7723aeada5c99e57089b): + react-hook-form-mui@7.6.2(8d03dcd7938824115d8443966a6d9038): dependencies: '@mui/material': 7.3.1(@emotion/react@11.14.0(@types/react@19.1.10)(react@19.1.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.1.10)(react@19.1.1))(@types/react@19.1.10)(react@19.1.1))(@types/react@19.1.10)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) react: 19.1.1 react-hook-form: 7.52.1(react@19.1.1) optionalDependencies: '@mui/icons-material': 7.3.1(@mui/material@7.3.1(@emotion/react@11.14.0(@types/react@19.1.10)(react@19.1.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.1.10)(react@19.1.1))(@types/react@19.1.10)(react@19.1.1))(@types/react@19.1.10)(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(@types/react@19.1.10)(react@19.1.1) - '@mui/x-date-pickers': 8.10.0(@emotion/react@11.14.0(@types/react@19.1.10)(react@19.1.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.1.10)(react@19.1.1))(@types/react@19.1.10)(react@19.1.1))(@mui/material@7.3.1(@emotion/react@11.14.0(@types/react@19.1.10)(react@19.1.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.1.10)(react@19.1.1))(@types/react@19.1.10)(react@19.1.1))(@types/react@19.1.10)(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(@mui/system@7.3.1(@emotion/react@11.14.0(@types/react@19.1.10)(react@19.1.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.1.10)(react@19.1.1))(@types/react@19.1.10)(react@19.1.1))(@types/react@19.1.10)(react@19.1.1))(@types/react@19.1.10)(dayjs@1.11.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + '@mui/x-date-pickers': 8.10.2(@emotion/react@11.14.0(@types/react@19.1.10)(react@19.1.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.1.10)(react@19.1.1))(@types/react@19.1.10)(react@19.1.1))(@mui/material@7.3.1(@emotion/react@11.14.0(@types/react@19.1.10)(react@19.1.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.1.10)(react@19.1.1))(@types/react@19.1.10)(react@19.1.1))(@types/react@19.1.10)(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(@mui/system@7.3.1(@emotion/react@11.14.0(@types/react@19.1.10)(react@19.1.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.1.10)(react@19.1.1))(@types/react@19.1.10)(react@19.1.1))(@types/react@19.1.10)(react@19.1.1))(@types/react@19.1.10)(dayjs@1.11.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) react-hook-form@7.52.1(react@19.1.1): dependencies: @@ -17000,12 +17000,12 @@ snapshots: dependencies: is-typedarray: 1.0.0 - typescript-eslint@8.39.1(eslint@9.33.0(jiti@2.5.1))(typescript@5.9.2): + typescript-eslint@8.40.0(eslint@9.33.0(jiti@2.5.1))(typescript@5.9.2): dependencies: - '@typescript-eslint/eslint-plugin': 8.39.1(@typescript-eslint/parser@8.39.1(eslint@9.33.0(jiti@2.5.1))(typescript@5.9.2))(eslint@9.33.0(jiti@2.5.1))(typescript@5.9.2) - '@typescript-eslint/parser': 8.39.1(eslint@9.33.0(jiti@2.5.1))(typescript@5.9.2) - '@typescript-eslint/typescript-estree': 8.39.1(typescript@5.9.2) - '@typescript-eslint/utils': 8.39.1(eslint@9.33.0(jiti@2.5.1))(typescript@5.9.2) + '@typescript-eslint/eslint-plugin': 8.40.0(@typescript-eslint/parser@8.40.0(eslint@9.33.0(jiti@2.5.1))(typescript@5.9.2))(eslint@9.33.0(jiti@2.5.1))(typescript@5.9.2) + '@typescript-eslint/parser': 8.40.0(eslint@9.33.0(jiti@2.5.1))(typescript@5.9.2) + '@typescript-eslint/typescript-estree': 8.40.0(typescript@5.9.2) + '@typescript-eslint/utils': 8.40.0(eslint@9.33.0(jiti@2.5.1))(typescript@5.9.2) eslint: 9.33.0(jiti@2.5.1) typescript: 5.9.2 transitivePeerDependencies: diff --git a/lede/package/boot/uboot-sunxi/Makefile b/lede/package/boot/uboot-sunxi/Makefile index 19731ed405..a30238082b 100644 --- a/lede/package/boot/uboot-sunxi/Makefile +++ b/lede/package/boot/uboot-sunxi/Makefile @@ -91,6 +91,12 @@ define U-Boot/Bananapro BUILD_DEVICES:=lemaker_bananapro endef +define U-Boot/beelink_x2 + BUILD_SUBTARGET:=cortexa7 + NAME:=Beelink X2 (H3) + BUILD_DEVICES:=roofull_beelink-x2 +endef + define U-Boot/Cubieboard BUILD_SUBTARGET:=cortexa8 NAME:=Cubieboard @@ -112,6 +118,7 @@ endef define U-Boot/Hummingbird_A31 BUILD_SUBTARGET:=cortexa7 NAME:=Hummingbird A31 board + BUILD_DEVICES:=merrii_hummingbird endef define U-Boot/Marsboard_A10 @@ -138,6 +145,12 @@ define U-Boot/Linksprite_pcDuino BUILD_DEVICES:=linksprite_a10-pcduino endef +define U-Boot/LicheePi_Zero + BUILD_SUBTARGET:=cortexa7 + NAME:=Lichee Pi Zero V3s + BUILD_DEVICES:=licheepi_licheepi-zero-dock +endef + define U-Boot/Linksprite_pcDuino3 BUILD_SUBTARGET:=cortexa7 NAME:=Linksprite pcDuino3 @@ -337,6 +350,15 @@ define U-Boot/orangepi_zero2 ATF:=h616 endef +define U-Boot/orangepi_zero2w + BUILD_SUBTARGET:=cortexa53 + NAME:=Xunlong Orange Pi Zero2W + BUILD_DEVICES:=xunlong_orangepi-zero2w + DEPENDS:=+PACKAGE_u-boot-orangepi_zero2w:trusted-firmware-a-sunxi-h616 + UENV:=h616 + ATF:=h616 +endef + define U-Boot/orangepi_zero3 BUILD_SUBTARGET:=cortexa53 NAME:=Xunlong Orange Pi Zero3 @@ -380,6 +402,7 @@ UBOOT_TARGETS := \ bananapi_p2_zero \ Bananapi_M2_Ultra \ Bananapro \ + beelink_x2 \ Cubieboard \ Cubieboard2 \ Cubietruck \ @@ -387,6 +410,7 @@ UBOOT_TARGETS := \ Marsboard_A10 \ Mele_M9 \ OLIMEX_A13_SOM \ + LicheePi_Zero \ Linksprite_pcDuino \ Linksprite_pcDuino3 \ Linksprite_pcDuino3_Nano \ @@ -409,6 +433,7 @@ UBOOT_TARGETS := \ orangepi_2 \ orangepi_pc2 \ orangepi_zero2 \ + orangepi_zero2w \ orangepi_zero3 \ pangolin \ pine64_plus \ diff --git a/lede/package/boot/uboot-sunxi/uEnv-a64.txt b/lede/package/boot/uboot-sunxi/uEnv-a64.txt index a47ebda613..4fe994caa9 100644 --- a/lede/package/boot/uboot-sunxi/uEnv-a64.txt +++ b/lede/package/boot/uboot-sunxi/uEnv-a64.txt @@ -1,7 +1,6 @@ setenv mmc_rootpart 2 part uuid mmc ${mmc_bootdev}:${mmc_rootpart} uuid -setenv loadkernel fatload mmc \$mmc_bootdev \$kernel_addr_r uImage -setenv loaddtb fatload mmc \$mmc_bootdev \$fdt_addr_r dtb +setenv loadkernel fatload mmc \$mmc_bootdev \$kernel_comp_addr_r uImage setenv bootargs console=ttyS0,115200 earlyprintk root=PARTUUID=${uuid} rootwait earlycon=uart,mmio32,0x01c28000 -setenv uenvcmd run loadkernel \&\& run loaddtb \&\& booti \$kernel_addr_r - \$fdt_addr_r +setenv uenvcmd run loadkernel \&\& bootm \$kernel_comp_addr_r run uenvcmd diff --git a/lede/package/boot/uboot-sunxi/uEnv-default.txt b/lede/package/boot/uboot-sunxi/uEnv-default.txt index 36e41c59b1..3651cd83df 100644 --- a/lede/package/boot/uboot-sunxi/uEnv-default.txt +++ b/lede/package/boot/uboot-sunxi/uEnv-default.txt @@ -1,8 +1,6 @@ -setenv fdt_high ffffffff setenv mmc_rootpart 2 part uuid mmc ${mmc_bootdev}:${mmc_rootpart} uuid setenv loadkernel fatload mmc \$mmc_bootdev \$kernel_addr_r uImage -setenv loaddtb fatload mmc \$mmc_bootdev \$fdt_addr_r dtb setenv bootargs console=ttyS0,115200 earlyprintk root=PARTUUID=${uuid} rootwait -setenv uenvcmd run loadkernel \&\& run loaddtb \&\& bootm \$kernel_addr_r - \$fdt_addr_r +setenv uenvcmd run loadkernel \&\& bootm \$kernel_addr_r run uenvcmd diff --git a/lede/package/boot/uboot-sunxi/uEnv-h6.txt b/lede/package/boot/uboot-sunxi/uEnv-h6.txt index 78810ff223..6f0060ec81 100644 --- a/lede/package/boot/uboot-sunxi/uEnv-h6.txt +++ b/lede/package/boot/uboot-sunxi/uEnv-h6.txt @@ -1,7 +1,6 @@ setenv mmc_rootpart 2 part uuid mmc ${mmc_bootdev}:${mmc_rootpart} uuid -setenv loadkernel fatload mmc \$mmc_bootdev \$kernel_addr_r uImage -setenv loaddtb fatload mmc \$mmc_bootdev \$fdt_addr_r dtb +setenv loadkernel fatload mmc \$mmc_bootdev \$kernel_comp_addr_r uImage setenv bootargs console=ttyS0,115200 earlyprintk root=PARTUUID=${uuid} rootwait -setenv uenvcmd run loadkernel \&\& run loaddtb \&\& booti \$kernel_addr_r - \$fdt_addr_r +setenv uenvcmd run loadkernel \&\& bootm \$kernel_comp_addr_r run uenvcmd diff --git a/lede/package/boot/uboot-sunxi/uEnv-h616.txt b/lede/package/boot/uboot-sunxi/uEnv-h616.txt index 78810ff223..6f0060ec81 100644 --- a/lede/package/boot/uboot-sunxi/uEnv-h616.txt +++ b/lede/package/boot/uboot-sunxi/uEnv-h616.txt @@ -1,7 +1,6 @@ setenv mmc_rootpart 2 part uuid mmc ${mmc_bootdev}:${mmc_rootpart} uuid -setenv loadkernel fatload mmc \$mmc_bootdev \$kernel_addr_r uImage -setenv loaddtb fatload mmc \$mmc_bootdev \$fdt_addr_r dtb +setenv loadkernel fatload mmc \$mmc_bootdev \$kernel_comp_addr_r uImage setenv bootargs console=ttyS0,115200 earlyprintk root=PARTUUID=${uuid} rootwait -setenv uenvcmd run loadkernel \&\& run loaddtb \&\& booti \$kernel_addr_r - \$fdt_addr_r +setenv uenvcmd run loadkernel \&\& bootm \$kernel_comp_addr_r run uenvcmd diff --git a/lede/package/boot/uboot-sunxi/uEnv-pangolin.txt b/lede/package/boot/uboot-sunxi/uEnv-pangolin.txt index 9c4fa11220..ecd86c0473 100644 --- a/lede/package/boot/uboot-sunxi/uEnv-pangolin.txt +++ b/lede/package/boot/uboot-sunxi/uEnv-pangolin.txt @@ -1,6 +1,4 @@ -setenv fdt_high ffffffff setenv loadkernel fatload mmc 0 \$kernel_addr_r uImage -setenv loaddtb fatload mmc 0 \$fdt_addr_r dtb setenv bootargs console=ttyS2,115200 earlyprintk root=/dev/mmcblk0p2 rootwait -setenv uenvcmd run loadkernel \&\& run loaddtb \&\& bootm \$kernel_addr_r - \$fdt_addr_r +setenv uenvcmd run loadkernel \&\& run loaddtb \&\& bootm \$kernel_addr_r run uenvcmd diff --git a/lede/target/linux/sunxi/cortexa7/config-6.12 b/lede/target/linux/sunxi/cortexa7/config-6.12 index 105c090890..beab75befa 100644 --- a/lede/target/linux/sunxi/cortexa7/config-6.12 +++ b/lede/target/linux/sunxi/cortexa7/config-6.12 @@ -16,6 +16,7 @@ CONFIG_NET_DSA=y CONFIG_NET_DSA_TAG_BRCM=y CONFIG_NET_DSA_TAG_BRCM_COMMON=y CONFIG_NET_DSA_TAG_BRCM_LEGACY=y +CONFIG_NET_DSA_TAG_BRCM_LEGACY_FCS=y CONFIG_NET_DSA_TAG_BRCM_PREPEND=y CONFIG_NET_SWITCHDEV=y CONFIG_NOP_USB_XCEIV=y diff --git a/lede/target/linux/sunxi/image/Makefile b/lede/target/linux/sunxi/image/Makefile index ee36df598a..8c37bd0fd1 100644 --- a/lede/target/linux/sunxi/image/Makefile +++ b/lede/target/linux/sunxi/image/Makefile @@ -16,7 +16,6 @@ define Build/sunxi-sdcard mkfs.fat $@.boot -C $(FAT32_BLOCKS) mcopy -i $@.boot $(STAGING_DIR_IMAGE)/$(DEVICE_NAME)-boot.scr ::boot.scr - mcopy -i $@.boot $(DTS_DIR)/$(SUNXI_DTS).dtb ::dtb mcopy -i $@.boot $(IMAGE_KERNEL) ::uImage ./gen_sunxi_sdcard_img.sh $@ \ $@.boot \ @@ -34,10 +33,18 @@ define Device/Default KERNEL := kernel-bin | uImage none IMAGES := sdcard.img.gz IMAGE/sdcard.img.gz := sunxi-sdcard | append-metadata | gzip - SUNXI_DTS_DIR :=allwinner/ + SUNXI_DTS_DIR := allwinner/ SUNXI_DTS = $$(SUNXI_DTS_DIR)$$(SOC)-$(lastword $(subst _, ,$(1))) endef +define Device/FitImageLzma + KERNEL = kernel-bin | lzma | fit lzma $$(DTS_DIR)/$$(SUNXI_DTS).dtb +endef + +define Device/FitImageGzip + KERNEL = kernel-bin | gzip | fit gzip $$(DTS_DIR)/$$(SUNXI_DTS).dtb +endef + include $(SUBTARGET).mk $(eval $(call BuildImage)) diff --git a/lede/target/linux/sunxi/image/cortexa53.mk b/lede/target/linux/sunxi/image/cortexa53.mk index 06b409deb7..49702ebadd 100644 --- a/lede/target/linux/sunxi/image/cortexa53.mk +++ b/lede/target/linux/sunxi/image/cortexa53.mk @@ -3,12 +3,12 @@ # Copyright (C) 2013-2016 OpenWrt.org # Copyright (C) 2016 Yousong Zhou -KERNEL_LOADADDR:=0x40008000 +KERNEL_LOADADDR:=0x40080000 define Device/sun50i + $(call Device/FitImageLzma) SUNXI_DTS_DIR := allwinner/ KERNEL_NAME := Image - KERNEL := kernel-bin endef define Device/sun50i-a64 @@ -127,6 +127,13 @@ define Device/xunlong_orangepi-zero2 endef TARGET_DEVICES += xunlong_orangepi-zero2 +define Device/xunlong_orangepi-zero2w + DEVICE_VENDOR := Xunlong + DEVICE_MODEL := Orange Pi Zero 2W + $(Device/sun50i-h618) +endef +TARGET_DEVICES += xunlong_orangepi-zero2w + define Device/xunlong_orangepi-zero3 DEVICE_VENDOR := Xunlong DEVICE_MODEL := Orange Pi Zero 3 diff --git a/lede/target/linux/sunxi/image/cortexa7.mk b/lede/target/linux/sunxi/image/cortexa7.mk index a85b20531d..9b0d12f125 100644 --- a/lede/target/linux/sunxi/image/cortexa7.mk +++ b/lede/target/linux/sunxi/image/cortexa7.mk @@ -6,6 +6,7 @@ KERNEL_LOADADDR:=0x40008000 define Device/cubietech_cubieboard2 + $(call Device/FitImageGzip) DEVICE_VENDOR := Cubietech DEVICE_MODEL := Cubieboard2 DEVICE_PACKAGES:=kmod-ata-sunxi kmod-sun4i-emac kmod-rtc-sunxi @@ -14,6 +15,7 @@ endef TARGET_DEVICES += cubietech_cubieboard2 define Device/cubietech_cubietruck + $(call Device/FitImageGzip) DEVICE_VENDOR := Cubietech DEVICE_MODEL := Cubietruck DEVICE_PACKAGES:=kmod-ata-sunxi kmod-rtc-sunxi kmod-brcmfmac @@ -22,6 +24,7 @@ endef TARGET_DEVICES += cubietech_cubietruck define Device/friendlyarm_nanopi-m1-plus + $(call Device/FitImageGzip) DEVICE_VENDOR := FriendlyARM DEVICE_MODEL := NanoPi M1 Plus DEVICE_PACKAGES:=kmod-leds-gpio kmod-brcmfmac \ @@ -31,6 +34,7 @@ endef TARGET_DEVICES += friendlyarm_nanopi-m1-plus define Device/friendlyarm_nanopi-neo + $(call Device/FitImageGzip) DEVICE_VENDOR := FriendlyARM DEVICE_MODEL := NanoPi NEO SOC := sun8i-h3 @@ -38,6 +42,7 @@ endef TARGET_DEVICES += friendlyarm_nanopi-neo define Device/friendlyarm_nanopi-neo-air + $(call Device/FitImageGzip) DEVICE_VENDOR := FriendlyARM DEVICE_MODEL := NanoPi NEO Air DEVICE_PACKAGES := kmod-leds-gpio kmod-brcmfmac \ @@ -47,6 +52,7 @@ endef TARGET_DEVICES += friendlyarm_nanopi-neo-air define Device/friendlyarm_nanopi-r1 + $(call Device/FitImageGzip) DEVICE_VENDOR := FriendlyARM DEVICE_MODEL := NanoPi R1 DEVICE_PACKAGES := kmod-usb-net-rtl8152 kmod-leds-gpio \ @@ -56,6 +62,7 @@ endef TARGET_DEVICES += friendlyarm_nanopi-r1 define Device/friendlyarm_zeropi + $(call Device/FitImageGzip) DEVICE_VENDOR := FriendlyARM DEVICE_MODEL := ZeroPi DEVICE_PACKAGES := kmod-rtc-sunxi @@ -64,6 +71,7 @@ endef TARGET_DEVICES += friendlyarm_zeropi define Device/lamobo_lamobo-r1 + $(call Device/FitImageGzip) DEVICE_VENDOR := Lamobo DEVICE_MODEL := Lamobo R1 DEVICE_ALT0_VENDOR := Bananapi @@ -76,6 +84,7 @@ endef TARGET_DEVICES += lamobo_lamobo-r1 define Device/lemaker_bananapi + $(call Device/FitImageGzip) DEVICE_VENDOR := LeMaker DEVICE_MODEL := Banana Pi DEVICE_PACKAGES:=kmod-rtc-sunxi kmod-ata-sunxi @@ -84,6 +93,7 @@ endef TARGET_DEVICES += lemaker_bananapi define Device/sinovoip_bananapi-m2-berry + $(call Device/FitImageGzip) DEVICE_VENDOR := Sinovoip DEVICE_MODEL := Banana Pi M2 Berry DEVICE_PACKAGES:=kmod-ata-sunxi kmod-brcmfmac \ @@ -94,6 +104,7 @@ endef TARGET_DEVICES += sinovoip_bananapi-m2-berry define Device/sinovoip_bananapi-m2-ultra + $(call Device/FitImageGzip) DEVICE_VENDOR := Sinovoip DEVICE_MODEL := Banana Pi M2 Ultra DEVICE_PACKAGES:=kmod-ata-sunxi kmod-brcmfmac \ @@ -104,6 +115,7 @@ endef TARGET_DEVICES += sinovoip_bananapi-m2-ultra define Device/lemaker_bananapro + $(call Device/FitImageGzip) DEVICE_VENDOR := LeMaker DEVICE_MODEL := Banana Pro DEVICE_PACKAGES:=kmod-rtc-sunxi kmod-ata-sunxi kmod-brcmfmac \ @@ -112,7 +124,17 @@ define Device/lemaker_bananapro endef TARGET_DEVICES += lemaker_bananapro +define Device/licheepi_licheepi-zero-dock + $(call Device/FitImageGzip) + DEVICE_VENDOR := LicheePi + DEVICE_MODEL := Zero with Dock (V3s) + DEVICE_PACKAGES:=kmod-rtc-sunxi + SOC := sun8i-v3s +endef +TARGET_DEVICES += licheepi_licheepi-zero-dock + define Device/linksprite_pcduino3 + $(call Device/FitImageGzip) DEVICE_VENDOR := LinkSprite DEVICE_MODEL := pcDuino3 DEVICE_PACKAGES:=kmod-sun4i-emac kmod-rtc-sunxi kmod-ata-sunxi kmod-rtl8xxxu \ @@ -122,6 +144,7 @@ endef TARGET_DEVICES += linksprite_pcduino3 define Device/linksprite_pcduino3-nano + $(call Device/FitImageGzip) DEVICE_VENDOR := LinkSprite DEVICE_MODEL := pcDuino3 Nano DEVICE_PACKAGES:=kmod-rtc-sunxi kmod-ata-sunxi @@ -130,6 +153,7 @@ endef TARGET_DEVICES += linksprite_pcduino3-nano define Device/mele_m9 + $(call Device/FitImageGzip) DEVICE_VENDOR := Mele DEVICE_MODEL := M9 DEVICE_PACKAGES:=kmod-sun4i-emac kmod-rtl8192cu @@ -137,7 +161,17 @@ define Device/mele_m9 endef TARGET_DEVICES += mele_m9 +define Device/merrii_hummingbird + $(call Device/FitImageGzip) + DEVICE_VENDOR := Merrii + DEVICE_MODEL := Hummingbird + DEVICE_PACKAGES:=kmod-brcmfmac cypress-firmware-43362-sdio wpad-basic-mbedtls + SOC := sun6i-a31 +endef +TARGET_DEVICES += merrii_hummingbird + define Device/olimex_a20-olinuxino-lime + $(call Device/FitImageGzip) DEVICE_VENDOR := Olimex DEVICE_MODEL := A20-OLinuXino-LIME DEVICE_PACKAGES:=kmod-ata-sunxi kmod-rtc-sunxi @@ -146,6 +180,7 @@ endef TARGET_DEVICES += olimex_a20-olinuxino-lime define Device/olimex_a20-olinuxino-lime2 + $(call Device/FitImageGzip) DEVICE_VENDOR := Olimex DEVICE_MODEL := A20-OLinuXino-LIME2 DEVICE_PACKAGES:=kmod-ata-sunxi kmod-rtc-sunxi kmod-usb-hid @@ -154,6 +189,7 @@ endef TARGET_DEVICES += olimex_a20-olinuxino-lime2 define Device/olimex_a20-olinuxino-lime2-emmc + $(call Device/FitImageGzip) DEVICE_VENDOR := Olimex DEVICE_MODEL := A20-OLinuXino-LIME2 DEVICE_VARIANT := eMMC @@ -163,6 +199,7 @@ endef TARGET_DEVICES += olimex_a20-olinuxino-lime2-emmc define Device/olimex_a20-olinuxino-micro + $(call Device/FitImageGzip) DEVICE_VENDOR := Olimex DEVICE_MODEL := A20-OLinuXino-MICRO DEVICE_PACKAGES:=kmod-ata-sunxi kmod-sun4i-emac kmod-rtc-sunxi @@ -170,7 +207,18 @@ define Device/olimex_a20-olinuxino-micro endef TARGET_DEVICES += olimex_a20-olinuxino-micro +define Device/roofull_beelink-x2 + $(call Device/FitImageGzip) + DEVICE_VENDOR := Roofull + DEVICE_MODEL := Beelink-X2 + DEVICE_PACKAGES:=kmod-leds-gpio kmod-gpio-button-hotplug \ + kmod-brcmfmac cypress-firmware-43430-sdio wpad-basic-mbedtls + SOC := sun8i-h3 +endef +TARGET_DEVICES += roofull_beelink-x2 + define Device/sinovoip_bananapi-m2-plus + $(call Device/FitImageGzip) DEVICE_VENDOR := Sinovoip DEVICE_MODEL := Banana Pi M2+ DEVICE_PACKAGES:=kmod-leds-gpio kmod-brcmfmac \ @@ -180,6 +228,7 @@ endef TARGET_DEVICES += sinovoip_bananapi-m2-plus define Device/sinovoip_bananapi-m3 + $(call Device/FitImageGzip) DEVICE_VENDOR := Sinovoip DEVICE_MODEL := Banana Pi M3 DEVICE_PACKAGES:=kmod-rtc-sunxi kmod-leds-gpio kmod-rtc-ac100 \ @@ -189,6 +238,7 @@ endef TARGET_DEVICES += sinovoip_bananapi-m3 define Device/sinovoip_bananapi-p2-zero + $(call Device/FitImageGzip) DEVICE_VENDOR := Sinovoip DEVICE_MODEL := Banana Pi P2 Zero DEVICE_PACKAGES:=kmod-leds-gpio kmod-brcmfmac \ @@ -198,6 +248,7 @@ endef TARGET_DEVICES += sinovoip_bananapi-p2-zero define Device/xunlong_orangepi-one + $(call Device/FitImageGzip) DEVICE_VENDOR := Xunlong DEVICE_MODEL := Orange Pi One DEVICE_PACKAGES:=kmod-rtc-sunxi @@ -206,6 +257,7 @@ endef TARGET_DEVICES += xunlong_orangepi-one define Device/xunlong_orangepi-pc + $(call Device/FitImageGzip) DEVICE_VENDOR := Xunlong DEVICE_MODEL := Orange Pi PC DEVICE_PACKAGES:=kmod-gpio-button-hotplug @@ -214,6 +266,7 @@ endef TARGET_DEVICES += xunlong_orangepi-pc define Device/xunlong_orangepi-pc-plus + $(call Device/FitImageGzip) DEVICE_VENDOR := Xunlong DEVICE_MODEL := Orange Pi PC Plus DEVICE_PACKAGES:=kmod-gpio-button-hotplug @@ -222,6 +275,7 @@ endef TARGET_DEVICES += xunlong_orangepi-pc-plus define Device/xunlong_orangepi-plus + $(call Device/FitImageGzip) DEVICE_VENDOR := Xunlong DEVICE_MODEL := Orange Pi Plus DEVICE_PACKAGES:=kmod-rtc-sunxi @@ -230,6 +284,7 @@ endef TARGET_DEVICES += xunlong_orangepi-plus define Device/xunlong_orangepi-r1 + $(call Device/FitImageGzip) DEVICE_VENDOR := Xunlong DEVICE_MODEL := Orange Pi R1 DEVICE_PACKAGES:=kmod-usb-net-rtl8152 @@ -238,6 +293,7 @@ endef TARGET_DEVICES += xunlong_orangepi-r1 define Device/xunlong_orangepi-zero + $(call Device/FitImageGzip) DEVICE_VENDOR := Xunlong DEVICE_MODEL := Orange Pi Zero DEVICE_PACKAGES:=kmod-rtc-sunxi @@ -246,6 +302,7 @@ endef TARGET_DEVICES += xunlong_orangepi-zero define Device/xunlong_orangepi-2 + $(call Device/FitImageGzip) DEVICE_VENDOR := Xunlong DEVICE_MODEL := Orange Pi 2 DEVICE_PACKAGES:=kmod-rtc-sunxi diff --git a/lede/target/linux/sunxi/image/cortexa8.mk b/lede/target/linux/sunxi/image/cortexa8.mk index e27db1ee16..f79c8d3513 100644 --- a/lede/target/linux/sunxi/image/cortexa8.mk +++ b/lede/target/linux/sunxi/image/cortexa8.mk @@ -6,6 +6,7 @@ KERNEL_LOADADDR:=0x40008000 define Device/cubietech_a10-cubieboard + $(call Device/FitImageGzip) DEVICE_VENDOR := Cubietech DEVICE_MODEL := Cubieboard DEVICE_PACKAGES:=kmod-ata-sunxi kmod-sun4i-emac kmod-rtc-sunxi @@ -14,6 +15,7 @@ endef TARGET_DEVICES += cubietech_a10-cubieboard define Device/haoyu_a10-marsboard + $(call Device/FitImageGzip) DEVICE_VENDOR := HAOYU Electronics DEVICE_MODEL := MarsBoard A10 DEVICE_PACKAGES:=kmod-ata-core kmod-ata-sunxi kmod-sun4i-emac \ @@ -24,6 +26,7 @@ endef TARGET_DEVICES += haoyu_a10-marsboard define Device/linksprite_a10-pcduino + $(call Device/FitImageGzip) DEVICE_VENDOR := LinkSprite DEVICE_MODEL := pcDuino DEVICE_PACKAGES:=kmod-sun4i-emac kmod-rtc-sunxi kmod-rtl8192cu @@ -32,6 +35,7 @@ endef TARGET_DEVICES += linksprite_a10-pcduino define Device/olimex_a10-olinuxino-lime + $(call Device/FitImageGzip) DEVICE_VENDOR := Olimex DEVICE_MODEL := A10-OLinuXino-LIME DEVICE_PACKAGES:=kmod-ata-sunxi kmod-sun4i-emac kmod-rtc-sunxi @@ -40,6 +44,7 @@ endef TARGET_DEVICES += olimex_a10-olinuxino-lime define Device/olimex_a13-olimex-som + $(call Device/FitImageGzip) DEVICE_VENDOR := Olimex DEVICE_MODEL := A13-SOM DEVICE_PACKAGES:=kmod-rtl8192cu @@ -50,6 +55,7 @@ endef TARGET_DEVICES += olimex_a13-olimex-som define Device/olimex_a13-olinuxino + $(call Device/FitImageGzip) DEVICE_VENDOR := Olimex DEVICE_MODEL := A13-OLinuXino DEVICE_PACKAGES:=kmod-rtl8192cu diff --git a/mihomo/common/net/deadline/conn.go b/mihomo/common/net/deadline/conn.go index 01519e941c..aafad9e4ab 100644 --- a/mihomo/common/net/deadline/conn.go +++ b/mihomo/common/net/deadline/conn.go @@ -149,6 +149,10 @@ func (c *Conn) ReaderReplaceable() bool { return c.disablePipe.Load() || c.deadline.Load().IsZero() } +func (c *Conn) WriterReplaceable() bool { + return true +} + func (c *Conn) Upstream() any { return c.ExtendedConn } diff --git a/mihomo/component/generater/types.go b/mihomo/component/generater/types.go deleted file mode 100644 index 06f59e9468..0000000000 --- a/mihomo/component/generater/types.go +++ /dev/null @@ -1,97 +0,0 @@ -// Copy from https://github.com/WireGuard/wgctrl-go/blob/a9ab2273dd1075ea74b88c76f8757f8b4003fcbf/wgtypes/types.go#L71-L155 - -package generater - -import ( - "crypto/rand" - "encoding/base64" - "fmt" - - "golang.org/x/crypto/curve25519" -) - -// KeyLen is the expected key length for a WireGuard key. -const KeyLen = 32 // wgh.KeyLen - -// A Key is a public, private, or pre-shared secret key. The Key constructor -// functions in this package can be used to create Keys suitable for each of -// these applications. -type Key [KeyLen]byte - -// GenerateKey generates a Key suitable for use as a pre-shared secret key from -// a cryptographically safe source. -// -// The output Key should not be used as a private key; use GeneratePrivateKey -// instead. -func GenerateKey() (Key, error) { - b := make([]byte, KeyLen) - if _, err := rand.Read(b); err != nil { - return Key{}, fmt.Errorf("wgtypes: failed to read random bytes: %v", err) - } - - return NewKey(b) -} - -// GeneratePrivateKey generates a Key suitable for use as a private key from a -// cryptographically safe source. -func GeneratePrivateKey() (Key, error) { - key, err := GenerateKey() - if err != nil { - return Key{}, err - } - - // Modify random bytes using algorithm described at: - // https://cr.yp.to/ecdh.html. - key[0] &= 248 - key[31] &= 127 - key[31] |= 64 - - return key, nil -} - -// NewKey creates a Key from an existing byte slice. The byte slice must be -// exactly 32 bytes in length. -func NewKey(b []byte) (Key, error) { - if len(b) != KeyLen { - return Key{}, fmt.Errorf("wgtypes: incorrect key size: %d", len(b)) - } - - var k Key - copy(k[:], b) - - return k, nil -} - -// ParseKey parses a Key from a base64-encoded string, as produced by the -// Key.String method. -func ParseKey(s string) (Key, error) { - b, err := base64.StdEncoding.DecodeString(s) - if err != nil { - return Key{}, fmt.Errorf("wgtypes: failed to parse base64-encoded key: %v", err) - } - - return NewKey(b) -} - -// PublicKey computes a public key from the private key k. -// -// PublicKey should only be called when k is a private key. -func (k Key) PublicKey() Key { - var ( - pub [KeyLen]byte - priv = [KeyLen]byte(k) - ) - - // ScalarBaseMult uses the correct base value per https://cr.yp.to/ecdh.html, - // so no need to specify it. - curve25519.ScalarBaseMult(&pub, &priv) - - return Key(pub) -} - -// String returns the base64-encoded string representation of a Key. -// -// ParseKey can be used to produce a new Key from this string. -func (k Key) String() string { - return base64.StdEncoding.EncodeToString(k[:]) -} diff --git a/mihomo/component/generater/cmd.go b/mihomo/component/generator/cmd.go similarity index 58% rename from mihomo/component/generater/cmd.go rename to mihomo/component/generator/cmd.go index 2bd5b9cd86..537fba91bb 100644 --- a/mihomo/component/generater/cmd.go +++ b/mihomo/component/generator/cmd.go @@ -1,4 +1,4 @@ -package generater +package generator import ( "encoding/base64" @@ -12,7 +12,7 @@ import ( func Main(args []string) { if len(args) < 1 { - panic("Using: generate uuid/reality-keypair/wg-keypair/ech-keypair/vless-mlkem768") + panic("Using: generate uuid/reality-keypair/wg-keypair/ech-keypair/vless-mlkem768/vless-x25519") } switch args[0] { case "uuid": @@ -22,20 +22,19 @@ func Main(args []string) { } fmt.Println(newUUID.String()) case "reality-keypair": - privateKey, err := GeneratePrivateKey() + privateKey, err := GenX25519PrivateKey() if err != nil { panic(err) } - publicKey := privateKey.PublicKey() - fmt.Println("PrivateKey: " + base64.RawURLEncoding.EncodeToString(privateKey[:])) - fmt.Println("PublicKey: " + base64.RawURLEncoding.EncodeToString(publicKey[:])) + fmt.Println("PrivateKey: " + base64.RawURLEncoding.EncodeToString(privateKey.Bytes())) + fmt.Println("PublicKey: " + base64.RawURLEncoding.EncodeToString(privateKey.PublicKey().Bytes())) case "wg-keypair": - privateKey, err := GeneratePrivateKey() + privateKey, err := GenX25519PrivateKey() if err != nil { panic(err) } - fmt.Println("PrivateKey: " + privateKey.String()) - fmt.Println("PublicKey: " + privateKey.PublicKey().String()) + fmt.Println("PrivateKey: " + base64.StdEncoding.EncodeToString(privateKey.Bytes())) + fmt.Println("PublicKey: " + base64.StdEncoding.EncodeToString(privateKey.PublicKey().Bytes())) case "ech-keypair": if len(args) < 2 { panic("Using: generate ech-keypair ") @@ -51,11 +50,23 @@ func Main(args []string) { if len(args) > 1 { seed = args[1] } - seedBase64, clientBase64, err := encryption.GenMLKEM768(seed) + seedBase64, clientBase64, hash11Base64, err := encryption.GenMLKEM768(seed) if err != nil { panic(err) } fmt.Println("Seed: " + seedBase64) fmt.Println("Client: " + clientBase64) + fmt.Println("Hash11: " + hash11Base64) + case "vless-x25519": + var privateKey string + if len(args) > 1 { + privateKey = args[1] + } + privateKeyBase64, passwordBase64, err := encryption.GenX25519(privateKey) + if err != nil { + panic(err) + } + fmt.Println("PrivateKey: " + privateKeyBase64) + fmt.Println("Password: " + passwordBase64) } } diff --git a/mihomo/component/generator/x25519.go b/mihomo/component/generator/x25519.go new file mode 100644 index 0000000000..e99fff2bae --- /dev/null +++ b/mihomo/component/generator/x25519.go @@ -0,0 +1,27 @@ +package generator + +import ( + "crypto/ecdh" + "crypto/rand" +) + +const X25519KeySize = 32 + +func GenX25519PrivateKey() (*ecdh.PrivateKey, error) { + var privateKey [X25519KeySize]byte + _, err := rand.Read(privateKey[:]) + if err != nil { + return nil, err + } + + // Avoid generating equivalent X25519 private keys + // https://github.com/XTLS/Xray-core/pull/1747 + // + // Modify random bytes using algorithm described at: + // https://cr.yp.to/ecdh.html. + privateKey[0] &= 248 + privateKey[31] &= 127 + privateKey[31] |= 64 + + return ecdh.X25519().NewPrivateKey(privateKey[:]) +} diff --git a/mihomo/docs/config.yaml b/mihomo/docs/config.yaml index 80af843bf9..0313bee71f 100644 --- a/mihomo/docs/config.yaml +++ b/mihomo/docs/config.yaml @@ -638,8 +638,12 @@ proxies: # socks5 port: 443 uuid: uuid network: tcp - encryption: "8min-vless-mlkem768client-bas64RawURLEncoding" # 复用八分钟后协商新的 sharedKey,需小于服务端的值 - # encryption: "8min-xored-mlkem768client-bas64RawURLEncoding" + # ------------------------- + # vless encryption客户端配置: + # (只使用 1-RTT 模式 / 复用八分钟后协商新的 baseKey,周期需小于服务端的值) + # / 是只能选一个,后面是 base64RawURLEncoding,使用 mihomo generate vless-x25519 和 mihomo generate vless-mlkem768 生成,替换值时需去掉括号 + # ------------------------- + encryption: "1rtt/8min.native/divide/random.mlkem768Client.(X25519 Password).(ML-KEM-768 Client)" tls: false #可以不开启tls udp: true @@ -1359,8 +1363,12 @@ listeners: flow: xtls-rprx-vision # ws-path: "/" # 如果不为空则开启 websocket 传输层 # grpc-service-name: "GunService" # 如果不为空则开启 grpc 传输层 - # decryption: "10min-vless-mlkem768seed-bas64RawURLEncoding" # 同时允许 1-RTT 模式与十分钟复用的 0-RTT 模式, 后面base64字符串可由可由 mihomo generate vless-mlkem768 命令生成 - # decryption: "10min-xored-mlkem768seed-bas64RawURLEncoding" + # ------------------------- + # vless encryption服务端配置: + # (只允许 1-RTT 模式 / 同时允许 1-RTT 模式与十分钟复用的 0-RTT 模式;原生外观 / ECH 式 XOR / 全随机数) + # / 是只能选一个,后面是 base64RawURLEncoding,使用 mihomo generate vless-x25519 和 mihomo generate vless-mlkem768 生成,替换值时需去掉括号 + # ------------------------- + # decryption: "1rtt/10min.native/divide/random.mlkem768Seed.(X25519 PrivateKey).(ML-KEM-768 Seed)" # 下面两项如果填写则开启 tls(需要同时填写) # certificate: ./server.crt # private-key: ./server.key diff --git a/mihomo/go.mod b/mihomo/go.mod index 5695c7827e..57c10000ba 100644 --- a/mihomo/go.mod +++ b/mihomo/go.mod @@ -31,7 +31,7 @@ require ( github.com/metacubex/sing-shadowsocks2 v0.2.6 github.com/metacubex/sing-shadowtls v0.0.0-20250503063515-5d9f966d17a2 github.com/metacubex/sing-tun v0.4.7 - github.com/metacubex/sing-vmess v0.2.4-0.20250819151326-51d195aac5db + github.com/metacubex/sing-vmess v0.2.4-0.20250821024956-97839f31a65d github.com/metacubex/sing-wireguard v0.0.0-20250503063753-2dc62acc626f github.com/metacubex/smux v0.0.0-20250503055512-501391591dee github.com/metacubex/tfo-go v0.0.0-20250516165257-e29c16ae41d4 diff --git a/mihomo/go.sum b/mihomo/go.sum index 69811ad2ba..d8bfd9a592 100644 --- a/mihomo/go.sum +++ b/mihomo/go.sum @@ -131,8 +131,8 @@ github.com/metacubex/sing-shadowtls v0.0.0-20250503063515-5d9f966d17a2 h1:gXU+MY github.com/metacubex/sing-shadowtls v0.0.0-20250503063515-5d9f966d17a2/go.mod h1:mbfboaXauKJNIHJYxQRa+NJs4JU9NZfkA+I33dS2+9E= github.com/metacubex/sing-tun v0.4.7 h1:ZDY/W+1c7PeWWKeKRyUo18fySF/TWjB0i5ui81Ar778= github.com/metacubex/sing-tun v0.4.7/go.mod h1:xHecZRwBnKWe6zG9amAK9cXf91lF6blgjBqm+VvOrmU= -github.com/metacubex/sing-vmess v0.2.4-0.20250819151326-51d195aac5db h1:W7VKxR0r5IR+56Lblx2iyrEaykx0esdQwTQbkSrSaek= -github.com/metacubex/sing-vmess v0.2.4-0.20250819151326-51d195aac5db/go.mod h1:21R5R1u90uUvBQF0owoooEu96/SAYYD56nDrwm6nFaM= +github.com/metacubex/sing-vmess v0.2.4-0.20250821024956-97839f31a65d h1:jchYEho5+kTmok4aTMflqJyTRnqVPTOVeC1RFXxuw9A= +github.com/metacubex/sing-vmess v0.2.4-0.20250821024956-97839f31a65d/go.mod h1:21R5R1u90uUvBQF0owoooEu96/SAYYD56nDrwm6nFaM= github.com/metacubex/sing-wireguard v0.0.0-20250503063753-2dc62acc626f h1:Sr/DYKYofKHKc4GF3qkRGNuj6XA6c0eqPgEDN+VAsYU= github.com/metacubex/sing-wireguard v0.0.0-20250503063753-2dc62acc626f/go.mod h1:jpAkVLPnCpGSfNyVmj6Cq4YbuZsFepm/Dc+9BAOcR80= github.com/metacubex/smux v0.0.0-20250503055512-501391591dee h1:lp6hJ+4wCLZu113awp7P6odM2okB5s60HUyF0FMqKmo= diff --git a/mihomo/listener/inbound/common_test.go b/mihomo/listener/inbound/common_test.go index 5b838bd303..75b98e0bc4 100644 --- a/mihomo/listener/inbound/common_test.go +++ b/mihomo/listener/inbound/common_test.go @@ -21,7 +21,7 @@ import ( "github.com/metacubex/mihomo/component/ca" "github.com/metacubex/mihomo/component/dialer" "github.com/metacubex/mihomo/component/ech" - "github.com/metacubex/mihomo/component/generater" + "github.com/metacubex/mihomo/component/generator" tlsC "github.com/metacubex/mihomo/component/tls" C "github.com/metacubex/mihomo/constant" @@ -48,13 +48,12 @@ var echConfigBase64, echKeyPem, _ = ech.GenECHConfig(echPublicSni) func init() { rand.Read(httpData) - privateKey, err := generater.GeneratePrivateKey() + privateKey, err := generator.GenX25519PrivateKey() if err != nil { panic(err) } - publicKey := privateKey.PublicKey() - realityPrivateKey = base64.RawURLEncoding.EncodeToString(privateKey[:]) - realityPublickey = base64.RawURLEncoding.EncodeToString(publicKey[:]) + realityPrivateKey = base64.RawURLEncoding.EncodeToString(privateKey.Bytes()) + realityPublickey = base64.RawURLEncoding.EncodeToString(privateKey.PublicKey().Bytes()) } type TestTunnel struct { diff --git a/mihomo/listener/inbound/vless_test.go b/mihomo/listener/inbound/vless_test.go index f3fcd39cb0..4ac9654b3b 100644 --- a/mihomo/listener/inbound/vless_test.go +++ b/mihomo/listener/inbound/vless_test.go @@ -89,39 +89,38 @@ func TestInboundVless_TLS(t *testing.T) { } func TestInboundVless_Encryption(t *testing.T) { - seedBase64, clientBase64, err := encryption.GenMLKEM768("") + seedBase64, clientBase64, _, err := encryption.GenMLKEM768("") if err != nil { t.Fatal(err) return } - t.Run("-vless-", func(t *testing.T) { - inboundOptions := inbound.VlessOption{ - Decryption: "10min-vless-mlkem768seed-" + seedBase64, - } - outboundOptions := outbound.VlessOption{ - Encryption: "8min-vless-mlkem768client-" + clientBase64, - } - testInboundVless(t, inboundOptions, outboundOptions) - t.Run("xtls-rprx-vision", func(t *testing.T) { - outboundOptions := outboundOptions - outboundOptions.Flow = "xtls-rprx-vision" + privateKeyBase64, passwordBase64, err := encryption.GenX25519("") + if err != nil { + t.Fatal(err) + return + } + var modes = []string{ + "native", + "divide", + "random", + } + for i := range modes { + mode := modes[i] + t.Run(mode, func(t *testing.T) { + inboundOptions := inbound.VlessOption{ + Decryption: "10min." + mode + ".mlkem768Seed." + privateKeyBase64 + "." + seedBase64, + } + outboundOptions := outbound.VlessOption{ + Encryption: "8min." + mode + ".mlkem768Client." + passwordBase64 + "." + clientBase64, + } testInboundVless(t, inboundOptions, outboundOptions) + t.Run("xtls-rprx-vision", func(t *testing.T) { + outboundOptions := outboundOptions + outboundOptions.Flow = "xtls-rprx-vision" + testInboundVless(t, inboundOptions, outboundOptions) + }) }) - }) - t.Run("-xored-", func(t *testing.T) { - inboundOptions := inbound.VlessOption{ - Decryption: "10min-xored-mlkem768seed-" + seedBase64, - } - outboundOptions := outbound.VlessOption{ - Encryption: "8min-xored-mlkem768client-" + clientBase64, - } - testInboundVless(t, inboundOptions, outboundOptions) - t.Run("xtls-rprx-vision", func(t *testing.T) { - outboundOptions := outboundOptions - outboundOptions.Flow = "xtls-rprx-vision" - testInboundVless(t, inboundOptions, outboundOptions) - }) - }) + } } func TestInboundVless_Wss1(t *testing.T) { diff --git a/mihomo/main.go b/mihomo/main.go index 3bc3d74f73..6a85e5df79 100644 --- a/mihomo/main.go +++ b/mihomo/main.go @@ -14,7 +14,7 @@ import ( "strings" "syscall" - "github.com/metacubex/mihomo/component/generater" + "github.com/metacubex/mihomo/component/generator" "github.com/metacubex/mihomo/component/geodata" "github.com/metacubex/mihomo/component/updater" "github.com/metacubex/mihomo/config" @@ -73,7 +73,7 @@ func main() { } if len(os.Args) > 1 && os.Args[1] == "generate" { - generater.Main(os.Args[2:]) + generator.Main(os.Args[2:]) return } diff --git a/mihomo/transport/vless/encryption/client.go b/mihomo/transport/vless/encryption/client.go index ecf20692ea..dfa4fa63b7 100644 --- a/mihomo/transport/vless/encryption/client.go +++ b/mihomo/transport/vless/encryption/client.go @@ -3,6 +3,7 @@ package encryption import ( "bytes" "crypto/cipher" + "crypto/ecdh" "crypto/rand" "errors" "fmt" @@ -40,7 +41,8 @@ type ClientInstance struct { sync.RWMutex nfsEKey *mlkem.EncapsulationKey768 hash11 [11]byte // no more capacity - xorKey []byte + xorMode uint32 + xorPKey *ecdh.PublicKey minutes time.Duration expire time.Time baseKey []byte @@ -60,22 +62,23 @@ type ClientConn struct { input bytes.Reader // peerCache } -func (i *ClientInstance) Init(nfsEKeyBytes []byte, xor uint32, minutes time.Duration) (err error) { +func (i *ClientInstance) Init(nfsEKeyBytes, xorPKeyBytes []byte, xorMode, minutes uint32) (err error) { if i.nfsEKey != nil { err = errors.New("already initialized") return } - i.nfsEKey, err = mlkem.NewEncapsulationKey768(nfsEKeyBytes) - if err != nil { + if i.nfsEKey, err = mlkem.NewEncapsulationKey768(nfsEKeyBytes); err != nil { return } hash32 := sha3.Sum256(nfsEKeyBytes) copy(i.hash11[:], hash32[:]) - if xor > 0 { - xorKey := sha3.Sum256(nfsEKeyBytes) - i.xorKey = xorKey[:] + if xorMode > 0 { + i.xorMode = xorMode + if i.xorPKey, err = ecdh.X25519().NewPublicKey(xorPKeyBytes); err != nil { + return + } } - i.minutes = minutes + i.minutes = time.Duration(minutes) * time.Minute return } @@ -83,8 +86,8 @@ func (i *ClientInstance) Handshake(conn net.Conn) (*ClientConn, error) { if i.nfsEKey == nil { return nil, errors.New("uninitialized") } - if i.xorKey != nil { - conn = NewXorConn(conn, i.xorKey) + if i.xorMode > 0 { + conn, _ = NewXorConn(conn, i.xorMode, i.xorPKey, nil) } c := &ClientConn{Conn: conn} @@ -145,7 +148,7 @@ func (i *ClientInstance) Handshake(conn net.Conn) (*ClientConn, error) { } c.baseKey = append(pfsKey, nfsKey...) - VLESS, _ := NewAead(ClientCipher, c.baseKey, encapsulatedPfsKey, encapsulatedNfsKey).Open(nil, append(i.hash11[:], ClientCipher), c.ticket[11:], pfsEKeyBytes) + VLESS, _ := NewAEAD(ClientCipher, c.baseKey, encapsulatedPfsKey, encapsulatedNfsKey).Open(nil, append(i.hash11[:], ClientCipher), c.ticket[11:], pfsEKeyBytes) if !bytes.Equal(VLESS, []byte("VLESS")) { return nil, errors.New("invalid server") } @@ -180,7 +183,7 @@ func (c *ClientConn) Write(b []byte) (int, error) { rand.Read(c.random) copy(data[5+32:], c.random) EncodeHeader(data[5+32+32:], 23, len(b)+16) - c.aead = NewAead(ClientCipher, c.baseKey, c.random, c.ticket) + c.aead = NewAEAD(ClientCipher, c.baseKey, c.random, c.ticket) c.nonce = make([]byte, 12) c.aead.Seal(data[:5+32+32+5], c.nonce, b, data[5+32+32:5+32+32+5]) } else { @@ -188,7 +191,7 @@ func (c *ClientConn) Write(b []byte) (int, error) { EncodeHeader(data, 23, len(b)+16) c.aead.Seal(data[:5], c.nonce, b, data[:5]) if bytes.Equal(c.nonce, MaxNonce) { - c.aead = NewAead(ClientCipher, c.baseKey, data[5:], data[:5]) + c.aead = NewAEAD(ClientCipher, c.baseKey, data[5:], data[:5]) } } IncreaseNonce(c.nonce) @@ -229,7 +232,7 @@ func (c *ClientConn) Read(b []byte) (int, error) { if c.random == nil { return 0, errors.New("empty c.random") } - c.peerAead = NewAead(ClientCipher, c.baseKey, peerRandomHello, c.random) + c.peerAead = NewAEAD(ClientCipher, c.baseKey, peerRandomHello, c.random) c.peerNonce = make([]byte, 12) } if c.input.Len() > 0 { @@ -252,7 +255,7 @@ func (c *ClientConn) Read(b []byte) (int, error) { } var peerAead cipher.AEAD if bytes.Equal(c.peerNonce, MaxNonce) { - peerAead = NewAead(ClientCipher, c.baseKey, peerData, h) + peerAead = NewAEAD(ClientCipher, c.baseKey, peerData, h) } _, err = c.peerAead.Open(dst[:0], c.peerNonce, peerData, h) if peerAead != nil { diff --git a/mihomo/transport/vless/encryption/common.go b/mihomo/transport/vless/encryption/common.go index a67a616927..d383d22e98 100644 --- a/mihomo/transport/vless/encryption/common.go +++ b/mihomo/transport/vless/encryption/common.go @@ -73,7 +73,7 @@ func ReadAndDiscardPaddings(conn net.Conn) (h []byte, t byte, l int, err error) } } -func NewAead(c byte, secret, salt, info []byte) (aead cipher.AEAD) { +func NewAEAD(c byte, secret, salt, info []byte) (aead cipher.AEAD) { key := make([]byte, 32) hkdf.New(sha3.New256, secret, salt, info).Read(key) if c&1 == 1 { diff --git a/mihomo/transport/vless/encryption/doc.go b/mihomo/transport/vless/encryption/doc.go index 6f0c8f7039..10cd320b2b 100644 --- a/mihomo/transport/vless/encryption/doc.go +++ b/mihomo/transport/vless/encryption/doc.go @@ -14,4 +14,5 @@ // https://github.com/XTLS/Xray-core/commit/d1fb48521271251a8c74bd64fcc2fc8700717a3b // https://github.com/XTLS/Xray-core/commit/49580705f6029648399304b816a2737f991582a8 // https://github.com/XTLS/Xray-core/commit/84835bec7d0d8555d0dd30953ed26a272de814c4 +// https://github.com/XTLS/Xray-core/commit/373558ed7abdbac3de41745cf30ec04c9adde604 package encryption diff --git a/mihomo/transport/vless/encryption/factory.go b/mihomo/transport/vless/encryption/factory.go index 4988dbbfb9..d7e4c7e003 100644 --- a/mihomo/transport/vless/encryption/factory.go +++ b/mihomo/transport/vless/encryption/factory.go @@ -5,7 +5,6 @@ import ( "fmt" "strconv" "strings" - "time" ) // NewClient new client from encryption string @@ -15,7 +14,7 @@ func NewClient(encryption string) (*ClientInstance, error) { case "", "none": // We will not reject empty string like xray-core does, because we need to ensure compatibility return nil, nil } - if s := strings.SplitN(encryption, "-", 4); len(s) == 4 && s[2] == "mlkem768client" { + if s := strings.Split(encryption, "."); len(s) == 5 && s[2] == "mlkem768Client" { var minutes uint32 if s[0] != "1rtt" { t := strings.TrimSuffix(s[0], "min") @@ -28,27 +27,35 @@ func NewClient(encryption string) (*ClientInstance, error) { } minutes = uint32(i) } - var xor uint32 + var xorMode uint32 switch s[1] { - case "vless": - case "xored": - xor = 1 + case "native": + case "divide": + xorMode = 1 + case "random": + xorMode = 2 default: return nil, fmt.Errorf("invaild vless encryption value: %s", encryption) } - b, err := base64.RawURLEncoding.DecodeString(s[3]) + xorPKeyBytes, err := base64.RawURLEncoding.DecodeString(s[3]) if err != nil { return nil, fmt.Errorf("invaild vless encryption value: %s", encryption) } - if len(b) == MLKEM768ClientLength { - client := &ClientInstance{} - if err = client.Init(b, xor, time.Duration(minutes)*time.Minute); err != nil { - return nil, fmt.Errorf("failed to use mlkem768seed: %w", err) - } - return client, nil - } else { + if len(xorPKeyBytes) != X25519PasswordSize { return nil, fmt.Errorf("invaild vless encryption value: %s", encryption) } + nfsEKeyBytes, err := base64.RawURLEncoding.DecodeString(s[4]) + if err != nil { + return nil, fmt.Errorf("invaild vless encryption value: %s", encryption) + } + if len(nfsEKeyBytes) != MLKEM768ClientLength { + return nil, fmt.Errorf("invaild vless encryption value: %s", encryption) + } + client := &ClientInstance{} + if err = client.Init(nfsEKeyBytes, xorPKeyBytes, xorMode, minutes); err != nil { + return nil, fmt.Errorf("failed to use mlkem768seed: %w", err) + } + return client, nil } return nil, fmt.Errorf("invaild vless encryption value: %s", encryption) } @@ -60,7 +67,7 @@ func NewServer(decryption string) (*ServerInstance, error) { case "", "none": // We will not reject empty string like xray-core does, because we need to ensure compatibility return nil, nil } - if s := strings.SplitN(decryption, "-", 4); len(s) == 4 && s[2] == "mlkem768seed" { + if s := strings.Split(decryption, "."); len(s) == 5 && s[2] == "mlkem768Seed" { var minutes uint32 if s[0] != "1rtt" { t := strings.TrimSuffix(s[0], "min") @@ -73,27 +80,35 @@ func NewServer(decryption string) (*ServerInstance, error) { } minutes = uint32(i) } - var xor uint32 + var xorMode uint32 switch s[1] { - case "vless": - case "xored": - xor = 1 + case "native": + case "divide": + xorMode = 1 + case "random": + xorMode = 2 default: return nil, fmt.Errorf("invaild vless decryption value: %s", decryption) } - b, err := base64.RawURLEncoding.DecodeString(s[3]) + xorSKeyBytes, err := base64.RawURLEncoding.DecodeString(s[3]) if err != nil { return nil, fmt.Errorf("invaild vless decryption value: %s", decryption) } - if len(b) == MLKEM768SeedLength { - server := &ServerInstance{} - if err = server.Init(b, xor, time.Duration(minutes)*time.Minute); err != nil { - return nil, fmt.Errorf("failed to use mlkem768seed: %w", err) - } - return server, nil - } else { + if len(xorSKeyBytes) != X25519PrivateKeySize { return nil, fmt.Errorf("invaild vless decryption value: %s", decryption) } + nfsDKeySeed, err := base64.RawURLEncoding.DecodeString(s[4]) + if err != nil { + return nil, fmt.Errorf("invaild vless decryption value: %s", decryption) + } + if len(nfsDKeySeed) != MLKEM768SeedLength { + return nil, fmt.Errorf("invaild vless decryption value: %s", decryption) + } + server := &ServerInstance{} + if err = server.Init(nfsDKeySeed, xorSKeyBytes, xorMode, minutes); err != nil { + return nil, fmt.Errorf("failed to use mlkem768seed: %w", err) + } + return server, nil } return nil, fmt.Errorf("invaild vless decryption value: %s", decryption) } diff --git a/mihomo/transport/vless/encryption/key.go b/mihomo/transport/vless/encryption/key.go index 69b5289579..03ff284ef4 100644 --- a/mihomo/transport/vless/encryption/key.go +++ b/mihomo/transport/vless/encryption/key.go @@ -1,25 +1,29 @@ package encryption import ( + "crypto/ecdh" "crypto/rand" "encoding/base64" "fmt" "github.com/metacubex/utls/mlkem" + "golang.org/x/crypto/sha3" ) const MLKEM768SeedLength = mlkem.SeedSize const MLKEM768ClientLength = mlkem.EncapsulationKeySize768 +const X25519PasswordSize = 32 +const X25519PrivateKeySize = 32 -func GenMLKEM768(seedStr string) (seedBase64, clientBase64 string, err error) { - var seed [64]byte +func GenMLKEM768(seedStr string) (seedBase64, clientBase64, hash11Base64 string, err error) { + var seed [MLKEM768SeedLength]byte if len(seedStr) > 0 { s, _ := base64.RawURLEncoding.DecodeString(seedStr) - if len(s) != 64 { + if len(s) != MLKEM768SeedLength { err = fmt.Errorf("invalid length of ML-KEM-768 seed: %s", seedStr) return } - seed = [64]byte(s) + seed = [MLKEM768SeedLength]byte(s) } else { _, err = rand.Read(seed[:]) if err != nil { @@ -28,8 +32,45 @@ func GenMLKEM768(seedStr string) (seedBase64, clientBase64 string, err error) { } key, _ := mlkem.NewDecapsulationKey768(seed[:]) - pub := key.EncapsulationKey() + client := key.EncapsulationKey().Bytes() + hash32 := sha3.Sum256(client) seedBase64 = base64.RawURLEncoding.EncodeToString(seed[:]) - clientBase64 = base64.RawURLEncoding.EncodeToString(pub.Bytes()) + clientBase64 = base64.RawURLEncoding.EncodeToString(client) + hash11Base64 = base64.RawURLEncoding.EncodeToString(hash32[:11]) + return +} + +func GenX25519(privateKeyStr string) (privateKeyBase64, passwordBase64 string, err error) { + var privateKey [X25519PrivateKeySize]byte + if len(privateKeyStr) > 0 { + s, _ := base64.RawURLEncoding.DecodeString(privateKeyStr) + if len(s) != X25519PrivateKeySize { + err = fmt.Errorf("invalid length of X25519 private key: %s", privateKeyStr) + return + } + privateKey = [X25519PrivateKeySize]byte(s) + } else { + _, err = rand.Read(privateKey[:]) + if err != nil { + return + } + } + + // Avoid generating equivalent X25519 private keys + // https://github.com/XTLS/Xray-core/pull/1747 + // + // Modify random bytes using algorithm described at: + // https://cr.yp.to/ecdh.html. + privateKey[0] &= 248 + privateKey[31] &= 127 + privateKey[31] |= 64 + + key, err := ecdh.X25519().NewPrivateKey(privateKey[:]) + if err != nil { + fmt.Println(err.Error()) + return + } + privateKeyBase64 = base64.RawURLEncoding.EncodeToString(privateKey[:]) + passwordBase64 = base64.RawURLEncoding.EncodeToString(key.PublicKey().Bytes()) return } diff --git a/mihomo/transport/vless/encryption/server.go b/mihomo/transport/vless/encryption/server.go index ea72f2f5cf..baa8432cd0 100644 --- a/mihomo/transport/vless/encryption/server.go +++ b/mihomo/transport/vless/encryption/server.go @@ -3,6 +3,7 @@ package encryption import ( "bytes" "crypto/cipher" + "crypto/ecdh" "crypto/rand" "errors" "fmt" @@ -26,7 +27,8 @@ type ServerInstance struct { sync.RWMutex nfsDKey *mlkem.DecapsulationKey768 hash11 [11]byte // no more capacity - xorKey []byte + xorMode uint32 + xorSKey *ecdh.PrivateKey minutes time.Duration sessions map[[32]byte]*ServerSession closed bool @@ -45,23 +47,24 @@ type ServerConn struct { nonce []byte } -func (i *ServerInstance) Init(nfsDKeySeed []byte, xor uint32, minutes time.Duration) (err error) { +func (i *ServerInstance) Init(nfsDKeySeed, xorSKeyBytes []byte, xorMode, minutes uint32) (err error) { if i.nfsDKey != nil { err = errors.New("already initialized") return } - i.nfsDKey, err = mlkem.NewDecapsulationKey768(nfsDKeySeed) - if err != nil { + if i.nfsDKey, err = mlkem.NewDecapsulationKey768(nfsDKeySeed); err != nil { return } hash32 := sha3.Sum256(i.nfsDKey.EncapsulationKey().Bytes()) copy(i.hash11[:], hash32[:]) - if xor > 0 { - xorKey := sha3.Sum256(i.nfsDKey.EncapsulationKey().Bytes()) - i.xorKey = xorKey[:] + if xorMode > 0 { + i.xorMode = xorMode + if i.xorSKey, err = ecdh.X25519().NewPrivateKey(xorSKeyBytes); err != nil { + return + } } if minutes > 0 { - i.minutes = minutes + i.minutes = time.Duration(minutes) * time.Minute i.sessions = make(map[[32]byte]*ServerSession) go func() { for { @@ -95,8 +98,11 @@ func (i *ServerInstance) Handshake(conn net.Conn) (*ServerConn, error) { if i.nfsDKey == nil { return nil, errors.New("uninitialized") } - if i.xorKey != nil { - conn = NewXorConn(conn, i.xorKey) + if i.xorMode > 0 { + var err error + if conn, err = NewXorConn(conn, i.xorMode, nil, i.xorSKey); err != nil { + return nil, err + } } c := &ServerConn{Conn: conn} @@ -167,7 +173,7 @@ func (i *ServerInstance) Handshake(conn net.Conn) (*ServerConn, error) { pfsKey, encapsulatedPfsKey := pfsEKey.Encapsulate() c.baseKey = append(pfsKey, nfsKey...) - c.ticket = append(i.hash11[:], NewAead(c.cipher, c.baseKey, encapsulatedPfsKey, encapsulatedNfsKey).Seal(nil, peerClientHello[:12], []byte("VLESS"), pfsEKeyBytes)...) + c.ticket = append(i.hash11[:], NewAEAD(c.cipher, c.baseKey, encapsulatedPfsKey, encapsulatedNfsKey).Seal(nil, peerClientHello[:12], []byte("VLESS"), pfsEKeyBytes)...) paddingLen := randBetween(100, 1000) @@ -221,7 +227,7 @@ func (c *ServerConn) Read(b []byte) (int, error) { } c.peerRandom = peerTicketHello[32:] } - c.peerAead = NewAead(c.cipher, c.baseKey, c.peerRandom, c.ticket) + c.peerAead = NewAEAD(c.cipher, c.baseKey, c.peerRandom, c.ticket) c.peerNonce = make([]byte, 12) } if c.input.Len() > 0 { @@ -244,7 +250,7 @@ func (c *ServerConn) Read(b []byte) (int, error) { } var peerAead cipher.AEAD if bytes.Equal(c.peerNonce, MaxNonce) { - peerAead = NewAead(c.cipher, c.baseKey, peerData, h) + peerAead = NewAEAD(c.cipher, c.baseKey, peerData, h) } _, err = c.peerAead.Open(dst[:0], c.peerNonce, peerData, h) if peerAead != nil { @@ -280,7 +286,7 @@ func (c *ServerConn) Write(b []byte) (int, error) { EncodeHeader(data, 0, 32) rand.Read(data[5 : 5+32]) EncodeHeader(data[5+32:], 23, len(b)+16) - c.aead = NewAead(c.cipher, c.baseKey, data[5:5+32], c.peerRandom) + c.aead = NewAEAD(c.cipher, c.baseKey, data[5:5+32], c.peerRandom) c.nonce = make([]byte, 12) c.aead.Seal(data[:5+32+5], c.nonce, b, data[5+32:5+32+5]) } else { @@ -288,7 +294,7 @@ func (c *ServerConn) Write(b []byte) (int, error) { EncodeHeader(data, 23, len(b)+16) c.aead.Seal(data[:5], c.nonce, b, data[:5]) if bytes.Equal(c.nonce, MaxNonce) { - c.aead = NewAead(c.cipher, c.baseKey, data[5:], data[:5]) + c.aead = NewAEAD(c.cipher, c.baseKey, data[5:], data[:5]) } } IncreaseNonce(c.nonce) diff --git a/mihomo/transport/vless/encryption/xor.go b/mihomo/transport/vless/encryption/xor.go index caad12bf07..88bd76982e 100644 --- a/mihomo/transport/vless/encryption/xor.go +++ b/mihomo/transport/vless/encryption/xor.go @@ -3,13 +3,21 @@ package encryption import ( "crypto/aes" "crypto/cipher" + "crypto/ecdh" "crypto/rand" + "errors" "io" "net" + + "golang.org/x/crypto/hkdf" + "golang.org/x/crypto/sha3" ) type XorConn struct { net.Conn + Divide bool + + head []byte key []byte ctr cipher.Stream peerCtr cipher.Stream @@ -25,8 +33,55 @@ type XorConn struct { in_skip int } -func NewXorConn(conn net.Conn, key []byte) *XorConn { - return &XorConn{Conn: conn, key: key} +func NewCTR(key, iv []byte, isServer bool) cipher.Stream { + info := "CLIENT" + if isServer { + info = "SERVER" // avoids attackers sending traffic back to the client, though the encryption layer has its own protection + } + hkdf.New(sha3.New256, key, iv, []byte(info)).Read(key) // avoids using pKey directly if attackers sent the basepoint, or whaterver they like + block, _ := aes.NewCipher(key) + return cipher.NewCTR(block, iv) +} + +func NewXorConn(conn net.Conn, mode uint32, pKey *ecdh.PublicKey, sKey *ecdh.PrivateKey) (*XorConn, error) { + if mode == 0 || (pKey == nil && sKey == nil) || (pKey != nil && sKey != nil) { + return nil, errors.New("invalid parameters") + } + c := &XorConn{ + Conn: conn, + Divide: mode == 1, + isHeader: true, + out_header: make([]byte, 0, 5), // important + in_header: make([]byte, 0, 5), // important + } + if pKey != nil { + c.head = make([]byte, 16+32) + rand.Read(c.head) + eSKey, _ := ecdh.X25519().GenerateKey(rand.Reader) + NewCTR(pKey.Bytes(), c.head[:16], false).XORKeyStream(c.head[16:], eSKey.PublicKey().Bytes()) // make X25519 public key distinguishable from random bytes + c.key, _ = eSKey.ECDH(pKey) + c.ctr = NewCTR(c.key, c.head[:16], false) + } + if sKey != nil { + peerHead := make([]byte, 16+32) + if _, err := io.ReadFull(c.Conn, peerHead); err != nil { + return nil, err + } + NewCTR(sKey.PublicKey().Bytes(), peerHead[:16], false).XORKeyStream(peerHead[16:], peerHead[16:]) // we don't use buggy elligator, because we have PSK :) + ePKey, err := ecdh.X25519().NewPublicKey(peerHead[16:]) + if err != nil { + return nil, err + } + key, err := sKey.ECDH(ePKey) + if err != nil { + return nil, err + } + c.peerCtr = NewCTR(key, peerHead[:16], false) + c.head = make([]byte, 16) + rand.Read(c.head) // make sure the server always replies random bytes even when received replays, though it is not important + c.ctr = NewCTR(key, c.head, true) // the same key links the upload & download, though the encryption layer has its own link + } + return c, nil //chacha20.NewUnauthenticatedCipher() } @@ -35,13 +90,6 @@ func (c *XorConn) Write(b []byte) (int, error) { // whole one/two records return 0, nil } if !c.out_after0 { - var iv []byte - if c.ctr == nil { - block, _ := aes.NewCipher(c.key) - iv = make([]byte, 16) - rand.Read(iv) - c.ctr = cipher.NewCTR(block, iv) - } t, l, _ := DecodeHeader(b) if t == 23 { // single 23 l = 5 @@ -49,20 +97,24 @@ func (c *XorConn) Write(b []byte) (int, error) { // whole one/two records l += 10 if t == 0 { c.out_after0 = true - c.out_header = make([]byte, 0, 5) // important + if c.Divide { + l -= 5 + } } } c.ctr.XORKeyStream(b[:l], b[:l]) // caller MUST discard b - if iv != nil { - b = append(iv, b...) + l = len(b) + if c.head != nil { + b = append(c.head, b...) + c.head = nil } if _, err := c.Conn.Write(b); err != nil { return 0, err } - if iv != nil { - b = b[16:] // for len(b) - } - return len(b), nil + return l, nil + } + if c.Divide { + return c.Conn.Write(b) } for p := b; ; { // for XTLS if len(p) <= c.out_skip { @@ -93,14 +145,12 @@ func (c *XorConn) Read(b []byte) (int, error) { // 5-bytes, data, 5-bytes... return 0, nil } if !c.in_after0 || !c.isHeader { - if c.peerCtr == nil { + if c.peerCtr == nil { // for client peerIv := make([]byte, 16) if _, err := io.ReadFull(c.Conn, peerIv); err != nil { return 0, err } - block, _ := aes.NewCipher(c.key) - c.peerCtr = cipher.NewCTR(block, peerIv) - c.isHeader = true + c.peerCtr = NewCTR(c.key, peerIv, true) } if _, err := io.ReadFull(c.Conn, b); err != nil { return 0, err @@ -117,7 +167,6 @@ func (c *XorConn) Read(b []byte) (int, error) { // 5-bytes, data, 5-bytes... c.isHeader = false if t == 0 { c.in_after0 = true - c.in_header = make([]byte, 0, 5) // important } } } else { @@ -125,6 +174,9 @@ func (c *XorConn) Read(b []byte) (int, error) { // 5-bytes, data, 5-bytes... } return len(b), nil } + if c.Divide { + return c.Conn.Read(b) + } n, err := c.Conn.Read(b) for p := b[:n]; ; { // for XTLS if len(p) <= c.in_skip { @@ -146,3 +198,27 @@ func (c *XorConn) Read(b []byte) (int, error) { // 5-bytes, data, 5-bytes... } return n, err } + +func (c *XorConn) WriterReplaceable() bool { + if !c.Divide { // never replaceable + return false + } + if !c.out_after0 { + return false + } + return true +} + +func (c *XorConn) ReaderReplaceable() bool { + if !c.Divide { // never replaceable + return false + } + if !c.in_after0 || !c.isHeader { + return false + } + return true +} + +func (c *XorConn) Upstream() any { + return c.Conn +} diff --git a/openwrt-packages/adguardhome/Makefile b/openwrt-packages/adguardhome/Makefile index de562c370e..eba032d5d6 100644 --- a/openwrt-packages/adguardhome/Makefile +++ b/openwrt-packages/adguardhome/Makefile @@ -6,12 +6,12 @@ include $(TOPDIR)/rules.mk PKG_NAME:=adguardhome -PKG_VERSION:=0.107.64 +PKG_VERSION:=0.107.65 PKG_RELEASE:=1 PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz PKG_SOURCE_URL:=https://codeload.github.com/AdguardTeam/AdGuardHome/tar.gz/v$(PKG_VERSION)? -PKG_HASH:=a6b61d3c102fa47072a7230382d438f3d408f74ffae3aff7d330adad90ed169c +PKG_HASH:=b770007696de88ab4de0008502002a4966a30aca88c9b030c142183a1c2a5830 PKG_BUILD_DIR:=$(BUILD_DIR)/AdGuardHome-$(PKG_VERSION) PKG_LICENSE:=GPL-3.0-only @@ -58,7 +58,7 @@ define Download/adguardhome-frontend URL:=https://github.com/AdguardTeam/AdGuardHome/releases/download/v$(PKG_VERSION)/ URL_FILE:=AdGuardHome_frontend.tar.gz FILE:=$(FRONTEND_FILE) - HASH:=f0c1e4d6e673d4d26d52947cdb220682aa554158d331fa044576d1794b82e325 + HASH:=e838234d8391a23f86b32a26a5c68112a975c7ee83b79646f0597c001f6cab3f endef define Build/Prepare diff --git a/openwrt-packages/ddns-go/Makefile b/openwrt-packages/ddns-go/Makefile index ba3de41f62..5b223dd6ea 100644 --- a/openwrt-packages/ddns-go/Makefile +++ b/openwrt-packages/ddns-go/Makefile @@ -8,12 +8,12 @@ include $(TOPDIR)/rules.mk PKG_NAME:=ddns-go -PKG_VERSION:=6.12.2 +PKG_VERSION:=6.12.4 PKG_RELEASE:=1 PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz PKG_SOURCE_URL:=https://codeload.github.com/jeessy2/ddns-go/tar.gz/v$(PKG_VERSION)? -PKG_HASH:=a3ea99ad74212fc3bd1380e5ad444a1c5fe6bb1bb656624a441551034a17edaa +PKG_HASH:=04f65f7f1ccc18b23dd108f915810146e8b655cd19e7d8ee488cf557222c3fee PKG_LICENSE:=MIT PKG_LICENSE_FILES:=LICENSE diff --git a/openwrt-packages/quickstart/Makefile b/openwrt-packages/quickstart/Makefile index 55cadb112e..d211b3297b 100644 --- a/openwrt-packages/quickstart/Makefile +++ b/openwrt-packages/quickstart/Makefile @@ -10,11 +10,11 @@ include $(TOPDIR)/rules.mk PKG_ARCH_quickstart:=$(ARCH) PKG_NAME:=quickstart -PKG_VERSION:=0.11.2 +PKG_VERSION:=0.11.3 PKG_RELEASE:=1 PKG_SOURCE:=$(PKG_NAME)-binary-$(PKG_VERSION).tar.gz PKG_SOURCE_URL:=https://github.com/linkease/istore-packages/releases/download/prebuilt/ -PKG_HASH:=b22f430f08fb12739179e4b983133afb84a37be1e702d5b4e9fb30b1e701824d +PKG_HASH:=fee17158398f7867eb20bf187fbfb2d12d46e44d2f9e882376173392a8979d14 PKG_BUILD_DIR:=$(BUILD_DIR)/$(PKG_NAME)-binary-$(PKG_VERSION) diff --git a/openwrt-passwall/luci-app-passwall/luasrc/model/cbi/passwall/client/type/ray.lua b/openwrt-passwall/luci-app-passwall/luasrc/model/cbi/passwall/client/type/ray.lua index bb2248bd30..2834edacd8 100644 --- a/openwrt-passwall/luci-app-passwall/luasrc/model/cbi/passwall/client/type/ray.lua +++ b/openwrt-passwall/luci-app-passwall/luasrc/model/cbi/passwall/client/type/ray.lua @@ -58,7 +58,8 @@ for k, e in ipairs(api.get_valid_nodes()) do nodes_table[#nodes_table + 1] = { id = e[".name"], remark = e["remark"], - type = e["type"] + type = e["type"], + chain_proxy = e["chain_proxy"] } end if e.protocol == "_balancing" then @@ -696,7 +697,7 @@ o = s:option(ListValue, _n("to_node"), translate("Landing Node"), translate("Onl o:depends({ [_n("chain_proxy")] = "2" }) for k, v in pairs(nodes_table) do - if v.type == "Xray" and v.id ~= arg[1] then + if v.type == "Xray" and v.id ~= arg[1] and (not v.chain_proxy or v.chain_proxy == "") then s.fields[_n("preproxy_node")]:value(v.id, v.remark) s.fields[_n("to_node")]:value(v.id, v.remark) end diff --git a/openwrt-passwall/luci-app-passwall/luasrc/model/cbi/passwall/client/type/sing-box.lua b/openwrt-passwall/luci-app-passwall/luasrc/model/cbi/passwall/client/type/sing-box.lua index 2b93635a75..86d9be4f0c 100644 --- a/openwrt-passwall/luci-app-passwall/luasrc/model/cbi/passwall/client/type/sing-box.lua +++ b/openwrt-passwall/luci-app-passwall/luasrc/model/cbi/passwall/client/type/sing-box.lua @@ -75,7 +75,8 @@ for k, e in ipairs(api.get_valid_nodes()) do nodes_table[#nodes_table + 1] = { id = e[".name"], remark = e["remark"], - type = e["type"] + type = e["type"], + chain_proxy = e["chain_proxy"] } end if e.protocol == "_iface" then @@ -753,7 +754,7 @@ o = s:option(ListValue, _n("to_node"), translate("Landing Node"), translate("Onl o:depends({ [_n("chain_proxy")] = "2" }) for k, v in pairs(nodes_table) do - if v.type == "sing-box" and v.id ~= arg[1] then + if v.type == "sing-box" and v.id ~= arg[1] and (not v.chain_proxy or v.chain_proxy == "") then s.fields[_n("preproxy_node")]:value(v.id, v.remark) s.fields[_n("to_node")]:value(v.id, v.remark) end diff --git a/sing-box/clients/android/version.properties b/sing-box/clients/android/version.properties index 0df1610ec6..9d950133d5 100644 --- a/sing-box/clients/android/version.properties +++ b/sing-box/clients/android/version.properties @@ -1,3 +1,3 @@ -VERSION_CODE=554 -VERSION_NAME=1.12.2 +VERSION_CODE=556 +VERSION_NAME=1.12.3 GO_VERSION=go1.25.0 diff --git a/sing-box/dns/transport/local/local_darwin.go b/sing-box/dns/transport/local/local_darwin.go index 5a8b4113e8..6754d94626 100644 --- a/sing-box/dns/transport/local/local_darwin.go +++ b/sing-box/dns/transport/local/local_darwin.go @@ -7,7 +7,6 @@ import ( "errors" "net" - mDNS "github.com/miekg/dns" "github.com/sagernet/sing-box/adapter" C "github.com/sagernet/sing-box/constant" "github.com/sagernet/sing-box/dns" @@ -20,6 +19,8 @@ import ( M "github.com/sagernet/sing/common/metadata" N "github.com/sagernet/sing/common/network" "github.com/sagernet/sing/service" + + mDNS "github.com/miekg/dns" ) func RegisterTransport(registry *dns.TransportRegistry) { diff --git a/sing-box/dns/transport/local/local_resolved_linux.go b/sing-box/dns/transport/local/local_resolved_linux.go index 125a5d32fb..279f9c8eae 100644 --- a/sing-box/dns/transport/local/local_resolved_linux.go +++ b/sing-box/dns/transport/local/local_resolved_linux.go @@ -2,15 +2,19 @@ package local import ( "context" + "errors" "os" "sync" "github.com/sagernet/sing-box/adapter" + C "github.com/sagernet/sing-box/constant" "github.com/sagernet/sing-box/service/resolved" "github.com/sagernet/sing-tun" "github.com/sagernet/sing/common/atomic" + "github.com/sagernet/sing/common/control" E "github.com/sagernet/sing/common/exceptions" "github.com/sagernet/sing/common/logger" + "github.com/sagernet/sing/common/x/list" "github.com/sagernet/sing/service" "github.com/godbus/dbus/v5" @@ -18,11 +22,18 @@ import ( ) type DBusResolvedResolver struct { - logger logger.ContextLogger - interfaceMonitor tun.DefaultInterfaceMonitor - systemBus *dbus.Conn - resoledObject atomic.TypedValue[dbus.BusObject] - closeOnce sync.Once + ctx context.Context + logger logger.ContextLogger + interfaceMonitor tun.DefaultInterfaceMonitor + interfaceCallback *list.Element[tun.DefaultInterfaceUpdateCallback] + systemBus *dbus.Conn + resoledObject atomic.Pointer[ResolvedObject] + closeOnce sync.Once +} + +type ResolvedObject struct { + dbus.BusObject + InterfaceIndex int32 } func NewResolvedResolver(ctx context.Context, logger logger.ContextLogger) (ResolvedResolver, error) { @@ -35,6 +46,7 @@ func NewResolvedResolver(ctx context.Context, logger logger.ContextLogger) (Reso return nil, err } return &DBusResolvedResolver{ + ctx: ctx, logger: logger, interfaceMonitor: interfaceMonitor, systemBus: systemBus, @@ -43,6 +55,7 @@ func NewResolvedResolver(ctx context.Context, logger logger.ContextLogger) (Reso func (t *DBusResolvedResolver) Start() error { t.updateStatus() + t.interfaceCallback = t.interfaceMonitor.RegisterCallback(t.updateDefaultInterface) err := t.systemBus.BusObject().AddMatchSignal( "org.freedesktop.DBus", "NameOwnerChanged", @@ -58,6 +71,9 @@ func (t *DBusResolvedResolver) Start() error { func (t *DBusResolvedResolver) Close() error { t.closeOnce.Do(func() { + if t.interfaceCallback != nil { + t.interfaceMonitor.UnregisterCallback(t.interfaceCallback) + } if t.systemBus != nil { _ = t.systemBus.Close() } @@ -70,22 +86,23 @@ func (t *DBusResolvedResolver) Object() any { } func (t *DBusResolvedResolver) Exchange(object any, ctx context.Context, message *mDNS.Msg) (*mDNS.Msg, error) { - defaultInterface := t.interfaceMonitor.DefaultInterface() - if defaultInterface == nil { - return nil, E.New("missing default interface") - } question := message.Question[0] - call := object.(*dbus.Object).CallWithContext( + resolvedObject := object.(*ResolvedObject) + call := resolvedObject.CallWithContext( ctx, "org.freedesktop.resolve1.Manager.ResolveRecord", 0, - int32(defaultInterface.Index), + resolvedObject.InterfaceIndex, question.Name, question.Qclass, question.Qtype, uint64(0), ) if call.Err != nil { + var dbusError dbus.Error + if errors.As(call.Err, &dbusError) && dbusError.Name == "org.freedesktop.resolve1.NoNameServers" { + t.updateStatus() + } return nil, E.Cause(call.Err, " resolve record via resolved") } var ( @@ -137,14 +154,76 @@ func (t *DBusResolvedResolver) loopUpdateStatus() { } func (t *DBusResolvedResolver) updateStatus() { - dbusObject := t.systemBus.Object("org.freedesktop.resolve1", "/org/freedesktop/resolve1") - err := dbusObject.Call("org.freedesktop.DBus.Peer.Ping", 0).Err + dbusObject, err := t.checkResolved(context.Background()) + oldValue := t.resoledObject.Swap(dbusObject) if err != nil { - if t.resoledObject.Swap(nil) != nil { + var dbusErr dbus.Error + if !errors.As(err, &dbusErr) || dbusErr.Name != "org.freedesktop.DBus.Error.NameHasNoOwnerCould" { + t.logger.Debug(E.Cause(err, "systemd-resolved service unavailable")) + } + if oldValue != nil { t.logger.Debug("systemd-resolved service is gone") } return + } else if oldValue == nil { + t.logger.Debug("using systemd-resolved service as resolver") } - t.resoledObject.Store(dbusObject) - t.logger.Debug("using systemd-resolved service as resolver") +} + +func (t *DBusResolvedResolver) checkResolved(ctx context.Context) (*ResolvedObject, error) { + dbusObject := t.systemBus.Object("org.freedesktop.resolve1", "/org/freedesktop/resolve1") + err := dbusObject.Call("org.freedesktop.DBus.Peer.Ping", 0).Err + if err != nil { + return nil, err + } + defaultInterface := t.interfaceMonitor.DefaultInterface() + if defaultInterface == nil { + return nil, E.New("missing default interface") + } + call := dbusObject.(*dbus.Object).CallWithContext( + ctx, + "org.freedesktop.resolve1.Manager.GetLink", + 0, + int32(defaultInterface.Index), + ) + if call.Err != nil { + return nil, err + } + var linkPath dbus.ObjectPath + err = call.Store(&linkPath) + if err != nil { + return nil, err + } + linkObject := t.systemBus.Object("org.freedesktop.resolve1", linkPath) + if linkObject == nil { + return nil, E.New("missing link object for default interface") + } + dnsProp, err := linkObject.GetProperty("org.freedesktop.resolve1.Link.DNS") + if err != nil { + return nil, err + } + var linkDNS []resolved.LinkDNS + err = dnsProp.Store(&linkDNS) + if err != nil { + return nil, err + } + if len(linkDNS) == 0 { + for _, inbound := range service.FromContext[adapter.InboundManager](t.ctx).Inbounds() { + if inbound.Type() == C.TypeTun { + return nil, E.New("No appropriate name servers or networks for name found") + } + } + return &ResolvedObject{ + BusObject: dbusObject, + }, nil + } else { + return &ResolvedObject{ + BusObject: dbusObject, + InterfaceIndex: int32(defaultInterface.Index), + }, nil + } +} + +func (t *DBusResolvedResolver) updateDefaultInterface(defaultInterface *control.Interface, flags int) { + t.updateStatus() } diff --git a/sing-box/docs/changelog.md b/sing-box/docs/changelog.md index 85f792f9c1..1f5ae1504a 100644 --- a/sing-box/docs/changelog.md +++ b/sing-box/docs/changelog.md @@ -6,6 +6,14 @@ icon: material/alert-decagram * Fixes and improvements +#### 1.12.3 + +* Fixes and improvements + +#### 1.13.0-alpha.4 + +* Fixes and improvements + #### 1.12.2 * Fixes and improvements diff --git a/small/luci-app-fchomo/htdocs/luci-static/resources/view/fchomo/global.js b/small/luci-app-fchomo/htdocs/luci-static/resources/view/fchomo/global.js index 8c61d6dbf9..271edffdbd 100644 --- a/small/luci-app-fchomo/htdocs/luci-static/resources/view/fchomo/global.js +++ b/small/luci-app-fchomo/htdocs/luci-static/resources/view/fchomo/global.js @@ -861,8 +861,8 @@ return view.extend({ so = ss.taboption('direct_list', hm.TextValue, 'direct_list.yaml', null); so.rows = 20; - so.default = 'FQDN:\nIPCIDR:\nIPCIDR6:\n'; - so.placeholder = "FQDN:\n- mask.icloud.com\n- mask-h2.icloud.com\n- mask.apple-dns.net\nIPCIDR:\n- '223.0.0.0/12'\nIPCIDR6:\n- '2400:3200::/32'\n"; + so.default = 'DOMAIN:\nIPCIDR:\nIPCIDR6:\n'; + so.placeholder = "DOMAIN:\n- mask.icloud.com\n- mask-h2.icloud.com\n- mask.apple-dns.net\nIPCIDR:\n- '223.0.0.0/12'\nIPCIDR6:\n- '2400:3200::/32'\n"; so.load = function(section_id) { return L.resolveDefault(hm.readFile('resources', this.option), ''); } @@ -879,8 +879,8 @@ return view.extend({ so = ss.taboption('proxy_list', hm.TextValue, 'proxy_list.yaml', null); so.rows = 20; - so.default = 'FQDN:\nIPCIDR:\nIPCIDR6:\n'; - so.placeholder = "FQDN:\n- www.google.com\nIPCIDR:\n- '91.105.192.0/23'\nIPCIDR6:\n- '2001:67c:4e8::/48'\n"; + so.default = 'DOMAIN:\nIPCIDR:\nIPCIDR6:\n'; + so.placeholder = "DOMAIN:\n- www.google.com\n- '.googlevideo.com'\n- google.com\nIPCIDR:\n- '91.105.192.0/23'\nIPCIDR6:\n- '2001:67c:4e8::/48'\n"; so.load = function(section_id) { return L.resolveDefault(hm.readFile('resources', this.option), ''); } diff --git a/small/luci-app-fchomo/root/etc/init.d/fchomo b/small/luci-app-fchomo/root/etc/init.d/fchomo index 622134cafc..d9524bf5eb 100755 --- a/small/luci-app-fchomo/root/etc/init.d/fchomo +++ b/small/luci-app-fchomo/root/etc/init.d/fchomo @@ -186,7 +186,7 @@ start_service() { local yaml="$5" if [ -n "$yaml" ]; then - yq '.[] |= with(select(. == null); . = []) | .FQDN[]' "$src" | \ + yq '.[] |= with(select(. == null); . = []) | .DOMAIN[]' "$src" | \ sed "s|^|nftset=/|;s|$|/${family}#inet#fchomo#${set_name}|" > "$dst" else sed "s|^|nftset=/|;s|$|/${family}#inet#fchomo#${set_name}|" "$src" > "$dst" diff --git a/small/luci-app-fchomo/root/etc/uci-defaults/99_luci-app-fchomo b/small/luci-app-fchomo/root/etc/uci-defaults/99_luci-app-fchomo index 0ed821956d..15177df473 100755 --- a/small/luci-app-fchomo/root/etc/uci-defaults/99_luci-app-fchomo +++ b/small/luci-app-fchomo/root/etc/uci-defaults/99_luci-app-fchomo @@ -14,7 +14,7 @@ fi # Initialize the default direct list if [ ! -s "/etc/fchomo/resources/direct_list.yaml" ]; then cat <<- EOF > "/etc/fchomo/resources/direct_list.yaml" - FQDN: + DOMAIN: IPCIDR: - '223.0.0.0/12' IPCIDR6: @@ -25,8 +25,10 @@ fi # Initialize the default proxy list if [ ! -s "/etc/fchomo/resources/proxy_list.yaml" ]; then cat <<- EOF > "/etc/fchomo/resources/proxy_list.yaml" - FQDN: + DOMAIN: - www.google.com + - '.googlevideo.com' + - google.com IPCIDR: - '91.105.192.0/23' - '91.108.4.0/22' diff --git a/small/luci-app-fchomo/root/etc/uci-defaults/99_luci-app-fchomo-migration b/small/luci-app-fchomo/root/etc/uci-defaults/99_luci-app-fchomo-migration index 93b8f6cf37..c16063cc3b 100755 --- a/small/luci-app-fchomo/root/etc/uci-defaults/99_luci-app-fchomo-migration +++ b/small/luci-app-fchomo/root/etc/uci-defaults/99_luci-app-fchomo-migration @@ -1,5 +1,8 @@ #!/bin/sh +sed -i 's|^FQDN:$|DOMAIN:|' "/etc/fchomo/resources/direct_list.yaml" +sed -i 's|^FQDN:$|DOMAIN:|' "/etc/fchomo/resources/proxy_list.yaml" + default_proxy=$(uci -q get fchomo.routing.default_proxy) if [ -n "$default_proxy" ]; then uci -q batch <<-EOF >"/dev/null" diff --git a/small/luci-app-nikki/htdocs/luci-static/resources/tools/nikki.js b/small/luci-app-nikki/htdocs/luci-static/resources/tools/nikki.js index 57d8e3926c..9e5ea4d655 100644 --- a/small/luci-app-nikki/htdocs/luci-static/resources/tools/nikki.js +++ b/small/luci-app-nikki/htdocs/luci-static/resources/tools/nikki.js @@ -107,6 +107,9 @@ return baseclass.extend({ const profile = await callNikkiProfile({ 'external-controller': null, 'secret': null }); const apiListen = profile['external-controller']; const apiSecret = profile['secret'] ?? ''; + if (!apiListen) { + return Promise.reject('API has not been configured'); + } const apiPort = apiListen.substring(apiListen.lastIndexOf(':') + 1); const url = `http://${window.location.hostname}:${apiPort}${path}`; return request.request(url, { @@ -114,7 +117,7 @@ return baseclass.extend({ headers: { 'Authorization': `Bearer ${apiSecret}` }, query: query, content: body - }) + }); }, openDashboard: async function () { @@ -122,6 +125,9 @@ return baseclass.extend({ const uiName = profile['external-ui-name']; const apiListen = profile['external-controller']; const apiSecret = profile['secret'] ?? ''; + if (!apiListen) { + return Promise.reject('API has not been configured'); + } const apiPort = apiListen.substring(apiListen.lastIndexOf(':') + 1); const params = { host: window.location.hostname, @@ -137,6 +143,7 @@ return baseclass.extend({ url = `http://${window.location.hostname}:${apiPort}/ui/?${query}`; } setTimeout(function () { window.open(url, '_blank') }, 0); + return Promise.resolve(); }, updateDashboard: function () { diff --git a/small/luci-app-passwall/luasrc/model/cbi/passwall/client/type/ray.lua b/small/luci-app-passwall/luasrc/model/cbi/passwall/client/type/ray.lua index bb2248bd30..2834edacd8 100644 --- a/small/luci-app-passwall/luasrc/model/cbi/passwall/client/type/ray.lua +++ b/small/luci-app-passwall/luasrc/model/cbi/passwall/client/type/ray.lua @@ -58,7 +58,8 @@ for k, e in ipairs(api.get_valid_nodes()) do nodes_table[#nodes_table + 1] = { id = e[".name"], remark = e["remark"], - type = e["type"] + type = e["type"], + chain_proxy = e["chain_proxy"] } end if e.protocol == "_balancing" then @@ -696,7 +697,7 @@ o = s:option(ListValue, _n("to_node"), translate("Landing Node"), translate("Onl o:depends({ [_n("chain_proxy")] = "2" }) for k, v in pairs(nodes_table) do - if v.type == "Xray" and v.id ~= arg[1] then + if v.type == "Xray" and v.id ~= arg[1] and (not v.chain_proxy or v.chain_proxy == "") then s.fields[_n("preproxy_node")]:value(v.id, v.remark) s.fields[_n("to_node")]:value(v.id, v.remark) end diff --git a/small/luci-app-passwall/luasrc/model/cbi/passwall/client/type/sing-box.lua b/small/luci-app-passwall/luasrc/model/cbi/passwall/client/type/sing-box.lua index 2b93635a75..86d9be4f0c 100644 --- a/small/luci-app-passwall/luasrc/model/cbi/passwall/client/type/sing-box.lua +++ b/small/luci-app-passwall/luasrc/model/cbi/passwall/client/type/sing-box.lua @@ -75,7 +75,8 @@ for k, e in ipairs(api.get_valid_nodes()) do nodes_table[#nodes_table + 1] = { id = e[".name"], remark = e["remark"], - type = e["type"] + type = e["type"], + chain_proxy = e["chain_proxy"] } end if e.protocol == "_iface" then @@ -753,7 +754,7 @@ o = s:option(ListValue, _n("to_node"), translate("Landing Node"), translate("Onl o:depends({ [_n("chain_proxy")] = "2" }) for k, v in pairs(nodes_table) do - if v.type == "sing-box" and v.id ~= arg[1] then + if v.type == "sing-box" and v.id ~= arg[1] and (not v.chain_proxy or v.chain_proxy == "") then s.fields[_n("preproxy_node")]:value(v.id, v.remark) s.fields[_n("to_node")]:value(v.id, v.remark) end diff --git a/small/nikki/files/nikki.conf b/small/nikki/files/nikki.conf index 7e71b121db..2ea1c45536 100644 --- a/small/nikki/files/nikki.conf +++ b/small/nikki/files/nikki.conf @@ -38,11 +38,13 @@ config mixin 'mixin' option 'redir_port' '7891' option 'tproxy_port' '7892' option 'authentication' '1' + option 'tun_enabled' '1' option 'tun_device' 'nikki' option 'tun_stack' 'mixed' option 'tun_dns_hijack' '0' list 'tun_dns_hijacks' 'tcp://any:53' list 'tun_dns_hijacks' 'udp://any:53' + option 'dns_enabled' '1' option 'dns_listen' '[::]:1053' option 'dns_ipv6' '1' option 'dns_mode' 'fake-ip' diff --git a/small/sing-box/Makefile b/small/sing-box/Makefile index d576f10678..3906c20b37 100644 --- a/small/sing-box/Makefile +++ b/small/sing-box/Makefile @@ -6,12 +6,12 @@ include $(TOPDIR)/rules.mk PKG_NAME:=sing-box -PKG_VERSION:=1.12.2 +PKG_VERSION:=1.12.3 PKG_RELEASE:=1 PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz PKG_SOURCE_URL:=https://codeload.github.com/SagerNet/sing-box/tar.gz/v$(PKG_VERSION)? -PKG_HASH:=95d902c008ed0b414ab29408dc565310fffe435a15753e02d10ca5c8e6837ce5 +PKG_HASH:=3dce8ee383655908451f7f193714f0c8f90b8fd4baecb8e7e3948d263d766359 PKG_LICENSE:=GPL-3.0-or-later PKG_LICENSE_FILES:=LICENSE diff --git a/small/v2ray-geodata/Makefile b/small/v2ray-geodata/Makefile index d1309b424b..33371c3f79 100644 --- a/small/v2ray-geodata/Makefile +++ b/small/v2ray-geodata/Makefile @@ -21,13 +21,13 @@ define Download/geoip HASH:=54761d8691a5756fdb08d2cd4d0a9c889dbaab786e1cf758592e09fb00377f53 endef -GEOSITE_VER:=20250820044243 +GEOSITE_VER:=20250821075639 GEOSITE_FILE:=dlc.dat.$(GEOSITE_VER) define Download/geosite URL:=https://github.com/v2fly/domain-list-community/releases/download/$(GEOSITE_VER)/ URL_FILE:=dlc.dat FILE:=$(GEOSITE_FILE) - HASH:=08eaf7b6e93ff4422eac2919673ec53f5840643ab318e891981e0f3bd51100f9 + HASH:=b35fcc137b86b4db2ef23919a05c7f90267dc4783186b4e416ff10213cc62ff5 endef GEOSITE_IRAN_VER:=202508180044 diff --git a/v2rayn/.github/workflows/build-linux.yml b/v2rayn/.github/workflows/build-linux.yml index f793a1cbe8..0fb8574fe0 100644 --- a/v2rayn/.github/workflows/build-linux.yml +++ b/v2rayn/.github/workflows/build-linux.yml @@ -98,4 +98,38 @@ jobs: file: ${{ github.workspace }}/v2rayN*.zip tag: ${{ github.event.inputs.release_tag }} file_glob: true - prerelease: true \ No newline at end of file + prerelease: true + + # release RHEL package + - name: Package RPM (RHEL-family) + if: github.event.inputs.release_tag != '' + run: | + chmod 755 package-rhel.sh + # Build for both x86_64 and aarch64 in one go (explicit version passed; no --buildfrom) + ./package-rhel.sh "${{ github.event.inputs.release_tag }}" --arch all + + - name: Collect RPMs into workspace + if: github.event.inputs.release_tag != '' + run: | + mkdir -p "${{ github.workspace }}/dist/rpm" + rsync -av "$HOME/rpmbuild/RPMS/" "${{ github.workspace }}/dist/rpm/" + # Rename to requested filenames + find "${{ github.workspace }}/dist/rpm" -name "v2rayN-*-1.x86_64.rpm" -exec mv {} "${{ github.workspace }}/dist/rpm/v2rayN-linux-rhel-x64.rpm" \; || true + find "${{ github.workspace }}/dist/rpm" -name "v2rayN-*-1.aarch64.rpm" -exec mv {} "${{ github.workspace }}/dist/rpm/v2rayN-linux-rhel-arm64.rpm" \; || true + + - name: Upload RPM artifacts + if: github.event.inputs.release_tag != '' + uses: actions/upload-artifact@v4.6.2 + with: + name: v2rayN-rpm + path: | + ${{ github.workspace }}/dist/rpm/**/*.rpm + + - name: Upload RPMs to release + uses: svenstaro/upload-release-action@v2 + if: github.event.inputs.release_tag != '' + with: + file: ${{ github.workspace }}/dist/rpm/**/*.rpm + tag: ${{ github.event.inputs.release_tag }} + file_glob: true + prerelease: true diff --git a/v2rayn/package-rhel.sh b/v2rayn/package-rhel.sh index e852d17487..0eeee8c781 100644 --- a/v2rayn/package-rhel.sh +++ b/v2rayn/package-rhel.sh @@ -332,6 +332,7 @@ download_xray() { # Download Xray core and install to outdir/xray local outdir="$1" ver="${XRAY_VER:-}" url tmp zipname="xray.zip" mkdir -p "$outdir" + if [[ -n "${XRAY_VER:-}" ]]; then ver="${XRAY_VER}"; fi if [[ -z "$ver" ]]; then ver="$(curl -fsSL https://api.github.com/repos/XTLS/Xray-core/releases/latest \ | grep -Eo '"tag_name":\s*"v[^"]+"' | sed -E 's/.*"v([^"]+)".*/\1/' | head -n1)" || true @@ -353,6 +354,7 @@ download_singbox() { # Download sing-box core and install to outdir/sing-box local outdir="$1" ver="${SING_VER:-}" url tmp tarname="singbox.tar.gz" bin mkdir -p "$outdir" + if [[ -n "${SING_VER:-}" ]]; then ver="${SING_VER}"; fi if [[ -z "$ver" ]]; then ver="$(curl -fsSL https://api.github.com/repos/SagerNet/sing-box/releases/latest \ | grep -Eo '"tag_name":\s*"v[^"]+"' | sed -E 's/.*"v([^"]+)".*/\1/' | head -n1)" || true @@ -372,6 +374,22 @@ download_singbox() { install -Dm755 "$bin" "$outdir/sing-box" } +# ---- NEW: download_mihomo (REQUIRED in --netcore mode) ---- +download_mihomo() { + # Download mihomo into outroot/bin/mihomo/mihomo + local outroot="$1" + local url="" + if [[ "$RID_DIR" == "linux-arm64" ]]; then + url="https://raw.githubusercontent.com/2dust/v2rayN-core-bin/refs/heads/master/v2rayN-linux-arm64/bin/mihomo/mihomo" + else + url="https://raw.githubusercontent.com/2dust/v2rayN-core-bin/refs/heads/master/v2rayN-linux-64/bin/mihomo/mihomo" + fi + echo "[+] Download mihomo: $url" + mkdir -p "$outroot/bin/mihomo" + curl -fL "$url" -o "$outroot/bin/mihomo/mihomo" + chmod +x "$outroot/bin/mihomo/mihomo" || true +} + # Move geo files to a unified path: outroot/bin/xray/ unify_geo_layout() { local outroot="$1" @@ -451,7 +469,8 @@ download_v2rayn_bundle() { fi rm -f "$outroot/v2rayn.zip" 2>/dev/null || true - find "$outroot" -type d -name "mihomo" -prune -exec rm -rf {} + 2>/dev/null || true + # keep mihomo + # find "$outroot" -type d -name "mihomo" -prune -exec rm -rf {} + 2>/dev/null || true local nested_dir nested_dir="$(find "$outroot" -maxdepth 1 -type d -name 'v2rayN-linux-*' | head -n1 || true)" @@ -561,6 +580,8 @@ build_for_arch() { download_singbox "$WORKDIR/$PKGROOT/bin/sing_box" || echo "[!] sing-box download failed (skipped)" fi download_geo_assets "$WORKDIR/$PKGROOT" || echo "[!] Geo rules download failed (skipped)" + # ---- REQUIRED: always fetch mihomo in netcore mode, per-arch ---- + download_mihomo "$WORKDIR/$PKGROOT" || echo "[!] mihomo download failed (skipped)" fi # Tarball @@ -583,6 +604,7 @@ Release: 1%{?dist} Summary: v2rayN (Avalonia) GUI client for Linux (x86_64/aarch64) License: GPL-3.0-only URL: https://github.com/2dust/v2rayN +BugURL: https://github.com/2dust/v2rayN/issues ExclusiveArch: aarch64 x86_64 Source0: __PKGROOT__.tar.gz @@ -591,10 +613,11 @@ Requires: libX11, libXrandr, libXcursor, libXi, libXext, libxcb, libXrende Requires: fontconfig, freetype, cairo, pango, mesa-libEGL, mesa-libGL %description -v2rayN GUI client built with Avalonia. -Installs self-contained publish under /opt/v2rayN and a launcher 'v2rayn'. -Cores (if bundled): /opt/v2rayN/bin/xray, /opt/v2rayN/bin/sing_box. -Geo files for Xray are placed at /opt/v2rayN/bin/xray; launcher will symlink them into user's XDG data dir on first run. +v2rayN Linux for Red Hat Enterprise Linux +Support vless / vmess / Trojan / http / socks / Anytls / Hysteria2 / Shadowsocks / tuic / WireGuard +Support Red Hat Enterprise Linux / Fedora Linux / Rocky Linux / AlmaLinux / CentOS +For more information, Please visit our website +https://github.com/2dust/v2rayN %prep %setup -q -n __PKGROOT__ @@ -645,7 +668,7 @@ cat > %{buildroot}%{_datadir}/applications/v2rayn.desktop << 'EOF' [Desktop Entry] Type=Application Name=v2rayN -Comment=GUI client for Xray / sing-box +Comment=v2rayN for Red Hat Enterprise Linux Exec=v2rayn Icon=v2rayn Terminal=false diff --git a/v2rayn/v2rayN/v2rayN.Desktop/Assets/GlobalResources.axaml b/v2rayn/v2rayN/v2rayN.Desktop/Assets/GlobalResources.axaml index cdfff10883..f58db043f0 100644 --- a/v2rayn/v2rayN/v2rayN.Desktop/Assets/GlobalResources.axaml +++ b/v2rayn/v2rayN/v2rayN.Desktop/Assets/GlobalResources.axaml @@ -10,6 +10,7 @@ 32 32 + 1000 2 4,0 diff --git a/xray-core/go.mod b/xray-core/go.mod index 701196ac11..e983e336a4 100644 --- a/xray-core/go.mod +++ b/xray-core/go.mod @@ -27,7 +27,7 @@ require ( golang.org/x/sys v0.35.0 golang.zx2c4.com/wireguard v0.0.0-20231211153847-12269c276173 google.golang.org/grpc v1.75.0 - google.golang.org/protobuf v1.36.7 + google.golang.org/protobuf v1.36.8 gvisor.dev/gvisor v0.0.0-20250428193742-2d800c3129d5 h12.io/socks v1.0.3 lukechampine.com/blake3 v1.4.1 diff --git a/xray-core/go.sum b/xray-core/go.sum index d0e015fcd8..1b4675278c 100644 --- a/xray-core/go.sum +++ b/xray-core/go.sum @@ -145,8 +145,8 @@ google.golang.org/genproto/googleapis/rpc v0.0.0-20250707201910-8d1bb00bc6a7 h1: google.golang.org/genproto/googleapis/rpc v0.0.0-20250707201910-8d1bb00bc6a7/go.mod h1:qQ0YXyHHx3XkvlzUtpXDkS29lDSafHMZBAZDc03LQ3A= google.golang.org/grpc v1.75.0 h1:+TW+dqTd2Biwe6KKfhE5JpiYIBWq865PhKGSXiivqt4= google.golang.org/grpc v1.75.0/go.mod h1:JtPAzKiq4v1xcAB2hydNlWI2RnF85XXcV0mhKXr2ecQ= -google.golang.org/protobuf v1.36.7 h1:IgrO7UwFQGJdRNXH/sQux4R1Dj1WAKcLElzeeRaXV2A= -google.golang.org/protobuf v1.36.7/go.mod h1:jduwjTPXsFjZGTmRluh+L6NjiWu7pchiJ2/5YcXBHnY= +google.golang.org/protobuf v1.36.8 h1:xHScyCOEuuwZEc6UtSOvPbAT4zRh0xcNRYekJwfqyMc= +google.golang.org/protobuf v1.36.8/go.mod h1:fuxRtAxBytpl4zzqUh6/eyUujkJdNiuEkXntxiD/uRU= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= diff --git a/yt-dlp/yt_dlp/extractor/youtube/_base.py b/yt-dlp/yt_dlp/extractor/youtube/_base.py index 64980650ec..5ccafff57a 100644 --- a/yt-dlp/yt_dlp/extractor/youtube/_base.py +++ b/yt-dlp/yt_dlp/extractor/youtube/_base.py @@ -306,7 +306,8 @@ INNERTUBE_CLIENTS = { 'client': { 'clientName': 'TVHTML5', 'clientVersion': '7.20250312.16.00', - 'userAgent': 'Mozilla/5.0 (ChromiumStylePlatform) Cobalt/Version', + # See: https://github.com/youtube/cobalt/blob/main/cobalt/browser/user_agent/user_agent_platform_info.cc#L506 + 'userAgent': 'Mozilla/5.0 (ChromiumStylePlatform) Cobalt/25.lts.30.1034943-gold (unlike Gecko), Unknown_TV_Unknown_0/Unknown (Unknown, Unknown)', }, }, 'INNERTUBE_CONTEXT_CLIENT_NAME': 7,