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
Nevar pievienot vairāk kā 25 tēmas Tēmai ir jāsākas ar burtu vai ciparu, tā var saturēt domu zīmes ('-') un var būt līdz 35 simboliem gara.

cipherrwc.go 1.1KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556
  1. package proxy
  2. import (
  3. "bytes"
  4. "io"
  5. )
  6. // Cipher is an interface to anything which can encrypt and decrypt
  7. type Cipher interface {
  8. Encrypt([]byte) []byte
  9. Decrypt([]byte) []byte
  10. }
  11. // CipherReadWriteCloser wraps connection for transparent encryption
  12. type CipherReadWriteCloser struct {
  13. crypt Cipher
  14. conn io.ReadWriteCloser
  15. rest *bytes.Buffer
  16. }
  17. // Read reads from connection
  18. func (c *CipherReadWriteCloser) Read(p []byte) (n int, err error) {
  19. n, err = c.conn.Read(p)
  20. copy(p, c.crypt.Decrypt(p[:n]))
  21. return
  22. }
  23. // Write writes into connection.
  24. func (c *CipherReadWriteCloser) Write(p []byte) (int, error) {
  25. encrypted := c.crypt.Encrypt(p)
  26. allWritten := 0
  27. for len(encrypted) > 0 {
  28. n, err := c.conn.Write(encrypted)
  29. allWritten += n
  30. if err != nil {
  31. return allWritten, err
  32. }
  33. encrypted = encrypted[n:]
  34. }
  35. return allWritten, nil
  36. }
  37. // Close closes underlying connection.
  38. func (c *CipherReadWriteCloser) Close() error {
  39. return c.conn.Close()
  40. }
  41. func newCipherReadWriteCloser(conn io.ReadWriteCloser, crypt Cipher) *CipherReadWriteCloser {
  42. return &CipherReadWriteCloser{
  43. conn: conn,
  44. crypt: crypt,
  45. rest: &bytes.Buffer{},
  46. }
  47. }