encoding_test.go 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160
  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. common.Must(client.EncodeRequestHeader(expectedRequest, buffer))
  41. buffer2 := buf.New()
  42. buffer2.Write(buffer.Bytes())
  43. sessionHistory := NewSessionHistory()
  44. defer common.Close(sessionHistory)
  45. userValidator := vmess.NewTimedUserValidator(protocol.DefaultIDHash)
  46. userValidator.Add(user)
  47. defer common.Close(userValidator)
  48. server := NewServerSession(userValidator, sessionHistory)
  49. actualRequest, err := server.DecodeRequestHeader(buffer)
  50. assert(err, IsNil)
  51. assert(expectedRequest.Version, Equals, actualRequest.Version)
  52. assert(byte(expectedRequest.Command), Equals, byte(actualRequest.Command))
  53. assert(byte(expectedRequest.Option), Equals, byte(actualRequest.Option))
  54. assert(expectedRequest.Address, Equals, actualRequest.Address)
  55. assert(expectedRequest.Port, Equals, actualRequest.Port)
  56. assert(byte(expectedRequest.Security), Equals, byte(actualRequest.Security))
  57. _, err = server.DecodeRequestHeader(buffer2)
  58. // anti replay attack
  59. assert(err, IsNotNil)
  60. }
  61. func TestInvalidRequest(t *testing.T) {
  62. assert := With(t)
  63. user := &protocol.MemoryUser{
  64. Level: 0,
  65. Email: "test@v2ray.com",
  66. }
  67. id := uuid.New()
  68. account := &vmess.Account{
  69. Id: id.String(),
  70. AlterId: 0,
  71. }
  72. user.Account = toAccount(account)
  73. expectedRequest := &protocol.RequestHeader{
  74. Version: 1,
  75. User: user,
  76. Command: protocol.RequestCommand(100),
  77. Address: net.DomainAddress("www.v2ray.com"),
  78. Port: net.Port(443),
  79. Security: protocol.SecurityType_AES128_GCM,
  80. }
  81. buffer := buf.New()
  82. client := NewClientSession(protocol.DefaultIDHash)
  83. common.Must(client.EncodeRequestHeader(expectedRequest, buffer))
  84. buffer2 := buf.New()
  85. buffer2.Write(buffer.Bytes())
  86. sessionHistory := NewSessionHistory()
  87. defer common.Close(sessionHistory)
  88. userValidator := vmess.NewTimedUserValidator(protocol.DefaultIDHash)
  89. userValidator.Add(user)
  90. defer common.Close(userValidator)
  91. server := NewServerSession(userValidator, sessionHistory)
  92. _, err := server.DecodeRequestHeader(buffer)
  93. assert(err, IsNotNil)
  94. }
  95. func TestMuxRequest(t *testing.T) {
  96. assert := With(t)
  97. user := &protocol.MemoryUser{
  98. Level: 0,
  99. Email: "test@v2ray.com",
  100. }
  101. id := uuid.New()
  102. account := &vmess.Account{
  103. Id: id.String(),
  104. AlterId: 0,
  105. }
  106. user.Account = toAccount(account)
  107. expectedRequest := &protocol.RequestHeader{
  108. Version: 1,
  109. User: user,
  110. Command: protocol.RequestCommandMux,
  111. Security: protocol.SecurityType_AES128_GCM,
  112. }
  113. buffer := buf.New()
  114. client := NewClientSession(protocol.DefaultIDHash)
  115. common.Must(client.EncodeRequestHeader(expectedRequest, buffer))
  116. buffer2 := buf.New()
  117. buffer2.Write(buffer.Bytes())
  118. sessionHistory := NewSessionHistory()
  119. defer common.Close(sessionHistory)
  120. userValidator := vmess.NewTimedUserValidator(protocol.DefaultIDHash)
  121. userValidator.Add(user)
  122. defer common.Close(userValidator)
  123. server := NewServerSession(userValidator, sessionHistory)
  124. actualRequest, err := server.DecodeRequestHeader(buffer)
  125. assert(err, IsNil)
  126. assert(expectedRequest.Version, Equals, actualRequest.Version)
  127. assert(byte(expectedRequest.Command), Equals, byte(actualRequest.Command))
  128. assert(byte(expectedRequest.Option), Equals, byte(actualRequest.Option))
  129. assert(byte(expectedRequest.Security), Equals, byte(actualRequest.Security))
  130. }