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.

obfuscated2_test.go 2.5KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081
  1. package obfuscated2
  2. import (
  3. "crypto/sha256"
  4. "testing"
  5. "github.com/stretchr/testify/assert"
  6. )
  7. func TestObfs2TelegramFrameDecrypt(t *testing.T) {
  8. _, frame := MakeTelegramObfuscated2Frame()
  9. decryptor := makeStreamCipher(frame.Key(), frame.IV())
  10. decrypted := make(Frame, FrameLen)
  11. decryptor.XORKeyStream(decrypted, *frame)
  12. assert.True(t, decrypted.Valid())
  13. }
  14. func TestObfs2TelegramDecryptEncryptDecrypt(t *testing.T) {
  15. obfs2, frame := MakeTelegramObfuscated2Frame()
  16. inverted := frame.Invert()
  17. encryptor := makeStreamCipher(inverted.Key(), inverted.IV())
  18. data := []byte{1, 2, 3}
  19. encrypted := make([]byte, 3)
  20. encryptor.XORKeyStream(encrypted, data)
  21. decrypted := make([]byte, 3)
  22. obfs2.Decryptor.XORKeyStream(decrypted, encrypted)
  23. assert.Equal(t, data, decrypted)
  24. }
  25. func TestObfs2Full(t *testing.T) {
  26. secret := []byte{1, 2, 3, 4, 5}
  27. clientFrame := generateFrame()
  28. clientHasher := sha256.New()
  29. clientHasher.Write(clientFrame.Key())
  30. clientHasher.Write(secret)
  31. clientKey := clientHasher.Sum(nil)
  32. encryptor := makeStreamCipher(clientKey, clientFrame.IV())
  33. encrypted := make(Frame, FrameLen)
  34. encryptor.XORKeyStream(encrypted, *clientFrame)
  35. copy(encrypted[:56], (*clientFrame)[:56])
  36. invertedClientFrame := clientFrame.Invert()
  37. clientHasher = sha256.New()
  38. clientHasher.Write(invertedClientFrame.Key())
  39. clientHasher.Write(secret)
  40. invertedClientKey := clientHasher.Sum(nil)
  41. clientDecryptor := makeStreamCipher(invertedClientKey, invertedClientFrame.IV())
  42. clientObfs, _, err := ParseObfuscated2ClientFrame(secret, &encrypted)
  43. assert.Nil(t, err)
  44. tgObfs, tgFrame := MakeTelegramObfuscated2Frame()
  45. tgDecryptor := makeStreamCipher(tgFrame.Key(), tgFrame.IV())
  46. decrypted := make(Frame, FrameLen)
  47. tgDecryptor.XORKeyStream(decrypted, *tgFrame)
  48. assert.True(t, decrypted.Valid())
  49. tgInvertedFrame := tgFrame.Invert()
  50. tgEncryptor := makeStreamCipher(tgInvertedFrame.Key(), tgInvertedFrame.IV())
  51. message := []byte{1, 2, 3, 4, 5, 6, 7, 8, 9}
  52. tgEncryptedMessage := make([]byte, len(message))
  53. tgEncryptor.XORKeyStream(tgEncryptedMessage, message)
  54. tgEncDecryptedMessage := make([]byte, len(tgEncryptedMessage))
  55. tgObfs.Decryptor.XORKeyStream(tgEncDecryptedMessage, tgEncryptedMessage)
  56. assert.Equal(t, message, tgEncDecryptedMessage)
  57. clientEncryptedMessage := make([]byte, len(tgEncDecryptedMessage))
  58. clientObfs.Encryptor.XORKeyStream(clientEncryptedMessage, tgEncDecryptedMessage)
  59. finalMessage := make([]byte, len(clientEncryptedMessage))
  60. clientDecryptor.XORKeyStream(finalMessage, clientEncryptedMessage)
  61. assert.Equal(t, finalMessage, message)
  62. }