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
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

server_side_test.go 3.3KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130
  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/doppel"
  10. "github.com/9seconds/mtg/v2/mtglib/internal/tls"
  11. "github.com/9seconds/mtg/v2/mtglib/internal/tls/fake"
  12. "github.com/stretchr/testify/suite"
  13. )
  14. type SendServerHelloTestSuite struct {
  15. suite.Suite
  16. hello *fake.ClientHello
  17. buf *bytes.Buffer
  18. secret mtglib.Secret
  19. }
  20. func (suite *SendServerHelloTestSuite) SetupTest() {
  21. suite.hello = &fake.ClientHello{
  22. CipherSuite: 4867,
  23. SessionID: make([]byte, 32),
  24. }
  25. _, err := rand.Read(suite.hello.SessionID)
  26. suite.NoError(err)
  27. _, err = rand.Read(suite.hello.Random[:])
  28. suite.NoError(err)
  29. suite.buf = &bytes.Buffer{}
  30. suite.secret = mtglib.GenerateSecret("google.com")
  31. }
  32. func (suite *SendServerHelloTestSuite) TestRecordStructure() {
  33. err := fake.SendServerHello(suite.buf, suite.secret.Key[:], suite.hello)
  34. suite.NoError(err)
  35. var rec bytes.Buffer
  36. recordType, _, err := tls.ReadRecord(suite.buf, &rec)
  37. suite.NoError(err)
  38. suite.Equal(byte(tls.TypeHandshake), recordType)
  39. rec.Reset()
  40. recordType, _, err = tls.ReadRecord(suite.buf, &rec)
  41. suite.NoError(err)
  42. suite.Equal(byte(tls.TypeChangeCipherSpec), recordType)
  43. rec.Reset()
  44. recordType, length, err := tls.ReadRecord(suite.buf, &rec)
  45. suite.NoError(err)
  46. suite.Equal(byte(tls.TypeApplicationData), recordType)
  47. suite.Greater(length, int64(doppel.TLSRecordSizeStart))
  48. suite.Empty(suite.buf.Bytes())
  49. }
  50. func (suite *SendServerHelloTestSuite) TestHMAC() {
  51. 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. suite.Equal(random, mac.Sum(nil))
  62. }
  63. func (suite *SendServerHelloTestSuite) TestHandshakePayload() {
  64. err := fake.SendServerHello(suite.buf, suite.secret.Key[:], suite.hello)
  65. suite.NoError(err)
  66. packet := suite.buf.Bytes()
  67. // TLS record header: type(1) + version(2) + length(2)
  68. suite.Equal(byte(tls.TypeHandshake), packet[0])
  69. suite.Equal([]byte{3, 3}, packet[1:3])
  70. // Handshake header: type(1) + uint24_length(3)
  71. suite.Equal(byte(fake.TypeHandshakeServer), packet[5])
  72. // ServerHello version
  73. suite.Equal([]byte{3, 3}, packet[9:11])
  74. // Session ID
  75. sessionIDOffset := fake.RandomOffset + fake.RandomLen
  76. suite.Equal(byte(len(suite.hello.SessionID)), packet[sessionIDOffset])
  77. suite.Equal(suite.hello.SessionID, packet[sessionIDOffset+1:sessionIDOffset+1+len(suite.hello.SessionID)])
  78. }
  79. func (suite *SendServerHelloTestSuite) TestChangeCipherSpec() {
  80. err := fake.SendServerHello(suite.buf, suite.secret.Key[:], suite.hello)
  81. suite.NoError(err)
  82. // Skip first record
  83. var rec bytes.Buffer
  84. _, _, err = tls.ReadRecord(suite.buf, &rec)
  85. suite.NoError(err)
  86. // Read ChangeCipherSpec record
  87. rec.Reset()
  88. recordType, length, err := tls.ReadRecord(suite.buf, &rec)
  89. suite.NoError(err)
  90. suite.Equal(byte(tls.TypeChangeCipherSpec), recordType)
  91. suite.Equal(int64(1), length)
  92. suite.Equal([]byte{fake.ChangeCipherValue}, rec.Bytes())
  93. }
  94. func TestSendServerHello(t *testing.T) {
  95. t.Parallel()
  96. suite.Run(t, &SendServerHelloTestSuite{})
  97. }