packet_packer.go 33 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001
  1. package quic
  2. import (
  3. "errors"
  4. "fmt"
  5. "net"
  6. "time"
  7. "github.com/Psiphon-Labs/quic-go/internal/ackhandler"
  8. "github.com/Psiphon-Labs/quic-go/internal/handshake"
  9. "github.com/Psiphon-Labs/quic-go/internal/protocol"
  10. "github.com/Psiphon-Labs/quic-go/internal/qerr"
  11. "github.com/Psiphon-Labs/quic-go/internal/utils"
  12. "github.com/Psiphon-Labs/quic-go/internal/wire"
  13. )
  14. var errNothingToPack = errors.New("nothing to pack")
  15. type packer interface {
  16. PackCoalescedPacket(onlyAck bool, v protocol.VersionNumber) (*coalescedPacket, error)
  17. PackPacket(onlyAck bool, now time.Time, v protocol.VersionNumber) (shortHeaderPacket, *packetBuffer, error)
  18. MaybePackProbePacket(protocol.EncryptionLevel, protocol.VersionNumber) (*coalescedPacket, error)
  19. PackConnectionClose(*qerr.TransportError, protocol.VersionNumber) (*coalescedPacket, error)
  20. PackApplicationClose(*qerr.ApplicationError, protocol.VersionNumber) (*coalescedPacket, error)
  21. SetMaxPacketSize(protocol.ByteCount)
  22. PackMTUProbePacket(ping ackhandler.Frame, size protocol.ByteCount, now time.Time, v protocol.VersionNumber) (shortHeaderPacket, *packetBuffer, error)
  23. HandleTransportParameters(*wire.TransportParameters)
  24. SetToken([]byte)
  25. }
  26. type sealer interface {
  27. handshake.LongHeaderSealer
  28. }
  29. type payload struct {
  30. frames []*ackhandler.Frame
  31. ack *wire.AckFrame
  32. length protocol.ByteCount
  33. }
  34. type longHeaderPacket struct {
  35. header *wire.ExtendedHeader
  36. ack *wire.AckFrame
  37. frames []*ackhandler.Frame
  38. length protocol.ByteCount
  39. isMTUProbePacket bool
  40. }
  41. type shortHeaderPacket struct {
  42. *ackhandler.Packet
  43. // used for logging
  44. DestConnID protocol.ConnectionID
  45. Ack *wire.AckFrame
  46. PacketNumberLen protocol.PacketNumberLen
  47. KeyPhase protocol.KeyPhaseBit
  48. }
  49. func (p *shortHeaderPacket) IsAckEliciting() bool { return ackhandler.HasAckElicitingFrames(p.Frames) }
  50. type coalescedPacket struct {
  51. buffer *packetBuffer
  52. longHdrPackets []*longHeaderPacket
  53. shortHdrPacket *shortHeaderPacket
  54. }
  55. func (p *longHeaderPacket) EncryptionLevel() protocol.EncryptionLevel {
  56. //nolint:exhaustive // Will never be called for Retry packets (and they don't have encrypted data).
  57. switch p.header.Type {
  58. case protocol.PacketTypeInitial:
  59. return protocol.EncryptionInitial
  60. case protocol.PacketTypeHandshake:
  61. return protocol.EncryptionHandshake
  62. case protocol.PacketType0RTT:
  63. return protocol.Encryption0RTT
  64. default:
  65. panic("can't determine encryption level")
  66. }
  67. }
  68. func (p *longHeaderPacket) IsAckEliciting() bool { return ackhandler.HasAckElicitingFrames(p.frames) }
  69. func (p *longHeaderPacket) ToAckHandlerPacket(now time.Time, q *retransmissionQueue) *ackhandler.Packet {
  70. largestAcked := protocol.InvalidPacketNumber
  71. if p.ack != nil {
  72. largestAcked = p.ack.LargestAcked()
  73. }
  74. encLevel := p.EncryptionLevel()
  75. for i := range p.frames {
  76. if p.frames[i].OnLost != nil {
  77. continue
  78. }
  79. //nolint:exhaustive // Short header packets are handled separately.
  80. switch encLevel {
  81. case protocol.EncryptionInitial:
  82. p.frames[i].OnLost = q.AddInitial
  83. case protocol.EncryptionHandshake:
  84. p.frames[i].OnLost = q.AddHandshake
  85. case protocol.Encryption0RTT:
  86. p.frames[i].OnLost = q.AddAppData
  87. }
  88. }
  89. ap := ackhandler.GetPacket()
  90. ap.PacketNumber = p.header.PacketNumber
  91. ap.LargestAcked = largestAcked
  92. ap.Frames = p.frames
  93. ap.Length = p.length
  94. ap.EncryptionLevel = encLevel
  95. ap.SendTime = now
  96. ap.IsPathMTUProbePacket = p.isMTUProbePacket
  97. return ap
  98. }
  99. func getMaxPacketSize(addr net.Addr, maxPacketSizeAdustment int) protocol.ByteCount {
  100. maxSize := protocol.ByteCount(protocol.MinInitialPacketSize)
  101. // If this is not a UDP address, we don't know anything about the MTU.
  102. // Use the minimum size of an Initial packet as the max packet size.
  103. if udpAddr, ok := addr.(*net.UDPAddr); ok {
  104. if utils.IsIPv4(udpAddr.IP) {
  105. maxSize = protocol.InitialPacketSizeIPv4
  106. } else {
  107. maxSize = protocol.InitialPacketSizeIPv6
  108. }
  109. // [Psiphon]
  110. //
  111. // Adjust the max packet size to allow for obfuscation overhead. This
  112. // is a best-effort operation. In practice, maxPacketSizeAdustment
  113. // will be tens of bytes and maxSize is over 1200 bytes; the
  114. // condition here is a sanity check guard to prevent negative sizes
  115. // and possible panics. We don't expect to need to make the largest
  116. // adustment that would be possible when the condition is false.
  117. //
  118. // TODO: internal/congestion.cubicSender continues to use
  119. // initialMaxDatagramSize = protocol.InitialPacketSizeIPv4
  120. if maxSize > protocol.ByteCount(maxPacketSizeAdustment) {
  121. maxSize -= protocol.ByteCount(maxPacketSizeAdustment)
  122. }
  123. }
  124. return maxSize
  125. }
  126. type packetNumberManager interface {
  127. PeekPacketNumber(protocol.EncryptionLevel) (protocol.PacketNumber, protocol.PacketNumberLen)
  128. PopPacketNumber(protocol.EncryptionLevel) protocol.PacketNumber
  129. }
  130. type sealingManager interface {
  131. GetInitialSealer() (handshake.LongHeaderSealer, error)
  132. GetHandshakeSealer() (handshake.LongHeaderSealer, error)
  133. Get0RTTSealer() (handshake.LongHeaderSealer, error)
  134. Get1RTTSealer() (handshake.ShortHeaderSealer, error)
  135. }
  136. type frameSource interface {
  137. HasData() bool
  138. AppendStreamFrames([]*ackhandler.Frame, protocol.ByteCount, protocol.VersionNumber) ([]*ackhandler.Frame, protocol.ByteCount)
  139. AppendControlFrames([]*ackhandler.Frame, protocol.ByteCount, protocol.VersionNumber) ([]*ackhandler.Frame, protocol.ByteCount)
  140. }
  141. type ackFrameSource interface {
  142. GetAckFrame(encLevel protocol.EncryptionLevel, onlyIfQueued bool) *wire.AckFrame
  143. }
  144. type packetPacker struct {
  145. srcConnID protocol.ConnectionID
  146. getDestConnID func() protocol.ConnectionID
  147. perspective protocol.Perspective
  148. cryptoSetup sealingManager
  149. initialStream cryptoStream
  150. handshakeStream cryptoStream
  151. token []byte
  152. pnManager packetNumberManager
  153. framer frameSource
  154. acks ackFrameSource
  155. datagramQueue *datagramQueue
  156. retransmissionQueue *retransmissionQueue
  157. maxPacketSize protocol.ByteCount
  158. numNonAckElicitingAcks int
  159. }
  160. var _ packer = &packetPacker{}
  161. func newPacketPacker(
  162. srcConnID protocol.ConnectionID,
  163. getDestConnID func() protocol.ConnectionID,
  164. initialStream cryptoStream,
  165. handshakeStream cryptoStream,
  166. packetNumberManager packetNumberManager,
  167. retransmissionQueue *retransmissionQueue,
  168. remoteAddr net.Addr, // only used for determining the max packet size
  169. // [Psiphon]
  170. maxPacketSizeAdustment int,
  171. cryptoSetup sealingManager,
  172. framer frameSource,
  173. acks ackFrameSource,
  174. datagramQueue *datagramQueue,
  175. perspective protocol.Perspective,
  176. ) *packetPacker {
  177. return &packetPacker{
  178. cryptoSetup: cryptoSetup,
  179. getDestConnID: getDestConnID,
  180. srcConnID: srcConnID,
  181. initialStream: initialStream,
  182. handshakeStream: handshakeStream,
  183. retransmissionQueue: retransmissionQueue,
  184. datagramQueue: datagramQueue,
  185. perspective: perspective,
  186. framer: framer,
  187. acks: acks,
  188. pnManager: packetNumberManager,
  189. maxPacketSize: getMaxPacketSize(remoteAddr, maxPacketSizeAdustment),
  190. }
  191. }
  192. // PackConnectionClose packs a packet that closes the connection with a transport error.
  193. func (p *packetPacker) PackConnectionClose(e *qerr.TransportError, v protocol.VersionNumber) (*coalescedPacket, error) {
  194. var reason string
  195. // don't send details of crypto errors
  196. if !e.ErrorCode.IsCryptoError() {
  197. reason = e.ErrorMessage
  198. }
  199. return p.packConnectionClose(false, uint64(e.ErrorCode), e.FrameType, reason, v)
  200. }
  201. // PackApplicationClose packs a packet that closes the connection with an application error.
  202. func (p *packetPacker) PackApplicationClose(e *qerr.ApplicationError, v protocol.VersionNumber) (*coalescedPacket, error) {
  203. return p.packConnectionClose(true, uint64(e.ErrorCode), 0, e.ErrorMessage, v)
  204. }
  205. func (p *packetPacker) packConnectionClose(
  206. isApplicationError bool,
  207. errorCode uint64,
  208. frameType uint64,
  209. reason string,
  210. v protocol.VersionNumber,
  211. ) (*coalescedPacket, error) {
  212. var sealers [4]sealer
  213. var hdrs [3]*wire.ExtendedHeader
  214. var payloads [4]payload
  215. var size protocol.ByteCount
  216. var connID protocol.ConnectionID
  217. var oneRTTPacketNumber protocol.PacketNumber
  218. var oneRTTPacketNumberLen protocol.PacketNumberLen
  219. var keyPhase protocol.KeyPhaseBit // only set for 1-RTT
  220. var numLongHdrPackets uint8
  221. encLevels := [4]protocol.EncryptionLevel{protocol.EncryptionInitial, protocol.EncryptionHandshake, protocol.Encryption0RTT, protocol.Encryption1RTT}
  222. for i, encLevel := range encLevels {
  223. if p.perspective == protocol.PerspectiveServer && encLevel == protocol.Encryption0RTT {
  224. continue
  225. }
  226. ccf := &wire.ConnectionCloseFrame{
  227. IsApplicationError: isApplicationError,
  228. ErrorCode: errorCode,
  229. FrameType: frameType,
  230. ReasonPhrase: reason,
  231. }
  232. // don't send application errors in Initial or Handshake packets
  233. if isApplicationError && (encLevel == protocol.EncryptionInitial || encLevel == protocol.EncryptionHandshake) {
  234. ccf.IsApplicationError = false
  235. ccf.ErrorCode = uint64(qerr.ApplicationErrorErrorCode)
  236. ccf.ReasonPhrase = ""
  237. }
  238. pl := payload{
  239. frames: []*ackhandler.Frame{{Frame: ccf}},
  240. length: ccf.Length(v),
  241. }
  242. var sealer sealer
  243. var err error
  244. switch encLevel {
  245. case protocol.EncryptionInitial:
  246. sealer, err = p.cryptoSetup.GetInitialSealer()
  247. case protocol.EncryptionHandshake:
  248. sealer, err = p.cryptoSetup.GetHandshakeSealer()
  249. case protocol.Encryption0RTT:
  250. sealer, err = p.cryptoSetup.Get0RTTSealer()
  251. case protocol.Encryption1RTT:
  252. var s handshake.ShortHeaderSealer
  253. s, err = p.cryptoSetup.Get1RTTSealer()
  254. if err == nil {
  255. keyPhase = s.KeyPhase()
  256. }
  257. sealer = s
  258. }
  259. if err == handshake.ErrKeysNotYetAvailable || err == handshake.ErrKeysDropped {
  260. continue
  261. }
  262. if err != nil {
  263. return nil, err
  264. }
  265. sealers[i] = sealer
  266. var hdr *wire.ExtendedHeader
  267. if encLevel == protocol.Encryption1RTT {
  268. connID = p.getDestConnID()
  269. oneRTTPacketNumber, oneRTTPacketNumberLen = p.pnManager.PeekPacketNumber(protocol.Encryption1RTT)
  270. size += p.shortHeaderPacketLength(connID, oneRTTPacketNumberLen, pl)
  271. } else {
  272. hdr = p.getLongHeader(encLevel, v)
  273. hdrs[i] = hdr
  274. size += p.longHeaderPacketLength(hdr, pl, v) + protocol.ByteCount(sealer.Overhead())
  275. numLongHdrPackets++
  276. }
  277. payloads[i] = pl
  278. }
  279. buffer := getPacketBuffer()
  280. packet := &coalescedPacket{
  281. buffer: buffer,
  282. longHdrPackets: make([]*longHeaderPacket, 0, numLongHdrPackets),
  283. }
  284. for i, encLevel := range encLevels {
  285. if sealers[i] == nil {
  286. continue
  287. }
  288. var paddingLen protocol.ByteCount
  289. if encLevel == protocol.EncryptionInitial {
  290. paddingLen = p.initialPaddingLen(payloads[i].frames, size)
  291. }
  292. if encLevel == protocol.Encryption1RTT {
  293. ap, ack, err := p.appendShortHeaderPacket(buffer, connID, oneRTTPacketNumber, oneRTTPacketNumberLen, keyPhase, payloads[i], paddingLen, sealers[i], false, v)
  294. if err != nil {
  295. return nil, err
  296. }
  297. packet.shortHdrPacket = &shortHeaderPacket{
  298. Packet: ap,
  299. DestConnID: connID,
  300. Ack: ack,
  301. PacketNumberLen: oneRTTPacketNumberLen,
  302. KeyPhase: keyPhase,
  303. }
  304. } else {
  305. longHdrPacket, err := p.appendLongHeaderPacket(buffer, hdrs[i], payloads[i], paddingLen, encLevel, sealers[i], v)
  306. if err != nil {
  307. return nil, err
  308. }
  309. packet.longHdrPackets = append(packet.longHdrPackets, longHdrPacket)
  310. }
  311. }
  312. return packet, nil
  313. }
  314. // longHeaderPacketLength calculates the length of a serialized long header packet.
  315. // It takes into account that packets that have a tiny payload need to be padded,
  316. // such that len(payload) + packet number len >= 4 + AEAD overhead
  317. func (p *packetPacker) longHeaderPacketLength(hdr *wire.ExtendedHeader, pl payload, v protocol.VersionNumber) protocol.ByteCount {
  318. var paddingLen protocol.ByteCount
  319. pnLen := protocol.ByteCount(hdr.PacketNumberLen)
  320. if pl.length < 4-pnLen {
  321. paddingLen = 4 - pnLen - pl.length
  322. }
  323. return hdr.GetLength(v) + pl.length + paddingLen
  324. }
  325. // shortHeaderPacketLength calculates the length of a serialized short header packet.
  326. // It takes into account that packets that have a tiny payload need to be padded,
  327. // such that len(payload) + packet number len >= 4 + AEAD overhead
  328. func (p *packetPacker) shortHeaderPacketLength(connID protocol.ConnectionID, pnLen protocol.PacketNumberLen, pl payload) protocol.ByteCount {
  329. var paddingLen protocol.ByteCount
  330. if pl.length < 4-protocol.ByteCount(pnLen) {
  331. paddingLen = 4 - protocol.ByteCount(pnLen) - pl.length
  332. }
  333. return wire.ShortHeaderLen(connID, pnLen) + pl.length + paddingLen
  334. }
  335. // size is the expected size of the packet, if no padding was applied.
  336. func (p *packetPacker) initialPaddingLen(frames []*ackhandler.Frame, size protocol.ByteCount) protocol.ByteCount {
  337. // For the server, only ack-eliciting Initial packets need to be padded.
  338. if p.perspective == protocol.PerspectiveServer && !ackhandler.HasAckElicitingFrames(frames) {
  339. return 0
  340. }
  341. if size >= p.maxPacketSize {
  342. return 0
  343. }
  344. return p.maxPacketSize - size
  345. }
  346. // PackCoalescedPacket packs a new packet.
  347. // It packs an Initial / Handshake if there is data to send in these packet number spaces.
  348. // It should only be called before the handshake is confirmed.
  349. func (p *packetPacker) PackCoalescedPacket(onlyAck bool, v protocol.VersionNumber) (*coalescedPacket, error) {
  350. maxPacketSize := p.maxPacketSize
  351. if p.perspective == protocol.PerspectiveClient {
  352. maxPacketSize = protocol.MinInitialPacketSize
  353. }
  354. var (
  355. initialHdr, handshakeHdr, zeroRTTHdr *wire.ExtendedHeader
  356. initialPayload, handshakePayload, zeroRTTPayload, oneRTTPayload payload
  357. oneRTTPacketNumber protocol.PacketNumber
  358. oneRTTPacketNumberLen protocol.PacketNumberLen
  359. )
  360. // Try packing an Initial packet.
  361. initialSealer, err := p.cryptoSetup.GetInitialSealer()
  362. if err != nil && err != handshake.ErrKeysDropped {
  363. return nil, err
  364. }
  365. var size protocol.ByteCount
  366. if initialSealer != nil {
  367. initialHdr, initialPayload = p.maybeGetCryptoPacket(maxPacketSize-protocol.ByteCount(initialSealer.Overhead()), protocol.EncryptionInitial, onlyAck, true, v)
  368. if initialPayload.length > 0 {
  369. size += p.longHeaderPacketLength(initialHdr, initialPayload, v) + protocol.ByteCount(initialSealer.Overhead())
  370. }
  371. }
  372. // Add a Handshake packet.
  373. var handshakeSealer sealer
  374. if (onlyAck && size == 0) || (!onlyAck && size < maxPacketSize-protocol.MinCoalescedPacketSize) {
  375. var err error
  376. handshakeSealer, err = p.cryptoSetup.GetHandshakeSealer()
  377. if err != nil && err != handshake.ErrKeysDropped && err != handshake.ErrKeysNotYetAvailable {
  378. return nil, err
  379. }
  380. if handshakeSealer != nil {
  381. handshakeHdr, handshakePayload = p.maybeGetCryptoPacket(maxPacketSize-size-protocol.ByteCount(handshakeSealer.Overhead()), protocol.EncryptionHandshake, onlyAck, size == 0, v)
  382. if handshakePayload.length > 0 {
  383. s := p.longHeaderPacketLength(handshakeHdr, handshakePayload, v) + protocol.ByteCount(handshakeSealer.Overhead())
  384. size += s
  385. }
  386. }
  387. }
  388. // Add a 0-RTT / 1-RTT packet.
  389. var zeroRTTSealer sealer
  390. var oneRTTSealer handshake.ShortHeaderSealer
  391. var connID protocol.ConnectionID
  392. var kp protocol.KeyPhaseBit
  393. if (onlyAck && size == 0) || (!onlyAck && size < maxPacketSize-protocol.MinCoalescedPacketSize) {
  394. var err error
  395. oneRTTSealer, err = p.cryptoSetup.Get1RTTSealer()
  396. if err != nil && err != handshake.ErrKeysDropped && err != handshake.ErrKeysNotYetAvailable {
  397. return nil, err
  398. }
  399. if err == nil { // 1-RTT
  400. kp = oneRTTSealer.KeyPhase()
  401. connID = p.getDestConnID()
  402. oneRTTPacketNumber, oneRTTPacketNumberLen = p.pnManager.PeekPacketNumber(protocol.Encryption1RTT)
  403. hdrLen := wire.ShortHeaderLen(connID, oneRTTPacketNumberLen)
  404. oneRTTPayload = p.maybeGetShortHeaderPacket(oneRTTSealer, hdrLen, maxPacketSize-size, onlyAck, size == 0, v)
  405. if oneRTTPayload.length > 0 {
  406. size += p.shortHeaderPacketLength(connID, oneRTTPacketNumberLen, oneRTTPayload) + protocol.ByteCount(oneRTTSealer.Overhead())
  407. }
  408. } else if p.perspective == protocol.PerspectiveClient { // 0-RTT
  409. var err error
  410. zeroRTTSealer, err = p.cryptoSetup.Get0RTTSealer()
  411. if err != nil && err != handshake.ErrKeysDropped && err != handshake.ErrKeysNotYetAvailable {
  412. return nil, err
  413. }
  414. if zeroRTTSealer != nil {
  415. zeroRTTHdr, zeroRTTPayload = p.maybeGetAppDataPacketFor0RTT(zeroRTTSealer, maxPacketSize-size, v)
  416. if zeroRTTPayload.length > 0 {
  417. size += p.longHeaderPacketLength(zeroRTTHdr, zeroRTTPayload, v) + protocol.ByteCount(zeroRTTSealer.Overhead())
  418. }
  419. }
  420. }
  421. }
  422. if initialPayload.length == 0 && handshakePayload.length == 0 && zeroRTTPayload.length == 0 && oneRTTPayload.length == 0 {
  423. return nil, nil
  424. }
  425. buffer := getPacketBuffer()
  426. packet := &coalescedPacket{
  427. buffer: buffer,
  428. longHdrPackets: make([]*longHeaderPacket, 0, 3),
  429. }
  430. if initialPayload.length > 0 {
  431. padding := p.initialPaddingLen(initialPayload.frames, size)
  432. cont, err := p.appendLongHeaderPacket(buffer, initialHdr, initialPayload, padding, protocol.EncryptionInitial, initialSealer, v)
  433. if err != nil {
  434. return nil, err
  435. }
  436. packet.longHdrPackets = append(packet.longHdrPackets, cont)
  437. }
  438. if handshakePayload.length > 0 {
  439. cont, err := p.appendLongHeaderPacket(buffer, handshakeHdr, handshakePayload, 0, protocol.EncryptionHandshake, handshakeSealer, v)
  440. if err != nil {
  441. return nil, err
  442. }
  443. packet.longHdrPackets = append(packet.longHdrPackets, cont)
  444. }
  445. if zeroRTTPayload.length > 0 {
  446. longHdrPacket, err := p.appendLongHeaderPacket(buffer, zeroRTTHdr, zeroRTTPayload, 0, protocol.Encryption0RTT, zeroRTTSealer, v)
  447. if err != nil {
  448. return nil, err
  449. }
  450. packet.longHdrPackets = append(packet.longHdrPackets, longHdrPacket)
  451. } else if oneRTTPayload.length > 0 {
  452. ap, ack, err := p.appendShortHeaderPacket(buffer, connID, oneRTTPacketNumber, oneRTTPacketNumberLen, kp, oneRTTPayload, 0, oneRTTSealer, false, v)
  453. if err != nil {
  454. return nil, err
  455. }
  456. packet.shortHdrPacket = &shortHeaderPacket{
  457. Packet: ap,
  458. DestConnID: connID,
  459. Ack: ack,
  460. PacketNumberLen: oneRTTPacketNumberLen,
  461. KeyPhase: kp,
  462. }
  463. }
  464. return packet, nil
  465. }
  466. // PackPacket packs a packet in the application data packet number space.
  467. // It should be called after the handshake is confirmed.
  468. func (p *packetPacker) PackPacket(onlyAck bool, now time.Time, v protocol.VersionNumber) (shortHeaderPacket, *packetBuffer, error) {
  469. sealer, err := p.cryptoSetup.Get1RTTSealer()
  470. if err != nil {
  471. return shortHeaderPacket{}, nil, err
  472. }
  473. pn, pnLen := p.pnManager.PeekPacketNumber(protocol.Encryption1RTT)
  474. connID := p.getDestConnID()
  475. hdrLen := wire.ShortHeaderLen(connID, pnLen)
  476. pl := p.maybeGetShortHeaderPacket(sealer, hdrLen, p.maxPacketSize, onlyAck, true, v)
  477. if pl.length == 0 {
  478. return shortHeaderPacket{}, nil, errNothingToPack
  479. }
  480. kp := sealer.KeyPhase()
  481. buffer := getPacketBuffer()
  482. ap, ack, err := p.appendShortHeaderPacket(buffer, connID, pn, pnLen, kp, pl, 0, sealer, false, v)
  483. if err != nil {
  484. return shortHeaderPacket{}, nil, err
  485. }
  486. return shortHeaderPacket{
  487. Packet: ap,
  488. DestConnID: connID,
  489. Ack: ack,
  490. PacketNumberLen: pnLen,
  491. KeyPhase: kp,
  492. }, buffer, nil
  493. }
  494. func (p *packetPacker) maybeGetCryptoPacket(maxPacketSize protocol.ByteCount, encLevel protocol.EncryptionLevel, onlyAck, ackAllowed bool, v protocol.VersionNumber) (*wire.ExtendedHeader, payload) {
  495. if onlyAck {
  496. if ack := p.acks.GetAckFrame(encLevel, true); ack != nil {
  497. return p.getLongHeader(encLevel, v), payload{
  498. ack: ack,
  499. length: ack.Length(v),
  500. }
  501. }
  502. return nil, payload{}
  503. }
  504. var s cryptoStream
  505. var hasRetransmission bool
  506. //nolint:exhaustive // Initial and Handshake are the only two encryption levels here.
  507. switch encLevel {
  508. case protocol.EncryptionInitial:
  509. s = p.initialStream
  510. hasRetransmission = p.retransmissionQueue.HasInitialData()
  511. case protocol.EncryptionHandshake:
  512. s = p.handshakeStream
  513. hasRetransmission = p.retransmissionQueue.HasHandshakeData()
  514. }
  515. hasData := s.HasData()
  516. var ack *wire.AckFrame
  517. if ackAllowed {
  518. ack = p.acks.GetAckFrame(encLevel, !hasRetransmission && !hasData)
  519. }
  520. if !hasData && !hasRetransmission && ack == nil {
  521. // nothing to send
  522. return nil, payload{}
  523. }
  524. var pl payload
  525. if ack != nil {
  526. pl.ack = ack
  527. pl.length = ack.Length(v)
  528. maxPacketSize -= pl.length
  529. }
  530. hdr := p.getLongHeader(encLevel, v)
  531. maxPacketSize -= hdr.GetLength(v)
  532. if hasRetransmission {
  533. for {
  534. var f wire.Frame
  535. //nolint:exhaustive // 0-RTT packets can't contain any retransmission.s
  536. switch encLevel {
  537. case protocol.EncryptionInitial:
  538. f = p.retransmissionQueue.GetInitialFrame(maxPacketSize, v)
  539. case protocol.EncryptionHandshake:
  540. f = p.retransmissionQueue.GetHandshakeFrame(maxPacketSize, v)
  541. }
  542. if f == nil {
  543. break
  544. }
  545. af := ackhandler.GetFrame()
  546. af.Frame = f
  547. pl.frames = append(pl.frames, af)
  548. frameLen := f.Length(v)
  549. pl.length += frameLen
  550. maxPacketSize -= frameLen
  551. }
  552. } else if s.HasData() {
  553. cf := s.PopCryptoFrame(maxPacketSize)
  554. pl.frames = []*ackhandler.Frame{{Frame: cf}}
  555. pl.length += cf.Length(v)
  556. }
  557. return hdr, pl
  558. }
  559. func (p *packetPacker) maybeGetAppDataPacketFor0RTT(sealer sealer, maxPacketSize protocol.ByteCount, v protocol.VersionNumber) (*wire.ExtendedHeader, payload) {
  560. if p.perspective != protocol.PerspectiveClient {
  561. return nil, payload{}
  562. }
  563. hdr := p.getLongHeader(protocol.Encryption0RTT, v)
  564. maxPayloadSize := maxPacketSize - hdr.GetLength(v) - protocol.ByteCount(sealer.Overhead())
  565. return hdr, p.maybeGetAppDataPacket(maxPayloadSize, false, false, v)
  566. }
  567. func (p *packetPacker) maybeGetShortHeaderPacket(sealer handshake.ShortHeaderSealer, hdrLen protocol.ByteCount, maxPacketSize protocol.ByteCount, onlyAck, ackAllowed bool, v protocol.VersionNumber) payload {
  568. maxPayloadSize := maxPacketSize - hdrLen - protocol.ByteCount(sealer.Overhead())
  569. return p.maybeGetAppDataPacket(maxPayloadSize, onlyAck, ackAllowed, v)
  570. }
  571. func (p *packetPacker) maybeGetAppDataPacket(maxPayloadSize protocol.ByteCount, onlyAck, ackAllowed bool, v protocol.VersionNumber) payload {
  572. pl := p.composeNextPacket(maxPayloadSize, onlyAck, ackAllowed, v)
  573. // check if we have anything to send
  574. if len(pl.frames) == 0 {
  575. if pl.ack == nil {
  576. return payload{}
  577. }
  578. // the packet only contains an ACK
  579. if p.numNonAckElicitingAcks >= protocol.MaxNonAckElicitingAcks {
  580. ping := &wire.PingFrame{}
  581. // don't retransmit the PING frame when it is lost
  582. af := ackhandler.GetFrame()
  583. af.Frame = ping
  584. af.OnLost = func(wire.Frame) {}
  585. pl.frames = append(pl.frames, af)
  586. pl.length += ping.Length(v)
  587. p.numNonAckElicitingAcks = 0
  588. } else {
  589. p.numNonAckElicitingAcks++
  590. }
  591. } else {
  592. p.numNonAckElicitingAcks = 0
  593. }
  594. return pl
  595. }
  596. func (p *packetPacker) composeNextPacket(maxFrameSize protocol.ByteCount, onlyAck, ackAllowed bool, v protocol.VersionNumber) payload {
  597. if onlyAck {
  598. if ack := p.acks.GetAckFrame(protocol.Encryption1RTT, true); ack != nil {
  599. return payload{
  600. ack: ack,
  601. length: ack.Length(v),
  602. }
  603. }
  604. return payload{}
  605. }
  606. pl := payload{frames: make([]*ackhandler.Frame, 0, 1)}
  607. hasData := p.framer.HasData()
  608. hasRetransmission := p.retransmissionQueue.HasAppData()
  609. var hasAck bool
  610. if ackAllowed {
  611. if ack := p.acks.GetAckFrame(protocol.Encryption1RTT, !hasRetransmission && !hasData); ack != nil {
  612. pl.ack = ack
  613. pl.length += ack.Length(v)
  614. hasAck = true
  615. }
  616. }
  617. if p.datagramQueue != nil {
  618. if f := p.datagramQueue.Peek(); f != nil {
  619. size := f.Length(v)
  620. if size <= maxFrameSize-pl.length {
  621. af := ackhandler.GetFrame()
  622. af.Frame = f
  623. // set it to a no-op. Then we won't set the default callback, which would retransmit the frame.
  624. af.OnLost = func(wire.Frame) {}
  625. pl.frames = append(pl.frames, af)
  626. pl.length += size
  627. p.datagramQueue.Pop()
  628. }
  629. }
  630. }
  631. if hasAck && !hasData && !hasRetransmission {
  632. return pl
  633. }
  634. if hasRetransmission {
  635. for {
  636. remainingLen := maxFrameSize - pl.length
  637. if remainingLen < protocol.MinStreamFrameSize {
  638. break
  639. }
  640. f := p.retransmissionQueue.GetAppDataFrame(remainingLen, v)
  641. if f == nil {
  642. break
  643. }
  644. af := ackhandler.GetFrame()
  645. af.Frame = f
  646. pl.frames = append(pl.frames, af)
  647. pl.length += f.Length(v)
  648. }
  649. }
  650. if hasData {
  651. var lengthAdded protocol.ByteCount
  652. pl.frames, lengthAdded = p.framer.AppendControlFrames(pl.frames, maxFrameSize-pl.length, v)
  653. pl.length += lengthAdded
  654. pl.frames, lengthAdded = p.framer.AppendStreamFrames(pl.frames, maxFrameSize-pl.length, v)
  655. pl.length += lengthAdded
  656. }
  657. return pl
  658. }
  659. func (p *packetPacker) MaybePackProbePacket(encLevel protocol.EncryptionLevel, v protocol.VersionNumber) (*coalescedPacket, error) {
  660. if encLevel == protocol.Encryption1RTT {
  661. s, err := p.cryptoSetup.Get1RTTSealer()
  662. if err != nil {
  663. return nil, err
  664. }
  665. kp := s.KeyPhase()
  666. connID := p.getDestConnID()
  667. pn, pnLen := p.pnManager.PeekPacketNumber(protocol.Encryption1RTT)
  668. hdrLen := wire.ShortHeaderLen(connID, pnLen)
  669. pl := p.maybeGetAppDataPacket(p.maxPacketSize-protocol.ByteCount(s.Overhead())-hdrLen, false, true, v)
  670. if pl.length == 0 {
  671. return nil, nil
  672. }
  673. buffer := getPacketBuffer()
  674. packet := &coalescedPacket{buffer: buffer}
  675. ap, ack, err := p.appendShortHeaderPacket(buffer, connID, pn, pnLen, kp, pl, 0, s, false, v)
  676. if err != nil {
  677. return nil, err
  678. }
  679. packet.shortHdrPacket = &shortHeaderPacket{
  680. Packet: ap,
  681. DestConnID: connID,
  682. Ack: ack,
  683. PacketNumberLen: pnLen,
  684. KeyPhase: kp,
  685. }
  686. return packet, nil
  687. }
  688. var hdr *wire.ExtendedHeader
  689. var pl payload
  690. var sealer handshake.LongHeaderSealer
  691. //nolint:exhaustive // Probe packets are never sent for 0-RTT.
  692. switch encLevel {
  693. case protocol.EncryptionInitial:
  694. var err error
  695. sealer, err = p.cryptoSetup.GetInitialSealer()
  696. if err != nil {
  697. return nil, err
  698. }
  699. hdr, pl = p.maybeGetCryptoPacket(p.maxPacketSize-protocol.ByteCount(sealer.Overhead()), protocol.EncryptionInitial, false, true, v)
  700. case protocol.EncryptionHandshake:
  701. var err error
  702. sealer, err = p.cryptoSetup.GetHandshakeSealer()
  703. if err != nil {
  704. return nil, err
  705. }
  706. hdr, pl = p.maybeGetCryptoPacket(p.maxPacketSize-protocol.ByteCount(sealer.Overhead()), protocol.EncryptionHandshake, false, true, v)
  707. default:
  708. panic("unknown encryption level")
  709. }
  710. if pl.length == 0 {
  711. return nil, nil
  712. }
  713. buffer := getPacketBuffer()
  714. packet := &coalescedPacket{buffer: buffer}
  715. size := p.longHeaderPacketLength(hdr, pl, v) + protocol.ByteCount(sealer.Overhead())
  716. var padding protocol.ByteCount
  717. if encLevel == protocol.EncryptionInitial {
  718. padding = p.initialPaddingLen(pl.frames, size)
  719. }
  720. longHdrPacket, err := p.appendLongHeaderPacket(buffer, hdr, pl, padding, encLevel, sealer, v)
  721. if err != nil {
  722. return nil, err
  723. }
  724. packet.longHdrPackets = []*longHeaderPacket{longHdrPacket}
  725. return packet, nil
  726. }
  727. func (p *packetPacker) PackMTUProbePacket(ping ackhandler.Frame, size protocol.ByteCount, now time.Time, v protocol.VersionNumber) (shortHeaderPacket, *packetBuffer, error) {
  728. pl := payload{
  729. frames: []*ackhandler.Frame{&ping},
  730. length: ping.Length(v),
  731. }
  732. buffer := getPacketBuffer()
  733. s, err := p.cryptoSetup.Get1RTTSealer()
  734. if err != nil {
  735. return shortHeaderPacket{}, nil, err
  736. }
  737. connID := p.getDestConnID()
  738. pn, pnLen := p.pnManager.PeekPacketNumber(protocol.Encryption1RTT)
  739. padding := size - p.shortHeaderPacketLength(connID, pnLen, pl) - protocol.ByteCount(s.Overhead())
  740. kp := s.KeyPhase()
  741. ap, ack, err := p.appendShortHeaderPacket(buffer, connID, pn, pnLen, kp, pl, padding, s, true, v)
  742. if err != nil {
  743. return shortHeaderPacket{}, nil, err
  744. }
  745. return shortHeaderPacket{
  746. Packet: ap,
  747. DestConnID: connID,
  748. Ack: ack,
  749. PacketNumberLen: pnLen,
  750. KeyPhase: kp,
  751. }, buffer, nil
  752. }
  753. func (p *packetPacker) getLongHeader(encLevel protocol.EncryptionLevel, v protocol.VersionNumber) *wire.ExtendedHeader {
  754. pn, pnLen := p.pnManager.PeekPacketNumber(encLevel)
  755. hdr := &wire.ExtendedHeader{
  756. PacketNumber: pn,
  757. PacketNumberLen: pnLen,
  758. }
  759. hdr.Version = v
  760. hdr.SrcConnectionID = p.srcConnID
  761. hdr.DestConnectionID = p.getDestConnID()
  762. //nolint:exhaustive // 1-RTT packets are not long header packets.
  763. switch encLevel {
  764. case protocol.EncryptionInitial:
  765. hdr.Type = protocol.PacketTypeInitial
  766. hdr.Token = p.token
  767. case protocol.EncryptionHandshake:
  768. hdr.Type = protocol.PacketTypeHandshake
  769. case protocol.Encryption0RTT:
  770. hdr.Type = protocol.PacketType0RTT
  771. }
  772. return hdr
  773. }
  774. func (p *packetPacker) appendLongHeaderPacket(buffer *packetBuffer, header *wire.ExtendedHeader, pl payload, padding protocol.ByteCount, encLevel protocol.EncryptionLevel, sealer sealer, v protocol.VersionNumber) (*longHeaderPacket, error) {
  775. var paddingLen protocol.ByteCount
  776. pnLen := protocol.ByteCount(header.PacketNumberLen)
  777. if pl.length < 4-pnLen {
  778. paddingLen = 4 - pnLen - pl.length
  779. }
  780. paddingLen += padding
  781. header.Length = pnLen + protocol.ByteCount(sealer.Overhead()) + pl.length + paddingLen
  782. startLen := len(buffer.Data)
  783. raw := buffer.Data[startLen:]
  784. raw, err := header.Append(raw, v)
  785. if err != nil {
  786. return nil, err
  787. }
  788. payloadOffset := protocol.ByteCount(len(raw))
  789. pn := p.pnManager.PopPacketNumber(encLevel)
  790. if pn != header.PacketNumber {
  791. return nil, errors.New("packetPacker BUG: Peeked and Popped packet numbers do not match")
  792. }
  793. raw, err = p.appendPacketPayload(raw, pl, paddingLen, v)
  794. if err != nil {
  795. return nil, err
  796. }
  797. raw = p.encryptPacket(raw, sealer, pn, payloadOffset, pnLen)
  798. buffer.Data = buffer.Data[:len(buffer.Data)+len(raw)]
  799. return &longHeaderPacket{
  800. header: header,
  801. ack: pl.ack,
  802. frames: pl.frames,
  803. length: protocol.ByteCount(len(raw)),
  804. }, nil
  805. }
  806. func (p *packetPacker) appendShortHeaderPacket(
  807. buffer *packetBuffer,
  808. connID protocol.ConnectionID,
  809. pn protocol.PacketNumber,
  810. pnLen protocol.PacketNumberLen,
  811. kp protocol.KeyPhaseBit,
  812. pl payload,
  813. padding protocol.ByteCount,
  814. sealer sealer,
  815. isMTUProbePacket bool,
  816. v protocol.VersionNumber,
  817. ) (*ackhandler.Packet, *wire.AckFrame, error) {
  818. var paddingLen protocol.ByteCount
  819. if pl.length < 4-protocol.ByteCount(pnLen) {
  820. paddingLen = 4 - protocol.ByteCount(pnLen) - pl.length
  821. }
  822. paddingLen += padding
  823. startLen := len(buffer.Data)
  824. raw := buffer.Data[startLen:]
  825. raw, err := wire.AppendShortHeader(raw, connID, pn, pnLen, kp)
  826. if err != nil {
  827. return nil, nil, err
  828. }
  829. payloadOffset := protocol.ByteCount(len(raw))
  830. if pn != p.pnManager.PopPacketNumber(protocol.Encryption1RTT) {
  831. return nil, nil, errors.New("packetPacker BUG: Peeked and Popped packet numbers do not match")
  832. }
  833. raw, err = p.appendPacketPayload(raw, pl, paddingLen, v)
  834. if err != nil {
  835. return nil, nil, err
  836. }
  837. if !isMTUProbePacket {
  838. if size := protocol.ByteCount(len(raw) + sealer.Overhead()); size > p.maxPacketSize {
  839. return nil, nil, fmt.Errorf("PacketPacker BUG: packet too large (%d bytes, allowed %d bytes)", size, p.maxPacketSize)
  840. }
  841. }
  842. raw = p.encryptPacket(raw, sealer, pn, payloadOffset, protocol.ByteCount(pnLen))
  843. buffer.Data = buffer.Data[:len(buffer.Data)+len(raw)]
  844. // create the ackhandler.Packet
  845. largestAcked := protocol.InvalidPacketNumber
  846. if pl.ack != nil {
  847. largestAcked = pl.ack.LargestAcked()
  848. }
  849. for i := range pl.frames {
  850. if pl.frames[i].OnLost != nil {
  851. continue
  852. }
  853. pl.frames[i].OnLost = p.retransmissionQueue.AddAppData
  854. }
  855. ap := ackhandler.GetPacket()
  856. ap.PacketNumber = pn
  857. ap.LargestAcked = largestAcked
  858. ap.Frames = pl.frames
  859. ap.Length = protocol.ByteCount(len(raw))
  860. ap.EncryptionLevel = protocol.Encryption1RTT
  861. ap.SendTime = time.Now()
  862. ap.IsPathMTUProbePacket = isMTUProbePacket
  863. return ap, pl.ack, nil
  864. }
  865. func (p *packetPacker) appendPacketPayload(raw []byte, pl payload, paddingLen protocol.ByteCount, v protocol.VersionNumber) ([]byte, error) {
  866. payloadOffset := len(raw)
  867. if pl.ack != nil {
  868. var err error
  869. raw, err = pl.ack.Append(raw, v)
  870. if err != nil {
  871. return nil, err
  872. }
  873. }
  874. if paddingLen > 0 {
  875. raw = append(raw, make([]byte, paddingLen)...)
  876. }
  877. for _, frame := range pl.frames {
  878. var err error
  879. raw, err = frame.Append(raw, v)
  880. if err != nil {
  881. return nil, err
  882. }
  883. }
  884. if payloadSize := protocol.ByteCount(len(raw)-payloadOffset) - paddingLen; payloadSize != pl.length {
  885. return nil, fmt.Errorf("PacketPacker BUG: payload size inconsistent (expected %d, got %d bytes)", pl.length, payloadSize)
  886. }
  887. return raw, nil
  888. }
  889. func (p *packetPacker) encryptPacket(raw []byte, sealer sealer, pn protocol.PacketNumber, payloadOffset, pnLen protocol.ByteCount) []byte {
  890. _ = sealer.Seal(raw[payloadOffset:payloadOffset], raw[payloadOffset:], pn, raw[:payloadOffset])
  891. raw = raw[:len(raw)+sealer.Overhead()]
  892. // apply header protection
  893. pnOffset := payloadOffset - pnLen
  894. sealer.EncryptHeader(raw[pnOffset+4:pnOffset+4+16], &raw[0], raw[pnOffset:payloadOffset])
  895. return raw
  896. }
  897. func (p *packetPacker) SetToken(token []byte) {
  898. p.token = token
  899. }
  900. // When a higher MTU is discovered, use it.
  901. func (p *packetPacker) SetMaxPacketSize(s protocol.ByteCount) {
  902. p.maxPacketSize = s
  903. }
  904. // If the peer sets a max_packet_size that's smaller than the size we're currently using,
  905. // we need to reduce the size of packets we send.
  906. func (p *packetPacker) HandleTransportParameters(params *wire.TransportParameters) {
  907. if params.MaxUDPPayloadSize != 0 {
  908. p.maxPacketSize = utils.Min(p.maxPacketSize, params.MaxUDPPayloadSize)
  909. }
  910. }