server.go 35 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105
  1. package quic
  2. import (
  3. "context"
  4. "errors"
  5. "fmt"
  6. "net"
  7. "sync"
  8. "time"
  9. tls "github.com/Psiphon-Labs/psiphon-tls"
  10. "github.com/Psiphon-Labs/quic-go/internal/handshake"
  11. "github.com/Psiphon-Labs/quic-go/internal/protocol"
  12. "github.com/Psiphon-Labs/quic-go/internal/qerr"
  13. "github.com/Psiphon-Labs/quic-go/internal/qtls"
  14. "github.com/Psiphon-Labs/quic-go/internal/utils"
  15. "github.com/Psiphon-Labs/quic-go/internal/wire"
  16. "github.com/Psiphon-Labs/quic-go/logging"
  17. )
  18. // ErrServerClosed is returned by the Listener or EarlyListener's Accept method after a call to Close.
  19. var ErrServerClosed = errServerClosed{}
  20. type errServerClosed struct{}
  21. func (errServerClosed) Error() string { return "quic: server closed" }
  22. func (errServerClosed) Unwrap() error { return net.ErrClosed }
  23. // packetHandler handles packets
  24. type packetHandler interface {
  25. handlePacket(receivedPacket)
  26. destroy(error)
  27. closeWithTransportError(qerr.TransportErrorCode)
  28. }
  29. type packetHandlerManager interface {
  30. Get(protocol.ConnectionID) (packetHandler, bool)
  31. GetByResetToken(protocol.StatelessResetToken) (packetHandler, bool)
  32. AddWithConnID(destConnID, newConnID protocol.ConnectionID, h packetHandler) bool
  33. Close(error)
  34. connRunner
  35. }
  36. type quicConn interface {
  37. EarlyConnection
  38. earlyConnReady() <-chan struct{}
  39. handlePacket(receivedPacket)
  40. run() error
  41. destroy(error)
  42. closeWithTransportError(TransportErrorCode)
  43. }
  44. type zeroRTTQueue struct {
  45. packets []receivedPacket
  46. expiration time.Time
  47. }
  48. type rejectedPacket struct {
  49. receivedPacket
  50. hdr *wire.Header
  51. }
  52. // A Listener of QUIC
  53. type baseServer struct {
  54. disableVersionNegotiation bool
  55. acceptEarlyConns bool
  56. tlsConf *tls.Config
  57. config *Config
  58. conn rawConn
  59. tokenGenerator *handshake.TokenGenerator
  60. maxTokenAge time.Duration
  61. connIDGenerator ConnectionIDGenerator
  62. statelessResetter *statelessResetter
  63. connHandler packetHandlerManager
  64. onClose func()
  65. receivedPackets chan receivedPacket
  66. nextZeroRTTCleanup time.Time
  67. zeroRTTQueues map[protocol.ConnectionID]*zeroRTTQueue // only initialized if acceptEarlyConns == true
  68. connContext func(context.Context) context.Context
  69. // set as a member, so they can be set in the tests
  70. newConn func(
  71. context.Context,
  72. context.CancelCauseFunc,
  73. sendConn,
  74. connRunner,
  75. protocol.ConnectionID, /* original dest connection ID */
  76. *protocol.ConnectionID, /* retry src connection ID */
  77. protocol.ConnectionID, /* client dest connection ID */
  78. protocol.ConnectionID, /* destination connection ID */
  79. protocol.ConnectionID, /* source connection ID */
  80. ConnectionIDGenerator,
  81. *statelessResetter,
  82. *Config,
  83. *tls.Config,
  84. *handshake.TokenGenerator,
  85. bool, /* client address validated by an address validation token */
  86. *logging.ConnectionTracer,
  87. utils.Logger,
  88. protocol.Version,
  89. ) quicConn
  90. closeMx sync.Mutex
  91. // errorChan is closed when Close is called. This has two effects:
  92. // 1. it cancels handshakes that are still in flight (using CONNECTION_REFUSED) errors
  93. // 2. it stops handling of packets passed to this server
  94. errorChan chan struct{}
  95. // acceptChan is closed when Close returns.
  96. // This only happens once all handshake in flight have either completed and canceled.
  97. // Calls to Accept will first drain the queue of connections that have completed the handshake,
  98. // and then return ErrServerClosed.
  99. stopAccepting chan struct{}
  100. closeErr error
  101. running chan struct{} // closed as soon as run() returns
  102. versionNegotiationQueue chan receivedPacket
  103. invalidTokenQueue chan rejectedPacket
  104. connectionRefusedQueue chan rejectedPacket
  105. retryQueue chan rejectedPacket
  106. handshakingCount sync.WaitGroup
  107. verifySourceAddress func(net.Addr) bool
  108. connQueue chan quicConn
  109. tracer *logging.Tracer
  110. logger utils.Logger
  111. }
  112. // A Listener listens for incoming QUIC connections.
  113. // It returns connections once the handshake has completed.
  114. type Listener struct {
  115. baseServer *baseServer
  116. }
  117. // Accept returns new connections. It should be called in a loop.
  118. func (l *Listener) Accept(ctx context.Context) (Connection, error) {
  119. return l.baseServer.Accept(ctx)
  120. }
  121. // Close closes the listener.
  122. // Accept will return ErrServerClosed as soon as all connections in the accept queue have been accepted.
  123. // QUIC handshakes that are still in flight will be rejected with a CONNECTION_REFUSED error.
  124. // The effect of closing the listener depends on how it was created:
  125. // * if it was created using Transport.Listen, already established connections will be unaffected
  126. // * if it was created using the Listen convenience method, all established connection will be closed immediately
  127. func (l *Listener) Close() error {
  128. return l.baseServer.Close()
  129. }
  130. // Addr returns the local network address that the server is listening on.
  131. func (l *Listener) Addr() net.Addr {
  132. return l.baseServer.Addr()
  133. }
  134. // An EarlyListener listens for incoming QUIC connections, and returns them before the handshake completes.
  135. // For connections that don't use 0-RTT, this allows the server to send 0.5-RTT data.
  136. // This data is encrypted with forward-secure keys, however, the client's identity has not yet been verified.
  137. // For connection using 0-RTT, this allows the server to accept and respond to streams that the client opened in the
  138. // 0-RTT data it sent. Note that at this point during the handshake, the live-ness of the
  139. // client has not yet been confirmed, and the 0-RTT data could have been replayed by an attacker.
  140. type EarlyListener struct {
  141. baseServer *baseServer
  142. }
  143. // Accept returns a new connections. It should be called in a loop.
  144. func (l *EarlyListener) Accept(ctx context.Context) (EarlyConnection, error) {
  145. return l.baseServer.accept(ctx)
  146. }
  147. // Close the server. All active connections will be closed.
  148. func (l *EarlyListener) Close() error {
  149. return l.baseServer.Close()
  150. }
  151. // Addr returns the local network addr that the server is listening on.
  152. func (l *EarlyListener) Addr() net.Addr {
  153. return l.baseServer.Addr()
  154. }
  155. // ListenAddr creates a QUIC server listening on a given address.
  156. // See Listen for more details.
  157. func ListenAddr(addr string, tlsConf *tls.Config, config *Config) (*Listener, error) {
  158. conn, err := listenUDP(addr)
  159. if err != nil {
  160. return nil, err
  161. }
  162. return (&Transport{
  163. Conn: conn,
  164. createdConn: true,
  165. isSingleUse: true,
  166. }).Listen(tlsConf, config)
  167. }
  168. // ListenAddrEarly works like ListenAddr, but it returns connections before the handshake completes.
  169. func ListenAddrEarly(addr string, tlsConf *tls.Config, config *Config) (*EarlyListener, error) {
  170. conn, err := listenUDP(addr)
  171. if err != nil {
  172. return nil, err
  173. }
  174. return (&Transport{
  175. Conn: conn,
  176. createdConn: true,
  177. isSingleUse: true,
  178. }).ListenEarly(tlsConf, config)
  179. }
  180. func listenUDP(addr string) (*net.UDPConn, error) {
  181. udpAddr, err := net.ResolveUDPAddr("udp", addr)
  182. if err != nil {
  183. return nil, err
  184. }
  185. return net.ListenUDP("udp", udpAddr)
  186. }
  187. // Listen listens for QUIC connections on a given net.PacketConn.
  188. // If the PacketConn satisfies the OOBCapablePacketConn interface (as a net.UDPConn does),
  189. // ECN and packet info support will be enabled. In this case, ReadMsgUDP and WriteMsgUDP
  190. // will be used instead of ReadFrom and WriteTo to read/write packets.
  191. // A single net.PacketConn can only be used for a single call to Listen.
  192. //
  193. // The tls.Config must not be nil and must contain a certificate configuration.
  194. // Furthermore, it must define an application control (using NextProtos).
  195. // The quic.Config may be nil, in that case the default values will be used.
  196. //
  197. // This is a convenience function. More advanced use cases should instantiate a Transport,
  198. // which offers configuration options for a more fine-grained control of the connection establishment,
  199. // including reusing the underlying UDP socket for outgoing QUIC connections.
  200. // When closing a listener created with Listen, all established QUIC connections will be closed immediately.
  201. func Listen(conn net.PacketConn, tlsConf *tls.Config, config *Config) (*Listener, error) {
  202. tr := &Transport{Conn: conn, isSingleUse: true}
  203. return tr.Listen(tlsConf, config)
  204. }
  205. // ListenEarly works like Listen, but it returns connections before the handshake completes.
  206. func ListenEarly(conn net.PacketConn, tlsConf *tls.Config, config *Config) (*EarlyListener, error) {
  207. tr := &Transport{Conn: conn, isSingleUse: true}
  208. return tr.ListenEarly(tlsConf, config)
  209. }
  210. func newServer(
  211. conn rawConn,
  212. connHandler packetHandlerManager,
  213. connIDGenerator ConnectionIDGenerator,
  214. statelessResetter *statelessResetter,
  215. connContext func(context.Context) context.Context,
  216. tlsConf *tls.Config,
  217. config *Config,
  218. tracer *logging.Tracer,
  219. onClose func(),
  220. tokenGeneratorKey TokenGeneratorKey,
  221. maxTokenAge time.Duration,
  222. verifySourceAddress func(net.Addr) bool,
  223. disableVersionNegotiation bool,
  224. acceptEarly bool,
  225. ) *baseServer {
  226. s := &baseServer{
  227. conn: conn,
  228. connContext: connContext,
  229. tlsConf: tlsConf,
  230. config: config,
  231. tokenGenerator: handshake.NewTokenGenerator(tokenGeneratorKey),
  232. maxTokenAge: maxTokenAge,
  233. verifySourceAddress: verifySourceAddress,
  234. connIDGenerator: connIDGenerator,
  235. statelessResetter: statelessResetter,
  236. connHandler: connHandler,
  237. connQueue: make(chan quicConn, protocol.MaxAcceptQueueSize),
  238. errorChan: make(chan struct{}),
  239. stopAccepting: make(chan struct{}),
  240. running: make(chan struct{}),
  241. receivedPackets: make(chan receivedPacket, protocol.MaxServerUnprocessedPackets),
  242. versionNegotiationQueue: make(chan receivedPacket, 4),
  243. invalidTokenQueue: make(chan rejectedPacket, 4),
  244. connectionRefusedQueue: make(chan rejectedPacket, 4),
  245. retryQueue: make(chan rejectedPacket, 8),
  246. newConn: newConnection,
  247. tracer: tracer,
  248. logger: utils.DefaultLogger.WithPrefix("server"),
  249. acceptEarlyConns: acceptEarly,
  250. disableVersionNegotiation: disableVersionNegotiation,
  251. onClose: onClose,
  252. }
  253. if acceptEarly {
  254. s.zeroRTTQueues = map[protocol.ConnectionID]*zeroRTTQueue{}
  255. }
  256. go s.run()
  257. go s.runSendQueue()
  258. s.logger.Debugf("Listening for %s connections on %s", conn.LocalAddr().Network(), conn.LocalAddr().String())
  259. return s
  260. }
  261. func (s *baseServer) run() {
  262. defer close(s.running)
  263. for {
  264. select {
  265. case <-s.errorChan:
  266. return
  267. default:
  268. }
  269. select {
  270. case <-s.errorChan:
  271. return
  272. case p := <-s.receivedPackets:
  273. if bufferStillInUse := s.handlePacketImpl(p); !bufferStillInUse {
  274. p.buffer.Release()
  275. }
  276. }
  277. }
  278. }
  279. func (s *baseServer) runSendQueue() {
  280. for {
  281. select {
  282. case <-s.running:
  283. return
  284. case p := <-s.versionNegotiationQueue:
  285. s.maybeSendVersionNegotiationPacket(p)
  286. case p := <-s.invalidTokenQueue:
  287. s.maybeSendInvalidToken(p)
  288. case p := <-s.connectionRefusedQueue:
  289. s.sendConnectionRefused(p)
  290. case p := <-s.retryQueue:
  291. s.sendRetry(p)
  292. }
  293. }
  294. }
  295. // Accept returns connections that already completed the handshake.
  296. // It is only valid if acceptEarlyConns is false.
  297. func (s *baseServer) Accept(ctx context.Context) (Connection, error) {
  298. return s.accept(ctx)
  299. }
  300. func (s *baseServer) accept(ctx context.Context) (quicConn, error) {
  301. select {
  302. case <-ctx.Done():
  303. return nil, ctx.Err()
  304. case conn := <-s.connQueue:
  305. return conn, nil
  306. case <-s.stopAccepting:
  307. // first drain the queue
  308. select {
  309. case conn := <-s.connQueue:
  310. return conn, nil
  311. default:
  312. }
  313. return nil, s.closeErr
  314. }
  315. }
  316. func (s *baseServer) Close() error {
  317. s.close(ErrServerClosed, true)
  318. return nil
  319. }
  320. func (s *baseServer) close(e error, notifyOnClose bool) {
  321. s.closeMx.Lock()
  322. if s.closeErr != nil {
  323. s.closeMx.Unlock()
  324. return
  325. }
  326. s.closeErr = e
  327. close(s.errorChan)
  328. <-s.running
  329. s.closeMx.Unlock()
  330. if notifyOnClose {
  331. s.onClose()
  332. }
  333. // wait until all handshakes in flight have terminated
  334. s.handshakingCount.Wait()
  335. close(s.stopAccepting)
  336. }
  337. // Addr returns the server's network address
  338. func (s *baseServer) Addr() net.Addr {
  339. return s.conn.LocalAddr()
  340. }
  341. func (s *baseServer) handlePacket(p receivedPacket) {
  342. select {
  343. case s.receivedPackets <- p:
  344. case <-s.errorChan:
  345. return
  346. default:
  347. s.logger.Debugf("Dropping packet from %s (%d bytes). Server receive queue full.", p.remoteAddr, p.Size())
  348. if s.tracer != nil && s.tracer.DroppedPacket != nil {
  349. s.tracer.DroppedPacket(p.remoteAddr, logging.PacketTypeNotDetermined, p.Size(), logging.PacketDropDOSPrevention)
  350. }
  351. }
  352. }
  353. func (s *baseServer) handlePacketImpl(p receivedPacket) bool /* is the buffer still in use? */ {
  354. if !s.nextZeroRTTCleanup.IsZero() && p.rcvTime.After(s.nextZeroRTTCleanup) {
  355. defer s.cleanupZeroRTTQueues(p.rcvTime)
  356. }
  357. if wire.IsVersionNegotiationPacket(p.data) {
  358. s.logger.Debugf("Dropping Version Negotiation packet.")
  359. if s.tracer != nil && s.tracer.DroppedPacket != nil {
  360. s.tracer.DroppedPacket(p.remoteAddr, logging.PacketTypeVersionNegotiation, p.Size(), logging.PacketDropUnexpectedPacket)
  361. }
  362. return false
  363. }
  364. // Short header packets should never end up here in the first place
  365. if !wire.IsLongHeaderPacket(p.data[0]) {
  366. panic(fmt.Sprintf("misrouted packet: %#v", p.data))
  367. }
  368. v, err := wire.ParseVersion(p.data)
  369. // drop the packet if we failed to parse the protocol version
  370. if err != nil {
  371. s.logger.Debugf("Dropping a packet with an unknown version")
  372. if s.tracer != nil && s.tracer.DroppedPacket != nil {
  373. s.tracer.DroppedPacket(p.remoteAddr, logging.PacketTypeNotDetermined, p.Size(), logging.PacketDropUnexpectedPacket)
  374. }
  375. return false
  376. }
  377. // send a Version Negotiation Packet if the client is speaking a different protocol version
  378. if !protocol.IsSupportedVersion(s.config.Versions, v) {
  379. if s.disableVersionNegotiation {
  380. return false
  381. }
  382. if p.Size() < protocol.MinUnknownVersionPacketSize {
  383. s.logger.Debugf("Dropping a packet with an unsupported version number %d that is too small (%d bytes)", v, p.Size())
  384. if s.tracer != nil && s.tracer.DroppedPacket != nil {
  385. s.tracer.DroppedPacket(p.remoteAddr, logging.PacketTypeNotDetermined, p.Size(), logging.PacketDropUnexpectedPacket)
  386. }
  387. return false
  388. }
  389. return s.enqueueVersionNegotiationPacket(p)
  390. }
  391. if wire.Is0RTTPacket(p.data) {
  392. if !s.acceptEarlyConns {
  393. if s.tracer != nil && s.tracer.DroppedPacket != nil {
  394. s.tracer.DroppedPacket(p.remoteAddr, logging.PacketType0RTT, p.Size(), logging.PacketDropUnexpectedPacket)
  395. }
  396. return false
  397. }
  398. return s.handle0RTTPacket(p)
  399. }
  400. // If we're creating a new connection, the packet will be passed to the connection.
  401. // The header will then be parsed again.
  402. hdr, _, _, err := wire.ParsePacket(p.data)
  403. if err != nil {
  404. if s.tracer != nil && s.tracer.DroppedPacket != nil {
  405. s.tracer.DroppedPacket(p.remoteAddr, logging.PacketTypeNotDetermined, p.Size(), logging.PacketDropHeaderParseError)
  406. }
  407. s.logger.Debugf("Error parsing packet: %s", err)
  408. return false
  409. }
  410. // [Psiphon]
  411. // Both Obfuscated QUIC and QUIC over WebRTC SRTP adjust the max
  412. // packet size to allow for additional overhead. Enforce a reduced
  413. // minimum initial packet size when the adjustment results in a max
  414. // packet size less than protocol.MinInitialPacketSize.
  415. minInitialPacketSize := protocol.ByteCount(protocol.MinInitialPacketSize)
  416. if s.config.ServerMaxPacketSizeAdjustment != nil {
  417. maxPacketSize := protocol.ByteCount(protocol.InitialPacketSize)
  418. adjustment := protocol.ByteCount(s.config.ServerMaxPacketSizeAdjustment(p.remoteAddr))
  419. maxPacketSize -= adjustment
  420. if maxPacketSize < 0 {
  421. maxPacketSize = 0
  422. }
  423. if maxPacketSize < minInitialPacketSize {
  424. minInitialPacketSize = maxPacketSize
  425. }
  426. }
  427. // [Psiphon]
  428. // if hdr.Type == protocol.PacketTypeInitial && p.Size() < protocol.MinInitialPacketSize {
  429. if hdr.Type == protocol.PacketTypeInitial && p.Size() < minInitialPacketSize {
  430. s.logger.Debugf("Dropping a packet that is too small to be a valid Initial (%d bytes)", p.Size())
  431. if s.tracer != nil && s.tracer.DroppedPacket != nil {
  432. s.tracer.DroppedPacket(p.remoteAddr, logging.PacketTypeInitial, p.Size(), logging.PacketDropUnexpectedPacket)
  433. }
  434. return false
  435. }
  436. if hdr.Type != protocol.PacketTypeInitial {
  437. // Drop long header packets.
  438. // There's little point in sending a Stateless Reset, since the client
  439. // might not have received the token yet.
  440. s.logger.Debugf("Dropping long header packet of type %s (%d bytes)", hdr.Type, len(p.data))
  441. if s.tracer != nil && s.tracer.DroppedPacket != nil {
  442. s.tracer.DroppedPacket(p.remoteAddr, logging.PacketTypeFromHeader(hdr), p.Size(), logging.PacketDropUnexpectedPacket)
  443. }
  444. return false
  445. }
  446. s.logger.Debugf("<- Received Initial packet.")
  447. if err := s.handleInitialImpl(p, hdr); err != nil {
  448. s.logger.Errorf("Error occurred handling initial packet: %s", err)
  449. }
  450. // Don't put the packet buffer back.
  451. // handleInitialImpl deals with the buffer.
  452. return true
  453. }
  454. func (s *baseServer) handle0RTTPacket(p receivedPacket) bool {
  455. connID, err := wire.ParseConnectionID(p.data, 0)
  456. if err != nil {
  457. if s.tracer != nil && s.tracer.DroppedPacket != nil {
  458. s.tracer.DroppedPacket(p.remoteAddr, logging.PacketType0RTT, p.Size(), logging.PacketDropHeaderParseError)
  459. }
  460. return false
  461. }
  462. // check again if we might have a connection now
  463. if handler, ok := s.connHandler.Get(connID); ok {
  464. handler.handlePacket(p)
  465. return true
  466. }
  467. if q, ok := s.zeroRTTQueues[connID]; ok {
  468. if len(q.packets) >= protocol.Max0RTTQueueLen {
  469. if s.tracer != nil && s.tracer.DroppedPacket != nil {
  470. s.tracer.DroppedPacket(p.remoteAddr, logging.PacketType0RTT, p.Size(), logging.PacketDropDOSPrevention)
  471. }
  472. return false
  473. }
  474. q.packets = append(q.packets, p)
  475. return true
  476. }
  477. if len(s.zeroRTTQueues) >= protocol.Max0RTTQueues {
  478. if s.tracer != nil && s.tracer.DroppedPacket != nil {
  479. s.tracer.DroppedPacket(p.remoteAddr, logging.PacketType0RTT, p.Size(), logging.PacketDropDOSPrevention)
  480. }
  481. return false
  482. }
  483. queue := &zeroRTTQueue{packets: make([]receivedPacket, 1, 8)}
  484. queue.packets[0] = p
  485. expiration := p.rcvTime.Add(protocol.Max0RTTQueueingDuration)
  486. queue.expiration = expiration
  487. if s.nextZeroRTTCleanup.IsZero() || s.nextZeroRTTCleanup.After(expiration) {
  488. s.nextZeroRTTCleanup = expiration
  489. }
  490. s.zeroRTTQueues[connID] = queue
  491. return true
  492. }
  493. func (s *baseServer) cleanupZeroRTTQueues(now time.Time) {
  494. // Iterate over all queues to find those that are expired.
  495. // This is ok since we're placing a pretty low limit on the number of queues.
  496. var nextCleanup time.Time
  497. for connID, q := range s.zeroRTTQueues {
  498. if q.expiration.After(now) {
  499. if nextCleanup.IsZero() || nextCleanup.After(q.expiration) {
  500. nextCleanup = q.expiration
  501. }
  502. continue
  503. }
  504. for _, p := range q.packets {
  505. if s.tracer != nil && s.tracer.DroppedPacket != nil {
  506. s.tracer.DroppedPacket(p.remoteAddr, logging.PacketType0RTT, p.Size(), logging.PacketDropDOSPrevention)
  507. }
  508. p.buffer.Release()
  509. }
  510. delete(s.zeroRTTQueues, connID)
  511. if s.logger.Debug() {
  512. s.logger.Debugf("Removing 0-RTT queue for %s.", connID)
  513. }
  514. }
  515. s.nextZeroRTTCleanup = nextCleanup
  516. }
  517. // [Psiphon]
  518. type stubCryptoSetup struct {
  519. initialOpener handshake.LongHeaderOpener
  520. }
  521. var errNotSupported = errors.New("not supported")
  522. func (s *stubCryptoSetup) StartHandshake(context.Context) error {
  523. return nil
  524. }
  525. func (s *stubCryptoSetup) Close() error {
  526. return errNotSupported
  527. }
  528. func (s *stubCryptoSetup) ChangeConnectionID(protocol.ConnectionID) {
  529. }
  530. func (s *stubCryptoSetup) GetSessionTicket() ([]byte, error) {
  531. return nil, errNotSupported
  532. }
  533. func (s *stubCryptoSetup) HandleMessage([]byte, protocol.EncryptionLevel) error {
  534. return nil
  535. }
  536. func (s *stubCryptoSetup) NextEvent() handshake.Event {
  537. return handshake.Event{}
  538. }
  539. func (s *stubCryptoSetup) SetLargest1RTTAcked(protocol.PacketNumber) error {
  540. return errNotSupported
  541. }
  542. func (s *stubCryptoSetup) DiscardInitialKeys() {
  543. }
  544. func (s *stubCryptoSetup) SetHandshakeConfirmed() {
  545. }
  546. func (s *stubCryptoSetup) ConnectionState() handshake.ConnectionState {
  547. return handshake.ConnectionState{}
  548. }
  549. func (s *stubCryptoSetup) TLSConnectionMetrics() tls.ConnectionMetrics {
  550. return tls.ConnectionMetrics{}
  551. }
  552. func (s *stubCryptoSetup) GetInitialOpener() (handshake.LongHeaderOpener, error) {
  553. return s.initialOpener, nil
  554. }
  555. func (s *stubCryptoSetup) GetHandshakeOpener() (handshake.LongHeaderOpener, error) {
  556. return nil, errNotSupported
  557. }
  558. func (s *stubCryptoSetup) Get0RTTOpener() (handshake.LongHeaderOpener, error) {
  559. return nil, errNotSupported
  560. }
  561. func (s *stubCryptoSetup) Get1RTTOpener() (handshake.ShortHeaderOpener, error) {
  562. return nil, errNotSupported
  563. }
  564. func (s *stubCryptoSetup) GetInitialSealer() (handshake.LongHeaderSealer, error) {
  565. return nil, errNotSupported
  566. }
  567. func (s *stubCryptoSetup) GetHandshakeSealer() (handshake.LongHeaderSealer, error) {
  568. return nil, errNotSupported
  569. }
  570. func (s *stubCryptoSetup) Get0RTTSealer() (handshake.LongHeaderSealer, error) {
  571. return nil, errNotSupported
  572. }
  573. func (s *stubCryptoSetup) Get1RTTSealer() (handshake.ShortHeaderSealer, error) {
  574. return nil, errNotSupported
  575. }
  576. // [Psiphon]
  577. // verifyClientHelloRandom unpacks an Initial packet, extracts the CRYPTO
  578. // frame, and calls Config.VerifyClientHelloRandom.
  579. func (s *baseServer) verifyClientHelloRandom(p receivedPacket, hdr *wire.Header) error {
  580. // TODO: support QUICv2
  581. versionNumber := protocol.Version1
  582. _, initialOpener := handshake.NewInitialAEAD(
  583. hdr.DestConnectionID, protocol.PerspectiveServer, versionNumber)
  584. cs := &stubCryptoSetup{
  585. initialOpener: initialOpener,
  586. }
  587. // Make a copy of the packet data since this unpacking modifies it and the
  588. // original packet data must be retained for subsequent processing.
  589. data := append([]byte(nil), p.data...)
  590. unpacker := newPacketUnpacker(cs, 0)
  591. unpacked, err := unpacker.UnpackLongHeader(hdr, data)
  592. if err != nil {
  593. return fmt.Errorf("verifyClientHelloRandom: UnpackLongHeader: %w", err)
  594. }
  595. parser := wire.NewFrameParser(s.config.EnableDatagrams)
  596. d := unpacked.data
  597. for len(d) > 0 {
  598. l, frame, err := parser.ParseNext(d, protocol.EncryptionInitial, versionNumber)
  599. if err != nil {
  600. return fmt.Errorf("verifyClientHelloRandom: ParseNext: %w", err)
  601. }
  602. if frame == nil {
  603. return errors.New("verifyClientHelloRandom: missing CRYPTO frame")
  604. }
  605. d = d[l:]
  606. cryptoFrame, ok := frame.(*wire.CryptoFrame)
  607. if !ok {
  608. continue
  609. }
  610. if cryptoFrame.Offset != 0 {
  611. return errors.New("verifyClientHelloRandom: unexpected CRYPTO frame offset")
  612. }
  613. random, err := qtls.ReadClientHelloRandom(cryptoFrame.Data)
  614. if err != nil {
  615. return fmt.Errorf("verifyClientHelloRandom: ReadClientHelloRandom: %w", err)
  616. }
  617. if !s.config.VerifyClientHelloRandom(p.remoteAddr, random) {
  618. return fmt.Errorf("verifyClientHelloRandom: VerifyClientHelloRandom failed")
  619. }
  620. break
  621. }
  622. return nil
  623. }
  624. // validateToken returns false if:
  625. // - address is invalid
  626. // - token is expired
  627. // - token is null
  628. func (s *baseServer) validateToken(token *handshake.Token, addr net.Addr) bool {
  629. if token == nil {
  630. return false
  631. }
  632. if !token.ValidateRemoteAddr(addr) {
  633. return false
  634. }
  635. if !token.IsRetryToken && time.Since(token.SentTime) > s.maxTokenAge {
  636. return false
  637. }
  638. if token.IsRetryToken && time.Since(token.SentTime) > s.config.maxRetryTokenAge() {
  639. return false
  640. }
  641. return true
  642. }
  643. func (s *baseServer) handleInitialImpl(p receivedPacket, hdr *wire.Header) error {
  644. if len(hdr.Token) == 0 && hdr.DestConnectionID.Len() < protocol.MinConnectionIDLenInitial {
  645. if s.tracer != nil && s.tracer.DroppedPacket != nil {
  646. s.tracer.DroppedPacket(p.remoteAddr, logging.PacketTypeInitial, p.Size(), logging.PacketDropUnexpectedPacket)
  647. }
  648. p.buffer.Release()
  649. return errors.New("too short connection ID")
  650. }
  651. // The server queues packets for a while, and we might already have established a connection by now.
  652. // This results in a second check in the connection map.
  653. // That's ok since it's not the hot path (it's only taken by some Initial and 0-RTT packets).
  654. if handler, ok := s.connHandler.Get(hdr.DestConnectionID); ok {
  655. handler.handlePacket(p)
  656. return nil
  657. }
  658. // [Psiphon]
  659. // A new connection is being established.
  660. // Assumes the packet contains the first CRYPTO frame with the ClientHello random.
  661. // Drops the Initial packet if verifyClientHelloRandom fails.
  662. if s.config.VerifyClientHelloRandom != nil {
  663. err := s.verifyClientHelloRandom(p, hdr)
  664. if err != nil {
  665. p.buffer.Release()
  666. return err
  667. }
  668. }
  669. var (
  670. token *handshake.Token
  671. retrySrcConnID *protocol.ConnectionID
  672. clientAddrVerified bool
  673. )
  674. origDestConnID := hdr.DestConnectionID
  675. if len(hdr.Token) > 0 {
  676. tok, err := s.tokenGenerator.DecodeToken(hdr.Token)
  677. if err == nil {
  678. if tok.IsRetryToken {
  679. origDestConnID = tok.OriginalDestConnectionID
  680. retrySrcConnID = &tok.RetrySrcConnectionID
  681. }
  682. token = tok
  683. }
  684. }
  685. if token != nil {
  686. clientAddrVerified = s.validateToken(token, p.remoteAddr)
  687. if !clientAddrVerified {
  688. // For invalid and expired non-retry tokens, we don't send an INVALID_TOKEN error.
  689. // We just ignore them, and act as if there was no token on this packet at all.
  690. // This also means we might send a Retry later.
  691. if !token.IsRetryToken {
  692. token = nil
  693. } else {
  694. // For Retry tokens, we send an INVALID_ERROR if
  695. // * the token is too old, or
  696. // * the token is invalid, in case of a retry token.
  697. select {
  698. case s.invalidTokenQueue <- rejectedPacket{receivedPacket: p, hdr: hdr}:
  699. default:
  700. // drop packet if we can't send out the INVALID_TOKEN packets fast enough
  701. p.buffer.Release()
  702. }
  703. return nil
  704. }
  705. }
  706. }
  707. if token == nil && s.verifySourceAddress != nil && s.verifySourceAddress(p.remoteAddr) {
  708. // Retry invalidates all 0-RTT packets sent.
  709. delete(s.zeroRTTQueues, hdr.DestConnectionID)
  710. select {
  711. case s.retryQueue <- rejectedPacket{receivedPacket: p, hdr: hdr}:
  712. default:
  713. // drop packet if we can't send out Retry packets fast enough
  714. p.buffer.Release()
  715. }
  716. return nil
  717. }
  718. config := s.config
  719. if s.config.GetConfigForClient != nil {
  720. conf, err := s.config.GetConfigForClient(&ClientHelloInfo{
  721. RemoteAddr: p.remoteAddr,
  722. AddrVerified: clientAddrVerified,
  723. })
  724. if err != nil {
  725. s.logger.Debugf("Rejecting new connection due to GetConfigForClient callback")
  726. delete(s.zeroRTTQueues, hdr.DestConnectionID)
  727. select {
  728. case s.connectionRefusedQueue <- rejectedPacket{receivedPacket: p, hdr: hdr}:
  729. default:
  730. // drop packet if we can't send out the CONNECTION_REFUSED fast enough
  731. p.buffer.Release()
  732. }
  733. return nil
  734. }
  735. config = populateConfig(conf)
  736. }
  737. var conn quicConn
  738. var cancel context.CancelCauseFunc
  739. ctx, cancel1 := context.WithCancelCause(context.Background())
  740. if s.connContext != nil {
  741. ctx = s.connContext(ctx)
  742. if ctx == nil {
  743. panic("quic: ConnContext returned nil")
  744. }
  745. // There's no guarantee that the application returns a context
  746. // that's derived from the context we passed into ConnContext.
  747. // We need to make sure that both contexts are cancelled.
  748. var cancel2 context.CancelCauseFunc
  749. ctx, cancel2 = context.WithCancelCause(ctx)
  750. cancel = func(cause error) {
  751. cancel1(cause)
  752. cancel2(cause)
  753. }
  754. } else {
  755. cancel = cancel1
  756. }
  757. ctx = context.WithValue(ctx, ConnectionTracingKey, nextConnTracingID())
  758. var tracer *logging.ConnectionTracer
  759. if config.Tracer != nil {
  760. // Use the same connection ID that is passed to the client's GetLogWriter callback.
  761. connID := hdr.DestConnectionID
  762. if origDestConnID.Len() > 0 {
  763. connID = origDestConnID
  764. }
  765. tracer = config.Tracer(ctx, protocol.PerspectiveServer, connID)
  766. }
  767. connID, err := s.connIDGenerator.GenerateConnectionID()
  768. if err != nil {
  769. return err
  770. }
  771. s.logger.Debugf("Changing connection ID to %s.", connID)
  772. conn = s.newConn(
  773. ctx,
  774. cancel,
  775. newSendConn(s.conn, p.remoteAddr, p.info, s.logger),
  776. s.connHandler,
  777. origDestConnID,
  778. retrySrcConnID,
  779. hdr.DestConnectionID,
  780. hdr.SrcConnectionID,
  781. connID,
  782. s.connIDGenerator,
  783. s.statelessResetter,
  784. config,
  785. s.tlsConf,
  786. s.tokenGenerator,
  787. clientAddrVerified,
  788. tracer,
  789. s.logger,
  790. hdr.Version,
  791. )
  792. conn.handlePacket(p)
  793. // Adding the connection will fail if the client's chosen Destination Connection ID is already in use.
  794. // This is very unlikely: Even if an attacker chooses a connection ID that's already in use,
  795. // under normal circumstances the packet would just be routed to that connection.
  796. // The only time this collision will occur if we receive the two Initial packets at the same time.
  797. if added := s.connHandler.AddWithConnID(hdr.DestConnectionID, connID, conn); !added {
  798. delete(s.zeroRTTQueues, hdr.DestConnectionID)
  799. conn.closeWithTransportError(qerr.ConnectionRefused)
  800. return nil
  801. }
  802. // Pass queued 0-RTT to the newly established connection.
  803. if q, ok := s.zeroRTTQueues[hdr.DestConnectionID]; ok {
  804. for _, p := range q.packets {
  805. conn.handlePacket(p)
  806. }
  807. delete(s.zeroRTTQueues, hdr.DestConnectionID)
  808. }
  809. s.handshakingCount.Add(1)
  810. go func() {
  811. defer s.handshakingCount.Done()
  812. s.handleNewConn(conn)
  813. }()
  814. go conn.run()
  815. return nil
  816. }
  817. func (s *baseServer) handleNewConn(conn quicConn) {
  818. if s.acceptEarlyConns {
  819. // wait until the early connection is ready, the handshake fails, or the server is closed
  820. select {
  821. case <-s.errorChan:
  822. conn.closeWithTransportError(ConnectionRefused)
  823. return
  824. case <-conn.Context().Done():
  825. return
  826. case <-conn.earlyConnReady():
  827. }
  828. } else {
  829. // wait until the handshake completes, fails, or the server is closed
  830. select {
  831. case <-s.errorChan:
  832. conn.closeWithTransportError(ConnectionRefused)
  833. return
  834. case <-conn.Context().Done():
  835. return
  836. case <-conn.HandshakeComplete():
  837. }
  838. }
  839. select {
  840. case s.connQueue <- conn:
  841. default:
  842. conn.closeWithTransportError(ConnectionRefused)
  843. }
  844. }
  845. func (s *baseServer) sendRetry(p rejectedPacket) {
  846. if err := s.sendRetryPacket(p); err != nil {
  847. s.logger.Debugf("Error sending Retry packet: %s", err)
  848. }
  849. }
  850. func (s *baseServer) sendRetryPacket(p rejectedPacket) error {
  851. hdr := p.hdr
  852. // Log the Initial packet now.
  853. // If no Retry is sent, the packet will be logged by the connection.
  854. (&wire.ExtendedHeader{Header: *hdr}).Log(s.logger)
  855. srcConnID, err := s.connIDGenerator.GenerateConnectionID()
  856. if err != nil {
  857. return err
  858. }
  859. token, err := s.tokenGenerator.NewRetryToken(p.remoteAddr, hdr.DestConnectionID, srcConnID)
  860. if err != nil {
  861. return err
  862. }
  863. replyHdr := &wire.ExtendedHeader{}
  864. replyHdr.Type = protocol.PacketTypeRetry
  865. replyHdr.Version = hdr.Version
  866. replyHdr.SrcConnectionID = srcConnID
  867. replyHdr.DestConnectionID = hdr.SrcConnectionID
  868. replyHdr.Token = token
  869. if s.logger.Debug() {
  870. s.logger.Debugf("Changing connection ID to %s.", srcConnID)
  871. s.logger.Debugf("-> Sending Retry")
  872. replyHdr.Log(s.logger)
  873. }
  874. buf := getPacketBuffer()
  875. defer buf.Release()
  876. buf.Data, err = replyHdr.Append(buf.Data, hdr.Version)
  877. if err != nil {
  878. return err
  879. }
  880. // append the Retry integrity tag
  881. tag := handshake.GetRetryIntegrityTag(buf.Data, hdr.DestConnectionID, hdr.Version)
  882. buf.Data = append(buf.Data, tag[:]...)
  883. if s.tracer != nil && s.tracer.SentPacket != nil {
  884. s.tracer.SentPacket(p.remoteAddr, &replyHdr.Header, protocol.ByteCount(len(buf.Data)), nil)
  885. }
  886. _, err = s.conn.WritePacket(buf.Data, p.remoteAddr, p.info.OOB(), 0, protocol.ECNUnsupported)
  887. return err
  888. }
  889. func (s *baseServer) maybeSendInvalidToken(p rejectedPacket) {
  890. defer p.buffer.Release()
  891. // Only send INVALID_TOKEN if we can unprotect the packet.
  892. // This makes sure that we won't send it for packets that were corrupted.
  893. hdr := p.hdr
  894. sealer, opener := handshake.NewInitialAEAD(hdr.DestConnectionID, protocol.PerspectiveServer, hdr.Version)
  895. data := p.data[:hdr.ParsedLen()+hdr.Length]
  896. extHdr, err := unpackLongHeader(opener, hdr, data)
  897. // Only send INVALID_TOKEN if we can unprotect the packet.
  898. // This makes sure that we won't send it for packets that were corrupted.
  899. if err != nil {
  900. if s.tracer != nil && s.tracer.DroppedPacket != nil {
  901. s.tracer.DroppedPacket(p.remoteAddr, logging.PacketTypeInitial, p.Size(), logging.PacketDropHeaderParseError)
  902. }
  903. return
  904. }
  905. hdrLen := extHdr.ParsedLen()
  906. if _, err := opener.Open(data[hdrLen:hdrLen], data[hdrLen:], extHdr.PacketNumber, data[:hdrLen]); err != nil {
  907. if s.tracer != nil && s.tracer.DroppedPacket != nil {
  908. s.tracer.DroppedPacket(p.remoteAddr, logging.PacketTypeInitial, p.Size(), logging.PacketDropPayloadDecryptError)
  909. }
  910. return
  911. }
  912. if s.logger.Debug() {
  913. s.logger.Debugf("Client sent an invalid retry token. Sending INVALID_TOKEN to %s.", p.remoteAddr)
  914. }
  915. if err := s.sendError(p.remoteAddr, hdr, sealer, qerr.InvalidToken, p.info); err != nil {
  916. s.logger.Debugf("Error sending INVALID_TOKEN error: %s", err)
  917. }
  918. }
  919. func (s *baseServer) sendConnectionRefused(p rejectedPacket) {
  920. defer p.buffer.Release()
  921. sealer, _ := handshake.NewInitialAEAD(p.hdr.DestConnectionID, protocol.PerspectiveServer, p.hdr.Version)
  922. if err := s.sendError(p.remoteAddr, p.hdr, sealer, qerr.ConnectionRefused, p.info); err != nil {
  923. s.logger.Debugf("Error sending CONNECTION_REFUSED error: %s", err)
  924. }
  925. }
  926. // sendError sends the error as a response to the packet received with header hdr
  927. func (s *baseServer) sendError(remoteAddr net.Addr, hdr *wire.Header, sealer handshake.LongHeaderSealer, errorCode qerr.TransportErrorCode, info packetInfo) error {
  928. b := getPacketBuffer()
  929. defer b.Release()
  930. ccf := &wire.ConnectionCloseFrame{ErrorCode: uint64(errorCode)}
  931. replyHdr := &wire.ExtendedHeader{}
  932. replyHdr.Type = protocol.PacketTypeInitial
  933. replyHdr.Version = hdr.Version
  934. replyHdr.SrcConnectionID = hdr.DestConnectionID
  935. replyHdr.DestConnectionID = hdr.SrcConnectionID
  936. replyHdr.PacketNumberLen = protocol.PacketNumberLen4
  937. replyHdr.Length = 4 /* packet number len */ + ccf.Length(hdr.Version) + protocol.ByteCount(sealer.Overhead())
  938. var err error
  939. b.Data, err = replyHdr.Append(b.Data, hdr.Version)
  940. if err != nil {
  941. return err
  942. }
  943. payloadOffset := len(b.Data)
  944. b.Data, err = ccf.Append(b.Data, hdr.Version)
  945. if err != nil {
  946. return err
  947. }
  948. _ = sealer.Seal(b.Data[payloadOffset:payloadOffset], b.Data[payloadOffset:], replyHdr.PacketNumber, b.Data[:payloadOffset])
  949. b.Data = b.Data[0 : len(b.Data)+sealer.Overhead()]
  950. pnOffset := payloadOffset - int(replyHdr.PacketNumberLen)
  951. sealer.EncryptHeader(
  952. b.Data[pnOffset+4:pnOffset+4+16],
  953. &b.Data[0],
  954. b.Data[pnOffset:payloadOffset],
  955. )
  956. replyHdr.Log(s.logger)
  957. wire.LogFrame(s.logger, ccf, true)
  958. if s.tracer != nil && s.tracer.SentPacket != nil {
  959. s.tracer.SentPacket(remoteAddr, &replyHdr.Header, protocol.ByteCount(len(b.Data)), []logging.Frame{ccf})
  960. }
  961. _, err = s.conn.WritePacket(b.Data, remoteAddr, info.OOB(), 0, protocol.ECNUnsupported)
  962. return err
  963. }
  964. func (s *baseServer) enqueueVersionNegotiationPacket(p receivedPacket) (bufferInUse bool) {
  965. select {
  966. case s.versionNegotiationQueue <- p:
  967. return true
  968. default:
  969. // it's fine to not send version negotiation packets when we are busy
  970. }
  971. return false
  972. }
  973. func (s *baseServer) maybeSendVersionNegotiationPacket(p receivedPacket) {
  974. defer p.buffer.Release()
  975. v, err := wire.ParseVersion(p.data)
  976. if err != nil {
  977. s.logger.Debugf("failed to parse version for sending version negotiation packet: %s", err)
  978. return
  979. }
  980. _, src, dest, err := wire.ParseArbitraryLenConnectionIDs(p.data)
  981. if err != nil { // should never happen
  982. s.logger.Debugf("Dropping a packet with an unknown version for which we failed to parse connection IDs")
  983. if s.tracer != nil && s.tracer.DroppedPacket != nil {
  984. s.tracer.DroppedPacket(p.remoteAddr, logging.PacketTypeNotDetermined, p.Size(), logging.PacketDropUnexpectedPacket)
  985. }
  986. return
  987. }
  988. s.logger.Debugf("Client offered version %s, sending Version Negotiation", v)
  989. data := wire.ComposeVersionNegotiation(dest, src, s.config.Versions)
  990. if s.tracer != nil && s.tracer.SentVersionNegotiationPacket != nil {
  991. s.tracer.SentVersionNegotiationPacket(p.remoteAddr, src, dest, s.config.Versions)
  992. }
  993. if _, err := s.conn.WritePacket(data, p.remoteAddr, p.info.OOB(), 0, protocol.ECNUnsupported); err != nil {
  994. s.logger.Debugf("Error sending Version Negotiation: %s", err)
  995. }
  996. }