summaryrefslogtreecommitdiffhomepage
path: root/ios/PacketTunnel/PostQuantum/EphemeralPeerExchangingPipeline.swift
blob: 8bae11877b6f0df9b564aea91179f18ac035d7cf (plain)
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
        )
    }
}