Skip to content

Commit 183061b

Browse files
Quic secure transport implementation (#407)
Quic secure transport implementation --------- Co-authored-by: Anton Nashatyrev <[email protected]>
1 parent 2e98c45 commit 183061b

File tree

17 files changed

+998
-64
lines changed

17 files changed

+998
-64
lines changed

.github/workflows/build.yml

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,12 +12,16 @@ jobs:
1212
with:
1313
distribution: temurin
1414
java-version: 11
15+
- name: Install and run ipfs
16+
run: ./install-run-ipfs.sh
1517

1618
- name: Setup Gradle
1719
uses: gradle/gradle-build-action@v2
1820

1921
- name: Setup Android SDK
20-
uses: android-actions/setup-android@v2
22+
uses: android-actions/setup-android@v3
23+
with:
24+
cmdline-tools-version: 8512546
2125

2226
- name: Execute Gradle build
2327
run: ./gradlew -s build dokkaJar

install-run-ipfs.sh

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
#! /bin/sh
2+
wget https://dist.ipfs.io/kubo/v0.34.1/kubo_v0.34.1_linux-amd64.tar.gz -O /tmp/kubo_linux-amd64.tar.gz
3+
hash="$(sha256sum /tmp/kubo_linux-amd64.tar.gz)"
4+
expected=42045802fe60c64fb01350bc071190c534d600fe269759c06e27e22b2012fd3e
5+
if [[ "$hash" != "$expected" ]]
6+
then
7+
echo "incorrect ipfs hash!" 1>&2
8+
exit 64
9+
fi
10+
tar -xvf /tmp/kubo_linux-amd64.tar.gz
11+
export PATH=$PATH:$PWD/kubo/
12+
ipfs init
13+
ipfs daemon --routing=dhtserver &

libp2p/build.gradle.kts

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,8 @@ dependencies {
1414
api("io.netty:netty-transport")
1515
implementation("io.netty:netty-handler")
1616
implementation("io.netty:netty-codec-http")
17+
implementation("io.netty:netty-transport-classes-epoll")
18+
implementation("io.netty.incubator:netty-incubator-codec-native-quic")
1719

1820
api("com.google.protobuf:protobuf-java")
1921

@@ -22,10 +24,20 @@ dependencies {
2224

2325
implementation("org.bouncycastle:bcprov-jdk18on")
2426
implementation("org.bouncycastle:bcpkix-jdk18on")
25-
implementation("org.bouncycastle:bctls-jdk18on")
2627

2728
testImplementation(project(":tools:schedulers"))
2829

30+
testImplementation("io.netty.incubator:netty-incubator-codec-native-quic::linux-x86_64")
31+
testImplementation("io.netty.incubator:netty-incubator-codec-native-quic::linux-aarch_64")
32+
testImplementation("io.netty.incubator:netty-incubator-codec-native-quic::osx-x86_64")
33+
testImplementation("io.netty.incubator:netty-incubator-codec-native-quic::osx-aarch_64")
34+
testImplementation("io.netty.incubator:netty-incubator-codec-native-quic::windows-x86_64")
35+
testImplementation("io.netty:netty-tcnative-boringssl-static:2.0.70.Final:linux-x86_64")
36+
testImplementation("io.netty:netty-tcnative-boringssl-static:2.0.70.Final:linux-aarch_64")
37+
testImplementation("io.netty:netty-tcnative-boringssl-static:2.0.70.Final:osx-x86_64")
38+
testImplementation("io.netty:netty-tcnative-boringssl-static:2.0.70.Final:osx-aarch_64")
39+
testImplementation("io.netty:netty-tcnative-boringssl-static:2.0.70.Final:windows-x86_64")
40+
2941
testFixturesApi("org.apache.logging.log4j:log4j-core")
3042
testFixturesImplementation(project(":tools:schedulers"))
3143
testFixturesImplementation("io.netty:netty-transport-classes-epoll")

libp2p/src/main/java/io/libp2p/core/dsl/HostBuilder.java

Lines changed: 19 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
package io.libp2p.core.dsl;
22

33
import io.libp2p.core.Host;
4-
import io.libp2p.core.crypto.PrivKey;
4+
import io.libp2p.core.crypto.*;
55
import io.libp2p.core.multistream.ProtocolBinding;
66
import io.libp2p.core.mux.*;
77
import io.libp2p.core.security.SecureChannel;
@@ -57,11 +57,23 @@ public final HostBuilder protocol(ProtocolBinding<?>... protocols) {
5757
return this;
5858
}
5959

60+
@SafeVarargs
61+
public final HostBuilder secureTransport(
62+
BiFunction<PrivKey, List<? extends ProtocolBinding<?>>, Transport>... transports) {
63+
secureTransports_.addAll(Arrays.asList(transports));
64+
return this;
65+
}
66+
6067
public final HostBuilder listen(String... addresses) {
6168
listenAddresses_.addAll(Arrays.asList(addresses));
6269
return this;
6370
}
6471

72+
public HostBuilder keyType(KeyType keyType) {
73+
this.keyType = keyType;
74+
return this;
75+
}
76+
6577
public final HostBuilder builderModifier(Consumer<BuilderJ> builderModifier) {
6678
this.builderModifier = builderModifier;
6779
return this;
@@ -72,8 +84,9 @@ public Host build() {
7284
return BuilderJKt.hostJ(
7385
defaultMode_.asBuilderDefault(),
7486
b -> {
75-
b.getIdentity().random();
87+
b.getIdentity().random(keyType);
7688

89+
secureTransports_.forEach(st -> b.getSecureTransports().add(st::apply));
7790
transports_.forEach(t -> b.getTransports().add(t::apply));
7891
secureChannels_.forEach(
7992
sc -> b.getSecureChannels().add((k, m) -> sc.apply(k, (List<StreamMuxer>) m)));
@@ -85,6 +98,10 @@ public Host build() {
8598
} // build
8699

87100
private DefaultMode defaultMode_;
101+
private KeyType keyType = KeyType.ECDSA;
102+
private List<BiFunction<PrivKey, List<? extends ProtocolBinding<?>>, Transport>>
103+
secureTransports_ = new ArrayList<>();
104+
88105
private List<Function<ConnectionUpgrader, Transport>> transports_ = new ArrayList<>();
89106
private List<BiFunction<PrivKey, List<StreamMuxer>, SecureChannel>> secureChannels_ =
90107
new ArrayList<>();

libp2p/src/main/kotlin/io/libp2p/core/dsl/BuilderJ.kt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ class BuilderJ : Builder() {
1919
public override val identity = super.identity
2020
public override val secureChannels = super.secureChannels
2121
public override val muxers = super.muxers
22+
public override val secureTransports = super.secureTransports
2223
public override val transports = super.transports
2324
public override val addressBook = super.addressBook
2425
public override val protocols = super.protocols

libp2p/src/main/kotlin/io/libp2p/core/dsl/Builders.kt

Lines changed: 13 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@ import io.netty.handler.logging.LoggingHandler
3737
import java.util.concurrent.CopyOnWriteArrayList
3838

3939
typealias TransportCtor = (ConnectionUpgrader) -> Transport
40+
typealias SecureTransportCtor = (PrivKey, List<ProtocolBinding<*>>) -> Transport
4041
typealias SecureChannelCtor = (PrivKey, List<StreamMuxer>) -> SecureChannel
4142
typealias IdentityFactory = () -> PrivKey
4243

@@ -58,6 +59,7 @@ open class Builder {
5859
protected open val secureChannels = SecureChannelsBuilder()
5960
protected open val muxers = MuxersBuilder()
6061
protected open val transports = TransportsBuilder()
62+
protected open val secureTransports = SecureTransportsBuilder()
6163
protected open val addressBook = AddressBookBuilder()
6264
protected open val protocols = ProtocolsBuilder()
6365
protected open val connectionHandlers = ConnectionHandlerBuilder()
@@ -126,9 +128,9 @@ open class Builder {
126128
if (def == Defaults.None) {
127129
if (identity.factory == null) throw IllegalStateException("No identity builder")
128130

129-
if (transports.values.isEmpty()) throw HostConfigurationException("at least one transport is required")
130-
if (secureChannels.values.isEmpty()) throw HostConfigurationException("at least one secure channel is required")
131-
if (muxers.values.isEmpty()) throw HostConfigurationException("at least one muxer is required")
131+
if (secureTransports.isEmpty() && transports.values.isEmpty()) throw HostConfigurationException("at least one transport is required")
132+
if (secureTransports.isEmpty() && secureChannels.values.isEmpty()) throw HostConfigurationException("at least one secure channel or secure transport is required")
133+
if (secureTransports.isEmpty() && muxers.values.isEmpty()) throw HostConfigurationException("at least one muxer or secure transport is required")
132134
}
133135
if (def == Defaults.Standard) {
134136
if (identity.factory == null) identity.random()
@@ -189,15 +191,20 @@ open class Builder {
189191

190192
val upgrader = ConnectionUpgrader(secureMultistreamProtocol, secureChannels, muxerMultistreamProtocol, muxers)
191193

192-
val transports = transports.values.map { it(upgrader) }
194+
val allTransports =
195+
listOf(
196+
transports.values.map { it(upgrader) },
197+
secureTransports.values.map { it(privKey, updatableProtocols) }
198+
).flatten()
199+
193200
val addressBook = addressBook.impl
194201

195202
val connHandlerProtocols = protocols.values.mapNotNull { it as? ConnectionHandler }
196203
val broadcastConnHandler = ConnectionHandler.createBroadcast(
197204
connHandlerProtocols +
198205
connectionHandlers.values
199206
)
200-
val networkImpl = NetworkImpl(transports, broadcastConnHandler)
207+
val networkImpl = NetworkImpl(allTransports, broadcastConnHandler)
201208

202209
return HostImpl(
203210
privKey,
@@ -230,6 +237,7 @@ class AddressBookBuilder {
230237
fun memory(): AddressBookBuilder = apply { impl = MemoryAddressBook() }
231238
}
232239

240+
class SecureTransportsBuilder : Enumeration<SecureTransportCtor>()
233241
class TransportsBuilder : Enumeration<TransportCtor>()
234242
class SecureChannelsBuilder : Enumeration<SecureChannelCtor>()
235243
class MuxersBuilder : Enumeration<StreamMuxerProtocol>()

libp2p/src/main/kotlin/io/libp2p/core/multiformats/Protocol.kt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,8 @@ enum class Protocol(
4242
DNS6(55, LENGTH_PREFIXED_VAR_SIZE, "dns6", UTF8_PARSER, UTF8_STRINGIFIER, UTF8_VALIDATOR),
4343
DNSADDR(56, LENGTH_PREFIXED_VAR_SIZE, "dnsaddr", UTF8_PARSER, UTF8_STRINGIFIER, UTF8_VALIDATOR),
4444
SCTP(132, 16, "sctp", UINT16_PARSER, UINT16_STRINGIFIER),
45+
WEBRTC_DIRECT(280, 0, "webrtc-direct"),
46+
WEBRTC(28, 0, "webrtc"),
4547
UTP(301, 0, "utp"),
4648
UDT(302, 0, "udt"),
4749
UNIX(400, LENGTH_PREFIXED_VAR_SIZE, "unix", UNIX_PATH_PARSER, UTF8_STRINGIFIER, UTF8_VALIDATOR, isPath = true),

0 commit comments

Comments
 (0)