mirror of
https://github.com/ScuroNeko/mtg.git
synced 2026-09-01 02:54:03 +03:00
FILE / ScuroNeko/mtg
mtproto/rpc/nonce_request.go
Исходный файл и его история в репозитории.
53 lines
1.1 KiB
Go
53 lines
1.1 KiB
Go
package rpc
|
|
|
|
import (
|
|
"bytes"
|
|
"crypto/rand"
|
|
"encoding/binary"
|
|
"time"
|
|
|
|
"github.com/juju/errors"
|
|
)
|
|
|
|
// NonceRequest is the data type which contains all the data for correct
|
|
// nonce request.
|
|
type NonceRequest struct {
|
|
KeySelector []byte
|
|
CryptoTS []byte
|
|
Nonce []byte
|
|
}
|
|
|
|
// Bytes returns serialized nonce request.
|
|
func (r *NonceRequest) Bytes() []byte {
|
|
buf := &bytes.Buffer{}
|
|
|
|
buf.Write(TagNonce)
|
|
buf.Write(r.KeySelector)
|
|
buf.Write(NonceCryptoAES)
|
|
buf.Write(r.CryptoTS)
|
|
buf.Write(r.Nonce)
|
|
|
|
return buf.Bytes()
|
|
}
|
|
|
|
// NewNonceRequest builds new none request based on proxy secret.
|
|
func NewNonceRequest(proxySecret []byte) (*NonceRequest, error) {
|
|
nonce := make([]byte, 16)
|
|
keySelector := make([]byte, 4)
|
|
cryptoTS := make([]byte, 4)
|
|
|
|
if _, err := rand.Read(nonce); err != nil {
|
|
return nil, errors.Annotate(err, "Cannot generate nonce")
|
|
}
|
|
copy(keySelector, proxySecret)
|
|
|
|
timestamp := time.Now().Truncate(time.Second).Unix() % 4294967296 // 256 ^ 4 - do not know how to name
|
|
binary.LittleEndian.PutUint32(cryptoTS, uint32(timestamp))
|
|
|
|
return &NonceRequest{
|
|
KeySelector: keySelector,
|
|
CryptoTS: cryptoTS,
|
|
Nonce: nonce,
|
|
}, nil
|
|
}
|