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

mtproto_intermediate_secure.go 1.7KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374
  1. package wrappers
  2. import (
  3. "bytes"
  4. "encoding/binary"
  5. "math/rand"
  6. "github.com/9seconds/mtg/mtproto"
  7. )
  8. // MTProtoIntermediateSecure is an extension of MTProtoIntermediate
  9. // mode which supports random paddings (socalled 'secure mode' or
  10. // 'dd-secrets').
  11. type MTProtoIntermediateSecure struct {
  12. MTProtoIntermediate
  13. }
  14. func (m *MTProtoIntermediateSecure) Read() ([]byte, error) {
  15. data, err := m.MTProtoIntermediate.Read()
  16. if err != nil {
  17. return nil, err
  18. }
  19. length := len(data) - (len(data) % 4)
  20. return data[:length], nil
  21. }
  22. func (m *MTProtoIntermediateSecure) Write(p []byte) (int, error) {
  23. defer func() {
  24. m.writeCounter++
  25. }()
  26. m.logger.Debugw("Write packet",
  27. "simple_ack", m.opts.WriteHacks.SimpleAck,
  28. "quick_ack", m.opts.WriteHacks.QuickAck,
  29. "counter", m.writeCounter,
  30. )
  31. if m.opts.WriteHacks.SimpleAck {
  32. return m.conn.Write(p)
  33. }
  34. buf := &bytes.Buffer{}
  35. paddingLength := rand.Intn(4)
  36. buf.Grow(4 + len(p) + paddingLength)
  37. binary.Write(buf, binary.LittleEndian, uint32(len(p)+paddingLength)) // nolint: errcheck
  38. buf.Write(p)
  39. buf.Write(make([]byte, paddingLength))
  40. m.logger.Debugw("Write packet with padding",
  41. "simple_ack", m.opts.WriteHacks.SimpleAck,
  42. "quick_ack", m.opts.WriteHacks.QuickAck,
  43. "counter", m.writeCounter,
  44. "padding_length", paddingLength,
  45. "length", len(p),
  46. )
  47. _, err := m.conn.Write(buf.Bytes())
  48. return len(p), err
  49. }
  50. // NewMTProtoIntermediateSecure create new instance of
  51. // MTProtoIntermediateSecure instance.
  52. func NewMTProtoIntermediateSecure(conn StreamReadWriteCloser, opts *mtproto.ConnectionOpts) PacketReadWriteCloser {
  53. return &MTProtoIntermediateSecure{
  54. MTProtoIntermediate: MTProtoIntermediate{
  55. conn: conn,
  56. logger: conn.Logger().Named("mtproto-intermediate-secure"),
  57. opts: opts,
  58. },
  59. }
  60. }