github.com/danielpfeifer02/quic-go-prio-packs@v0.41.0-28/packet_packer_test.go (about) 1 package quic 2 3 import ( 4 "bytes" 5 "errors" 6 "fmt" 7 "net" 8 "time" 9 10 "golang.org/x/exp/rand" 11 12 "github.com/danielpfeifer02/quic-go-prio-packs/internal/ackhandler" 13 "github.com/danielpfeifer02/quic-go-prio-packs/internal/handshake" 14 "github.com/danielpfeifer02/quic-go-prio-packs/internal/mocks" 15 mockackhandler "github.com/danielpfeifer02/quic-go-prio-packs/internal/mocks/ackhandler" 16 "github.com/danielpfeifer02/quic-go-prio-packs/internal/protocol" 17 "github.com/danielpfeifer02/quic-go-prio-packs/internal/qerr" 18 "github.com/danielpfeifer02/quic-go-prio-packs/internal/utils" 19 "github.com/danielpfeifer02/quic-go-prio-packs/internal/wire" 20 21 . "github.com/onsi/ginkgo/v2" 22 . "github.com/onsi/gomega" 23 "go.uber.org/mock/gomock" 24 ) 25 26 var _ = Describe("Packet packer", func() { 27 const maxPacketSize protocol.ByteCount = 1357 28 const version = protocol.Version1 29 30 var ( 31 packer *packetPacker 32 retransmissionQueue *retransmissionQueue 33 datagramQueue *datagramQueue 34 framer *MockFrameSource 35 ackFramer *MockAckFrameSource 36 initialStream *MockCryptoStream 37 handshakeStream *MockCryptoStream 38 sealingManager *MockSealingManager 39 pnManager *mockackhandler.MockSentPacketHandler 40 ) 41 connID := protocol.ParseConnectionID([]byte{1, 2, 3, 4, 5, 6, 7, 8}) 42 43 parsePacket := func(data []byte) (hdrs []*wire.ExtendedHeader, more []byte) { 44 for len(data) > 0 { 45 if !wire.IsLongHeaderPacket(data[0]) { 46 break 47 } 48 hdr, _, more, err := wire.ParsePacket(data) 49 Expect(err).ToNot(HaveOccurred()) 50 r := bytes.NewReader(data) 51 extHdr, err := hdr.ParseExtended(r, version) 52 Expect(err).ToNot(HaveOccurred()) 53 ExpectWithOffset(1, extHdr.Length).To(BeEquivalentTo(r.Len() - len(more) + int(extHdr.PacketNumberLen))) 54 ExpectWithOffset(1, extHdr.Length+protocol.ByteCount(extHdr.PacketNumberLen)).To(BeNumerically(">=", 4)) 55 data = more 56 hdrs = append(hdrs, extHdr) 57 } 58 return hdrs, data 59 } 60 61 parseShortHeaderPacket := func(data []byte) { 62 l, _, pnLen, _, err := wire.ParseShortHeader(data, connID.Len()) 63 ExpectWithOffset(1, err).ToNot(HaveOccurred()) 64 ExpectWithOffset(1, len(data)-l+int(pnLen)).To(BeNumerically(">=", 4)) 65 } 66 67 expectAppendStreamFrames := func(frames ...ackhandler.StreamFrame) { 68 framer.EXPECT().AppendStreamFrames(gomock.Any(), gomock.Any(), gomock.Any()).DoAndReturn(func(fs []ackhandler.StreamFrame, _ protocol.ByteCount, v protocol.Version) ([]ackhandler.StreamFrame, protocol.ByteCount) { 69 var length protocol.ByteCount 70 for _, f := range frames { 71 length += f.Frame.Length(v) 72 } 73 return append(fs, frames...), length 74 }) 75 } 76 77 expectAppendControlFrames := func(frames ...ackhandler.Frame) { 78 framer.EXPECT().AppendControlFrames(gomock.Any(), gomock.Any(), gomock.Any()).DoAndReturn(func(fs []ackhandler.Frame, _ protocol.ByteCount, v protocol.Version) ([]ackhandler.Frame, protocol.ByteCount) { 79 var length protocol.ByteCount 80 for _, f := range frames { 81 length += f.Frame.Length(v) 82 } 83 return append(fs, frames...), length 84 }) 85 } 86 87 BeforeEach(func() { 88 rand.Seed(uint64(GinkgoRandomSeed())) 89 retransmissionQueue = newRetransmissionQueue() 90 mockSender := NewMockStreamSender(mockCtrl) 91 mockSender.EXPECT().onHasStreamData(gomock.Any()).AnyTimes() 92 initialStream = NewMockCryptoStream(mockCtrl) 93 handshakeStream = NewMockCryptoStream(mockCtrl) 94 framer = NewMockFrameSource(mockCtrl) 95 ackFramer = NewMockAckFrameSource(mockCtrl) 96 sealingManager = NewMockSealingManager(mockCtrl) 97 pnManager = mockackhandler.NewMockSentPacketHandler(mockCtrl) 98 datagramQueue = newDatagramQueue(func() {}, utils.DefaultLogger) 99 100 packer = newPacketPacker(protocol.ParseConnectionID([]byte{1, 2, 3, 4, 5, 6, 7, 8}), func() protocol.ConnectionID { return connID }, initialStream, handshakeStream, pnManager, retransmissionQueue, sealingManager, framer, ackFramer, datagramQueue, protocol.PerspectiveServer) 101 }) 102 103 Context("determining the maximum packet size", func() { 104 It("uses the minimum initial size, if it can't determine if the remote address is IPv4 or IPv6", func() { 105 Expect(getMaxPacketSize(&net.TCPAddr{})).To(BeEquivalentTo(protocol.MinInitialPacketSize)) 106 }) 107 108 It("uses the maximum IPv4 packet size, if the remote address is IPv4", func() { 109 addr := &net.UDPAddr{IP: net.IPv4(11, 12, 13, 14), Port: 1337} 110 Expect(getMaxPacketSize(addr)).To(BeEquivalentTo(protocol.InitialPacketSizeIPv4)) 111 }) 112 113 It("uses the maximum IPv6 packet size, if the remote address is IPv6", func() { 114 ip := net.ParseIP("2001:0db8:85a3:0000:0000:8a2e:0370:7334") 115 addr := &net.UDPAddr{IP: ip, Port: 1337} 116 Expect(getMaxPacketSize(addr)).To(BeEquivalentTo(protocol.InitialPacketSizeIPv6)) 117 }) 118 }) 119 120 Context("generating a packet header", func() { 121 It("uses the Long Header format", func() { 122 pnManager.EXPECT().PeekPacketNumber(protocol.EncryptionHandshake).Return(protocol.PacketNumber(0x42), protocol.PacketNumberLen3) 123 h := packer.getLongHeader(protocol.EncryptionHandshake, protocol.Version1) 124 Expect(h.PacketNumber).To(Equal(protocol.PacketNumber(0x42))) 125 Expect(h.PacketNumberLen).To(Equal(protocol.PacketNumberLen3)) 126 Expect(h.Version).To(Equal(protocol.Version1)) 127 }) 128 129 It("sets source and destination connection ID", func() { 130 pnManager.EXPECT().PeekPacketNumber(protocol.EncryptionHandshake).Return(protocol.PacketNumber(0x42), protocol.PacketNumberLen2) 131 srcConnID := protocol.ParseConnectionID([]byte{1, 2, 3, 4, 5, 6, 7, 8}) 132 destConnID := protocol.ParseConnectionID([]byte{8, 7, 6, 5, 4, 3, 2, 1}) 133 packer.srcConnID = srcConnID 134 packer.getDestConnID = func() protocol.ConnectionID { return destConnID } 135 h := packer.getLongHeader(protocol.EncryptionHandshake, protocol.Version1) 136 Expect(h.SrcConnectionID).To(Equal(srcConnID)) 137 Expect(h.DestConnectionID).To(Equal(destConnID)) 138 }) 139 }) 140 141 Context("encrypting packets", func() { 142 It("encrypts a packet", func() { 143 pnManager.EXPECT().PeekPacketNumber(protocol.Encryption1RTT).Return(protocol.PacketNumber(0x1337), protocol.PacketNumberLen2) 144 pnManager.EXPECT().PopPacketNumber(protocol.Encryption1RTT).Return(protocol.PacketNumber(0x1337)) 145 sealer := mocks.NewMockShortHeaderSealer(mockCtrl) 146 sealer.EXPECT().Overhead().Return(4).AnyTimes() 147 var hdrRaw []byte 148 gomock.InOrder( 149 sealer.EXPECT().KeyPhase().Return(protocol.KeyPhaseOne), 150 sealer.EXPECT().Seal(gomock.Any(), gomock.Any(), protocol.PacketNumber(0x1337), gomock.Any()).DoAndReturn(func(_, src []byte, _ protocol.PacketNumber, aad []byte) []byte { 151 hdrRaw = append([]byte{}, aad...) 152 return append(src, []byte{0xde, 0xca, 0xfb, 0xad}...) 153 }), 154 sealer.EXPECT().EncryptHeader(gomock.Any(), gomock.Any(), gomock.Any()).Do(func(sample []byte, firstByte *byte, pnBytes []byte) { 155 Expect(firstByte).To(Equal(&hdrRaw[0])) 156 Expect(pnBytes).To(Equal(hdrRaw[len(hdrRaw)-2:])) 157 *firstByte ^= 0xff // invert the first byte 158 // invert the packet number bytes 159 for i := range pnBytes { 160 pnBytes[i] ^= 0xff 161 } 162 }), 163 ) 164 framer.EXPECT().HasData().Return(true) 165 sealingManager.EXPECT().GetInitialSealer().Return(nil, nil) 166 sealingManager.EXPECT().GetHandshakeSealer().Return(nil, nil) 167 sealingManager.EXPECT().Get1RTTSealer().Return(sealer, nil) 168 ackFramer.EXPECT().GetAckFrame(protocol.Encryption1RTT, false) 169 expectAppendControlFrames() 170 f := &wire.StreamFrame{Data: []byte{0xde, 0xca, 0xfb, 0xad}} 171 expectAppendStreamFrames(ackhandler.StreamFrame{Frame: f}) 172 p, err := packer.PackCoalescedPacket(false, maxPacketSize, protocol.Version1) 173 Expect(err).ToNot(HaveOccurred()) 174 Expect(p).ToNot(BeNil()) 175 Expect(p.longHdrPackets).To(BeEmpty()) 176 Expect(p.shortHdrPacket).ToNot(BeNil()) 177 Expect(p.shortHdrPacket.Frames).To(BeEmpty()) 178 Expect(p.shortHdrPacket.StreamFrames).To(HaveLen(1)) 179 Expect(p.shortHdrPacket.StreamFrames[0].Frame).To(Equal(f)) 180 hdrRawEncrypted := append([]byte{}, hdrRaw...) 181 hdrRawEncrypted[0] ^= 0xff 182 hdrRawEncrypted[len(hdrRaw)-2] ^= 0xff 183 hdrRawEncrypted[len(hdrRaw)-1] ^= 0xff 184 Expect(p.buffer.Data[0:len(hdrRaw)]).To(Equal(hdrRawEncrypted)) 185 Expect(p.buffer.Data[p.buffer.Len()-4:]).To(Equal([]byte{0xde, 0xca, 0xfb, 0xad})) 186 }) 187 }) 188 189 Context("packing packets", func() { 190 // getSealer gets a sealer that's expected to seal exactly one packet 191 getSealer := func() *mocks.MockShortHeaderSealer { 192 sealer := mocks.NewMockShortHeaderSealer(mockCtrl) 193 sealer.EXPECT().KeyPhase().Return(protocol.KeyPhaseOne).AnyTimes() 194 sealer.EXPECT().Overhead().Return(7).AnyTimes() 195 sealer.EXPECT().EncryptHeader(gomock.Any(), gomock.Any(), gomock.Any()).AnyTimes() 196 sealer.EXPECT().Seal(gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any()).DoAndReturn(func(dst, src []byte, pn protocol.PacketNumber, associatedData []byte) []byte { 197 return append(src, bytes.Repeat([]byte{'s'}, sealer.Overhead())...) 198 }).AnyTimes() 199 return sealer 200 } 201 202 Context("packing ACK packets", func() { 203 It("doesn't pack a packet if there's no ACK to send", func() { 204 sealingManager.EXPECT().GetInitialSealer().Return(getSealer(), nil) 205 sealingManager.EXPECT().GetHandshakeSealer().Return(getSealer(), nil) 206 sealingManager.EXPECT().Get1RTTSealer().Return(getSealer(), nil) 207 pnManager.EXPECT().PeekPacketNumber(protocol.Encryption1RTT).Return(protocol.PacketNumber(0x42), protocol.PacketNumberLen2) 208 ackFramer.EXPECT().GetAckFrame(protocol.EncryptionInitial, true) 209 ackFramer.EXPECT().GetAckFrame(protocol.EncryptionHandshake, true) 210 ackFramer.EXPECT().GetAckFrame(protocol.Encryption1RTT, true) 211 p, err := packer.PackCoalescedPacket(true, maxPacketSize, protocol.Version1) 212 Expect(err).ToNot(HaveOccurred()) 213 Expect(p).To(BeNil()) 214 }) 215 216 It("packs Initial ACK-only packets, and pads them (for the client)", func() { 217 packer.perspective = protocol.PerspectiveClient 218 pnManager.EXPECT().PeekPacketNumber(protocol.EncryptionInitial).Return(protocol.PacketNumber(0x42), protocol.PacketNumberLen2) 219 pnManager.EXPECT().PopPacketNumber(protocol.EncryptionInitial).Return(protocol.PacketNumber(0x42)) 220 sealingManager.EXPECT().GetInitialSealer().Return(getSealer(), nil) 221 ack := &wire.AckFrame{AckRanges: []wire.AckRange{{Smallest: 1, Largest: 10}}} 222 ackFramer.EXPECT().GetAckFrame(protocol.EncryptionInitial, true).Return(ack) 223 p, err := packer.PackCoalescedPacket(true, maxPacketSize, protocol.Version1) 224 Expect(err).NotTo(HaveOccurred()) 225 Expect(p).ToNot(BeNil()) 226 Expect(p.longHdrPackets).To(HaveLen(1)) 227 Expect(p.longHdrPackets[0].EncryptionLevel()).To(Equal(protocol.EncryptionInitial)) 228 Expect(p.longHdrPackets[0].ack).To(Equal(ack)) 229 Expect(p.longHdrPackets[0].frames).To(BeEmpty()) 230 Expect(p.buffer.Len()).To(BeEquivalentTo(maxPacketSize)) 231 parsePacket(p.buffer.Data) 232 }) 233 234 It("packs Initial ACK-only packets, and doesn't pads them (for the server)", func() { 235 pnManager.EXPECT().PeekPacketNumber(protocol.EncryptionInitial).Return(protocol.PacketNumber(0x42), protocol.PacketNumberLen2) 236 pnManager.EXPECT().PopPacketNumber(protocol.EncryptionInitial).Return(protocol.PacketNumber(0x42)) 237 sealingManager.EXPECT().GetInitialSealer().Return(getSealer(), nil) 238 ack := &wire.AckFrame{AckRanges: []wire.AckRange{{Smallest: 1, Largest: 10}}} 239 ackFramer.EXPECT().GetAckFrame(protocol.EncryptionInitial, true).Return(ack) 240 p, err := packer.PackCoalescedPacket(true, maxPacketSize, protocol.Version1) 241 Expect(err).NotTo(HaveOccurred()) 242 Expect(p).ToNot(BeNil()) 243 Expect(p.longHdrPackets).To(HaveLen(1)) 244 Expect(p.longHdrPackets[0].EncryptionLevel()).To(Equal(protocol.EncryptionInitial)) 245 Expect(p.longHdrPackets[0].ack).To(Equal(ack)) 246 Expect(p.longHdrPackets[0].frames).To(BeEmpty()) 247 Expect(p.buffer.Len()).To(BeNumerically("<", 100)) 248 parsePacket(p.buffer.Data) 249 }) 250 251 It("packs 1-RTT ACK-only packets, before handshake confirmation", func() { 252 sealingManager.EXPECT().GetInitialSealer().Return(nil, handshake.ErrKeysDropped) 253 sealingManager.EXPECT().GetHandshakeSealer().Return(getSealer(), nil) 254 pnManager.EXPECT().PeekPacketNumber(protocol.Encryption1RTT).Return(protocol.PacketNumber(0x42), protocol.PacketNumberLen2) 255 pnManager.EXPECT().PopPacketNumber(protocol.Encryption1RTT).Return(protocol.PacketNumber(0x42)) 256 sealingManager.EXPECT().Get1RTTSealer().Return(getSealer(), nil) 257 ack := &wire.AckFrame{AckRanges: []wire.AckRange{{Smallest: 1, Largest: 10}}} 258 ackFramer.EXPECT().GetAckFrame(protocol.EncryptionHandshake, true) 259 ackFramer.EXPECT().GetAckFrame(protocol.Encryption1RTT, true).Return(ack) 260 p, err := packer.PackCoalescedPacket(true, maxPacketSize, protocol.Version1) 261 Expect(err).NotTo(HaveOccurred()) 262 Expect(p).ToNot(BeNil()) 263 Expect(p.longHdrPackets).To(BeEmpty()) 264 Expect(p.shortHdrPacket).ToNot(BeNil()) 265 Expect(p.shortHdrPacket.Ack).To(Equal(ack)) 266 Expect(p.shortHdrPacket.Frames).To(BeEmpty()) 267 parsePacket(p.buffer.Data) 268 }) 269 270 It("packs 1-RTT ACK-only packets, after handshake confirmation", func() { 271 pnManager.EXPECT().PeekPacketNumber(protocol.Encryption1RTT).Return(protocol.PacketNumber(0x42), protocol.PacketNumberLen2) 272 pnManager.EXPECT().PopPacketNumber(protocol.Encryption1RTT).Return(protocol.PacketNumber(0x42)) 273 sealingManager.EXPECT().Get1RTTSealer().Return(getSealer(), nil) 274 ack := &wire.AckFrame{AckRanges: []wire.AckRange{{Smallest: 1, Largest: 10}}} 275 ackFramer.EXPECT().GetAckFrame(protocol.Encryption1RTT, true).Return(ack) 276 p, buffer, err := packer.PackAckOnlyPacket(maxPacketSize, protocol.Version1) 277 Expect(err).NotTo(HaveOccurred()) 278 Expect(p).ToNot(BeNil()) 279 Expect(p.Ack).To(Equal(ack)) 280 Expect(p.Frames).To(BeEmpty()) 281 parsePacket(buffer.Data) 282 }) 283 }) 284 285 Context("packing 0-RTT packets", func() { 286 BeforeEach(func() { 287 packer.perspective = protocol.PerspectiveClient 288 sealingManager.EXPECT().GetInitialSealer().Return(nil, nil).AnyTimes() 289 sealingManager.EXPECT().GetHandshakeSealer().Return(nil, nil).AnyTimes() 290 sealingManager.EXPECT().Get1RTTSealer().Return(nil, handshake.ErrKeysNotYetAvailable).AnyTimes() 291 initialStream.EXPECT().HasData().AnyTimes() 292 ackFramer.EXPECT().GetAckFrame(protocol.EncryptionInitial, true).AnyTimes() 293 handshakeStream.EXPECT().HasData().AnyTimes() 294 ackFramer.EXPECT().GetAckFrame(protocol.EncryptionHandshake, true).AnyTimes() 295 ackFramer.EXPECT().GetAckFrame(protocol.Encryption1RTT, true).AnyTimes() 296 }) 297 298 It("packs a 0-RTT packet", func() { 299 sealingManager.EXPECT().Get0RTTSealer().Return(getSealer(), nil).AnyTimes() 300 pnManager.EXPECT().PeekPacketNumber(protocol.Encryption0RTT).Return(protocol.PacketNumber(0x42), protocol.PacketNumberLen2) 301 pnManager.EXPECT().PopPacketNumber(protocol.Encryption0RTT).Return(protocol.PacketNumber(0x42)) 302 cf := ackhandler.Frame{Frame: &wire.MaxDataFrame{MaximumData: 0x1337}} 303 framer.EXPECT().HasData().Return(true) 304 framer.EXPECT().AppendControlFrames(gomock.Any(), gomock.Any(), protocol.Version1).DoAndReturn(func(frames []ackhandler.Frame, _ protocol.ByteCount, v protocol.Version) ([]ackhandler.Frame, protocol.ByteCount) { 305 Expect(frames).To(BeEmpty()) 306 return append(frames, cf), cf.Frame.Length(v) 307 }) 308 // TODO: check sizes 309 framer.EXPECT().AppendStreamFrames(gomock.Any(), gomock.Any(), protocol.Version1).DoAndReturn(func(frames []ackhandler.StreamFrame, _ protocol.ByteCount, _ protocol.Version) ([]ackhandler.StreamFrame, protocol.ByteCount) { 310 return frames, 0 311 }) 312 p, err := packer.PackCoalescedPacket(false, maxPacketSize, protocol.Version1) 313 Expect(p).ToNot(BeNil()) 314 Expect(err).ToNot(HaveOccurred()) 315 Expect(p.longHdrPackets).To(HaveLen(1)) 316 Expect(p.longHdrPackets[0].header.Type).To(Equal(protocol.PacketType0RTT)) 317 Expect(p.longHdrPackets[0].EncryptionLevel()).To(Equal(protocol.Encryption0RTT)) 318 Expect(p.longHdrPackets[0].frames).To(HaveLen(1)) 319 Expect(p.longHdrPackets[0].frames[0].Frame).To(Equal(cf.Frame)) 320 Expect(p.longHdrPackets[0].frames[0].Handler).ToNot(BeNil()) 321 }) 322 323 It("doesn't add an ACK-only 0-RTT packet", func() { // ACK frames cannot be sent in 0-RTT packets 324 p, err := packer.PackCoalescedPacket(true, protocol.MaxByteCount, protocol.Version1) 325 Expect(err).ToNot(HaveOccurred()) 326 Expect(p).To(BeNil()) 327 }) 328 }) 329 330 Context("packing CONNECTION_CLOSE", func() { 331 It("clears the reason phrase for crypto errors", func() { 332 pnManager.EXPECT().PeekPacketNumber(protocol.EncryptionHandshake).Return(protocol.PacketNumber(0x42), protocol.PacketNumberLen2) 333 pnManager.EXPECT().PopPacketNumber(protocol.EncryptionHandshake).Return(protocol.PacketNumber(0x42)) 334 sealingManager.EXPECT().GetInitialSealer().Return(nil, handshake.ErrKeysDropped) 335 sealingManager.EXPECT().GetHandshakeSealer().Return(getSealer(), nil) 336 sealingManager.EXPECT().Get1RTTSealer().Return(nil, handshake.ErrKeysNotYetAvailable) 337 quicErr := qerr.NewLocalCryptoError(0x42, errors.New("crypto error")) 338 quicErr.FrameType = 0x1234 339 p, err := packer.PackConnectionClose(quicErr, maxPacketSize, protocol.Version1) 340 Expect(err).ToNot(HaveOccurred()) 341 Expect(p.longHdrPackets).To(HaveLen(1)) 342 Expect(p.longHdrPackets[0].header.Type).To(Equal(protocol.PacketTypeHandshake)) 343 Expect(p.longHdrPackets[0].frames).To(HaveLen(1)) 344 Expect(p.longHdrPackets[0].frames[0].Frame).To(BeAssignableToTypeOf(&wire.ConnectionCloseFrame{})) 345 ccf := p.longHdrPackets[0].frames[0].Frame.(*wire.ConnectionCloseFrame) 346 Expect(ccf.IsApplicationError).To(BeFalse()) 347 Expect(ccf.ErrorCode).To(BeEquivalentTo(0x100 + 0x42)) 348 Expect(ccf.FrameType).To(BeEquivalentTo(0x1234)) 349 Expect(ccf.ReasonPhrase).To(BeEmpty()) 350 }) 351 352 It("packs a CONNECTION_CLOSE in 1-RTT", func() { 353 pnManager.EXPECT().PeekPacketNumber(protocol.Encryption1RTT).Return(protocol.PacketNumber(0x42), protocol.PacketNumberLen2) 354 pnManager.EXPECT().PopPacketNumber(protocol.Encryption1RTT).Return(protocol.PacketNumber(0x42)) 355 sealingManager.EXPECT().GetInitialSealer().Return(nil, handshake.ErrKeysDropped) 356 sealingManager.EXPECT().GetHandshakeSealer().Return(nil, handshake.ErrKeysDropped) 357 sealingManager.EXPECT().Get1RTTSealer().Return(getSealer(), nil) 358 // expect no framer.PopStreamFrames 359 p, err := packer.PackConnectionClose(&qerr.TransportError{ 360 ErrorCode: qerr.CryptoBufferExceeded, 361 ErrorMessage: "test error", 362 }, maxPacketSize, protocol.Version1) 363 Expect(err).ToNot(HaveOccurred()) 364 Expect(p.longHdrPackets).To(BeEmpty()) 365 Expect(p.shortHdrPacket.Frames).To(HaveLen(1)) 366 Expect(p.shortHdrPacket.Frames[0].Frame).To(BeAssignableToTypeOf(&wire.ConnectionCloseFrame{})) 367 ccf := p.shortHdrPacket.Frames[0].Frame.(*wire.ConnectionCloseFrame) 368 Expect(ccf.IsApplicationError).To(BeFalse()) 369 Expect(ccf.ErrorCode).To(BeEquivalentTo(qerr.CryptoBufferExceeded)) 370 Expect(ccf.ReasonPhrase).To(Equal("test error")) 371 }) 372 373 It("packs a CONNECTION_CLOSE in all available encryption levels, and replaces application errors in Initial and Handshake", func() { 374 pnManager.EXPECT().PeekPacketNumber(protocol.EncryptionInitial).Return(protocol.PacketNumber(1), protocol.PacketNumberLen2) 375 pnManager.EXPECT().PopPacketNumber(protocol.EncryptionInitial).Return(protocol.PacketNumber(1)) 376 pnManager.EXPECT().PeekPacketNumber(protocol.EncryptionHandshake).Return(protocol.PacketNumber(2), protocol.PacketNumberLen2) 377 pnManager.EXPECT().PopPacketNumber(protocol.EncryptionHandshake).Return(protocol.PacketNumber(2)) 378 pnManager.EXPECT().PeekPacketNumber(protocol.Encryption1RTT).Return(protocol.PacketNumber(3), protocol.PacketNumberLen2) 379 pnManager.EXPECT().PopPacketNumber(protocol.Encryption1RTT).Return(protocol.PacketNumber(3)) 380 sealingManager.EXPECT().GetInitialSealer().Return(getSealer(), nil) 381 sealingManager.EXPECT().GetHandshakeSealer().Return(getSealer(), nil) 382 sealingManager.EXPECT().Get1RTTSealer().Return(getSealer(), nil) 383 p, err := packer.PackApplicationClose(&qerr.ApplicationError{ 384 ErrorCode: 0x1337, 385 ErrorMessage: "test error", 386 }, maxPacketSize, protocol.Version1) 387 Expect(err).ToNot(HaveOccurred()) 388 Expect(p.longHdrPackets).To(HaveLen(2)) 389 Expect(p.longHdrPackets[0].header.Type).To(Equal(protocol.PacketTypeInitial)) 390 Expect(p.longHdrPackets[0].header.PacketNumber).To(Equal(protocol.PacketNumber(1))) 391 Expect(p.longHdrPackets[0].frames).To(HaveLen(1)) 392 Expect(p.longHdrPackets[0].frames[0].Frame).To(BeAssignableToTypeOf(&wire.ConnectionCloseFrame{})) 393 ccf := p.longHdrPackets[0].frames[0].Frame.(*wire.ConnectionCloseFrame) 394 Expect(ccf.IsApplicationError).To(BeFalse()) 395 Expect(ccf.ErrorCode).To(BeEquivalentTo(qerr.ApplicationErrorErrorCode)) 396 Expect(ccf.ReasonPhrase).To(BeEmpty()) 397 Expect(p.longHdrPackets[1].header.Type).To(Equal(protocol.PacketTypeHandshake)) 398 Expect(p.longHdrPackets[1].header.PacketNumber).To(Equal(protocol.PacketNumber(2))) 399 Expect(p.longHdrPackets[1].frames).To(HaveLen(1)) 400 Expect(p.longHdrPackets[1].frames[0].Frame).To(BeAssignableToTypeOf(&wire.ConnectionCloseFrame{})) 401 ccf = p.longHdrPackets[1].frames[0].Frame.(*wire.ConnectionCloseFrame) 402 Expect(ccf.IsApplicationError).To(BeFalse()) 403 Expect(ccf.ErrorCode).To(BeEquivalentTo(qerr.ApplicationErrorErrorCode)) 404 Expect(ccf.ReasonPhrase).To(BeEmpty()) 405 Expect(p.shortHdrPacket).ToNot(BeNil()) 406 Expect(p.shortHdrPacket.PacketNumber).To(Equal(protocol.PacketNumber(3))) 407 Expect(p.shortHdrPacket.Frames).To(HaveLen(1)) 408 Expect(p.shortHdrPacket.Frames[0].Frame).To(BeAssignableToTypeOf(&wire.ConnectionCloseFrame{})) 409 ccf = p.shortHdrPacket.Frames[0].Frame.(*wire.ConnectionCloseFrame) 410 Expect(ccf.IsApplicationError).To(BeTrue()) 411 Expect(ccf.ErrorCode).To(BeEquivalentTo(0x1337)) 412 Expect(ccf.ReasonPhrase).To(Equal("test error")) 413 }) 414 415 It("packs a CONNECTION_CLOSE in all available encryption levels, as a client", func() { 416 packer.perspective = protocol.PerspectiveClient 417 pnManager.EXPECT().PeekPacketNumber(protocol.EncryptionHandshake).Return(protocol.PacketNumber(1), protocol.PacketNumberLen2) 418 pnManager.EXPECT().PopPacketNumber(protocol.EncryptionHandshake).Return(protocol.PacketNumber(1)) 419 pnManager.EXPECT().PeekPacketNumber(protocol.Encryption1RTT).Return(protocol.PacketNumber(2), protocol.PacketNumberLen2) 420 pnManager.EXPECT().PopPacketNumber(protocol.Encryption1RTT).Return(protocol.PacketNumber(2)) 421 sealingManager.EXPECT().GetInitialSealer().Return(nil, handshake.ErrKeysDropped) 422 sealingManager.EXPECT().GetHandshakeSealer().Return(getSealer(), nil) 423 sealingManager.EXPECT().Get0RTTSealer().Return(nil, handshake.ErrKeysDropped) 424 sealingManager.EXPECT().Get1RTTSealer().Return(getSealer(), nil) 425 p, err := packer.PackApplicationClose(&qerr.ApplicationError{ 426 ErrorCode: 0x1337, 427 ErrorMessage: "test error", 428 }, maxPacketSize, protocol.Version1) 429 Expect(err).ToNot(HaveOccurred()) 430 Expect(p.longHdrPackets).To(HaveLen(1)) 431 Expect(p.buffer.Len()).To(BeNumerically("<", protocol.MinInitialPacketSize)) 432 Expect(p.longHdrPackets[0].header.Type).To(Equal(protocol.PacketTypeHandshake)) 433 Expect(p.longHdrPackets[0].header.PacketNumber).To(Equal(protocol.PacketNumber(1))) 434 Expect(p.longHdrPackets[0].frames).To(HaveLen(1)) 435 Expect(p.longHdrPackets[0].frames[0].Frame).To(BeAssignableToTypeOf(&wire.ConnectionCloseFrame{})) 436 ccf := p.longHdrPackets[0].frames[0].Frame.(*wire.ConnectionCloseFrame) 437 Expect(ccf.IsApplicationError).To(BeFalse()) 438 Expect(ccf.ErrorCode).To(BeEquivalentTo(qerr.ApplicationErrorErrorCode)) 439 Expect(ccf.ReasonPhrase).To(BeEmpty()) 440 Expect(p.shortHdrPacket).ToNot(BeNil()) 441 Expect(p.shortHdrPacket.PacketNumber).To(Equal(protocol.PacketNumber(2))) 442 Expect(p.shortHdrPacket.Frames).To(HaveLen(1)) 443 Expect(p.shortHdrPacket.Frames[0].Frame).To(BeAssignableToTypeOf(&wire.ConnectionCloseFrame{})) 444 ccf = p.shortHdrPacket.Frames[0].Frame.(*wire.ConnectionCloseFrame) 445 Expect(ccf.IsApplicationError).To(BeTrue()) 446 Expect(ccf.ErrorCode).To(BeEquivalentTo(0x1337)) 447 Expect(ccf.ReasonPhrase).To(Equal("test error")) 448 }) 449 450 It("packs a CONNECTION_CLOSE in all available encryption levels and pads, as a client", func() { 451 packer.perspective = protocol.PerspectiveClient 452 pnManager.EXPECT().PeekPacketNumber(protocol.EncryptionInitial).Return(protocol.PacketNumber(1), protocol.PacketNumberLen2) 453 pnManager.EXPECT().PopPacketNumber(protocol.EncryptionInitial).Return(protocol.PacketNumber(1)) 454 pnManager.EXPECT().PeekPacketNumber(protocol.Encryption0RTT).Return(protocol.PacketNumber(2), protocol.PacketNumberLen2) 455 pnManager.EXPECT().PopPacketNumber(protocol.Encryption0RTT).Return(protocol.PacketNumber(2)) 456 sealingManager.EXPECT().GetInitialSealer().Return(getSealer(), nil) 457 sealingManager.EXPECT().GetHandshakeSealer().Return(nil, handshake.ErrKeysNotYetAvailable) 458 sealingManager.EXPECT().Get0RTTSealer().Return(getSealer(), nil) 459 sealingManager.EXPECT().Get1RTTSealer().Return(nil, handshake.ErrKeysNotYetAvailable) 460 p, err := packer.PackApplicationClose(&qerr.ApplicationError{ 461 ErrorCode: 0x1337, 462 ErrorMessage: "test error", 463 }, maxPacketSize, protocol.Version1) 464 Expect(err).ToNot(HaveOccurred()) 465 Expect(p.longHdrPackets).To(HaveLen(2)) 466 Expect(p.buffer.Len()).To(BeNumerically(">=", protocol.MinInitialPacketSize)) 467 Expect(p.buffer.Len()).To(BeEquivalentTo(maxPacketSize)) 468 Expect(p.longHdrPackets[0].header.Type).To(Equal(protocol.PacketTypeInitial)) 469 Expect(p.longHdrPackets[0].header.PacketNumber).To(Equal(protocol.PacketNumber(1))) 470 Expect(p.longHdrPackets[0].frames).To(HaveLen(1)) 471 Expect(p.longHdrPackets[0].frames[0].Frame).To(BeAssignableToTypeOf(&wire.ConnectionCloseFrame{})) 472 ccf := p.longHdrPackets[0].frames[0].Frame.(*wire.ConnectionCloseFrame) 473 Expect(ccf.IsApplicationError).To(BeFalse()) 474 Expect(ccf.ErrorCode).To(BeEquivalentTo(qerr.ApplicationErrorErrorCode)) 475 Expect(ccf.ReasonPhrase).To(BeEmpty()) 476 Expect(p.longHdrPackets[1].header.Type).To(Equal(protocol.PacketType0RTT)) 477 Expect(p.longHdrPackets[1].header.PacketNumber).To(Equal(protocol.PacketNumber(2))) 478 Expect(p.longHdrPackets[1].frames).To(HaveLen(1)) 479 Expect(p.longHdrPackets[1].frames[0].Frame).To(BeAssignableToTypeOf(&wire.ConnectionCloseFrame{})) 480 ccf = p.longHdrPackets[1].frames[0].Frame.(*wire.ConnectionCloseFrame) 481 Expect(ccf.IsApplicationError).To(BeTrue()) 482 Expect(ccf.ErrorCode).To(BeEquivalentTo(0x1337)) 483 Expect(ccf.ReasonPhrase).To(Equal("test error")) 484 hdrs, more := parsePacket(p.buffer.Data) 485 Expect(hdrs).To(HaveLen(2)) 486 Expect(hdrs[0].Type).To(Equal(protocol.PacketTypeInitial)) 487 Expect(hdrs[1].Type).To(Equal(protocol.PacketType0RTT)) 488 Expect(more).To(BeEmpty()) 489 }) 490 }) 491 492 Context("packing normal packets", func() { 493 It("returns nil when no packet is queued", func() { 494 pnManager.EXPECT().PeekPacketNumber(protocol.Encryption1RTT).Return(protocol.PacketNumber(0x42), protocol.PacketNumberLen2) 495 // don't expect any calls to PopPacketNumber 496 sealingManager.EXPECT().Get1RTTSealer().Return(getSealer(), nil) 497 ackFramer.EXPECT().GetAckFrame(protocol.Encryption1RTT, true) 498 framer.EXPECT().HasData() 499 _, err := packer.AppendPacket(getPacketBuffer(), maxPacketSize, protocol.Version1) 500 Expect(err).To(MatchError(errNothingToPack)) 501 }) 502 503 It("appends single packets", func() { 504 pnManager.EXPECT().PeekPacketNumber(protocol.Encryption1RTT).Return(protocol.PacketNumber(0x42), protocol.PacketNumberLen2) 505 pnManager.EXPECT().PopPacketNumber(protocol.Encryption1RTT).Return(protocol.PacketNumber(0x42)) 506 sealingManager.EXPECT().Get1RTTSealer().Return(getSealer(), nil) 507 framer.EXPECT().HasData().Return(true) 508 ackFramer.EXPECT().GetAckFrame(protocol.Encryption1RTT, false) 509 expectAppendControlFrames() 510 f := &wire.StreamFrame{ 511 StreamID: 5, 512 Data: []byte{0xde, 0xca, 0xfb, 0xad}, 513 } 514 expectAppendStreamFrames(ackhandler.StreamFrame{Frame: f}) 515 buffer := getPacketBuffer() 516 buffer.Data = append(buffer.Data, []byte("foobar")...) 517 p, err := packer.AppendPacket(buffer, maxPacketSize, protocol.Version1) 518 Expect(err).ToNot(HaveOccurred()) 519 b, err := f.Append(nil, protocol.Version1) 520 Expect(err).ToNot(HaveOccurred()) 521 Expect(p.Frames).To(BeEmpty()) 522 Expect(p.StreamFrames).To(HaveLen(1)) 523 Expect(p.StreamFrames[0].Frame.StreamID).To(Equal(f.StreamID)) 524 Expect(buffer.Data[:6]).To(Equal([]byte("foobar"))) // make sure the packet was actually appended 525 Expect(buffer.Data).To(ContainSubstring(string(b))) 526 }) 527 528 It("packs a single ACK", func() { 529 pnManager.EXPECT().PeekPacketNumber(protocol.Encryption1RTT).Return(protocol.PacketNumber(0x42), protocol.PacketNumberLen2) 530 pnManager.EXPECT().PopPacketNumber(protocol.Encryption1RTT).Return(protocol.PacketNumber(0x42)) 531 ack := &wire.AckFrame{AckRanges: []wire.AckRange{{Largest: 42, Smallest: 1}}} 532 framer.EXPECT().HasData() 533 ackFramer.EXPECT().GetAckFrame(protocol.Encryption1RTT, true).Return(ack) 534 sealingManager.EXPECT().Get1RTTSealer().Return(getSealer(), nil) 535 p, err := packer.AppendPacket(getPacketBuffer(), maxPacketSize, protocol.Version1) 536 Expect(err).NotTo(HaveOccurred()) 537 Expect(p.Ack).To(Equal(ack)) 538 }) 539 540 It("packs control frames", func() { 541 pnManager.EXPECT().PeekPacketNumber(protocol.Encryption1RTT).Return(protocol.PacketNumber(0x42), protocol.PacketNumberLen2) 542 pnManager.EXPECT().PopPacketNumber(protocol.Encryption1RTT).Return(protocol.PacketNumber(0x42)) 543 sealingManager.EXPECT().Get1RTTSealer().Return(getSealer(), nil) 544 framer.EXPECT().HasData().Return(true) 545 ackFramer.EXPECT().GetAckFrame(protocol.Encryption1RTT, false) 546 frames := []ackhandler.Frame{ 547 {Frame: &wire.ResetStreamFrame{}}, 548 {Frame: &wire.MaxDataFrame{}}, 549 } 550 expectAppendControlFrames(frames...) 551 expectAppendStreamFrames() 552 buffer := getPacketBuffer() 553 p, err := packer.AppendPacket(buffer, maxPacketSize, protocol.Version1) 554 Expect(err).ToNot(HaveOccurred()) 555 Expect(p.Frames).To(HaveLen(2)) 556 for i, f := range p.Frames { 557 Expect(f).To(BeAssignableToTypeOf(frames[i])) 558 } 559 Expect(buffer.Len()).ToNot(BeZero()) 560 }) 561 562 It("packs PATH_CHALLENGE and PATH_RESPONSE frames", func() { 563 pnManager.EXPECT().PeekPacketNumber(protocol.Encryption1RTT).Return(protocol.PacketNumber(0x42), protocol.PacketNumberLen2) 564 pnManager.EXPECT().PopPacketNumber(protocol.Encryption1RTT).Return(protocol.PacketNumber(0x42)) 565 sealingManager.EXPECT().Get1RTTSealer().Return(getSealer(), nil) 566 framer.EXPECT().HasData().Return(true) 567 ackFramer.EXPECT().GetAckFrame(protocol.Encryption1RTT, false) 568 frames := []ackhandler.Frame{ 569 {Frame: &wire.PathChallengeFrame{}}, 570 {Frame: &wire.PathResponseFrame{}}, 571 {Frame: &wire.DataBlockedFrame{}}, 572 } 573 expectAppendControlFrames(frames...) 574 expectAppendStreamFrames() 575 buffer := getPacketBuffer() 576 p, err := packer.AppendPacket(buffer, maxPacketSize, protocol.Version1) 577 Expect(err).ToNot(HaveOccurred()) 578 Expect(p.Frames).To(HaveLen(3)) 579 for i, f := range p.Frames { 580 Expect(f).To(BeAssignableToTypeOf(frames[i])) 581 switch f.Frame.(type) { 582 case *wire.PathChallengeFrame, *wire.PathResponseFrame: 583 // This means that the frame won't be retransmitted. 584 Expect(f.Handler).To(BeNil()) 585 default: 586 Expect(f.Handler).ToNot(BeNil()) 587 } 588 } 589 Expect(buffer.Len()).ToNot(BeZero()) 590 }) 591 592 It("packs DATAGRAM frames", func() { 593 ackFramer.EXPECT().GetAckFrame(protocol.Encryption1RTT, true) 594 pnManager.EXPECT().PeekPacketNumber(protocol.Encryption1RTT).Return(protocol.PacketNumber(0x42), protocol.PacketNumberLen2) 595 pnManager.EXPECT().PopPacketNumber(protocol.Encryption1RTT).Return(protocol.PacketNumber(0x42)) 596 sealingManager.EXPECT().Get1RTTSealer().Return(getSealer(), nil) 597 f := &wire.DatagramFrame{ 598 DataLenPresent: true, 599 Data: []byte("foobar"), 600 } 601 done := make(chan struct{}) 602 go func() { 603 defer GinkgoRecover() 604 defer close(done) 605 datagramQueue.Add(f) 606 }() 607 // make sure the DATAGRAM has actually been queued 608 time.Sleep(scaleDuration(20 * time.Millisecond)) 609 610 framer.EXPECT().HasData() 611 buffer := getPacketBuffer() 612 p, err := packer.AppendPacket(buffer, maxPacketSize, protocol.Version1) 613 Expect(err).ToNot(HaveOccurred()) 614 Expect(p.Frames).To(HaveLen(1)) 615 Expect(p.Frames[0].Frame).To(Equal(f)) 616 Expect(buffer.Data).ToNot(BeEmpty()) 617 Eventually(done).Should(BeClosed()) 618 }) 619 620 It("doesn't pack a DATAGRAM frame if the ACK frame is too large", func() { 621 ackFramer.EXPECT().GetAckFrame(protocol.Encryption1RTT, true).Return(&wire.AckFrame{AckRanges: []wire.AckRange{{Largest: 100}}}) 622 pnManager.EXPECT().PeekPacketNumber(protocol.Encryption1RTT).Return(protocol.PacketNumber(0x42), protocol.PacketNumberLen2) 623 pnManager.EXPECT().PopPacketNumber(protocol.Encryption1RTT).Return(protocol.PacketNumber(0x42)) 624 sealingManager.EXPECT().Get1RTTSealer().Return(getSealer(), nil) 625 f := &wire.DatagramFrame{ 626 DataLenPresent: true, 627 Data: make([]byte, maxPacketSize-10), 628 } 629 done := make(chan struct{}) 630 go func() { 631 defer GinkgoRecover() 632 defer close(done) 633 datagramQueue.Add(f) 634 }() 635 // make sure the DATAGRAM has actually been queued 636 time.Sleep(scaleDuration(20 * time.Millisecond)) 637 638 framer.EXPECT().HasData() 639 buffer := getPacketBuffer() 640 p, err := packer.AppendPacket(buffer, maxPacketSize, protocol.Version1) 641 Expect(err).ToNot(HaveOccurred()) 642 Expect(p.Ack).ToNot(BeNil()) 643 Expect(p.Frames).To(BeEmpty()) 644 Expect(buffer.Data).ToNot(BeEmpty()) 645 Expect(datagramQueue.Peek()).To(Equal(f)) // make sure the frame is still there 646 datagramQueue.CloseWithError(nil) 647 Eventually(done).Should(BeClosed()) 648 }) 649 650 It("discards a DATAGRAM frame if it doesn't fit into a packet that doesn't contain an ACK", func() { 651 ackFramer.EXPECT().GetAckFrame(protocol.Encryption1RTT, true) 652 pnManager.EXPECT().PeekPacketNumber(protocol.Encryption1RTT).Return(protocol.PacketNumber(0x42), protocol.PacketNumberLen2) 653 sealingManager.EXPECT().Get1RTTSealer().Return(getSealer(), nil) 654 f := &wire.DatagramFrame{ 655 DataLenPresent: true, 656 Data: make([]byte, maxPacketSize+10), // won't fit 657 } 658 done := make(chan struct{}) 659 go func() { 660 defer GinkgoRecover() 661 defer close(done) 662 datagramQueue.Add(f) 663 }() 664 // make sure the DATAGRAM has actually been queued 665 time.Sleep(scaleDuration(20 * time.Millisecond)) 666 667 framer.EXPECT().HasData() 668 buffer := getPacketBuffer() 669 p, err := packer.AppendPacket(buffer, maxPacketSize, protocol.Version1) 670 Expect(err).To(MatchError(errNothingToPack)) 671 Expect(p.Frames).To(BeEmpty()) 672 Expect(p.Ack).To(BeNil()) 673 Expect(datagramQueue.Peek()).To(BeNil()) 674 Eventually(done).Should(BeClosed()) 675 }) 676 677 It("accounts for the space consumed by control frames", func() { 678 pnManager.EXPECT().PeekPacketNumber(protocol.Encryption1RTT).Return(protocol.PacketNumber(0x42), protocol.PacketNumberLen2) 679 sealingManager.EXPECT().Get1RTTSealer().Return(getSealer(), nil) 680 framer.EXPECT().HasData().Return(true) 681 ackFramer.EXPECT().GetAckFrame(protocol.Encryption1RTT, false) 682 var maxSize protocol.ByteCount 683 gomock.InOrder( 684 framer.EXPECT().AppendControlFrames(gomock.Any(), gomock.Any(), protocol.Version1).DoAndReturn(func(fs []ackhandler.Frame, maxLen protocol.ByteCount, _ protocol.Version) ([]ackhandler.Frame, protocol.ByteCount) { 685 maxSize = maxLen 686 return fs, 444 687 }), 688 framer.EXPECT().AppendStreamFrames(gomock.Any(), gomock.Any(), protocol.Version1).Do(func(fs []ackhandler.StreamFrame, maxLen protocol.ByteCount, _ protocol.Version) ([]ackhandler.StreamFrame, protocol.ByteCount) { 689 Expect(maxLen).To(Equal(maxSize - 444)) 690 return fs, 0 691 }), 692 ) 693 _, err := packer.AppendPacket(getPacketBuffer(), maxPacketSize, protocol.Version1) 694 Expect(err).To(MatchError(errNothingToPack)) 695 }) 696 697 It("pads if payload length + packet number length is smaller than 4, for Long Header packets", func() { 698 pnManager.EXPECT().PeekPacketNumber(protocol.EncryptionHandshake).Return(protocol.PacketNumber(0x42), protocol.PacketNumberLen1) 699 pnManager.EXPECT().PopPacketNumber(protocol.EncryptionHandshake).Return(protocol.PacketNumber(0x42)) 700 sealer := getSealer() 701 sealingManager.EXPECT().GetInitialSealer().Return(nil, handshake.ErrKeysDropped) 702 sealingManager.EXPECT().GetHandshakeSealer().Return(sealer, nil) 703 sealingManager.EXPECT().Get1RTTSealer().Return(nil, handshake.ErrKeysNotYetAvailable) 704 packer.retransmissionQueue.addHandshake(&wire.PingFrame{}) 705 handshakeStream.EXPECT().HasData() 706 ackFramer.EXPECT().GetAckFrame(protocol.EncryptionHandshake, false) 707 packet, err := packer.PackCoalescedPacket(false, maxPacketSize, protocol.Version1) 708 Expect(err).ToNot(HaveOccurred()) 709 Expect(packet).ToNot(BeNil()) 710 Expect(packet.longHdrPackets).To(HaveLen(1)) 711 Expect(packet.IsOnlyShortHeaderPacket()).To(BeFalse()) 712 // cut off the tag that the mock sealer added 713 // packet.buffer.Data = packet.buffer.Data[:packet.buffer.Len()-protocol.ByteCount(sealer.Overhead())] 714 hdr, _, _, err := wire.ParsePacket(packet.buffer.Data) 715 Expect(err).ToNot(HaveOccurred()) 716 data := packet.buffer.Data 717 r := bytes.NewReader(data) 718 extHdr, err := hdr.ParseExtended(r, protocol.Version1) 719 Expect(err).ToNot(HaveOccurred()) 720 Expect(extHdr.PacketNumberLen).To(Equal(protocol.PacketNumberLen1)) 721 Expect(r.Len()).To(Equal(4 - 1 /* packet number length */ + sealer.Overhead())) 722 // the first bytes of the payload should be a 2 PADDING frames... 723 firstPayloadByte, err := r.ReadByte() 724 Expect(err).ToNot(HaveOccurred()) 725 Expect(firstPayloadByte).To(Equal(byte(0))) 726 secondPayloadByte, err := r.ReadByte() 727 Expect(err).ToNot(HaveOccurred()) 728 Expect(secondPayloadByte).To(Equal(byte(0))) 729 // ... followed by the PING 730 frameParser := wire.NewFrameParser(false) 731 l, frame, err := frameParser.ParseNext(data[len(data)-r.Len():], protocol.Encryption1RTT, protocol.Version1) 732 Expect(err).ToNot(HaveOccurred()) 733 Expect(frame).To(BeAssignableToTypeOf(&wire.PingFrame{})) 734 Expect(r.Len() - l).To(Equal(sealer.Overhead())) 735 }) 736 737 It("pads if payload length + packet number length is smaller than 4", func() { 738 f := &wire.StreamFrame{ 739 StreamID: 0x10, // small stream ID, such that only a single byte is consumed 740 Fin: true, 741 } 742 Expect(f.Length(protocol.Version1)).To(BeEquivalentTo(2)) 743 pnManager.EXPECT().PeekPacketNumber(protocol.Encryption1RTT).Return(protocol.PacketNumber(0x42), protocol.PacketNumberLen1) 744 pnManager.EXPECT().PopPacketNumber(protocol.Encryption1RTT).Return(protocol.PacketNumber(0x42)) 745 sealer := getSealer() 746 sealingManager.EXPECT().Get1RTTSealer().Return(sealer, nil) 747 framer.EXPECT().HasData().Return(true) 748 ackFramer.EXPECT().GetAckFrame(protocol.Encryption1RTT, false) 749 expectAppendControlFrames() 750 expectAppendStreamFrames(ackhandler.StreamFrame{Frame: f}) 751 buffer := getPacketBuffer() 752 _, err := packer.AppendPacket(buffer, maxPacketSize, protocol.Version1) 753 Expect(err).ToNot(HaveOccurred()) 754 // cut off the tag that the mock sealer added 755 buffer.Data = buffer.Data[:buffer.Len()-protocol.ByteCount(sealer.Overhead())] 756 data := buffer.Data 757 l, _, pnLen, _, err := wire.ParseShortHeader(data, connID.Len()) 758 Expect(err).ToNot(HaveOccurred()) 759 r := bytes.NewReader(data[l:]) 760 Expect(pnLen).To(Equal(protocol.PacketNumberLen1)) 761 Expect(r.Len()).To(Equal(4 - 1 /* packet number length */)) 762 // the first byte of the payload should be a PADDING frame... 763 firstPayloadByte, err := r.ReadByte() 764 Expect(err).ToNot(HaveOccurred()) 765 Expect(firstPayloadByte).To(Equal(byte(0))) 766 // ... followed by the STREAM frame 767 frameParser := wire.NewFrameParser(true) 768 l, frame, err := frameParser.ParseNext(buffer.Data[len(data)-r.Len():], protocol.Encryption1RTT, protocol.Version1) 769 Expect(err).ToNot(HaveOccurred()) 770 Expect(frame).To(BeAssignableToTypeOf(&wire.StreamFrame{})) 771 sf := frame.(*wire.StreamFrame) 772 Expect(sf.StreamID).To(Equal(f.StreamID)) 773 Expect(sf.Fin).To(Equal(f.Fin)) 774 Expect(sf.Data).To(BeEmpty()) 775 Expect(r.Len() - l).To(BeZero()) 776 }) 777 778 It("packs multiple small STREAM frames into single packet", func() { 779 f1 := &wire.StreamFrame{ 780 StreamID: 5, 781 Data: []byte("frame 1"), 782 DataLenPresent: true, 783 } 784 f2 := &wire.StreamFrame{ 785 StreamID: 5, 786 Data: []byte("frame 2"), 787 DataLenPresent: true, 788 } 789 f3 := &wire.StreamFrame{ 790 StreamID: 3, 791 Data: []byte("frame 3"), 792 DataLenPresent: true, 793 } 794 pnManager.EXPECT().PeekPacketNumber(protocol.Encryption1RTT).Return(protocol.PacketNumber(0x42), protocol.PacketNumberLen2) 795 pnManager.EXPECT().PopPacketNumber(protocol.Encryption1RTT).Return(protocol.PacketNumber(0x42)) 796 sealingManager.EXPECT().Get1RTTSealer().Return(getSealer(), nil) 797 framer.EXPECT().HasData().Return(true) 798 ackFramer.EXPECT().GetAckFrame(protocol.Encryption1RTT, false) 799 expectAppendControlFrames() 800 expectAppendStreamFrames(ackhandler.StreamFrame{Frame: f1}, ackhandler.StreamFrame{Frame: f2}, ackhandler.StreamFrame{Frame: f3}) 801 p, err := packer.AppendPacket(getPacketBuffer(), maxPacketSize, protocol.Version1) 802 Expect(err).ToNot(HaveOccurred()) 803 Expect(p.Frames).To(BeEmpty()) 804 Expect(p.StreamFrames).To(HaveLen(3)) 805 Expect(p.StreamFrames[0].Frame.Data).To(Equal([]byte("frame 1"))) 806 Expect(p.StreamFrames[1].Frame.Data).To(Equal([]byte("frame 2"))) 807 Expect(p.StreamFrames[2].Frame.Data).To(Equal([]byte("frame 3"))) 808 }) 809 810 Context("making ACK packets ack-eliciting", func() { 811 sendMaxNumNonAckElicitingAcks := func() { 812 for i := 0; i < protocol.MaxNonAckElicitingAcks; i++ { 813 pnManager.EXPECT().PeekPacketNumber(protocol.Encryption1RTT).Return(protocol.PacketNumber(0x42), protocol.PacketNumberLen2) 814 pnManager.EXPECT().PopPacketNumber(protocol.Encryption1RTT).Return(protocol.PacketNumber(0x42)) 815 sealingManager.EXPECT().Get1RTTSealer().Return(getSealer(), nil) 816 framer.EXPECT().HasData().Return(true) 817 ackFramer.EXPECT().GetAckFrame(protocol.Encryption1RTT, false).Return(&wire.AckFrame{AckRanges: []wire.AckRange{{Smallest: 1, Largest: 1}}}) 818 expectAppendControlFrames() 819 expectAppendStreamFrames() 820 p, err := packer.AppendPacket(getPacketBuffer(), maxPacketSize, protocol.Version1) 821 Expect(err).ToNot(HaveOccurred()) 822 Expect(p.Ack).ToNot(BeNil()) 823 Expect(p.Frames).To(BeEmpty()) 824 } 825 } 826 827 It("adds a PING frame when it's supposed to send a ack-eliciting packet", func() { 828 sendMaxNumNonAckElicitingAcks() 829 pnManager.EXPECT().PeekPacketNumber(protocol.Encryption1RTT).Return(protocol.PacketNumber(0x42), protocol.PacketNumberLen2) 830 pnManager.EXPECT().PopPacketNumber(protocol.Encryption1RTT).Return(protocol.PacketNumber(0x42)) 831 sealingManager.EXPECT().Get1RTTSealer().Return(getSealer(), nil) 832 framer.EXPECT().HasData().Return(true) 833 ackFramer.EXPECT().GetAckFrame(protocol.Encryption1RTT, false).Return(&wire.AckFrame{AckRanges: []wire.AckRange{{Smallest: 1, Largest: 1}}}) 834 expectAppendControlFrames() 835 expectAppendStreamFrames() 836 p, err := packer.AppendPacket(getPacketBuffer(), maxPacketSize, protocol.Version1) 837 Expect(err).ToNot(HaveOccurred()) 838 var hasPing bool 839 for _, f := range p.Frames { 840 if _, ok := f.Frame.(*wire.PingFrame); ok { 841 hasPing = true 842 Expect(f.Handler).To(BeNil()) // make sure the PING is not retransmitted if lost 843 } 844 } 845 Expect(hasPing).To(BeTrue()) 846 // make sure the next packet doesn't contain another PING 847 pnManager.EXPECT().PeekPacketNumber(protocol.Encryption1RTT).Return(protocol.PacketNumber(0x42), protocol.PacketNumberLen2) 848 pnManager.EXPECT().PopPacketNumber(protocol.Encryption1RTT).Return(protocol.PacketNumber(0x42)) 849 sealingManager.EXPECT().Get1RTTSealer().Return(getSealer(), nil) 850 framer.EXPECT().HasData().Return(true) 851 ackFramer.EXPECT().GetAckFrame(protocol.Encryption1RTT, false).Return(&wire.AckFrame{AckRanges: []wire.AckRange{{Smallest: 1, Largest: 1}}}) 852 expectAppendControlFrames() 853 expectAppendStreamFrames() 854 p, err = packer.AppendPacket(getPacketBuffer(), maxPacketSize, protocol.Version1) 855 Expect(err).ToNot(HaveOccurred()) 856 Expect(p.Ack).ToNot(BeNil()) 857 Expect(p.Frames).To(BeEmpty()) 858 }) 859 860 It("waits until there's something to send before adding a PING frame", func() { 861 sendMaxNumNonAckElicitingAcks() 862 // nothing to send 863 pnManager.EXPECT().PeekPacketNumber(protocol.Encryption1RTT).Return(protocol.PacketNumber(0x42), protocol.PacketNumberLen2) 864 sealingManager.EXPECT().Get1RTTSealer().Return(getSealer(), nil) 865 framer.EXPECT().HasData().Return(true) 866 expectAppendControlFrames() 867 expectAppendStreamFrames() 868 ackFramer.EXPECT().GetAckFrame(protocol.Encryption1RTT, false) 869 _, err := packer.AppendPacket(getPacketBuffer(), maxPacketSize, protocol.Version1) 870 Expect(err).To(MatchError(errNothingToPack)) 871 // now add some frame to send 872 expectAppendControlFrames() 873 expectAppendStreamFrames() 874 pnManager.EXPECT().PeekPacketNumber(protocol.Encryption1RTT).Return(protocol.PacketNumber(0x42), protocol.PacketNumberLen2) 875 pnManager.EXPECT().PopPacketNumber(protocol.Encryption1RTT).Return(protocol.PacketNumber(0x42)) 876 sealingManager.EXPECT().Get1RTTSealer().Return(getSealer(), nil) 877 framer.EXPECT().HasData().Return(true) 878 ack := &wire.AckFrame{AckRanges: []wire.AckRange{{Smallest: 1, Largest: 1}}} 879 ackFramer.EXPECT().GetAckFrame(protocol.Encryption1RTT, false).Return(ack) 880 p, err := packer.AppendPacket(getPacketBuffer(), maxPacketSize, protocol.Version1) 881 Expect(err).ToNot(HaveOccurred()) 882 Expect(p.Ack).To(Equal(ack)) 883 var hasPing bool 884 for _, f := range p.Frames { 885 if _, ok := f.Frame.(*wire.PingFrame); ok { 886 hasPing = true 887 Expect(f.Handler).To(BeNil()) // make sure the PING is not retransmitted if lost 888 } 889 } 890 Expect(hasPing).To(BeTrue()) 891 }) 892 893 It("doesn't send a PING if it already sent another ack-eliciting frame", func() { 894 sendMaxNumNonAckElicitingAcks() 895 pnManager.EXPECT().PeekPacketNumber(protocol.Encryption1RTT).Return(protocol.PacketNumber(0x42), protocol.PacketNumberLen2) 896 pnManager.EXPECT().PopPacketNumber(protocol.Encryption1RTT).Return(protocol.PacketNumber(0x42)) 897 sealingManager.EXPECT().Get1RTTSealer().Return(getSealer(), nil) 898 framer.EXPECT().HasData().Return(true) 899 ackFramer.EXPECT().GetAckFrame(protocol.Encryption1RTT, false) 900 expectAppendStreamFrames() 901 expectAppendControlFrames(ackhandler.Frame{Frame: &wire.MaxDataFrame{}}) 902 p, err := packer.AppendPacket(getPacketBuffer(), maxPacketSize, protocol.Version1) 903 Expect(err).ToNot(HaveOccurred()) 904 Expect(p.Frames).ToNot(ContainElement(&wire.PingFrame{})) 905 }) 906 }) 907 }) 908 909 Context("packing crypto packets", func() { 910 It("sets the length", func() { 911 pnManager.EXPECT().PeekPacketNumber(protocol.EncryptionHandshake).Return(protocol.PacketNumber(0x42), protocol.PacketNumberLen2) 912 pnManager.EXPECT().PopPacketNumber(protocol.EncryptionHandshake).Return(protocol.PacketNumber(0x42)) 913 f := &wire.CryptoFrame{ 914 Offset: 0x1337, 915 Data: []byte("foobar"), 916 } 917 ackFramer.EXPECT().GetAckFrame(protocol.EncryptionHandshake, false) 918 handshakeStream.EXPECT().HasData().Return(true).AnyTimes() 919 handshakeStream.EXPECT().PopCryptoFrame(gomock.Any()).Return(f) 920 sealingManager.EXPECT().GetInitialSealer().Return(nil, handshake.ErrKeysDropped) 921 sealingManager.EXPECT().GetHandshakeSealer().Return(getSealer(), nil) 922 sealingManager.EXPECT().Get1RTTSealer().Return(nil, handshake.ErrKeysNotYetAvailable) 923 p, err := packer.PackCoalescedPacket(false, maxPacketSize, protocol.Version1) 924 Expect(err).ToNot(HaveOccurred()) 925 Expect(p).ToNot(BeNil()) 926 Expect(p.IsOnlyShortHeaderPacket()).To(BeFalse()) 927 parsePacket(p.buffer.Data) 928 }) 929 930 It("packs an Initial packet and pads it", func() { 931 packer.perspective = protocol.PerspectiveClient 932 pnManager.EXPECT().PeekPacketNumber(protocol.EncryptionInitial).Return(protocol.PacketNumber(0x24), protocol.PacketNumberLen1) 933 pnManager.EXPECT().PopPacketNumber(protocol.EncryptionInitial).Return(protocol.PacketNumber(0x24)) 934 sealingManager.EXPECT().GetInitialSealer().Return(getSealer(), nil) 935 sealingManager.EXPECT().GetHandshakeSealer().Return(nil, handshake.ErrKeysNotYetAvailable) 936 sealingManager.EXPECT().Get0RTTSealer().Return(nil, handshake.ErrKeysNotYetAvailable) 937 sealingManager.EXPECT().Get1RTTSealer().Return(nil, handshake.ErrKeysNotYetAvailable) 938 ackFramer.EXPECT().GetAckFrame(protocol.EncryptionInitial, false) 939 initialStream.EXPECT().HasData().Return(true).Times(2) 940 initialStream.EXPECT().PopCryptoFrame(gomock.Any()).DoAndReturn(func(size protocol.ByteCount) *wire.CryptoFrame { 941 return &wire.CryptoFrame{Offset: 0x42, Data: []byte("initial")} 942 }) 943 p, err := packer.PackCoalescedPacket(false, maxPacketSize, protocol.Version1) 944 Expect(err).ToNot(HaveOccurred()) 945 Expect(p.buffer.Len()).To(BeNumerically(">=", protocol.MinInitialPacketSize)) 946 Expect(p.buffer.Len()).To(BeEquivalentTo(maxPacketSize)) 947 Expect(p.longHdrPackets).To(HaveLen(1)) 948 Expect(p.longHdrPackets[0].EncryptionLevel()).To(Equal(protocol.EncryptionInitial)) 949 Expect(p.longHdrPackets[0].frames).To(HaveLen(1)) 950 Expect(p.longHdrPackets[0].frames[0].Frame.(*wire.CryptoFrame).Data).To(Equal([]byte("initial"))) 951 hdrs, more := parsePacket(p.buffer.Data) 952 Expect(hdrs).To(HaveLen(1)) 953 Expect(hdrs[0].Type).To(Equal(protocol.PacketTypeInitial)) 954 Expect(more).To(BeEmpty()) 955 }) 956 957 It("packs a maximum size Handshake packet", func() { 958 var f *wire.CryptoFrame 959 pnManager.EXPECT().PeekPacketNumber(protocol.EncryptionHandshake).Return(protocol.PacketNumber(0x42), protocol.PacketNumberLen2) 960 pnManager.EXPECT().PopPacketNumber(protocol.EncryptionHandshake).Return(protocol.PacketNumber(0x42)) 961 sealingManager.EXPECT().GetInitialSealer().Return(getSealer(), nil) 962 sealingManager.EXPECT().GetHandshakeSealer().Return(getSealer(), nil) 963 ackFramer.EXPECT().GetAckFrame(protocol.EncryptionInitial, true) 964 ackFramer.EXPECT().GetAckFrame(protocol.EncryptionHandshake, false) 965 initialStream.EXPECT().HasData() 966 handshakeStream.EXPECT().HasData().Return(true).Times(2) 967 handshakeStream.EXPECT().PopCryptoFrame(gomock.Any()).DoAndReturn(func(size protocol.ByteCount) *wire.CryptoFrame { 968 f = &wire.CryptoFrame{Offset: 0x1337} 969 f.Data = bytes.Repeat([]byte{'f'}, int(size-f.Length(protocol.Version1)-1)) 970 Expect(f.Length(protocol.Version1)).To(Equal(size)) 971 return f 972 }) 973 p, err := packer.PackCoalescedPacket(false, maxPacketSize, protocol.Version1) 974 Expect(err).ToNot(HaveOccurred()) 975 Expect(p.longHdrPackets).To(HaveLen(1)) 976 Expect(p.longHdrPackets[0].frames).To(HaveLen(1)) 977 Expect(p.buffer.Len()).To(BeEquivalentTo(maxPacketSize)) 978 parsePacket(p.buffer.Data) 979 }) 980 981 It("packs a coalesced packet with Initial / Handshake, and pads it", func() { 982 pnManager.EXPECT().PeekPacketNumber(protocol.EncryptionInitial).Return(protocol.PacketNumber(0x24), protocol.PacketNumberLen2) 983 pnManager.EXPECT().PopPacketNumber(protocol.EncryptionInitial).Return(protocol.PacketNumber(0x24)) 984 pnManager.EXPECT().PeekPacketNumber(protocol.EncryptionHandshake).Return(protocol.PacketNumber(0x42), protocol.PacketNumberLen2) 985 pnManager.EXPECT().PopPacketNumber(protocol.EncryptionHandshake).Return(protocol.PacketNumber(0x42)) 986 sealingManager.EXPECT().GetInitialSealer().Return(getSealer(), nil) 987 sealingManager.EXPECT().GetHandshakeSealer().Return(getSealer(), nil) 988 sealingManager.EXPECT().Get1RTTSealer().Return(nil, handshake.ErrKeysNotYetAvailable) 989 ackFramer.EXPECT().GetAckFrame(protocol.EncryptionInitial, false) 990 // don't EXPECT any calls for a Handshake ACK frame 991 initialStream.EXPECT().HasData().Return(true).Times(2) 992 initialStream.EXPECT().PopCryptoFrame(gomock.Any()).DoAndReturn(func(size protocol.ByteCount) *wire.CryptoFrame { 993 return &wire.CryptoFrame{Offset: 0x42, Data: []byte("initial")} 994 }) 995 handshakeStream.EXPECT().HasData().Return(true).Times(2) 996 handshakeStream.EXPECT().PopCryptoFrame(gomock.Any()).DoAndReturn(func(size protocol.ByteCount) *wire.CryptoFrame { 997 return &wire.CryptoFrame{Offset: 0x1337, Data: []byte("handshake")} 998 }) 999 p, err := packer.PackCoalescedPacket(false, maxPacketSize, protocol.Version1) 1000 Expect(err).ToNot(HaveOccurred()) 1001 Expect(p.buffer.Len()).To(BeEquivalentTo(maxPacketSize)) 1002 Expect(p.longHdrPackets).To(HaveLen(2)) 1003 Expect(p.shortHdrPacket).To(BeNil()) 1004 Expect(p.longHdrPackets[0].EncryptionLevel()).To(Equal(protocol.EncryptionInitial)) 1005 Expect(p.longHdrPackets[0].frames).To(HaveLen(1)) 1006 Expect(p.longHdrPackets[0].frames[0].Frame.(*wire.CryptoFrame).Data).To(Equal([]byte("initial"))) 1007 Expect(p.longHdrPackets[1].EncryptionLevel()).To(Equal(protocol.EncryptionHandshake)) 1008 Expect(p.longHdrPackets[1].frames).To(HaveLen(1)) 1009 Expect(p.longHdrPackets[1].frames[0].Frame.(*wire.CryptoFrame).Data).To(Equal([]byte("handshake"))) 1010 hdrs, more := parsePacket(p.buffer.Data) 1011 Expect(hdrs).To(HaveLen(2)) 1012 Expect(hdrs[0].Type).To(Equal(protocol.PacketTypeInitial)) 1013 Expect(hdrs[1].Type).To(Equal(protocol.PacketTypeHandshake)) 1014 Expect(more).To(BeEmpty()) 1015 }) 1016 1017 It("packs a coalesced packet with Initial / super short Handshake, and pads it", func() { 1018 pnManager.EXPECT().PeekPacketNumber(protocol.EncryptionInitial).Return(protocol.PacketNumber(0x24), protocol.PacketNumberLen2) 1019 pnManager.EXPECT().PopPacketNumber(protocol.EncryptionInitial).Return(protocol.PacketNumber(0x24)) 1020 pnManager.EXPECT().PeekPacketNumber(protocol.EncryptionHandshake).Return(protocol.PacketNumber(0x42), protocol.PacketNumberLen1) 1021 pnManager.EXPECT().PopPacketNumber(protocol.EncryptionHandshake).Return(protocol.PacketNumber(0x42)) 1022 sealingManager.EXPECT().GetInitialSealer().Return(getSealer(), nil) 1023 sealingManager.EXPECT().GetHandshakeSealer().Return(getSealer(), nil) 1024 sealingManager.EXPECT().Get1RTTSealer().Return(nil, handshake.ErrKeysNotYetAvailable) 1025 ackFramer.EXPECT().GetAckFrame(protocol.EncryptionInitial, false) 1026 // don't EXPECT any calls for a Handshake ACK frame 1027 initialStream.EXPECT().HasData().Return(true).Times(2) 1028 initialStream.EXPECT().PopCryptoFrame(gomock.Any()).DoAndReturn(func(size protocol.ByteCount) *wire.CryptoFrame { 1029 return &wire.CryptoFrame{Offset: 0x42, Data: []byte("initial")} 1030 }) 1031 handshakeStream.EXPECT().HasData() 1032 packer.retransmissionQueue.addHandshake(&wire.PingFrame{}) 1033 p, err := packer.PackCoalescedPacket(false, maxPacketSize, protocol.Version1) 1034 Expect(err).ToNot(HaveOccurred()) 1035 Expect(p.buffer.Len()).To(BeEquivalentTo(maxPacketSize)) 1036 Expect(p.longHdrPackets).To(HaveLen(2)) 1037 Expect(p.shortHdrPacket).To(BeNil()) 1038 Expect(p.longHdrPackets[0].EncryptionLevel()).To(Equal(protocol.EncryptionInitial)) 1039 Expect(p.longHdrPackets[0].frames).To(HaveLen(1)) 1040 Expect(p.longHdrPackets[0].frames[0].Frame.(*wire.CryptoFrame).Data).To(Equal([]byte("initial"))) 1041 Expect(p.longHdrPackets[1].EncryptionLevel()).To(Equal(protocol.EncryptionHandshake)) 1042 Expect(p.longHdrPackets[1].frames).To(HaveLen(1)) 1043 Expect(p.longHdrPackets[1].frames[0].Frame).To(BeAssignableToTypeOf(&wire.PingFrame{})) 1044 hdrs, more := parsePacket(p.buffer.Data) 1045 Expect(hdrs).To(HaveLen(2)) 1046 Expect(hdrs[0].Type).To(Equal(protocol.PacketTypeInitial)) 1047 Expect(hdrs[1].Type).To(Equal(protocol.PacketTypeHandshake)) 1048 Expect(more).To(BeEmpty()) 1049 }) 1050 1051 It("packs a coalesced packet with super short Initial / super short Handshake, and pads it", func() { 1052 pnManager.EXPECT().PeekPacketNumber(protocol.EncryptionInitial).Return(protocol.PacketNumber(0x24), protocol.PacketNumberLen1) 1053 pnManager.EXPECT().PopPacketNumber(protocol.EncryptionInitial).Return(protocol.PacketNumber(0x24)) 1054 pnManager.EXPECT().PeekPacketNumber(protocol.EncryptionHandshake).Return(protocol.PacketNumber(0x42), protocol.PacketNumberLen1) 1055 pnManager.EXPECT().PopPacketNumber(protocol.EncryptionHandshake).Return(protocol.PacketNumber(0x42)) 1056 sealingManager.EXPECT().GetInitialSealer().Return(getSealer(), nil) 1057 sealingManager.EXPECT().GetHandshakeSealer().Return(getSealer(), nil) 1058 sealingManager.EXPECT().Get1RTTSealer().Return(nil, handshake.ErrKeysNotYetAvailable) 1059 ackFramer.EXPECT().GetAckFrame(protocol.EncryptionInitial, gomock.Any()) 1060 initialStream.EXPECT().HasData() 1061 handshakeStream.EXPECT().HasData() 1062 packer.retransmissionQueue.addInitial(&wire.PingFrame{}) 1063 packer.retransmissionQueue.addHandshake(&wire.PingFrame{}) 1064 p, err := packer.PackCoalescedPacket(false, maxPacketSize, protocol.Version1) 1065 Expect(err).ToNot(HaveOccurred()) 1066 Expect(p.buffer.Len()).To(BeEquivalentTo(maxPacketSize)) 1067 Expect(p.longHdrPackets).To(HaveLen(2)) 1068 Expect(p.longHdrPackets[0].EncryptionLevel()).To(Equal(protocol.EncryptionInitial)) 1069 Expect(p.longHdrPackets[0].frames).To(HaveLen(1)) 1070 Expect(p.longHdrPackets[0].frames[0].Frame).To(BeAssignableToTypeOf(&wire.PingFrame{})) 1071 Expect(p.longHdrPackets[1].EncryptionLevel()).To(Equal(protocol.EncryptionHandshake)) 1072 Expect(p.longHdrPackets[1].frames).To(HaveLen(1)) 1073 Expect(p.longHdrPackets[1].frames[0].Frame).To(BeAssignableToTypeOf(&wire.PingFrame{})) 1074 hdrs, more := parsePacket(p.buffer.Data) 1075 Expect(hdrs).To(HaveLen(2)) 1076 Expect(hdrs[0].Type).To(Equal(protocol.PacketTypeInitial)) 1077 Expect(hdrs[1].Type).To(Equal(protocol.PacketTypeHandshake)) 1078 Expect(more).To(BeEmpty()) 1079 }) 1080 1081 It("packs a coalesced packet with Initial / super short 1-RTT, and pads it", func() { 1082 pnManager.EXPECT().PeekPacketNumber(protocol.EncryptionInitial).Return(protocol.PacketNumber(0x24), protocol.PacketNumberLen2) 1083 pnManager.EXPECT().PopPacketNumber(protocol.EncryptionInitial).Return(protocol.PacketNumber(0x24)) 1084 pnManager.EXPECT().PeekPacketNumber(protocol.Encryption1RTT).Return(protocol.PacketNumber(0x42), protocol.PacketNumberLen1) 1085 pnManager.EXPECT().PopPacketNumber(protocol.Encryption1RTT).Return(protocol.PacketNumber(0x42)) 1086 sealingManager.EXPECT().GetInitialSealer().Return(getSealer(), nil) 1087 sealingManager.EXPECT().GetHandshakeSealer().Return(nil, handshake.ErrKeysNotYetAvailable) 1088 sealingManager.EXPECT().Get1RTTSealer().Return(getSealer(), nil) 1089 ackFramer.EXPECT().GetAckFrame(protocol.EncryptionInitial, false) 1090 initialStream.EXPECT().HasData().Return(true).Times(2) 1091 initialStream.EXPECT().PopCryptoFrame(gomock.Any()).DoAndReturn(func(size protocol.ByteCount) *wire.CryptoFrame { 1092 return &wire.CryptoFrame{Offset: 0x42, Data: []byte("initial")} 1093 }) 1094 expectAppendControlFrames() 1095 expectAppendStreamFrames() 1096 framer.EXPECT().HasData().Return(true) 1097 packer.retransmissionQueue.addAppData(&wire.PingFrame{}) 1098 p, err := packer.PackCoalescedPacket(false, maxPacketSize, protocol.Version1) 1099 Expect(err).ToNot(HaveOccurred()) 1100 Expect(p.IsOnlyShortHeaderPacket()).To(BeFalse()) 1101 Expect(p.buffer.Len()).To(BeEquivalentTo(maxPacketSize)) 1102 Expect(p.longHdrPackets).To(HaveLen(1)) 1103 Expect(p.longHdrPackets[0].EncryptionLevel()).To(Equal(protocol.EncryptionInitial)) 1104 Expect(p.longHdrPackets[0].frames).To(HaveLen(1)) 1105 Expect(p.longHdrPackets[0].frames[0].Frame.(*wire.CryptoFrame).Data).To(Equal([]byte("initial"))) 1106 Expect(p.shortHdrPacket).ToNot(BeNil()) 1107 Expect(p.shortHdrPacket.Frames).To(HaveLen(1)) 1108 Expect(p.shortHdrPacket.Frames[0].Frame).To(BeAssignableToTypeOf(&wire.PingFrame{})) 1109 hdrs, more := parsePacket(p.buffer.Data) 1110 Expect(hdrs).To(HaveLen(1)) 1111 Expect(hdrs[0].Type).To(Equal(protocol.PacketTypeInitial)) 1112 Expect(more).ToNot(BeEmpty()) 1113 parseShortHeaderPacket(more) 1114 }) 1115 1116 It("packs a coalesced packet with Initial / 0-RTT, and pads it", func() { 1117 packer.perspective = protocol.PerspectiveClient 1118 pnManager.EXPECT().PeekPacketNumber(protocol.EncryptionInitial).Return(protocol.PacketNumber(0x24), protocol.PacketNumberLen2) 1119 pnManager.EXPECT().PopPacketNumber(protocol.EncryptionInitial).Return(protocol.PacketNumber(0x24)) 1120 pnManager.EXPECT().PeekPacketNumber(protocol.Encryption0RTT).Return(protocol.PacketNumber(0x42), protocol.PacketNumberLen2) 1121 pnManager.EXPECT().PopPacketNumber(protocol.Encryption0RTT).Return(protocol.PacketNumber(0x42)) 1122 sealingManager.EXPECT().GetInitialSealer().Return(getSealer(), nil) 1123 sealingManager.EXPECT().GetHandshakeSealer().Return(nil, handshake.ErrKeysNotYetAvailable) 1124 sealingManager.EXPECT().Get0RTTSealer().Return(getSealer(), nil) 1125 sealingManager.EXPECT().Get1RTTSealer().Return(nil, handshake.ErrKeysNotYetAvailable) 1126 framer.EXPECT().HasData().Return(true) 1127 ackFramer.EXPECT().GetAckFrame(protocol.EncryptionInitial, false) 1128 // don't EXPECT any calls for a Handshake ACK frame 1129 initialStream.EXPECT().HasData().Return(true).Times(2) 1130 initialStream.EXPECT().PopCryptoFrame(gomock.Any()).DoAndReturn(func(size protocol.ByteCount) *wire.CryptoFrame { 1131 return &wire.CryptoFrame{Offset: 0x42, Data: []byte("initial")} 1132 }) 1133 expectAppendControlFrames() 1134 expectAppendStreamFrames(ackhandler.StreamFrame{Frame: &wire.StreamFrame{Data: []byte("foobar")}}) 1135 p, err := packer.PackCoalescedPacket(false, maxPacketSize, protocol.Version1) 1136 Expect(err).ToNot(HaveOccurred()) 1137 Expect(p.buffer.Len()).To(BeNumerically(">=", protocol.MinInitialPacketSize)) 1138 Expect(p.buffer.Len()).To(BeEquivalentTo(maxPacketSize)) 1139 Expect(p.longHdrPackets).To(HaveLen(2)) 1140 Expect(p.longHdrPackets[0].EncryptionLevel()).To(Equal(protocol.EncryptionInitial)) 1141 Expect(p.longHdrPackets[0].frames).To(HaveLen(1)) 1142 Expect(p.longHdrPackets[0].frames[0].Frame.(*wire.CryptoFrame).Data).To(Equal([]byte("initial"))) 1143 Expect(p.longHdrPackets[0].streamFrames).To(BeEmpty()) 1144 Expect(p.longHdrPackets[1].EncryptionLevel()).To(Equal(protocol.Encryption0RTT)) 1145 Expect(p.longHdrPackets[1].frames).To(BeEmpty()) 1146 Expect(p.longHdrPackets[1].streamFrames).To(HaveLen(1)) 1147 Expect(p.longHdrPackets[1].streamFrames[0].Frame.Data).To(Equal([]byte("foobar"))) 1148 hdrs, more := parsePacket(p.buffer.Data) 1149 Expect(hdrs).To(HaveLen(2)) 1150 Expect(hdrs[0].Type).To(Equal(protocol.PacketTypeInitial)) 1151 Expect(hdrs[1].Type).To(Equal(protocol.PacketType0RTT)) 1152 Expect(more).To(BeEmpty()) 1153 }) 1154 1155 It("packs a coalesced packet with Handshake / 1-RTT", func() { 1156 pnManager.EXPECT().PeekPacketNumber(protocol.EncryptionHandshake).Return(protocol.PacketNumber(0x24), protocol.PacketNumberLen2) 1157 pnManager.EXPECT().PopPacketNumber(protocol.EncryptionHandshake).Return(protocol.PacketNumber(0x24)) 1158 pnManager.EXPECT().PeekPacketNumber(protocol.Encryption1RTT).Return(protocol.PacketNumber(0x42), protocol.PacketNumberLen2) 1159 pnManager.EXPECT().PopPacketNumber(protocol.Encryption1RTT).Return(protocol.PacketNumber(0x42)) 1160 sealingManager.EXPECT().GetInitialSealer().Return(nil, handshake.ErrKeysDropped) 1161 sealingManager.EXPECT().GetHandshakeSealer().Return(getSealer(), nil) 1162 sealingManager.EXPECT().Get1RTTSealer().Return(getSealer(), nil) 1163 framer.EXPECT().HasData().Return(true) 1164 ackFramer.EXPECT().GetAckFrame(protocol.EncryptionHandshake, false) 1165 // don't EXPECT any calls for a 1-RTT ACK frame 1166 handshakeStream.EXPECT().HasData().Return(true).Times(2) 1167 handshakeStream.EXPECT().PopCryptoFrame(gomock.Any()).DoAndReturn(func(size protocol.ByteCount) *wire.CryptoFrame { 1168 return &wire.CryptoFrame{Offset: 0x1337, Data: []byte("handshake")} 1169 }) 1170 expectAppendControlFrames() 1171 expectAppendStreamFrames(ackhandler.StreamFrame{Frame: &wire.StreamFrame{Data: []byte("foobar")}}) 1172 p, err := packer.PackCoalescedPacket(false, maxPacketSize, protocol.Version1) 1173 Expect(err).ToNot(HaveOccurred()) 1174 Expect(p.buffer.Len()).To(BeNumerically("<", 100)) 1175 Expect(p.longHdrPackets).To(HaveLen(1)) 1176 Expect(p.longHdrPackets[0].EncryptionLevel()).To(Equal(protocol.EncryptionHandshake)) 1177 Expect(p.longHdrPackets[0].frames).To(HaveLen(1)) 1178 Expect(p.longHdrPackets[0].frames[0].Frame.(*wire.CryptoFrame).Data).To(Equal([]byte("handshake"))) 1179 Expect(p.shortHdrPacket).ToNot(BeNil()) 1180 Expect(p.shortHdrPacket.Frames).To(BeEmpty()) 1181 Expect(p.shortHdrPacket.StreamFrames).To(HaveLen(1)) 1182 Expect(p.shortHdrPacket.StreamFrames[0].Frame.Data).To(Equal([]byte("foobar"))) 1183 hdrs, more := parsePacket(p.buffer.Data) 1184 Expect(hdrs).To(HaveLen(1)) 1185 Expect(hdrs[0].Type).To(Equal(protocol.PacketTypeHandshake)) 1186 Expect(more).ToNot(BeEmpty()) 1187 parseShortHeaderPacket(more) 1188 }) 1189 1190 It("doesn't add a coalesced packet if the remaining size is smaller than MaxCoalescedPacketSize", func() { 1191 pnManager.EXPECT().PeekPacketNumber(protocol.EncryptionHandshake).Return(protocol.PacketNumber(0x24), protocol.PacketNumberLen2) 1192 pnManager.EXPECT().PopPacketNumber(protocol.EncryptionHandshake).Return(protocol.PacketNumber(0x24)) 1193 sealingManager.EXPECT().GetInitialSealer().Return(nil, handshake.ErrKeysDropped) 1194 sealingManager.EXPECT().GetHandshakeSealer().Return(getSealer(), nil) 1195 // don't EXPECT any calls to GetHandshakeSealer and Get1RTTSealer 1196 ackFramer.EXPECT().GetAckFrame(protocol.EncryptionHandshake, false) 1197 handshakeStream.EXPECT().HasData().Return(true).Times(2) 1198 handshakeStream.EXPECT().PopCryptoFrame(gomock.Any()).DoAndReturn(func(size protocol.ByteCount) *wire.CryptoFrame { 1199 s := size - protocol.MinCoalescedPacketSize 1200 f := &wire.CryptoFrame{Offset: 0x1337} 1201 f.Data = bytes.Repeat([]byte{'f'}, int(s-f.Length(protocol.Version1)-1)) 1202 Expect(f.Length(protocol.Version1)).To(Equal(s)) 1203 return f 1204 }) 1205 p, err := packer.PackCoalescedPacket(false, maxPacketSize, protocol.Version1) 1206 Expect(err).ToNot(HaveOccurred()) 1207 Expect(p.longHdrPackets).To(HaveLen(1)) 1208 Expect(p.shortHdrPacket).To(BeNil()) 1209 Expect(p.longHdrPackets[0].EncryptionLevel()).To(Equal(protocol.EncryptionHandshake)) 1210 Expect(len(p.buffer.Data)).To(BeEquivalentTo(maxPacketSize - protocol.MinCoalescedPacketSize)) 1211 parsePacket(p.buffer.Data) 1212 }) 1213 1214 It("pads if payload length + packet number length is smaller than 4, for Long Header packets", func() { 1215 pnManager.EXPECT().PeekPacketNumber(protocol.EncryptionHandshake).Return(protocol.PacketNumber(0x42), protocol.PacketNumberLen1) 1216 pnManager.EXPECT().PopPacketNumber(protocol.EncryptionHandshake).Return(protocol.PacketNumber(0x42)) 1217 sealer := getSealer() 1218 sealingManager.EXPECT().GetInitialSealer().Return(nil, handshake.ErrKeysDropped) 1219 sealingManager.EXPECT().GetHandshakeSealer().Return(sealer, nil) 1220 sealingManager.EXPECT().Get1RTTSealer().Return(nil, handshake.ErrKeysNotYetAvailable) 1221 packer.retransmissionQueue.addHandshake(&wire.PingFrame{}) 1222 handshakeStream.EXPECT().HasData() 1223 ackFramer.EXPECT().GetAckFrame(protocol.EncryptionHandshake, false) 1224 packet, err := packer.PackCoalescedPacket(false, maxPacketSize, protocol.Version1) 1225 Expect(err).ToNot(HaveOccurred()) 1226 Expect(packet).ToNot(BeNil()) 1227 Expect(packet.longHdrPackets).To(HaveLen(1)) 1228 Expect(packet.shortHdrPacket).To(BeNil()) 1229 // cut off the tag that the mock sealer added 1230 // packet.buffer.Data = packet.buffer.Data[:packet.buffer.Len()-protocol.ByteCount(sealer.Overhead())] 1231 hdr, _, _, err := wire.ParsePacket(packet.buffer.Data) 1232 Expect(err).ToNot(HaveOccurred()) 1233 data := packet.buffer.Data 1234 r := bytes.NewReader(data) 1235 extHdr, err := hdr.ParseExtended(r, protocol.Version1) 1236 Expect(err).ToNot(HaveOccurred()) 1237 Expect(extHdr.PacketNumberLen).To(Equal(protocol.PacketNumberLen1)) 1238 Expect(r.Len()).To(Equal(4 - 1 /* packet number length */ + sealer.Overhead())) 1239 // the first bytes of the payload should be a 2 PADDING frames... 1240 firstPayloadByte, err := r.ReadByte() 1241 Expect(err).ToNot(HaveOccurred()) 1242 Expect(firstPayloadByte).To(Equal(byte(0))) 1243 secondPayloadByte, err := r.ReadByte() 1244 Expect(err).ToNot(HaveOccurred()) 1245 Expect(secondPayloadByte).To(Equal(byte(0))) 1246 // ... followed by the PING 1247 frameParser := wire.NewFrameParser(false) 1248 l, frame, err := frameParser.ParseNext(data[len(data)-r.Len():], protocol.Encryption1RTT, protocol.Version1) 1249 Expect(err).ToNot(HaveOccurred()) 1250 Expect(frame).To(BeAssignableToTypeOf(&wire.PingFrame{})) 1251 Expect(r.Len() - l).To(Equal(sealer.Overhead())) 1252 }) 1253 1254 It("adds retransmissions", func() { 1255 f := &wire.CryptoFrame{Data: []byte("Initial")} 1256 retransmissionQueue.addInitial(f) 1257 retransmissionQueue.addHandshake(&wire.CryptoFrame{Data: []byte("Handshake")}) 1258 pnManager.EXPECT().PeekPacketNumber(protocol.EncryptionInitial).Return(protocol.PacketNumber(0x42), protocol.PacketNumberLen2) 1259 pnManager.EXPECT().PopPacketNumber(protocol.EncryptionInitial).Return(protocol.PacketNumber(0x42)) 1260 sealingManager.EXPECT().GetInitialSealer().Return(getSealer(), nil) 1261 sealingManager.EXPECT().GetHandshakeSealer().Return(nil, handshake.ErrKeysNotYetAvailable) 1262 sealingManager.EXPECT().Get1RTTSealer().Return(nil, handshake.ErrKeysNotYetAvailable) 1263 ackFramer.EXPECT().GetAckFrame(protocol.EncryptionInitial, false) 1264 initialStream.EXPECT().HasData() 1265 p, err := packer.PackCoalescedPacket(false, maxPacketSize, protocol.Version1) 1266 Expect(err).ToNot(HaveOccurred()) 1267 Expect(p.longHdrPackets).To(HaveLen(1)) 1268 Expect(p.longHdrPackets[0].EncryptionLevel()).To(Equal(protocol.EncryptionInitial)) 1269 Expect(p.longHdrPackets[0].frames).To(HaveLen(1)) 1270 Expect(p.longHdrPackets[0].frames[0].Frame).To(Equal(f)) 1271 Expect(p.longHdrPackets[0].frames[0].Handler).ToNot(BeNil()) 1272 }) 1273 1274 It("sends an Initial packet containing only an ACK", func() { 1275 ack := &wire.AckFrame{AckRanges: []wire.AckRange{{Smallest: 10, Largest: 20}}} 1276 ackFramer.EXPECT().GetAckFrame(protocol.EncryptionInitial, true).Return(ack) 1277 initialStream.EXPECT().HasData().Times(2) 1278 sealingManager.EXPECT().GetInitialSealer().Return(getSealer(), nil) 1279 sealingManager.EXPECT().GetHandshakeSealer().Return(nil, handshake.ErrKeysNotYetAvailable) 1280 sealingManager.EXPECT().Get1RTTSealer().Return(nil, handshake.ErrKeysNotYetAvailable) 1281 pnManager.EXPECT().PeekPacketNumber(protocol.EncryptionInitial).Return(protocol.PacketNumber(0x42), protocol.PacketNumberLen2) 1282 pnManager.EXPECT().PopPacketNumber(protocol.EncryptionInitial).Return(protocol.PacketNumber(0x42)) 1283 p, err := packer.PackCoalescedPacket(false, maxPacketSize, protocol.Version1) 1284 Expect(err).ToNot(HaveOccurred()) 1285 Expect(p.longHdrPackets).To(HaveLen(1)) 1286 Expect(p.longHdrPackets[0].ack).To(Equal(ack)) 1287 }) 1288 1289 It("doesn't pack anything if there's nothing to send at Initial and Handshake keys are not yet available", func() { 1290 sealingManager.EXPECT().GetInitialSealer().Return(getSealer(), nil) 1291 sealingManager.EXPECT().GetHandshakeSealer().Return(nil, handshake.ErrKeysNotYetAvailable) 1292 sealingManager.EXPECT().Get1RTTSealer().Return(nil, handshake.ErrKeysNotYetAvailable) 1293 initialStream.EXPECT().HasData() 1294 ackFramer.EXPECT().GetAckFrame(protocol.EncryptionInitial, true) 1295 p, err := packer.PackCoalescedPacket(false, maxPacketSize, protocol.Version1) 1296 Expect(err).ToNot(HaveOccurred()) 1297 Expect(p).To(BeNil()) 1298 }) 1299 1300 It("sends a Handshake packet containing only an ACK", func() { 1301 ack := &wire.AckFrame{AckRanges: []wire.AckRange{{Smallest: 10, Largest: 20}}} 1302 ackFramer.EXPECT().GetAckFrame(protocol.EncryptionInitial, true) 1303 ackFramer.EXPECT().GetAckFrame(protocol.EncryptionHandshake, true).Return(ack) 1304 initialStream.EXPECT().HasData() 1305 handshakeStream.EXPECT().HasData().Times(2) 1306 sealingManager.EXPECT().GetInitialSealer().Return(getSealer(), nil) 1307 sealingManager.EXPECT().GetHandshakeSealer().Return(getSealer(), nil) 1308 sealingManager.EXPECT().Get1RTTSealer().Return(nil, handshake.ErrKeysNotYetAvailable) 1309 pnManager.EXPECT().PeekPacketNumber(protocol.EncryptionHandshake).Return(protocol.PacketNumber(0x42), protocol.PacketNumberLen2) 1310 pnManager.EXPECT().PopPacketNumber(protocol.EncryptionHandshake).Return(protocol.PacketNumber(0x42)) 1311 p, err := packer.PackCoalescedPacket(false, maxPacketSize, protocol.Version1) 1312 Expect(err).ToNot(HaveOccurred()) 1313 Expect(p.longHdrPackets).To(HaveLen(1)) 1314 Expect(p.longHdrPackets[0].ack).To(Equal(ack)) 1315 }) 1316 1317 for _, pers := range []protocol.Perspective{protocol.PerspectiveServer, protocol.PerspectiveClient} { 1318 perspective := pers 1319 1320 It(fmt.Sprintf("pads Initial packets to the required minimum packet size, for the %s", perspective), func() { 1321 token := []byte("initial token") 1322 packer.SetToken(token) 1323 f := &wire.CryptoFrame{Data: []byte("foobar")} 1324 pnManager.EXPECT().PeekPacketNumber(protocol.EncryptionInitial).Return(protocol.PacketNumber(0x42), protocol.PacketNumberLen2) 1325 pnManager.EXPECT().PopPacketNumber(protocol.EncryptionInitial).Return(protocol.PacketNumber(0x42)) 1326 sealingManager.EXPECT().GetInitialSealer().Return(getSealer(), nil) 1327 sealingManager.EXPECT().GetHandshakeSealer().Return(nil, handshake.ErrKeysNotYetAvailable) 1328 sealingManager.EXPECT().Get0RTTSealer().Return(nil, handshake.ErrKeysNotYetAvailable) 1329 sealingManager.EXPECT().Get1RTTSealer().Return(nil, handshake.ErrKeysNotYetAvailable) 1330 ackFramer.EXPECT().GetAckFrame(protocol.EncryptionInitial, false) 1331 initialStream.EXPECT().HasData().Return(true).Times(2) 1332 initialStream.EXPECT().PopCryptoFrame(gomock.Any()).Return(f) 1333 packer.perspective = protocol.PerspectiveClient 1334 p, err := packer.PackCoalescedPacket(false, maxPacketSize, protocol.Version1) 1335 Expect(err).ToNot(HaveOccurred()) 1336 Expect(p.buffer.Len()).To(BeNumerically(">=", protocol.MinInitialPacketSize)) 1337 Expect(p.buffer.Len()).To(BeEquivalentTo(maxPacketSize)) 1338 Expect(p.longHdrPackets).To(HaveLen(1)) 1339 Expect(p.longHdrPackets[0].header.Token).To(Equal(token)) 1340 Expect(p.longHdrPackets[0].frames).To(HaveLen(1)) 1341 cf := p.longHdrPackets[0].frames[0].Frame.(*wire.CryptoFrame) 1342 Expect(cf.Data).To(Equal([]byte("foobar"))) 1343 }) 1344 } 1345 1346 It("adds an ACK frame", func() { 1347 f := &wire.CryptoFrame{Data: []byte("foobar")} 1348 ack := &wire.AckFrame{AckRanges: []wire.AckRange{{Smallest: 42, Largest: 1337}}} 1349 pnManager.EXPECT().PeekPacketNumber(protocol.EncryptionInitial).Return(protocol.PacketNumber(0x42), protocol.PacketNumberLen2) 1350 pnManager.EXPECT().PopPacketNumber(protocol.EncryptionInitial).Return(protocol.PacketNumber(0x42)) 1351 sealingManager.EXPECT().GetInitialSealer().Return(getSealer(), nil) 1352 sealingManager.EXPECT().GetHandshakeSealer().Return(nil, handshake.ErrKeysNotYetAvailable) 1353 sealingManager.EXPECT().Get0RTTSealer().Return(nil, handshake.ErrKeysNotYetAvailable) 1354 sealingManager.EXPECT().Get1RTTSealer().Return(nil, handshake.ErrKeysNotYetAvailable) 1355 ackFramer.EXPECT().GetAckFrame(protocol.EncryptionInitial, false).Return(ack) 1356 initialStream.EXPECT().HasData().Return(true).Times(2) 1357 initialStream.EXPECT().PopCryptoFrame(gomock.Any()).Return(f) 1358 packer.perspective = protocol.PerspectiveClient 1359 p, err := packer.PackCoalescedPacket(false, maxPacketSize, protocol.Version1) 1360 Expect(err).ToNot(HaveOccurred()) 1361 Expect(p.longHdrPackets).To(HaveLen(1)) 1362 Expect(p.longHdrPackets[0].ack).To(Equal(ack)) 1363 Expect(p.longHdrPackets[0].frames).To(HaveLen(1)) 1364 Expect(p.buffer.Len()).To(BeEquivalentTo(maxPacketSize)) 1365 }) 1366 }) 1367 1368 Context("packing probe packets", func() { 1369 for _, pers := range []protocol.Perspective{protocol.PerspectiveServer, protocol.PerspectiveClient} { 1370 perspective := pers 1371 1372 It(fmt.Sprintf("packs an Initial probe packet and pads it, for the %s", perspective), func() { 1373 packer.perspective = perspective 1374 f := &wire.CryptoFrame{Data: []byte("Initial")} 1375 retransmissionQueue.addInitial(f) 1376 sealingManager.EXPECT().GetInitialSealer().Return(getSealer(), nil) 1377 ackFramer.EXPECT().GetAckFrame(protocol.EncryptionInitial, false) 1378 initialStream.EXPECT().HasData() 1379 pnManager.EXPECT().PeekPacketNumber(protocol.EncryptionInitial).Return(protocol.PacketNumber(0x42), protocol.PacketNumberLen2) 1380 pnManager.EXPECT().PopPacketNumber(protocol.EncryptionInitial).Return(protocol.PacketNumber(0x42)) 1381 1382 p, err := packer.MaybePackProbePacket(protocol.EncryptionInitial, maxPacketSize, protocol.Version1) 1383 Expect(err).ToNot(HaveOccurred()) 1384 Expect(p).ToNot(BeNil()) 1385 Expect(p.longHdrPackets).To(HaveLen(1)) 1386 packet := p.longHdrPackets[0] 1387 Expect(packet.EncryptionLevel()).To(Equal(protocol.EncryptionInitial)) 1388 Expect(p.buffer.Len()).To(BeNumerically(">=", protocol.MinInitialPacketSize)) 1389 Expect(p.buffer.Len()).To(BeEquivalentTo(maxPacketSize)) 1390 Expect(packet.frames).To(HaveLen(1)) 1391 Expect(packet.frames[0].Frame).To(Equal(f)) 1392 parsePacket(p.buffer.Data) 1393 }) 1394 1395 It(fmt.Sprintf("packs an Initial probe packet with 1 byte payload, for the %s", perspective), func() { 1396 packer.perspective = perspective 1397 retransmissionQueue.addInitial(&wire.PingFrame{}) 1398 sealingManager.EXPECT().GetInitialSealer().Return(getSealer(), nil) 1399 ackFramer.EXPECT().GetAckFrame(protocol.EncryptionInitial, false) 1400 initialStream.EXPECT().HasData() 1401 pnManager.EXPECT().PeekPacketNumber(protocol.EncryptionInitial).Return(protocol.PacketNumber(0x42), protocol.PacketNumberLen1) 1402 pnManager.EXPECT().PopPacketNumber(protocol.EncryptionInitial).Return(protocol.PacketNumber(0x42)) 1403 1404 p, err := packer.MaybePackProbePacket(protocol.EncryptionInitial, maxPacketSize, protocol.Version1) 1405 Expect(err).ToNot(HaveOccurred()) 1406 Expect(err).ToNot(HaveOccurred()) 1407 Expect(p).ToNot(BeNil()) 1408 Expect(p.longHdrPackets).To(HaveLen(1)) 1409 packet := p.longHdrPackets[0] 1410 Expect(packet.EncryptionLevel()).To(Equal(protocol.EncryptionInitial)) 1411 Expect(p.buffer.Len()).To(BeNumerically(">=", protocol.MinInitialPacketSize)) 1412 Expect(p.buffer.Len()).To(BeEquivalentTo(maxPacketSize)) 1413 Expect(packet.frames).To(HaveLen(1)) 1414 Expect(packet.frames[0].Frame).To(BeAssignableToTypeOf(&wire.PingFrame{})) 1415 parsePacket(p.buffer.Data) 1416 }) 1417 } 1418 1419 It("packs a Handshake probe packet", func() { 1420 f := &wire.CryptoFrame{Data: []byte("Handshake")} 1421 retransmissionQueue.addHandshake(f) 1422 sealingManager.EXPECT().GetHandshakeSealer().Return(getSealer(), nil) 1423 ackFramer.EXPECT().GetAckFrame(protocol.EncryptionHandshake, false) 1424 handshakeStream.EXPECT().HasData() 1425 pnManager.EXPECT().PeekPacketNumber(protocol.EncryptionHandshake).Return(protocol.PacketNumber(0x42), protocol.PacketNumberLen2) 1426 pnManager.EXPECT().PopPacketNumber(protocol.EncryptionHandshake).Return(protocol.PacketNumber(0x42)) 1427 1428 p, err := packer.MaybePackProbePacket(protocol.EncryptionHandshake, maxPacketSize, protocol.Version1) 1429 Expect(err).ToNot(HaveOccurred()) 1430 Expect(err).ToNot(HaveOccurred()) 1431 Expect(p).ToNot(BeNil()) 1432 Expect(p.longHdrPackets).To(HaveLen(1)) 1433 packet := p.longHdrPackets[0] 1434 Expect(packet.EncryptionLevel()).To(Equal(protocol.EncryptionHandshake)) 1435 Expect(packet.frames).To(HaveLen(1)) 1436 Expect(packet.frames[0].Frame).To(Equal(f)) 1437 parsePacket(p.buffer.Data) 1438 }) 1439 1440 It("packs a full size Handshake probe packet", func() { 1441 f := &wire.CryptoFrame{Data: make([]byte, 2000)} 1442 retransmissionQueue.addHandshake(f) 1443 sealingManager.EXPECT().GetHandshakeSealer().Return(getSealer(), nil) 1444 ackFramer.EXPECT().GetAckFrame(protocol.EncryptionHandshake, false) 1445 handshakeStream.EXPECT().HasData() 1446 pnManager.EXPECT().PeekPacketNumber(protocol.EncryptionHandshake).Return(protocol.PacketNumber(0x42), protocol.PacketNumberLen2) 1447 pnManager.EXPECT().PopPacketNumber(protocol.EncryptionHandshake).Return(protocol.PacketNumber(0x42)) 1448 1449 p, err := packer.MaybePackProbePacket(protocol.EncryptionHandshake, maxPacketSize, protocol.Version1) 1450 Expect(err).ToNot(HaveOccurred()) 1451 Expect(err).ToNot(HaveOccurred()) 1452 Expect(p).ToNot(BeNil()) 1453 Expect(p.longHdrPackets).To(HaveLen(1)) 1454 packet := p.longHdrPackets[0] 1455 Expect(packet.EncryptionLevel()).To(Equal(protocol.EncryptionHandshake)) 1456 Expect(packet.frames).To(HaveLen(1)) 1457 Expect(packet.frames[0].Frame).To(BeAssignableToTypeOf(&wire.CryptoFrame{})) 1458 Expect(packet.length).To(Equal(maxPacketSize)) 1459 parsePacket(p.buffer.Data) 1460 }) 1461 1462 It("packs a 1-RTT probe packet", func() { 1463 f := &wire.StreamFrame{Data: []byte("1-RTT")} 1464 retransmissionQueue.addInitial(f) 1465 sealingManager.EXPECT().Get1RTTSealer().Return(getSealer(), nil) 1466 ackFramer.EXPECT().GetAckFrame(protocol.Encryption1RTT, false) 1467 pnManager.EXPECT().PeekPacketNumber(protocol.Encryption1RTT).Return(protocol.PacketNumber(0x42), protocol.PacketNumberLen2) 1468 pnManager.EXPECT().PopPacketNumber(protocol.Encryption1RTT).Return(protocol.PacketNumber(0x42)) 1469 framer.EXPECT().HasData().Return(true) 1470 expectAppendControlFrames() 1471 expectAppendStreamFrames(ackhandler.StreamFrame{Frame: f}) 1472 1473 p, err := packer.MaybePackProbePacket(protocol.Encryption1RTT, maxPacketSize, protocol.Version1) 1474 Expect(err).ToNot(HaveOccurred()) 1475 Expect(p).ToNot(BeNil()) 1476 Expect(p.IsOnlyShortHeaderPacket()).To(BeTrue()) 1477 Expect(p.longHdrPackets).To(BeEmpty()) 1478 Expect(p.shortHdrPacket).ToNot(BeNil()) 1479 packet := p.shortHdrPacket 1480 Expect(packet.Frames).To(BeEmpty()) 1481 Expect(packet.StreamFrames).To(HaveLen(1)) 1482 Expect(packet.StreamFrames[0].Frame).To(Equal(f)) 1483 }) 1484 1485 It("packs a full size 1-RTT probe packet", func() { 1486 f := &wire.StreamFrame{Data: make([]byte, 2000)} 1487 retransmissionQueue.addInitial(f) 1488 sealingManager.EXPECT().Get1RTTSealer().Return(getSealer(), nil) 1489 ackFramer.EXPECT().GetAckFrame(protocol.Encryption1RTT, false) 1490 pnManager.EXPECT().PeekPacketNumber(protocol.Encryption1RTT).Return(protocol.PacketNumber(0x42), protocol.PacketNumberLen2) 1491 pnManager.EXPECT().PopPacketNumber(protocol.Encryption1RTT).Return(protocol.PacketNumber(0x42)) 1492 framer.EXPECT().HasData().Return(true) 1493 expectAppendControlFrames() 1494 framer.EXPECT().AppendStreamFrames(gomock.Any(), gomock.Any(), protocol.Version1).DoAndReturn(func(fs []ackhandler.StreamFrame, maxSize protocol.ByteCount, v protocol.Version) ([]ackhandler.StreamFrame, protocol.ByteCount) { 1495 sf, split := f.MaybeSplitOffFrame(maxSize, v) 1496 Expect(split).To(BeTrue()) 1497 return append(fs, ackhandler.StreamFrame{Frame: sf}), sf.Length(v) 1498 }) 1499 1500 p, err := packer.MaybePackProbePacket(protocol.Encryption1RTT, maxPacketSize, protocol.Version1) 1501 Expect(err).ToNot(HaveOccurred()) 1502 Expect(p).ToNot(BeNil()) 1503 Expect(p.IsOnlyShortHeaderPacket()).To(BeTrue()) 1504 Expect(p.longHdrPackets).To(BeEmpty()) 1505 Expect(p.shortHdrPacket).ToNot(BeNil()) 1506 packet := p.shortHdrPacket 1507 Expect(packet.Frames).To(BeEmpty()) 1508 Expect(packet.StreamFrames).To(HaveLen(1)) 1509 Expect(packet.Length).To(Equal(maxPacketSize)) 1510 }) 1511 1512 It("returns nil if there's no probe data to send", func() { 1513 sealingManager.EXPECT().Get1RTTSealer().Return(getSealer(), nil) 1514 pnManager.EXPECT().PeekPacketNumber(protocol.Encryption1RTT).Return(protocol.PacketNumber(0x42), protocol.PacketNumberLen2) 1515 ackFramer.EXPECT().GetAckFrame(protocol.Encryption1RTT, true) 1516 framer.EXPECT().HasData() 1517 1518 packet, err := packer.MaybePackProbePacket(protocol.Encryption1RTT, maxPacketSize, protocol.Version1) 1519 Expect(err).ToNot(HaveOccurred()) 1520 Expect(packet).To(BeNil()) 1521 }) 1522 1523 It("packs an MTU probe packet", func() { 1524 sealingManager.EXPECT().Get1RTTSealer().Return(getSealer(), nil) 1525 pnManager.EXPECT().PeekPacketNumber(protocol.Encryption1RTT).Return(protocol.PacketNumber(0x43), protocol.PacketNumberLen2) 1526 pnManager.EXPECT().PopPacketNumber(protocol.Encryption1RTT).Return(protocol.PacketNumber(0x43)) 1527 ping := ackhandler.Frame{Frame: &wire.PingFrame{}} 1528 const probePacketSize = maxPacketSize + 42 1529 p, buffer, err := packer.PackMTUProbePacket(ping, probePacketSize, protocol.Version1) 1530 Expect(err).ToNot(HaveOccurred()) 1531 Expect(p.Length).To(BeEquivalentTo(probePacketSize)) 1532 Expect(p.PacketNumber).To(Equal(protocol.PacketNumber(0x43))) 1533 Expect(buffer.Data).To(HaveLen(int(probePacketSize))) 1534 Expect(p.IsPathMTUProbePacket).To(BeTrue()) 1535 }) 1536 }) 1537 }) 1538 })