From 2c975bca54b5a61f708e57c913a638397b216e43 Mon Sep 17 00:00:00 2001 From: Marten Seemann Date: Sat, 14 Nov 2020 16:46:52 +0700 Subject: [PATCH] always use a 2-byte encoding for the packet length of Long Header packets --- internal/wire/extended_header.go | 5 ++-- internal/wire/extended_header_test.go | 43 +++++++++++++++++++++++---- 2 files changed, 40 insertions(+), 8 deletions(-) diff --git a/internal/wire/extended_header.go b/internal/wire/extended_header.go index a28bd8ea..8e834ee6 100644 --- a/internal/wire/extended_header.go +++ b/internal/wire/extended_header.go @@ -161,8 +161,7 @@ func (h *ExtendedHeader) writeLongHeader(b *bytes.Buffer, _ protocol.VersionNumb utils.WriteVarInt(b, uint64(len(h.Token))) b.Write(h.Token) } - - utils.WriteVarInt(b, uint64(h.Length)) + utils.WriteVarIntWithLen(b, uint64(h.Length), 2) return h.writePacketNumber(b) } @@ -201,7 +200,7 @@ func (h *ExtendedHeader) ParsedLen() protocol.ByteCount { // GetLength determines the length of the Header. func (h *ExtendedHeader) GetLength(v protocol.VersionNumber) protocol.ByteCount { if h.IsLongHeader { - length := 1 /* type byte */ + 4 /* version */ + 1 /* dest conn ID len */ + protocol.ByteCount(h.DestConnectionID.Len()) + 1 /* src conn ID len */ + protocol.ByteCount(h.SrcConnectionID.Len()) + protocol.ByteCount(h.PacketNumberLen) + utils.VarIntLen(uint64(h.Length)) + length := 1 /* type byte */ + 4 /* version */ + 1 /* dest conn ID len */ + protocol.ByteCount(h.DestConnectionID.Len()) + 1 /* src conn ID len */ + protocol.ByteCount(h.SrcConnectionID.Len()) + protocol.ByteCount(h.PacketNumberLen) + 2 /* length */ if h.Type == protocol.PacketTypeInitial { length += utils.VarIntLen(uint64(len(h.Token))) + protocol.ByteCount(len(h.Token)) } diff --git a/internal/wire/extended_header_test.go b/internal/wire/extended_header_test.go index bb49030d..84c3b375 100644 --- a/internal/wire/extended_header_test.go +++ b/internal/wire/extended_header_test.go @@ -32,7 +32,7 @@ var _ = Describe("Header", func() { DestConnectionID: protocol.ConnectionID{0xde, 0xad, 0xbe, 0xef, 0xca, 0xfe}, SrcConnectionID: protocol.ConnectionID{0xde, 0xca, 0xfb, 0xad, 0x0, 0x0, 0x13, 0x37}, Version: 0x1020304, - Length: 0xcafe, + Length: protocol.MaxPacketSizeIPv4, }, PacketNumber: 0xdecaf, PacketNumberLen: protocol.PacketNumberLen3, @@ -45,8 +45,8 @@ var _ = Describe("Header", func() { 0x8, // src connection ID length 0xde, 0xca, 0xfb, 0xad, 0x0, 0x0, 0x13, 0x37, // source connection ID } - expected = append(expected, encodeVarInt(0xcafe)...) // length - expected = append(expected, []byte{0xd, 0xec, 0xaf}...) // packet number + expected = append(expected, encodeVarInt(protocol.MaxPacketSizeIPv4)...) // length + expected = append(expected, []byte{0xd, 0xec, 0xaf}...) // packet number Expect(buf.Bytes()).To(Equal(expected)) }) @@ -97,6 +97,22 @@ var _ = Describe("Header", func() { Expect(buf.Bytes()).To(ContainSubstring(string(expectedSubstring))) }) + It("uses a 2-byte encoding for the length on Initial packets", func() { + Expect((&ExtendedHeader{ + Header: Header{ + IsLongHeader: true, + Version: 0x1020304, + Type: protocol.PacketTypeInitial, + Length: 37, + }, + PacketNumber: 0xdecafbad, + PacketNumberLen: protocol.PacketNumberLen4, + }).Write(buf, versionIETFHeader)).To(Succeed()) + b := &bytes.Buffer{} + utils.WriteVarIntWithLen(b, 37, 2) + Expect(buf.Bytes()[buf.Len()-6 : buf.Len()-4]).To(Equal(b.Bytes())) + }) + It("writes a Retry packet", func() { token := []byte("Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.") Expect((&ExtendedHeader{Header: Header{ @@ -203,7 +219,7 @@ var _ = Describe("Header", func() { }, PacketNumberLen: protocol.PacketNumberLen1, } - expectedLen := 1 /* type byte */ + 4 /* version */ + 1 /* dest conn ID len */ + 8 /* dest conn id */ + 1 /* src conn ID len */ + 8 /* src conn id */ + 1 /* short len */ + 1 /* packet number */ + expectedLen := 1 /* type byte */ + 4 /* version */ + 1 /* dest conn ID len */ + 8 /* dest conn id */ + 1 /* src conn ID len */ + 8 /* src conn id */ + 2 /* length */ + 1 /* packet number */ Expect(h.GetLength(versionIETFHeader)).To(BeEquivalentTo(expectedLen)) Expect(h.Write(buf, versionIETFHeader)).To(Succeed()) Expect(buf.Len()).To(Equal(expectedLen)) @@ -226,6 +242,23 @@ var _ = Describe("Header", func() { Expect(buf.Len()).To(Equal(expectedLen)) }) + It("has the right length for an Initial that has a short length", func() { + h := &ExtendedHeader{ + Header: Header{ + IsLongHeader: true, + Type: protocol.PacketTypeInitial, + DestConnectionID: protocol.ConnectionID{1, 2, 3, 4, 5, 6, 7, 8}, + SrcConnectionID: protocol.ConnectionID{1, 2, 3, 4}, + Length: 15, + }, + PacketNumberLen: protocol.PacketNumberLen2, + } + expectedLen := 1 /* type byte */ + 4 /* version */ + 1 /* dest conn id len */ + 8 /* dest conn id */ + 1 /* src conn ID len */ + 4 /* src conn id */ + 1 /* token length */ + 2 /* length len */ + 2 /* packet number */ + Expect(h.GetLength(versionIETFHeader)).To(BeEquivalentTo(expectedLen)) + Expect(h.Write(buf, versionIETFHeader)).To(Succeed()) + Expect(buf.Len()).To(Equal(expectedLen)) + }) + It("has the right length for an Initial not containing a Token", func() { h := &ExtendedHeader{ Header: Header{ @@ -237,7 +270,7 @@ var _ = Describe("Header", func() { }, PacketNumberLen: protocol.PacketNumberLen2, } - expectedLen := 1 /* type byte */ + 4 /* version */ + 1 /* dest conn id len */ + 8 /* dest conn id */ + 1 /* src conn ID len */ + 4 /* src conn id */ + 1 /* token length */ + 2 /* long len */ + 2 /* packet number */ + expectedLen := 1 /* type byte */ + 4 /* version */ + 1 /* dest conn id len */ + 8 /* dest conn id */ + 1 /* src conn ID len */ + 4 /* src conn id */ + 1 /* token length */ + 2 /* length len */ + 2 /* packet number */ Expect(h.GetLength(versionIETFHeader)).To(BeEquivalentTo(expectedLen)) Expect(h.Write(buf, versionIETFHeader)).To(Succeed()) Expect(buf.Len()).To(Equal(expectedLen))