packet_packer.go 32 KB

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