From aba22722a65d31c4c17ef5d9619e75a9ca474ce7 Mon Sep 17 00:00:00 2001 From: LjhAUMEM Date: Fri, 29 May 2026 19:48:22 +0800 Subject: [PATCH] Finalmask: Add mkcp-legacy (UDP) to replace mkcp-* and legacy header-* (#6201) https://github.com/XTLS/Xray-core/pull/6193#issuecomment-4543737699 https://github.com/XTLS/Xray-core/pull/6201#issuecomment-4574213827 Example: https://github.com/XTLS/Xray-core/pull/6201#issue-4525483699 --- infra/conf/transport_internet.go | 116 +++++---------- .../finalmask/header/custom/config.go | 2 - .../internet/finalmask/header/custom/udp.go | 119 ++++++++++----- .../header/custom/udp_runtime_test.go | 139 +----------------- .../finalmask/header/dns/config.pb.go | 123 ---------------- .../finalmask/header/dns/config.proto | 11 -- .../internet/finalmask/header/dtls/config.go | 19 --- .../finalmask/header/dtls/config.pb.go | 114 -------------- .../finalmask/header/dtls/config.proto | 9 -- .../internet/finalmask/header/dtls/conn.go | 74 ---------- .../internet/finalmask/header/srtp/config.go | 19 --- .../finalmask/header/srtp/config.pb.go | 114 -------------- .../finalmask/header/srtp/config.proto | 9 -- .../internet/finalmask/header/srtp/conn.go | 58 -------- .../internet/finalmask/header/utp/config.go | 19 --- .../finalmask/header/utp/config.pb.go | 114 -------------- .../finalmask/header/utp/config.proto | 9 -- .../internet/finalmask/header/utp/conn.go | 60 -------- .../finalmask/header/wechat/config.go | 19 --- .../finalmask/header/wechat/config.pb.go | 114 -------------- .../finalmask/header/wechat/config.proto | 9 -- .../internet/finalmask/header/wechat/conn.go | 64 -------- .../finalmask/header/wireguard/config.go | 19 --- .../finalmask/header/wireguard/config.pb.go | 114 -------------- .../finalmask/header/wireguard/config.proto | 9 -- .../finalmask/header/wireguard/conn.go | 50 ------- .../{header/dns => mkcp/header}/config.go | 10 +- .../finalmask/mkcp/header/config.pb.go | 132 +++++++++++++++++ .../finalmask/mkcp/header/config.proto | 12 ++ .../internet/finalmask/mkcp/header/conn.go | 57 +++++++ .../internet/finalmask/mkcp/header/header.go | 17 +++ .../dns/conn.go => mkcp/header/header_dns.go} | 100 +++++-------- .../finalmask/mkcp/header/header_dtls.go | 32 ++++ .../finalmask/mkcp/header/header_srtp.go | 18 +++ .../finalmask/mkcp/header/header_utp.go | 19 +++ .../finalmask/mkcp/header/header_wechat.go | 25 ++++ .../finalmask/mkcp/header/header_wireguard.go | 14 ++ transport/internet/finalmask/udp_test.go | 21 +-- 38 files changed, 499 insertions(+), 1484 deletions(-) delete mode 100644 transport/internet/finalmask/header/dns/config.pb.go delete mode 100644 transport/internet/finalmask/header/dns/config.proto delete mode 100644 transport/internet/finalmask/header/dtls/config.go delete mode 100644 transport/internet/finalmask/header/dtls/config.pb.go delete mode 100644 transport/internet/finalmask/header/dtls/config.proto delete mode 100644 transport/internet/finalmask/header/dtls/conn.go delete mode 100644 transport/internet/finalmask/header/srtp/config.go delete mode 100644 transport/internet/finalmask/header/srtp/config.pb.go delete mode 100644 transport/internet/finalmask/header/srtp/config.proto delete mode 100644 transport/internet/finalmask/header/srtp/conn.go delete mode 100644 transport/internet/finalmask/header/utp/config.go delete mode 100644 transport/internet/finalmask/header/utp/config.pb.go delete mode 100644 transport/internet/finalmask/header/utp/config.proto delete mode 100644 transport/internet/finalmask/header/utp/conn.go delete mode 100644 transport/internet/finalmask/header/wechat/config.go delete mode 100644 transport/internet/finalmask/header/wechat/config.pb.go delete mode 100644 transport/internet/finalmask/header/wechat/config.proto delete mode 100644 transport/internet/finalmask/header/wechat/conn.go delete mode 100644 transport/internet/finalmask/header/wireguard/config.go delete mode 100644 transport/internet/finalmask/header/wireguard/config.pb.go delete mode 100644 transport/internet/finalmask/header/wireguard/config.proto delete mode 100644 transport/internet/finalmask/header/wireguard/conn.go rename transport/internet/finalmask/{header/dns => mkcp/header}/config.go (80%) create mode 100644 transport/internet/finalmask/mkcp/header/config.pb.go create mode 100644 transport/internet/finalmask/mkcp/header/config.proto create mode 100644 transport/internet/finalmask/mkcp/header/conn.go create mode 100644 transport/internet/finalmask/mkcp/header/header.go rename transport/internet/finalmask/{header/dns/conn.go => mkcp/header/header_dns.go} (75%) create mode 100644 transport/internet/finalmask/mkcp/header/header_dtls.go create mode 100644 transport/internet/finalmask/mkcp/header/header_srtp.go create mode 100644 transport/internet/finalmask/mkcp/header/header_utp.go create mode 100644 transport/internet/finalmask/mkcp/header/header_wechat.go create mode 100644 transport/internet/finalmask/mkcp/header/header_wireguard.go diff --git a/infra/conf/transport_internet.go b/infra/conf/transport_internet.go index 7ef91e52..25fe978a 100644 --- a/infra/conf/transport_internet.go +++ b/infra/conf/transport_internet.go @@ -24,13 +24,8 @@ import ( "github.com/xtls/xray-core/transport/internet" "github.com/xtls/xray-core/transport/internet/finalmask/fragment" "github.com/xtls/xray-core/transport/internet/finalmask/header/custom" - "github.com/xtls/xray-core/transport/internet/finalmask/header/dns" - "github.com/xtls/xray-core/transport/internet/finalmask/header/dtls" - "github.com/xtls/xray-core/transport/internet/finalmask/header/srtp" - "github.com/xtls/xray-core/transport/internet/finalmask/header/utp" - "github.com/xtls/xray-core/transport/internet/finalmask/header/wechat" - "github.com/xtls/xray-core/transport/internet/finalmask/header/wireguard" "github.com/xtls/xray-core/transport/internet/finalmask/mkcp/aes128gcm" + "github.com/xtls/xray-core/transport/internet/finalmask/mkcp/header" "github.com/xtls/xray-core/transport/internet/finalmask/mkcp/original" "github.com/xtls/xray-core/transport/internet/finalmask/noise" "github.com/xtls/xray-core/transport/internet/finalmask/realm" @@ -1243,21 +1238,14 @@ var ( }, "type", "settings") udpmaskLoader = NewJSONConfigLoader(ConfigCreatorCache{ - "header-custom": func() interface{} { return new(HeaderCustomUDP) }, - "header-dns": func() interface{} { return new(Dns) }, - "header-dtls": func() interface{} { return new(Dtls) }, - "header-srtp": func() interface{} { return new(Srtp) }, - "header-utp": func() interface{} { return new(Utp) }, - "header-wechat": func() interface{} { return new(Wechat) }, - "header-wireguard": func() interface{} { return new(Wireguard) }, - "mkcp-original": func() interface{} { return new(Original) }, - "mkcp-aes128gcm": func() interface{} { return new(Aes128Gcm) }, - "noise": func() interface{} { return new(NoiseMask) }, - "salamander": func() interface{} { return new(Salamander) }, - "sudoku": func() interface{} { return new(Sudoku) }, - "xdns": func() interface{} { return new(Xdns) }, - "xicmp": func() interface{} { return new(Xicmp) }, - "realm": func() interface{} { return new(Realm) }, + "header-custom": func() interface{} { return new(HeaderCustomUDP) }, + "mkcp-legacy": func() interface{} { return new(MkcpLegacy) }, + "noise": func() interface{} { return new(NoiseMask) }, + "salamander": func() interface{} { return new(Salamander) }, + "sudoku": func() interface{} { return new(Sudoku) }, + "xdns": func() interface{} { return new(Xdns) }, + "xicmp": func() interface{} { return new(Xicmp) }, + "realm": func() interface{} { return new(Realm) }, }, "type", "settings") ) @@ -1750,65 +1738,39 @@ func (c *HeaderCustomUDP) Build() (proto.Message, error) { } } -type Dns struct { - Domain string `json:"domain"` +type MkcpLegacy struct { + Header string `json:"header"` + Value string `json:"value"` } -func (c *Dns) Build() (proto.Message, error) { - config := &dns.Config{} - config.Domain = "www.baidu.com" - - if len(c.Domain) > 0 { - config.Domain = c.Domain +func (c *MkcpLegacy) Build() (proto.Message, error) { + if len(c.Header) == 0 { + if len(c.Value) == 0 { + return &original.Config{}, nil + } else { + return &aes128gcm.Config{Password: c.Value}, nil + } + } + switch strings.ToLower(c.Header) { + case "dns": + domain := c.Value + if len(domain) == 0 { + domain = "www.baidu.com" + } + return &header.Config{ID: 0, Domain: domain}, nil + case "dtls": + return &header.Config{ID: 1}, nil + case "srtp": + return &header.Config{ID: 2}, nil + case "utp": + return &header.Config{ID: 3}, nil + case "wechat": + return &header.Config{ID: 4}, nil + case "wireguard": + return &header.Config{ID: 5}, nil + default: + return nil, errors.New("invalid header ", c.Header) } - - return config, nil -} - -type Dtls struct{} - -func (c *Dtls) Build() (proto.Message, error) { - return &dtls.Config{}, nil -} - -type Srtp struct{} - -func (c *Srtp) Build() (proto.Message, error) { - return &srtp.Config{}, nil -} - -type Utp struct{} - -func (c *Utp) Build() (proto.Message, error) { - return &utp.Config{}, nil -} - -type Wechat struct{} - -func (c *Wechat) Build() (proto.Message, error) { - return &wechat.Config{}, nil -} - -type Wireguard struct{} - -func (c *Wireguard) Build() (proto.Message, error) { - return &wireguard.Config{}, nil -} - -type Original struct{} - -func (c *Original) Build() (proto.Message, error) { - return &original.Config{}, nil -} - -type Aes128Gcm struct { - Password string `json:"password"` -} - -func (c *Aes128Gcm) Build() (proto.Message, error) { - return &aes128gcm.Config{ - Password: c.Password, - }, nil } type Salamander struct { diff --git a/transport/internet/finalmask/header/custom/config.go b/transport/internet/finalmask/header/custom/config.go index 23460111..c054718b 100644 --- a/transport/internet/finalmask/header/custom/config.go +++ b/transport/internet/finalmask/header/custom/config.go @@ -16,8 +16,6 @@ func (c *TCPConfig) WrapConnServer(raw net.Conn) (net.Conn, error) { func (c *UDPConfig) UDP() {} -func (c *UDPConfig) HeaderConn() {} - func (c *UDPConfig) WrapPacketConnClient(raw net.PacketConn, level int, levelCount int) (net.PacketConn, error) { return NewConnClientUDP(c, raw) } diff --git a/transport/internet/finalmask/header/custom/udp.go b/transport/internet/finalmask/header/custom/udp.go index dba73798..e3e78f5a 100644 --- a/transport/internet/finalmask/header/custom/udp.go +++ b/transport/internet/finalmask/header/custom/udp.go @@ -2,11 +2,14 @@ package custom import ( "bytes" + "context" "net" "sync" "time" + "github.com/xtls/xray-core/common/buf" "github.com/xtls/xray-core/common/errors" + "github.com/xtls/xray-core/transport/internet/finalmask" ) const udpStandaloneBufferSize = 4096 @@ -29,16 +32,16 @@ func (h *udpCustomClient) Serialize(b []byte) { copy(b, evaluated) } -func (h *udpCustomClient) Match(b []byte) bool { +func (h *udpCustomClient) Match(b []byte, addr net.Addr) bool { var initial map[string][]byte if h.state != nil { - initial, _ = h.state.get(udpStateKey(nil)) + initial, _ = h.state.get(udpStateKey(addr)) } vars, ok := matchUDPItems(h.server, b, h.read, initial) if ok { h.vars = vars if h.state != nil { - h.state.set(udpStateKey(nil), vars) + h.state.set(udpStateKey(addr), vars) } } return ok @@ -73,24 +76,38 @@ func NewConnClientUDP(c *UDPConfig, raw net.PacketConn) (net.PacketConn, error) return conn, nil } -func (c *udpCustomClientConn) Size() int { - return len(c.header.merged) -} - func (c *udpCustomClientConn) ReadFrom(p []byte) (n int, addr net.Addr, err error) { - if !c.header.Match(p) { - return 0, addr, errors.New("header mismatch") + b := p + if len(b) < finalmask.UDPSize { + buf := buf.New() + buf.Resize(0, finalmask.UDPSize) + b = buf.Bytes() + defer buf.Release() } - return len(p) - c.header.read, addr, nil + for { + n, addr, err := c.PacketConn.ReadFrom(b) + if err != nil { + return n, addr, err + } + + if !c.header.Match(b[:n], addr) { + errors.LogError(context.Background(), "[mask] drop packet from ", addr, " with size ", n, " > header mismatch") + continue + } + + copy(p, b[c.header.read:n]) + return n - c.header.read, addr, nil + } } func (c *udpCustomClientConn) WriteTo(p []byte, addr net.Addr) (n int, err error) { - var localAddr net.Addr - if c.PacketConn != nil { - localAddr = c.PacketConn.LocalAddr() - } - ctx := newEvalContextWithAddrs(localAddr, addr) + buf := buf.New() + buf.Resize(0, finalmask.UDPSize) + b := buf.Bytes() + defer buf.Release() + + ctx := newEvalContextWithAddrs(c.PacketConn.LocalAddr(), addr) if vars, ok := c.header.state.get(udpStateKey(addr)); ok { ctx.vars = cloneVars(vars) } else if len(c.header.vars) > 0 { @@ -98,13 +115,21 @@ func (c *udpCustomClientConn) WriteTo(p []byte, addr net.Addr) (n int, err error } evaluated, err := evaluateUDPItemsWithContext(c.header.client, ctx) if err != nil { - return 0, err + errors.LogErrorInner(context.Background(), err, "[mask] drop packet to ", addr, " with size ", len(p)) + return 0, nil } if len(evaluated) != len(c.header.merged) { - return 0, errors.New("header size mismatch") + errors.LogError(context.Background(), "[mask] drop packet to ", addr, " with size ", len(p), " > header size mismatch") + return 0, nil } c.header.state.set(udpStateKey(addr), ctx.vars) - copy(p, evaluated) + copy(b, evaluated) + copy(b[len(evaluated):], p) + _, err = c.PacketConn.WriteTo(b[:len(evaluated)+len(p)], addr) + if err != nil { + errors.LogErrorInner(context.Background(), err, "[mask] drop packet to ", addr, " with size ", len(p)) + return 0, err + } return len(p), nil } @@ -127,16 +152,16 @@ func (h *udpCustomServer) Serialize(b []byte) { copy(b, evaluated) } -func (h *udpCustomServer) Match(b []byte) bool { +func (h *udpCustomServer) Match(b []byte, addr net.Addr) bool { var initial map[string][]byte if h.state != nil { - initial, _ = h.state.get(udpStateKey(nil)) + initial, _ = h.state.get(udpStateKey(addr)) } vars, ok := matchUDPItems(h.client, b, h.read, initial) if ok { h.vars = vars if h.state != nil { - h.state.set(udpStateKey(nil), vars) + h.state.set(udpStateKey(addr), vars) } } return ok @@ -171,24 +196,38 @@ func NewConnServerUDP(c *UDPConfig, raw net.PacketConn) (net.PacketConn, error) return conn, nil } -func (c *udpCustomServerConn) Size() int { - return len(c.header.merged) -} - func (c *udpCustomServerConn) ReadFrom(p []byte) (n int, addr net.Addr, err error) { - if !c.header.Match(p) { - return 0, addr, errors.New("header mismatch") + b := p + if len(b) < finalmask.UDPSize { + buf := buf.New() + buf.Resize(0, finalmask.UDPSize) + b = buf.Bytes() + defer buf.Release() } - return len(p) - c.header.read, addr, nil + for { + n, addr, err := c.PacketConn.ReadFrom(b) + if err != nil { + return n, addr, err + } + + if !c.header.Match(b[:n], addr) { + errors.LogError(context.Background(), "[mask] drop packet from ", addr, " with size ", n, " > header mismatch") + continue + } + + copy(p, b[c.header.read:n]) + return n - c.header.read, addr, nil + } } func (c *udpCustomServerConn) WriteTo(p []byte, addr net.Addr) (n int, err error) { - var localAddr net.Addr - if c.PacketConn != nil { - localAddr = c.PacketConn.LocalAddr() - } - ctx := newEvalContextWithAddrs(localAddr, addr) + buf := buf.New() + buf.Resize(0, finalmask.UDPSize) + b := buf.Bytes() + defer buf.Release() + + ctx := newEvalContextWithAddrs(c.PacketConn.LocalAddr(), addr) if vars, ok := c.header.state.get(udpStateKey(addr)); ok { ctx.vars = cloneVars(vars) } else if len(c.header.vars) > 0 { @@ -196,13 +235,21 @@ func (c *udpCustomServerConn) WriteTo(p []byte, addr net.Addr) (n int, err error } evaluated, err := evaluateUDPItemsWithContext(c.header.server, ctx) if err != nil { - return 0, err + errors.LogErrorInner(context.Background(), err, "[mask] drop packet to ", addr, " with size ", len(p)) + return 0, nil } if len(evaluated) != len(c.header.merged) { - return 0, errors.New("header size mismatch") + errors.LogError(context.Background(), "[mask] drop packet to ", addr, " with size ", len(p), " > header size mismatch") + return 0, nil } c.header.state.set(udpStateKey(addr), ctx.vars) - copy(p, evaluated) + copy(b, evaluated) + copy(b[len(evaluated):], p) + _, err = c.PacketConn.WriteTo(b[:len(evaluated)+len(p)], addr) + if err != nil { + errors.LogErrorInner(context.Background(), err, "[mask] drop packet to ", addr, " with size ", len(p)) + return 0, err + } return len(p), nil } diff --git a/transport/internet/finalmask/header/custom/udp_runtime_test.go b/transport/internet/finalmask/header/custom/udp_runtime_test.go index e0a091f4..3b726f07 100644 --- a/transport/internet/finalmask/header/custom/udp_runtime_test.go +++ b/transport/internet/finalmask/header/custom/udp_runtime_test.go @@ -1,43 +1,9 @@ package custom import ( - "bytes" - "net" "testing" ) -func TestDSLUDPClientSizeTracksEvaluatedItems(t *testing.T) { - conn, err := NewConnClientUDP(&UDPConfig{ - Client: []*UDPItem{ - { - Rand: 2, - RandMin: 0x2A, - RandMax: 0x2A, - Save: "txid", - }, - { - Var: "txid", - }, - { - Expr: &Expr{ - Op: "concat", - Args: []*ExprArg{ - {Value: &ExprArg_Bytes{Bytes: []byte{0xAB}}}, - {Value: &ExprArg_Bytes{Bytes: []byte{0xCD}}}, - }, - }, - }, - }, - }, nil) - if err != nil { - t.Fatal(err) - } - - if got := conn.(*udpCustomClientConn).Size(); got != 6 { - t.Fatalf("unexpected header size: got=%d want=6", got) - } -} - func TestDSLUDPServerMatchCapturesSavedValues(t *testing.T) { conn, err := NewConnServerUDP(&UDPConfig{ Client: []*UDPItem{ @@ -55,7 +21,7 @@ func TestDSLUDPServerMatchCapturesSavedValues(t *testing.T) { } server := conn.(*udpCustomServerConn) - if !server.header.Match([]byte{0x01, 0x02, 0x01, 0x02}) { + if !server.header.Match([]byte{0x01, 0x02, 0x01, 0x02}, nil) { t.Fatal("expected packet to match") } @@ -81,108 +47,7 @@ func TestDSLUDPServerRejectsMalformedVarReference(t *testing.T) { } server := conn.(*udpCustomServerConn) - if server.header.Match([]byte{0x01, 0x02, 0x03, 0x04}) { + if server.header.Match([]byte{0x01, 0x02, 0x03, 0x04}, nil) { t.Fatal("expected packet mismatch") } } - -func TestDSLUDPClientWriteSupportsExtendedExprOps(t *testing.T) { - conn, err := NewConnClientUDP(&UDPConfig{ - Client: []*UDPItem{ - { - Expr: &Expr{ - Op: "le16", - Args: []*ExprArg{ - { - Value: &ExprArg_Expr{ - Expr: &Expr{ - Op: "add", - Args: []*ExprArg{ - {Value: &ExprArg_U64{U64: 1}}, - {Value: &ExprArg_U64{U64: 2}}, - }, - }, - }, - }, - }, - }, - }, - { - Expr: &Expr{ - Op: "pad", - Args: []*ExprArg{ - {Value: &ExprArg_Bytes{Bytes: []byte{0xAA}}}, - {Value: &ExprArg_U64{U64: 3}}, - {Value: &ExprArg_Bytes{Bytes: []byte{0xBB}}}, - }, - }, - }, - { - Expr: &Expr{ - Op: "truncate", - Args: []*ExprArg{ - {Value: &ExprArg_Bytes{Bytes: []byte{1, 2, 3, 4}}}, - {Value: &ExprArg_U64{U64: 2}}, - }, - }, - }, - { - Expr: &Expr{ - Op: "be16", - Args: []*ExprArg{ - { - Value: &ExprArg_Expr{ - Expr: &Expr{ - Op: "or", - Args: []*ExprArg{ - { - Value: &ExprArg_Expr{ - Expr: &Expr{ - Op: "shl", - Args: []*ExprArg{ - {Value: &ExprArg_U64{U64: 1}}, - {Value: &ExprArg_U64{U64: 8}}, - }, - }, - }, - }, - { - Value: &ExprArg_Expr{ - Expr: &Expr{ - Op: "shr", - Args: []*ExprArg{ - {Value: &ExprArg_U64{U64: 0x80}}, - {Value: &ExprArg_U64{U64: 7}}, - }, - }, - }, - }, - }, - }, - }, - }, - }, - }, - }, - }, - }, nil) - if err != nil { - t.Fatal(err) - } - - client := conn.(*udpCustomClientConn) - buf := make([]byte, client.Size()) - if _, err := client.WriteTo(buf, &net.UDPAddr{IP: net.IPv4(127, 0, 0, 1), Port: 53}); err != nil { - t.Fatal(err) - } - - want := []byte{ - 0x03, 0x00, - 0xAA, 0xBB, 0xBB, - 0x01, 0x02, - 0x01, 0x01, - } - if !bytes.Equal(buf, want) { - t.Fatalf("unexpected encoded header: %x", buf) - } -} diff --git a/transport/internet/finalmask/header/dns/config.pb.go b/transport/internet/finalmask/header/dns/config.pb.go deleted file mode 100644 index 156cfa63..00000000 --- a/transport/internet/finalmask/header/dns/config.pb.go +++ /dev/null @@ -1,123 +0,0 @@ -// Code generated by protoc-gen-go. DO NOT EDIT. -// versions: -// protoc-gen-go v1.36.11 -// protoc v6.33.5 -// source: transport/internet/finalmask/header/dns/config.proto - -package dns - -import ( - protoreflect "google.golang.org/protobuf/reflect/protoreflect" - protoimpl "google.golang.org/protobuf/runtime/protoimpl" - reflect "reflect" - sync "sync" - unsafe "unsafe" -) - -const ( - // Verify that this generated code is sufficiently up-to-date. - _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) - // Verify that runtime/protoimpl is sufficiently up-to-date. - _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) -) - -type Config struct { - state protoimpl.MessageState `protogen:"open.v1"` - Domain string `protobuf:"bytes,1,opt,name=domain,proto3" json:"domain,omitempty"` - unknownFields protoimpl.UnknownFields - sizeCache protoimpl.SizeCache -} - -func (x *Config) Reset() { - *x = Config{} - mi := &file_transport_internet_finalmask_header_dns_config_proto_msgTypes[0] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) -} - -func (x *Config) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*Config) ProtoMessage() {} - -func (x *Config) ProtoReflect() protoreflect.Message { - mi := &file_transport_internet_finalmask_header_dns_config_proto_msgTypes[0] - if x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use Config.ProtoReflect.Descriptor instead. -func (*Config) Descriptor() ([]byte, []int) { - return file_transport_internet_finalmask_header_dns_config_proto_rawDescGZIP(), []int{0} -} - -func (x *Config) GetDomain() string { - if x != nil { - return x.Domain - } - return "" -} - -var File_transport_internet_finalmask_header_dns_config_proto protoreflect.FileDescriptor - -const file_transport_internet_finalmask_header_dns_config_proto_rawDesc = "" + - "\n" + - "4transport/internet/finalmask/header/dns/config.proto\x12,xray.transport.internet.finalmask.header.dns\" \n" + - "\x06Config\x12\x16\n" + - "\x06domain\x18\x01 \x01(\tR\x06domainB\xa6\x01\n" + - "0com.xray.transport.internet.finalmask.header.dnsP\x01ZAgithub.com/xtls/xray-core/transport/internet/finalmask/header/dns\xaa\x02,Xray.Transport.Internet.Finalmask.Header.Dnsb\x06proto3" - -var ( - file_transport_internet_finalmask_header_dns_config_proto_rawDescOnce sync.Once - file_transport_internet_finalmask_header_dns_config_proto_rawDescData []byte -) - -func file_transport_internet_finalmask_header_dns_config_proto_rawDescGZIP() []byte { - file_transport_internet_finalmask_header_dns_config_proto_rawDescOnce.Do(func() { - file_transport_internet_finalmask_header_dns_config_proto_rawDescData = protoimpl.X.CompressGZIP(unsafe.Slice(unsafe.StringData(file_transport_internet_finalmask_header_dns_config_proto_rawDesc), len(file_transport_internet_finalmask_header_dns_config_proto_rawDesc))) - }) - return file_transport_internet_finalmask_header_dns_config_proto_rawDescData -} - -var file_transport_internet_finalmask_header_dns_config_proto_msgTypes = make([]protoimpl.MessageInfo, 1) -var file_transport_internet_finalmask_header_dns_config_proto_goTypes = []any{ - (*Config)(nil), // 0: xray.transport.internet.finalmask.header.dns.Config -} -var file_transport_internet_finalmask_header_dns_config_proto_depIdxs = []int32{ - 0, // [0:0] is the sub-list for method output_type - 0, // [0:0] is the sub-list for method input_type - 0, // [0:0] is the sub-list for extension type_name - 0, // [0:0] is the sub-list for extension extendee - 0, // [0:0] is the sub-list for field type_name -} - -func init() { file_transport_internet_finalmask_header_dns_config_proto_init() } -func file_transport_internet_finalmask_header_dns_config_proto_init() { - if File_transport_internet_finalmask_header_dns_config_proto != nil { - return - } - type x struct{} - out := protoimpl.TypeBuilder{ - File: protoimpl.DescBuilder{ - GoPackagePath: reflect.TypeOf(x{}).PkgPath(), - RawDescriptor: unsafe.Slice(unsafe.StringData(file_transport_internet_finalmask_header_dns_config_proto_rawDesc), len(file_transport_internet_finalmask_header_dns_config_proto_rawDesc)), - NumEnums: 0, - NumMessages: 1, - NumExtensions: 0, - NumServices: 0, - }, - GoTypes: file_transport_internet_finalmask_header_dns_config_proto_goTypes, - DependencyIndexes: file_transport_internet_finalmask_header_dns_config_proto_depIdxs, - MessageInfos: file_transport_internet_finalmask_header_dns_config_proto_msgTypes, - }.Build() - File_transport_internet_finalmask_header_dns_config_proto = out.File - file_transport_internet_finalmask_header_dns_config_proto_goTypes = nil - file_transport_internet_finalmask_header_dns_config_proto_depIdxs = nil -} diff --git a/transport/internet/finalmask/header/dns/config.proto b/transport/internet/finalmask/header/dns/config.proto deleted file mode 100644 index 10e1baca..00000000 --- a/transport/internet/finalmask/header/dns/config.proto +++ /dev/null @@ -1,11 +0,0 @@ -syntax = "proto3"; - -package xray.transport.internet.finalmask.header.dns; -option csharp_namespace = "Xray.Transport.Internet.Finalmask.Header.Dns"; -option go_package = "github.com/xtls/xray-core/transport/internet/finalmask/header/dns"; -option java_package = "com.xray.transport.internet.finalmask.header.dns"; -option java_multiple_files = true; - -message Config { - string domain = 1; -} diff --git a/transport/internet/finalmask/header/dtls/config.go b/transport/internet/finalmask/header/dtls/config.go deleted file mode 100644 index decb69e3..00000000 --- a/transport/internet/finalmask/header/dtls/config.go +++ /dev/null @@ -1,19 +0,0 @@ -package dtls - -import ( - "net" -) - -func (c *Config) UDP() { -} - -func (c *Config) WrapPacketConnClient(raw net.PacketConn, level int, levelCount int) (net.PacketConn, error) { - return NewConnClient(c, raw) -} - -func (c *Config) WrapPacketConnServer(raw net.PacketConn, level int, levelCount int) (net.PacketConn, error) { - return NewConnServer(c, raw) -} - -func (c *Config) HeaderConn() { -} diff --git a/transport/internet/finalmask/header/dtls/config.pb.go b/transport/internet/finalmask/header/dtls/config.pb.go deleted file mode 100644 index ef42f5c4..00000000 --- a/transport/internet/finalmask/header/dtls/config.pb.go +++ /dev/null @@ -1,114 +0,0 @@ -// Code generated by protoc-gen-go. DO NOT EDIT. -// versions: -// protoc-gen-go v1.36.11 -// protoc v6.33.5 -// source: transport/internet/finalmask/header/dtls/config.proto - -package dtls - -import ( - protoreflect "google.golang.org/protobuf/reflect/protoreflect" - protoimpl "google.golang.org/protobuf/runtime/protoimpl" - reflect "reflect" - sync "sync" - unsafe "unsafe" -) - -const ( - // Verify that this generated code is sufficiently up-to-date. - _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) - // Verify that runtime/protoimpl is sufficiently up-to-date. - _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) -) - -type Config struct { - state protoimpl.MessageState `protogen:"open.v1"` - unknownFields protoimpl.UnknownFields - sizeCache protoimpl.SizeCache -} - -func (x *Config) Reset() { - *x = Config{} - mi := &file_transport_internet_finalmask_header_dtls_config_proto_msgTypes[0] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) -} - -func (x *Config) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*Config) ProtoMessage() {} - -func (x *Config) ProtoReflect() protoreflect.Message { - mi := &file_transport_internet_finalmask_header_dtls_config_proto_msgTypes[0] - if x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use Config.ProtoReflect.Descriptor instead. -func (*Config) Descriptor() ([]byte, []int) { - return file_transport_internet_finalmask_header_dtls_config_proto_rawDescGZIP(), []int{0} -} - -var File_transport_internet_finalmask_header_dtls_config_proto protoreflect.FileDescriptor - -const file_transport_internet_finalmask_header_dtls_config_proto_rawDesc = "" + - "\n" + - "5transport/internet/finalmask/header/dtls/config.proto\x12-xray.transport.internet.finalmask.header.dtls\"\b\n" + - "\x06ConfigB\xa9\x01\n" + - "1com.xray.transport.internet.finalmask.header.dtlsP\x01ZBgithub.com/xtls/xray-core/transport/internet/finalmask/header/dtls\xaa\x02-Xray.Transport.Internet.Finalmask.Header.Dtlsb\x06proto3" - -var ( - file_transport_internet_finalmask_header_dtls_config_proto_rawDescOnce sync.Once - file_transport_internet_finalmask_header_dtls_config_proto_rawDescData []byte -) - -func file_transport_internet_finalmask_header_dtls_config_proto_rawDescGZIP() []byte { - file_transport_internet_finalmask_header_dtls_config_proto_rawDescOnce.Do(func() { - file_transport_internet_finalmask_header_dtls_config_proto_rawDescData = protoimpl.X.CompressGZIP(unsafe.Slice(unsafe.StringData(file_transport_internet_finalmask_header_dtls_config_proto_rawDesc), len(file_transport_internet_finalmask_header_dtls_config_proto_rawDesc))) - }) - return file_transport_internet_finalmask_header_dtls_config_proto_rawDescData -} - -var file_transport_internet_finalmask_header_dtls_config_proto_msgTypes = make([]protoimpl.MessageInfo, 1) -var file_transport_internet_finalmask_header_dtls_config_proto_goTypes = []any{ - (*Config)(nil), // 0: xray.transport.internet.finalmask.header.dtls.Config -} -var file_transport_internet_finalmask_header_dtls_config_proto_depIdxs = []int32{ - 0, // [0:0] is the sub-list for method output_type - 0, // [0:0] is the sub-list for method input_type - 0, // [0:0] is the sub-list for extension type_name - 0, // [0:0] is the sub-list for extension extendee - 0, // [0:0] is the sub-list for field type_name -} - -func init() { file_transport_internet_finalmask_header_dtls_config_proto_init() } -func file_transport_internet_finalmask_header_dtls_config_proto_init() { - if File_transport_internet_finalmask_header_dtls_config_proto != nil { - return - } - type x struct{} - out := protoimpl.TypeBuilder{ - File: protoimpl.DescBuilder{ - GoPackagePath: reflect.TypeOf(x{}).PkgPath(), - RawDescriptor: unsafe.Slice(unsafe.StringData(file_transport_internet_finalmask_header_dtls_config_proto_rawDesc), len(file_transport_internet_finalmask_header_dtls_config_proto_rawDesc)), - NumEnums: 0, - NumMessages: 1, - NumExtensions: 0, - NumServices: 0, - }, - GoTypes: file_transport_internet_finalmask_header_dtls_config_proto_goTypes, - DependencyIndexes: file_transport_internet_finalmask_header_dtls_config_proto_depIdxs, - MessageInfos: file_transport_internet_finalmask_header_dtls_config_proto_msgTypes, - }.Build() - File_transport_internet_finalmask_header_dtls_config_proto = out.File - file_transport_internet_finalmask_header_dtls_config_proto_goTypes = nil - file_transport_internet_finalmask_header_dtls_config_proto_depIdxs = nil -} diff --git a/transport/internet/finalmask/header/dtls/config.proto b/transport/internet/finalmask/header/dtls/config.proto deleted file mode 100644 index 7f9f7971..00000000 --- a/transport/internet/finalmask/header/dtls/config.proto +++ /dev/null @@ -1,9 +0,0 @@ -syntax = "proto3"; - -package xray.transport.internet.finalmask.header.dtls; -option csharp_namespace = "Xray.Transport.Internet.Finalmask.Header.Dtls"; -option go_package = "github.com/xtls/xray-core/transport/internet/finalmask/header/dtls"; -option java_package = "com.xray.transport.internet.finalmask.header.dtls"; -option java_multiple_files = true; - -message Config {} diff --git a/transport/internet/finalmask/header/dtls/conn.go b/transport/internet/finalmask/header/dtls/conn.go deleted file mode 100644 index 3f875c2e..00000000 --- a/transport/internet/finalmask/header/dtls/conn.go +++ /dev/null @@ -1,74 +0,0 @@ -package dtls - -import ( - "net" - - "github.com/xtls/xray-core/common/dice" -) - -type dtls struct { - epoch uint16 - length uint16 - sequence uint32 -} - -func (*dtls) Size() int { - return 1 + 2 + 2 + 6 + 2 -} - -func (h *dtls) Serialize(b []byte) { - b[0] = 23 - b[1] = 254 - b[2] = 253 - b[3] = byte(h.epoch >> 8) - b[4] = byte(h.epoch) - b[5] = 0 - b[6] = 0 - b[7] = byte(h.sequence >> 24) - b[8] = byte(h.sequence >> 16) - b[9] = byte(h.sequence >> 8) - b[10] = byte(h.sequence) - h.sequence++ - b[11] = byte(h.length >> 8) - b[12] = byte(h.length) - h.length += 17 - if h.length > 100 { - h.length -= 50 - } -} - -type dtlsConn struct { - net.PacketConn - header *dtls -} - -func NewConnClient(c *Config, raw net.PacketConn) (net.PacketConn, error) { - conn := &dtlsConn{ - PacketConn: raw, - header: &dtls{ - epoch: dice.RollUint16(), - sequence: 0, - length: 17, - }, - } - - return conn, nil -} - -func NewConnServer(c *Config, raw net.PacketConn) (net.PacketConn, error) { - return NewConnClient(c, raw) -} - -func (c *dtlsConn) Size() int { - return c.header.Size() -} - -func (c *dtlsConn) ReadFrom(p []byte) (n int, addr net.Addr, err error) { - return len(p) - c.header.Size(), addr, nil -} - -func (c *dtlsConn) WriteTo(p []byte, addr net.Addr) (n int, err error) { - c.header.Serialize(p) - - return len(p), nil -} diff --git a/transport/internet/finalmask/header/srtp/config.go b/transport/internet/finalmask/header/srtp/config.go deleted file mode 100644 index 006964d9..00000000 --- a/transport/internet/finalmask/header/srtp/config.go +++ /dev/null @@ -1,19 +0,0 @@ -package srtp - -import ( - "net" -) - -func (c *Config) UDP() { -} - -func (c *Config) WrapPacketConnClient(raw net.PacketConn, level int, levelCount int) (net.PacketConn, error) { - return NewConnClient(c, raw) -} - -func (c *Config) WrapPacketConnServer(raw net.PacketConn, level int, levelCount int) (net.PacketConn, error) { - return NewConnServer(c, raw) -} - -func (c *Config) HeaderConn() { -} diff --git a/transport/internet/finalmask/header/srtp/config.pb.go b/transport/internet/finalmask/header/srtp/config.pb.go deleted file mode 100644 index 2d0f3232..00000000 --- a/transport/internet/finalmask/header/srtp/config.pb.go +++ /dev/null @@ -1,114 +0,0 @@ -// Code generated by protoc-gen-go. DO NOT EDIT. -// versions: -// protoc-gen-go v1.36.11 -// protoc v6.33.5 -// source: transport/internet/finalmask/header/srtp/config.proto - -package srtp - -import ( - protoreflect "google.golang.org/protobuf/reflect/protoreflect" - protoimpl "google.golang.org/protobuf/runtime/protoimpl" - reflect "reflect" - sync "sync" - unsafe "unsafe" -) - -const ( - // Verify that this generated code is sufficiently up-to-date. - _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) - // Verify that runtime/protoimpl is sufficiently up-to-date. - _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) -) - -type Config struct { - state protoimpl.MessageState `protogen:"open.v1"` - unknownFields protoimpl.UnknownFields - sizeCache protoimpl.SizeCache -} - -func (x *Config) Reset() { - *x = Config{} - mi := &file_transport_internet_finalmask_header_srtp_config_proto_msgTypes[0] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) -} - -func (x *Config) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*Config) ProtoMessage() {} - -func (x *Config) ProtoReflect() protoreflect.Message { - mi := &file_transport_internet_finalmask_header_srtp_config_proto_msgTypes[0] - if x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use Config.ProtoReflect.Descriptor instead. -func (*Config) Descriptor() ([]byte, []int) { - return file_transport_internet_finalmask_header_srtp_config_proto_rawDescGZIP(), []int{0} -} - -var File_transport_internet_finalmask_header_srtp_config_proto protoreflect.FileDescriptor - -const file_transport_internet_finalmask_header_srtp_config_proto_rawDesc = "" + - "\n" + - "5transport/internet/finalmask/header/srtp/config.proto\x12-xray.transport.internet.finalmask.header.srtp\"\b\n" + - "\x06ConfigB\xa9\x01\n" + - "1com.xray.transport.internet.finalmask.header.srtpP\x01ZBgithub.com/xtls/xray-core/transport/internet/finalmask/header/srtp\xaa\x02-Xray.Transport.Internet.Finalmask.Header.Srtpb\x06proto3" - -var ( - file_transport_internet_finalmask_header_srtp_config_proto_rawDescOnce sync.Once - file_transport_internet_finalmask_header_srtp_config_proto_rawDescData []byte -) - -func file_transport_internet_finalmask_header_srtp_config_proto_rawDescGZIP() []byte { - file_transport_internet_finalmask_header_srtp_config_proto_rawDescOnce.Do(func() { - file_transport_internet_finalmask_header_srtp_config_proto_rawDescData = protoimpl.X.CompressGZIP(unsafe.Slice(unsafe.StringData(file_transport_internet_finalmask_header_srtp_config_proto_rawDesc), len(file_transport_internet_finalmask_header_srtp_config_proto_rawDesc))) - }) - return file_transport_internet_finalmask_header_srtp_config_proto_rawDescData -} - -var file_transport_internet_finalmask_header_srtp_config_proto_msgTypes = make([]protoimpl.MessageInfo, 1) -var file_transport_internet_finalmask_header_srtp_config_proto_goTypes = []any{ - (*Config)(nil), // 0: xray.transport.internet.finalmask.header.srtp.Config -} -var file_transport_internet_finalmask_header_srtp_config_proto_depIdxs = []int32{ - 0, // [0:0] is the sub-list for method output_type - 0, // [0:0] is the sub-list for method input_type - 0, // [0:0] is the sub-list for extension type_name - 0, // [0:0] is the sub-list for extension extendee - 0, // [0:0] is the sub-list for field type_name -} - -func init() { file_transport_internet_finalmask_header_srtp_config_proto_init() } -func file_transport_internet_finalmask_header_srtp_config_proto_init() { - if File_transport_internet_finalmask_header_srtp_config_proto != nil { - return - } - type x struct{} - out := protoimpl.TypeBuilder{ - File: protoimpl.DescBuilder{ - GoPackagePath: reflect.TypeOf(x{}).PkgPath(), - RawDescriptor: unsafe.Slice(unsafe.StringData(file_transport_internet_finalmask_header_srtp_config_proto_rawDesc), len(file_transport_internet_finalmask_header_srtp_config_proto_rawDesc)), - NumEnums: 0, - NumMessages: 1, - NumExtensions: 0, - NumServices: 0, - }, - GoTypes: file_transport_internet_finalmask_header_srtp_config_proto_goTypes, - DependencyIndexes: file_transport_internet_finalmask_header_srtp_config_proto_depIdxs, - MessageInfos: file_transport_internet_finalmask_header_srtp_config_proto_msgTypes, - }.Build() - File_transport_internet_finalmask_header_srtp_config_proto = out.File - file_transport_internet_finalmask_header_srtp_config_proto_goTypes = nil - file_transport_internet_finalmask_header_srtp_config_proto_depIdxs = nil -} diff --git a/transport/internet/finalmask/header/srtp/config.proto b/transport/internet/finalmask/header/srtp/config.proto deleted file mode 100644 index 6792cb91..00000000 --- a/transport/internet/finalmask/header/srtp/config.proto +++ /dev/null @@ -1,9 +0,0 @@ -syntax = "proto3"; - -package xray.transport.internet.finalmask.header.srtp; -option csharp_namespace = "Xray.Transport.Internet.Finalmask.Header.Srtp"; -option go_package = "github.com/xtls/xray-core/transport/internet/finalmask/header/srtp"; -option java_package = "com.xray.transport.internet.finalmask.header.srtp"; -option java_multiple_files = true; - -message Config {} diff --git a/transport/internet/finalmask/header/srtp/conn.go b/transport/internet/finalmask/header/srtp/conn.go deleted file mode 100644 index 94de0f9f..00000000 --- a/transport/internet/finalmask/header/srtp/conn.go +++ /dev/null @@ -1,58 +0,0 @@ -package srtp - -import ( - "encoding/binary" - "net" - - "github.com/xtls/xray-core/common/dice" -) - -type srtp struct { - header uint16 - number uint16 -} - -func (*srtp) Size() int { - return 4 -} - -func (h *srtp) Serialize(b []byte) { - h.number++ - binary.BigEndian.PutUint16(b, h.header) - binary.BigEndian.PutUint16(b[2:], h.number) -} - -type srtpConn struct { - net.PacketConn - header *srtp -} - -func NewConnClient(c *Config, raw net.PacketConn) (net.PacketConn, error) { - conn := &srtpConn{ - PacketConn: raw, - header: &srtp{ - header: 0xB5E8, - number: dice.RollUint16(), - }, - } - - return conn, nil -} - -func NewConnServer(c *Config, raw net.PacketConn) (net.PacketConn, error) { - return NewConnClient(c, raw) -} - -func (c *srtpConn) Size() int { - return c.header.Size() -} - -func (c *srtpConn) ReadFrom(p []byte) (n int, addr net.Addr, err error) { - return len(p) - c.header.Size(), addr, nil -} - -func (c *srtpConn) WriteTo(p []byte, addr net.Addr) (n int, err error) { - c.header.Serialize(p) - - return len(p), nil -} diff --git a/transport/internet/finalmask/header/utp/config.go b/transport/internet/finalmask/header/utp/config.go deleted file mode 100644 index 45d9a20c..00000000 --- a/transport/internet/finalmask/header/utp/config.go +++ /dev/null @@ -1,19 +0,0 @@ -package utp - -import ( - "net" -) - -func (c *Config) UDP() { -} - -func (c *Config) WrapPacketConnClient(raw net.PacketConn, level int, levelCount int) (net.PacketConn, error) { - return NewConnClient(c, raw) -} - -func (c *Config) WrapPacketConnServer(raw net.PacketConn, level int, levelCount int) (net.PacketConn, error) { - return NewConnServer(c, raw) -} - -func (c *Config) HeaderConn() { -} diff --git a/transport/internet/finalmask/header/utp/config.pb.go b/transport/internet/finalmask/header/utp/config.pb.go deleted file mode 100644 index bd67647f..00000000 --- a/transport/internet/finalmask/header/utp/config.pb.go +++ /dev/null @@ -1,114 +0,0 @@ -// Code generated by protoc-gen-go. DO NOT EDIT. -// versions: -// protoc-gen-go v1.36.11 -// protoc v6.33.5 -// source: transport/internet/finalmask/header/utp/config.proto - -package utp - -import ( - protoreflect "google.golang.org/protobuf/reflect/protoreflect" - protoimpl "google.golang.org/protobuf/runtime/protoimpl" - reflect "reflect" - sync "sync" - unsafe "unsafe" -) - -const ( - // Verify that this generated code is sufficiently up-to-date. - _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) - // Verify that runtime/protoimpl is sufficiently up-to-date. - _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) -) - -type Config struct { - state protoimpl.MessageState `protogen:"open.v1"` - unknownFields protoimpl.UnknownFields - sizeCache protoimpl.SizeCache -} - -func (x *Config) Reset() { - *x = Config{} - mi := &file_transport_internet_finalmask_header_utp_config_proto_msgTypes[0] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) -} - -func (x *Config) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*Config) ProtoMessage() {} - -func (x *Config) ProtoReflect() protoreflect.Message { - mi := &file_transport_internet_finalmask_header_utp_config_proto_msgTypes[0] - if x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use Config.ProtoReflect.Descriptor instead. -func (*Config) Descriptor() ([]byte, []int) { - return file_transport_internet_finalmask_header_utp_config_proto_rawDescGZIP(), []int{0} -} - -var File_transport_internet_finalmask_header_utp_config_proto protoreflect.FileDescriptor - -const file_transport_internet_finalmask_header_utp_config_proto_rawDesc = "" + - "\n" + - "4transport/internet/finalmask/header/utp/config.proto\x12,xray.transport.internet.finalmask.header.utp\"\b\n" + - "\x06ConfigB\xa6\x01\n" + - "0com.xray.transport.internet.finalmask.header.utpP\x01ZAgithub.com/xtls/xray-core/transport/internet/finalmask/header/utp\xaa\x02,Xray.Transport.Internet.Finalmask.Header.Utpb\x06proto3" - -var ( - file_transport_internet_finalmask_header_utp_config_proto_rawDescOnce sync.Once - file_transport_internet_finalmask_header_utp_config_proto_rawDescData []byte -) - -func file_transport_internet_finalmask_header_utp_config_proto_rawDescGZIP() []byte { - file_transport_internet_finalmask_header_utp_config_proto_rawDescOnce.Do(func() { - file_transport_internet_finalmask_header_utp_config_proto_rawDescData = protoimpl.X.CompressGZIP(unsafe.Slice(unsafe.StringData(file_transport_internet_finalmask_header_utp_config_proto_rawDesc), len(file_transport_internet_finalmask_header_utp_config_proto_rawDesc))) - }) - return file_transport_internet_finalmask_header_utp_config_proto_rawDescData -} - -var file_transport_internet_finalmask_header_utp_config_proto_msgTypes = make([]protoimpl.MessageInfo, 1) -var file_transport_internet_finalmask_header_utp_config_proto_goTypes = []any{ - (*Config)(nil), // 0: xray.transport.internet.finalmask.header.utp.Config -} -var file_transport_internet_finalmask_header_utp_config_proto_depIdxs = []int32{ - 0, // [0:0] is the sub-list for method output_type - 0, // [0:0] is the sub-list for method input_type - 0, // [0:0] is the sub-list for extension type_name - 0, // [0:0] is the sub-list for extension extendee - 0, // [0:0] is the sub-list for field type_name -} - -func init() { file_transport_internet_finalmask_header_utp_config_proto_init() } -func file_transport_internet_finalmask_header_utp_config_proto_init() { - if File_transport_internet_finalmask_header_utp_config_proto != nil { - return - } - type x struct{} - out := protoimpl.TypeBuilder{ - File: protoimpl.DescBuilder{ - GoPackagePath: reflect.TypeOf(x{}).PkgPath(), - RawDescriptor: unsafe.Slice(unsafe.StringData(file_transport_internet_finalmask_header_utp_config_proto_rawDesc), len(file_transport_internet_finalmask_header_utp_config_proto_rawDesc)), - NumEnums: 0, - NumMessages: 1, - NumExtensions: 0, - NumServices: 0, - }, - GoTypes: file_transport_internet_finalmask_header_utp_config_proto_goTypes, - DependencyIndexes: file_transport_internet_finalmask_header_utp_config_proto_depIdxs, - MessageInfos: file_transport_internet_finalmask_header_utp_config_proto_msgTypes, - }.Build() - File_transport_internet_finalmask_header_utp_config_proto = out.File - file_transport_internet_finalmask_header_utp_config_proto_goTypes = nil - file_transport_internet_finalmask_header_utp_config_proto_depIdxs = nil -} diff --git a/transport/internet/finalmask/header/utp/config.proto b/transport/internet/finalmask/header/utp/config.proto deleted file mode 100644 index ce76ef2e..00000000 --- a/transport/internet/finalmask/header/utp/config.proto +++ /dev/null @@ -1,9 +0,0 @@ -syntax = "proto3"; - -package xray.transport.internet.finalmask.header.utp; -option csharp_namespace = "Xray.Transport.Internet.Finalmask.Header.Utp"; -option go_package = "github.com/xtls/xray-core/transport/internet/finalmask/header/utp"; -option java_package = "com.xray.transport.internet.finalmask.header.utp"; -option java_multiple_files = true; - -message Config {} diff --git a/transport/internet/finalmask/header/utp/conn.go b/transport/internet/finalmask/header/utp/conn.go deleted file mode 100644 index 59005325..00000000 --- a/transport/internet/finalmask/header/utp/conn.go +++ /dev/null @@ -1,60 +0,0 @@ -package utp - -import ( - "encoding/binary" - "net" - - "github.com/xtls/xray-core/common/dice" -) - -type utp struct { - header byte - extension byte - connectionID uint16 -} - -func (*utp) Size() int { - return 4 -} - -func (h *utp) Serialize(b []byte) { - binary.BigEndian.PutUint16(b, h.connectionID) - b[2] = h.header - b[3] = h.extension -} - -type utpConn struct { - net.PacketConn - header *utp -} - -func NewConnClient(c *Config, raw net.PacketConn) (net.PacketConn, error) { - conn := &utpConn{ - PacketConn: raw, - header: &utp{ - header: 1, - extension: 0, - connectionID: dice.RollUint16(), - }, - } - - return conn, nil -} - -func NewConnServer(c *Config, raw net.PacketConn) (net.PacketConn, error) { - return NewConnClient(c, raw) -} - -func (c *utpConn) Size() int { - return c.header.Size() -} - -func (c *utpConn) ReadFrom(p []byte) (n int, addr net.Addr, err error) { - return len(p) - c.header.Size(), addr, nil -} - -func (c *utpConn) WriteTo(p []byte, addr net.Addr) (n int, err error) { - c.header.Serialize(p) - - return len(p), nil -} diff --git a/transport/internet/finalmask/header/wechat/config.go b/transport/internet/finalmask/header/wechat/config.go deleted file mode 100644 index a433318e..00000000 --- a/transport/internet/finalmask/header/wechat/config.go +++ /dev/null @@ -1,19 +0,0 @@ -package wechat - -import ( - "net" -) - -func (c *Config) UDP() { -} - -func (c *Config) WrapPacketConnClient(raw net.PacketConn, level int, levelCount int) (net.PacketConn, error) { - return NewConnClient(c, raw) -} - -func (c *Config) WrapPacketConnServer(raw net.PacketConn, level int, levelCount int) (net.PacketConn, error) { - return NewConnServer(c, raw) -} - -func (c *Config) HeaderConn() { -} diff --git a/transport/internet/finalmask/header/wechat/config.pb.go b/transport/internet/finalmask/header/wechat/config.pb.go deleted file mode 100644 index da8e428d..00000000 --- a/transport/internet/finalmask/header/wechat/config.pb.go +++ /dev/null @@ -1,114 +0,0 @@ -// Code generated by protoc-gen-go. DO NOT EDIT. -// versions: -// protoc-gen-go v1.36.11 -// protoc v6.33.5 -// source: transport/internet/finalmask/header/wechat/config.proto - -package wechat - -import ( - protoreflect "google.golang.org/protobuf/reflect/protoreflect" - protoimpl "google.golang.org/protobuf/runtime/protoimpl" - reflect "reflect" - sync "sync" - unsafe "unsafe" -) - -const ( - // Verify that this generated code is sufficiently up-to-date. - _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) - // Verify that runtime/protoimpl is sufficiently up-to-date. - _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) -) - -type Config struct { - state protoimpl.MessageState `protogen:"open.v1"` - unknownFields protoimpl.UnknownFields - sizeCache protoimpl.SizeCache -} - -func (x *Config) Reset() { - *x = Config{} - mi := &file_transport_internet_finalmask_header_wechat_config_proto_msgTypes[0] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) -} - -func (x *Config) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*Config) ProtoMessage() {} - -func (x *Config) ProtoReflect() protoreflect.Message { - mi := &file_transport_internet_finalmask_header_wechat_config_proto_msgTypes[0] - if x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use Config.ProtoReflect.Descriptor instead. -func (*Config) Descriptor() ([]byte, []int) { - return file_transport_internet_finalmask_header_wechat_config_proto_rawDescGZIP(), []int{0} -} - -var File_transport_internet_finalmask_header_wechat_config_proto protoreflect.FileDescriptor - -const file_transport_internet_finalmask_header_wechat_config_proto_rawDesc = "" + - "\n" + - "7transport/internet/finalmask/header/wechat/config.proto\x12/xray.transport.internet.finalmask.header.wechat\"\b\n" + - "\x06ConfigB\xaf\x01\n" + - "3com.xray.transport.internet.finalmask.header.wechatP\x01ZDgithub.com/xtls/xray-core/transport/internet/finalmask/header/wechat\xaa\x02/Xray.Transport.Internet.Finalmask.Header.Wechatb\x06proto3" - -var ( - file_transport_internet_finalmask_header_wechat_config_proto_rawDescOnce sync.Once - file_transport_internet_finalmask_header_wechat_config_proto_rawDescData []byte -) - -func file_transport_internet_finalmask_header_wechat_config_proto_rawDescGZIP() []byte { - file_transport_internet_finalmask_header_wechat_config_proto_rawDescOnce.Do(func() { - file_transport_internet_finalmask_header_wechat_config_proto_rawDescData = protoimpl.X.CompressGZIP(unsafe.Slice(unsafe.StringData(file_transport_internet_finalmask_header_wechat_config_proto_rawDesc), len(file_transport_internet_finalmask_header_wechat_config_proto_rawDesc))) - }) - return file_transport_internet_finalmask_header_wechat_config_proto_rawDescData -} - -var file_transport_internet_finalmask_header_wechat_config_proto_msgTypes = make([]protoimpl.MessageInfo, 1) -var file_transport_internet_finalmask_header_wechat_config_proto_goTypes = []any{ - (*Config)(nil), // 0: xray.transport.internet.finalmask.header.wechat.Config -} -var file_transport_internet_finalmask_header_wechat_config_proto_depIdxs = []int32{ - 0, // [0:0] is the sub-list for method output_type - 0, // [0:0] is the sub-list for method input_type - 0, // [0:0] is the sub-list for extension type_name - 0, // [0:0] is the sub-list for extension extendee - 0, // [0:0] is the sub-list for field type_name -} - -func init() { file_transport_internet_finalmask_header_wechat_config_proto_init() } -func file_transport_internet_finalmask_header_wechat_config_proto_init() { - if File_transport_internet_finalmask_header_wechat_config_proto != nil { - return - } - type x struct{} - out := protoimpl.TypeBuilder{ - File: protoimpl.DescBuilder{ - GoPackagePath: reflect.TypeOf(x{}).PkgPath(), - RawDescriptor: unsafe.Slice(unsafe.StringData(file_transport_internet_finalmask_header_wechat_config_proto_rawDesc), len(file_transport_internet_finalmask_header_wechat_config_proto_rawDesc)), - NumEnums: 0, - NumMessages: 1, - NumExtensions: 0, - NumServices: 0, - }, - GoTypes: file_transport_internet_finalmask_header_wechat_config_proto_goTypes, - DependencyIndexes: file_transport_internet_finalmask_header_wechat_config_proto_depIdxs, - MessageInfos: file_transport_internet_finalmask_header_wechat_config_proto_msgTypes, - }.Build() - File_transport_internet_finalmask_header_wechat_config_proto = out.File - file_transport_internet_finalmask_header_wechat_config_proto_goTypes = nil - file_transport_internet_finalmask_header_wechat_config_proto_depIdxs = nil -} diff --git a/transport/internet/finalmask/header/wechat/config.proto b/transport/internet/finalmask/header/wechat/config.proto deleted file mode 100644 index 3127773a..00000000 --- a/transport/internet/finalmask/header/wechat/config.proto +++ /dev/null @@ -1,9 +0,0 @@ -syntax = "proto3"; - -package xray.transport.internet.finalmask.header.wechat; -option csharp_namespace = "Xray.Transport.Internet.Finalmask.Header.Wechat"; -option go_package = "github.com/xtls/xray-core/transport/internet/finalmask/header/wechat"; -option java_package = "com.xray.transport.internet.finalmask.header.wechat"; -option java_multiple_files = true; - -message Config {} diff --git a/transport/internet/finalmask/header/wechat/conn.go b/transport/internet/finalmask/header/wechat/conn.go deleted file mode 100644 index cb1fff62..00000000 --- a/transport/internet/finalmask/header/wechat/conn.go +++ /dev/null @@ -1,64 +0,0 @@ -package wechat - -import ( - "encoding/binary" - "net" - - "github.com/xtls/xray-core/common/dice" -) - -type wechat struct { - sn uint32 -} - -func (*wechat) Size() int { - return 13 -} - -func (h *wechat) Serialize(b []byte) { - h.sn++ - b[0] = 0xa1 - b[1] = 0x08 - binary.BigEndian.PutUint32(b[2:], h.sn) - b[6] = 0x00 - b[7] = 0x10 - b[8] = 0x11 - b[9] = 0x18 - b[10] = 0x30 - b[11] = 0x22 - b[12] = 0x30 -} - -type wechatConn struct { - net.PacketConn - header *wechat -} - -func NewConnClient(c *Config, raw net.PacketConn) (net.PacketConn, error) { - conn := &wechatConn{ - PacketConn: raw, - header: &wechat{ - sn: uint32(dice.RollUint16()), - }, - } - - return conn, nil -} - -func NewConnServer(c *Config, raw net.PacketConn) (net.PacketConn, error) { - return NewConnClient(c, raw) -} - -func (c *wechatConn) Size() int { - return c.header.Size() -} - -func (c *wechatConn) ReadFrom(p []byte) (n int, addr net.Addr, err error) { - return len(p) - c.header.Size(), addr, nil -} - -func (c *wechatConn) WriteTo(p []byte, addr net.Addr) (n int, err error) { - c.header.Serialize(p) - - return len(p), nil -} diff --git a/transport/internet/finalmask/header/wireguard/config.go b/transport/internet/finalmask/header/wireguard/config.go deleted file mode 100644 index dd3609d8..00000000 --- a/transport/internet/finalmask/header/wireguard/config.go +++ /dev/null @@ -1,19 +0,0 @@ -package wireguard - -import ( - "net" -) - -func (c *Config) UDP() { -} - -func (c *Config) WrapPacketConnClient(raw net.PacketConn, level int, levelCount int) (net.PacketConn, error) { - return NewConnClient(c, raw) -} - -func (c *Config) WrapPacketConnServer(raw net.PacketConn, level int, levelCount int) (net.PacketConn, error) { - return NewConnServer(c, raw) -} - -func (c *Config) HeaderConn() { -} diff --git a/transport/internet/finalmask/header/wireguard/config.pb.go b/transport/internet/finalmask/header/wireguard/config.pb.go deleted file mode 100644 index fb49f3e6..00000000 --- a/transport/internet/finalmask/header/wireguard/config.pb.go +++ /dev/null @@ -1,114 +0,0 @@ -// Code generated by protoc-gen-go. DO NOT EDIT. -// versions: -// protoc-gen-go v1.36.11 -// protoc v6.33.5 -// source: transport/internet/finalmask/header/wireguard/config.proto - -package wireguard - -import ( - protoreflect "google.golang.org/protobuf/reflect/protoreflect" - protoimpl "google.golang.org/protobuf/runtime/protoimpl" - reflect "reflect" - sync "sync" - unsafe "unsafe" -) - -const ( - // Verify that this generated code is sufficiently up-to-date. - _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) - // Verify that runtime/protoimpl is sufficiently up-to-date. - _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) -) - -type Config struct { - state protoimpl.MessageState `protogen:"open.v1"` - unknownFields protoimpl.UnknownFields - sizeCache protoimpl.SizeCache -} - -func (x *Config) Reset() { - *x = Config{} - mi := &file_transport_internet_finalmask_header_wireguard_config_proto_msgTypes[0] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) -} - -func (x *Config) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*Config) ProtoMessage() {} - -func (x *Config) ProtoReflect() protoreflect.Message { - mi := &file_transport_internet_finalmask_header_wireguard_config_proto_msgTypes[0] - if x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use Config.ProtoReflect.Descriptor instead. -func (*Config) Descriptor() ([]byte, []int) { - return file_transport_internet_finalmask_header_wireguard_config_proto_rawDescGZIP(), []int{0} -} - -var File_transport_internet_finalmask_header_wireguard_config_proto protoreflect.FileDescriptor - -const file_transport_internet_finalmask_header_wireguard_config_proto_rawDesc = "" + - "\n" + - ":transport/internet/finalmask/header/wireguard/config.proto\x122xray.transport.internet.finalmask.header.wireguard\"\b\n" + - "\x06ConfigB\xb8\x01\n" + - "6com.xray.transport.internet.finalmask.header.wireguardP\x01ZGgithub.com/xtls/xray-core/transport/internet/finalmask/header/wireguard\xaa\x022Xray.Transport.Internet.Finalmask.Header.Wireguardb\x06proto3" - -var ( - file_transport_internet_finalmask_header_wireguard_config_proto_rawDescOnce sync.Once - file_transport_internet_finalmask_header_wireguard_config_proto_rawDescData []byte -) - -func file_transport_internet_finalmask_header_wireguard_config_proto_rawDescGZIP() []byte { - file_transport_internet_finalmask_header_wireguard_config_proto_rawDescOnce.Do(func() { - file_transport_internet_finalmask_header_wireguard_config_proto_rawDescData = protoimpl.X.CompressGZIP(unsafe.Slice(unsafe.StringData(file_transport_internet_finalmask_header_wireguard_config_proto_rawDesc), len(file_transport_internet_finalmask_header_wireguard_config_proto_rawDesc))) - }) - return file_transport_internet_finalmask_header_wireguard_config_proto_rawDescData -} - -var file_transport_internet_finalmask_header_wireguard_config_proto_msgTypes = make([]protoimpl.MessageInfo, 1) -var file_transport_internet_finalmask_header_wireguard_config_proto_goTypes = []any{ - (*Config)(nil), // 0: xray.transport.internet.finalmask.header.wireguard.Config -} -var file_transport_internet_finalmask_header_wireguard_config_proto_depIdxs = []int32{ - 0, // [0:0] is the sub-list for method output_type - 0, // [0:0] is the sub-list for method input_type - 0, // [0:0] is the sub-list for extension type_name - 0, // [0:0] is the sub-list for extension extendee - 0, // [0:0] is the sub-list for field type_name -} - -func init() { file_transport_internet_finalmask_header_wireguard_config_proto_init() } -func file_transport_internet_finalmask_header_wireguard_config_proto_init() { - if File_transport_internet_finalmask_header_wireguard_config_proto != nil { - return - } - type x struct{} - out := protoimpl.TypeBuilder{ - File: protoimpl.DescBuilder{ - GoPackagePath: reflect.TypeOf(x{}).PkgPath(), - RawDescriptor: unsafe.Slice(unsafe.StringData(file_transport_internet_finalmask_header_wireguard_config_proto_rawDesc), len(file_transport_internet_finalmask_header_wireguard_config_proto_rawDesc)), - NumEnums: 0, - NumMessages: 1, - NumExtensions: 0, - NumServices: 0, - }, - GoTypes: file_transport_internet_finalmask_header_wireguard_config_proto_goTypes, - DependencyIndexes: file_transport_internet_finalmask_header_wireguard_config_proto_depIdxs, - MessageInfos: file_transport_internet_finalmask_header_wireguard_config_proto_msgTypes, - }.Build() - File_transport_internet_finalmask_header_wireguard_config_proto = out.File - file_transport_internet_finalmask_header_wireguard_config_proto_goTypes = nil - file_transport_internet_finalmask_header_wireguard_config_proto_depIdxs = nil -} diff --git a/transport/internet/finalmask/header/wireguard/config.proto b/transport/internet/finalmask/header/wireguard/config.proto deleted file mode 100644 index 476cbfba..00000000 --- a/transport/internet/finalmask/header/wireguard/config.proto +++ /dev/null @@ -1,9 +0,0 @@ -syntax = "proto3"; - -package xray.transport.internet.finalmask.header.wireguard; -option csharp_namespace = "Xray.Transport.Internet.Finalmask.Header.Wireguard"; -option go_package = "github.com/xtls/xray-core/transport/internet/finalmask/header/wireguard"; -option java_package = "com.xray.transport.internet.finalmask.header.wireguard"; -option java_multiple_files = true; - -message Config {} diff --git a/transport/internet/finalmask/header/wireguard/conn.go b/transport/internet/finalmask/header/wireguard/conn.go deleted file mode 100644 index 4a38969f..00000000 --- a/transport/internet/finalmask/header/wireguard/conn.go +++ /dev/null @@ -1,50 +0,0 @@ -package wireguard - -import ( - "net" -) - -type wireguare struct{} - -func (*wireguare) Size() int { - return 4 -} - -func (h *wireguare) Serialize(b []byte) { - b[0] = 0x04 - b[1] = 0x00 - b[2] = 0x00 - b[3] = 0x00 -} - -type wireguareConn struct { - net.PacketConn - header *wireguare -} - -func NewConnClient(c *Config, raw net.PacketConn) (net.PacketConn, error) { - conn := &wireguareConn{ - PacketConn: raw, - header: &wireguare{}, - } - - return conn, nil -} - -func NewConnServer(c *Config, raw net.PacketConn) (net.PacketConn, error) { - return NewConnClient(c, raw) -} - -func (c *wireguareConn) Size() int { - return c.header.Size() -} - -func (c *wireguareConn) ReadFrom(p []byte) (n int, addr net.Addr, err error) { - return len(p) - c.header.Size(), addr, nil -} - -func (c *wireguareConn) WriteTo(p []byte, addr net.Addr) (n int, err error) { - c.header.Serialize(p) - - return len(p), nil -} diff --git a/transport/internet/finalmask/header/dns/config.go b/transport/internet/finalmask/mkcp/header/config.go similarity index 80% rename from transport/internet/finalmask/header/dns/config.go rename to transport/internet/finalmask/mkcp/header/config.go index 48ede126..17774871 100644 --- a/transport/internet/finalmask/header/dns/config.go +++ b/transport/internet/finalmask/mkcp/header/config.go @@ -1,11 +1,12 @@ -package dns +package header import ( "net" ) -func (c *Config) UDP() { -} +func (c *Config) UDP() {} + +func (c *Config) HeaderConn() {} func (c *Config) WrapPacketConnClient(raw net.PacketConn, level int, levelCount int) (net.PacketConn, error) { return NewConnClient(c, raw) @@ -14,6 +15,3 @@ func (c *Config) WrapPacketConnClient(raw net.PacketConn, level int, levelCount func (c *Config) WrapPacketConnServer(raw net.PacketConn, level int, levelCount int) (net.PacketConn, error) { return NewConnServer(c, raw) } - -func (c *Config) HeaderConn() { -} diff --git a/transport/internet/finalmask/mkcp/header/config.pb.go b/transport/internet/finalmask/mkcp/header/config.pb.go new file mode 100644 index 00000000..7fc4e6f4 --- /dev/null +++ b/transport/internet/finalmask/mkcp/header/config.pb.go @@ -0,0 +1,132 @@ +// Code generated by protoc-gen-go. DO NOT EDIT. +// versions: +// protoc-gen-go v1.36.11 +// protoc v6.33.5 +// source: transport/internet/finalmask/mkcp/header/config.proto + +package header + +import ( + protoreflect "google.golang.org/protobuf/reflect/protoreflect" + protoimpl "google.golang.org/protobuf/runtime/protoimpl" + reflect "reflect" + sync "sync" + unsafe "unsafe" +) + +const ( + // Verify that this generated code is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) + // Verify that runtime/protoimpl is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) +) + +type Config struct { + state protoimpl.MessageState `protogen:"open.v1"` + ID int32 `protobuf:"varint,1,opt,name=ID,proto3" json:"ID,omitempty"` + Domain string `protobuf:"bytes,2,opt,name=domain,proto3" json:"domain,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *Config) Reset() { + *x = Config{} + mi := &file_transport_internet_finalmask_mkcp_header_config_proto_msgTypes[0] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *Config) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*Config) ProtoMessage() {} + +func (x *Config) ProtoReflect() protoreflect.Message { + mi := &file_transport_internet_finalmask_mkcp_header_config_proto_msgTypes[0] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use Config.ProtoReflect.Descriptor instead. +func (*Config) Descriptor() ([]byte, []int) { + return file_transport_internet_finalmask_mkcp_header_config_proto_rawDescGZIP(), []int{0} +} + +func (x *Config) GetID() int32 { + if x != nil { + return x.ID + } + return 0 +} + +func (x *Config) GetDomain() string { + if x != nil { + return x.Domain + } + return "" +} + +var File_transport_internet_finalmask_mkcp_header_config_proto protoreflect.FileDescriptor + +const file_transport_internet_finalmask_mkcp_header_config_proto_rawDesc = "" + + "\n" + + "5transport/internet/finalmask/mkcp/header/config.proto\x12-xray.transport.internet.finalmask.mkcp.header\"0\n" + + "\x06Config\x12\x0e\n" + + "\x02ID\x18\x01 \x01(\x05R\x02ID\x12\x16\n" + + "\x06domain\x18\x02 \x01(\tR\x06domainB\xa9\x01\n" + + "1com.xray.transport.internet.finalmask.mkcp.headerP\x01ZBgithub.com/xtls/xray-core/transport/internet/finalmask/mkcp/header\xaa\x02-Xray.Transport.Internet.Finalmask.Mkcp.Headerb\x06proto3" + +var ( + file_transport_internet_finalmask_mkcp_header_config_proto_rawDescOnce sync.Once + file_transport_internet_finalmask_mkcp_header_config_proto_rawDescData []byte +) + +func file_transport_internet_finalmask_mkcp_header_config_proto_rawDescGZIP() []byte { + file_transport_internet_finalmask_mkcp_header_config_proto_rawDescOnce.Do(func() { + file_transport_internet_finalmask_mkcp_header_config_proto_rawDescData = protoimpl.X.CompressGZIP(unsafe.Slice(unsafe.StringData(file_transport_internet_finalmask_mkcp_header_config_proto_rawDesc), len(file_transport_internet_finalmask_mkcp_header_config_proto_rawDesc))) + }) + return file_transport_internet_finalmask_mkcp_header_config_proto_rawDescData +} + +var file_transport_internet_finalmask_mkcp_header_config_proto_msgTypes = make([]protoimpl.MessageInfo, 1) +var file_transport_internet_finalmask_mkcp_header_config_proto_goTypes = []any{ + (*Config)(nil), // 0: xray.transport.internet.finalmask.mkcp.header.Config +} +var file_transport_internet_finalmask_mkcp_header_config_proto_depIdxs = []int32{ + 0, // [0:0] is the sub-list for method output_type + 0, // [0:0] is the sub-list for method input_type + 0, // [0:0] is the sub-list for extension type_name + 0, // [0:0] is the sub-list for extension extendee + 0, // [0:0] is the sub-list for field type_name +} + +func init() { file_transport_internet_finalmask_mkcp_header_config_proto_init() } +func file_transport_internet_finalmask_mkcp_header_config_proto_init() { + if File_transport_internet_finalmask_mkcp_header_config_proto != nil { + return + } + type x struct{} + out := protoimpl.TypeBuilder{ + File: protoimpl.DescBuilder{ + GoPackagePath: reflect.TypeOf(x{}).PkgPath(), + RawDescriptor: unsafe.Slice(unsafe.StringData(file_transport_internet_finalmask_mkcp_header_config_proto_rawDesc), len(file_transport_internet_finalmask_mkcp_header_config_proto_rawDesc)), + NumEnums: 0, + NumMessages: 1, + NumExtensions: 0, + NumServices: 0, + }, + GoTypes: file_transport_internet_finalmask_mkcp_header_config_proto_goTypes, + DependencyIndexes: file_transport_internet_finalmask_mkcp_header_config_proto_depIdxs, + MessageInfos: file_transport_internet_finalmask_mkcp_header_config_proto_msgTypes, + }.Build() + File_transport_internet_finalmask_mkcp_header_config_proto = out.File + file_transport_internet_finalmask_mkcp_header_config_proto_goTypes = nil + file_transport_internet_finalmask_mkcp_header_config_proto_depIdxs = nil +} diff --git a/transport/internet/finalmask/mkcp/header/config.proto b/transport/internet/finalmask/mkcp/header/config.proto new file mode 100644 index 00000000..d5907cfd --- /dev/null +++ b/transport/internet/finalmask/mkcp/header/config.proto @@ -0,0 +1,12 @@ +syntax = "proto3"; + +package xray.transport.internet.finalmask.mkcp.header; +option csharp_namespace = "Xray.Transport.Internet.Finalmask.Mkcp.Header"; +option go_package = "github.com/xtls/xray-core/transport/internet/finalmask/mkcp/header"; +option java_package = "com.xray.transport.internet.finalmask.mkcp.header"; +option java_multiple_files = true; + +message Config { + int32 ID = 1; + string domain = 2; +} diff --git a/transport/internet/finalmask/mkcp/header/conn.go b/transport/internet/finalmask/mkcp/header/conn.go new file mode 100644 index 00000000..b17df321 --- /dev/null +++ b/transport/internet/finalmask/mkcp/header/conn.go @@ -0,0 +1,57 @@ +package header + +import ( + "net" + + "github.com/xtls/xray-core/common/errors" +) + +type headerConn struct { + net.PacketConn + header Header +} + +func NewConnClient(c *Config, raw net.PacketConn) (net.PacketConn, error) { + var header Header + switch HeaderID(c.ID) { + case DNS: + var err error + header, err = NewHeaderDNS(c.Domain) + if err != nil { + return nil, err + } + case DTLS: + header = &dtls{} + case SRTP: + header = &srtp{} + case UTP: + header = &utp{} + case WECHAT: + header = &wechat{} + case WIREGUARD: + header = &wireguard{} + default: + return nil, errors.New("invalid id ", c.ID) + } + return &headerConn{ + PacketConn: raw, + header: header, + }, nil +} + +func NewConnServer(c *Config, raw net.PacketConn) (net.PacketConn, error) { + return NewConnClient(c, raw) +} + +func (c *headerConn) Size() int { + return c.header.Size() +} + +func (c *headerConn) ReadFrom(p []byte) (n int, addr net.Addr, err error) { + return len(p) - c.header.Size(), nil, nil +} + +func (c *headerConn) WriteTo(p []byte, addr net.Addr) (n int, err error) { + c.header.Serialize(p) + return len(p), nil +} diff --git a/transport/internet/finalmask/mkcp/header/header.go b/transport/internet/finalmask/mkcp/header/header.go new file mode 100644 index 00000000..0e7f25b7 --- /dev/null +++ b/transport/internet/finalmask/mkcp/header/header.go @@ -0,0 +1,17 @@ +package header + +type Header interface { + Size() int + Serialize(b []byte) +} + +type HeaderID int + +const ( + DNS HeaderID = iota + DTLS + SRTP + UTP + WECHAT + WIREGUARD +) diff --git a/transport/internet/finalmask/header/dns/conn.go b/transport/internet/finalmask/mkcp/header/header_dns.go similarity index 75% rename from transport/internet/finalmask/header/dns/conn.go rename to transport/internet/finalmask/mkcp/header/header_dns.go index 263ca7ef..bcbb0e00 100644 --- a/transport/internet/finalmask/header/dns/conn.go +++ b/transport/internet/finalmask/mkcp/header/header_dns.go @@ -1,13 +1,44 @@ -package dns +package header import ( "encoding/binary" - "net" + "errors" "github.com/xtls/xray-core/common/dice" - "github.com/xtls/xray-core/common/errors" ) +type dns struct { + header []byte +} + +func (h *dns) Size() int { + return len(h.header) +} + +func (h *dns) Serialize(b []byte) { + copy(b, h.header) + binary.BigEndian.PutUint16(b[0:], dice.RollUint16()) +} + +func NewHeaderDNS(domain string) (*dns, error) { + var header []byte + header = binary.BigEndian.AppendUint16(header, 0x0000) // Transaction ID + header = binary.BigEndian.AppendUint16(header, 0x0100) // Flags: Standard query + header = binary.BigEndian.AppendUint16(header, 0x0001) // Questions + header = binary.BigEndian.AppendUint16(header, 0x0000) // Answer RRs + header = binary.BigEndian.AppendUint16(header, 0x0000) // Authority RRs + header = binary.BigEndian.AppendUint16(header, 0x0000) // Additional RRs + buf := make([]byte, 0x100) + off1, err := packDomainName(domain+".", buf) + if err != nil { + return nil, err + } + header = append(header, buf[:off1]...) + header = binary.BigEndian.AppendUint16(header, 0x0001) // Type: A + header = binary.BigEndian.AppendUint16(header, 0x0001) // Class: IN + return &dns{header: header}, nil +} + func packDomainName(s string, msg []byte) (off1 int, err error) { off := 0 ls := len(s) @@ -73,66 +104,3 @@ func packDomainName(s string, msg []byte) (off1 int, err error) { return off + 1, nil } - -type dns struct { - header []byte -} - -func (h *dns) Size() int { - return len(h.header) -} - -func (h *dns) Serialize(b []byte) { - copy(b, h.header) - binary.BigEndian.PutUint16(b[0:], dice.RollUint16()) -} - -type dnsConn struct { - net.PacketConn - header *dns -} - -func NewConnClient(c *Config, raw net.PacketConn) (net.PacketConn, error) { - var header []byte - header = binary.BigEndian.AppendUint16(header, 0x0000) // Transaction ID - header = binary.BigEndian.AppendUint16(header, 0x0100) // Flags: Standard query - header = binary.BigEndian.AppendUint16(header, 0x0001) // Questions - header = binary.BigEndian.AppendUint16(header, 0x0000) // Answer RRs - header = binary.BigEndian.AppendUint16(header, 0x0000) // Authority RRs - header = binary.BigEndian.AppendUint16(header, 0x0000) // Additional RRs - buf := make([]byte, 0x100) - off1, err := packDomainName(c.Domain+".", buf) - if err != nil { - return nil, err - } - header = append(header, buf[:off1]...) - header = binary.BigEndian.AppendUint16(header, 0x0001) // Type: A - header = binary.BigEndian.AppendUint16(header, 0x0001) // Class: IN - - conn := &dnsConn{ - PacketConn: raw, - header: &dns{ - header: header, - }, - } - - return conn, nil -} - -func NewConnServer(c *Config, raw net.PacketConn) (net.PacketConn, error) { - return NewConnClient(c, raw) -} - -func (c *dnsConn) Size() int { - return c.header.Size() -} - -func (c *dnsConn) ReadFrom(p []byte) (n int, addr net.Addr, err error) { - return len(p) - c.header.Size(), addr, nil -} - -func (c *dnsConn) WriteTo(p []byte, addr net.Addr) (n int, err error) { - c.header.Serialize(p) - - return len(p), nil -} diff --git a/transport/internet/finalmask/mkcp/header/header_dtls.go b/transport/internet/finalmask/mkcp/header/header_dtls.go new file mode 100644 index 00000000..286c6871 --- /dev/null +++ b/transport/internet/finalmask/mkcp/header/header_dtls.go @@ -0,0 +1,32 @@ +package header + +type dtls struct { + epoch uint16 + length uint16 + sequence uint32 +} + +func (*dtls) Size() int { + return 1 + 2 + 2 + 6 + 2 +} + +func (h *dtls) Serialize(b []byte) { + b[0] = 23 + b[1] = 254 + b[2] = 253 + b[3] = byte(h.epoch >> 8) + b[4] = byte(h.epoch) + b[5] = 0 + b[6] = 0 + b[7] = byte(h.sequence >> 24) + b[8] = byte(h.sequence >> 16) + b[9] = byte(h.sequence >> 8) + b[10] = byte(h.sequence) + h.sequence++ + b[11] = byte(h.length >> 8) + b[12] = byte(h.length) + h.length += 17 + if h.length > 100 { + h.length -= 50 + } +} diff --git a/transport/internet/finalmask/mkcp/header/header_srtp.go b/transport/internet/finalmask/mkcp/header/header_srtp.go new file mode 100644 index 00000000..f90d9329 --- /dev/null +++ b/transport/internet/finalmask/mkcp/header/header_srtp.go @@ -0,0 +1,18 @@ +package header + +import "encoding/binary" + +type srtp struct { + header uint16 + number uint16 +} + +func (*srtp) Size() int { + return 4 +} + +func (h *srtp) Serialize(b []byte) { + h.number++ + binary.BigEndian.PutUint16(b, h.header) + binary.BigEndian.PutUint16(b[2:], h.number) +} diff --git a/transport/internet/finalmask/mkcp/header/header_utp.go b/transport/internet/finalmask/mkcp/header/header_utp.go new file mode 100644 index 00000000..209a6e46 --- /dev/null +++ b/transport/internet/finalmask/mkcp/header/header_utp.go @@ -0,0 +1,19 @@ +package header + +import "encoding/binary" + +type utp struct { + header byte + extension byte + connectionID uint16 +} + +func (*utp) Size() int { + return 4 +} + +func (h *utp) Serialize(b []byte) { + binary.BigEndian.PutUint16(b, h.connectionID) + b[2] = h.header + b[3] = h.extension +} diff --git a/transport/internet/finalmask/mkcp/header/header_wechat.go b/transport/internet/finalmask/mkcp/header/header_wechat.go new file mode 100644 index 00000000..a4520b59 --- /dev/null +++ b/transport/internet/finalmask/mkcp/header/header_wechat.go @@ -0,0 +1,25 @@ +package header + +import "encoding/binary" + +type wechat struct { + sn uint32 +} + +func (*wechat) Size() int { + return 13 +} + +func (h *wechat) Serialize(b []byte) { + h.sn++ + b[0] = 0xa1 + b[1] = 0x08 + binary.BigEndian.PutUint32(b[2:], h.sn) + b[6] = 0x00 + b[7] = 0x10 + b[8] = 0x11 + b[9] = 0x18 + b[10] = 0x30 + b[11] = 0x22 + b[12] = 0x30 +} diff --git a/transport/internet/finalmask/mkcp/header/header_wireguard.go b/transport/internet/finalmask/mkcp/header/header_wireguard.go new file mode 100644 index 00000000..8c983677 --- /dev/null +++ b/transport/internet/finalmask/mkcp/header/header_wireguard.go @@ -0,0 +1,14 @@ +package header + +type wireguard struct{} + +func (*wireguard) Size() int { + return 4 +} + +func (h *wireguard) Serialize(b []byte) { + b[0] = 0x04 + b[1] = 0x00 + b[2] = 0x00 + b[3] = 0x00 +} diff --git a/transport/internet/finalmask/udp_test.go b/transport/internet/finalmask/udp_test.go index 8759f9fb..c829d1ad 100644 --- a/transport/internet/finalmask/udp_test.go +++ b/transport/internet/finalmask/udp_test.go @@ -15,12 +15,8 @@ import ( "github.com/xtls/xray-core/proxy" "github.com/xtls/xray-core/transport/internet/finalmask" "github.com/xtls/xray-core/transport/internet/finalmask/header/custom" - "github.com/xtls/xray-core/transport/internet/finalmask/header/dns" - "github.com/xtls/xray-core/transport/internet/finalmask/header/srtp" - "github.com/xtls/xray-core/transport/internet/finalmask/header/utp" - "github.com/xtls/xray-core/transport/internet/finalmask/header/wechat" - "github.com/xtls/xray-core/transport/internet/finalmask/header/wireguard" "github.com/xtls/xray-core/transport/internet/finalmask/mkcp/aes128gcm" + "github.com/xtls/xray-core/transport/internet/finalmask/mkcp/header" "github.com/xtls/xray-core/transport/internet/finalmask/mkcp/original" "github.com/xtls/xray-core/transport/internet/finalmask/salamander" "github.com/xtls/xray-core/transport/internet/finalmask/sudoku" @@ -276,27 +272,32 @@ func TestPacketConnReadWrite(t *testing.T) { }, { name: "dns", - mask: &dns.Config{Domain: "www.baidu.com"}, + mask: &header.Config{ID: 0, Domain: "www.baidu.com"}, + layers: 2, + }, + { + name: "dtls", + mask: &header.Config{ID: 1}, layers: 2, }, { name: "srtp", - mask: &srtp.Config{}, + mask: &header.Config{ID: 2}, layers: 2, }, { name: "utp", - mask: &utp.Config{}, + mask: &header.Config{ID: 3}, layers: 2, }, { name: "wechat", - mask: &wechat.Config{}, + mask: &header.Config{ID: 4}, layers: 2, }, { name: "wireguard", - mask: &wireguard.Config{}, + mask: &header.Config{ID: 5}, layers: 2, }, {