don't write private header for QUIC Version >= 34

ref #55
This commit is contained in:
Marten Seemann
2016-06-11 11:14:19 +07:00
parent 3ba8ec73d8
commit fe45644335
2 changed files with 40 additions and 7 deletions

View File

@@ -127,13 +127,17 @@ func (p *packetPacker) packPacket(stopWaitingFrame *frames.StopWaitingFrame, con
return nil, err
}
entropyBit, err := utils.RandomBit()
// 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
if err := responsePublicHeader.WritePublicHeader(&raw, p.version); err != nil {
@@ -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)
}

View File

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