package rpc import ( "bytes" "errors" "fmt" ) type NonceResponse struct { NonceRequest Type []byte Crypto []byte } // Bytes returns serialized form of the nonce response. func (r *NonceResponse) Bytes() []byte { buf := bytes.Buffer{} buf.Write(r.Type) buf.Write(r.KeySelector) buf.Write(r.Crypto) buf.Write(r.CryptoTS) buf.Write(r.Nonce) return buf.Bytes() } func (r *NonceResponse) Valid(req *NonceRequest) error { if !bytes.Equal(r.Type, TagNonce) { return errors.New("unexpected RPC type") } if !bytes.Equal(r.Crypto, NonceCryptoAES) { return errors.New("unexpected crypto type") } if !bytes.Equal(r.KeySelector, req.KeySelector) { return errors.New("unexpected key selector") } return nil } // NewNonceResponse build new nonce response based on the given data. func NewNonceResponse(data []byte) (*NonceResponse, error) { if len(data) != 32 { return nil, fmt.Errorf("unexpected message length %d", len(data)) } return &NonceResponse{ NonceRequest: NonceRequest{ KeySelector: data[4:8], CryptoTS: data[12:16], Nonce: data[16:], }, Type: data[:4], Crypto: data[8:12], }, nil }