encoding_test.go 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167
  1. package encoding_test
  2. import (
  3. "testing"
  4. "v2ray.com/core/common"
  5. "v2ray.com/core/common/buf"
  6. "v2ray.com/core/common/net"
  7. "v2ray.com/core/common/protocol"
  8. "v2ray.com/core/common/uuid"
  9. "v2ray.com/core/proxy/vmess"
  10. . "v2ray.com/core/proxy/vmess/encoding"
  11. . "v2ray.com/ext/assert"
  12. )
  13. func toAccount(a *vmess.Account) protocol.Account {
  14. account, err := a.AsAccount()
  15. common.Must(err)
  16. return account
  17. }
  18. func TestRequestSerialization(t *testing.T) {
  19. assert := With(t)
  20. user := &protocol.MemoryUser{
  21. Level: 0,
  22. Email: "test@v2ray.com",
  23. }
  24. id := uuid.New()
  25. account := &vmess.Account{
  26. Id: id.String(),
  27. AlterId: 0,
  28. }
  29. user.Account = toAccount(account)
  30. expectedRequest := &protocol.RequestHeader{
  31. Version: 1,
  32. User: user,
  33. Command: protocol.RequestCommandTCP,
  34. Address: net.DomainAddress("www.v2ray.com"),
  35. Port: net.Port(443),
  36. Security: protocol.SecurityType_AES128_GCM,
  37. }
  38. buffer := buf.New()
  39. client := NewClientSession(protocol.DefaultIDHash)
  40. defer ReleaseClientSession(client)
  41. common.Must(client.EncodeRequestHeader(expectedRequest, buffer))
  42. buffer2 := buf.New()
  43. buffer2.Write(buffer.Bytes())
  44. sessionHistory := NewSessionHistory()
  45. defer common.Close(sessionHistory)
  46. userValidator := vmess.NewTimedUserValidator(protocol.DefaultIDHash)
  47. userValidator.Add(user)
  48. defer common.Close(userValidator)
  49. server := NewServerSession(userValidator, sessionHistory)
  50. defer ReleaseServerSession(server)
  51. actualRequest, err := server.DecodeRequestHeader(buffer)
  52. assert(err, IsNil)
  53. assert(expectedRequest.Version, Equals, actualRequest.Version)
  54. assert(byte(expectedRequest.Command), Equals, byte(actualRequest.Command))
  55. assert(byte(expectedRequest.Option), Equals, byte(actualRequest.Option))
  56. assert(expectedRequest.Address, Equals, actualRequest.Address)
  57. assert(expectedRequest.Port, Equals, actualRequest.Port)
  58. assert(byte(expectedRequest.Security), Equals, byte(actualRequest.Security))
  59. _, err = server.DecodeRequestHeader(buffer2)
  60. // anti replay attack
  61. assert(err, IsNotNil)
  62. }
  63. func TestInvalidRequest(t *testing.T) {
  64. assert := With(t)
  65. user := &protocol.MemoryUser{
  66. Level: 0,
  67. Email: "test@v2ray.com",
  68. }
  69. id := uuid.New()
  70. account := &vmess.Account{
  71. Id: id.String(),
  72. AlterId: 0,
  73. }
  74. user.Account = toAccount(account)
  75. expectedRequest := &protocol.RequestHeader{
  76. Version: 1,
  77. User: user,
  78. Command: protocol.RequestCommand(100),
  79. Address: net.DomainAddress("www.v2ray.com"),
  80. Port: net.Port(443),
  81. Security: protocol.SecurityType_AES128_GCM,
  82. }
  83. buffer := buf.New()
  84. client := NewClientSession(protocol.DefaultIDHash)
  85. defer ReleaseClientSession(client)
  86. common.Must(client.EncodeRequestHeader(expectedRequest, buffer))
  87. buffer2 := buf.New()
  88. buffer2.Write(buffer.Bytes())
  89. sessionHistory := NewSessionHistory()
  90. defer common.Close(sessionHistory)
  91. userValidator := vmess.NewTimedUserValidator(protocol.DefaultIDHash)
  92. userValidator.Add(user)
  93. defer common.Close(userValidator)
  94. server := NewServerSession(userValidator, sessionHistory)
  95. defer ReleaseServerSession(server)
  96. _, err := server.DecodeRequestHeader(buffer)
  97. assert(err, IsNotNil)
  98. }
  99. func TestMuxRequest(t *testing.T) {
  100. assert := With(t)
  101. user := &protocol.MemoryUser{
  102. Level: 0,
  103. Email: "test@v2ray.com",
  104. }
  105. id := uuid.New()
  106. account := &vmess.Account{
  107. Id: id.String(),
  108. AlterId: 0,
  109. }
  110. user.Account = toAccount(account)
  111. expectedRequest := &protocol.RequestHeader{
  112. Version: 1,
  113. User: user,
  114. Command: protocol.RequestCommandMux,
  115. Security: protocol.SecurityType_AES128_GCM,
  116. }
  117. buffer := buf.New()
  118. client := NewClientSession(protocol.DefaultIDHash)
  119. common.Must(client.EncodeRequestHeader(expectedRequest, buffer))
  120. buffer2 := buf.New()
  121. buffer2.Write(buffer.Bytes())
  122. sessionHistory := NewSessionHistory()
  123. defer common.Close(sessionHistory)
  124. userValidator := vmess.NewTimedUserValidator(protocol.DefaultIDHash)
  125. userValidator.Add(user)
  126. defer common.Close(userValidator)
  127. server := NewServerSession(userValidator, sessionHistory)
  128. defer ReleaseServerSession(server)
  129. actualRequest, err := server.DecodeRequestHeader(buffer)
  130. assert(err, IsNil)
  131. assert(expectedRequest.Version, Equals, actualRequest.Version)
  132. assert(byte(expectedRequest.Command), Equals, byte(actualRequest.Command))
  133. assert(byte(expectedRequest.Option), Equals, byte(actualRequest.Option))
  134. assert(byte(expectedRequest.Security), Equals, byte(actualRequest.Security))
  135. }