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.

obfuscated2.go 1.8KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879
  1. package obfuscated2
  2. import (
  3. "crypto/aes"
  4. "crypto/cipher"
  5. "crypto/sha256"
  6. "github.com/juju/errors"
  7. )
  8. type Obfuscated2 struct {
  9. decryptor cipher.Stream
  10. encryptor cipher.Stream
  11. }
  12. func (o *Obfuscated2) Encrypt(data []byte) []byte {
  13. buf := make([]byte, len(data))
  14. o.encryptor.XORKeyStream(buf, data)
  15. return buf
  16. }
  17. func (o *Obfuscated2) Decrypt(data []byte) []byte {
  18. buf := make([]byte, len(data))
  19. o.decryptor.XORKeyStream(buf, data)
  20. return buf
  21. }
  22. func ParseObfuscated2ClientFrame(secret, data []byte) (*Obfuscated2, int16, error) {
  23. frame := Frame(data)
  24. decHasher := sha256.New()
  25. decHasher.Write(frame.Key())
  26. decHasher.Write(secret)
  27. decryptor := makeStreamCipher(decHasher.Sum(nil), frame.IV())
  28. invertedFrame := frame.Invert()
  29. encHasher := sha256.New()
  30. encHasher.Write(invertedFrame.Key())
  31. encHasher.Write(secret)
  32. encryptor := makeStreamCipher(encHasher.Sum(nil), invertedFrame.IV())
  33. decryptedFrame := make(Frame, FrameLen)
  34. decryptor.XORKeyStream(decryptedFrame, frame)
  35. if !decryptedFrame.Valid() {
  36. return nil, 0, errors.New("Unknown protocol")
  37. }
  38. obfs := &Obfuscated2{
  39. decryptor: decryptor,
  40. encryptor: encryptor,
  41. }
  42. return obfs, decryptedFrame.DC(), nil
  43. }
  44. func MakeTelegramObfuscated2Frame() (*Obfuscated2, Frame) {
  45. frame := generateFrame()
  46. encryptor := makeStreamCipher(frame.Key(), frame.IV())
  47. decryptorFrame := frame.Invert()
  48. decryptor := makeStreamCipher(decryptorFrame.Key(), decryptorFrame.IV())
  49. copyFrame := make(Frame, frameOffsetIV)
  50. copy(copyFrame, frame)
  51. encryptor.XORKeyStream(frame, frame)
  52. copy(frame, copyFrame)
  53. obfs := &Obfuscated2{
  54. decryptor: decryptor,
  55. encryptor: encryptor,
  56. }
  57. return obfs, frame
  58. }
  59. func makeStreamCipher(key, iv []byte) cipher.Stream {
  60. block, _ := aes.NewCipher(key)
  61. return cipher.NewCTR(block, iv)
  62. }