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

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293
  1. package stream
  2. import (
  3. "bytes"
  4. "crypto/cipher"
  5. "fmt"
  6. "net"
  7. "time"
  8. "github.com/9seconds/mtg/conntypes"
  9. "go.uber.org/zap"
  10. )
  11. type wrapperObfuscated2 struct {
  12. encryptor cipher.Stream
  13. decryptor cipher.Stream
  14. parent conntypes.StreamReadWriteCloser
  15. }
  16. func (w *wrapperObfuscated2) ReadTimeout(p []byte, timeout time.Duration) (int, error) {
  17. n, err := w.parent.ReadTimeout(p, timeout)
  18. if err != nil {
  19. return 0, fmt.Errorf("cannot read stream ciphered data: %w", err)
  20. }
  21. w.decryptor.XORKeyStream(p, p[:n])
  22. return n, nil
  23. }
  24. func (w *wrapperObfuscated2) Read(p []byte) (int, error) {
  25. n, err := w.parent.Read(p)
  26. if err != nil {
  27. return n, err // nolint: wrapcheck
  28. }
  29. w.decryptor.XORKeyStream(p, p[:n])
  30. return n, nil
  31. }
  32. func (w *wrapperObfuscated2) WriteTimeout(p []byte, timeout time.Duration) (int, error) {
  33. buffer := bytes.Buffer{}
  34. buffer.Write(p)
  35. buf := buffer.Bytes()
  36. w.encryptor.XORKeyStream(buf, buf)
  37. return w.parent.WriteTimeout(buf, timeout)
  38. }
  39. func (w *wrapperObfuscated2) Write(p []byte) (int, error) {
  40. buffer := bytes.Buffer{}
  41. buffer.Write(p)
  42. buf := buffer.Bytes()
  43. w.encryptor.XORKeyStream(buf, buf)
  44. return w.parent.Write(buf)
  45. }
  46. func (w *wrapperObfuscated2) Conn() net.Conn {
  47. return w.parent.Conn()
  48. }
  49. func (w *wrapperObfuscated2) Logger() *zap.SugaredLogger {
  50. return w.parent.Logger().Named("obfuscated2")
  51. }
  52. func (w *wrapperObfuscated2) LocalAddr() *net.TCPAddr {
  53. return w.parent.LocalAddr()
  54. }
  55. func (w *wrapperObfuscated2) RemoteAddr() *net.TCPAddr {
  56. return w.parent.RemoteAddr()
  57. }
  58. func (w *wrapperObfuscated2) Close() error {
  59. return w.parent.Close()
  60. }
  61. func NewObfuscated2(socket conntypes.StreamReadWriteCloser,
  62. encryptor, decryptor cipher.Stream) conntypes.StreamReadWriteCloser {
  63. return &wrapperObfuscated2{
  64. parent: socket,
  65. encryptor: encryptor,
  66. decryptor: decryptor,
  67. }
  68. }