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
Du kan inte välja fler än 25 ämnen Ämnen måste starta med en bokstav eller siffra, kan innehålla bindestreck ('-') och vara max 35 tecken långa.

blockcipher.go 2.0KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798
  1. package wrappers
  2. import (
  3. "bytes"
  4. "crypto/aes"
  5. "crypto/cipher"
  6. "net"
  7. "github.com/9seconds/mtg/utils"
  8. "github.com/juju/errors"
  9. )
  10. type BlockCipher struct {
  11. buf *bytes.Buffer
  12. conn WrapStreamReadWriteCloser
  13. encryptor cipher.BlockMode
  14. decryptor cipher.BlockMode
  15. }
  16. func (b *BlockCipher) Read(p []byte) (int, error) {
  17. if b.buf.Len() > 0 {
  18. return b.flush(p)
  19. }
  20. buf := []byte{}
  21. for len(buf) == 0 || len(buf)%aes.BlockSize != 0 {
  22. rv, err := utils.ReadCurrentData(b.conn)
  23. if err != nil {
  24. return 0, errors.Annotate(err, "Cannot read from socket")
  25. }
  26. buf = append(buf, rv...)
  27. }
  28. b.decryptor.CryptBlocks(buf, buf)
  29. b.buf.Write(buf)
  30. return b.flush(p)
  31. }
  32. func (b *BlockCipher) flush(p []byte) (int, error) {
  33. if b.buf.Len() <= len(p) {
  34. sizeToReturn := b.buf.Len()
  35. copy(p, b.buf.Bytes())
  36. b.buf.Reset()
  37. return sizeToReturn, nil
  38. }
  39. return b.buf.Read(p)
  40. }
  41. func (b *BlockCipher) Write(p []byte) (int, error) {
  42. if len(p)%aes.BlockSize > 0 {
  43. return 0, errors.Errorf("Incorrect block size %d", len(p))
  44. }
  45. encrypted := make([]byte, len(p))
  46. b.encryptor.CryptBlocks(encrypted, p)
  47. return b.conn.Write(encrypted)
  48. }
  49. func (b *BlockCipher) LogDebug(msg string, data ...interface{}) {
  50. b.conn.LogDebug(msg, data...)
  51. }
  52. func (b *BlockCipher) LogInfo(msg string, data ...interface{}) {
  53. b.conn.LogInfo(msg, data...)
  54. }
  55. func (b *BlockCipher) LogWarn(msg string, data ...interface{}) {
  56. b.conn.LogWarn(msg, data...)
  57. }
  58. func (b *BlockCipher) LogError(msg string, data ...interface{}) {
  59. b.conn.LogError(msg, data...)
  60. }
  61. func (b *BlockCipher) LocalAddr() *net.TCPAddr {
  62. return b.conn.LocalAddr()
  63. }
  64. func (b *BlockCipher) RemoteAddr() *net.TCPAddr {
  65. return b.conn.RemoteAddr()
  66. }
  67. func (b *BlockCipher) Close() error {
  68. return b.conn.Close()
  69. }
  70. func NewBlockCipher(conn WrapStreamReadWriteCloser, encryptor, decryptor cipher.BlockMode) WrapStreamReadWriteCloser {
  71. return &BlockCipher{
  72. buf: &bytes.Buffer{},
  73. conn: conn,
  74. encryptor: encryptor,
  75. decryptor: decryptor,
  76. }
  77. }