packet_unpacker.go 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128
  1. package quic
  2. import (
  3. "bytes"
  4. "fmt"
  5. "github.com/lucas-clemente/quic-go/internal/handshake"
  6. "github.com/lucas-clemente/quic-go/internal/protocol"
  7. "github.com/lucas-clemente/quic-go/internal/qerr"
  8. "github.com/lucas-clemente/quic-go/internal/utils"
  9. "github.com/lucas-clemente/quic-go/internal/wire"
  10. )
  11. type unpackedPacket struct {
  12. packetNumber protocol.PacketNumber // the decoded packet number
  13. hdr *wire.ExtendedHeader
  14. encryptionLevel protocol.EncryptionLevel
  15. frames []wire.Frame
  16. }
  17. // The packetUnpacker unpacks QUIC packets.
  18. type packetUnpacker struct {
  19. cs handshake.CryptoSetup
  20. largestRcvdPacketNumber protocol.PacketNumber
  21. version protocol.VersionNumber
  22. }
  23. var _ unpacker = &packetUnpacker{}
  24. func newPacketUnpacker(cs handshake.CryptoSetup, version protocol.VersionNumber) unpacker {
  25. return &packetUnpacker{
  26. cs: cs,
  27. version: version,
  28. }
  29. }
  30. func (u *packetUnpacker) Unpack(hdr *wire.Header, data []byte) (*unpackedPacket, error) {
  31. r := bytes.NewReader(data)
  32. var encLevel protocol.EncryptionLevel
  33. switch hdr.Type {
  34. case protocol.PacketTypeInitial:
  35. encLevel = protocol.EncryptionInitial
  36. case protocol.PacketTypeHandshake:
  37. encLevel = protocol.EncryptionHandshake
  38. default:
  39. if hdr.IsLongHeader {
  40. return nil, fmt.Errorf("unknown packet type: %s", hdr.Type)
  41. }
  42. encLevel = protocol.Encryption1RTT
  43. }
  44. opener, err := u.cs.GetOpener(encLevel)
  45. if err != nil {
  46. return nil, err
  47. }
  48. hdrLen := int(hdr.ParsedLen())
  49. // The packet number can be up to 4 bytes long, but we won't know the length until we decrypt it.
  50. // 1. save a copy of the 4 bytes
  51. origPNBytes := make([]byte, 4)
  52. copy(origPNBytes, data[hdrLen:hdrLen+4])
  53. // 2. decrypt the header, assuming a 4 byte packet number
  54. opener.DecryptHeader(
  55. data[hdrLen+4:hdrLen+4+16],
  56. &data[0],
  57. data[hdrLen:hdrLen+4],
  58. )
  59. // 3. parse the header (and learn the actual length of the packet number)
  60. extHdr, err := hdr.ParseExtended(r, u.version)
  61. if err != nil {
  62. return nil, fmt.Errorf("error parsing extended header: %s", err)
  63. }
  64. extHdr.Raw = data[:hdrLen+int(extHdr.PacketNumberLen)]
  65. // 4. if the packet number is shorter than 4 bytes, replace the remaining bytes with the copy we saved earlier
  66. if extHdr.PacketNumberLen != protocol.PacketNumberLen4 {
  67. copy(data[hdrLen+int(extHdr.PacketNumberLen):hdrLen+4], origPNBytes[int(extHdr.PacketNumberLen):])
  68. }
  69. data = data[hdrLen+int(extHdr.PacketNumberLen):]
  70. pn := protocol.DecodePacketNumber(
  71. extHdr.PacketNumberLen,
  72. u.largestRcvdPacketNumber,
  73. extHdr.PacketNumber,
  74. )
  75. decrypted, err := opener.Open(data[:0], data, pn, extHdr.Raw)
  76. if err != nil {
  77. return nil, err
  78. }
  79. // Only do this after decrypting, so we are sure the packet is not attacker-controlled
  80. u.largestRcvdPacketNumber = utils.MaxPacketNumber(u.largestRcvdPacketNumber, pn)
  81. fs, err := u.parseFrames(decrypted)
  82. if err != nil {
  83. return nil, err
  84. }
  85. return &unpackedPacket{
  86. hdr: extHdr,
  87. packetNumber: pn,
  88. encryptionLevel: encLevel,
  89. frames: fs,
  90. }, nil
  91. }
  92. func (u *packetUnpacker) parseFrames(decrypted []byte) ([]wire.Frame, error) {
  93. r := bytes.NewReader(decrypted)
  94. if r.Len() == 0 {
  95. return nil, qerr.MissingPayload
  96. }
  97. fs := make([]wire.Frame, 0, 2)
  98. // Read all frames in the packet
  99. for {
  100. frame, err := wire.ParseNextFrame(r, u.version)
  101. if err != nil {
  102. return nil, err
  103. }
  104. if frame == nil {
  105. break
  106. }
  107. fs = append(fs, frame)
  108. }
  109. return fs, nil
  110. }