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 символов.

obfuscated2.go 2.3KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990
  1. package obfuscated2
  2. import (
  3. "crypto/aes"
  4. "crypto/cipher"
  5. "crypto/sha256"
  6. "github.com/juju/errors"
  7. )
  8. // Obfuscated2 contains AES CTR encryption and decryption streams
  9. // for telegram connection.
  10. type Obfuscated2 struct {
  11. decryptor cipher.Stream
  12. encryptor cipher.Stream
  13. }
  14. // Encrypt encrypts given data.
  15. func (o *Obfuscated2) Encrypt(data []byte) []byte {
  16. buf := make([]byte, len(data))
  17. o.encryptor.XORKeyStream(buf, data)
  18. return buf
  19. }
  20. // Decrypt decrypts given data.
  21. func (o *Obfuscated2) Decrypt(data []byte) []byte {
  22. buf := make([]byte, len(data))
  23. o.decryptor.XORKeyStream(buf, data)
  24. return buf
  25. }
  26. // ParseObfuscated2ClientFrame parses client frame. Please check this link for
  27. // details: http://telegra.ph/telegram-blocks-wtf-05-26
  28. //
  29. // Beware, link above is in russian.
  30. func ParseObfuscated2ClientFrame(secret, data []byte) (*Obfuscated2, int16, error) {
  31. frame := Frame(data)
  32. decHasher := sha256.New()
  33. decHasher.Write(frame.Key()) // nolint: errcheck
  34. decHasher.Write(secret) // nolint: errcheck
  35. decryptor := makeStreamCipher(decHasher.Sum(nil), frame.IV())
  36. invertedFrame := frame.Invert()
  37. encHasher := sha256.New()
  38. encHasher.Write(invertedFrame.Key()) // nolint: errcheck
  39. encHasher.Write(secret) // nolint: errcheck
  40. encryptor := makeStreamCipher(encHasher.Sum(nil), invertedFrame.IV())
  41. decryptedFrame := make(Frame, FrameLen)
  42. decryptor.XORKeyStream(decryptedFrame, frame)
  43. if !decryptedFrame.Valid() {
  44. return nil, 0, errors.New("Unknown protocol")
  45. }
  46. obfs := &Obfuscated2{
  47. decryptor: decryptor,
  48. encryptor: encryptor,
  49. }
  50. return obfs, decryptedFrame.DC(), nil
  51. }
  52. // MakeTelegramObfuscated2Frame creates new handshake frame to send to
  53. // Telegram.
  54. // https://blog.susanka.eu/how-telegram-obfuscates-its-mtproto-traffic/
  55. func MakeTelegramObfuscated2Frame() (*Obfuscated2, Frame) {
  56. frame := generateFrame()
  57. encryptor := makeStreamCipher(frame.Key(), frame.IV())
  58. decryptorFrame := frame.Invert()
  59. decryptor := makeStreamCipher(decryptorFrame.Key(), decryptorFrame.IV())
  60. copyFrame := make(Frame, frameOffsetIV)
  61. copy(copyFrame, frame)
  62. encryptor.XORKeyStream(frame, frame)
  63. copy(frame, copyFrame)
  64. obfs := &Obfuscated2{
  65. decryptor: decryptor,
  66. encryptor: encryptor,
  67. }
  68. return obfs, frame
  69. }
  70. func makeStreamCipher(key, iv []byte) cipher.Stream {
  71. block, _ := aes.NewCipher(key)
  72. return cipher.NewCTR(block, iv)
  73. }