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
Du kan inte välja fler än 25 ämnen Ämnen måste starta med en bokstav eller siffra, kan innehålla bindestreck ('-') och vara max 35 tecken långa.

client_handshake_test.go 2.3KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889
  1. package obfuscated2_test
  2. import (
  3. "bytes"
  4. "testing"
  5. "github.com/9seconds/mtg/v2/internal/testlib"
  6. "github.com/9seconds/mtg/v2/mtglib/internal/obfuscated2"
  7. "github.com/stretchr/testify/assert"
  8. "github.com/stretchr/testify/mock"
  9. "github.com/stretchr/testify/suite"
  10. )
  11. type ClientHandshakeTestSuite struct {
  12. suite.Suite
  13. SnapshotTestSuite
  14. }
  15. func (suite *ClientHandshakeTestSuite) SetupSuite() {
  16. suite.NoError(suite.IngestSnapshots(".", "client-handshake-snapshot-"))
  17. }
  18. func (suite *ClientHandshakeTestSuite) TestCannotRead() {
  19. buf := bytes.NewBuffer([]byte{1, 2, 3})
  20. _, _, _, err := obfuscated2.ClientHandshake([]byte{1, 2, 3}, buf) // nolint: dogsled
  21. suite.Error(err)
  22. }
  23. func (suite *ClientHandshakeTestSuite) TestOk() {
  24. for nameV, snapshotV := range suite.snapshots {
  25. snapshot := snapshotV
  26. suite.T().Run(nameV, func(t *testing.T) {
  27. buf := bytes.NewBuffer(snapshot.Frame.data)
  28. dc, encryptor, decryptor, err := obfuscated2.ClientHandshake(
  29. snapshot.Secret.data, buf)
  30. assert.NoError(t, err)
  31. assert.EqualValues(t, snapshot.DC, dc)
  32. writeData := make([]byte, len(snapshot.Encrypted.Text.data))
  33. readData := make([]byte, len(snapshot.Decrypted.Text.data))
  34. connMock := &testlib.EssentialsConnMock{}
  35. connMock.On("Read", mock.Anything).
  36. Once().
  37. Return(len(snapshot.Decrypted.Text.data), nil).
  38. Run(func(args mock.Arguments) {
  39. arr, ok := args.Get(0).([]byte)
  40. suite.True(ok)
  41. copy(arr, snapshot.Decrypted.Cipher.data)
  42. })
  43. connMock.On("Write", mock.Anything).
  44. Once().
  45. Return(len(snapshot.Encrypted.Text.data), nil).
  46. Run(func(args mock.Arguments) {
  47. arr, ok := args.Get(0).([]byte)
  48. suite.True(ok)
  49. copy(writeData, arr)
  50. })
  51. conn := obfuscated2.Conn{
  52. Conn: connMock,
  53. Encryptor: encryptor,
  54. Decryptor: decryptor,
  55. }
  56. n, err := conn.Read(readData)
  57. assert.Equal(t, len(readData), n)
  58. assert.NoError(t, err)
  59. assert.Equal(t, snapshot.Decrypted.Text.data, readData)
  60. n, err = conn.Write(snapshot.Encrypted.Text.data)
  61. assert.Equal(t, len(writeData), n)
  62. assert.NoError(t, err)
  63. assert.Equal(t, snapshot.Encrypted.Cipher.data, writeData)
  64. connMock.AssertExpectations(t)
  65. })
  66. }
  67. }
  68. func TestClientHandshake(t *testing.T) {
  69. t.Parallel()
  70. suite.Run(t, &ClientHandshakeTestSuite{})
  71. }