Files
quic-go/internal/handshake/tl_extension_handler_server.go
2017-09-29 17:35:22 +07:00

69 lines
1.8 KiB
Go

package handshake
import (
"bytes"
"errors"
"fmt"
"github.com/bifurcation/mint"
"github.com/bifurcation/mint/syntax"
"github.com/lucas-clemente/quic-go/internal/protocol"
)
type extensionHandlerServer struct {
params *paramsNegotiator
}
var _ mint.AppExtensionHandler = &extensionHandlerServer{}
func newExtensionHandlerServer(params *paramsNegotiator) *extensionHandlerServer {
return &extensionHandlerServer{params: params}
}
func (h *extensionHandlerServer) Send(hType mint.HandshakeType, el *mint.ExtensionList) error {
if hType != mint.HandshakeTypeEncryptedExtensions {
return nil
}
transportParams := append(
h.params.GetTransportParameters(),
transportParameter{statelessResetTokenParameterID, bytes.Repeat([]byte{42}, 16)},
)
data, err := syntax.Marshal(encryptedExtensionsTransportParameters{
SupportedVersions: []uint32{uint32(protocol.VersionTLS)},
Parameters: transportParams,
})
if err != nil {
return err
}
return el.Add(&tlsExtensionBody{data})
}
func (h *extensionHandlerServer) Receive(hType mint.HandshakeType, el *mint.ExtensionList) error {
ext := &tlsExtensionBody{}
found := el.Find(ext)
if hType != mint.HandshakeTypeClientHello {
if found {
return fmt.Errorf("Unexpected QUIC extension in handshake message %d", hType)
}
return nil
}
if !found {
return errors.New("ClientHello didn't contain a QUIC extension")
}
chtp := &clientHelloTransportParameters{}
if _, err := syntax.Unmarshal(ext.data, chtp); err != nil {
return err
}
// TODO: check versions
for _, p := range chtp.Parameters {
if p.Parameter == statelessResetTokenParameterID {
// TODO: return the correct error type
return errors.New("client sent a stateless reset token")
}
}
return h.params.SetFromTransportParameters(chtp.Parameters)
}