From 00e1884a8876ee7c8fd4b45218013d04a7742088 Mon Sep 17 00:00:00 2001 From: Marten Seemann Date: Sun, 19 Aug 2018 13:59:06 +0700 Subject: [PATCH] move reading of stateless reset tokens to the transport parameter struct --- .../handshake/tls_extension_handler_client.go | 18 +++--------------- .../tls_extension_handler_client_test.go | 7 ------- .../handshake/tls_extension_handler_server.go | 10 ++++------ .../tls_extension_handler_server_test.go | 3 ++- internal/handshake/transport_parameter_test.go | 15 ++++++++++++++- internal/handshake/transport_parameters.go | 5 +++++ 6 files changed, 28 insertions(+), 30 deletions(-) diff --git a/internal/handshake/tls_extension_handler_client.go b/internal/handshake/tls_extension_handler_client.go index 8e711be58..7b80c223e 100644 --- a/internal/handshake/tls_extension_handler_client.go +++ b/internal/handshake/tls_extension_handler_client.go @@ -107,25 +107,13 @@ func (h *extensionHandlerClient) Receive(hType mint.HandshakeType, el *mint.Exte } } - // check that the server sent the stateless reset token - var foundStatelessResetToken bool - for _, p := range eetp.Parameters { - if p.Parameter == statelessResetTokenParameterID { - if len(p.Value) != 16 { - return fmt.Errorf("wrong length for stateless_reset_token: %d (expected 16)", len(p.Value)) - } - foundStatelessResetToken = true - // TODO: handle this value - } - } - if !foundStatelessResetToken { - // TODO: return the right error here - return errors.New("server didn't sent stateless_reset_token") - } params, err := readTransportParameters(eetp.Parameters) if err != nil { return err } + if len(params.StatelessResetToken) == 0 { + return errors.New("server didn't sent stateless_reset_token") + } h.logger.Debugf("Received Transport Parameters: %s", params) h.paramsChan <- *params return nil diff --git a/internal/handshake/tls_extension_handler_client_test.go b/internal/handshake/tls_extension_handler_client_test.go index b3ae2e3a0..82d5f51e6 100644 --- a/internal/handshake/tls_extension_handler_client_test.go +++ b/internal/handshake/tls_extension_handler_client_test.go @@ -135,13 +135,6 @@ var _ = Describe("TLS Extension Handler, for the client", func() { Expect(err).To(MatchError("server didn't sent stateless_reset_token")) }) - It("errors if the stateless reset token has the wrong length", func() { - parameters[statelessResetTokenParameterID] = bytes.Repeat([]byte{0}, 15) // should be 16 - addEncryptedExtensionsWithParameters(parameters) - err := handler.Receive(mint.HandshakeTypeEncryptedExtensions, &el) - Expect(err).To(MatchError("wrong length for stateless_reset_token: 15 (expected 16)")) - }) - Context("Version Negotiation", func() { It("accepts a valid version negotiation", func() { done := make(chan struct{}) diff --git a/internal/handshake/tls_extension_handler_server.go b/internal/handshake/tls_extension_handler_server.go index 20d8d674e..fdd4963ac 100644 --- a/internal/handshake/tls_extension_handler_server.go +++ b/internal/handshake/tls_extension_handler_server.go @@ -96,16 +96,14 @@ func (h *extensionHandlerServer) Receive(hType mint.HandshakeType, el *mint.Exte return qerr.Error(qerr.VersionNegotiationMismatch, "Client should have used the initial version") } - for _, p := range chtp.Parameters { - if p.Parameter == statelessResetTokenParameterID { - // TODO: return the correct error type - return errors.New("client sent a stateless reset token") - } - } params, err := readTransportParameters(chtp.Parameters) if err != nil { return err } + if len(params.StatelessResetToken) != 0 { + // TODO: return the correct error type + return errors.New("client sent a stateless reset token") + } h.logger.Debugf("Received Transport Parameters: %s", params) h.paramsChan <- *params return nil diff --git a/internal/handshake/tls_extension_handler_server_test.go b/internal/handshake/tls_extension_handler_server_test.go index e49922417..1f648c095 100644 --- a/internal/handshake/tls_extension_handler_server_test.go +++ b/internal/handshake/tls_extension_handler_server_test.go @@ -1,6 +1,7 @@ package handshake import ( + "bytes" "fmt" "github.com/bifurcation/mint" @@ -118,7 +119,7 @@ var _ = Describe("TLS Extension Handler, for the server", func() { }) It("rejects messages that contain a stateless reset token", func() { - parameters[statelessResetTokenParameterID] = []byte("reset") + parameters[statelessResetTokenParameterID] = bytes.Repeat([]byte{0}, 16) addClientHelloWithParameters(parameters) err := handler.Receive(mint.HandshakeTypeClientHello, &el) Expect(err).To(MatchError("client sent a stateless reset token")) diff --git a/internal/handshake/transport_parameter_test.go b/internal/handshake/transport_parameter_test.go index dd5bdf9bb..d13b07eef 100644 --- a/internal/handshake/transport_parameter_test.go +++ b/internal/handshake/transport_parameter_test.go @@ -1,6 +1,7 @@ package handshake import ( + "bytes" "time" "github.com/lucas-clemente/quic-go/internal/protocol" @@ -122,9 +123,13 @@ var _ = Describe("Transport Parameters", func() { }) Context("parsing", func() { - var parameters map[transportParameterID][]byte + var ( + parameters map[transportParameterID][]byte + statelessResetToken []byte + ) BeforeEach(func() { + statelessResetToken = bytes.Repeat([]byte{42}, 16) parameters = map[transportParameterID][]byte{ initialMaxStreamDataParameterID: {0x11, 0x22, 0x33, 0x44}, initialMaxDataParameterID: {0x22, 0x33, 0x44, 0x55}, @@ -133,6 +138,7 @@ var _ = Describe("Transport Parameters", func() { idleTimeoutParameterID: {0x13, 0x37}, maxPacketSizeParameterID: {0x73, 0x31}, disableMigrationParameterID: {}, + statelessResetTokenParameterID: statelessResetToken, } }) It("reads parameters", func() { @@ -146,6 +152,7 @@ var _ = Describe("Transport Parameters", func() { Expect(params.OmitConnectionID).To(BeFalse()) Expect(params.MaxPacketSize).To(Equal(protocol.ByteCount(0x7331))) Expect(params.DisableMigration).To(BeTrue()) + Expect(params.StatelessResetToken).To(Equal(statelessResetToken)) }) It("rejects the parameters if the idle_timeout is missing", func() { @@ -211,6 +218,12 @@ var _ = Describe("Transport Parameters", func() { Expect(err).To(MatchError("wrong length for disable_migration: 1 (expected empty)")) }) + It("rejects the parameters if the stateless_reset_token has the wrong length", func() { + parameters[statelessResetTokenParameterID] = statelessResetToken[1:] + _, err := readTransportParameters(paramsMapToList(parameters)) + Expect(err).To(MatchError("wrong length for stateless_reset_token: 15 (expected 16)")) + }) + It("ignores unknown parameters", func() { parameters[1337] = []byte{42} _, err := readTransportParameters(paramsMapToList(parameters)) diff --git a/internal/handshake/transport_parameters.go b/internal/handshake/transport_parameters.go index 46174a897..cafca5ae3 100644 --- a/internal/handshake/transport_parameters.go +++ b/internal/handshake/transport_parameters.go @@ -144,6 +144,11 @@ func readTransportParameters(paramsList []transportParameter) (*TransportParamet return nil, fmt.Errorf("wrong length for disable_migration: %d (expected empty)", len(p.Value)) } params.DisableMigration = true + case statelessResetTokenParameterID: + if len(p.Value) != 16 { + return nil, fmt.Errorf("wrong length for stateless_reset_token: %d (expected 16)", len(p.Value)) + } + params.StatelessResetToken = p.Value } }