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.4KB

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