encoding_test.go 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156
  1. package encoding_test
  2. import (
  3. "testing"
  4. "github.com/google/go-cmp/cmp"
  5. "v2ray.com/core/common"
  6. "v2ray.com/core/common/buf"
  7. "v2ray.com/core/common/net"
  8. "v2ray.com/core/common/protocol"
  9. "v2ray.com/core/common/uuid"
  10. "v2ray.com/core/proxy/vmess"
  11. . "v2ray.com/core/proxy/vmess/encoding"
  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. user := &protocol.MemoryUser{
  20. Level: 0,
  21. Email: "test@v2ray.com",
  22. }
  23. id := uuid.New()
  24. account := &vmess.Account{
  25. Id: id.String(),
  26. AlterId: 0,
  27. }
  28. user.Account = toAccount(account)
  29. expectedRequest := &protocol.RequestHeader{
  30. Version: 1,
  31. User: user,
  32. Command: protocol.RequestCommandTCP,
  33. Address: net.DomainAddress("www.v2ray.com"),
  34. Port: net.Port(443),
  35. Security: protocol.SecurityType_AES128_GCM,
  36. }
  37. buffer := buf.New()
  38. client := NewClientSession(protocol.DefaultIDHash)
  39. common.Must(client.EncodeRequestHeader(expectedRequest, buffer))
  40. buffer2 := buf.New()
  41. buffer2.Write(buffer.Bytes())
  42. sessionHistory := NewSessionHistory()
  43. defer common.Close(sessionHistory)
  44. userValidator := vmess.NewTimedUserValidator(protocol.DefaultIDHash)
  45. userValidator.Add(user)
  46. defer common.Close(userValidator)
  47. server := NewServerSession(userValidator, sessionHistory)
  48. actualRequest, err := server.DecodeRequestHeader(buffer)
  49. common.Must(err)
  50. if r := cmp.Diff(actualRequest, expectedRequest, cmp.AllowUnexported(protocol.ID{})); r != "" {
  51. t.Error(r)
  52. }
  53. _, err = server.DecodeRequestHeader(buffer2)
  54. // anti replay attack
  55. if err == nil {
  56. t.Error("nil error")
  57. }
  58. }
  59. func TestInvalidRequest(t *testing.T) {
  60. user := &protocol.MemoryUser{
  61. Level: 0,
  62. Email: "test@v2ray.com",
  63. }
  64. id := uuid.New()
  65. account := &vmess.Account{
  66. Id: id.String(),
  67. AlterId: 0,
  68. }
  69. user.Account = toAccount(account)
  70. expectedRequest := &protocol.RequestHeader{
  71. Version: 1,
  72. User: user,
  73. Command: protocol.RequestCommand(100),
  74. Address: net.DomainAddress("www.v2ray.com"),
  75. Port: net.Port(443),
  76. Security: protocol.SecurityType_AES128_GCM,
  77. }
  78. buffer := buf.New()
  79. client := NewClientSession(protocol.DefaultIDHash)
  80. common.Must(client.EncodeRequestHeader(expectedRequest, buffer))
  81. buffer2 := buf.New()
  82. buffer2.Write(buffer.Bytes())
  83. sessionHistory := NewSessionHistory()
  84. defer common.Close(sessionHistory)
  85. userValidator := vmess.NewTimedUserValidator(protocol.DefaultIDHash)
  86. userValidator.Add(user)
  87. defer common.Close(userValidator)
  88. server := NewServerSession(userValidator, sessionHistory)
  89. _, err := server.DecodeRequestHeader(buffer)
  90. if err == nil {
  91. t.Error("nil error")
  92. }
  93. }
  94. func TestMuxRequest(t *testing.T) {
  95. user := &protocol.MemoryUser{
  96. Level: 0,
  97. Email: "test@v2ray.com",
  98. }
  99. id := uuid.New()
  100. account := &vmess.Account{
  101. Id: id.String(),
  102. AlterId: 0,
  103. }
  104. user.Account = toAccount(account)
  105. expectedRequest := &protocol.RequestHeader{
  106. Version: 1,
  107. User: user,
  108. Command: protocol.RequestCommandMux,
  109. Security: protocol.SecurityType_AES128_GCM,
  110. Address: net.DomainAddress("v1.mux.cool"),
  111. }
  112. buffer := buf.New()
  113. client := NewClientSession(protocol.DefaultIDHash)
  114. common.Must(client.EncodeRequestHeader(expectedRequest, buffer))
  115. buffer2 := buf.New()
  116. buffer2.Write(buffer.Bytes())
  117. sessionHistory := NewSessionHistory()
  118. defer common.Close(sessionHistory)
  119. userValidator := vmess.NewTimedUserValidator(protocol.DefaultIDHash)
  120. userValidator.Add(user)
  121. defer common.Close(userValidator)
  122. server := NewServerSession(userValidator, sessionHistory)
  123. actualRequest, err := server.DecodeRequestHeader(buffer)
  124. common.Must(err)
  125. if r := cmp.Diff(actualRequest, expectedRequest, cmp.AllowUnexported(protocol.ID{})); r != "" {
  126. t.Error(r)
  127. }
  128. }