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文字以内のものにしてください。

obfuscator_test.go 2.4KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394
  1. package obfuscation_test
  2. import (
  3. "bytes"
  4. "testing"
  5. "github.com/9seconds/mtg/v2/internal/testlib"
  6. "github.com/9seconds/mtg/v2/mtglib"
  7. "github.com/9seconds/mtg/v2/mtglib/internal/obfuscation"
  8. "github.com/stretchr/testify/assert"
  9. "github.com/stretchr/testify/mock"
  10. "github.com/stretchr/testify/require"
  11. "github.com/stretchr/testify/suite"
  12. )
  13. type ObfuscatorTestSuite struct {
  14. SnapshotTestSuite
  15. secret *mtglib.Secret
  16. }
  17. func (s *ObfuscatorTestSuite) SetupSuite() {
  18. s.Setup("", "client-handshake")
  19. secret := mtglib.GenerateSecret("hostname.com")
  20. s.secret = &secret
  21. }
  22. func (s *ObfuscatorTestSuite) TestSnapshot() {
  23. for name, snapshot := range s.snapshots {
  24. s.T().Run(name, func(t *testing.T) {
  25. obfs := obfuscation.Obfuscator{
  26. Secret: snapshot.Secret.data,
  27. }
  28. connMock := &testlib.EssentialsConnMock{}
  29. connMockReadBuffer := &bytes.Buffer{}
  30. connMockReadBuffer.Write(snapshot.Frame.data)
  31. connMockReadBuffer.Write(snapshot.Decrypted.Cipher.data)
  32. connMockWriteBuffer := &bytes.Buffer{}
  33. connMock.
  34. On("Read", mock.AnythingOfType("[]uint8")).
  35. Return(64, nil).
  36. Run(func(args mock.Arguments) {
  37. arr := args.Get(0).([]byte)
  38. _, err := connMockReadBuffer.Read(arr)
  39. require.NoError(t, err)
  40. })
  41. dc, cn, err := obfs.ReadHandshake(connMock)
  42. assert.EqualValues(t, 2, dc)
  43. assert.NoError(t, err)
  44. connMock.Calls = []mock.Call{}
  45. connMock.ExpectedCalls = []*mock.Call{}
  46. connMock.
  47. On("Read", mock.AnythingOfType("[]uint8")).
  48. Return(len(snapshot.Decrypted.Cipher.data), nil).
  49. Run(func(args mock.Arguments) {
  50. arr := args.Get(0).([]byte)
  51. _, err := connMockReadBuffer.Read(arr)
  52. require.NoError(t, err)
  53. })
  54. connMock.
  55. On("Write", mock.AnythingOfType("[]uint8")).
  56. Return(len(snapshot.Encrypted.Cipher.data), nil).
  57. Run(func(args mock.Arguments) {
  58. arr := args.Get(0).([]byte)
  59. _, err := connMockWriteBuffer.Write(arr)
  60. require.NoError(t, err)
  61. })
  62. readBuf := make([]byte, len(snapshot.Decrypted.Text.data))
  63. _, err = cn.Read(readBuf)
  64. assert.NoError(t, err)
  65. assert.Equal(t, readBuf, snapshot.Decrypted.Text.data)
  66. _, err = cn.Write(snapshot.Encrypted.Text.data)
  67. assert.NoError(t, err)
  68. assert.Equal(t, connMockWriteBuffer.Bytes(), snapshot.Encrypted.Cipher.data)
  69. connMock.AssertExpectations(t)
  70. })
  71. }
  72. }
  73. func TestObfuscator(t *testing.T) {
  74. t.Parallel()
  75. suite.Run(t, &ObfuscatorTestSuite{})
  76. }