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
Você não pode selecionar mais de 25 tópicos Os tópicos devem começar com uma letra ou um número, podem incluir traços ('-') e podem ter até 35 caracteres.

cipherrwc.go 968B

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152
  1. package server
  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. c.rest.Write(c.crypt.Encrypt(p))
  22. newP := c.rest.Bytes()[:len(p)]
  23. n, err = c.conn.Write(newP)
  24. c.rest = bytes.NewBuffer(c.rest.Bytes()[n:])
  25. return
  26. }
  27. func (c *CipherReadWriteCloser) Close() error {
  28. var err1 error
  29. if c.rest.Len() > 0 {
  30. _, err1 = c.conn.Write(c.rest.Bytes())
  31. }
  32. err2 := c.conn.Close()
  33. if err2 != nil {
  34. return err2
  35. }
  36. return err1
  37. }
  38. func newCipherReadWriteCloser(conn io.ReadWriteCloser, crypt Cipher) io.ReadWriteCloser {
  39. return &CipherReadWriteCloser{
  40. conn: conn,
  41. crypt: crypt,
  42. rest: &bytes.Buffer{},
  43. }
  44. }