server.go 25 KB

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