encoding_test.go 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153
  1. package encoding_test
  2. import (
  3. "context"
  4. "testing"
  5. "github.com/google/go-cmp/cmp"
  6. "github.com/xtls/xray-core/common"
  7. "github.com/xtls/xray-core/common/buf"
  8. "github.com/xtls/xray-core/common/net"
  9. "github.com/xtls/xray-core/common/protocol"
  10. "github.com/xtls/xray-core/common/uuid"
  11. "github.com/xtls/xray-core/proxy/vmess"
  12. . "github.com/xtls/xray-core/proxy/vmess/encoding"
  13. )
  14. func toAccount(a *vmess.Account) protocol.Account {
  15. account, err := a.AsAccount()
  16. common.Must(err)
  17. return account
  18. }
  19. func TestRequestSerialization(t *testing.T) {
  20. user := &protocol.MemoryUser{
  21. Level: 0,
  22. Email: "[email protected]",
  23. }
  24. id := uuid.New()
  25. account := &vmess.Account{
  26. Id: id.String(),
  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.example.com"),
  34. Port: net.Port(443),
  35. Security: protocol.SecurityType_AES128_GCM,
  36. }
  37. buffer := buf.New()
  38. client := NewClientSession(context.TODO(), 0)
  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()
  45. userValidator.Add(user)
  46. defer common.Close(userValidator)
  47. server := NewServerSession(userValidator, sessionHistory)
  48. actualRequest, err := server.DecodeRequestHeader(buffer, false)
  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, false)
  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: "[email protected]",
  63. }
  64. id := uuid.New()
  65. account := &vmess.Account{
  66. Id: id.String(),
  67. }
  68. user.Account = toAccount(account)
  69. expectedRequest := &protocol.RequestHeader{
  70. Version: 1,
  71. User: user,
  72. Command: protocol.RequestCommand(100),
  73. Address: net.DomainAddress("www.example.com"),
  74. Port: net.Port(443),
  75. Security: protocol.SecurityType_AES128_GCM,
  76. }
  77. buffer := buf.New()
  78. client := NewClientSession(context.TODO(), 0)
  79. common.Must(client.EncodeRequestHeader(expectedRequest, buffer))
  80. buffer2 := buf.New()
  81. buffer2.Write(buffer.Bytes())
  82. sessionHistory := NewSessionHistory()
  83. defer common.Close(sessionHistory)
  84. userValidator := vmess.NewTimedUserValidator()
  85. userValidator.Add(user)
  86. defer common.Close(userValidator)
  87. server := NewServerSession(userValidator, sessionHistory)
  88. _, err := server.DecodeRequestHeader(buffer, false)
  89. if err == nil {
  90. t.Error("nil error")
  91. }
  92. }
  93. func TestMuxRequest(t *testing.T) {
  94. user := &protocol.MemoryUser{
  95. Level: 0,
  96. Email: "[email protected]",
  97. }
  98. id := uuid.New()
  99. account := &vmess.Account{
  100. Id: id.String(),
  101. }
  102. user.Account = toAccount(account)
  103. expectedRequest := &protocol.RequestHeader{
  104. Version: 1,
  105. User: user,
  106. Command: protocol.RequestCommandMux,
  107. Security: protocol.SecurityType_AES128_GCM,
  108. Address: net.DomainAddress("v1.mux.cool"),
  109. }
  110. buffer := buf.New()
  111. client := NewClientSession(context.TODO(), 0)
  112. common.Must(client.EncodeRequestHeader(expectedRequest, buffer))
  113. buffer2 := buf.New()
  114. buffer2.Write(buffer.Bytes())
  115. sessionHistory := NewSessionHistory()
  116. defer common.Close(sessionHistory)
  117. userValidator := vmess.NewTimedUserValidator()
  118. userValidator.Add(user)
  119. defer common.Close(userValidator)
  120. server := NewServerSession(userValidator, sessionHistory)
  121. actualRequest, err := server.DecodeRequestHeader(buffer, false)
  122. common.Must(err)
  123. if r := cmp.Diff(actualRequest, expectedRequest, cmp.AllowUnexported(protocol.ID{})); r != "" {
  124. t.Error(r)
  125. }
  126. }