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

streamcipherrwc.go 1.0KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950
  1. package wrappers
  2. import (
  3. "crypto/cipher"
  4. "io"
  5. )
  6. type StreamCipherReadWriteCloser struct {
  7. encryptor cipher.Stream
  8. decryptor cipher.Stream
  9. conn io.ReadWriteCloser
  10. }
  11. // Read reads from connection
  12. func (c *StreamCipherReadWriteCloser) Read(p []byte) (n int, err error) {
  13. n, err = c.conn.Read(p)
  14. c.decryptor.XORKeyStream(p, p[:n])
  15. return
  16. }
  17. // Write writes into connection.
  18. func (c *StreamCipherReadWriteCloser) Write(p []byte) (int, error) {
  19. encrypted := make([]byte, len(p))
  20. c.encryptor.XORKeyStream(encrypted, p)
  21. allWritten := 0
  22. for len(encrypted) > 0 {
  23. n, err := c.conn.Write(encrypted)
  24. allWritten += n
  25. if err != nil {
  26. return allWritten, err
  27. }
  28. encrypted = encrypted[n:]
  29. }
  30. return allWritten, nil
  31. }
  32. // Close closes underlying connection.
  33. func (c *StreamCipherReadWriteCloser) Close() error {
  34. return c.conn.Close()
  35. }
  36. func NewStreamCipherRWC(conn io.ReadWriteCloser, encryptor, decryptor cipher.Stream) io.ReadWriteCloser {
  37. return &StreamCipherReadWriteCloser{
  38. conn: conn,
  39. encryptor: encryptor,
  40. decryptor: decryptor,
  41. }
  42. }