vmessin.go 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119
  1. package vmess
  2. import (
  3. "crypto/md5"
  4. "io"
  5. "net"
  6. "github.com/v2ray/v2ray-core"
  7. v2io "github.com/v2ray/v2ray-core/io"
  8. vmessio "github.com/v2ray/v2ray-core/io/vmess"
  9. )
  10. type VMessInboundHandler struct {
  11. vPoint *core.VPoint
  12. accepting bool
  13. }
  14. func NewVMessInboundHandler(vp *core.VPoint) *VMessInboundHandler {
  15. handler := new(VMessInboundHandler)
  16. handler.vPoint = vp
  17. return handler
  18. }
  19. func (handler *VMessInboundHandler) Listen(port uint8) error {
  20. listener, err := net.Listen("tcp", ":"+string(port))
  21. if err != nil {
  22. return err
  23. }
  24. handler.accepting = true
  25. go handler.AcceptConnections(listener)
  26. return nil
  27. }
  28. func (handler *VMessInboundHandler) AcceptConnections(listener net.Listener) error {
  29. for handler.accepting {
  30. connection, err := listener.Accept()
  31. if err != nil {
  32. return err
  33. }
  34. go handler.HandleConnection(connection)
  35. }
  36. return nil
  37. }
  38. func (handler *VMessInboundHandler) HandleConnection(connection net.Conn) error {
  39. defer connection.Close()
  40. reader := vmessio.NewVMessRequestReader(handler.vPoint.UserSet)
  41. request, err := reader.Read(connection)
  42. if err != nil {
  43. return err
  44. }
  45. response := vmessio.NewVMessResponse(request)
  46. connection.Write(response[:])
  47. requestKey := request.RequestKey()
  48. requestIV := request.RequestIV()
  49. responseKey := md5.Sum(requestKey)
  50. responseIV := md5.Sum(requestIV)
  51. requestReader, err := v2io.NewAesDecryptReader(requestKey, requestIV, connection)
  52. if err != nil {
  53. return err
  54. }
  55. responseWriter, err := v2io.NewAesEncryptWriter(responseKey[:], responseIV[:], connection)
  56. if err != nil {
  57. return err
  58. }
  59. ray := handler.vPoint.NewInboundConnectionAccepted(request.Destination())
  60. input := ray.InboundInput()
  61. output := ray.InboundOutput()
  62. finish := make(chan bool, 2)
  63. go handler.dumpInput(requestReader, input, finish)
  64. go handler.dumpOutput(responseWriter, output, finish)
  65. handler.waitForFinish(finish)
  66. return nil
  67. }
  68. func (handler *VMessInboundHandler) dumpInput(reader io.Reader, input chan<- []byte, finish chan<- bool) {
  69. for {
  70. buffer := make([]byte, BufferSize)
  71. nBytes, err := reader.Read(buffer)
  72. if err == io.EOF {
  73. finish <- true
  74. break
  75. }
  76. input <- buffer[:nBytes]
  77. }
  78. }
  79. func (handler *VMessInboundHandler) dumpOutput(writer io.Writer, output <-chan []byte, finish chan<- bool) {
  80. for {
  81. buffer, open := <-output
  82. if !open {
  83. finish <- true
  84. break
  85. }
  86. writer.Write(buffer)
  87. }
  88. }
  89. func (handler *VMessInboundHandler) waitForFinish(finish <-chan bool) {
  90. for i := 0; i < 2; i++ {
  91. <-finish
  92. }
  93. }
  94. type VMessInboundHandlerFactory struct {
  95. }
  96. func (factory *VMessInboundHandlerFactory) Create(vp *core.VPoint) *VMessInboundHandler {
  97. return NewVMessInboundHandler(vp)
  98. }