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
Vous ne pouvez pas sélectionner plus de 25 sujets Les noms de sujets doivent commencer par une lettre ou un nombre, peuvent contenir des tirets ('-') et peuvent comporter jusqu'à 35 caractères.

server_handshake.go 1.5KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768
  1. package obfuscated2
  2. import (
  3. "crypto/cipher"
  4. "crypto/rand"
  5. "encoding/binary"
  6. "fmt"
  7. "net"
  8. )
  9. type serverHandshakeFrame struct {
  10. handshakeFrame
  11. }
  12. func (s *serverHandshakeFrame) decryptor() cipher.Stream {
  13. return makeAesCtr(s.key(), s.iv())
  14. }
  15. func (s *serverHandshakeFrame) encryptor() cipher.Stream {
  16. arr := serverHandshakeFrame{}
  17. invertByteSlices(arr.data[:], s.data[:])
  18. return makeAesCtr(arr.key(), arr.iv())
  19. }
  20. func ServerHandshake(conn net.Conn) (cipher.Stream, cipher.Stream, error) {
  21. handshake := generateServerHanshakeFrame()
  22. copyHandshake := handshake
  23. encryptor := handshake.encryptor()
  24. decryptor := handshake.decryptor()
  25. encryptor.XORKeyStream(handshake.data[:], handshake.data[:])
  26. copy(handshake.key(), copyHandshake.key())
  27. copy(handshake.iv(), copyHandshake.iv())
  28. if _, err := conn.Write(handshake.data[:]); err != nil {
  29. return nil, nil, fmt.Errorf("cannot send a handshake frame to telegram: %w", err)
  30. }
  31. return encryptor, decryptor, nil
  32. }
  33. func generateServerHanshakeFrame() serverHandshakeFrame {
  34. frame := serverHandshakeFrame{}
  35. for {
  36. if _, err := rand.Read(frame.data[:]); err != nil {
  37. panic(err)
  38. }
  39. if frame.data[0] == 0xef {
  40. continue
  41. }
  42. switch binary.LittleEndian.Uint32(frame.data[:4]) {
  43. case 0x44414548, 0x54534f50, 0x20544547, 0x4954504f, 0xeeeeeeee:
  44. continue
  45. }
  46. if (frame.data[4] | frame.data[5] | frame.data[6] | frame.data[7]) == 0 {
  47. continue
  48. }
  49. copy(frame.connectionType(), handshakeConnectionType)
  50. return frame
  51. }
  52. }