forked from quic-go/quic-go
disable 6 byte packet number in Public Headers
Chrome never sends 6 byte packet numbers in Public Headers.
This commit is contained in:
@@ -82,7 +82,7 @@ var _ = Describe("Header", func() {
|
||||
DestConnectionID: connID,
|
||||
SrcConnectionID: connID,
|
||||
PacketNumber: 0x1337,
|
||||
PacketNumberLen: protocol.PacketNumberLen6,
|
||||
PacketNumberLen: protocol.PacketNumberLen4,
|
||||
}).writePublicHeader(buf, protocol.PerspectiveClient, versionPublicHeader)
|
||||
Expect(err).ToNot(HaveOccurred())
|
||||
hdr, err := ParseHeaderSentByClient(bytes.NewReader(buf.Bytes()))
|
||||
@@ -101,7 +101,7 @@ var _ = Describe("Header", func() {
|
||||
DestConnectionID: connID,
|
||||
SrcConnectionID: connID,
|
||||
PacketNumber: 0x1337,
|
||||
PacketNumberLen: protocol.PacketNumberLen6,
|
||||
PacketNumberLen: protocol.PacketNumberLen4,
|
||||
DiversificationNonce: bytes.Repeat([]byte{'f'}, 32),
|
||||
}).writePublicHeader(buf, protocol.PerspectiveServer, versionPublicHeader)
|
||||
Expect(err).ToNot(HaveOccurred())
|
||||
@@ -122,7 +122,7 @@ var _ = Describe("Header", func() {
|
||||
DestConnectionID: protocol.ConnectionID{1, 2, 3, 4, 5, 6, 7, 8},
|
||||
SrcConnectionID: protocol.ConnectionID{1, 2, 3, 4, 5, 6, 7, 8},
|
||||
PacketNumber: 0x1337,
|
||||
PacketNumberLen: protocol.PacketNumberLen6,
|
||||
PacketNumberLen: protocol.PacketNumberLen2,
|
||||
}).writePublicHeader(buf, protocol.PerspectiveClient, versionPublicHeader)
|
||||
Expect(err).ToNot(HaveOccurred())
|
||||
_, err = ParseHeaderSentByClient(bytes.NewReader(buf.Bytes()[0:12]))
|
||||
|
||||
@@ -16,6 +16,7 @@ var (
|
||||
errReceivedOmittedConnectionID = qerr.Error(qerr.InvalidPacketHeader, "receiving packets with omitted ConnectionID is not supported")
|
||||
errInvalidConnectionID = qerr.Error(qerr.InvalidPacketHeader, "connection ID cannot be 0")
|
||||
errGetLengthNotForVersionNegotiation = errors.New("PublicHeader: GetLength cannot be called for VersionNegotiation packets")
|
||||
errInvalidPacketNumberLen6 = errors.New("invalid packet number length: 6 bytes")
|
||||
)
|
||||
|
||||
// writePublicHeader writes a Public Header.
|
||||
@@ -58,8 +59,6 @@ func (h *Header) writePublicHeader(b *bytes.Buffer, pers protocol.Perspective, _
|
||||
publicFlagByte |= 0x10
|
||||
case protocol.PacketNumberLen4:
|
||||
publicFlagByte |= 0x20
|
||||
case protocol.PacketNumberLen6:
|
||||
publicFlagByte |= 0x30
|
||||
}
|
||||
}
|
||||
b.WriteByte(publicFlagByte)
|
||||
@@ -86,7 +85,7 @@ func (h *Header) writePublicHeader(b *bytes.Buffer, pers protocol.Perspective, _
|
||||
case protocol.PacketNumberLen4:
|
||||
utils.BigEndian.WriteUint32(b, uint32(h.PacketNumber))
|
||||
case protocol.PacketNumberLen6:
|
||||
utils.BigEndian.WriteUint48(b, uint64(h.PacketNumber)&(1<<48-1))
|
||||
return errInvalidPacketNumberLen6
|
||||
default:
|
||||
return errors.New("PublicHeader: PacketNumberLen not set")
|
||||
}
|
||||
@@ -120,7 +119,7 @@ func parsePublicHeader(b *bytes.Reader, packetSentBy protocol.Perspective) (*Hea
|
||||
if header.hasPacketNumber(packetSentBy) {
|
||||
switch publicFlagByte & 0x30 {
|
||||
case 0x30:
|
||||
header.PacketNumberLen = protocol.PacketNumberLen6
|
||||
return nil, errInvalidPacketNumberLen6
|
||||
case 0x20:
|
||||
header.PacketNumberLen = protocol.PacketNumberLen4
|
||||
case 0x10:
|
||||
@@ -211,8 +210,11 @@ func (h *Header) getPublicHeaderLength(pers protocol.Perspective) (protocol.Byte
|
||||
}
|
||||
|
||||
length := protocol.ByteCount(1) // 1 byte for public flags
|
||||
if h.PacketNumberLen == protocol.PacketNumberLen6 {
|
||||
return 0, errInvalidPacketNumberLen6
|
||||
}
|
||||
if h.hasPacketNumber(pers) {
|
||||
if h.PacketNumberLen != protocol.PacketNumberLen1 && h.PacketNumberLen != protocol.PacketNumberLen2 && h.PacketNumberLen != protocol.PacketNumberLen4 && h.PacketNumberLen != protocol.PacketNumberLen6 {
|
||||
if h.PacketNumberLen != protocol.PacketNumberLen1 && h.PacketNumberLen != protocol.PacketNumberLen2 && h.PacketNumberLen != protocol.PacketNumberLen4 {
|
||||
return 0, errPacketNumberLenNotSet
|
||||
}
|
||||
length += protocol.ByteCount(h.PacketNumberLen)
|
||||
|
||||
@@ -163,13 +163,10 @@ var _ = Describe("Public Header", func() {
|
||||
Expect(b.Len()).To(BeZero())
|
||||
})
|
||||
|
||||
It("accepts 6-byte packet numbers", func() {
|
||||
It("rejects 6-byte packet numbers", func() {
|
||||
b := bytes.NewReader([]byte{0x38, 0x4c, 0xfa, 0x9f, 0x9b, 0x66, 0x86, 0x19, 0xf6, 0x23, 0x42, 0xad, 0xfb, 0xca, 0xde})
|
||||
hdr, err := parsePublicHeader(b, protocol.PerspectiveClient)
|
||||
Expect(err).ToNot(HaveOccurred())
|
||||
Expect(hdr.PacketNumber).To(Equal(protocol.PacketNumber(0x2342adfbcade)))
|
||||
Expect(hdr.PacketNumberLen).To(Equal(protocol.PacketNumberLen6))
|
||||
Expect(b.Len()).To(BeZero())
|
||||
_, err := parsePublicHeader(b, protocol.PerspectiveClient)
|
||||
Expect(err).To(MatchError(errInvalidPacketNumberLen6))
|
||||
})
|
||||
})
|
||||
})
|
||||
@@ -181,11 +178,11 @@ var _ = Describe("Public Header", func() {
|
||||
DestConnectionID: connID,
|
||||
SrcConnectionID: connID,
|
||||
PacketNumber: 2,
|
||||
PacketNumberLen: protocol.PacketNumberLen6,
|
||||
PacketNumberLen: protocol.PacketNumberLen4,
|
||||
}
|
||||
err := hdr.writePublicHeader(b, protocol.PerspectiveServer, versionBigEndian)
|
||||
Expect(err).ToNot(HaveOccurred())
|
||||
Expect(b.Bytes()).To(Equal([]byte{0x38, 0x4c, 0xfa, 0x9f, 0x9b, 0x66, 0x86, 0x19, 0xf6, 0, 0, 0, 0, 0, 2}))
|
||||
Expect(b.Bytes()).To(Equal([]byte{0x28, 0x4c, 0xfa, 0x9f, 0x9b, 0x66, 0x86, 0x19, 0xf6, 0, 0, 0, 2}))
|
||||
})
|
||||
|
||||
It("writes a sample header as a client", func() {
|
||||
@@ -194,11 +191,11 @@ var _ = Describe("Public Header", func() {
|
||||
DestConnectionID: connID,
|
||||
SrcConnectionID: connID,
|
||||
PacketNumber: 0x1337,
|
||||
PacketNumberLen: protocol.PacketNumberLen6,
|
||||
PacketNumberLen: protocol.PacketNumberLen2,
|
||||
}
|
||||
err := hdr.writePublicHeader(b, protocol.PerspectiveClient, versionBigEndian)
|
||||
Expect(err).ToNot(HaveOccurred())
|
||||
Expect(b.Bytes()).To(Equal([]byte{0x38, 0x4c, 0xfa, 0x9f, 0x9b, 0x66, 0x86, 0x19, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x13, 0x37}))
|
||||
Expect(b.Bytes()).To(Equal([]byte{0x18, 0x4c, 0xfa, 0x9f, 0x9b, 0x66, 0x86, 0x19, 0xf6, 0x13, 0x37}))
|
||||
})
|
||||
|
||||
It("refuses to write a Public Header if the source and destination connection IDs are not matching", func() {
|
||||
@@ -207,7 +204,7 @@ var _ = Describe("Public Header", func() {
|
||||
DestConnectionID: protocol.ConnectionID{1, 2, 3, 4, 5, 6, 7, 8},
|
||||
SrcConnectionID: protocol.ConnectionID{8, 7, 6, 5, 4, 3, 2, 1},
|
||||
PacketNumber: 0x1337,
|
||||
PacketNumberLen: protocol.PacketNumberLen6,
|
||||
PacketNumberLen: protocol.PacketNumberLen4,
|
||||
}
|
||||
err := hdr.writePublicHeader(b, protocol.PerspectiveClient, versionBigEndian)
|
||||
Expect(err).To(MatchError("PublicHeader: SrcConnectionID must be equal to DestConnectionID"))
|
||||
@@ -380,11 +377,11 @@ var _ = Describe("Public Header", func() {
|
||||
DestConnectionID: connID,
|
||||
SrcConnectionID: connID,
|
||||
PacketNumber: 0xdecafbad,
|
||||
PacketNumberLen: protocol.PacketNumberLen6,
|
||||
PacketNumberLen: protocol.PacketNumberLen4,
|
||||
}
|
||||
length, err := hdr.getPublicHeaderLength(protocol.PerspectiveServer)
|
||||
Expect(err).ToNot(HaveOccurred())
|
||||
Expect(length).To(Equal(protocol.ByteCount(1 + 8 + 6))) // 1 byte public flag, 8 bytes connectionID, and packet number
|
||||
Expect(length).To(Equal(protocol.ByteCount(1 + 8 + 4))) // 1 byte public flag, 8 bytes connectionID, and packet number
|
||||
})
|
||||
|
||||
It("gets the lengths of a packet sent by the client with the VersionFlag set", func() {
|
||||
@@ -393,13 +390,13 @@ var _ = Describe("Public Header", func() {
|
||||
SrcConnectionID: connID,
|
||||
OmitConnectionID: true,
|
||||
PacketNumber: 0xdecafbad,
|
||||
PacketNumberLen: protocol.PacketNumberLen6,
|
||||
PacketNumberLen: protocol.PacketNumberLen4,
|
||||
VersionFlag: true,
|
||||
Version: versionBigEndian,
|
||||
}
|
||||
length, err := hdr.getPublicHeaderLength(protocol.PerspectiveClient)
|
||||
Expect(err).ToNot(HaveOccurred())
|
||||
Expect(length).To(Equal(protocol.ByteCount(1 + 4 + 6))) // 1 byte public flag, 4 version number, and packet number
|
||||
Expect(length).To(Equal(protocol.ByteCount(1 + 4 + 4))) // 1 byte public flag, 4 version number, and packet number
|
||||
})
|
||||
|
||||
It("gets the length of a packet with longest packet number length and omitted connectionID", func() {
|
||||
@@ -408,11 +405,11 @@ var _ = Describe("Public Header", func() {
|
||||
SrcConnectionID: connID,
|
||||
OmitConnectionID: true,
|
||||
PacketNumber: 0xDECAFBAD,
|
||||
PacketNumberLen: protocol.PacketNumberLen6,
|
||||
PacketNumberLen: protocol.PacketNumberLen4,
|
||||
}
|
||||
length, err := hdr.getPublicHeaderLength(protocol.PerspectiveServer)
|
||||
Expect(err).ToNot(HaveOccurred())
|
||||
Expect(length).To(Equal(protocol.ByteCount(1 + 6))) // 1 byte public flag, and packet number
|
||||
Expect(length).To(Equal(protocol.ByteCount(1 + 4))) // 1 byte public flag, and packet number
|
||||
})
|
||||
|
||||
It("gets the length of a packet 2 byte packet number length ", func() {
|
||||
@@ -503,7 +500,7 @@ var _ = Describe("Public Header", func() {
|
||||
Expect(b.Bytes()).To(Equal([]byte{0x28, 0x4c, 0xfa, 0x9f, 0x9b, 0x66, 0x86, 0x19, 0xf6, 0xde, 0xca, 0xfb, 0xad}))
|
||||
})
|
||||
|
||||
It("writes a header with a 6-byte packet number", func() {
|
||||
It("refuses to write a header with a 6-byte packet number", func() {
|
||||
b := &bytes.Buffer{}
|
||||
hdr := Header{
|
||||
DestConnectionID: connID,
|
||||
@@ -512,8 +509,7 @@ var _ = Describe("Public Header", func() {
|
||||
PacketNumberLen: protocol.PacketNumberLen6,
|
||||
}
|
||||
err := hdr.writePublicHeader(b, protocol.PerspectiveServer, version)
|
||||
Expect(err).ToNot(HaveOccurred())
|
||||
Expect(b.Bytes()).To(Equal([]byte{0x38, 0x4c, 0xfa, 0x9f, 0x9b, 0x66, 0x86, 0x19, 0xf6, 0x13, 0x37, 0xde, 0xca, 0xfb, 0xad}))
|
||||
Expect(err).To(MatchError(errInvalidPacketNumberLen6))
|
||||
})
|
||||
})
|
||||
})
|
||||
|
||||
Reference in New Issue
Block a user