move reading of stateless reset tokens to the transport parameter struct

This commit is contained in:
Marten Seemann
2018-08-19 13:59:06 +07:00
parent 2c75b795ae
commit 00e1884a88
6 changed files with 28 additions and 30 deletions

View File

@@ -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

View File

@@ -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{})

View File

@@ -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

View File

@@ -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"))

View File

@@ -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))

View File

@@ -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
}
}