packet_unpacker.go 2.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394
  1. package quic
  2. import (
  3. "bytes"
  4. "fmt"
  5. "github.com/lucas-clemente/quic-go/internal/protocol"
  6. "github.com/lucas-clemente/quic-go/internal/qerr"
  7. "github.com/lucas-clemente/quic-go/internal/wire"
  8. )
  9. type unpackedPacket struct {
  10. encryptionLevel protocol.EncryptionLevel
  11. frames []wire.Frame
  12. }
  13. type quicAEAD interface {
  14. OpenInitial(dst, src []byte, pn protocol.PacketNumber, ad []byte) ([]byte, error)
  15. OpenHandshake(dst, src []byte, pn protocol.PacketNumber, ad []byte) ([]byte, error)
  16. Open1RTT(dst, src []byte, pn protocol.PacketNumber, ad []byte) ([]byte, error)
  17. }
  18. // The packetUnpacker unpacks QUIC packets.
  19. type packetUnpacker struct {
  20. aead quicAEAD
  21. version protocol.VersionNumber
  22. }
  23. var _ unpacker = &packetUnpacker{}
  24. func newPacketUnpacker(aead quicAEAD, version protocol.VersionNumber) unpacker {
  25. return &packetUnpacker{
  26. aead: aead,
  27. version: version,
  28. }
  29. }
  30. func (u *packetUnpacker) Unpack(headerBinary []byte, hdr *wire.ExtendedHeader, data []byte) (*unpackedPacket, error) {
  31. buf := *getPacketBuffer()
  32. buf = buf[:0]
  33. defer putPacketBuffer(&buf)
  34. var decrypted []byte
  35. var encryptionLevel protocol.EncryptionLevel
  36. var err error
  37. switch hdr.Type {
  38. case protocol.PacketTypeInitial:
  39. decrypted, err = u.aead.OpenInitial(buf, data, hdr.PacketNumber, headerBinary)
  40. encryptionLevel = protocol.EncryptionInitial
  41. case protocol.PacketTypeHandshake:
  42. decrypted, err = u.aead.OpenHandshake(buf, data, hdr.PacketNumber, headerBinary)
  43. encryptionLevel = protocol.EncryptionHandshake
  44. default:
  45. if hdr.IsLongHeader {
  46. return nil, fmt.Errorf("unknown packet type: %s", hdr.Type)
  47. }
  48. decrypted, err = u.aead.Open1RTT(buf, data, hdr.PacketNumber, headerBinary)
  49. encryptionLevel = protocol.Encryption1RTT
  50. }
  51. if err != nil {
  52. return nil, qerr.Error(qerr.DecryptionFailure, err.Error())
  53. }
  54. fs, err := u.parseFrames(decrypted)
  55. if err != nil {
  56. return nil, err
  57. }
  58. return &unpackedPacket{
  59. encryptionLevel: encryptionLevel,
  60. frames: fs,
  61. }, nil
  62. }
  63. func (u *packetUnpacker) parseFrames(decrypted []byte) ([]wire.Frame, error) {
  64. r := bytes.NewReader(decrypted)
  65. if r.Len() == 0 {
  66. return nil, qerr.MissingPayload
  67. }
  68. fs := make([]wire.Frame, 0, 2)
  69. // Read all frames in the packet
  70. for {
  71. frame, err := wire.ParseNextFrame(r, u.version)
  72. if err != nil {
  73. return nil, err
  74. }
  75. if frame == nil {
  76. break
  77. }
  78. fs = append(fs, frame)
  79. }
  80. return fs, nil
  81. }