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 1.9KB

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