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
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586
  1. package tls
  2. import (
  3. "bufio"
  4. "bytes"
  5. "github.com/9seconds/mtg/v2/essentials"
  6. )
  7. const (
  8. SizeRecordType = 1
  9. SizeVersion = 2
  10. SizeSize = 2
  11. SizeHeader = SizeRecordType + SizeVersion + SizeSize
  12. MaxRecordSize = 16384
  13. MaxRecordPayloadSize = MaxRecordSize - SizeHeader
  14. DefaultBufferSize = 4096
  15. TypeChangeCipherSpec = 0x14
  16. TypeHandshake = 0x16
  17. TypeApplicationData = 0x17
  18. )
  19. // TLS 1.2 is used for both TLS 1.2 and 1.3
  20. var TLSVersion = [SizeVersion]byte{3, 3}
  21. // Conn presents an established TLS 1.3 connection, after handshake
  22. type Conn struct {
  23. essentials.Conn
  24. p *connPayload
  25. }
  26. type connPayload struct {
  27. readBuf bytes.Buffer
  28. writeBuf bytes.Buffer
  29. connBuffered *bufio.Reader
  30. read bool
  31. write bool
  32. }
  33. func (c Conn) Write(p []byte) (int, error) {
  34. if !c.p.write {
  35. return c.Conn.Write(p)
  36. }
  37. return len(p), WriteRecord(c.Conn, p)
  38. }
  39. func (c Conn) Read(p []byte) (int, error) {
  40. if !c.p.read {
  41. return c.Conn.Read(p)
  42. }
  43. for {
  44. if n, err := c.p.readBuf.Read(p); err == nil {
  45. return n, nil
  46. }
  47. recordType, _, err := ReadRecord(c.p.connBuffered, &c.p.readBuf)
  48. if err != nil {
  49. return 0, err
  50. }
  51. if recordType != TypeApplicationData {
  52. c.p.readBuf.Reset()
  53. }
  54. }
  55. }
  56. func New(conn essentials.Conn, read, write bool) Conn {
  57. newConn := Conn{
  58. Conn: conn,
  59. p: &connPayload{
  60. connBuffered: bufio.NewReaderSize(conn, DefaultBufferSize),
  61. read: read,
  62. write: write,
  63. },
  64. }
  65. newConn.p.readBuf.Grow(DefaultBufferSize)
  66. newConn.p.writeBuf.Grow(DefaultBufferSize)
  67. return newConn
  68. }