auth_test.go 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134
  1. package crypto_test
  2. import (
  3. "bytes"
  4. "crypto/rand"
  5. "io"
  6. "testing"
  7. "github.com/google/go-cmp/cmp"
  8. "github.com/xtls/xray-core/common"
  9. "github.com/xtls/xray-core/common/buf"
  10. . "github.com/xtls/xray-core/common/crypto"
  11. "github.com/xtls/xray-core/common/protocol"
  12. )
  13. func TestAuthenticationReaderWriter(t *testing.T) {
  14. key := make([]byte, 16)
  15. rand.Read(key)
  16. aead := NewAesGcm(key)
  17. const payloadSize = 1024 * 80
  18. rawPayload := make([]byte, payloadSize)
  19. rand.Read(rawPayload)
  20. payload := buf.MergeBytes(nil, rawPayload)
  21. cache := bytes.NewBuffer(nil)
  22. iv := make([]byte, 12)
  23. rand.Read(iv)
  24. writer := NewAuthenticationWriter(&AEADAuthenticator{
  25. AEAD: aead,
  26. NonceGenerator: GenerateStaticBytes(iv),
  27. AdditionalDataGenerator: GenerateEmptyBytes(),
  28. }, PlainChunkSizeParser{}, cache, protocol.TransferTypeStream, nil)
  29. common.Must(writer.WriteMultiBuffer(payload))
  30. if cache.Len() <= 1024*80 {
  31. t.Error("cache len: ", cache.Len())
  32. }
  33. common.Must(writer.WriteMultiBuffer(buf.MultiBuffer{}))
  34. reader := NewAuthenticationReader(&AEADAuthenticator{
  35. AEAD: aead,
  36. NonceGenerator: GenerateStaticBytes(iv),
  37. AdditionalDataGenerator: GenerateEmptyBytes(),
  38. }, PlainChunkSizeParser{}, cache, protocol.TransferTypeStream, nil)
  39. var mb buf.MultiBuffer
  40. for mb.Len() < payloadSize {
  41. mb2, err := reader.ReadMultiBuffer()
  42. common.Must(err)
  43. mb, _ = buf.MergeMulti(mb, mb2)
  44. }
  45. if mb.Len() != payloadSize {
  46. t.Error("mb len: ", mb.Len())
  47. }
  48. mbContent := make([]byte, payloadSize)
  49. buf.SplitBytes(mb, mbContent)
  50. if r := cmp.Diff(mbContent, rawPayload); r != "" {
  51. t.Error(r)
  52. }
  53. _, err := reader.ReadMultiBuffer()
  54. if err != io.EOF {
  55. t.Error("error: ", err)
  56. }
  57. }
  58. func TestAuthenticationReaderWriterPacket(t *testing.T) {
  59. key := make([]byte, 16)
  60. common.Must2(rand.Read(key))
  61. aead := NewAesGcm(key)
  62. cache := buf.New()
  63. iv := make([]byte, 12)
  64. rand.Read(iv)
  65. writer := NewAuthenticationWriter(&AEADAuthenticator{
  66. AEAD: aead,
  67. NonceGenerator: GenerateStaticBytes(iv),
  68. AdditionalDataGenerator: GenerateEmptyBytes(),
  69. }, PlainChunkSizeParser{}, cache, protocol.TransferTypePacket, nil)
  70. var payload buf.MultiBuffer
  71. pb1 := buf.New()
  72. pb1.Write([]byte("abcd"))
  73. payload = append(payload, pb1)
  74. pb2 := buf.New()
  75. pb2.Write([]byte("efgh"))
  76. payload = append(payload, pb2)
  77. common.Must(writer.WriteMultiBuffer(payload))
  78. if cache.Len() == 0 {
  79. t.Error("cache len: ", cache.Len())
  80. }
  81. common.Must(writer.WriteMultiBuffer(buf.MultiBuffer{}))
  82. reader := NewAuthenticationReader(&AEADAuthenticator{
  83. AEAD: aead,
  84. NonceGenerator: GenerateStaticBytes(iv),
  85. AdditionalDataGenerator: GenerateEmptyBytes(),
  86. }, PlainChunkSizeParser{}, cache, protocol.TransferTypePacket, nil)
  87. mb, err := reader.ReadMultiBuffer()
  88. common.Must(err)
  89. mb, b1 := buf.SplitFirst(mb)
  90. if b1.String() != "abcd" {
  91. t.Error("b1: ", b1.String())
  92. }
  93. mb, b2 := buf.SplitFirst(mb)
  94. if b2.String() != "efgh" {
  95. t.Error("b2: ", b2.String())
  96. }
  97. if !mb.IsEmpty() {
  98. t.Error("not empty")
  99. }
  100. _, err = reader.ReadMultiBuffer()
  101. if err != io.EOF {
  102. t.Error("error: ", err)
  103. }
  104. }