packet_unpacker.go 2.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495
  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. // Wrap err in quicError so that public reset is sent by session
  53. return nil, qerr.Error(qerr.DecryptionFailure, err.Error())
  54. }
  55. fs, err := u.parseFrames(decrypted)
  56. if err != nil {
  57. return nil, err
  58. }
  59. return &unpackedPacket{
  60. encryptionLevel: encryptionLevel,
  61. frames: fs,
  62. }, nil
  63. }
  64. func (u *packetUnpacker) parseFrames(decrypted []byte) ([]wire.Frame, error) {
  65. r := bytes.NewReader(decrypted)
  66. if r.Len() == 0 {
  67. return nil, qerr.MissingPayload
  68. }
  69. fs := make([]wire.Frame, 0, 2)
  70. // Read all frames in the packet
  71. for {
  72. frame, err := wire.ParseNextFrame(r, u.version)
  73. if err != nil {
  74. return nil, err
  75. }
  76. if frame == nil {
  77. break
  78. }
  79. fs = append(fs, frame)
  80. }
  81. return fs, nil
  82. }