header.go 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198
  1. package wire
  2. import (
  3. "bytes"
  4. "errors"
  5. "io"
  6. "v2ray.com/core/external/github.com/lucas-clemente/quic-go/internal/protocol"
  7. "v2ray.com/core/external/github.com/lucas-clemente/quic-go/internal/qerr"
  8. "v2ray.com/core/external/github.com/lucas-clemente/quic-go/internal/utils"
  9. )
  10. // The Header is the version independent part of the header
  11. type Header struct {
  12. Version protocol.VersionNumber
  13. SrcConnectionID protocol.ConnectionID
  14. DestConnectionID protocol.ConnectionID
  15. IsLongHeader bool
  16. Type protocol.PacketType
  17. Length protocol.ByteCount
  18. Token []byte
  19. SupportedVersions []protocol.VersionNumber // sent in a Version Negotiation Packet
  20. OrigDestConnectionID protocol.ConnectionID // sent in the Retry packet
  21. typeByte byte
  22. parsedLen protocol.ByteCount // how many bytes were read while parsing this header
  23. }
  24. // ParseHeader parses the header.
  25. // For short header packets: up to the packet number.
  26. // For long header packets:
  27. // * if we understand the version: up to the packet number
  28. // * if not, only the invariant part of the header
  29. func ParseHeader(b *bytes.Reader, shortHeaderConnIDLen int) (*Header, error) {
  30. startLen := b.Len()
  31. h, err := parseHeaderImpl(b, shortHeaderConnIDLen)
  32. if err != nil {
  33. return nil, err
  34. }
  35. h.parsedLen = protocol.ByteCount(startLen - b.Len())
  36. return h, nil
  37. }
  38. func parseHeaderImpl(b *bytes.Reader, shortHeaderConnIDLen int) (*Header, error) {
  39. typeByte, err := b.ReadByte()
  40. if err != nil {
  41. return nil, err
  42. }
  43. h := &Header{
  44. typeByte: typeByte,
  45. IsLongHeader: typeByte&0x80 > 0,
  46. }
  47. if !h.IsLongHeader {
  48. if h.typeByte&0x40 == 0 {
  49. return nil, errors.New("not a QUIC packet")
  50. }
  51. if err := h.parseShortHeader(b, shortHeaderConnIDLen); err != nil {
  52. return nil, err
  53. }
  54. return h, nil
  55. }
  56. if err := h.parseLongHeader(b); err != nil {
  57. return nil, err
  58. }
  59. return h, nil
  60. }
  61. func (h *Header) parseShortHeader(b *bytes.Reader, shortHeaderConnIDLen int) error {
  62. var err error
  63. h.DestConnectionID, err = protocol.ReadConnectionID(b, shortHeaderConnIDLen)
  64. return err
  65. }
  66. func (h *Header) parseLongHeader(b *bytes.Reader) error {
  67. v, err := utils.BigEndian.ReadUint32(b)
  68. if err != nil {
  69. return err
  70. }
  71. h.Version = protocol.VersionNumber(v)
  72. if !h.IsVersionNegotiation() && h.typeByte&0x40 == 0 {
  73. return errors.New("not a QUIC packet")
  74. }
  75. connIDLenByte, err := b.ReadByte()
  76. if err != nil {
  77. return err
  78. }
  79. dcil, scil := decodeConnIDLen(connIDLenByte)
  80. h.DestConnectionID, err = protocol.ReadConnectionID(b, dcil)
  81. if err != nil {
  82. return err
  83. }
  84. h.SrcConnectionID, err = protocol.ReadConnectionID(b, scil)
  85. if err != nil {
  86. return err
  87. }
  88. if h.Version == 0 {
  89. return h.parseVersionNegotiationPacket(b)
  90. }
  91. // If we don't understand the version, we have no idea how to interpret the rest of the bytes
  92. if !protocol.IsSupportedVersion(protocol.SupportedVersions, h.Version) {
  93. return nil
  94. }
  95. switch (h.typeByte & 0x30) >> 4 {
  96. case 0x0:
  97. h.Type = protocol.PacketTypeInitial
  98. case 0x1:
  99. h.Type = protocol.PacketType0RTT
  100. case 0x2:
  101. h.Type = protocol.PacketTypeHandshake
  102. case 0x3:
  103. h.Type = protocol.PacketTypeRetry
  104. }
  105. if h.Type == protocol.PacketTypeRetry {
  106. odcil := decodeSingleConnIDLen(h.typeByte & 0xf)
  107. h.OrigDestConnectionID, err = protocol.ReadConnectionID(b, odcil)
  108. if err != nil {
  109. return err
  110. }
  111. h.Token = make([]byte, b.Len())
  112. if _, err := io.ReadFull(b, h.Token); err != nil {
  113. return err
  114. }
  115. return nil
  116. }
  117. if h.Type == protocol.PacketTypeInitial {
  118. tokenLen, err := utils.ReadVarInt(b)
  119. if err != nil {
  120. return err
  121. }
  122. if tokenLen > uint64(b.Len()) {
  123. return io.EOF
  124. }
  125. h.Token = make([]byte, tokenLen)
  126. if _, err := io.ReadFull(b, h.Token); err != nil {
  127. return err
  128. }
  129. }
  130. pl, err := utils.ReadVarInt(b)
  131. if err != nil {
  132. return err
  133. }
  134. h.Length = protocol.ByteCount(pl)
  135. return nil
  136. }
  137. func (h *Header) parseVersionNegotiationPacket(b *bytes.Reader) error {
  138. if b.Len() == 0 {
  139. return qerr.Error(qerr.InvalidVersionNegotiationPacket, "empty version list")
  140. }
  141. h.SupportedVersions = make([]protocol.VersionNumber, b.Len()/4)
  142. for i := 0; b.Len() > 0; i++ {
  143. v, err := utils.BigEndian.ReadUint32(b)
  144. if err != nil {
  145. return qerr.InvalidVersionNegotiationPacket
  146. }
  147. h.SupportedVersions[i] = protocol.VersionNumber(v)
  148. }
  149. return nil
  150. }
  151. // IsVersionNegotiation says if this a version negotiation packet
  152. func (h *Header) IsVersionNegotiation() bool {
  153. return h.IsLongHeader && h.Version == 0
  154. }
  155. // ParsedLen returns the number of bytes that were consumed when parsing the header
  156. func (h *Header) ParsedLen() protocol.ByteCount {
  157. return h.parsedLen
  158. }
  159. // ParseExtended parses the version dependent part of the header.
  160. // The Reader has to be set such that it points to the first byte of the header.
  161. func (h *Header) ParseExtended(b *bytes.Reader, ver protocol.VersionNumber) (*ExtendedHeader, error) {
  162. return h.toExtendedHeader().parse(b, ver)
  163. }
  164. func (h *Header) toExtendedHeader() *ExtendedHeader {
  165. return &ExtendedHeader{Header: *h}
  166. }
  167. func decodeConnIDLen(enc byte) (int /*dest conn id len*/, int /*src conn id len*/) {
  168. return decodeSingleConnIDLen(enc >> 4), decodeSingleConnIDLen(enc & 0xf)
  169. }
  170. func decodeSingleConnIDLen(enc uint8) int {
  171. if enc == 0 {
  172. return 0
  173. }
  174. return int(enc) + 3
  175. }