forked from quic-go/quic-go
69 lines
1.8 KiB
Go
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)
|
|
}
|