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_handshake_test.go 2.8KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104
  1. package obfuscated2_test
  2. import (
  3. "bytes"
  4. "crypto/aes"
  5. "crypto/cipher"
  6. "encoding/base64"
  7. "testing"
  8. "github.com/9seconds/mtg/v2/internal/testlib"
  9. "github.com/9seconds/mtg/v2/mtglib/internal/obfuscated2"
  10. "github.com/stretchr/testify/mock"
  11. "github.com/stretchr/testify/suite"
  12. )
  13. type ServerHandshakeTestSuite struct {
  14. suite.Suite
  15. connMock *testlib.NetConnMock
  16. proxyConn obfuscated2.Conn
  17. encryptor cipher.Stream
  18. decryptor cipher.Stream
  19. }
  20. func (suite *ServerHandshakeTestSuite) SetupTest() {
  21. buf := &bytes.Buffer{}
  22. suite.connMock = &testlib.NetConnMock{}
  23. encryptor, decryptor, err := obfuscated2.ServerHandshake(buf)
  24. suite.NoError(err)
  25. suite.proxyConn = obfuscated2.Conn{
  26. Conn: suite.connMock,
  27. Encryptor: encryptor,
  28. Decryptor: decryptor,
  29. }
  30. serverEncrypted := buf.Bytes()
  31. decBlock, _ := aes.NewCipher(serverEncrypted[8 : 8+32])
  32. suite.decryptor = cipher.NewCTR(decBlock, serverEncrypted[8+32:8+32+16])
  33. serverDecrypted := make([]byte, len(serverEncrypted))
  34. suite.decryptor.XORKeyStream(serverDecrypted, serverEncrypted)
  35. suite.Equal("3d3d3Q",
  36. base64.RawStdEncoding.EncodeToString(serverDecrypted[8+32+16:8+32+16+4]))
  37. serverEncryptedReverted := make([]byte, len(serverEncrypted))
  38. for i := 0; i < 32+16; i++ {
  39. serverEncryptedReverted[8+i] = serverEncrypted[8+32+16-1-i]
  40. }
  41. encBlock, _ := aes.NewCipher(serverEncryptedReverted[8 : 8+32])
  42. suite.encryptor = cipher.NewCTR(encBlock, serverEncryptedReverted[8+32:8+32+16])
  43. }
  44. func (suite *ServerHandshakeTestSuite) TearDownTest() {
  45. suite.connMock.AssertExpectations(suite.T())
  46. }
  47. func (suite *ServerHandshakeTestSuite) TestSendToTelegram() {
  48. messageToTelegram := []byte{10, 11, 12, 13, 14, 'a'}
  49. suite.connMock.
  50. On("Write", mock.Anything).
  51. Return(len(messageToTelegram), nil).
  52. Once().
  53. Run(func(args mock.Arguments) {
  54. message := make([]byte, len(messageToTelegram))
  55. suite.decryptor.XORKeyStream(message, args.Get(0).([]byte))
  56. suite.Equal(messageToTelegram, message)
  57. })
  58. n, err := suite.proxyConn.Write(messageToTelegram)
  59. suite.EqualValues(len(messageToTelegram), n)
  60. suite.NoError(err)
  61. }
  62. func (suite *ServerHandshakeTestSuite) TestRecieveFromTelegram() {
  63. messageFromTelegram := []byte{10, 11, 12, 13, 14, 'a'}
  64. buffer := make([]byte, len(messageFromTelegram))
  65. suite.connMock.
  66. On("Read", mock.Anything).
  67. Return(len(messageFromTelegram), nil).
  68. Once().
  69. Run(func(args mock.Arguments) {
  70. message := make([]byte, len(messageFromTelegram))
  71. suite.encryptor.XORKeyStream(message, messageFromTelegram)
  72. copy(args.Get(0).([]byte), message)
  73. })
  74. n, err := suite.proxyConn.Read(buffer)
  75. suite.EqualValues(len(messageFromTelegram), n)
  76. suite.NoError(err)
  77. suite.Equal(messageFromTelegram, buffer)
  78. }
  79. func TestServerHandshake(t *testing.T) {
  80. t.Parallel()
  81. suite.Run(t, &ServerHandshakeTestSuite{})
  82. }