Hunter0x7c7
2022-08-11 b8230139fb40edea387617b6accd8371e37eda58
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
package protocol
 
import (
    "runtime"
 
    "github.com/v2fly/v2ray-core/v5/common/bitmask"
    "github.com/v2fly/v2ray-core/v5/common/net"
    "github.com/v2fly/v2ray-core/v5/common/uuid"
)
 
// RequestCommand is a custom command in a proxy request.
type RequestCommand byte
 
const (
    RequestCommandTCP = RequestCommand(0x01)
    RequestCommandUDP = RequestCommand(0x02)
    RequestCommandMux = RequestCommand(0x03)
)
 
func (c RequestCommand) TransferType() TransferType {
    switch c {
    case RequestCommandTCP, RequestCommandMux:
        return TransferTypeStream
    case RequestCommandUDP:
        return TransferTypePacket
    default:
        return TransferTypeStream
    }
}
 
const (
    // RequestOptionChunkStream indicates request payload is chunked. Each chunk consists of length, authentication and payload.
    RequestOptionChunkStream bitmask.Byte = 0x01
 
    // RequestOptionConnectionReuse indicates client side expects to reuse the connection.
    RequestOptionConnectionReuse bitmask.Byte = 0x02
 
    RequestOptionChunkMasking bitmask.Byte = 0x04
 
    RequestOptionGlobalPadding bitmask.Byte = 0x08
 
    RequestOptionAuthenticatedLength bitmask.Byte = 0x10
)
 
type RequestHeader struct {
    Version  byte
    Command  RequestCommand
    Option   bitmask.Byte
    Security SecurityType
    Port     net.Port
    Address  net.Address
    User     *MemoryUser
}
 
func (h *RequestHeader) Destination() net.Destination {
    if h.Command == RequestCommandUDP {
        return net.UDPDestination(h.Address, h.Port)
    }
    return net.TCPDestination(h.Address, h.Port)
}
 
const (
    ResponseOptionConnectionReuse bitmask.Byte = 0x01
)
 
type ResponseCommand interface{}
 
type ResponseHeader struct {
    Option  bitmask.Byte
    Command ResponseCommand
}
 
type CommandSwitchAccount struct {
    Host     net.Address
    Port     net.Port
    ID       uuid.UUID
    Level    uint32
    AlterIds uint16
    ValidMin byte
}
 
func (sc *SecurityConfig) GetSecurityType() SecurityType {
    if sc == nil || sc.Type == SecurityType_AUTO {
        if runtime.GOARCH == "amd64" || runtime.GOARCH == "s390x" || runtime.GOARCH == "arm64" {
            return SecurityType_AES128_GCM
        }
        return SecurityType_CHACHA20_POLY1305
    }
    return sc.Type
}
 
func isDomainTooLong(domain string) bool {
    return len(domain) > 256
}