summaryrefslogtreecommitdiffhomepage
path: root/ios/MullvadREST/Relay/Obfuscation/RelayObfuscator.swift
blob: 7abd47f30b954793f584bbf2c1f85997088b4747 (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
//
//  ObfuscatorPortSelector.swift
//  MullvadVPN
//
//  Created by Jon Petersson on 2024-11-01.
//  Copyright © 2025 Mullvad VPN AB. All rights reserved.
//

import MullvadSettings
import MullvadTypes

protocol RelayObfuscating {
    var relays: REST.ServerRelaysResponse { get }
    var tunnelSettings: LatestTunnelSettings { get }
    var connectionAttemptCount: UInt { get }
    func obfuscate() throws -> RelayObfuscation
}

struct RelayObfuscation {
    let allRelays: REST.ServerRelaysResponse
    let obfuscatedRelays: REST.ServerRelaysResponse
    let port: RelayConstraint<UInt16>
    var method: WireGuardObfuscationState
}

struct RelayObfuscator: RelayObfuscating {
    let relays: REST.ServerRelaysResponse
    let tunnelSettings: LatestTunnelSettings
    let connectionAttemptCount: UInt
    let obfuscationBypass: any ObfuscationProviding

    func obfuscate() -> RelayObfuscation {
        let obfuscationMethod = ObfuscationMethodSelector.obfuscationMethodBy(
            connectionAttemptCount: connectionAttemptCount,
            tunnelSettings: tunnelSettings,
            obfuscationBypass: obfuscationBypass
        )

        return switch obfuscationMethod {
        case .udpOverTcp:
            UdpOverTcpObfuscator(
                relays: relays,
                tunnelSettings: tunnelSettings,
                connectionAttemptCount: connectionAttemptCount
            ).obfuscate()
        case .shadowsocks:
            ShadowsocksObfuscator(
                relays: relays,
                tunnelSettings: tunnelSettings,
                connectionAttemptCount: connectionAttemptCount
            ).obfuscate()
        case .quic:
            QuicObfuscator(
                relays: relays,
                tunnelSettings: tunnelSettings,
                connectionAttemptCount: connectionAttemptCount
            ).obfuscate()
        default:
            RelayObfuscation(
                allRelays: relays,
                obfuscatedRelays: relays,
                port: tunnelSettings.relayConstraints.port,
                method: obfuscationMethod
            )
        }
    }
}