Преглед изворни кода

Updated vendored Psiphon-Labs/quic-go

Rod Hynes пре 5 година
родитељ
комит
6486c83fdf

+ 1 - 1
vendor/github.com/Psiphon-Labs/quic-go/conn_generic.go

@@ -1,4 +1,4 @@
-// +build !darwin,!linux
+// +build !darwin,!linux,!windows
 
 package quic
 

+ 1 - 4
vendor/github.com/Psiphon-Labs/quic-go/conn_id_manager.go

@@ -30,7 +30,6 @@ type connIDManager struct {
 
 	addStatelessResetToken    func(protocol.StatelessResetToken)
 	removeStatelessResetToken func(protocol.StatelessResetToken)
-	retireStatelessResetToken func(protocol.StatelessResetToken)
 	queueControlFrame         func(wire.Frame)
 }
 
@@ -38,7 +37,6 @@ func newConnIDManager(
 	initialDestConnID protocol.ConnectionID,
 	addStatelessResetToken func(protocol.StatelessResetToken),
 	removeStatelessResetToken func(protocol.StatelessResetToken),
-	retireStatelessResetToken func(protocol.StatelessResetToken),
 	queueControlFrame func(wire.Frame),
 ) *connIDManager {
 	b := make([]byte, 8)
@@ -48,7 +46,6 @@ func newConnIDManager(
 		activeConnectionID:        initialDestConnID,
 		addStatelessResetToken:    addStatelessResetToken,
 		removeStatelessResetToken: removeStatelessResetToken,
-		retireStatelessResetToken: retireStatelessResetToken,
 		queueControlFrame:         queueControlFrame,
 		rand:                      mrand.New(mrand.NewSource(seed)),
 	}
@@ -150,7 +147,7 @@ func (h *connIDManager) updateConnectionID() {
 	})
 	h.highestRetired = utils.MaxUint64(h.highestRetired, h.activeSequenceNumber)
 	if h.activeStatelessResetToken != nil {
-		h.retireStatelessResetToken(*h.activeStatelessResetToken)
+		h.removeStatelessResetToken(*h.activeStatelessResetToken)
 	}
 
 	front := h.queue.Remove(h.queue.Front())

+ 37 - 0
vendor/github.com/Psiphon-Labs/quic-go/conn_windows.go

@@ -0,0 +1,37 @@
+// +build windows
+
+package quic
+
+import (
+	"errors"
+	"fmt"
+	"net"
+	"syscall"
+
+	"golang.org/x/sys/windows"
+)
+
+func newConn(c net.PacketConn) (connection, error) {
+	return &basicConn{PacketConn: c}, nil
+}
+
+func inspectReadBuffer(c net.PacketConn) (int, error) {
+	conn, ok := c.(interface {
+		SyscallConn() (syscall.RawConn, error)
+	})
+	if !ok {
+		return 0, errors.New("doesn't have a SyscallConn")
+	}
+	rawConn, err := conn.SyscallConn()
+	if err != nil {
+		return 0, fmt.Errorf("couldn't get syscall.RawConn: %w", err)
+	}
+	var size int
+	var serr error
+	if err := rawConn.Control(func(fd uintptr) {
+		size, serr = windows.GetsockoptInt(windows.Handle(fd), syscall.SOL_SOCKET, syscall.SO_RCVBUF)
+	}); err != nil {
+		return 0, err
+	}
+	return size, serr
+}

+ 1 - 0
vendor/github.com/Psiphon-Labs/quic-go/go.mod

@@ -17,6 +17,7 @@ require (
 	golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9
 	golang.org/x/net v0.0.0-20200707034311-ab3426394381
 	golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e
+	golang.org/x/sys v0.0.0-20200519105757-fe76b779f299
 	google.golang.org/protobuf v1.23.0
 	gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127 // indirect
 )

+ 19 - 5
vendor/github.com/Psiphon-Labs/quic-go/http3/server.go

@@ -7,6 +7,7 @@ import (
 	"errors"
 	"fmt"
 	"io"
+	"math"
 	"net"
 	"net/http"
 	"runtime"
@@ -22,6 +23,13 @@ import (
 	"github.com/marten-seemann/qpack"
 )
 
+func init() {
+	// Chrome compatibility mode:
+	// Chrome 87 doesn't support key updates (support was added in Chrome 88).
+	// Don't initiate key updates to avoid breaking large downloads.
+	handshake.KeyUpdateInterval = math.MaxUint64
+}
+
 // allows mocking of quic.Listen and quic.ListenAddr
 var (
 	quicListen     = quic.ListenEarly
@@ -140,18 +148,24 @@ func (s *Server) serveImpl(tlsConf *tls.Config, conn net.PacketConn) error {
 			if qconn, ok := ch.Conn.(handshake.ConnWithVersion); ok && qconn.GetQUICVersion() == quic.VersionDraft32 {
 				proto = nextProtoH3Draft32
 			}
-			conf := tlsConf
+			config := tlsConf
 			if tlsConf.GetConfigForClient != nil {
 				getConfigForClient := tlsConf.GetConfigForClient
 				var err error
-				conf, err = getConfigForClient(ch)
+				conf, err := getConfigForClient(ch)
 				if err != nil {
 					return nil, err
 				}
+				if conf != nil {
+					config = conf
+				}
+			}
+			if config == nil {
+				return nil, nil
 			}
-			conf = conf.Clone()
-			conf.NextProtos = []string{proto}
-			return conf, nil
+			config = config.Clone()
+			config.NextProtos = []string{proto}
+			return config, nil
 		},
 	}
 

+ 9 - 1
vendor/github.com/Psiphon-Labs/quic-go/internal/handshake/aead.go

@@ -6,6 +6,7 @@ import (
 
 	"github.com/Psiphon-Labs/quic-go/internal/protocol"
 	"github.com/Psiphon-Labs/quic-go/internal/qtls"
+	"github.com/Psiphon-Labs/quic-go/internal/utils"
 )
 
 func createAEAD(suite *qtls.CipherSuiteTLS13, trafficSecret []byte) cipher.AEAD {
@@ -50,6 +51,7 @@ func (s *longHeaderSealer) Overhead() int {
 type longHeaderOpener struct {
 	aead            cipher.AEAD
 	headerProtector headerProtector
+	highestRcvdPN   protocol.PacketNumber // highest packet number received (which could be successfully unprotected)
 
 	// use a single slice to avoid allocations
 	nonceBuf []byte
@@ -65,12 +67,18 @@ func newLongHeaderOpener(aead cipher.AEAD, headerProtector headerProtector) Long
 	}
 }
 
+func (o *longHeaderOpener) DecodePacketNumber(wirePN protocol.PacketNumber, wirePNLen protocol.PacketNumberLen) protocol.PacketNumber {
+	return protocol.DecodePacketNumber(wirePNLen, o.highestRcvdPN, wirePN)
+}
+
 func (o *longHeaderOpener) Open(dst, src []byte, pn protocol.PacketNumber, ad []byte) ([]byte, error) {
 	binary.BigEndian.PutUint64(o.nonceBuf[len(o.nonceBuf)-8:], uint64(pn))
 	// The AEAD we're using here will be the qtls.aeadAESGCM13.
 	// It uses the nonce provided here and XOR it with the IV.
 	dec, err := o.aead.Open(dst, o.nonceBuf, src, ad)
-	if err != nil {
+	if err == nil {
+		o.highestRcvdPN = utils.MaxPacketNumber(o.highestRcvdPN, pn)
+	} else {
 		err = ErrDecryptionFailed
 	}
 	return dec, err

+ 2 - 0
vendor/github.com/Psiphon-Labs/quic-go/internal/handshake/interface.go

@@ -33,12 +33,14 @@ type headerDecryptor interface {
 // LongHeaderOpener opens a long header packet
 type LongHeaderOpener interface {
 	headerDecryptor
+	DecodePacketNumber(wirePN protocol.PacketNumber, wirePNLen protocol.PacketNumberLen) protocol.PacketNumber
 	Open(dst, src []byte, pn protocol.PacketNumber, associatedData []byte) ([]byte, error)
 }
 
 // ShortHeaderOpener opens a short header packet
 type ShortHeaderOpener interface {
 	headerDecryptor
+	DecodePacketNumber(wirePN protocol.PacketNumber, wirePNLen protocol.PacketNumberLen) protocol.PacketNumber
 	Open(dst, src []byte, rcvTime time.Time, pn protocol.PacketNumber, kp protocol.KeyPhaseBit, associatedData []byte) ([]byte, error)
 }
 

+ 8 - 0
vendor/github.com/Psiphon-Labs/quic-go/internal/handshake/updatable_aead.go

@@ -37,6 +37,7 @@ type updatableAEAD struct {
 
 	firstRcvdWithCurrentKey protocol.PacketNumber
 	firstSentWithCurrentKey protocol.PacketNumber
+	highestRcvdPN           protocol.PacketNumber // highest packet number received (which could be successfully unprotected)
 	numRcvdWithCurrentKey   uint64
 	numSentWithCurrentKey   uint64
 	rcvAEAD                 cipher.AEAD
@@ -153,6 +154,10 @@ func (a *updatableAEAD) setAEADParameters(aead cipher.AEAD, suite *qtls.CipherSu
 	}
 }
 
+func (a *updatableAEAD) DecodePacketNumber(wirePN protocol.PacketNumber, wirePNLen protocol.PacketNumberLen) protocol.PacketNumber {
+	return protocol.DecodePacketNumber(wirePNLen, a.highestRcvdPN, wirePN)
+}
+
 func (a *updatableAEAD) Open(dst, src []byte, rcvTime time.Time, pn protocol.PacketNumber, kp protocol.KeyPhaseBit, ad []byte) ([]byte, error) {
 	dec, err := a.open(dst, src, rcvTime, pn, kp, ad)
 	if err == ErrDecryptionFailed {
@@ -161,6 +166,9 @@ func (a *updatableAEAD) Open(dst, src []byte, rcvTime time.Time, pn protocol.Pac
 			return nil, qerr.AEADLimitReached
 		}
 	}
+	if err == nil {
+		a.highestRcvdPN = utils.MaxPacketNumber(a.highestRcvdPN, pn)
+	}
 	return dec, err
 }
 

+ 19 - 23
vendor/github.com/Psiphon-Labs/quic-go/packet_handler_map.go

@@ -4,9 +4,9 @@ import (
 	"crypto/hmac"
 	"crypto/rand"
 	"crypto/sha256"
+	"errors"
 	"fmt"
 	"hash"
-	"log"
 	"net"
 	"sync"
 	"time"
@@ -54,40 +54,38 @@ type packetHandlerMap struct {
 
 var _ packetHandlerManager = &packetHandlerMap{}
 
-func setReceiveBuffer(c net.PacketConn, logger utils.Logger) {
+func setReceiveBuffer(c net.PacketConn, logger utils.Logger) error {
 	conn, ok := c.(interface{ SetReadBuffer(int) error })
 	if !ok {
-		logger.Debugf("Connection doesn't allow setting of receive buffer size")
-		return
+		return errors.New("connection doesn't allow setting of receive buffer size")
 	}
 	size, err := inspectReadBuffer(c)
 	if err != nil {
-		log.Printf("Failed to determine receive buffer size: %s", err)
-		return
+		return fmt.Errorf("failed to determine receive buffer size: %w", err)
 	}
 	if size >= protocol.DesiredReceiveBufferSize {
 		logger.Debugf("Conn has receive buffer of %d kiB (wanted: at least %d kiB)", size/1024, protocol.DesiredReceiveBufferSize/1024)
 	}
 	if err := conn.SetReadBuffer(protocol.DesiredReceiveBufferSize); err != nil {
-		log.Printf("Failed to increase receive buffer size: %s\n", err)
-		return
+		return fmt.Errorf("failed to increase receive buffer size: %w", err)
 	}
 	newSize, err := inspectReadBuffer(c)
 	if err != nil {
-		log.Printf("Failed to determine receive buffer size: %s", err)
-		return
+		return fmt.Errorf("failed to determine receive buffer size: %w", err)
 	}
 	if newSize == size {
-		log.Printf("Failed to determine receive buffer size: %s", err)
-		return
+		return fmt.Errorf("failed to determine receive buffer size: %w", err)
 	}
 	if newSize < protocol.DesiredReceiveBufferSize {
-		log.Printf("Failed to sufficiently increase receive buffer size. Was: %d kiB, wanted: %d kiB, got: %d kiB.", size/1024, protocol.DesiredReceiveBufferSize/1024, newSize/1024)
-		return
+		return fmt.Errorf("failed to sufficiently increase receive buffer size (was: %d kiB, wanted: %d kiB, got: %d kiB)", size/1024, protocol.DesiredReceiveBufferSize/1024, newSize/1024)
 	}
 	logger.Debugf("Increased receive buffer size to %d kiB", newSize/1024)
+	return nil
 }
 
+// only print warnings about the UPD receive buffer size once
+var receiveBufferWarningOnce sync.Once
+
 func newPacketHandlerMap(
 	c net.PacketConn,
 	connIDLen int,
@@ -95,7 +93,13 @@ func newPacketHandlerMap(
 	tracer logging.Tracer,
 	logger utils.Logger,
 ) (packetHandlerManager, error) {
-	setReceiveBuffer(c, logger)
+	if err := setReceiveBuffer(c, logger); err != nil {
+		receiveBufferWarningOnce.Do(func() {
+			// [Psiphon]
+			// Do not unconditionally emit alert to stderr (was log.Printf).
+			logger.Errorf("%s. See https://github.com/lucas-clemente/quic-go/wiki/UDP-Receive-Buffer-Size for details.", err)
+		})
+	}
 	conn, err := wrapConn(c)
 	if err != nil {
 		return nil, err
@@ -222,14 +226,6 @@ func (h *packetHandlerMap) RemoveResetToken(token protocol.StatelessResetToken)
 	h.mutex.Unlock()
 }
 
-func (h *packetHandlerMap) RetireResetToken(token protocol.StatelessResetToken) {
-	time.AfterFunc(h.deleteRetiredSessionsAfter, func() {
-		h.mutex.Lock()
-		delete(h.resetTokens, token)
-		h.mutex.Unlock()
-	})
-}
-
 func (h *packetHandlerMap) SetServer(s unknownPacketHandler) {
 	h.mutex.Lock()
 	h.server = s

+ 2 - 11
vendor/github.com/Psiphon-Labs/quic-go/packet_unpacker.go

@@ -7,7 +7,6 @@ import (
 
 	"github.com/Psiphon-Labs/quic-go/internal/handshake"
 	"github.com/Psiphon-Labs/quic-go/internal/protocol"
-	"github.com/Psiphon-Labs/quic-go/internal/utils"
 	"github.com/Psiphon-Labs/quic-go/internal/wire"
 )
 
@@ -43,8 +42,6 @@ type unpackedPacket struct {
 type packetUnpacker struct {
 	cs handshake.CryptoSetup
 
-	largestRcvdPacketNumber protocol.PacketNumber
-
 	version protocol.VersionNumber
 }
 
@@ -111,9 +108,6 @@ func (u *packetUnpacker) Unpack(hdr *wire.Header, rcvTime time.Time, data []byte
 		}
 	}
 
-	// Only do this after decrypting, so we are sure the packet is not attacker-controlled
-	u.largestRcvdPacketNumber = utils.MaxPacketNumber(u.largestRcvdPacketNumber, extHdr.PacketNumber)
-
 	return &unpackedPacket{
 		hdr:             extHdr,
 		packetNumber:    extHdr.PacketNumber,
@@ -131,6 +125,7 @@ func (u *packetUnpacker) unpackLongHeaderPacket(opener handshake.LongHeaderOpene
 		return nil, nil, parseErr
 	}
 	extHdrLen := extHdr.ParsedLen()
+	extHdr.PacketNumber = opener.DecodePacketNumber(extHdr.PacketNumber, extHdr.PacketNumberLen)
 	decrypted, err := opener.Open(data[extHdrLen:extHdrLen], data[extHdrLen:], extHdr.PacketNumber, data[:extHdrLen])
 	if err != nil {
 		return nil, nil, err
@@ -154,6 +149,7 @@ func (u *packetUnpacker) unpackShortHeaderPacket(
 	if parseErr != nil && parseErr != wire.ErrInvalidReservedBits {
 		return nil, nil, parseErr
 	}
+	extHdr.PacketNumber = opener.DecodePacketNumber(extHdr.PacketNumber, extHdr.PacketNumberLen)
 	extHdrLen := extHdr.ParsedLen()
 	decrypted, err := opener.Open(data[extHdrLen:extHdrLen], data[extHdrLen:], rcvTime, extHdr.PacketNumber, extHdr.KeyPhase, data[:extHdrLen])
 	if err != nil {
@@ -171,11 +167,6 @@ func (u *packetUnpacker) unpackHeader(hd headerDecryptor, hdr *wire.Header, data
 	if err != nil && err != wire.ErrInvalidReservedBits {
 		return nil, &headerParseError{err: err}
 	}
-	extHdr.PacketNumber = protocol.DecodePacketNumber(
-		extHdr.PacketNumberLen,
-		u.largestRcvdPacketNumber,
-		extHdr.PacketNumber,
-	)
 	return extHdr, err
 }
 

+ 1 - 4
vendor/github.com/Psiphon-Labs/quic-go/session.go

@@ -88,7 +88,6 @@ type sessionRunner interface {
 	ReplaceWithClosed(protocol.ConnectionID, packetHandler)
 	AddResetToken(protocol.StatelessResetToken, packetHandler)
 	RemoveResetToken(protocol.StatelessResetToken)
-	RetireResetToken(protocol.StatelessResetToken)
 }
 
 type handshakeRunner struct {
@@ -258,7 +257,6 @@ var newSession = func(
 		destConnID,
 		func(token protocol.StatelessResetToken) { runner.AddResetToken(token, s) },
 		runner.RemoveResetToken,
-		runner.RetireResetToken,
 		s.queueControlFrame,
 	)
 	s.connIDGenerator = newConnIDGenerator(
@@ -382,7 +380,6 @@ var newClientSession = func(
 		destConnID,
 		func(token protocol.StatelessResetToken) { runner.AddResetToken(token, s) },
 		runner.RemoveResetToken,
-		runner.RetireResetToken,
 		s.queueControlFrame,
 	)
 	s.connIDGenerator = newConnIDGenerator(
@@ -1583,9 +1580,9 @@ func (s *session) sendPackedPacket(packet *packedPacket) {
 	if s.firstAckElicitingPacketAfterIdleSentTime.IsZero() && packet.IsAckEliciting() {
 		s.firstAckElicitingPacketAfterIdleSentTime = now
 	}
+	s.logPacket(now, packet)
 	s.sentPacketHandler.SentPacket(packet.ToAckHandlerPacket(time.Now(), s.retransmissionQueue))
 	s.connIDManager.SentPacket()
-	s.logPacket(now, packet)
 	s.sendQueue.Send(packet.buffer)
 }
 

+ 33 - 33
vendor/vendor.json

@@ -57,94 +57,94 @@
 			"revisionTime": "2019-12-04T18:36:04Z"
 		},
 		{
-			"checksumSHA1": "GK6yxA2FG2zJB/0NqDmgiASSoLE=",
+			"checksumSHA1": "/eBUPgTc9Ql15oGglSxjIaLpS5A=",
 			"path": "github.com/Psiphon-Labs/quic-go",
-			"revision": "d7266c5396355cea3fe05b725838f021cca6af59",
-			"revisionTime": "2020-12-02T16:56:33Z"
+			"revision": "82f9bc8be76dee83b53e61f18b5cf14311f7d05e",
+			"revisionTime": "2021-01-15T21:18:48Z"
 		},
 		{
-			"checksumSHA1": "tBYGe9f6B5iUN3NbheY0CWZrGoA=",
+			"checksumSHA1": "I7ksrXW08I/9ILniHWq7HaZmKzw=",
 			"path": "github.com/Psiphon-Labs/quic-go/http3",
-			"revision": "d7266c5396355cea3fe05b725838f021cca6af59",
-			"revisionTime": "2020-12-02T16:56:33Z"
+			"revision": "82f9bc8be76dee83b53e61f18b5cf14311f7d05e",
+			"revisionTime": "2021-01-15T21:18:48Z"
 		},
 		{
 			"checksumSHA1": "ambpP2sKCBYvSzh44FVpQ6pYwZ8=",
 			"path": "github.com/Psiphon-Labs/quic-go/internal/ackhandler",
-			"revision": "d7266c5396355cea3fe05b725838f021cca6af59",
-			"revisionTime": "2020-12-02T16:56:33Z"
+			"revision": "82f9bc8be76dee83b53e61f18b5cf14311f7d05e",
+			"revisionTime": "2021-01-15T21:18:48Z"
 		},
 		{
 			"checksumSHA1": "WCg7hgtQJK0DnRDIEMr2YfPp4wk=",
 			"path": "github.com/Psiphon-Labs/quic-go/internal/congestion",
-			"revision": "d7266c5396355cea3fe05b725838f021cca6af59",
-			"revisionTime": "2020-12-02T16:56:33Z"
+			"revision": "82f9bc8be76dee83b53e61f18b5cf14311f7d05e",
+			"revisionTime": "2021-01-15T21:18:48Z"
 		},
 		{
 			"checksumSHA1": "9GXkZrLquGYM01PwaX6MP08xGuQ=",
 			"path": "github.com/Psiphon-Labs/quic-go/internal/flowcontrol",
-			"revision": "d7266c5396355cea3fe05b725838f021cca6af59",
-			"revisionTime": "2020-12-02T16:56:33Z"
+			"revision": "82f9bc8be76dee83b53e61f18b5cf14311f7d05e",
+			"revisionTime": "2021-01-15T21:18:48Z"
 		},
 		{
-			"checksumSHA1": "YazsZbvGO5c7ltk8MtM8Gg1LtwA=",
+			"checksumSHA1": "/woCa9iNDYaG0uEo1FAOsblsd5Y=",
 			"path": "github.com/Psiphon-Labs/quic-go/internal/handshake",
-			"revision": "d7266c5396355cea3fe05b725838f021cca6af59",
-			"revisionTime": "2020-12-02T16:56:33Z"
+			"revision": "82f9bc8be76dee83b53e61f18b5cf14311f7d05e",
+			"revisionTime": "2021-01-15T21:18:48Z"
 		},
 		{
 			"checksumSHA1": "/r6Ozpkx2VLJ8JoqyOM1bUZy0v8=",
 			"path": "github.com/Psiphon-Labs/quic-go/internal/logutils",
-			"revision": "d7266c5396355cea3fe05b725838f021cca6af59",
-			"revisionTime": "2020-12-02T16:56:33Z"
+			"revision": "82f9bc8be76dee83b53e61f18b5cf14311f7d05e",
+			"revisionTime": "2021-01-15T21:18:48Z"
 		},
 		{
 			"checksumSHA1": "CIDoN88aThNKa4KvjzkZRIerXag=",
 			"path": "github.com/Psiphon-Labs/quic-go/internal/protocol",
-			"revision": "d7266c5396355cea3fe05b725838f021cca6af59",
-			"revisionTime": "2020-12-02T16:56:33Z"
+			"revision": "82f9bc8be76dee83b53e61f18b5cf14311f7d05e",
+			"revisionTime": "2021-01-15T21:18:48Z"
 		},
 		{
 			"checksumSHA1": "lhu4Lr4fSeZZO1myoFfcTOkCgV4=",
 			"path": "github.com/Psiphon-Labs/quic-go/internal/qerr",
-			"revision": "d7266c5396355cea3fe05b725838f021cca6af59",
-			"revisionTime": "2020-12-02T16:56:33Z"
+			"revision": "82f9bc8be76dee83b53e61f18b5cf14311f7d05e",
+			"revisionTime": "2021-01-15T21:18:48Z"
 		},
 		{
 			"checksumSHA1": "ske0BJIybzKin07P0tRj37dEkHk=",
 			"path": "github.com/Psiphon-Labs/quic-go/internal/qtls",
-			"revision": "d7266c5396355cea3fe05b725838f021cca6af59",
-			"revisionTime": "2020-12-02T16:56:33Z"
+			"revision": "82f9bc8be76dee83b53e61f18b5cf14311f7d05e",
+			"revisionTime": "2021-01-15T21:18:48Z"
 		},
 		{
 			"checksumSHA1": "mXT+EXkTcZheIzM/len7KpQLVnU=",
 			"path": "github.com/Psiphon-Labs/quic-go/internal/utils",
-			"revision": "d7266c5396355cea3fe05b725838f021cca6af59",
-			"revisionTime": "2020-12-02T16:56:33Z"
+			"revision": "82f9bc8be76dee83b53e61f18b5cf14311f7d05e",
+			"revisionTime": "2021-01-15T21:18:48Z"
 		},
 		{
 			"checksumSHA1": "F5NruavAqKXVwLiKfBG+ufXIC6M=",
 			"path": "github.com/Psiphon-Labs/quic-go/internal/wire",
-			"revision": "d7266c5396355cea3fe05b725838f021cca6af59",
-			"revisionTime": "2020-12-02T16:56:33Z"
+			"revision": "82f9bc8be76dee83b53e61f18b5cf14311f7d05e",
+			"revisionTime": "2021-01-15T21:18:48Z"
 		},
 		{
 			"checksumSHA1": "/59zrlheA3LrtXasYja/eiqHdEc=",
 			"path": "github.com/Psiphon-Labs/quic-go/logging",
-			"revision": "d7266c5396355cea3fe05b725838f021cca6af59",
-			"revisionTime": "2020-12-02T16:56:33Z"
+			"revision": "82f9bc8be76dee83b53e61f18b5cf14311f7d05e",
+			"revisionTime": "2021-01-15T21:18:48Z"
 		},
 		{
 			"checksumSHA1": "fDKLR1SlCjRzEYN43depFkyeOoU=",
 			"path": "github.com/Psiphon-Labs/quic-go/quictrace",
-			"revision": "d7266c5396355cea3fe05b725838f021cca6af59",
-			"revisionTime": "2020-12-02T16:56:33Z"
+			"revision": "82f9bc8be76dee83b53e61f18b5cf14311f7d05e",
+			"revisionTime": "2021-01-15T21:18:48Z"
 		},
 		{
 			"checksumSHA1": "SKs8m23QDphWNaZNDhVrprkJFpg=",
 			"path": "github.com/Psiphon-Labs/quic-go/quictrace/pb",
-			"revision": "d7266c5396355cea3fe05b725838f021cca6af59",
-			"revisionTime": "2020-12-02T16:56:33Z"
+			"revision": "82f9bc8be76dee83b53e61f18b5cf14311f7d05e",
+			"revisionTime": "2021-01-15T21:18:48Z"
 		},
 		{
 			"checksumSHA1": "udq1ER8m9FUb3+G39Li2Q3bBi7g=",