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
Você não pode selecionar mais de 25 tópicos Os tópicos devem começar com uma letra ou um número, podem incluir traços ('-') e podem ter até 35 caracteres.

init_test.go 3.2KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137
  1. package obfuscated2_test
  2. import (
  3. "bytes"
  4. "crypto/aes"
  5. "crypto/cipher"
  6. "encoding/base64"
  7. "encoding/json"
  8. "fmt"
  9. "os"
  10. "path/filepath"
  11. "strings"
  12. "testing"
  13. "github.com/9seconds/mtg/v2/internal/testlib"
  14. "github.com/9seconds/mtg/v2/mtglib/internal/obfuscated2"
  15. "github.com/stretchr/testify/require"
  16. )
  17. type snapshotBytes struct {
  18. data []byte
  19. }
  20. func (s snapshotBytes) MarshalText() ([]byte, error) {
  21. if len(s.data) == 0 {
  22. return nil, nil
  23. }
  24. return []byte(base64.RawStdEncoding.EncodeToString(s.data)), nil
  25. }
  26. func (s *snapshotBytes) UnmarshalText(data []byte) error {
  27. val, err := base64.RawStdEncoding.DecodeString(string(data))
  28. if err != nil {
  29. return fmt.Errorf("cannot unmarshal %v: %w", len(val), err)
  30. }
  31. s.data = val
  32. return nil
  33. }
  34. type Obfuscated2Snapshot struct {
  35. Secret snapshotBytes `json:"secret"`
  36. Frame snapshotBytes `json:"frame"`
  37. DC int16 `json:"dc"`
  38. Encrypted struct {
  39. Text snapshotBytes `json:"text"`
  40. Cipher snapshotBytes `json:"cipher"`
  41. } `json:"encrypted"`
  42. Decrypted struct {
  43. Text snapshotBytes `json:"text"`
  44. Cipher snapshotBytes `json:"cipher"`
  45. } `json:"decrypted"`
  46. }
  47. type SnapshotTestSuite struct {
  48. snapshots map[string]*Obfuscated2Snapshot
  49. }
  50. type ServerHandshakeTestData struct {
  51. connMock *testlib.EssentialsConnMock
  52. proxyConn obfuscated2.Conn
  53. encryptor cipher.Stream
  54. decryptor cipher.Stream
  55. }
  56. func (suite *SnapshotTestSuite) IngestSnapshots(dirname, namePrefix string) error {
  57. suite.snapshots = map[string]*Obfuscated2Snapshot{}
  58. files, err := os.ReadDir(filepath.Join("testdata", dirname))
  59. if err != nil {
  60. return fmt.Errorf("cannot ingest snapshots: %w", err)
  61. }
  62. for _, v := range files {
  63. if !strings.HasPrefix(v.Name(), namePrefix) {
  64. continue
  65. }
  66. filename := filepath.Join("testdata", dirname, v.Name())
  67. contents, err := os.ReadFile(filename)
  68. if err != nil {
  69. return fmt.Errorf("cannot read %s: %w", filename, err)
  70. }
  71. value := &Obfuscated2Snapshot{}
  72. if err := json.Unmarshal(contents, value); err != nil {
  73. return fmt.Errorf("cannot unmarshal %s: %w", filename, err)
  74. }
  75. suite.snapshots[v.Name()] = value
  76. }
  77. return nil
  78. }
  79. func NewServerHandshakeTestData(t *testing.T) ServerHandshakeTestData {
  80. buf := &bytes.Buffer{}
  81. connMock := &testlib.EssentialsConnMock{}
  82. handshakeEnc, handshakeDec, err := obfuscated2.ServerHandshake(buf)
  83. require.NoError(t, err)
  84. serverEncrypted := buf.Bytes()
  85. decBlock, _ := aes.NewCipher(serverEncrypted[8 : 8+32])
  86. decryptor := cipher.NewCTR(decBlock, serverEncrypted[8+32:8+32+16])
  87. serverDecrypted := make([]byte, len(serverEncrypted))
  88. decryptor.XORKeyStream(serverDecrypted, serverEncrypted)
  89. require.Equal(t, "3d3d3Q",
  90. base64.RawStdEncoding.EncodeToString(serverDecrypted[8+32+16:8+32+16+4]))
  91. serverEncryptedReverted := make([]byte, len(serverEncrypted))
  92. for i := range 32 + 16 {
  93. serverEncryptedReverted[8+i] = serverEncrypted[8+32+16-1-i]
  94. }
  95. encBlock, _ := aes.NewCipher(serverEncryptedReverted[8 : 8+32])
  96. encryptor := cipher.NewCTR(encBlock, serverEncryptedReverted[8+32:8+32+16])
  97. return ServerHandshakeTestData{
  98. connMock: connMock,
  99. proxyConn: obfuscated2.Conn{
  100. Conn: connMock,
  101. Encryptor: handshakeEnc,
  102. Decryptor: handshakeDec,
  103. },
  104. encryptor: encryptor,
  105. decryptor: decryptor,
  106. }
  107. }