Skip to content

Commit e8cc6c7

Browse files
committed
feat: quic
1 parent d615896 commit e8cc6c7

File tree

4 files changed

+38
-16
lines changed

4 files changed

+38
-16
lines changed

libp2p/builders.nim

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@ import services/wildcardresolverservice
3838
export switch, peerid, peerinfo, connection, multiaddress, crypto, errors
3939

4040
type
41-
TransportProvider* {.public.} = proc(upgr: Upgrade): Transport {.gcsafe, raises: [].}
41+
TransportProvider* {.public.} = proc(upgr: Upgrade, privateKey: PrivateKey): Transport {.gcsafe, raises: [].}
4242

4343
SecureProtocol* {.pure.} = enum
4444
Noise
@@ -151,7 +151,7 @@ proc withTransport*(
151151
let switch = SwitchBuilder
152152
.new()
153153
.withTransport(
154-
proc(upgr: Upgrade): Transport =
154+
proc(upgr: Upgrade, privateKey: PrivateKey): Transport =
155155
TcpTransport.new(flags, upgr)
156156
)
157157
.build()
@@ -162,7 +162,7 @@ proc withTcpTransport*(
162162
b: SwitchBuilder, flags: set[ServerFlags] = {}
163163
): SwitchBuilder {.public.} =
164164
b.withTransport(
165-
proc(upgr: Upgrade): Transport =
165+
proc(upgr: Upgrade, privateKey: PrivateKey): Transport =
166166
TcpTransport.new(flags, upgr)
167167
)
168168

@@ -270,7 +270,7 @@ proc build*(b: SwitchBuilder): Switch {.raises: [LPError], public.} =
270270
let transports = block:
271271
var transports: seq[Transport]
272272
for tProvider in b.transports:
273-
transports.add(tProvider(muxedUpgrade))
273+
transports.add(tProvider(muxedUpgrade, seckey))
274274
transports
275275

276276
if b.secureManagers.len == 0:

libp2p/transports/quictransport.nim

Lines changed: 27 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2,13 +2,15 @@ import std/sequtils
22
import pkg/chronos
33
import pkg/chronicles
44
import pkg/quic
5+
import results
56
import ../multiaddress
67
import ../multicodec
78
import ../stream/connection
89
import ../wire
910
import ../muxers/muxer
1011
import ../upgrademngrs/upgrade
1112
import ./transport
13+
import tls/certificate
1214

1315
export multiaddress
1416
export multicodec
@@ -138,20 +140,40 @@ type QuicUpgrade = ref object of Upgrade
138140

139141
type QuicTransport* = ref object of Transport
140142
listener: Listener
143+
privateKey: PrivateKey
141144
connections: seq[P2PConnection]
142145

143-
func new*(_: type QuicTransport, u: Upgrade): QuicTransport =
144-
QuicTransport(upgrader: QuicUpgrade(ms: u.ms))
146+
func new*(_: type QuicTransport, u: Upgrade, privateKey: PrivateKey): QuicTransport =
147+
QuicTransport(
148+
upgrader: QuicUpgrade(ms: u.ms),
149+
privateKey: privateKey,
150+
)
145151

146-
method handles*(transport: QuicTransport, address: MultiAddress): bool =
152+
method handles*(transport: QuicTransport, address: MultiAddress): bool {.raises:[].} =
147153
if not procCall Transport(transport).handles(address):
148154
return false
149155
QUIC_V1.match(address)
150156

151157
method start*(transport: QuicTransport, addrs: seq[MultiAddress]) {.async.} =
152158
doAssert transport.listener.isNil, "start() already called"
153159
#TODO handle multiple addr
154-
transport.listener = listen(initTAddress(addrs[0]).tryGet)
160+
161+
let pubkey = transport.privateKey.getPublicKey().valueOr:
162+
doAssert false, "could not obtain public key"
163+
return
164+
165+
let keypair = KeyPair(
166+
seckey: transport.privateKey,
167+
pubkey: pubkey
168+
)
169+
170+
let certPair = generate(keypair, EncodingFormat.PEM)
171+
let tlsConfig = TLSConfig(
172+
certificate: certPair[0],
173+
key: certPair[1],
174+
)
175+
176+
transport.listener = listen(initTAddress(addrs[0]).tryGet, tlsConfig)
155177
await procCall Transport(transport).start(addrs)
156178
transport.addrs[0] =
157179
MultiAddress.init(transport.listener.localAddress(), IPPROTO_UDP).tryGet() &
@@ -169,7 +191,7 @@ method stop*(transport: QuicTransport) {.async.} =
169191

170192
proc wrapConnection(
171193
transport: QuicTransport, connection: QuicConnection
172-
): P2PConnection {.raises: [Defect, TransportOsError, LPError].} =
194+
): P2PConnection {.raises: [TransportOsError, LPError].} =
173195
let
174196
remoteAddr = connection.remoteAddress()
175197
observedAddr =

libp2p/transports/tortransport.nim

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -274,7 +274,7 @@ proc new*(
274274
flags: set[ServerFlags] = {},
275275
): TorSwitch {.raises: [LPError], public.} =
276276
var builder = SwitchBuilder.new().withRng(rng).withTransport(
277-
proc(upgr: Upgrade): Transport =
277+
proc(upgr: Upgrade, privateKey: PrivateKey): Transport =
278278
TorTransport.new(torServer, flags, upgr)
279279
)
280280
if addresses.len != 0:

tests/testswitch.nim

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -948,7 +948,7 @@ suite "Switch":
948948
.withRng(crypto.newRng())
949949
.withMplex()
950950
.withTransport(
951-
proc(upgr: Upgrade): Transport =
951+
proc(upgr: Upgrade, privateKey: PrivateKey): Transport =
952952
WsTransport.new(upgr)
953953
)
954954
.withNameResolver(resolver)
@@ -961,7 +961,7 @@ suite "Switch":
961961
.withRng(crypto.newRng())
962962
.withMplex()
963963
.withTransport(
964-
proc(upgr: Upgrade): Transport =
964+
proc(upgr: Upgrade, privateKey: PrivateKey): Transport =
965965
WsTransport.new(upgr)
966966
)
967967
.withTcpTransport()
@@ -1001,8 +1001,8 @@ suite "Switch":
10011001
.withAddress(quicAddress1)
10021002
.withRng(crypto.newRng())
10031003
.withTransport(
1004-
proc(upgr: Upgrade): Transport =
1005-
QuicTransport.new(upgr)
1004+
proc(upgr: Upgrade, privateKey: PrivateKey): Transport =
1005+
QuicTransport.new(upgr, privateKey)
10061006
)
10071007
.withNoise()
10081008
.build()
@@ -1012,8 +1012,8 @@ suite "Switch":
10121012
.withAddress(quicAddress2)
10131013
.withRng(crypto.newRng())
10141014
.withTransport(
1015-
proc(upgr: Upgrade): Transport =
1016-
QuicTransport.new(upgr)
1015+
proc(upgr: Upgrade, privateKey: PrivateKey): Transport =
1016+
QuicTransport.new(upgr, privateKey)
10171017
)
10181018
.withNoise()
10191019
.build()

0 commit comments

Comments
 (0)