mirror of https://github.com/bjdgyc/anylink.git
63 lines
1.6 KiB
Go
63 lines
1.6 KiB
Go
package handshake
|
|
|
|
import (
|
|
"github.com/pion/dtls/v2/pkg/protocol"
|
|
)
|
|
|
|
// MessageHelloVerifyRequest is as follows:
|
|
//
|
|
// struct {
|
|
// ProtocolVersion server_version;
|
|
// opaque cookie<0..2^8-1>;
|
|
// } HelloVerifyRequest;
|
|
//
|
|
// The HelloVerifyRequest message type is hello_verify_request(3).
|
|
//
|
|
// When the client sends its ClientHello message to the server, the server
|
|
// MAY respond with a HelloVerifyRequest message. This message contains
|
|
// a stateless cookie generated using the technique of [PHOTURIS]. The
|
|
// client MUST retransmit the ClientHello with the cookie added.
|
|
//
|
|
// https://tools.ietf.org/html/rfc6347#section-4.2.1
|
|
type MessageHelloVerifyRequest struct {
|
|
Version protocol.Version
|
|
Cookie []byte
|
|
}
|
|
|
|
// Type returns the Handshake Type
|
|
func (m MessageHelloVerifyRequest) Type() Type {
|
|
return TypeHelloVerifyRequest
|
|
}
|
|
|
|
// Marshal encodes the Handshake
|
|
func (m *MessageHelloVerifyRequest) Marshal() ([]byte, error) {
|
|
if len(m.Cookie) > 255 {
|
|
return nil, errCookieTooLong
|
|
}
|
|
|
|
out := make([]byte, 3+len(m.Cookie))
|
|
out[0] = m.Version.Major
|
|
out[1] = m.Version.Minor
|
|
out[2] = byte(len(m.Cookie))
|
|
copy(out[3:], m.Cookie)
|
|
|
|
return out, nil
|
|
}
|
|
|
|
// Unmarshal populates the message from encoded data
|
|
func (m *MessageHelloVerifyRequest) Unmarshal(data []byte) error {
|
|
if len(data) < 3 {
|
|
return errBufferTooSmall
|
|
}
|
|
m.Version.Major = data[0]
|
|
m.Version.Minor = data[1]
|
|
cookieLength := data[2]
|
|
if len(data) < (int(cookieLength) + 3) {
|
|
return errBufferTooSmall
|
|
}
|
|
m.Cookie = make([]byte, cookieLength)
|
|
|
|
copy(m.Cookie, data[3:3+cookieLength])
|
|
return nil
|
|
}
|