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.

handshake_response.go 1.1KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354
  1. package rpc
  2. import (
  3. "bytes"
  4. "errors"
  5. "fmt"
  6. )
  7. type HandshakeResponse struct {
  8. Type []byte
  9. Flags []byte
  10. SenderPID []byte
  11. PeerPID []byte
  12. }
  13. // Bytes returns a serialized handshake response.
  14. func (r *HandshakeResponse) Bytes() []byte {
  15. buf := &bytes.Buffer{}
  16. buf.Write(r.Type)
  17. buf.Write(r.Flags)
  18. buf.Write(r.SenderPID)
  19. buf.Write(r.PeerPID)
  20. return buf.Bytes()
  21. }
  22. // Valid checks that handshake response compliments request.
  23. func (r *HandshakeResponse) Valid() error {
  24. if !bytes.Equal(r.Type, TagHandshake) {
  25. return errors.New("unexpected handshake tag")
  26. }
  27. if !bytes.Equal(r.PeerPID, HandshakeSenderPID) {
  28. return errors.New("incorrect sender PID")
  29. }
  30. return nil
  31. }
  32. // NewHandshakeResponse constructs new handshake response from the given
  33. // data.
  34. func NewHandshakeResponse(data []byte) (*HandshakeResponse, error) {
  35. if len(data) != 32 { //nolint: gomnd
  36. return nil, fmt.Errorf("incorrect handshake response length %d", len(data))
  37. }
  38. return &HandshakeResponse{
  39. Type: data[:4],
  40. Flags: data[4:8],
  41. SenderPID: data[8:20],
  42. PeerPID: data[20:],
  43. }, nil
  44. }