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
Nelze vybrat více než 25 témat Téma musí začínat písmenem nebo číslem, může obsahovat pomlčky („-“) a může být dlouhé až 35 znaků.

cipherrwc.go 881B

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051
  1. package proxy
  2. import (
  3. "bytes"
  4. "io"
  5. )
  6. type Cipher interface {
  7. Encrypt([]byte) []byte
  8. Decrypt([]byte) []byte
  9. }
  10. type CipherReadWriteCloser struct {
  11. crypt Cipher
  12. conn io.ReadWriteCloser
  13. rest *bytes.Buffer
  14. }
  15. func (c *CipherReadWriteCloser) Read(p []byte) (n int, err error) {
  16. n, err = c.conn.Read(p)
  17. copy(p, c.crypt.Decrypt(p[:n]))
  18. return
  19. }
  20. func (c *CipherReadWriteCloser) Write(p []byte) (n int, err error) {
  21. encrypted := c.crypt.Encrypt(p)
  22. curN := 0
  23. for len(encrypted) > 0 {
  24. curN, err = c.conn.Write(encrypted)
  25. n += curN
  26. if err != nil {
  27. return
  28. }
  29. encrypted = encrypted[n:]
  30. }
  31. return
  32. }
  33. func (c *CipherReadWriteCloser) Close() error {
  34. return c.conn.Close()
  35. }
  36. func newCipherReadWriteCloser(conn io.ReadWriteCloser, crypt Cipher) *CipherReadWriteCloser {
  37. return &CipherReadWriteCloser{
  38. conn: conn,
  39. crypt: crypt,
  40. rest: &bytes.Buffer{},
  41. }
  42. }