encoding_test.go 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157
  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. 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.example.com"),
  35. Port: net.Port(443),
  36. Security: protocol.SecurityType_AES128_GCM,
  37. }
  38. buffer := buf.New()
  39. client := NewClientSession(context.TODO(), true, 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, false)
  50. common.Must(err)
  51. if r := cmp.Diff(actualRequest, expectedRequest, cmp.AllowUnexported(protocol.ID{})); r != "" {
  52. t.Error(r)
  53. }
  54. _, err = server.DecodeRequestHeader(buffer2, false)
  55. // anti replay attack
  56. if err == nil {
  57. t.Error("nil error")
  58. }
  59. }
  60. func TestInvalidRequest(t *testing.T) {
  61. user := &protocol.MemoryUser{
  62. Level: 0,
  63. Email: "[email protected]",
  64. }
  65. id := uuid.New()
  66. account := &vmess.Account{
  67. Id: id.String(),
  68. AlterId: 0,
  69. }
  70. user.Account = toAccount(account)
  71. expectedRequest := &protocol.RequestHeader{
  72. Version: 1,
  73. User: user,
  74. Command: protocol.RequestCommand(100),
  75. Address: net.DomainAddress("www.example.com"),
  76. Port: net.Port(443),
  77. Security: protocol.SecurityType_AES128_GCM,
  78. }
  79. buffer := buf.New()
  80. client := NewClientSession(context.TODO(), true, protocol.DefaultIDHash)
  81. common.Must(client.EncodeRequestHeader(expectedRequest, buffer))
  82. buffer2 := buf.New()
  83. buffer2.Write(buffer.Bytes())
  84. sessionHistory := NewSessionHistory()
  85. defer common.Close(sessionHistory)
  86. userValidator := vmess.NewTimedUserValidator(protocol.DefaultIDHash)
  87. userValidator.Add(user)
  88. defer common.Close(userValidator)
  89. server := NewServerSession(userValidator, sessionHistory)
  90. _, err := server.DecodeRequestHeader(buffer, false)
  91. if err == nil {
  92. t.Error("nil error")
  93. }
  94. }
  95. func TestMuxRequest(t *testing.T) {
  96. user := &protocol.MemoryUser{
  97. Level: 0,
  98. Email: "[email protected]",
  99. }
  100. id := uuid.New()
  101. account := &vmess.Account{
  102. Id: id.String(),
  103. AlterId: 0,
  104. }
  105. user.Account = toAccount(account)
  106. expectedRequest := &protocol.RequestHeader{
  107. Version: 1,
  108. User: user,
  109. Command: protocol.RequestCommandMux,
  110. Security: protocol.SecurityType_AES128_GCM,
  111. Address: net.DomainAddress("v1.mux.cool"),
  112. }
  113. buffer := buf.New()
  114. client := NewClientSession(context.TODO(), true, 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, false)
  125. common.Must(err)
  126. if r := cmp.Diff(actualRequest, expectedRequest, cmp.AllowUnexported(protocol.ID{})); r != "" {
  127. t.Error(r)
  128. }
  129. }