server.go 24 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813
  1. package quic
  2. import (
  3. "bytes"
  4. "context"
  5. "crypto/rand"
  6. "crypto/tls"
  7. "errors"
  8. "fmt"
  9. "net"
  10. "sync"
  11. "sync/atomic"
  12. "time"
  13. "github.com/Psiphon-Labs/quic-go/internal/handshake"
  14. "github.com/Psiphon-Labs/quic-go/internal/protocol"
  15. "github.com/Psiphon-Labs/quic-go/internal/qerr"
  16. "github.com/Psiphon-Labs/quic-go/internal/qtls"
  17. "github.com/Psiphon-Labs/quic-go/internal/utils"
  18. "github.com/Psiphon-Labs/quic-go/internal/wire"
  19. "github.com/Psiphon-Labs/quic-go/logging"
  20. )
  21. // packetHandler handles packets
  22. type packetHandler interface {
  23. handlePacket(*receivedPacket)
  24. shutdown()
  25. destroy(error)
  26. getPerspective() protocol.Perspective
  27. }
  28. type unknownPacketHandler interface {
  29. handlePacket(*receivedPacket)
  30. setCloseError(error)
  31. }
  32. type packetHandlerManager interface {
  33. AddWithConnID(protocol.ConnectionID, protocol.ConnectionID, func() packetHandler) bool
  34. Destroy() error
  35. sessionRunner
  36. SetServer(unknownPacketHandler)
  37. CloseServer()
  38. }
  39. type quicSession interface {
  40. EarlySession
  41. earlySessionReady() <-chan struct{}
  42. handlePacket(*receivedPacket)
  43. GetVersion() protocol.VersionNumber
  44. getPerspective() protocol.Perspective
  45. run() error
  46. destroy(error)
  47. shutdown()
  48. }
  49. // A Listener of QUIC
  50. type baseServer struct {
  51. mutex sync.Mutex
  52. acceptEarlySessions bool
  53. tlsConf *tls.Config
  54. config *Config
  55. conn connection
  56. // If the server is started with ListenAddr, we create a packet conn.
  57. // If it is started with Listen, we take a packet conn as a parameter.
  58. createdPacketConn bool
  59. tokenGenerator *handshake.TokenGenerator
  60. sessionHandler packetHandlerManager
  61. receivedPackets chan *receivedPacket
  62. // set as a member, so they can be set in the tests
  63. newSession func(
  64. sendConn,
  65. sessionRunner,
  66. protocol.ConnectionID, /* original dest connection ID */
  67. *protocol.ConnectionID, /* retry src connection ID */
  68. protocol.ConnectionID, /* client dest connection ID */
  69. protocol.ConnectionID, /* destination connection ID */
  70. protocol.ConnectionID, /* source connection ID */
  71. protocol.StatelessResetToken,
  72. *Config,
  73. *tls.Config,
  74. *handshake.TokenGenerator,
  75. bool, /* enable 0-RTT */
  76. logging.ConnectionTracer,
  77. uint64,
  78. utils.Logger,
  79. protocol.VersionNumber,
  80. ) quicSession
  81. serverError error
  82. errorChan chan struct{}
  83. closed bool
  84. running chan struct{} // closed as soon as run() returns
  85. sessionQueue chan quicSession
  86. sessionQueueLen int32 // to be used as an atomic
  87. logger utils.Logger
  88. }
  89. var (
  90. _ Listener = &baseServer{}
  91. _ unknownPacketHandler = &baseServer{}
  92. )
  93. type earlyServer struct{ *baseServer }
  94. var _ EarlyListener = &earlyServer{}
  95. func (s *earlyServer) Accept(ctx context.Context) (EarlySession, error) {
  96. return s.baseServer.accept(ctx)
  97. }
  98. // ListenAddr creates a QUIC server listening on a given address.
  99. // The tls.Config must not be nil and must contain a certificate configuration.
  100. // The quic.Config may be nil, in that case the default values will be used.
  101. func ListenAddr(addr string, tlsConf *tls.Config, config *Config) (Listener, error) {
  102. return listenAddr(addr, tlsConf, config, false)
  103. }
  104. // ListenAddrEarly works like ListenAddr, but it returns sessions before the handshake completes.
  105. func ListenAddrEarly(addr string, tlsConf *tls.Config, config *Config) (EarlyListener, error) {
  106. s, err := listenAddr(addr, tlsConf, config, true)
  107. if err != nil {
  108. return nil, err
  109. }
  110. return &earlyServer{s}, nil
  111. }
  112. func listenAddr(addr string, tlsConf *tls.Config, config *Config, acceptEarly bool) (*baseServer, error) {
  113. udpAddr, err := net.ResolveUDPAddr("udp", addr)
  114. if err != nil {
  115. return nil, err
  116. }
  117. conn, err := net.ListenUDP("udp", udpAddr)
  118. if err != nil {
  119. return nil, err
  120. }
  121. serv, err := listen(conn, tlsConf, config, acceptEarly)
  122. if err != nil {
  123. return nil, err
  124. }
  125. serv.createdPacketConn = true
  126. return serv, nil
  127. }
  128. // Listen listens for QUIC connections on a given net.PacketConn. If the
  129. // PacketConn satisfies the OOBCapablePacketConn interface (as a net.UDPConn
  130. // does), ECN and packet info support will be enabled. In this case, ReadMsgUDP
  131. // and WriteMsgUDP will be used instead of ReadFrom and WriteTo to read/write
  132. // packets. A single net.PacketConn only be used for a single call to Listen.
  133. // The PacketConn can be used for simultaneous calls to Dial. QUIC connection
  134. // IDs are used for demultiplexing the different connections. The tls.Config
  135. // must not be nil and must contain a certificate configuration. The
  136. // tls.Config.CipherSuites allows setting of TLS 1.3 cipher suites. Furthermore,
  137. // it must define an application control (using NextProtos). The quic.Config may
  138. // be nil, in that case the default values will be used.
  139. func Listen(conn net.PacketConn, tlsConf *tls.Config, config *Config) (Listener, error) {
  140. return listen(conn, tlsConf, config, false)
  141. }
  142. // ListenEarly works like Listen, but it returns sessions before the handshake completes.
  143. func ListenEarly(conn net.PacketConn, tlsConf *tls.Config, config *Config) (EarlyListener, error) {
  144. s, err := listen(conn, tlsConf, config, true)
  145. if err != nil {
  146. return nil, err
  147. }
  148. return &earlyServer{s}, nil
  149. }
  150. func listen(conn net.PacketConn, tlsConf *tls.Config, config *Config, acceptEarly bool) (*baseServer, error) {
  151. if tlsConf == nil {
  152. return nil, errors.New("quic: tls.Config not set")
  153. }
  154. if err := validateConfig(config); err != nil {
  155. return nil, err
  156. }
  157. config = populateServerConfig(config)
  158. for _, v := range config.Versions {
  159. if !protocol.IsValidVersion(v) {
  160. return nil, fmt.Errorf("%s is not a valid QUIC version", v)
  161. }
  162. }
  163. sessionHandler, err := getMultiplexer().AddConn(conn, config.ConnectionIDLength, config.StatelessResetKey, config.Tracer)
  164. if err != nil {
  165. return nil, err
  166. }
  167. tokenGenerator, err := handshake.NewTokenGenerator(rand.Reader)
  168. if err != nil {
  169. return nil, err
  170. }
  171. c, err := wrapConn(conn)
  172. if err != nil {
  173. return nil, err
  174. }
  175. s := &baseServer{
  176. conn: c,
  177. tlsConf: tlsConf,
  178. config: config,
  179. tokenGenerator: tokenGenerator,
  180. sessionHandler: sessionHandler,
  181. sessionQueue: make(chan quicSession),
  182. errorChan: make(chan struct{}),
  183. running: make(chan struct{}),
  184. receivedPackets: make(chan *receivedPacket, protocol.MaxServerUnprocessedPackets),
  185. newSession: newSession,
  186. logger: utils.DefaultLogger.WithPrefix("server"),
  187. acceptEarlySessions: acceptEarly,
  188. }
  189. go s.run()
  190. sessionHandler.SetServer(s)
  191. s.logger.Debugf("Listening for %s connections on %s", conn.LocalAddr().Network(), conn.LocalAddr().String())
  192. return s, nil
  193. }
  194. func (s *baseServer) run() {
  195. defer close(s.running)
  196. for {
  197. select {
  198. case <-s.errorChan:
  199. return
  200. default:
  201. }
  202. select {
  203. case <-s.errorChan:
  204. return
  205. case p := <-s.receivedPackets:
  206. if bufferStillInUse := s.handlePacketImpl(p); !bufferStillInUse {
  207. p.buffer.Release()
  208. }
  209. }
  210. }
  211. }
  212. var defaultAcceptToken = func(clientAddr net.Addr, token *Token) bool {
  213. if token == nil {
  214. return false
  215. }
  216. validity := protocol.TokenValidity
  217. if token.IsRetryToken {
  218. validity = protocol.RetryTokenValidity
  219. }
  220. if time.Now().After(token.SentTime.Add(validity)) {
  221. return false
  222. }
  223. var sourceAddr string
  224. if udpAddr, ok := clientAddr.(*net.UDPAddr); ok {
  225. sourceAddr = udpAddr.IP.String()
  226. } else {
  227. sourceAddr = clientAddr.String()
  228. }
  229. return sourceAddr == token.RemoteAddr
  230. }
  231. // Accept returns sessions that already completed the handshake.
  232. // It is only valid if acceptEarlySessions is false.
  233. func (s *baseServer) Accept(ctx context.Context) (Session, error) {
  234. return s.accept(ctx)
  235. }
  236. func (s *baseServer) accept(ctx context.Context) (quicSession, error) {
  237. select {
  238. case <-ctx.Done():
  239. return nil, ctx.Err()
  240. case sess := <-s.sessionQueue:
  241. atomic.AddInt32(&s.sessionQueueLen, -1)
  242. return sess, nil
  243. case <-s.errorChan:
  244. return nil, s.serverError
  245. }
  246. }
  247. // Close the server
  248. func (s *baseServer) Close() error {
  249. s.mutex.Lock()
  250. if s.closed {
  251. s.mutex.Unlock()
  252. return nil
  253. }
  254. if s.serverError == nil {
  255. s.serverError = errors.New("server closed")
  256. }
  257. // If the server was started with ListenAddr, we created the packet conn.
  258. // We need to close it in order to make the go routine reading from that conn return.
  259. createdPacketConn := s.createdPacketConn
  260. s.closed = true
  261. close(s.errorChan)
  262. s.mutex.Unlock()
  263. <-s.running
  264. s.sessionHandler.CloseServer()
  265. if createdPacketConn {
  266. return s.sessionHandler.Destroy()
  267. }
  268. return nil
  269. }
  270. func (s *baseServer) setCloseError(e error) {
  271. s.mutex.Lock()
  272. defer s.mutex.Unlock()
  273. if s.closed {
  274. return
  275. }
  276. s.closed = true
  277. s.serverError = e
  278. close(s.errorChan)
  279. }
  280. // Addr returns the server's network address
  281. func (s *baseServer) Addr() net.Addr {
  282. return s.conn.LocalAddr()
  283. }
  284. func (s *baseServer) handlePacket(p *receivedPacket) {
  285. select {
  286. case s.receivedPackets <- p:
  287. default:
  288. s.logger.Debugf("Dropping packet from %s (%d bytes). Server receive queue full.", p.remoteAddr, p.Size())
  289. if s.config.Tracer != nil {
  290. s.config.Tracer.DroppedPacket(p.remoteAddr, logging.PacketTypeNotDetermined, p.Size(), logging.PacketDropDOSPrevention)
  291. }
  292. }
  293. }
  294. func (s *baseServer) handlePacketImpl(p *receivedPacket) bool /* is the buffer still in use? */ {
  295. if wire.IsVersionNegotiationPacket(p.data) {
  296. s.logger.Debugf("Dropping Version Negotiation packet.")
  297. if s.config.Tracer != nil {
  298. s.config.Tracer.DroppedPacket(p.remoteAddr, logging.PacketTypeVersionNegotiation, p.Size(), logging.PacketDropUnexpectedPacket)
  299. }
  300. return false
  301. }
  302. // If we're creating a new session, the packet will be passed to the session.
  303. // The header will then be parsed again.
  304. hdr, _, _, err := wire.ParsePacket(p.data, s.config.ConnectionIDLength)
  305. if err != nil && err != wire.ErrUnsupportedVersion {
  306. if s.config.Tracer != nil {
  307. s.config.Tracer.DroppedPacket(p.remoteAddr, logging.PacketTypeNotDetermined, p.Size(), logging.PacketDropHeaderParseError)
  308. }
  309. s.logger.Debugf("Error parsing packet: %s", err)
  310. return false
  311. }
  312. // Short header packets should never end up here in the first place
  313. if !hdr.IsLongHeader {
  314. panic(fmt.Sprintf("misrouted packet: %#v", hdr))
  315. }
  316. // [Psiphon]
  317. // To accomodate additional messages, obfuscated QUIC packets may reserve
  318. // significant space in the Initial packet and send less that 1200 QUIC
  319. // bytes. In this configuration, the obfuscation layer enforces the
  320. // anti-amplification 1200 byte rule, but it must be disabled here.
  321. isObfuscated := s.config.ServerMaxPacketSizeAdjustment != nil && s.config.ServerMaxPacketSizeAdjustment(p.remoteAddr) > 0
  322. if !isObfuscated &&
  323. hdr.Type == protocol.PacketTypeInitial && p.Size() < protocol.MinInitialPacketSize {
  324. s.logger.Debugf("Dropping a packet that is too small to be a valid Initial (%d bytes)", p.Size())
  325. if s.config.Tracer != nil {
  326. s.config.Tracer.DroppedPacket(p.remoteAddr, logging.PacketTypeInitial, p.Size(), logging.PacketDropUnexpectedPacket)
  327. }
  328. return false
  329. }
  330. // send a Version Negotiation Packet if the client is speaking a different protocol version
  331. if !protocol.IsSupportedVersion(s.config.Versions, hdr.Version) {
  332. if p.Size() < protocol.MinUnknownVersionPacketSize {
  333. s.logger.Debugf("Dropping a packet with an unknown version that is too small (%d bytes)", p.Size())
  334. if s.config.Tracer != nil {
  335. s.config.Tracer.DroppedPacket(p.remoteAddr, logging.PacketTypeNotDetermined, p.Size(), logging.PacketDropUnexpectedPacket)
  336. }
  337. return false
  338. }
  339. if !s.config.DisableVersionNegotiationPackets {
  340. go s.sendVersionNegotiationPacket(p, hdr)
  341. }
  342. return false
  343. }
  344. if hdr.IsLongHeader && hdr.Type != protocol.PacketTypeInitial {
  345. // Drop long header packets.
  346. // There's little point in sending a Stateless Reset, since the client
  347. // might not have received the token yet.
  348. s.logger.Debugf("Dropping long header packet of type %s (%d bytes)", hdr.Type, len(p.data))
  349. if s.config.Tracer != nil {
  350. s.config.Tracer.DroppedPacket(p.remoteAddr, logging.PacketTypeFromHeader(hdr), p.Size(), logging.PacketDropUnexpectedPacket)
  351. }
  352. return false
  353. }
  354. s.logger.Debugf("<- Received Initial packet.")
  355. if err := s.handleInitialImpl(p, hdr); err != nil {
  356. s.logger.Errorf("Error occurred handling initial packet: %s", err)
  357. }
  358. // Don't put the packet buffer back.
  359. // handleInitialImpl deals with the buffer.
  360. return true
  361. }
  362. // [Psiphon]
  363. type stubCryptoSetup struct {
  364. initialOpener handshake.LongHeaderOpener
  365. }
  366. var notSupported = errors.New("not supported")
  367. func (s *stubCryptoSetup) RunHandshake() {
  368. }
  369. func (s *stubCryptoSetup) Close() error {
  370. return notSupported
  371. }
  372. func (s *stubCryptoSetup) ChangeConnectionID(protocol.ConnectionID) {
  373. }
  374. func (s *stubCryptoSetup) GetSessionTicket() ([]byte, error) {
  375. return nil, notSupported
  376. }
  377. func (s *stubCryptoSetup) HandleMessage([]byte, protocol.EncryptionLevel) bool {
  378. return false
  379. }
  380. func (s *stubCryptoSetup) SetLargest1RTTAcked(protocol.PacketNumber) error {
  381. return notSupported
  382. }
  383. func (s *stubCryptoSetup) SetHandshakeConfirmed() {
  384. }
  385. func (s *stubCryptoSetup) ConnectionState() handshake.ConnectionState {
  386. return handshake.ConnectionState{}
  387. }
  388. func (s *stubCryptoSetup) GetInitialOpener() (handshake.LongHeaderOpener, error) {
  389. return s.initialOpener, nil
  390. }
  391. func (s *stubCryptoSetup) GetHandshakeOpener() (handshake.LongHeaderOpener, error) {
  392. return nil, notSupported
  393. }
  394. func (s *stubCryptoSetup) Get0RTTOpener() (handshake.LongHeaderOpener, error) {
  395. return nil, notSupported
  396. }
  397. func (s *stubCryptoSetup) Get1RTTOpener() (handshake.ShortHeaderOpener, error) {
  398. return nil, notSupported
  399. }
  400. func (s *stubCryptoSetup) GetInitialSealer() (handshake.LongHeaderSealer, error) {
  401. return nil, notSupported
  402. }
  403. func (s *stubCryptoSetup) GetHandshakeSealer() (handshake.LongHeaderSealer, error) {
  404. return nil, notSupported
  405. }
  406. func (s *stubCryptoSetup) Get0RTTSealer() (handshake.LongHeaderSealer, error) {
  407. return nil, notSupported
  408. }
  409. func (s *stubCryptoSetup) Get1RTTSealer() (handshake.ShortHeaderSealer, error) {
  410. return nil, notSupported
  411. }
  412. // [Psiphon]
  413. // verifyClientHelloRandom unpacks an Initial packet, extracts the CRYPTO
  414. // frame, and calls Config.VerifyClientHelloRandom.
  415. func (s *baseServer) verifyClientHelloRandom(p *receivedPacket, hdr *wire.Header) error {
  416. _, initialOpener := handshake.NewInitialAEAD(
  417. hdr.DestConnectionID, protocol.PerspectiveServer, protocol.Version1)
  418. cs := &stubCryptoSetup{
  419. initialOpener: initialOpener,
  420. }
  421. // Make a copy of the packet data since this unpacking modifies it and the
  422. // original packet data must be retained for subsequent processing.
  423. data := append([]byte(nil), p.data...)
  424. unpacker := newPacketUnpacker(cs, protocol.Version1)
  425. unpacked, err := unpacker.Unpack(hdr, p.rcvTime, data)
  426. if err != nil {
  427. return fmt.Errorf("verifyClientHelloRandom: Unpack: %w", err)
  428. }
  429. parser := wire.NewFrameParser(s.config.EnableDatagrams, protocol.Version1)
  430. r := bytes.NewReader(unpacked.data)
  431. for {
  432. frame, err := parser.ParseNext(r, protocol.EncryptionInitial)
  433. if err != nil {
  434. return fmt.Errorf("verifyClientHelloRandom: ParseNext: %w", err)
  435. }
  436. if frame == nil {
  437. return errors.New("verifyClientHelloRandom: missing CRYPTO frame")
  438. }
  439. cryptoFrame, ok := frame.(*wire.CryptoFrame)
  440. if !ok {
  441. continue
  442. }
  443. if cryptoFrame.Offset != 0 {
  444. return errors.New("verifyClientHelloRandom: unexpected CRYPTO frame offset")
  445. }
  446. random, err := qtls.ReadClientHelloRandom(cryptoFrame.Data)
  447. if err != nil {
  448. return fmt.Errorf("verifyClientHelloRandom: ReadClientHelloRandom: %w", err)
  449. }
  450. if !s.config.VerifyClientHelloRandom(p.remoteAddr, random) {
  451. return fmt.Errorf("verifyClientHelloRandom: VerifyClientHelloRandom failed")
  452. }
  453. break
  454. }
  455. return nil
  456. }
  457. func (s *baseServer) handleInitialImpl(p *receivedPacket, hdr *wire.Header) error {
  458. if len(hdr.Token) == 0 && hdr.DestConnectionID.Len() < protocol.MinConnectionIDLenInitial {
  459. p.buffer.Release()
  460. if s.config.Tracer != nil {
  461. s.config.Tracer.DroppedPacket(p.remoteAddr, logging.PacketTypeInitial, p.Size(), logging.PacketDropUnexpectedPacket)
  462. }
  463. return errors.New("too short connection ID")
  464. }
  465. // [Psiphon]
  466. // Drop any Initial packet that fails verifyClientHelloRandom.
  467. if s.config.VerifyClientHelloRandom != nil {
  468. err := s.verifyClientHelloRandom(p, hdr)
  469. if err != nil {
  470. p.buffer.Release()
  471. return err
  472. }
  473. }
  474. var (
  475. token *Token
  476. retrySrcConnID *protocol.ConnectionID
  477. )
  478. origDestConnID := hdr.DestConnectionID
  479. if len(hdr.Token) > 0 {
  480. c, err := s.tokenGenerator.DecodeToken(hdr.Token)
  481. if err == nil {
  482. token = &Token{
  483. IsRetryToken: c.IsRetryToken,
  484. RemoteAddr: c.RemoteAddr,
  485. SentTime: c.SentTime,
  486. }
  487. if token.IsRetryToken {
  488. origDestConnID = c.OriginalDestConnectionID
  489. retrySrcConnID = &c.RetrySrcConnectionID
  490. }
  491. }
  492. }
  493. if !s.config.AcceptToken(p.remoteAddr, token) {
  494. go func() {
  495. defer p.buffer.Release()
  496. if token != nil && token.IsRetryToken {
  497. if err := s.maybeSendInvalidToken(p, hdr); err != nil {
  498. s.logger.Debugf("Error sending INVALID_TOKEN error: %s", err)
  499. }
  500. return
  501. }
  502. if err := s.sendRetry(p.remoteAddr, hdr, p.info); err != nil {
  503. s.logger.Debugf("Error sending Retry: %s", err)
  504. }
  505. }()
  506. return nil
  507. }
  508. if queueLen := atomic.LoadInt32(&s.sessionQueueLen); queueLen >= protocol.MaxAcceptQueueSize {
  509. s.logger.Debugf("Rejecting new connection. Server currently busy. Accept queue length: %d (max %d)", queueLen, protocol.MaxAcceptQueueSize)
  510. go func() {
  511. defer p.buffer.Release()
  512. if err := s.sendConnectionRefused(p.remoteAddr, hdr, p.info); err != nil {
  513. s.logger.Debugf("Error rejecting connection: %s", err)
  514. }
  515. }()
  516. return nil
  517. }
  518. connID, err := protocol.GenerateConnectionID(s.config.ConnectionIDLength)
  519. if err != nil {
  520. return err
  521. }
  522. s.logger.Debugf("Changing connection ID to %s.", connID)
  523. var sess quicSession
  524. tracingID := nextSessionTracingID()
  525. if added := s.sessionHandler.AddWithConnID(hdr.DestConnectionID, connID, func() packetHandler {
  526. var tracer logging.ConnectionTracer
  527. if s.config.Tracer != nil {
  528. // Use the same connection ID that is passed to the client's GetLogWriter callback.
  529. connID := hdr.DestConnectionID
  530. if origDestConnID.Len() > 0 {
  531. connID = origDestConnID
  532. }
  533. tracer = s.config.Tracer.TracerForConnection(
  534. context.WithValue(context.Background(), SessionTracingKey, tracingID),
  535. protocol.PerspectiveServer,
  536. connID,
  537. )
  538. }
  539. sess = s.newSession(
  540. newSendConn(s.conn, p.remoteAddr, p.info),
  541. s.sessionHandler,
  542. origDestConnID,
  543. retrySrcConnID,
  544. hdr.DestConnectionID,
  545. hdr.SrcConnectionID,
  546. connID,
  547. s.sessionHandler.GetStatelessResetToken(connID),
  548. s.config,
  549. s.tlsConf,
  550. s.tokenGenerator,
  551. s.acceptEarlySessions,
  552. tracer,
  553. tracingID,
  554. s.logger,
  555. hdr.Version,
  556. )
  557. sess.handlePacket(p)
  558. return sess
  559. }); !added {
  560. return nil
  561. }
  562. go sess.run()
  563. go s.handleNewSession(sess)
  564. if sess == nil {
  565. p.buffer.Release()
  566. return nil
  567. }
  568. return nil
  569. }
  570. func (s *baseServer) handleNewSession(sess quicSession) {
  571. sessCtx := sess.Context()
  572. if s.acceptEarlySessions {
  573. // wait until the early session is ready (or the handshake fails)
  574. select {
  575. case <-sess.earlySessionReady():
  576. case <-sessCtx.Done():
  577. return
  578. }
  579. } else {
  580. // wait until the handshake is complete (or fails)
  581. select {
  582. case <-sess.HandshakeComplete().Done():
  583. case <-sessCtx.Done():
  584. return
  585. }
  586. }
  587. atomic.AddInt32(&s.sessionQueueLen, 1)
  588. select {
  589. case s.sessionQueue <- sess:
  590. // blocks until the session is accepted
  591. case <-sessCtx.Done():
  592. atomic.AddInt32(&s.sessionQueueLen, -1)
  593. // don't pass sessions that were already closed to Accept()
  594. }
  595. }
  596. func (s *baseServer) sendRetry(remoteAddr net.Addr, hdr *wire.Header, info *packetInfo) error {
  597. // Log the Initial packet now.
  598. // If no Retry is sent, the packet will be logged by the session.
  599. (&wire.ExtendedHeader{Header: *hdr}).Log(s.logger)
  600. srcConnID, err := protocol.GenerateConnectionID(s.config.ConnectionIDLength)
  601. if err != nil {
  602. return err
  603. }
  604. token, err := s.tokenGenerator.NewRetryToken(remoteAddr, hdr.DestConnectionID, srcConnID)
  605. if err != nil {
  606. return err
  607. }
  608. replyHdr := &wire.ExtendedHeader{}
  609. replyHdr.IsLongHeader = true
  610. replyHdr.Type = protocol.PacketTypeRetry
  611. replyHdr.Version = hdr.Version
  612. replyHdr.SrcConnectionID = srcConnID
  613. replyHdr.DestConnectionID = hdr.SrcConnectionID
  614. replyHdr.Token = token
  615. if s.logger.Debug() {
  616. s.logger.Debugf("Changing connection ID to %s.", srcConnID)
  617. s.logger.Debugf("-> Sending Retry")
  618. replyHdr.Log(s.logger)
  619. }
  620. packetBuffer := getPacketBuffer()
  621. defer packetBuffer.Release()
  622. buf := bytes.NewBuffer(packetBuffer.Data)
  623. if err := replyHdr.Write(buf, hdr.Version); err != nil {
  624. return err
  625. }
  626. // append the Retry integrity tag
  627. tag := handshake.GetRetryIntegrityTag(buf.Bytes(), hdr.DestConnectionID, hdr.Version)
  628. buf.Write(tag[:])
  629. if s.config.Tracer != nil {
  630. s.config.Tracer.SentPacket(remoteAddr, &replyHdr.Header, protocol.ByteCount(buf.Len()), nil)
  631. }
  632. _, err = s.conn.WritePacket(buf.Bytes(), remoteAddr, info.OOB())
  633. return err
  634. }
  635. func (s *baseServer) maybeSendInvalidToken(p *receivedPacket, hdr *wire.Header) error {
  636. // Only send INVALID_TOKEN if we can unprotect the packet.
  637. // This makes sure that we won't send it for packets that were corrupted.
  638. sealer, opener := handshake.NewInitialAEAD(hdr.DestConnectionID, protocol.PerspectiveServer, hdr.Version)
  639. data := p.data[:hdr.ParsedLen()+hdr.Length]
  640. extHdr, err := unpackHeader(opener, hdr, data, hdr.Version)
  641. if err != nil {
  642. if s.config.Tracer != nil {
  643. s.config.Tracer.DroppedPacket(p.remoteAddr, logging.PacketTypeInitial, p.Size(), logging.PacketDropHeaderParseError)
  644. }
  645. // don't return the error here. Just drop the packet.
  646. return nil
  647. }
  648. hdrLen := extHdr.ParsedLen()
  649. if _, err := opener.Open(data[hdrLen:hdrLen], data[hdrLen:], extHdr.PacketNumber, data[:hdrLen]); err != nil {
  650. // don't return the error here. Just drop the packet.
  651. if s.config.Tracer != nil {
  652. s.config.Tracer.DroppedPacket(p.remoteAddr, logging.PacketTypeInitial, p.Size(), logging.PacketDropPayloadDecryptError)
  653. }
  654. return nil
  655. }
  656. if s.logger.Debug() {
  657. s.logger.Debugf("Client sent an invalid retry token. Sending INVALID_TOKEN to %s.", p.remoteAddr)
  658. }
  659. return s.sendError(p.remoteAddr, hdr, sealer, qerr.InvalidToken, p.info)
  660. }
  661. func (s *baseServer) sendConnectionRefused(remoteAddr net.Addr, hdr *wire.Header, info *packetInfo) error {
  662. sealer, _ := handshake.NewInitialAEAD(hdr.DestConnectionID, protocol.PerspectiveServer, hdr.Version)
  663. return s.sendError(remoteAddr, hdr, sealer, qerr.ConnectionRefused, info)
  664. }
  665. // sendError sends the error as a response to the packet received with header hdr
  666. func (s *baseServer) sendError(remoteAddr net.Addr, hdr *wire.Header, sealer handshake.LongHeaderSealer, errorCode qerr.TransportErrorCode, info *packetInfo) error {
  667. packetBuffer := getPacketBuffer()
  668. defer packetBuffer.Release()
  669. buf := bytes.NewBuffer(packetBuffer.Data)
  670. ccf := &wire.ConnectionCloseFrame{ErrorCode: uint64(errorCode)}
  671. replyHdr := &wire.ExtendedHeader{}
  672. replyHdr.IsLongHeader = true
  673. replyHdr.Type = protocol.PacketTypeInitial
  674. replyHdr.Version = hdr.Version
  675. replyHdr.SrcConnectionID = hdr.DestConnectionID
  676. replyHdr.DestConnectionID = hdr.SrcConnectionID
  677. replyHdr.PacketNumberLen = protocol.PacketNumberLen4
  678. replyHdr.Length = 4 /* packet number len */ + ccf.Length(hdr.Version) + protocol.ByteCount(sealer.Overhead())
  679. if err := replyHdr.Write(buf, hdr.Version); err != nil {
  680. return err
  681. }
  682. payloadOffset := buf.Len()
  683. if err := ccf.Write(buf, hdr.Version); err != nil {
  684. return err
  685. }
  686. raw := buf.Bytes()
  687. _ = sealer.Seal(raw[payloadOffset:payloadOffset], raw[payloadOffset:], replyHdr.PacketNumber, raw[:payloadOffset])
  688. raw = raw[0 : buf.Len()+sealer.Overhead()]
  689. pnOffset := payloadOffset - int(replyHdr.PacketNumberLen)
  690. sealer.EncryptHeader(
  691. raw[pnOffset+4:pnOffset+4+16],
  692. &raw[0],
  693. raw[pnOffset:payloadOffset],
  694. )
  695. replyHdr.Log(s.logger)
  696. wire.LogFrame(s.logger, ccf, true)
  697. if s.config.Tracer != nil {
  698. s.config.Tracer.SentPacket(remoteAddr, &replyHdr.Header, protocol.ByteCount(len(raw)), []logging.Frame{ccf})
  699. }
  700. _, err := s.conn.WritePacket(raw, remoteAddr, info.OOB())
  701. return err
  702. }
  703. func (s *baseServer) sendVersionNegotiationPacket(p *receivedPacket, hdr *wire.Header) {
  704. s.logger.Debugf("Client offered version %s, sending Version Negotiation", hdr.Version)
  705. data, err := wire.ComposeVersionNegotiation(hdr.SrcConnectionID, hdr.DestConnectionID, s.config.Versions)
  706. if err != nil {
  707. s.logger.Debugf("Error composing Version Negotiation: %s", err)
  708. return
  709. }
  710. if s.config.Tracer != nil {
  711. s.config.Tracer.SentPacket(
  712. p.remoteAddr,
  713. &wire.Header{
  714. IsLongHeader: true,
  715. DestConnectionID: hdr.SrcConnectionID,
  716. SrcConnectionID: hdr.DestConnectionID,
  717. },
  718. protocol.ByteCount(len(data)),
  719. nil,
  720. )
  721. }
  722. if _, err := s.conn.WritePacket(data, p.remoteAddr, p.info.OOB()); err != nil {
  723. s.logger.Debugf("Error sending Version Negotiation: %s", err)
  724. }
  725. }