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文字以内のものにしてください。

frame.go 2.0KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879
  1. package obfuscated2
  2. import (
  3. "encoding/binary"
  4. "fmt"
  5. "io"
  6. )
  7. const (
  8. handshakeFrameLen = 64
  9. handshakeFrameLenKey = 32
  10. handshakeFrameLenIV = 16
  11. handshakeFrameLenMagic = 4
  12. handshakeFrameLenDC = 2
  13. handshakeFrameOffsetStart = 8
  14. handshakeFrameOffsetKey = handshakeFrameOffsetStart
  15. handshakeFrameOffsetIV = handshakeFrameOffsetKey + handshakeFrameLenKey
  16. handshakeFrameOffsetMagic = handshakeFrameOffsetIV + handshakeFrameLenIV
  17. handshakeFrameOffsetDC = handshakeFrameOffsetMagic + handshakeFrameLenMagic
  18. handshakeFrameOffsetEnd = handshakeFrameOffsetDC + handshakeFrameLenDC
  19. )
  20. // A structure of obfuscated2 handshake frame is following:
  21. //
  22. // [frameOffsetFirst:frameOffsetKey:frameOffsetIV:frameOffsetMagic:frameOffsetDC:frameOffsetEnd].
  23. //
  24. // - 8 bytes of noise
  25. // - 32 bytes of AES Key
  26. // - 16 bytes of AES IV
  27. // - 4 bytes of 'magic' - this has some settings like a connection type
  28. // - 2 bytes of 'DC'. DC is little endian int16
  29. // - 2 bytes of noise
  30. type HandhakeFrame struct {
  31. data [handshakeFrameLen]byte
  32. }
  33. func (f *HandhakeFrame) Fingerprint() []byte {
  34. return f.data[handshakeFrameOffsetStart:handshakeFrameOffsetEnd]
  35. }
  36. func (f *HandhakeFrame) dc() int16 {
  37. data := f.data[handshakeFrameOffsetDC:handshakeFrameOffsetEnd]
  38. return int16(binary.LittleEndian.Uint16(data))
  39. }
  40. func (f *HandhakeFrame) key() []byte {
  41. return f.data[handshakeFrameLenKey:handshakeFrameOffsetIV]
  42. }
  43. func (f *HandhakeFrame) iv() []byte {
  44. return f.data[handshakeFrameOffsetIV:handshakeFrameOffsetMagic]
  45. }
  46. func (f *HandhakeFrame) magic() []byte {
  47. return f.data[handshakeFrameOffsetMagic:handshakeFrameOffsetDC]
  48. }
  49. func (f *HandhakeFrame) invert() *HandhakeFrame {
  50. newFrame := &HandhakeFrame{}
  51. for i, v := range f.data {
  52. newFrame.data[handshakeFrameLen-1-i] = v
  53. }
  54. return newFrame
  55. }
  56. func ReadHandshakeFrame(reader io.Reader) (*HandhakeFrame, error) {
  57. frame := &HandhakeFrame{}
  58. if _, err := io.ReadFull(reader, frame.data[:]); err != nil {
  59. return nil, fmt.Errorf("cannot read frame data: %w", err)
  60. }
  61. return frame, nil
  62. }