protocol.go 7.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316
  1. package trojan
  2. import (
  3. "encoding/binary"
  4. "io"
  5. gonet "net"
  6. "sync"
  7. "github.com/v2fly/v2ray-core/v5/common/buf"
  8. "github.com/v2fly/v2ray-core/v5/common/net"
  9. "github.com/v2fly/v2ray-core/v5/common/protocol"
  10. )
  11. var (
  12. crlf = []byte{'\r', '\n'}
  13. addrParser = protocol.NewAddressParser(
  14. protocol.AddressFamilyByte(0x01, net.AddressFamilyIPv4),
  15. protocol.AddressFamilyByte(0x04, net.AddressFamilyIPv6),
  16. protocol.AddressFamilyByte(0x03, net.AddressFamilyDomain),
  17. )
  18. )
  19. const (
  20. maxLength = 8192
  21. commandTCP byte = 1
  22. commandUDP byte = 3
  23. )
  24. // ConnWriter is TCP Connection Writer Wrapper for trojan protocol
  25. type ConnWriter struct {
  26. io.Writer
  27. Target net.Destination
  28. Account *MemoryAccount
  29. headerSent bool
  30. }
  31. // Write implements io.Writer
  32. func (c *ConnWriter) Write(p []byte) (n int, err error) {
  33. if !c.headerSent {
  34. if err := c.writeHeader(); err != nil {
  35. return 0, newError("failed to write request header").Base(err)
  36. }
  37. }
  38. return c.Writer.Write(p)
  39. }
  40. // WriteMultiBuffer implements buf.Writer
  41. func (c *ConnWriter) WriteMultiBuffer(mb buf.MultiBuffer) error {
  42. defer buf.ReleaseMulti(mb)
  43. for _, b := range mb {
  44. if !b.IsEmpty() {
  45. if _, err := c.Write(b.Bytes()); err != nil {
  46. return err
  47. }
  48. }
  49. }
  50. return nil
  51. }
  52. func (c *ConnWriter) writeHeader() error {
  53. buffer := buf.StackNew()
  54. defer buffer.Release()
  55. command := commandTCP
  56. if c.Target.Network == net.Network_UDP {
  57. command = commandUDP
  58. }
  59. if _, err := buffer.Write(c.Account.Key); err != nil {
  60. return err
  61. }
  62. if _, err := buffer.Write(crlf); err != nil {
  63. return err
  64. }
  65. if err := buffer.WriteByte(command); err != nil {
  66. return err
  67. }
  68. if err := addrParser.WriteAddressPort(&buffer, c.Target.Address, c.Target.Port); err != nil {
  69. return err
  70. }
  71. if _, err := buffer.Write(crlf); err != nil {
  72. return err
  73. }
  74. _, err := c.Writer.Write(buffer.Bytes())
  75. if err == nil {
  76. c.headerSent = true
  77. }
  78. return err
  79. }
  80. // PacketWriter UDP Connection Writer Wrapper for trojan protocol
  81. type PacketWriter struct {
  82. io.Writer
  83. Target net.Destination
  84. }
  85. // WriteMultiBuffer implements buf.Writer
  86. func (w *PacketWriter) WriteMultiBuffer(mb buf.MultiBuffer) error {
  87. b := make([]byte, maxLength)
  88. for !mb.IsEmpty() {
  89. var length int
  90. mb, length = buf.SplitBytes(mb, b)
  91. if _, err := w.writePacket(b[:length], w.Target); err != nil {
  92. buf.ReleaseMulti(mb)
  93. return err
  94. }
  95. }
  96. return nil
  97. }
  98. // WriteMultiBufferWithMetadata writes udp packet with destination specified
  99. func (w *PacketWriter) WriteMultiBufferWithMetadata(mb buf.MultiBuffer, dest net.Destination) error {
  100. b := make([]byte, maxLength)
  101. for !mb.IsEmpty() {
  102. var length int
  103. mb, length = buf.SplitBytes(mb, b)
  104. if _, err := w.writePacket(b[:length], dest); err != nil {
  105. buf.ReleaseMulti(mb)
  106. return err
  107. }
  108. }
  109. return nil
  110. }
  111. func (w *PacketWriter) WriteTo(payload []byte, addr gonet.Addr) (int, error) {
  112. dest := net.DestinationFromAddr(addr)
  113. return w.writePacket(payload, dest)
  114. }
  115. func (w *PacketWriter) writePacket(payload []byte, dest net.Destination) (int, error) { // nolint: unparam
  116. buffer := buf.StackNew()
  117. defer buffer.Release()
  118. length := len(payload)
  119. lengthBuf := [2]byte{}
  120. binary.BigEndian.PutUint16(lengthBuf[:], uint16(length))
  121. if err := addrParser.WriteAddressPort(&buffer, dest.Address, dest.Port); err != nil {
  122. return 0, err
  123. }
  124. if _, err := buffer.Write(lengthBuf[:]); err != nil {
  125. return 0, err
  126. }
  127. if _, err := buffer.Write(crlf); err != nil {
  128. return 0, err
  129. }
  130. if _, err := buffer.Write(payload); err != nil {
  131. return 0, err
  132. }
  133. _, err := w.Write(buffer.Bytes())
  134. if err != nil {
  135. return 0, err
  136. }
  137. return length, nil
  138. }
  139. // ConnReader is TCP Connection Reader Wrapper for trojan protocol
  140. type ConnReader struct {
  141. io.Reader
  142. Target net.Destination
  143. headerParsed bool
  144. }
  145. // ParseHeader parses the trojan protocol header
  146. func (c *ConnReader) ParseHeader() error {
  147. var crlf [2]byte
  148. var command [1]byte
  149. var hash [56]byte
  150. if _, err := io.ReadFull(c.Reader, hash[:]); err != nil {
  151. return newError("failed to read user hash").Base(err)
  152. }
  153. if _, err := io.ReadFull(c.Reader, crlf[:]); err != nil {
  154. return newError("failed to read crlf").Base(err)
  155. }
  156. if _, err := io.ReadFull(c.Reader, command[:]); err != nil {
  157. return newError("failed to read command").Base(err)
  158. }
  159. network := net.Network_TCP
  160. if command[0] == commandUDP {
  161. network = net.Network_UDP
  162. }
  163. addr, port, err := addrParser.ReadAddressPort(nil, c.Reader)
  164. if err != nil {
  165. return newError("failed to read address and port").Base(err)
  166. }
  167. c.Target = net.Destination{Network: network, Address: addr, Port: port}
  168. if _, err := io.ReadFull(c.Reader, crlf[:]); err != nil {
  169. return newError("failed to read crlf").Base(err)
  170. }
  171. c.headerParsed = true
  172. return nil
  173. }
  174. // Read implements io.Reader
  175. func (c *ConnReader) Read(p []byte) (int, error) {
  176. if !c.headerParsed {
  177. if err := c.ParseHeader(); err != nil {
  178. return 0, err
  179. }
  180. }
  181. return c.Reader.Read(p)
  182. }
  183. // ReadMultiBuffer implements buf.Reader
  184. func (c *ConnReader) ReadMultiBuffer() (buf.MultiBuffer, error) {
  185. b := buf.New()
  186. _, err := b.ReadFrom(c)
  187. return buf.MultiBuffer{b}, err
  188. }
  189. // PacketPayload combines udp payload and destination
  190. type PacketPayload struct {
  191. Target net.Destination
  192. Buffer buf.MultiBuffer
  193. }
  194. // PacketReader is UDP Connection Reader Wrapper for trojan protocol
  195. type PacketReader struct {
  196. io.Reader
  197. }
  198. // ReadMultiBuffer implements buf.Reader
  199. func (r *PacketReader) ReadMultiBuffer() (buf.MultiBuffer, error) {
  200. p, err := r.ReadMultiBufferWithMetadata()
  201. if p != nil {
  202. return p.Buffer, err
  203. }
  204. return nil, err
  205. }
  206. // ReadMultiBufferWithMetadata reads udp packet with destination
  207. func (r *PacketReader) ReadMultiBufferWithMetadata() (*PacketPayload, error) {
  208. addr, port, err := addrParser.ReadAddressPort(nil, r)
  209. if err != nil {
  210. return nil, newError("failed to read address and port").Base(err)
  211. }
  212. var lengthBuf [2]byte
  213. if _, err := io.ReadFull(r, lengthBuf[:]); err != nil {
  214. return nil, newError("failed to read payload length").Base(err)
  215. }
  216. remain := int(binary.BigEndian.Uint16(lengthBuf[:]))
  217. if remain > maxLength {
  218. return nil, newError("oversize payload")
  219. }
  220. var crlf [2]byte
  221. if _, err := io.ReadFull(r, crlf[:]); err != nil {
  222. return nil, newError("failed to read crlf").Base(err)
  223. }
  224. dest := net.UDPDestination(addr, port)
  225. var mb buf.MultiBuffer
  226. for remain > 0 {
  227. length := buf.Size
  228. if remain < length {
  229. length = remain
  230. }
  231. b := buf.New()
  232. mb = append(mb, b)
  233. n, err := b.ReadFullFrom(r, int32(length))
  234. if err != nil {
  235. buf.ReleaseMulti(mb)
  236. return nil, newError("failed to read payload").Base(err)
  237. }
  238. remain -= int(n)
  239. }
  240. return &PacketPayload{Target: dest, Buffer: mb}, nil
  241. }
  242. type PacketConnectionReader struct {
  243. readerAccess *sync.Mutex
  244. reader *PacketReader
  245. payload *PacketPayload
  246. }
  247. func (r *PacketConnectionReader) ReadFrom(p []byte) (n int, addr gonet.Addr, err error) {
  248. r.readerAccess.Lock()
  249. defer r.readerAccess.Unlock()
  250. if r.payload == nil || r.payload.Buffer.IsEmpty() {
  251. r.payload, err = r.reader.ReadMultiBufferWithMetadata()
  252. if err != nil {
  253. return
  254. }
  255. }
  256. addr = &gonet.UDPAddr{
  257. IP: r.payload.Target.Address.IP(),
  258. Port: int(r.payload.Target.Port),
  259. }
  260. r.payload.Buffer, n = buf.SplitFirstBytes(r.payload.Buffer, p)
  261. return
  262. }