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

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950
  1. package rpc
  2. import (
  3. "bytes"
  4. "crypto/rand"
  5. "encoding/binary"
  6. "fmt"
  7. "time"
  8. )
  9. type NonceRequest struct {
  10. KeySelector []byte
  11. CryptoTS []byte
  12. Nonce []byte
  13. }
  14. // Bytes returns serialized nonce request.
  15. func (r *NonceRequest) Bytes() []byte {
  16. buf := &bytes.Buffer{}
  17. buf.Write(TagNonce)
  18. buf.Write(r.KeySelector)
  19. buf.Write(NonceCryptoAES)
  20. buf.Write(r.CryptoTS)
  21. buf.Write(r.Nonce)
  22. return buf.Bytes()
  23. }
  24. // NewNonceRequest builds new none request based on proxy secret.
  25. func NewNonceRequest(proxySecret []byte) (*NonceRequest, error) {
  26. nonce := make([]byte, 16)
  27. keySelector := make([]byte, 4)
  28. cryptoTS := make([]byte, 4)
  29. if _, err := rand.Read(nonce); err != nil {
  30. return nil, fmt.Errorf("cannot generate nonce: %w", err)
  31. }
  32. copy(keySelector, proxySecret)
  33. timestamp := time.Now().Truncate(time.Second).Unix() % 4294967296 // 256 ^ 4 - do not know how to name
  34. binary.LittleEndian.PutUint32(cryptoTS, uint32(timestamp))
  35. return &NonceRequest{
  36. KeySelector: keySelector,
  37. CryptoTS: cryptoTS,
  38. Nonce: nonce,
  39. }, nil
  40. }