packet_packer.go 32 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959
  1. package quic
  2. import (
  3. crand "crypto/rand"
  4. "encoding/binary"
  5. "errors"
  6. "fmt"
  7. "time"
  8. "golang.org/x/exp/rand"
  9. "github.com/Psiphon-Labs/quic-go/internal/ackhandler"
  10. "github.com/Psiphon-Labs/quic-go/internal/handshake"
  11. "github.com/Psiphon-Labs/quic-go/internal/protocol"
  12. "github.com/Psiphon-Labs/quic-go/internal/qerr"
  13. "github.com/Psiphon-Labs/quic-go/internal/wire"
  14. )
  15. var errNothingToPack = errors.New("nothing to pack")
  16. type packer interface {
  17. PackCoalescedPacket(onlyAck bool, maxPacketSize protocol.ByteCount, now time.Time, v protocol.Version) (*coalescedPacket, error)
  18. PackAckOnlyPacket(maxPacketSize protocol.ByteCount, now time.Time, v protocol.Version) (shortHeaderPacket, *packetBuffer, error)
  19. AppendPacket(buf *packetBuffer, maxPacketSize protocol.ByteCount, now time.Time, v protocol.Version) (shortHeaderPacket, error)
  20. MaybePackProbePacket(protocol.EncryptionLevel, protocol.ByteCount, time.Time, protocol.Version) (*coalescedPacket, error)
  21. PackConnectionClose(*qerr.TransportError, protocol.ByteCount, protocol.Version) (*coalescedPacket, error)
  22. PackApplicationClose(*qerr.ApplicationError, protocol.ByteCount, protocol.Version) (*coalescedPacket, error)
  23. PackMTUProbePacket(ping ackhandler.Frame, size protocol.ByteCount, v protocol.Version) (shortHeaderPacket, *packetBuffer, error)
  24. SetToken([]byte)
  25. }
  26. type sealer interface {
  27. handshake.LongHeaderSealer
  28. }
  29. type payload struct {
  30. streamFrames []ackhandler.StreamFrame
  31. frames []ackhandler.Frame
  32. ack *wire.AckFrame
  33. length protocol.ByteCount
  34. }
  35. type longHeaderPacket struct {
  36. header *wire.ExtendedHeader
  37. ack *wire.AckFrame
  38. frames []ackhandler.Frame
  39. streamFrames []ackhandler.StreamFrame // only used for 0-RTT packets
  40. length protocol.ByteCount
  41. }
  42. type shortHeaderPacket struct {
  43. PacketNumber protocol.PacketNumber
  44. Frames []ackhandler.Frame
  45. StreamFrames []ackhandler.StreamFrame
  46. Ack *wire.AckFrame
  47. Length protocol.ByteCount
  48. IsPathMTUProbePacket bool
  49. // used for logging
  50. DestConnID protocol.ConnectionID
  51. PacketNumberLen protocol.PacketNumberLen
  52. KeyPhase protocol.KeyPhaseBit
  53. }
  54. func (p *shortHeaderPacket) IsAckEliciting() bool { return ackhandler.HasAckElicitingFrames(p.Frames) }
  55. type coalescedPacket struct {
  56. buffer *packetBuffer
  57. longHdrPackets []*longHeaderPacket
  58. shortHdrPacket *shortHeaderPacket
  59. }
  60. // IsOnlyShortHeaderPacket says if this packet only contains a short header packet (and no long header packets).
  61. func (p *coalescedPacket) IsOnlyShortHeaderPacket() bool {
  62. return len(p.longHdrPackets) == 0 && p.shortHdrPacket != nil
  63. }
  64. func (p *longHeaderPacket) EncryptionLevel() protocol.EncryptionLevel {
  65. //nolint:exhaustive // Will never be called for Retry packets (and they don't have encrypted data).
  66. switch p.header.Type {
  67. case protocol.PacketTypeInitial:
  68. return protocol.EncryptionInitial
  69. case protocol.PacketTypeHandshake:
  70. return protocol.EncryptionHandshake
  71. case protocol.PacketType0RTT:
  72. return protocol.Encryption0RTT
  73. default:
  74. panic("can't determine encryption level")
  75. }
  76. }
  77. func (p *longHeaderPacket) IsAckEliciting() bool { return ackhandler.HasAckElicitingFrames(p.frames) }
  78. type packetNumberManager interface {
  79. PeekPacketNumber(protocol.EncryptionLevel) (protocol.PacketNumber, protocol.PacketNumberLen)
  80. PopPacketNumber(protocol.EncryptionLevel) protocol.PacketNumber
  81. }
  82. type sealingManager interface {
  83. GetInitialSealer() (handshake.LongHeaderSealer, error)
  84. GetHandshakeSealer() (handshake.LongHeaderSealer, error)
  85. Get0RTTSealer() (handshake.LongHeaderSealer, error)
  86. Get1RTTSealer() (handshake.ShortHeaderSealer, error)
  87. }
  88. type frameSource interface {
  89. HasData() bool
  90. Append([]ackhandler.Frame, []ackhandler.StreamFrame, protocol.ByteCount, time.Time, protocol.Version) ([]ackhandler.Frame, []ackhandler.StreamFrame, protocol.ByteCount)
  91. }
  92. type ackFrameSource interface {
  93. GetAckFrame(_ protocol.EncryptionLevel, now time.Time, 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.Version) (*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.Version) (*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.Version,
  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.Version) 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, maxSize protocol.ByteCount, now time.Time, v protocol.Version) (*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(
  308. maxSize-protocol.ByteCount(initialSealer.Overhead()),
  309. protocol.EncryptionInitial,
  310. now,
  311. onlyAck,
  312. true,
  313. v,
  314. )
  315. if initialPayload.length > 0 {
  316. size += p.longHeaderPacketLength(initialHdr, initialPayload, v) + protocol.ByteCount(initialSealer.Overhead())
  317. }
  318. }
  319. // Add a Handshake packet.
  320. var handshakeSealer sealer
  321. if (onlyAck && size == 0) || (!onlyAck && size < maxSize-protocol.MinCoalescedPacketSize) {
  322. var err error
  323. handshakeSealer, err = p.cryptoSetup.GetHandshakeSealer()
  324. if err != nil && err != handshake.ErrKeysDropped && err != handshake.ErrKeysNotYetAvailable {
  325. return nil, err
  326. }
  327. if handshakeSealer != nil {
  328. handshakeHdr, handshakePayload = p.maybeGetCryptoPacket(
  329. maxSize-size-protocol.ByteCount(handshakeSealer.Overhead()),
  330. protocol.EncryptionHandshake,
  331. now,
  332. onlyAck,
  333. size == 0,
  334. v,
  335. )
  336. if handshakePayload.length > 0 {
  337. s := p.longHeaderPacketLength(handshakeHdr, handshakePayload, v) + protocol.ByteCount(handshakeSealer.Overhead())
  338. size += s
  339. }
  340. }
  341. }
  342. // Add a 0-RTT / 1-RTT packet.
  343. var zeroRTTSealer sealer
  344. var oneRTTSealer handshake.ShortHeaderSealer
  345. var connID protocol.ConnectionID
  346. var kp protocol.KeyPhaseBit
  347. if (onlyAck && size == 0) || (!onlyAck && size < maxSize-protocol.MinCoalescedPacketSize) {
  348. var err error
  349. oneRTTSealer, err = p.cryptoSetup.Get1RTTSealer()
  350. if err != nil && err != handshake.ErrKeysDropped && err != handshake.ErrKeysNotYetAvailable {
  351. return nil, err
  352. }
  353. if err == nil { // 1-RTT
  354. kp = oneRTTSealer.KeyPhase()
  355. connID = p.getDestConnID()
  356. oneRTTPacketNumber, oneRTTPacketNumberLen = p.pnManager.PeekPacketNumber(protocol.Encryption1RTT)
  357. hdrLen := wire.ShortHeaderLen(connID, oneRTTPacketNumberLen)
  358. oneRTTPayload = p.maybeGetShortHeaderPacket(oneRTTSealer, hdrLen, maxSize-size, onlyAck, size == 0, now, v)
  359. if oneRTTPayload.length > 0 {
  360. size += p.shortHeaderPacketLength(connID, oneRTTPacketNumberLen, oneRTTPayload) + protocol.ByteCount(oneRTTSealer.Overhead())
  361. }
  362. } else if p.perspective == protocol.PerspectiveClient && !onlyAck { // 0-RTT packets can't contain ACK frames
  363. var err error
  364. zeroRTTSealer, err = p.cryptoSetup.Get0RTTSealer()
  365. if err != nil && err != handshake.ErrKeysDropped && err != handshake.ErrKeysNotYetAvailable {
  366. return nil, err
  367. }
  368. if zeroRTTSealer != nil {
  369. zeroRTTHdr, zeroRTTPayload = p.maybeGetAppDataPacketFor0RTT(zeroRTTSealer, maxSize-size, now, v)
  370. if zeroRTTPayload.length > 0 {
  371. size += p.longHeaderPacketLength(zeroRTTHdr, zeroRTTPayload, v) + protocol.ByteCount(zeroRTTSealer.Overhead())
  372. }
  373. }
  374. }
  375. }
  376. if initialPayload.length == 0 && handshakePayload.length == 0 && zeroRTTPayload.length == 0 && oneRTTPayload.length == 0 {
  377. return nil, nil
  378. }
  379. buffer := getPacketBuffer()
  380. packet := &coalescedPacket{
  381. buffer: buffer,
  382. longHdrPackets: make([]*longHeaderPacket, 0, 3),
  383. }
  384. if initialPayload.length > 0 {
  385. padding := p.initialPaddingLen(initialPayload.frames, size, maxSize)
  386. cont, err := p.appendLongHeaderPacket(buffer, initialHdr, initialPayload, padding, protocol.EncryptionInitial, initialSealer, v)
  387. if err != nil {
  388. return nil, err
  389. }
  390. packet.longHdrPackets = append(packet.longHdrPackets, cont)
  391. }
  392. if handshakePayload.length > 0 {
  393. cont, err := p.appendLongHeaderPacket(buffer, handshakeHdr, handshakePayload, 0, protocol.EncryptionHandshake, handshakeSealer, v)
  394. if err != nil {
  395. return nil, err
  396. }
  397. packet.longHdrPackets = append(packet.longHdrPackets, cont)
  398. }
  399. if zeroRTTPayload.length > 0 {
  400. longHdrPacket, err := p.appendLongHeaderPacket(buffer, zeroRTTHdr, zeroRTTPayload, 0, protocol.Encryption0RTT, zeroRTTSealer, v)
  401. if err != nil {
  402. return nil, err
  403. }
  404. packet.longHdrPackets = append(packet.longHdrPackets, longHdrPacket)
  405. } else if oneRTTPayload.length > 0 {
  406. shp, err := p.appendShortHeaderPacket(buffer, connID, oneRTTPacketNumber, oneRTTPacketNumberLen, kp, oneRTTPayload, 0, maxSize, oneRTTSealer, false, v)
  407. if err != nil {
  408. return nil, err
  409. }
  410. packet.shortHdrPacket = &shp
  411. }
  412. return packet, nil
  413. }
  414. // PackAckOnlyPacket packs a packet containing only an ACK in the application data packet number space.
  415. // It should be called after the handshake is confirmed.
  416. func (p *packetPacker) PackAckOnlyPacket(maxSize protocol.ByteCount, now time.Time, v protocol.Version) (shortHeaderPacket, *packetBuffer, error) {
  417. buf := getPacketBuffer()
  418. packet, err := p.appendPacket(buf, true, maxSize, now, v)
  419. return packet, buf, err
  420. }
  421. // AppendPacket packs a packet in the application data packet number space.
  422. // It should be called after the handshake is confirmed.
  423. func (p *packetPacker) AppendPacket(buf *packetBuffer, maxSize protocol.ByteCount, now time.Time, v protocol.Version) (shortHeaderPacket, error) {
  424. return p.appendPacket(buf, false, maxSize, now, v)
  425. }
  426. func (p *packetPacker) appendPacket(
  427. buf *packetBuffer,
  428. onlyAck bool,
  429. maxPacketSize protocol.ByteCount,
  430. now time.Time,
  431. v protocol.Version,
  432. ) (shortHeaderPacket, error) {
  433. sealer, err := p.cryptoSetup.Get1RTTSealer()
  434. if err != nil {
  435. return shortHeaderPacket{}, err
  436. }
  437. pn, pnLen := p.pnManager.PeekPacketNumber(protocol.Encryption1RTT)
  438. connID := p.getDestConnID()
  439. hdrLen := wire.ShortHeaderLen(connID, pnLen)
  440. pl := p.maybeGetShortHeaderPacket(sealer, hdrLen, maxPacketSize, onlyAck, true, now, v)
  441. if pl.length == 0 {
  442. return shortHeaderPacket{}, errNothingToPack
  443. }
  444. kp := sealer.KeyPhase()
  445. return p.appendShortHeaderPacket(buf, connID, pn, pnLen, kp, pl, 0, maxPacketSize, sealer, false, v)
  446. }
  447. func (p *packetPacker) maybeGetCryptoPacket(
  448. maxPacketSize protocol.ByteCount,
  449. encLevel protocol.EncryptionLevel,
  450. now time.Time,
  451. onlyAck, ackAllowed bool,
  452. v protocol.Version,
  453. ) (*wire.ExtendedHeader, payload) {
  454. if onlyAck {
  455. if ack := p.acks.GetAckFrame(encLevel, now, true); ack != nil {
  456. return p.getLongHeader(encLevel, v), payload{
  457. ack: ack,
  458. length: ack.Length(v),
  459. }
  460. }
  461. return nil, payload{}
  462. }
  463. var s *cryptoStream
  464. var handler ackhandler.FrameHandler
  465. var hasRetransmission bool
  466. //nolint:exhaustive // Initial and Handshake are the only two encryption levels here.
  467. switch encLevel {
  468. case protocol.EncryptionInitial:
  469. s = p.initialStream
  470. handler = p.retransmissionQueue.InitialAckHandler()
  471. hasRetransmission = p.retransmissionQueue.HasInitialData()
  472. case protocol.EncryptionHandshake:
  473. s = p.handshakeStream
  474. handler = p.retransmissionQueue.HandshakeAckHandler()
  475. hasRetransmission = p.retransmissionQueue.HasHandshakeData()
  476. }
  477. hasData := s.HasData()
  478. var ack *wire.AckFrame
  479. if ackAllowed {
  480. ack = p.acks.GetAckFrame(encLevel, now, !hasRetransmission && !hasData)
  481. }
  482. if !hasData && !hasRetransmission && ack == nil {
  483. // nothing to send
  484. return nil, payload{}
  485. }
  486. var pl payload
  487. if ack != nil {
  488. pl.ack = ack
  489. pl.length = ack.Length(v)
  490. maxPacketSize -= pl.length
  491. }
  492. hdr := p.getLongHeader(encLevel, v)
  493. maxPacketSize -= hdr.GetLength(v)
  494. if hasRetransmission {
  495. for {
  496. var f ackhandler.Frame
  497. //nolint:exhaustive // 0-RTT packets can't contain any retransmissions
  498. switch encLevel {
  499. case protocol.EncryptionInitial:
  500. f.Frame = p.retransmissionQueue.GetInitialFrame(maxPacketSize, v)
  501. f.Handler = p.retransmissionQueue.InitialAckHandler()
  502. case protocol.EncryptionHandshake:
  503. f.Frame = p.retransmissionQueue.GetHandshakeFrame(maxPacketSize, v)
  504. f.Handler = p.retransmissionQueue.HandshakeAckHandler()
  505. }
  506. if f.Frame == nil {
  507. break
  508. }
  509. pl.frames = append(pl.frames, f)
  510. frameLen := f.Frame.Length(v)
  511. pl.length += frameLen
  512. maxPacketSize -= frameLen
  513. }
  514. } else if s.HasData() {
  515. cf := s.PopCryptoFrame(maxPacketSize)
  516. pl.frames = []ackhandler.Frame{{Frame: cf, Handler: handler}}
  517. pl.length += cf.Length(v)
  518. }
  519. return hdr, pl
  520. }
  521. func (p *packetPacker) maybeGetAppDataPacketFor0RTT(
  522. sealer sealer,
  523. maxPacketSize protocol.ByteCount,
  524. now time.Time,
  525. v protocol.Version,
  526. ) (*wire.ExtendedHeader, payload) {
  527. if p.perspective != protocol.PerspectiveClient {
  528. return nil, payload{}
  529. }
  530. hdr := p.getLongHeader(protocol.Encryption0RTT, v)
  531. maxPayloadSize := maxPacketSize - hdr.GetLength(v) - protocol.ByteCount(sealer.Overhead())
  532. return hdr, p.maybeGetAppDataPacket(maxPayloadSize, false, false, now, v)
  533. }
  534. func (p *packetPacker) maybeGetShortHeaderPacket(
  535. sealer handshake.ShortHeaderSealer,
  536. hdrLen, maxPacketSize protocol.ByteCount,
  537. onlyAck, ackAllowed bool,
  538. now time.Time,
  539. v protocol.Version,
  540. ) payload {
  541. maxPayloadSize := maxPacketSize - hdrLen - protocol.ByteCount(sealer.Overhead())
  542. return p.maybeGetAppDataPacket(maxPayloadSize, onlyAck, ackAllowed, now, v)
  543. }
  544. func (p *packetPacker) maybeGetAppDataPacket(
  545. maxPayloadSize protocol.ByteCount,
  546. onlyAck, ackAllowed bool,
  547. now time.Time,
  548. v protocol.Version,
  549. ) payload {
  550. pl := p.composeNextPacket(maxPayloadSize, onlyAck, ackAllowed, now, v)
  551. // check if we have anything to send
  552. if len(pl.frames) == 0 && len(pl.streamFrames) == 0 {
  553. if pl.ack == nil {
  554. return payload{}
  555. }
  556. // the packet only contains an ACK
  557. if p.numNonAckElicitingAcks >= protocol.MaxNonAckElicitingAcks {
  558. ping := &wire.PingFrame{}
  559. pl.frames = append(pl.frames, ackhandler.Frame{Frame: ping})
  560. pl.length += ping.Length(v)
  561. p.numNonAckElicitingAcks = 0
  562. } else {
  563. p.numNonAckElicitingAcks++
  564. }
  565. } else {
  566. p.numNonAckElicitingAcks = 0
  567. }
  568. return pl
  569. }
  570. func (p *packetPacker) composeNextPacket(
  571. maxFrameSize protocol.ByteCount,
  572. onlyAck, ackAllowed bool,
  573. now time.Time,
  574. v protocol.Version,
  575. ) payload {
  576. if onlyAck {
  577. if ack := p.acks.GetAckFrame(protocol.Encryption1RTT, now, true); ack != nil {
  578. return payload{ack: ack, length: ack.Length(v)}
  579. }
  580. return payload{}
  581. }
  582. hasData := p.framer.HasData()
  583. hasRetransmission := p.retransmissionQueue.HasAppData()
  584. var hasAck bool
  585. var pl payload
  586. if ackAllowed {
  587. if ack := p.acks.GetAckFrame(protocol.Encryption1RTT, now, !hasRetransmission && !hasData); ack != nil {
  588. pl.ack = ack
  589. pl.length += ack.Length(v)
  590. hasAck = true
  591. }
  592. }
  593. if p.datagramQueue != nil {
  594. if f := p.datagramQueue.Peek(); f != nil {
  595. size := f.Length(v)
  596. if size <= maxFrameSize-pl.length { // DATAGRAM frame fits
  597. pl.frames = append(pl.frames, ackhandler.Frame{Frame: f})
  598. pl.length += size
  599. p.datagramQueue.Pop()
  600. } else if !hasAck {
  601. // The DATAGRAM frame doesn't fit, and the packet doesn't contain an ACK.
  602. // Discard this frame. There's no point in retrying this in the next packet,
  603. // as it's unlikely that the available packet size will increase.
  604. p.datagramQueue.Pop()
  605. }
  606. // If the DATAGRAM frame was too large and the packet contained an ACK, we'll try to send it out later.
  607. }
  608. }
  609. if hasAck && !hasData && !hasRetransmission {
  610. return pl
  611. }
  612. if hasRetransmission {
  613. for {
  614. remainingLen := maxFrameSize - pl.length
  615. if remainingLen < protocol.MinStreamFrameSize {
  616. break
  617. }
  618. f := p.retransmissionQueue.GetAppDataFrame(remainingLen, v)
  619. if f == nil {
  620. break
  621. }
  622. pl.frames = append(pl.frames, ackhandler.Frame{Frame: f, Handler: p.retransmissionQueue.AppDataAckHandler()})
  623. pl.length += f.Length(v)
  624. }
  625. }
  626. if hasData {
  627. var lengthAdded protocol.ByteCount
  628. startLen := len(pl.frames)
  629. pl.frames, pl.streamFrames, lengthAdded = p.framer.Append(pl.frames, pl.streamFrames, maxFrameSize-pl.length, now, v)
  630. pl.length += lengthAdded
  631. // add handlers for the control frames that were added
  632. for i := startLen; i < len(pl.frames); i++ {
  633. if pl.frames[i].Handler != nil {
  634. continue
  635. }
  636. switch pl.frames[i].Frame.(type) {
  637. case *wire.PathChallengeFrame, *wire.PathResponseFrame:
  638. // Path probing is currently not supported, therefore we don't need to set the OnAcked callback yet.
  639. // PATH_CHALLENGE and PATH_RESPONSE are never retransmitted.
  640. default:
  641. pl.frames[i].Handler = p.retransmissionQueue.AppDataAckHandler()
  642. }
  643. }
  644. }
  645. return pl
  646. }
  647. func (p *packetPacker) MaybePackProbePacket(
  648. encLevel protocol.EncryptionLevel,
  649. maxPacketSize protocol.ByteCount,
  650. now time.Time,
  651. v protocol.Version,
  652. ) (*coalescedPacket, error) {
  653. if encLevel == protocol.Encryption1RTT {
  654. s, err := p.cryptoSetup.Get1RTTSealer()
  655. if err != nil {
  656. return nil, err
  657. }
  658. kp := s.KeyPhase()
  659. connID := p.getDestConnID()
  660. pn, pnLen := p.pnManager.PeekPacketNumber(protocol.Encryption1RTT)
  661. hdrLen := wire.ShortHeaderLen(connID, pnLen)
  662. pl := p.maybeGetAppDataPacket(maxPacketSize-protocol.ByteCount(s.Overhead())-hdrLen, false, true, now, v)
  663. if pl.length == 0 {
  664. return nil, nil
  665. }
  666. buffer := getPacketBuffer()
  667. packet := &coalescedPacket{buffer: buffer}
  668. shp, err := p.appendShortHeaderPacket(buffer, connID, pn, pnLen, kp, pl, 0, maxPacketSize, s, false, v)
  669. if err != nil {
  670. return nil, err
  671. }
  672. packet.shortHdrPacket = &shp
  673. return packet, nil
  674. }
  675. var sealer handshake.LongHeaderSealer
  676. //nolint:exhaustive // Probe packets are never sent for 0-RTT.
  677. switch encLevel {
  678. case protocol.EncryptionInitial:
  679. var err error
  680. sealer, err = p.cryptoSetup.GetInitialSealer()
  681. if err != nil {
  682. return nil, err
  683. }
  684. case protocol.EncryptionHandshake:
  685. var err error
  686. sealer, err = p.cryptoSetup.GetHandshakeSealer()
  687. if err != nil {
  688. return nil, err
  689. }
  690. default:
  691. panic("unknown encryption level")
  692. }
  693. hdr, pl := p.maybeGetCryptoPacket(maxPacketSize-protocol.ByteCount(sealer.Overhead()), encLevel, now, false, true, v)
  694. if pl.length == 0 {
  695. return nil, nil
  696. }
  697. buffer := getPacketBuffer()
  698. packet := &coalescedPacket{buffer: buffer}
  699. size := p.longHeaderPacketLength(hdr, pl, v) + protocol.ByteCount(sealer.Overhead())
  700. var padding protocol.ByteCount
  701. if encLevel == protocol.EncryptionInitial {
  702. padding = p.initialPaddingLen(pl.frames, size, maxPacketSize)
  703. }
  704. longHdrPacket, err := p.appendLongHeaderPacket(buffer, hdr, pl, padding, encLevel, sealer, v)
  705. if err != nil {
  706. return nil, err
  707. }
  708. packet.longHdrPackets = []*longHeaderPacket{longHdrPacket}
  709. return packet, nil
  710. }
  711. func (p *packetPacker) PackMTUProbePacket(ping ackhandler.Frame, size protocol.ByteCount, v protocol.Version) (shortHeaderPacket, *packetBuffer, error) {
  712. pl := payload{
  713. frames: []ackhandler.Frame{ping},
  714. length: ping.Frame.Length(v),
  715. }
  716. buffer := getPacketBuffer()
  717. s, err := p.cryptoSetup.Get1RTTSealer()
  718. if err != nil {
  719. return shortHeaderPacket{}, nil, err
  720. }
  721. connID := p.getDestConnID()
  722. pn, pnLen := p.pnManager.PeekPacketNumber(protocol.Encryption1RTT)
  723. padding := size - p.shortHeaderPacketLength(connID, pnLen, pl) - protocol.ByteCount(s.Overhead())
  724. kp := s.KeyPhase()
  725. packet, err := p.appendShortHeaderPacket(buffer, connID, pn, pnLen, kp, pl, padding, size, s, true, v)
  726. return packet, buffer, err
  727. }
  728. func (p *packetPacker) getLongHeader(encLevel protocol.EncryptionLevel, v protocol.Version) *wire.ExtendedHeader {
  729. pn, pnLen := p.pnManager.PeekPacketNumber(encLevel)
  730. hdr := &wire.ExtendedHeader{
  731. PacketNumber: pn,
  732. PacketNumberLen: pnLen,
  733. }
  734. hdr.Version = v
  735. hdr.SrcConnectionID = p.srcConnID
  736. hdr.DestConnectionID = p.getDestConnID()
  737. //nolint:exhaustive // 1-RTT packets are not long header packets.
  738. switch encLevel {
  739. case protocol.EncryptionInitial:
  740. hdr.Type = protocol.PacketTypeInitial
  741. hdr.Token = p.token
  742. case protocol.EncryptionHandshake:
  743. hdr.Type = protocol.PacketTypeHandshake
  744. case protocol.Encryption0RTT:
  745. hdr.Type = protocol.PacketType0RTT
  746. }
  747. return hdr
  748. }
  749. func (p *packetPacker) appendLongHeaderPacket(buffer *packetBuffer, header *wire.ExtendedHeader, pl payload, padding protocol.ByteCount, encLevel protocol.EncryptionLevel, sealer sealer, v protocol.Version) (*longHeaderPacket, error) {
  750. var paddingLen protocol.ByteCount
  751. pnLen := protocol.ByteCount(header.PacketNumberLen)
  752. if pl.length < 4-pnLen {
  753. paddingLen = 4 - pnLen - pl.length
  754. }
  755. paddingLen += padding
  756. header.Length = pnLen + protocol.ByteCount(sealer.Overhead()) + pl.length + paddingLen
  757. startLen := len(buffer.Data)
  758. raw := buffer.Data[startLen:]
  759. raw, err := header.Append(raw, v)
  760. if err != nil {
  761. return nil, err
  762. }
  763. payloadOffset := protocol.ByteCount(len(raw))
  764. raw, err = p.appendPacketPayload(raw, pl, paddingLen, v)
  765. if err != nil {
  766. return nil, err
  767. }
  768. raw = p.encryptPacket(raw, sealer, header.PacketNumber, payloadOffset, pnLen)
  769. buffer.Data = buffer.Data[:len(buffer.Data)+len(raw)]
  770. if pn := p.pnManager.PopPacketNumber(encLevel); pn != header.PacketNumber {
  771. return nil, fmt.Errorf("packetPacker BUG: Peeked and Popped packet numbers do not match: expected %d, got %d", pn, header.PacketNumber)
  772. }
  773. return &longHeaderPacket{
  774. header: header,
  775. ack: pl.ack,
  776. frames: pl.frames,
  777. streamFrames: pl.streamFrames,
  778. length: protocol.ByteCount(len(raw)),
  779. }, nil
  780. }
  781. func (p *packetPacker) appendShortHeaderPacket(
  782. buffer *packetBuffer,
  783. connID protocol.ConnectionID,
  784. pn protocol.PacketNumber,
  785. pnLen protocol.PacketNumberLen,
  786. kp protocol.KeyPhaseBit,
  787. pl payload,
  788. padding, maxPacketSize protocol.ByteCount,
  789. sealer sealer,
  790. isMTUProbePacket bool,
  791. v protocol.Version,
  792. ) (shortHeaderPacket, error) {
  793. var paddingLen protocol.ByteCount
  794. if pl.length < 4-protocol.ByteCount(pnLen) {
  795. paddingLen = 4 - protocol.ByteCount(pnLen) - pl.length
  796. }
  797. paddingLen += padding
  798. startLen := len(buffer.Data)
  799. raw := buffer.Data[startLen:]
  800. raw, err := wire.AppendShortHeader(raw, connID, pn, pnLen, kp)
  801. if err != nil {
  802. return shortHeaderPacket{}, err
  803. }
  804. payloadOffset := protocol.ByteCount(len(raw))
  805. raw, err = p.appendPacketPayload(raw, pl, paddingLen, v)
  806. if err != nil {
  807. return shortHeaderPacket{}, err
  808. }
  809. if !isMTUProbePacket {
  810. if size := protocol.ByteCount(len(raw) + sealer.Overhead()); size > maxPacketSize {
  811. return shortHeaderPacket{}, fmt.Errorf("PacketPacker BUG: packet too large (%d bytes, allowed %d bytes)", size, maxPacketSize)
  812. }
  813. }
  814. raw = p.encryptPacket(raw, sealer, pn, payloadOffset, protocol.ByteCount(pnLen))
  815. buffer.Data = buffer.Data[:len(buffer.Data)+len(raw)]
  816. if newPN := p.pnManager.PopPacketNumber(protocol.Encryption1RTT); newPN != pn {
  817. return shortHeaderPacket{}, fmt.Errorf("packetPacker BUG: Peeked and Popped packet numbers do not match: expected %d, got %d", pn, newPN)
  818. }
  819. return shortHeaderPacket{
  820. PacketNumber: pn,
  821. PacketNumberLen: pnLen,
  822. KeyPhase: kp,
  823. StreamFrames: pl.streamFrames,
  824. Frames: pl.frames,
  825. Ack: pl.ack,
  826. Length: protocol.ByteCount(len(raw)),
  827. DestConnID: connID,
  828. IsPathMTUProbePacket: isMTUProbePacket,
  829. }, nil
  830. }
  831. // appendPacketPayload serializes the payload of a packet into the raw byte slice.
  832. // It modifies the order of payload.frames.
  833. func (p *packetPacker) appendPacketPayload(raw []byte, pl payload, paddingLen protocol.ByteCount, v protocol.Version) ([]byte, error) {
  834. payloadOffset := len(raw)
  835. if pl.ack != nil {
  836. var err error
  837. raw, err = pl.ack.Append(raw, v)
  838. if err != nil {
  839. return nil, err
  840. }
  841. }
  842. if paddingLen > 0 {
  843. raw = append(raw, make([]byte, paddingLen)...)
  844. }
  845. // Randomize the order of the control frames.
  846. // This makes sure that the receiver doesn't rely on the order in which frames are packed.
  847. if len(pl.frames) > 1 {
  848. p.rand.Shuffle(len(pl.frames), func(i, j int) { pl.frames[i], pl.frames[j] = pl.frames[j], pl.frames[i] })
  849. }
  850. for _, f := range pl.frames {
  851. var err error
  852. raw, err = f.Frame.Append(raw, v)
  853. if err != nil {
  854. return nil, err
  855. }
  856. }
  857. for _, f := range pl.streamFrames {
  858. var err error
  859. raw, err = f.Frame.Append(raw, v)
  860. if err != nil {
  861. return nil, err
  862. }
  863. }
  864. if payloadSize := protocol.ByteCount(len(raw)-payloadOffset) - paddingLen; payloadSize != pl.length {
  865. return nil, fmt.Errorf("PacketPacker BUG: payload size inconsistent (expected %d, got %d bytes)", pl.length, payloadSize)
  866. }
  867. return raw, nil
  868. }
  869. func (p *packetPacker) encryptPacket(raw []byte, sealer sealer, pn protocol.PacketNumber, payloadOffset, pnLen protocol.ByteCount) []byte {
  870. _ = sealer.Seal(raw[payloadOffset:payloadOffset], raw[payloadOffset:], pn, raw[:payloadOffset])
  871. raw = raw[:len(raw)+sealer.Overhead()]
  872. // apply header protection
  873. pnOffset := payloadOffset - pnLen
  874. sealer.EncryptHeader(raw[pnOffset+4:pnOffset+4+16], &raw[0], raw[pnOffset:payloadOffset])
  875. return raw
  876. }
  877. func (p *packetPacker) SetToken(token []byte) {
  878. p.token = token
  879. }