1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
|
//
// PostQuantumKeyExchangingPipeline.swift
// PacketTunnel
//
// Created by Mojgan on 2024-07-15.
// Copyright © 2025 Mullvad VPN AB. All rights reserved.
//
import MullvadRustRuntime
import MullvadSettings
import MullvadTypes
import PacketTunnelCore
import WireGuardKitTypes
final public class EphemeralPeerExchangingPipeline {
let keyExchanger: EphemeralPeerExchangeActorProtocol
let onUpdateConfiguration: (EphemeralPeerNegotiationState) async -> Void
let onFinish: () -> Void
private var ephemeralPeerExchanger: EphemeralPeerExchangingProtocol!
public init(
_ keyExchanger: EphemeralPeerExchangeActorProtocol,
onUpdateConfiguration: @escaping (EphemeralPeerNegotiationState) async -> Void,
onFinish: @escaping () -> Void
) {
self.keyExchanger = keyExchanger
self.onUpdateConfiguration = onUpdateConfiguration
self.onFinish = onFinish
}
public func startNegotiation(_ connectionState: ObservedConnectionState, privateKey: PrivateKey) async {
keyExchanger.reset()
let entryPeer = connectionState.selectedRelays.entry
let exitPeer = connectionState.selectedRelays.exit
let enablePostQuantum = connectionState.isPostQuantum
let enableDaita = connectionState.isDaitaEnabled
if let entryPeer {
ephemeralPeerExchanger = MultiHopEphemeralPeerExchanger(
entry: entryPeer,
exit: exitPeer,
devicePrivateKey: privateKey,
keyExchanger: keyExchanger,
enablePostQuantum: enablePostQuantum,
enableDaita: enableDaita,
onUpdateConfiguration: self.onUpdateConfiguration,
onFinish: onFinish
)
} else {
ephemeralPeerExchanger = SingleHopEphemeralPeerExchanger(
exit: exitPeer,
devicePrivateKey: privateKey,
keyExchanger: keyExchanger,
enablePostQuantum: enablePostQuantum,
enableDaita: enableDaita,
onUpdateConfiguration: self.onUpdateConfiguration,
onFinish: onFinish
)
}
await ephemeralPeerExchanger.start()
}
public func receivePostQuantumKey(
_ key: PreSharedKey,
ephemeralKey: PrivateKey,
daitaParameters: DaitaV2Parameters?
) async {
await ephemeralPeerExchanger.receivePostQuantumKey(
key,
ephemeralKey: ephemeralKey,
daitaParameters: daitaParameters
)
}
public func receiveEphemeralPeerPrivateKey(
_ ephemeralPeerPrivateKey: PrivateKey,
daitaParameters: DaitaV2Parameters?
) async {
await ephemeralPeerExchanger.receiveEphemeralPeerPrivateKey(
ephemeralPeerPrivateKey,
daitaParameters: daitaParameters
)
}
}
|