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.go 2.3KB

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