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

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113
  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(size int) *bytes.Buffer {
  20. buf := poolWrapperObfuscated2WritePool.Get().(*bytes.Buffer)
  21. buf.Grow(size)
  22. return buf
  23. }
  24. func poolWrapperObfuscated2WritePoolRelease(buf *bytes.Buffer) {
  25. buf.Reset()
  26. poolWrapperObfuscated2WritePool.Put(buf)
  27. }
  28. type wrapperObfuscated2 struct {
  29. encryptor cipher.Stream
  30. decryptor cipher.Stream
  31. parent conntypes.StreamReadWriteCloser
  32. }
  33. func (w *wrapperObfuscated2) ReadTimeout(p []byte, timeout time.Duration) (int, error) {
  34. n, err := w.parent.ReadTimeout(p, timeout)
  35. if err != nil {
  36. return 0, fmt.Errorf("cannot read stream ciphered data: %w", err)
  37. }
  38. w.decryptor.XORKeyStream(p, p[:n])
  39. return n, nil
  40. }
  41. func (w *wrapperObfuscated2) Read(p []byte) (int, error) {
  42. n, err := w.parent.Read(p)
  43. if err != nil {
  44. return n, err
  45. }
  46. w.decryptor.XORKeyStream(p, p[:n])
  47. return n, nil
  48. }
  49. func (w *wrapperObfuscated2) WriteTimeout(p []byte, timeout time.Duration) (int, error) {
  50. buffer := poolWrapperObfuscated2WritePoolAcquire(len(p))
  51. defer poolWrapperObfuscated2WritePoolRelease(buffer)
  52. buf := buffer.Bytes()
  53. copy(buf, p)
  54. w.encryptor.XORKeyStream(buf, buf)
  55. return w.parent.WriteTimeout(buf, timeout)
  56. }
  57. func (w *wrapperObfuscated2) Write(p []byte) (int, error) {
  58. buffer := poolWrapperObfuscated2WritePoolAcquire(len(p))
  59. defer poolWrapperObfuscated2WritePoolRelease(buffer)
  60. buf := buffer.Bytes()
  61. copy(buf, p)
  62. w.encryptor.XORKeyStream(buf, buf)
  63. return w.parent.Write(buf)
  64. }
  65. func (w *wrapperObfuscated2) Conn() net.Conn {
  66. return w.parent.Conn()
  67. }
  68. func (w *wrapperObfuscated2) Logger() *zap.SugaredLogger {
  69. return w.parent.Logger().Named("obfuscated2")
  70. }
  71. func (w *wrapperObfuscated2) LocalAddr() *net.TCPAddr {
  72. return w.parent.LocalAddr()
  73. }
  74. func (w *wrapperObfuscated2) RemoteAddr() *net.TCPAddr {
  75. return w.parent.RemoteAddr()
  76. }
  77. func (w *wrapperObfuscated2) Close() error {
  78. return w.parent.Close()
  79. }
  80. func NewObfuscated2(socket conntypes.StreamReadWriteCloser,
  81. encryptor, decryptor cipher.Stream) conntypes.StreamReadWriteCloser {
  82. return &wrapperObfuscated2{
  83. parent: socket,
  84. encryptor: encryptor,
  85. decryptor: decryptor,
  86. }
  87. }