Skip to content

Commit 1592802

Browse files
set a static QUIC resumption token generator key
1 parent dbf25b6 commit 1592802

File tree

12 files changed

+52
-28
lines changed

12 files changed

+52
-28
lines changed

config/config.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -261,6 +261,7 @@ func (cfg *Config) addTransports(h host.Host) error {
261261
}
262262

263263
fxopts = append(fxopts, fx.Provide(PrivKeyToStatelessResetKey))
264+
fxopts = append(fxopts, fx.Provide(PrivKeyToTokenGeneratorKey))
264265
if cfg.QUICReuse != nil {
265266
fxopts = append(fxopts, cfg.QUICReuse...)
266267
} else {
Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,10 @@ import (
1111
"github.com/quic-go/quic-go"
1212
)
1313

14-
const statelessResetKeyInfo = "libp2p quic stateless reset key"
14+
const (
15+
statelessResetKeyInfo = "libp2p quic stateless reset key"
16+
tokenGeneratorKeyInfo = "libp2p quic token generator key"
17+
)
1518

1619
func PrivKeyToStatelessResetKey(key crypto.PrivKey) (quic.StatelessResetKey, error) {
1720
var statelessResetKey quic.StatelessResetKey
@@ -25,3 +28,16 @@ func PrivKeyToStatelessResetKey(key crypto.PrivKey) (quic.StatelessResetKey, err
2528
}
2629
return statelessResetKey, nil
2730
}
31+
32+
func PrivKeyToTokenGeneratorKey(key crypto.PrivKey) (quic.TokenGeneratorKey, error) {
33+
var tokenKey quic.TokenGeneratorKey
34+
keyBytes, err := key.Raw()
35+
if err != nil {
36+
return tokenKey, err
37+
}
38+
keyReader := hkdf.New(sha256.New, keyBytes, nil, []byte(tokenGeneratorKeyInfo))
39+
if _, err := io.ReadFull(keyReader, tokenKey[:]); err != nil {
40+
return tokenKey, err
41+
}
42+
return tokenKey, nil
43+
}

p2p/net/swarm/dial_worker_test.go

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -26,12 +26,13 @@ import (
2626
"github.com/libp2p/go-libp2p/p2p/host/peerstore/pstoremem"
2727
"github.com/libp2p/go-libp2p/p2p/muxer/yamux"
2828
tptu "github.com/libp2p/go-libp2p/p2p/net/upgrader"
29-
quic "github.com/libp2p/go-libp2p/p2p/transport/quic"
29+
libp2pquic "github.com/libp2p/go-libp2p/p2p/transport/quic"
3030
"github.com/libp2p/go-libp2p/p2p/transport/quicreuse"
3131
"github.com/libp2p/go-libp2p/p2p/transport/tcp"
3232

3333
ma "github.com/multiformats/go-multiaddr"
3434
manet "github.com/multiformats/go-multiaddr/net"
35+
"github.com/quic-go/quic-go"
3536
"github.com/stretchr/testify/require"
3637
)
3738

@@ -88,11 +89,11 @@ func makeSwarmWithNoListenAddrs(t *testing.T, opts ...Option) *Swarm {
8889
if err := s.AddTransport(tcpTransport); err != nil {
8990
t.Fatal(err)
9091
}
91-
reuse, err := quicreuse.NewConnManager([32]byte{})
92+
reuse, err := quicreuse.NewConnManager(quic.StatelessResetKey{}, quic.TokenGeneratorKey{})
9293
if err != nil {
9394
t.Fatal(err)
9495
}
95-
quicTransport, err := quic.NewTransport(priv, reuse, nil, nil, nil)
96+
quicTransport, err := libp2pquic.NewTransport(priv, reuse, nil, nil, nil)
9697
if err != nil {
9798
t.Fatal(err)
9899
}
@@ -968,7 +969,7 @@ func TestDialWorkerLoopHolePunching(t *testing.T) {
968969
for i := 0; i < len(addrs); i++ {
969970
delay := 10 * time.Second
970971
if addrs[i].Equal(t1) {
971-
//fire t1 immediately
972+
// fire t1 immediately
972973
delay = 0
973974
} else if addrs[i].Equal(t2) {
974975
// delay t2 by 100ms

p2p/net/swarm/swarm_addr_test.go

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -14,14 +14,15 @@ import (
1414
"github.com/libp2p/go-libp2p/p2p/net/swarm"
1515
swarmt "github.com/libp2p/go-libp2p/p2p/net/swarm/testing"
1616
circuitv2 "github.com/libp2p/go-libp2p/p2p/protocol/circuitv2/client"
17-
quic "github.com/libp2p/go-libp2p/p2p/transport/quic"
17+
libp2pquic "github.com/libp2p/go-libp2p/p2p/transport/quic"
1818
"github.com/libp2p/go-libp2p/p2p/transport/quicreuse"
1919
"github.com/libp2p/go-libp2p/p2p/transport/tcp"
2020
webtransport "github.com/libp2p/go-libp2p/p2p/transport/webtransport"
2121

2222
ma "github.com/multiformats/go-multiaddr"
2323
"github.com/multiformats/go-multibase"
2424
"github.com/multiformats/go-multihash"
25+
"github.com/quic-go/quic-go"
2526
"github.com/stretchr/testify/require"
2627
)
2728

@@ -81,10 +82,10 @@ func TestDialAddressSelection(t *testing.T) {
8182
tcpTr, err := tcp.NewTCPTransport(nil, nil)
8283
require.NoError(t, err)
8384
require.NoError(t, s.AddTransport(tcpTr))
84-
reuse, err := quicreuse.NewConnManager([32]byte{})
85+
reuse, err := quicreuse.NewConnManager(quic.StatelessResetKey{}, quic.TokenGeneratorKey{})
8586
require.NoError(t, err)
8687
defer reuse.Close()
87-
quicTr, err := quic.NewTransport(priv, reuse, nil, nil, nil)
88+
quicTr, err := libp2pquic.NewTransport(priv, reuse, nil, nil, nil)
8889
require.NoError(t, err)
8990
require.NoError(t, s.AddTransport(quicTr))
9091
webtransportTr, err := webtransport.New(priv, nil, reuse, nil, nil)

p2p/net/swarm/swarm_dial_test.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -139,7 +139,7 @@ func newTestSwarmWithResolver(t *testing.T, resolver *madns.Resolver) *Swarm {
139139
err = s.AddTransport(tpt)
140140
require.NoError(t, err)
141141

142-
connmgr, err := quicreuse.NewConnManager(quic.StatelessResetKey{})
142+
connmgr, err := quicreuse.NewConnManager(quic.StatelessResetKey{}, quic.TokenGeneratorKey{})
143143
require.NoError(t, err)
144144
quicTpt, err := libp2pquic.NewTransport(priv, connmgr, nil, nil, &network.NullResourceManager{})
145145
require.NoError(t, err)

p2p/net/swarm/testing/testing.go

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -21,11 +21,12 @@ import (
2121
"github.com/libp2p/go-libp2p/p2p/muxer/yamux"
2222
"github.com/libp2p/go-libp2p/p2p/net/swarm"
2323
tptu "github.com/libp2p/go-libp2p/p2p/net/upgrader"
24-
quic "github.com/libp2p/go-libp2p/p2p/transport/quic"
24+
libp2pquic "github.com/libp2p/go-libp2p/p2p/transport/quic"
2525
"github.com/libp2p/go-libp2p/p2p/transport/quicreuse"
2626
"github.com/libp2p/go-libp2p/p2p/transport/tcp"
2727

2828
ma "github.com/multiformats/go-multiaddr"
29+
"github.com/quic-go/quic-go"
2930
"github.com/stretchr/testify/require"
3031
)
3132

@@ -175,11 +176,11 @@ func GenSwarm(t *testing.T, opts ...Option) *swarm.Swarm {
175176
}
176177
}
177178
if !cfg.disableQUIC {
178-
reuse, err := quicreuse.NewConnManager([32]byte{})
179+
reuse, err := quicreuse.NewConnManager(quic.StatelessResetKey{}, quic.TokenGeneratorKey{})
179180
if err != nil {
180181
t.Fatal(err)
181182
}
182-
quicTransport, err := quic.NewTransport(priv, reuse, nil, cfg.connectionGater, nil)
183+
quicTransport, err := libp2pquic.NewTransport(priv, reuse, nil, cfg.connectionGater, nil)
183184
if err != nil {
184185
t.Fatal(err)
185186
}

p2p/transport/quic/cmd/client/main.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,13 +8,13 @@ import (
88
"log"
99
"os"
1010

11-
"github.com/libp2p/go-libp2p/p2p/transport/quicreuse"
12-
1311
ic "github.com/libp2p/go-libp2p/core/crypto"
1412
"github.com/libp2p/go-libp2p/core/peer"
1513
libp2pquic "github.com/libp2p/go-libp2p/p2p/transport/quic"
14+
"github.com/libp2p/go-libp2p/p2p/transport/quicreuse"
1615

1716
ma "github.com/multiformats/go-multiaddr"
17+
"github.com/quic-go/quic-go"
1818
)
1919

2020
func main() {
@@ -41,7 +41,7 @@ func run(raddr string, p string) error {
4141
return err
4242
}
4343

44-
reuse, err := quicreuse.NewConnManager([32]byte{})
44+
reuse, err := quicreuse.NewConnManager(quic.StatelessResetKey{}, quic.TokenGeneratorKey{})
4545
if err != nil {
4646
return err
4747
}

p2p/transport/quic/cmd/server/main.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,14 +7,14 @@ import (
77
"log"
88
"os"
99

10-
"github.com/libp2p/go-libp2p/p2p/transport/quicreuse"
11-
1210
ic "github.com/libp2p/go-libp2p/core/crypto"
1311
"github.com/libp2p/go-libp2p/core/peer"
1412
tpt "github.com/libp2p/go-libp2p/core/transport"
1513
libp2pquic "github.com/libp2p/go-libp2p/p2p/transport/quic"
14+
"github.com/libp2p/go-libp2p/p2p/transport/quicreuse"
1615

1716
ma "github.com/multiformats/go-multiaddr"
17+
"github.com/quic-go/quic-go"
1818
)
1919

2020
func main() {
@@ -41,7 +41,7 @@ func run(port string) error {
4141
return err
4242
}
4343

44-
reuse, err := quicreuse.NewConnManager([32]byte{})
44+
reuse, err := quicreuse.NewConnManager(quic.StatelessResetKey{}, quic.TokenGeneratorKey{})
4545
if err != nil {
4646
return err
4747
}

p2p/transport/quic/conn_test.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -69,7 +69,7 @@ func runServer(t *testing.T, tr tpt.Transport, addr string) tpt.Listener {
6969

7070
func newConnManager(t *testing.T, opts ...quicreuse.Option) *quicreuse.ConnManager {
7171
t.Helper()
72-
cm, err := quicreuse.NewConnManager([32]byte{}, opts...)
72+
cm, err := quicreuse.NewConnManager(quic.StatelessResetKey{}, quic.TokenGeneratorKey{}, opts...)
7373
require.NoError(t, err)
7474
t.Cleanup(func() { cm.Close() })
7575
return cm

p2p/transport/quicreuse/connmgr.go

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -25,20 +25,23 @@ type ConnManager struct {
2525
quicListenersMu sync.Mutex
2626
quicListeners map[string]quicListenerEntry
2727

28-
srk quic.StatelessResetKey
29-
mt *metricsTracer
28+
srk quic.StatelessResetKey
29+
tokenKey quic.TokenGeneratorKey
30+
31+
mt *metricsTracer
3032
}
3133

3234
type quicListenerEntry struct {
3335
refCount int
3436
ln *quicListener
3537
}
3638

37-
func NewConnManager(statelessResetKey quic.StatelessResetKey, opts ...Option) (*ConnManager, error) {
39+
func NewConnManager(statelessResetKey quic.StatelessResetKey, tokenKey quic.TokenGeneratorKey, opts ...Option) (*ConnManager, error) {
3840
cm := &ConnManager{
3941
enableReuseport: true,
4042
quicListeners: make(map[string]quicListenerEntry),
4143
srk: statelessResetKey,
44+
tokenKey: tokenKey,
4245
}
4346
for _, o := range opts {
4447
if err := o(cm); err != nil {
@@ -153,6 +156,7 @@ func (c *ConnManager) transportForListen(network string, laddr *net.UDPAddr) (re
153156
Transport: quic.Transport{
154157
Conn: conn,
155158
StatelessResetKey: &c.srk,
159+
TokenGeneratorKey: &c.tokenKey,
156160
// The multiaddress encodes the QUIC version, thus there's no need to send Version Negotiation packets.
157161
DisableVersionNegotiationPackets: true,
158162
},

0 commit comments

Comments
 (0)