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 3.3KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131
  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. noise, err := fake.SendServerHello(suite.buf, suite.secret.Key[:], suite.hello)
  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. suite.Empty(suite.buf.Bytes())
  43. noiseBuf := bytes.NewReader(noise)
  44. rec.Reset()
  45. recordType, _, err = tls.ReadRecord(noiseBuf, &rec)
  46. suite.NoError(err)
  47. suite.Equal(byte(tls.TypeApplicationData), recordType)
  48. suite.Zero(noiseBuf.Len())
  49. }
  50. func (suite *SendServerHelloTestSuite) TestHMAC() {
  51. noise, err := fake.SendServerHello(suite.buf, suite.secret.Key[:], suite.hello)
  52. suite.NoError(err)
  53. packet := make([]byte, suite.buf.Len())
  54. copy(packet, suite.buf.Bytes())
  55. random := make([]byte, fake.RandomLen)
  56. copy(random, packet[fake.RandomOffset:])
  57. copy(packet[fake.RandomOffset:], make([]byte, fake.RandomLen))
  58. mac := hmac.New(sha256.New, suite.secret.Key[:])
  59. mac.Write(suite.hello.Random[:])
  60. mac.Write(packet)
  61. mac.Write(noise)
  62. suite.Equal(random, mac.Sum(nil))
  63. }
  64. func (suite *SendServerHelloTestSuite) TestHandshakePayload() {
  65. _, err := fake.SendServerHello(suite.buf, suite.secret.Key[:], suite.hello)
  66. suite.NoError(err)
  67. packet := suite.buf.Bytes()
  68. // TLS record header: type(1) + version(2) + length(2)
  69. suite.Equal(byte(tls.TypeHandshake), packet[0])
  70. suite.Equal([]byte{3, 3}, packet[1:3])
  71. // Handshake header: type(1) + uint24_length(3)
  72. suite.Equal(byte(fake.TypeHandshakeServer), packet[5])
  73. // ServerHello version
  74. suite.Equal([]byte{3, 3}, packet[9:11])
  75. // Session ID
  76. sessionIDOffset := fake.RandomOffset + fake.RandomLen
  77. suite.Equal(byte(len(suite.hello.SessionID)), packet[sessionIDOffset])
  78. suite.Equal(suite.hello.SessionID, packet[sessionIDOffset+1:sessionIDOffset+1+len(suite.hello.SessionID)])
  79. }
  80. func (suite *SendServerHelloTestSuite) TestChangeCipherSpec() {
  81. _, err := fake.SendServerHello(suite.buf, suite.secret.Key[:], suite.hello)
  82. suite.NoError(err)
  83. // Skip first record
  84. var rec bytes.Buffer
  85. _, _, err = tls.ReadRecord(suite.buf, &rec)
  86. suite.NoError(err)
  87. // Read ChangeCipherSpec record
  88. rec.Reset()
  89. recordType, length, err := tls.ReadRecord(suite.buf, &rec)
  90. suite.NoError(err)
  91. suite.Equal(byte(tls.TypeChangeCipherSpec), recordType)
  92. suite.Equal(int64(1), length)
  93. suite.Equal([]byte{fake.ChangeCipherValue}, rec.Bytes())
  94. }
  95. func TestSendServerHello(t *testing.T) {
  96. t.Parallel()
  97. suite.Run(t, &SendServerHelloTestSuite{})
  98. }