auth_test.go 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136
  1. package crypto_test
  2. import (
  3. "crypto/aes"
  4. "crypto/cipher"
  5. "crypto/rand"
  6. "io"
  7. "testing"
  8. "v2ray.com/core/common/buf"
  9. . "v2ray.com/core/common/crypto"
  10. "v2ray.com/core/common/protocol"
  11. . "v2ray.com/ext/assert"
  12. )
  13. func TestAuthenticationReaderWriter(t *testing.T) {
  14. assert := With(t)
  15. key := make([]byte, 16)
  16. rand.Read(key)
  17. block, err := aes.NewCipher(key)
  18. assert(err, IsNil)
  19. aead, err := cipher.NewGCM(block)
  20. assert(err, IsNil)
  21. const payloadSize = 1024 * 80
  22. rawPayload := make([]byte, payloadSize)
  23. rand.Read(rawPayload)
  24. payload := buf.NewSize(payloadSize)
  25. payload.Append(rawPayload)
  26. assert(payload.Len(), Equals, int32(payloadSize))
  27. cache := buf.NewSize(160 * 1024)
  28. iv := make([]byte, 12)
  29. rand.Read(iv)
  30. writer := NewAuthenticationWriter(&AEADAuthenticator{
  31. AEAD: aead,
  32. NonceGenerator: &StaticBytesGenerator{
  33. Content: iv,
  34. },
  35. AdditionalDataGenerator: &NoOpBytesGenerator{},
  36. }, PlainChunkSizeParser{}, cache, protocol.TransferTypeStream)
  37. assert(writer.WriteMultiBuffer(buf.NewMultiBufferValue(payload)), IsNil)
  38. assert(cache.Len(), Equals, int32(82658))
  39. assert(writer.WriteMultiBuffer(buf.MultiBuffer{}), IsNil)
  40. reader := NewAuthenticationReader(&AEADAuthenticator{
  41. AEAD: aead,
  42. NonceGenerator: &StaticBytesGenerator{
  43. Content: iv,
  44. },
  45. AdditionalDataGenerator: &NoOpBytesGenerator{},
  46. }, PlainChunkSizeParser{}, cache, protocol.TransferTypeStream)
  47. var mb buf.MultiBuffer
  48. for mb.Len() < payloadSize {
  49. mb2, err := reader.ReadMultiBuffer()
  50. assert(err, IsNil)
  51. mb.AppendMulti(mb2)
  52. }
  53. assert(mb.Len(), Equals, int32(payloadSize))
  54. mbContent := make([]byte, payloadSize)
  55. mb.Read(mbContent)
  56. assert(mbContent, Equals, rawPayload)
  57. _, err = reader.ReadMultiBuffer()
  58. assert(err, Equals, io.EOF)
  59. }
  60. func TestAuthenticationReaderWriterPacket(t *testing.T) {
  61. assert := With(t)
  62. key := make([]byte, 16)
  63. rand.Read(key)
  64. block, err := aes.NewCipher(key)
  65. assert(err, IsNil)
  66. aead, err := cipher.NewGCM(block)
  67. assert(err, IsNil)
  68. cache := buf.NewSize(1024)
  69. iv := make([]byte, 12)
  70. rand.Read(iv)
  71. writer := NewAuthenticationWriter(&AEADAuthenticator{
  72. AEAD: aead,
  73. NonceGenerator: &StaticBytesGenerator{
  74. Content: iv,
  75. },
  76. AdditionalDataGenerator: &NoOpBytesGenerator{},
  77. }, PlainChunkSizeParser{}, cache, protocol.TransferTypePacket)
  78. var payload buf.MultiBuffer
  79. pb1 := buf.New()
  80. pb1.Append([]byte("abcd"))
  81. payload.Append(pb1)
  82. pb2 := buf.New()
  83. pb2.Append([]byte("efgh"))
  84. payload.Append(pb2)
  85. assert(writer.WriteMultiBuffer(payload), IsNil)
  86. assert(cache.Len(), GreaterThan, int32(0))
  87. assert(writer.WriteMultiBuffer(buf.MultiBuffer{}), IsNil)
  88. assert(err, IsNil)
  89. reader := NewAuthenticationReader(&AEADAuthenticator{
  90. AEAD: aead,
  91. NonceGenerator: &StaticBytesGenerator{
  92. Content: iv,
  93. },
  94. AdditionalDataGenerator: &NoOpBytesGenerator{},
  95. }, PlainChunkSizeParser{}, cache, protocol.TransferTypePacket)
  96. mb, err := reader.ReadMultiBuffer()
  97. assert(err, IsNil)
  98. b1 := mb.SplitFirst()
  99. assert(b1.String(), Equals, "abcd")
  100. b2 := mb.SplitFirst()
  101. assert(b2.String(), Equals, "efgh")
  102. assert(mb.IsEmpty(), IsTrue)
  103. _, err = reader.ReadMultiBuffer()
  104. assert(err, Equals, io.EOF)
  105. }