Highly-opinionated (ex-bullshit-free) MTPROTO proxy for Telegram. If you use v1.0 or upgrade broke you proxy, please read the chapter Version 2
您最多选择25个主题 主题必须以字母或数字开头,可以包含连字符 (-),并且长度不得超过35个字符

server_side_test.go 4.1KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156
  1. package fake_test
  2. import (
  3. "bytes"
  4. "crypto/hmac"
  5. "crypto/rand"
  6. "crypto/sha256"
  7. "testing"
  8. "github.com/9seconds/mtg/v2/mtglib"
  9. "github.com/9seconds/mtg/v2/mtglib/internal/tls"
  10. "github.com/9seconds/mtg/v2/mtglib/internal/tls/fake"
  11. "github.com/stretchr/testify/suite"
  12. )
  13. type SendServerHelloTestSuite struct {
  14. suite.Suite
  15. hello *fake.ClientHello
  16. buf *bytes.Buffer
  17. secret mtglib.Secret
  18. }
  19. func (suite *SendServerHelloTestSuite) SetupTest() {
  20. suite.hello = &fake.ClientHello{
  21. CipherSuite: 4867,
  22. SessionID: make([]byte, 32),
  23. }
  24. _, err := rand.Read(suite.hello.SessionID)
  25. suite.NoError(err)
  26. _, err = rand.Read(suite.hello.Random[:])
  27. suite.NoError(err)
  28. suite.buf = &bytes.Buffer{}
  29. suite.secret = mtglib.GenerateSecret("google.com")
  30. }
  31. func (suite *SendServerHelloTestSuite) TestRecordStructure() {
  32. err := fake.SendServerHello(suite.buf, suite.secret.Key[:], suite.hello, fake.NoiseParams{})
  33. suite.NoError(err)
  34. var rec bytes.Buffer
  35. recordType, _, err := tls.ReadRecord(suite.buf, &rec)
  36. suite.NoError(err)
  37. suite.Equal(byte(tls.TypeHandshake), recordType)
  38. rec.Reset()
  39. recordType, _, err = tls.ReadRecord(suite.buf, &rec)
  40. suite.NoError(err)
  41. suite.Equal(byte(tls.TypeChangeCipherSpec), recordType)
  42. rec.Reset()
  43. recordType, length, err := tls.ReadRecord(suite.buf, &rec)
  44. suite.NoError(err)
  45. suite.Equal(byte(tls.TypeApplicationData), recordType)
  46. suite.Greater(length, int64(2500))
  47. suite.Empty(suite.buf.Bytes())
  48. }
  49. func (suite *SendServerHelloTestSuite) TestHMAC() {
  50. err := fake.SendServerHello(suite.buf, suite.secret.Key[:], suite.hello, fake.NoiseParams{})
  51. suite.NoError(err)
  52. packet := make([]byte, suite.buf.Len())
  53. copy(packet, suite.buf.Bytes())
  54. random := make([]byte, fake.RandomLen)
  55. copy(random, packet[fake.RandomOffset:])
  56. copy(packet[fake.RandomOffset:], make([]byte, fake.RandomLen))
  57. mac := hmac.New(sha256.New, suite.secret.Key[:])
  58. mac.Write(suite.hello.Random[:])
  59. mac.Write(packet)
  60. suite.Equal(random, mac.Sum(nil))
  61. }
  62. func (suite *SendServerHelloTestSuite) TestHandshakePayload() {
  63. err := fake.SendServerHello(suite.buf, suite.secret.Key[:], suite.hello, fake.NoiseParams{})
  64. suite.NoError(err)
  65. packet := suite.buf.Bytes()
  66. // TLS record header: type(1) + version(2) + length(2)
  67. suite.Equal(byte(tls.TypeHandshake), packet[0])
  68. suite.Equal([]byte{3, 3}, packet[1:3])
  69. // Handshake header: type(1) + uint24_length(3)
  70. suite.Equal(byte(fake.TypeHandshakeServer), packet[5])
  71. // ServerHello version
  72. suite.Equal([]byte{3, 3}, packet[9:11])
  73. // Session ID
  74. sessionIDOffset := fake.RandomOffset + fake.RandomLen
  75. suite.Equal(byte(len(suite.hello.SessionID)), packet[sessionIDOffset])
  76. suite.Equal(suite.hello.SessionID, packet[sessionIDOffset+1:sessionIDOffset+1+len(suite.hello.SessionID)])
  77. }
  78. func (suite *SendServerHelloTestSuite) TestChangeCipherSpec() {
  79. err := fake.SendServerHello(suite.buf, suite.secret.Key[:], suite.hello, fake.NoiseParams{})
  80. suite.NoError(err)
  81. // Skip first record
  82. var rec bytes.Buffer
  83. _, _, err = tls.ReadRecord(suite.buf, &rec)
  84. suite.NoError(err)
  85. // Read ChangeCipherSpec record
  86. rec.Reset()
  87. recordType, length, err := tls.ReadRecord(suite.buf, &rec)
  88. suite.NoError(err)
  89. suite.Equal(byte(tls.TypeChangeCipherSpec), recordType)
  90. suite.Equal(int64(1), length)
  91. suite.Equal([]byte{fake.ChangeCipherValue}, rec.Bytes())
  92. }
  93. func (suite *SendServerHelloTestSuite) TestCalibratedNoiseSize() {
  94. noise := fake.NoiseParams{Mean: 6480, Jitter: 100}
  95. err := fake.SendServerHello(suite.buf, suite.secret.Key[:], suite.hello, noise)
  96. suite.NoError(err)
  97. var rec bytes.Buffer
  98. // Skip ServerHello
  99. _, _, err = tls.ReadRecord(suite.buf, &rec)
  100. suite.NoError(err)
  101. // Skip ChangeCipherSpec
  102. rec.Reset()
  103. _, _, err = tls.ReadRecord(suite.buf, &rec)
  104. suite.NoError(err)
  105. // Read noise ApplicationData
  106. rec.Reset()
  107. recordType, length, err := tls.ReadRecord(suite.buf, &rec)
  108. suite.NoError(err)
  109. suite.Equal(byte(tls.TypeApplicationData), recordType)
  110. // Should be within mean ± jitter range.
  111. suite.GreaterOrEqual(length, int64(noise.Mean-noise.Jitter))
  112. suite.LessOrEqual(length, int64(noise.Mean+noise.Jitter))
  113. }
  114. func TestSendServerHello(t *testing.T) {
  115. t.Parallel()
  116. suite.Run(t, &SendServerHelloTestSuite{})
  117. }