From fe45644335ae9869c23d4b07ffd4dd55ca06a345 Mon Sep 17 00:00:00 2001 From: Marten Seemann Date: Sat, 11 Jun 2016 11:14:19 +0700 Subject: [PATCH] don't write private header for QUIC Version >= 34 ref #55 --- packet_packer.go | 24 +++++++++++++++++------- packet_packer_test.go | 23 +++++++++++++++++++++++ 2 files changed, 40 insertions(+), 7 deletions(-) diff --git a/packet_packer.go b/packet_packer.go index 441981e2..69da8164 100644 --- a/packet_packer.go +++ b/packet_packer.go @@ -127,12 +127,16 @@ func (p *packetPacker) packPacket(stopWaitingFrame *frames.StopWaitingFrame, con return nil, err } - entropyBit, err := utils.RandomBit() - if err != nil { - return nil, err - } - if entropyBit { - payload[0] = 1 + // set entropy bit in Private Header, for QUIC version < 34 + var entropyBit bool + if p.version < protocol.Version34 { + entropyBit, err = utils.RandomBit() + if err != nil { + return nil, err + } + if entropyBit { + payload[0] = 1 + } } var raw bytes.Buffer @@ -157,7 +161,13 @@ func (p *packetPacker) packPacket(stopWaitingFrame *frames.StopWaitingFrame, con func (p *packetPacker) getPayload(frames []frames.Frame, currentPacketNumber protocol.PacketNumber) ([]byte, error) { var payload bytes.Buffer - payload.WriteByte(0) // The entropy bit is set in sendPayload + + // reserve 1 byte for the Private Header, for QUIC Version < 34 + // the entropy bit is set in sendPayload + if p.version < protocol.Version34 { + payload.WriteByte(0) + } + for _, frame := range frames { frame.Write(&payload, p.version) } diff --git a/packet_packer_test.go b/packet_packer_test.go index 05675371..96bde5ce 100644 --- a/packet_packer_test.go +++ b/packet_packer_test.go @@ -68,6 +68,29 @@ var _ = Describe("Packet packer", func() { Expect(err).ToNot(HaveOccurred()) }) + It("doesn't set a private header for QUIC version >= 34", func() { + // This is not trivial to test, since PackPacket() already encrypts the packet + // So pack the packet for QUIC 33, then for QUIC 34. The packet for QUIC 33 should be 1 byte longer, since it contains the Private Header + f := frames.StreamFrame{ + StreamID: 5, + Data: []byte("foobar"), + } + // pack the packet for QUIC version 33 + packer.version = protocol.Version33 + packer.AddStreamFrame(f) + p33, err := packer.PackPacket(nil, []frames.Frame{}) + Expect(err).ToNot(HaveOccurred()) + Expect(p33).ToNot(BeNil()) + // pack the packet for QUIC version 34 + packer.version = protocol.Version34 + packer.AddStreamFrame(f) + p34, err := packer.PackPacket(nil, []frames.Frame{}) + Expect(err).ToNot(HaveOccurred()) + Expect(p34).ToNot(BeNil()) + Expect(p34.entropyBit).To(BeFalse()) + Expect(p34.raw).To(HaveLen(len(p33.raw) - 1)) + }) + It("packs single packets", func() { f := frames.StreamFrame{ StreamID: 5,