mirror of
https://github.com/ScuroNeko/mtg.git
synced 2026-09-01 00:14:02 +03:00
FILE / ScuroNeko/mtg
mtproto/rpc/handshake_response.go
Исходный файл и его история в репозитории.
55 lines
1.1 KiB
Go
55 lines
1.1 KiB
Go
package rpc
|
|
|
|
import (
|
|
"bytes"
|
|
"errors"
|
|
"fmt"
|
|
)
|
|
|
|
type HandshakeResponse struct {
|
|
Type []byte
|
|
Flags []byte
|
|
SenderPID []byte
|
|
PeerPID []byte
|
|
}
|
|
|
|
// Bytes returns a serialized handshake response.
|
|
func (r *HandshakeResponse) Bytes() []byte {
|
|
buf := &bytes.Buffer{}
|
|
|
|
buf.Write(r.Type) // nolint: gosec
|
|
buf.Write(r.Flags) // nolint: gosec
|
|
buf.Write(r.SenderPID) // nolint: gosec
|
|
buf.Write(r.PeerPID) // nolint: gosec
|
|
|
|
return buf.Bytes()
|
|
}
|
|
|
|
// Valid checks that handshake response compliments request.
|
|
func (r *HandshakeResponse) Valid() error {
|
|
if !bytes.Equal(r.Type, TagHandshake) {
|
|
return errors.New("unexpected handshake tag")
|
|
}
|
|
|
|
if !bytes.Equal(r.PeerPID, HandshakeSenderPID) {
|
|
return errors.New("incorrect sender PID")
|
|
}
|
|
|
|
return nil
|
|
}
|
|
|
|
// NewHandshakeResponse constructs new handshake response from the given
|
|
// data.
|
|
func NewHandshakeResponse(data []byte) (*HandshakeResponse, error) {
|
|
if len(data) != 32 {
|
|
return nil, fmt.Errorf("incorrect handshake response length %d", len(data))
|
|
}
|
|
|
|
return &HandshakeResponse{
|
|
Type: data[:4],
|
|
Flags: data[4:8],
|
|
SenderPID: data[8:20],
|
|
PeerPID: data[20:],
|
|
}, nil
|
|
}
|