packet_packer_legacy.go 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468
  1. package gquic
  2. import (
  3. "bytes"
  4. "errors"
  5. "fmt"
  6. "net"
  7. "github.com/Psiphon-Labs/psiphon-tunnel-core/psiphon/common/quic/gquic-go/internal/ackhandler"
  8. "github.com/Psiphon-Labs/psiphon-tunnel-core/psiphon/common/quic/gquic-go/internal/handshake"
  9. "github.com/Psiphon-Labs/psiphon-tunnel-core/psiphon/common/quic/gquic-go/internal/protocol"
  10. "github.com/Psiphon-Labs/psiphon-tunnel-core/psiphon/common/quic/gquic-go/internal/wire"
  11. )
  12. // sentAndReceivedPacketManager is only needed until STOP_WAITING is removed
  13. type sentAndReceivedPacketManager struct {
  14. ackhandler.SentPacketHandler
  15. ackhandler.ReceivedPacketHandler
  16. }
  17. var _ ackFrameSource = &sentAndReceivedPacketManager{}
  18. type packetPackerLegacy struct {
  19. destConnID protocol.ConnectionID
  20. srcConnID protocol.ConnectionID
  21. perspective protocol.Perspective
  22. version protocol.VersionNumber
  23. cryptoSetup sealingManager
  24. divNonce []byte
  25. packetNumberGenerator *packetNumberGenerator
  26. getPacketNumberLen func(protocol.PacketNumber) protocol.PacketNumberLen
  27. cryptoStream cryptoStream
  28. framer frameSource
  29. acks ackFrameSource
  30. omitConnectionID bool
  31. maxPacketSize protocol.ByteCount
  32. hasSentPacket bool // has the packetPacker already sent a packet
  33. numNonRetransmittableAcks int
  34. }
  35. var _ packer = &packetPackerLegacy{}
  36. func newPacketPackerLegacy(
  37. destConnID protocol.ConnectionID,
  38. srcConnID protocol.ConnectionID,
  39. getPacketNumberLen func(protocol.PacketNumber) protocol.PacketNumberLen,
  40. remoteAddr net.Addr, // only used for determining the max packet size
  41. divNonce []byte,
  42. cryptoStream cryptoStream,
  43. cryptoSetup sealingManager,
  44. framer frameSource,
  45. acks ackFrameSource,
  46. perspective protocol.Perspective,
  47. version protocol.VersionNumber,
  48. ) *packetPackerLegacy {
  49. return &packetPackerLegacy{
  50. cryptoStream: cryptoStream,
  51. cryptoSetup: cryptoSetup,
  52. divNonce: divNonce,
  53. destConnID: destConnID,
  54. srcConnID: srcConnID,
  55. perspective: perspective,
  56. version: version,
  57. framer: framer,
  58. acks: acks,
  59. getPacketNumberLen: getPacketNumberLen,
  60. packetNumberGenerator: newPacketNumberGenerator(1, protocol.SkipPacketAveragePeriodLength),
  61. maxPacketSize: getMaxPacketSize(remoteAddr),
  62. }
  63. }
  64. // PackConnectionClose packs a packet that ONLY contains a ConnectionCloseFrame
  65. func (p *packetPackerLegacy) PackConnectionClose(ccf *wire.ConnectionCloseFrame) (*packedPacket, error) {
  66. frames := []wire.Frame{ccf}
  67. encLevel, sealer := p.cryptoSetup.GetSealer()
  68. header := p.getHeader(encLevel)
  69. raw, err := p.writeAndSealPacket(header, frames, sealer)
  70. return &packedPacket{
  71. header: header,
  72. raw: raw,
  73. frames: frames,
  74. encryptionLevel: encLevel,
  75. }, err
  76. }
  77. func (p *packetPackerLegacy) MaybePackAckPacket() (*packedPacket, error) {
  78. ack := p.acks.GetAckFrame()
  79. if ack == nil {
  80. return nil, nil
  81. }
  82. encLevel, sealer := p.cryptoSetup.GetSealer()
  83. header := p.getHeader(encLevel)
  84. frames := []wire.Frame{ack}
  85. // add a STOP_WAITING frame, if necessary
  86. if p.version.UsesStopWaitingFrames() {
  87. if swf := p.acks.GetStopWaitingFrame(false); swf != nil {
  88. swf.PacketNumber = header.PacketNumber
  89. swf.PacketNumberLen = header.PacketNumberLen
  90. frames = append(frames, swf)
  91. }
  92. }
  93. raw, err := p.writeAndSealPacket(header, frames, sealer)
  94. return &packedPacket{
  95. header: header,
  96. raw: raw,
  97. frames: frames,
  98. encryptionLevel: encLevel,
  99. }, err
  100. }
  101. // PackRetransmission packs a retransmission
  102. // For packets sent after completion of the handshake, it might happen that 2 packets have to be sent.
  103. // This can happen e.g. when a longer packet number is used in the header.
  104. func (p *packetPackerLegacy) PackRetransmission(packet *ackhandler.Packet) ([]*packedPacket, error) {
  105. if packet.EncryptionLevel != protocol.EncryptionForwardSecure {
  106. p, err := p.packHandshakeRetransmission(packet)
  107. return []*packedPacket{p}, err
  108. }
  109. var controlFrames []wire.Frame
  110. var streamFrames []*wire.StreamFrame
  111. for _, f := range packet.Frames {
  112. if sf, ok := f.(*wire.StreamFrame); ok {
  113. sf.DataLenPresent = true
  114. streamFrames = append(streamFrames, sf)
  115. } else {
  116. controlFrames = append(controlFrames, f)
  117. }
  118. }
  119. var packets []*packedPacket
  120. encLevel, sealer := p.cryptoSetup.GetSealer()
  121. var swf *wire.StopWaitingFrame
  122. // add a STOP_WAITING for *every* retransmission
  123. if p.version.UsesStopWaitingFrames() {
  124. swf = p.acks.GetStopWaitingFrame(true)
  125. }
  126. for len(controlFrames) > 0 || len(streamFrames) > 0 {
  127. var frames []wire.Frame
  128. var length protocol.ByteCount
  129. header := p.getHeader(encLevel)
  130. headerLength, err := header.GetLength(p.version)
  131. if err != nil {
  132. return nil, err
  133. }
  134. maxSize := p.maxPacketSize - protocol.ByteCount(sealer.Overhead()) - headerLength
  135. if p.version.UsesStopWaitingFrames() {
  136. // create a new STOP_WAIITNG Frame, since we might need to send more than one packet as a retransmission
  137. stopWaitingFrame := &wire.StopWaitingFrame{
  138. LeastUnacked: swf.LeastUnacked,
  139. PacketNumber: header.PacketNumber,
  140. PacketNumberLen: header.PacketNumberLen,
  141. }
  142. length += stopWaitingFrame.Length(p.version)
  143. frames = append(frames, stopWaitingFrame)
  144. }
  145. for len(controlFrames) > 0 {
  146. frame := controlFrames[0]
  147. frameLen := frame.Length(p.version)
  148. if length+frameLen > maxSize {
  149. break
  150. }
  151. length += frameLen
  152. frames = append(frames, frame)
  153. controlFrames = controlFrames[1:]
  154. }
  155. // temporarily increase the maxFrameSize by the (minimum) length of the DataLen field
  156. // this leads to a properly sized packet in all cases, since we do all the packet length calculations with StreamFrames that have the DataLen set
  157. // however, for the last STREAM frame in the packet, we can omit the DataLen, thus yielding a packet of exactly the correct size
  158. maxSize += 2
  159. for len(streamFrames) > 0 && length+protocol.MinStreamFrameSize < maxSize {
  160. frame := streamFrames[0]
  161. frameToAdd := frame
  162. sf, err := frame.MaybeSplitOffFrame(maxSize-length, p.version)
  163. if err != nil {
  164. return nil, err
  165. }
  166. if sf != nil {
  167. frameToAdd = sf
  168. } else {
  169. streamFrames = streamFrames[1:]
  170. }
  171. length += frameToAdd.Length(p.version)
  172. frames = append(frames, frameToAdd)
  173. }
  174. if sf, ok := frames[len(frames)-1].(*wire.StreamFrame); ok {
  175. sf.DataLenPresent = false
  176. }
  177. raw, err := p.writeAndSealPacket(header, frames, sealer)
  178. if err != nil {
  179. return nil, err
  180. }
  181. packets = append(packets, &packedPacket{
  182. header: header,
  183. raw: raw,
  184. frames: frames,
  185. encryptionLevel: encLevel,
  186. })
  187. }
  188. return packets, nil
  189. }
  190. // packHandshakeRetransmission retransmits a handshake packet, that was sent with less than forward-secure encryption
  191. func (p *packetPackerLegacy) packHandshakeRetransmission(packet *ackhandler.Packet) (*packedPacket, error) {
  192. sealer, err := p.cryptoSetup.GetSealerWithEncryptionLevel(packet.EncryptionLevel)
  193. if err != nil {
  194. return nil, err
  195. }
  196. // make sure that the retransmission for an Initial packet is sent as an Initial packet
  197. if packet.PacketType == protocol.PacketTypeInitial {
  198. p.hasSentPacket = false
  199. }
  200. header := p.getHeader(packet.EncryptionLevel)
  201. header.Type = packet.PacketType
  202. var frames []wire.Frame
  203. if p.version.UsesStopWaitingFrames() { // pack a STOP_WAITING first
  204. swf := p.acks.GetStopWaitingFrame(true)
  205. swf.PacketNumber = header.PacketNumber
  206. swf.PacketNumberLen = header.PacketNumberLen
  207. frames = append([]wire.Frame{swf}, packet.Frames...)
  208. } else {
  209. frames = packet.Frames
  210. }
  211. raw, err := p.writeAndSealPacket(header, frames, sealer)
  212. return &packedPacket{
  213. header: header,
  214. raw: raw,
  215. frames: frames,
  216. encryptionLevel: packet.EncryptionLevel,
  217. }, err
  218. }
  219. // PackPacket packs a new packet
  220. // the other controlFrames are sent in the next packet, but might be queued and sent in the next packet if the packet would overflow MaxPacketSize otherwise
  221. func (p *packetPackerLegacy) PackPacket() (*packedPacket, error) {
  222. packet, err := p.maybePackCryptoPacket()
  223. if err != nil {
  224. return nil, err
  225. }
  226. if packet != nil {
  227. return packet, nil
  228. }
  229. // if this is the first packet to be send, make sure it contains stream data
  230. if !p.hasSentPacket && packet == nil {
  231. return nil, nil
  232. }
  233. encLevel, sealer := p.cryptoSetup.GetSealer()
  234. header := p.getHeader(encLevel)
  235. headerLength, err := header.GetLength(p.version)
  236. if err != nil {
  237. return nil, err
  238. }
  239. maxSize := p.maxPacketSize - protocol.ByteCount(sealer.Overhead()) - headerLength
  240. frames, err := p.composeNextPacket(header, maxSize, p.canSendData(encLevel))
  241. if err != nil {
  242. return nil, err
  243. }
  244. // Check if we have enough frames to send
  245. if len(frames) == 0 {
  246. return nil, nil
  247. }
  248. // check if this packet only contains an ACK (and maybe a STOP_WAITING)
  249. if !ackhandler.HasRetransmittableFrames(frames) {
  250. if p.numNonRetransmittableAcks >= protocol.MaxNonRetransmittableAcks {
  251. frames = append(frames, &wire.PingFrame{})
  252. p.numNonRetransmittableAcks = 0
  253. } else {
  254. p.numNonRetransmittableAcks++
  255. }
  256. } else {
  257. p.numNonRetransmittableAcks = 0
  258. }
  259. raw, err := p.writeAndSealPacket(header, frames, sealer)
  260. if err != nil {
  261. return nil, err
  262. }
  263. return &packedPacket{
  264. header: header,
  265. raw: raw,
  266. frames: frames,
  267. encryptionLevel: encLevel,
  268. }, nil
  269. }
  270. func (p *packetPackerLegacy) maybePackCryptoPacket() (*packedPacket, error) {
  271. if !p.cryptoStream.hasData() {
  272. return nil, nil
  273. }
  274. encLevel, sealer := p.cryptoSetup.GetSealerForCryptoStream()
  275. header := p.getHeader(encLevel)
  276. headerLength, err := header.GetLength(p.version)
  277. if err != nil {
  278. return nil, err
  279. }
  280. maxLen := p.maxPacketSize - protocol.ByteCount(sealer.Overhead()) - protocol.NonForwardSecurePacketSizeReduction - headerLength
  281. sf, _ := p.cryptoStream.popStreamFrame(maxLen)
  282. sf.DataLenPresent = false
  283. frames := []wire.Frame{sf}
  284. raw, err := p.writeAndSealPacket(header, frames, sealer)
  285. if err != nil {
  286. return nil, err
  287. }
  288. return &packedPacket{
  289. header: header,
  290. raw: raw,
  291. frames: frames,
  292. encryptionLevel: encLevel,
  293. }, nil
  294. }
  295. func (p *packetPackerLegacy) composeNextPacket(
  296. header *wire.Header, // only needed to fill in the STOP_WAITING frame
  297. maxFrameSize protocol.ByteCount,
  298. canSendStreamFrames bool,
  299. ) ([]wire.Frame, error) {
  300. var length protocol.ByteCount
  301. var frames []wire.Frame
  302. // STOP_WAITING and ACK will always fit
  303. // ACKs need to go first, so that the sentPacketHandler will recognize them
  304. if ack := p.acks.GetAckFrame(); ack != nil {
  305. frames = append(frames, ack)
  306. length += ack.Length(p.version)
  307. // add a STOP_WAITING, for gQUIC
  308. if p.version.UsesStopWaitingFrames() {
  309. if swf := p.acks.GetStopWaitingFrame(false); swf != nil {
  310. swf.PacketNumber = header.PacketNumber
  311. swf.PacketNumberLen = header.PacketNumberLen
  312. frames = append(frames, swf)
  313. length += swf.Length(p.version)
  314. }
  315. }
  316. }
  317. var lengthAdded protocol.ByteCount
  318. frames, lengthAdded = p.framer.AppendControlFrames(frames, maxFrameSize-length)
  319. length += lengthAdded
  320. if !canSendStreamFrames {
  321. return frames, nil
  322. }
  323. // temporarily increase the maxFrameSize by the (minimum) length of the DataLen field
  324. // this leads to a properly sized packet in all cases, since we do all the packet length calculations with StreamFrames that have the DataLen set
  325. // however, for the last STREAM frame in the packet, we can omit the DataLen, thus yielding a packet of exactly the correct size
  326. maxFrameSize += 2
  327. frames = p.framer.AppendStreamFrames(frames, maxFrameSize-length)
  328. if len(frames) > 0 {
  329. lastFrame := frames[len(frames)-1]
  330. if sf, ok := lastFrame.(*wire.StreamFrame); ok {
  331. sf.DataLenPresent = false
  332. }
  333. }
  334. return frames, nil
  335. }
  336. func (p *packetPackerLegacy) getHeader(encLevel protocol.EncryptionLevel) *wire.Header {
  337. pnum := p.packetNumberGenerator.Peek()
  338. packetNumberLen := p.getPacketNumberLen(pnum)
  339. header := &wire.Header{
  340. PacketNumber: pnum,
  341. PacketNumberLen: packetNumberLen,
  342. Version: p.version,
  343. }
  344. if p.version.UsesIETFHeaderFormat() && encLevel != protocol.EncryptionForwardSecure {
  345. header.IsLongHeader = true
  346. header.SrcConnectionID = p.srcConnID
  347. header.PacketNumberLen = protocol.PacketNumberLen4
  348. if !p.hasSentPacket && p.perspective == protocol.PerspectiveClient {
  349. header.Type = protocol.PacketTypeInitial
  350. } else {
  351. header.Type = protocol.PacketTypeHandshake
  352. }
  353. }
  354. if !p.omitConnectionID || encLevel != protocol.EncryptionForwardSecure {
  355. header.DestConnectionID = p.destConnID
  356. }
  357. if p.perspective == protocol.PerspectiveServer && encLevel == protocol.EncryptionSecure {
  358. header.Type = protocol.PacketType0RTT
  359. header.DiversificationNonce = p.divNonce
  360. }
  361. if p.perspective == protocol.PerspectiveClient && encLevel != protocol.EncryptionForwardSecure {
  362. header.VersionFlag = true
  363. }
  364. return header
  365. }
  366. func (p *packetPackerLegacy) writeAndSealPacket(
  367. header *wire.Header,
  368. frames []wire.Frame,
  369. sealer handshake.Sealer,
  370. ) ([]byte, error) {
  371. raw := *getPacketBuffer()
  372. buffer := bytes.NewBuffer(raw[:0])
  373. if err := header.Write(buffer, p.perspective, p.version); err != nil {
  374. return nil, err
  375. }
  376. payloadStartIndex := buffer.Len()
  377. // [Psiphon]
  378. // In our tests, gQUICv44 works only when we restore this block of code that was refactored out in:
  379. // https://github.com/lucas-clemente/quic-go/commit/5df98dc3891df7349ee6ff41714fbe6bb4d72440.
  380. // the Initial packet needs to be padded, so the last STREAM frame must have the data length present
  381. if header.Type == protocol.PacketTypeInitial {
  382. lastFrame := frames[len(frames)-1]
  383. if sf, ok := lastFrame.(*wire.StreamFrame); ok {
  384. sf.DataLenPresent = true
  385. }
  386. }
  387. // [Psiphon]
  388. for _, frame := range frames {
  389. if err := frame.Write(buffer, p.version); err != nil {
  390. return nil, err
  391. }
  392. }
  393. if size := protocol.ByteCount(buffer.Len() + sealer.Overhead()); size > p.maxPacketSize {
  394. return nil, fmt.Errorf("PacketPacker BUG: packet too large (%d bytes, allowed %d bytes)", size, p.maxPacketSize)
  395. }
  396. raw = raw[0:buffer.Len()]
  397. _ = sealer.Seal(raw[payloadStartIndex:payloadStartIndex], raw[payloadStartIndex:], header.PacketNumber, raw[:payloadStartIndex])
  398. raw = raw[0 : buffer.Len()+sealer.Overhead()]
  399. num := p.packetNumberGenerator.Pop()
  400. if num != header.PacketNumber {
  401. return nil, errors.New("packetPacker BUG: Peeked and Popped packet numbers do not match")
  402. }
  403. p.hasSentPacket = true
  404. return raw, nil
  405. }
  406. func (p *packetPackerLegacy) canSendData(encLevel protocol.EncryptionLevel) bool {
  407. if p.perspective == protocol.PerspectiveClient {
  408. return encLevel >= protocol.EncryptionSecure
  409. }
  410. return encLevel == protocol.EncryptionForwardSecure
  411. }
  412. func (p *packetPackerLegacy) ChangeDestConnectionID(connID protocol.ConnectionID) {
  413. panic("changing connection IDs not supported by gQUIC")
  414. }
  415. func (p *packetPackerLegacy) HandleTransportParameters(params *handshake.TransportParameters) {
  416. p.omitConnectionID = params.OmitConnectionID
  417. }