summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorEmīls <emils@mullvad.net>2026-04-07 16:01:43 +0200
committerJon Petersson <jon.petersson@mullvad.net>2026-04-13 13:19:02 +0200
commit17aef424c77788244d86381d56aba7f391de5270 (patch)
tree18f1837d81d24dae8f813ec5209436a7725e64fe
parent6b125665a5b490c1c284356686c3aa8d0ff30d88 (diff)
downloadmullvadvpn-17aef424c77788244d86381d56aba7f391de5270.tar.xz
mullvadvpn-17aef424c77788244d86381d56aba7f391de5270.zip
Replace IPAddressRange from WireGuardKit with ours
-rw-r--r--ios/MullvadMockData/MullvadTypes/DeviceMock.swift3
-rw-r--r--ios/MullvadRustRuntimeTests/IPAddressRangeTests.swift227
-rw-r--r--ios/MullvadSettings/StoredDeviceData.swift1
-rw-r--r--ios/MullvadSettings/TunnelSettingsV1.swift4
-rw-r--r--ios/MullvadTypes/IPAddressRange.swift147
-rw-r--r--ios/MullvadTypes/RESTTypes.swift3
-rw-r--r--ios/MullvadVPN.xcodeproj/project.pbxproj4
-rw-r--r--ios/MullvadVPN/View controllers/DeviceList/DeviceManaging.swift4
-rw-r--r--ios/MullvadVPNTests/MullvadVPN/PacketTunnel/DeviceCheck/DeviceCheckOperationTests.swift4
-rw-r--r--ios/MullvadVPNTests/MullvadVPN/TunnelManager/StartTunnelOperationTests.swift3
-rw-r--r--ios/MullvadVPNTests/MullvadVPN/TunnelManager/WgKeyRotationTests.swift3
-rw-r--r--ios/PacketTunnel/PostQuantum/MultiHopEphemeralPeerExchanger.swift4
-rw-r--r--ios/PacketTunnel/PostQuantum/SingleHopEphemeralPeerExchanger.swift4
-rw-r--r--ios/PacketTunnel/WireGuardAdapter/WgAdapter.swift10
-rw-r--r--ios/PacketTunnelCore/Actor/ConfigurationBuilder.swift5
-rw-r--r--ios/PacketTunnelCore/Actor/ConnectionConfigurationBuilder.swift3
-rw-r--r--ios/PacketTunnelCore/Actor/EphemeralPeerNegotiationState.swift4
-rw-r--r--ios/PacketTunnelCore/Actor/PacketTunnelActor+ErrorState.swift4
-rw-r--r--ios/PacketTunnelCore/Actor/Protocols/SettingsReaderProtocol.swift3
-rw-r--r--ios/PacketTunnelCore/Actor/Protocols/TunnelAdapterProtocol.swift6
-rw-r--r--ios/PacketTunnelCoreTests/Mocks/SettingsReaderStub.swift3
-rw-r--r--ios/PacketTunnelCoreTests/PacketTunnelActorTests.swift3
22 files changed, 432 insertions, 20 deletions
diff --git a/ios/MullvadMockData/MullvadTypes/DeviceMock.swift b/ios/MullvadMockData/MullvadTypes/DeviceMock.swift
index 695c8c8660..1fe9c045c6 100644
--- a/ios/MullvadMockData/MullvadTypes/DeviceMock.swift
+++ b/ios/MullvadMockData/MullvadTypes/DeviceMock.swift
@@ -8,7 +8,8 @@
import Foundation
import MullvadTypes
-import WireGuardKitTypes // IPAddressRange
+
+import class WireGuardKitTypes.PublicKey
extension Device {
public static func mock(publicKey: WireGuard.PublicKey) -> Device {
diff --git a/ios/MullvadRustRuntimeTests/IPAddressRangeTests.swift b/ios/MullvadRustRuntimeTests/IPAddressRangeTests.swift
new file mode 100644
index 0000000000..2c96d2037b
--- /dev/null
+++ b/ios/MullvadRustRuntimeTests/IPAddressRangeTests.swift
@@ -0,0 +1,227 @@
+//
+// IPAddressRangeTests.swift
+// MullvadRustRuntimeTests
+//
+// Copyright © 2026 Mullvad VPN AB. All rights reserved.
+//
+
+import MullvadTypes
+import Network
+import XCTest
+
+final class IPAddressRangeTests: XCTestCase {
+ // MARK: - IPv4 String Parsing
+
+ func testParseIPv4WithPrefix() {
+ let range = IPAddressRange(from: "192.168.1.0/24")
+ XCTAssertNotNil(range)
+ XCTAssertEqual("\(range!.address)", "192.168.1.0")
+ XCTAssertEqual(range!.networkPrefixLength, 24)
+ }
+
+ func testParseIPv4WithoutPrefix() {
+ let range = IPAddressRange(from: "10.0.0.1")
+ XCTAssertNotNil(range)
+ XCTAssertEqual("\(range!.address)", "10.0.0.1")
+ XCTAssertEqual(range!.networkPrefixLength, 32)
+ }
+
+ func testParseIPv4DefaultRoute() {
+ let range = IPAddressRange(from: "0.0.0.0/0")
+ XCTAssertNotNil(range)
+ XCTAssertEqual(range!.networkPrefixLength, 0)
+ }
+
+ func testParseIPv4FullMask() {
+ let range = IPAddressRange(from: "255.255.255.255/32")
+ XCTAssertNotNil(range)
+ XCTAssertEqual(range!.networkPrefixLength, 32)
+ }
+
+ func testParseIPv4PrefixClampedToMax() {
+ let range = IPAddressRange(from: "192.168.1.1/33")
+ XCTAssertNotNil(range)
+ XCTAssertEqual(range!.networkPrefixLength, 32)
+ }
+
+ func testParseInvalidString() {
+ XCTAssertNil(IPAddressRange(from: "invalid"))
+ }
+
+ func testParseTrailingSlash() {
+ XCTAssertNil(IPAddressRange(from: "192.168.1.1/"))
+ }
+
+ func testParseEmptyString() {
+ XCTAssertNil(IPAddressRange(from: ""))
+ }
+
+ // MARK: - IPv6 String Parsing
+
+ func testParseIPv6WithPrefix() {
+ let range = IPAddressRange(from: "::ff/64")
+ XCTAssertNotNil(range)
+ XCTAssertEqual(range!.networkPrefixLength, 64)
+ }
+
+ func testParseIPv6WithoutPrefix() {
+ let range = IPAddressRange(from: "::1")
+ XCTAssertNotNil(range)
+ XCTAssertEqual(range!.networkPrefixLength, 128)
+ }
+
+ func testParseIPv6DefaultRoute() {
+ let range = IPAddressRange(from: "::/0")
+ XCTAssertNotNil(range)
+ XCTAssertEqual(range!.networkPrefixLength, 0)
+ }
+
+ func testParseIPv6FullAddress() {
+ let range = IPAddressRange(from: "fe80::1/128")
+ XCTAssertNotNil(range)
+ XCTAssertEqual(range!.networkPrefixLength, 128)
+ }
+
+ func testParseIPv6PrefixClampedToMax() {
+ let range = IPAddressRange(from: "::1/129")
+ XCTAssertNotNil(range)
+ XCTAssertEqual(range!.networkPrefixLength, 128)
+ }
+
+ // MARK: - String Representation Roundtrip
+
+ func testStringRepresentationRoundtripIPv4() {
+ let original = "192.168.1.0/24"
+ let range = IPAddressRange(from: original)!
+ XCTAssertEqual(range.description, original)
+ }
+
+ func testStringRepresentationRoundtripIPv6() {
+ let range = IPAddressRange(from: "::/0")!
+ XCTAssertEqual(range.description, "::/0")
+ }
+
+ // MARK: - Subnet Mask IPv4
+
+ func testSubnetMaskIPv4Zero() {
+ let range = IPAddressRange(from: "0.0.0.0/0")!
+ XCTAssertEqual("\(range.subnetMask())", "0.0.0.0")
+ }
+
+ func testSubnetMaskIPv4Slash8() {
+ let range = IPAddressRange(from: "10.0.0.0/8")!
+ XCTAssertEqual("\(range.subnetMask())", "255.0.0.0")
+ }
+
+ func testSubnetMaskIPv4Slash24() {
+ let range = IPAddressRange(from: "192.168.1.0/24")!
+ XCTAssertEqual("\(range.subnetMask())", "255.255.255.0")
+ }
+
+ func testSubnetMaskIPv4Slash32() {
+ let range = IPAddressRange(from: "192.168.1.1/32")!
+ XCTAssertEqual("\(range.subnetMask())", "255.255.255.255")
+ }
+
+ // MARK: - Subnet Mask IPv6
+
+ func testSubnetMaskIPv6Zero() {
+ let range = IPAddressRange(from: "::/0")!
+ let mask = range.subnetMask()
+ XCTAssertEqual(mask.rawValue, Data(repeating: 0, count: 16))
+ }
+
+ func testSubnetMaskIPv6Slash64() {
+ let range = IPAddressRange(from: "::1/64")!
+ let mask = range.subnetMask()
+ var expected = Data(repeating: 0xff, count: 8)
+ expected.append(Data(repeating: 0, count: 8))
+ XCTAssertEqual(mask.rawValue, expected)
+ }
+
+ func testSubnetMaskIPv6Slash128() {
+ let range = IPAddressRange(from: "::1/128")!
+ let mask = range.subnetMask()
+ XCTAssertEqual(mask.rawValue, Data(repeating: 0xff, count: 16))
+ }
+
+ // MARK: - Masked Address
+
+ func testMaskedAddressIPv4() {
+ let range = IPAddressRange(from: "192.168.1.100/24")!
+ XCTAssertEqual("\(range.maskedAddress())", "192.168.1.0")
+ }
+
+ func testMaskedAddressIPv4Slash8() {
+ let range = IPAddressRange(from: "10.20.30.40/8")!
+ XCTAssertEqual("\(range.maskedAddress())", "10.0.0.0")
+ }
+
+ // MARK: - Codable
+
+ func testCodableRoundtrip() throws {
+ let range = IPAddressRange(from: "10.64.0.1/32")!
+ let encoder = JSONEncoder()
+ let data = try encoder.encode(range)
+ let decoded = try JSONDecoder().decode(IPAddressRange.self, from: data)
+ XCTAssertEqual(range, decoded)
+ }
+
+ func testDecodeSingleStringValue() throws {
+ let json = "\"10.64.0.1/32\""
+ let data = json.data(using: .utf8)!
+ let decoded = try JSONDecoder().decode(IPAddressRange.self, from: data)
+ XCTAssertEqual("\(decoded.address)", "10.64.0.1")
+ XCTAssertEqual(decoded.networkPrefixLength, 32)
+ }
+
+ func testDecodeIPv6SingleStringValue() throws {
+ let json = "\"::ff/64\""
+ let data = json.data(using: .utf8)!
+ let decoded = try JSONDecoder().decode(IPAddressRange.self, from: data)
+ XCTAssertEqual(decoded.networkPrefixLength, 64)
+ }
+
+ func testDecodeInvalidStringThrows() {
+ let json = "\"not-an-ip\""
+ let data = json.data(using: .utf8)!
+ XCTAssertThrowsError(try JSONDecoder().decode(IPAddressRange.self, from: data))
+ }
+
+ func testEncodesAsSingleString() throws {
+ let range = IPAddressRange(from: "192.168.1.0/24")!
+ let data = try JSONEncoder().encode(range)
+ let string = String(data: data, encoding: .utf8)!
+ XCTAssertEqual(string, "\"192.168.1.0/24\"")
+ }
+
+ // MARK: - Equatable / Hashable
+
+ func testEqualRanges() {
+ let a = IPAddressRange(from: "10.0.0.1/24")!
+ let b = IPAddressRange(from: "10.0.0.1/24")!
+ XCTAssertEqual(a, b)
+ XCTAssertEqual(a.hashValue, b.hashValue)
+ }
+
+ func testUnequalPrefix() {
+ let a = IPAddressRange(from: "10.0.0.1/24")!
+ let b = IPAddressRange(from: "10.0.0.1/32")!
+ XCTAssertNotEqual(a, b)
+ }
+
+ func testUnequalAddress() {
+ let a = IPAddressRange(from: "10.0.0.1/24")!
+ let b = IPAddressRange(from: "10.0.0.2/24")!
+ XCTAssertNotEqual(a, b)
+ }
+
+ // MARK: - Direct Init
+
+ func testDirectInit() {
+ let address = IPv4Address("192.168.1.1")!
+ let range = IPAddressRange(address: address, networkPrefixLength: 24)
+ XCTAssertEqual("\(range.address)", "192.168.1.1")
+ XCTAssertEqual(range.networkPrefixLength, 24)
+ }
+}
diff --git a/ios/MullvadSettings/StoredDeviceData.swift b/ios/MullvadSettings/StoredDeviceData.swift
index 2b7660a962..50ba401d6e 100644
--- a/ios/MullvadSettings/StoredDeviceData.swift
+++ b/ios/MullvadSettings/StoredDeviceData.swift
@@ -8,7 +8,6 @@
import Foundation
import MullvadTypes
-@preconcurrency import WireGuardKitTypes // IPAddressRange
public struct StoredDeviceData: Codable, Equatable, Sendable {
/// Device creation date.
diff --git a/ios/MullvadSettings/TunnelSettingsV1.swift b/ios/MullvadSettings/TunnelSettingsV1.swift
index d672a36a6c..39b9e04142 100644
--- a/ios/MullvadSettings/TunnelSettingsV1.swift
+++ b/ios/MullvadSettings/TunnelSettingsV1.swift
@@ -9,7 +9,9 @@
import Foundation
import MullvadTypes
import Network
-import WireGuardKitTypes // IPAddressRange
+
+import class WireGuardKitTypes.PrivateKey
+import class WireGuardKitTypes.PublicKey
/// A struct that holds the configuration passed via `NETunnelProviderProtocol`.
public struct TunnelSettingsV1: Codable, Equatable, TunnelSettings {
diff --git a/ios/MullvadTypes/IPAddressRange.swift b/ios/MullvadTypes/IPAddressRange.swift
new file mode 100644
index 0000000000..9cf36e64b1
--- /dev/null
+++ b/ios/MullvadTypes/IPAddressRange.swift
@@ -0,0 +1,147 @@
+//
+// IPAddressRange.swift
+// MullvadTypes
+//
+// Created by Mullvad VPN.
+// Copyright © 2026 Mullvad VPN AB. All rights reserved.
+//
+
+import Foundation
+import Network
+
+public struct IPAddressRange: Sendable {
+ public let address: IPAddress
+ public let networkPrefixLength: UInt8
+
+ public init(address: IPAddress, networkPrefixLength: UInt8) {
+ self.address = address
+ self.networkPrefixLength = networkPrefixLength
+ }
+}
+
+extension IPAddressRange: Equatable {
+ public static func == (lhs: IPAddressRange, rhs: IPAddressRange) -> Bool {
+ lhs.address.rawValue == rhs.address.rawValue && lhs.networkPrefixLength == rhs.networkPrefixLength
+ }
+}
+
+extension IPAddressRange: Hashable {
+ public func hash(into hasher: inout Hasher) {
+ hasher.combine(address.rawValue)
+ hasher.combine(networkPrefixLength)
+ }
+}
+
+extension IPAddressRange: Codable {
+ public func encode(to encoder: Encoder) throws {
+ var container = encoder.singleValueContainer()
+ try container.encode(description)
+ }
+
+ public init(from decoder: Decoder) throws {
+ let container = try decoder.singleValueContainer()
+ let value = try container.decode(String.self)
+
+ if let ipAddressRange = IPAddressRange(from: value) {
+ self = ipAddressRange
+ } else {
+ throw DecodingError.dataCorrupted(
+ DecodingError.Context(
+ codingPath: container.codingPath,
+ debugDescription: "Invalid IPAddressRange representation"
+ )
+ )
+ }
+ }
+}
+
+extension IPAddressRange: CustomStringConvertible {
+ public var description: String {
+ "\(address)/\(networkPrefixLength)"
+ }
+}
+
+extension IPAddressRange {
+ public init?(from string: String) {
+ guard let parsed = IPAddressRange.parseAddressString(string) else { return nil }
+ address = parsed.0
+ networkPrefixLength = parsed.1
+ }
+
+ private static func parseAddressString(_ string: String) -> (IPAddress, UInt8)? {
+ // Split "192.168.1.0/24" into address ("192.168.1.0") and prefix length ("24")
+ let parts = string.split(separator: "/", maxSplits: 1)
+ guard let addressPart = parts.first else { return nil }
+
+ // Parse the address part as either IPv4 or IPv6
+ let address: IPAddress
+ if let addr = IPv4Address(String(addressPart)) {
+ address = addr
+ } else if let addr = IPv6Address(String(addressPart)) {
+ address = addr
+ } else {
+ return nil
+ }
+
+ let maxNetworkPrefixLength: UInt8 = address is IPv4Address ? 32 : 128
+
+ // If a prefix length is provided, parse it; otherwise default to the maximum for the address family
+ if parts.count > 1 {
+ guard let prefixLength = UInt8(parts[1]) else { return nil }
+ return (address, min(prefixLength, maxNetworkPrefixLength))
+ } else {
+ return (address, maxNetworkPrefixLength)
+ }
+ }
+
+ public func subnetMask() -> IPAddress {
+ switch address {
+ case is IPv4Address:
+ let mask = networkPrefixLength > 0 ? ~UInt32(0) << (32 - networkPrefixLength) : UInt32(0)
+ let bytes = Data([
+ UInt8(truncatingIfNeeded: mask >> 24),
+ UInt8(truncatingIfNeeded: mask >> 16),
+ UInt8(truncatingIfNeeded: mask >> 8),
+ UInt8(truncatingIfNeeded: mask >> 0),
+ ])
+ return IPv4Address(bytes)!
+
+ case is IPv6Address:
+ var bytes = Data(repeating: 0, count: 16)
+ for i in 0..<Int(networkPrefixLength / 8) {
+ bytes[i] = 0xff
+ }
+ let nibble = networkPrefixLength % 32
+ if nibble != 0 {
+ let mask = ~UInt32(0) << (32 - nibble)
+ let i = Int(networkPrefixLength / 32 * 4)
+ bytes[i + 0] = UInt8(truncatingIfNeeded: mask >> 24)
+ bytes[i + 1] = UInt8(truncatingIfNeeded: mask >> 16)
+ bytes[i + 2] = UInt8(truncatingIfNeeded: mask >> 8)
+ bytes[i + 3] = UInt8(truncatingIfNeeded: mask >> 0)
+ }
+ return IPv6Address(bytes)!
+
+ default:
+ fatalError("Unsupported address type: \(type(of: address))")
+ }
+ }
+
+ public func maskedAddress() -> IPAddress {
+ let subnet = subnetMask().rawValue
+ var masked = Data(address.rawValue)
+ assert(subnet.count == masked.count)
+ for i in 0..<subnet.count {
+ masked[i] &= subnet[i]
+ }
+
+ switch address {
+ case is IPv4Address:
+ return IPv4Address(masked)!
+ case is IPv6Address:
+ return IPv6Address(masked)!
+ default:
+ fatalError("Unsupported address type: \(type(of: address))")
+ }
+ }
+}
diff --git a/ios/MullvadTypes/RESTTypes.swift b/ios/MullvadTypes/RESTTypes.swift
index e75eca2bb1..df63b0b4fc 100644
--- a/ios/MullvadTypes/RESTTypes.swift
+++ b/ios/MullvadTypes/RESTTypes.swift
@@ -7,7 +7,8 @@
//
import Foundation
-@preconcurrency import WireGuardKitTypes // IPAddressRange
+
+import class WireGuardKitTypes.PublicKey
public struct Account: Codable, Equatable, Sendable {
public let id: String
diff --git a/ios/MullvadVPN.xcodeproj/project.pbxproj b/ios/MullvadVPN.xcodeproj/project.pbxproj
index 95120ef386..51b3eeb7a8 100644
--- a/ios/MullvadVPN.xcodeproj/project.pbxproj
+++ b/ios/MullvadVPN.xcodeproj/project.pbxproj
@@ -37,6 +37,7 @@
016EE0382F850C0E0035B25C /* WireGuardKey.swift in Sources */ = {isa = PBXBuildFile; fileRef = 016EE0372F850C0E0035B25C /* WireGuardKey.swift */; };
016EE03A2F850C5A0035B25C /* WireGuardKeyTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 016EE0392F850C5A0035B25C /* WireGuardKeyTests.swift */; };
016EE03C2F8524EB0035B25C /* WireGuardKey.swift in Sources */ = {isa = PBXBuildFile; fileRef = 016EE03B2F8524EB0035B25C /* WireGuardKey.swift */; };
+ 016EE0422F8540B00035B25C /* IPAddressRange.swift in Sources */ = {isa = PBXBuildFile; fileRef = 016EE0412F8540B00035B25C /* IPAddressRange.swift */; };
01B2FF862D70B914004AED35 /* MullvadRustRuntime.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = A992DA1D2C24709F00DE7CE5 /* MullvadRustRuntime.framework */; };
01C981E82F43C3410002D284 /* BlockedStateReason+Localization.swift in Sources */ = {isa = PBXBuildFile; fileRef = 01C981E52F43C3410002D284 /* BlockedStateReason+Localization.swift */; };
01C981E92F43C3410002D284 /* TunnelStateAccessibilityAnnouncer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 01C981E62F43C3410002D284 /* TunnelStateAccessibilityAnnouncer.swift */; };
@@ -1720,6 +1721,7 @@
016EE0372F850C0E0035B25C /* WireGuardKey.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WireGuardKey.swift; sourceTree = "<group>"; };
016EE0392F850C5A0035B25C /* WireGuardKeyTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WireGuardKeyTests.swift; sourceTree = "<group>"; };
016EE03B2F8524EB0035B25C /* WireGuardKey.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WireGuardKey.swift; sourceTree = "<group>"; };
+ 016EE0412F8540B00035B25C /* IPAddressRange.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = IPAddressRange.swift; sourceTree = "<group>"; };
01C981E52F43C3410002D284 /* BlockedStateReason+Localization.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "BlockedStateReason+Localization.swift"; sourceTree = "<group>"; };
01C981E62F43C3410002D284 /* TunnelStateAccessibilityAnnouncer.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TunnelStateAccessibilityAnnouncer.swift; sourceTree = "<group>"; };
01C981EA2F45D5C20002D284 /* TunnelControlPageTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TunnelControlPageTests.swift; sourceTree = "<group>"; };
@@ -3210,6 +3212,7 @@
581943F228F8014500B0CB5E /* MullvadTypes */ = {
isa = PBXGroup;
children = (
+ 016EE0412F8540B00035B25C /* IPAddressRange.swift */,
449EBA242B975B7C00DFA4EB /* Protocols */,
588D7ED72AF3A533005DF40A /* AccessMethodKind.swift */,
584D26BE270C550B004EA533 /* AnyIPAddress.swift */,
@@ -7016,6 +7019,7 @@
F0ADF1CD2CFDFF3100299F09 /* StringConversionError.swift in Sources */,
A9A8A8EB2A262AB30086D569 /* FileCache.swift in Sources */,
A90C48692C36BF3900DCB94C /* TunnelProvider.swift in Sources */,
+ 016EE0422F8540B00035B25C /* IPAddressRange.swift in Sources */,
01FFF95F2F0BE13900BDAF45 /* SelectedEndpoint.swift in Sources */,
44EC6C5A2E3BB3F60087F54A /* PersistentProxyConfiguration.swift in Sources */,
016EE03C2F8524EB0035B25C /* WireGuardKey.swift in Sources */,
diff --git a/ios/MullvadVPN/View controllers/DeviceList/DeviceManaging.swift b/ios/MullvadVPN/View controllers/DeviceList/DeviceManaging.swift
index 9ba33127f7..b4fa18618a 100644
--- a/ios/MullvadVPN/View controllers/DeviceList/DeviceManaging.swift
+++ b/ios/MullvadVPN/View controllers/DeviceList/DeviceManaging.swift
@@ -9,7 +9,9 @@
import Foundation
import MullvadREST
import MullvadTypes
-import WireGuardKitTypes // IPAddressRange
+
+import class WireGuardKitTypes.PrivateKey
+import class WireGuardKitTypes.PublicKey
protocol DeviceManaging {
var currentDeviceId: String? { get }
diff --git a/ios/MullvadVPNTests/MullvadVPN/PacketTunnel/DeviceCheck/DeviceCheckOperationTests.swift b/ios/MullvadVPNTests/MullvadVPN/PacketTunnel/DeviceCheck/DeviceCheckOperationTests.swift
index 3dc22de7a9..baed5d13a9 100644
--- a/ios/MullvadVPNTests/MullvadVPN/PacketTunnel/DeviceCheck/DeviceCheckOperationTests.swift
+++ b/ios/MullvadVPNTests/MullvadVPN/PacketTunnel/DeviceCheck/DeviceCheckOperationTests.swift
@@ -11,9 +11,11 @@ import MullvadSettings
import MullvadTypes
import Operations
import PacketTunnelCore
-@preconcurrency import WireGuardKitTypes // For IPAddressRange
import XCTest
+@preconcurrency import class WireGuardKitTypes.PrivateKey
+@preconcurrency import class WireGuardKitTypes.PublicKey
+
@testable import MullvadMockData
class DeviceCheckOperationTests: XCTestCase {
diff --git a/ios/MullvadVPNTests/MullvadVPN/TunnelManager/StartTunnelOperationTests.swift b/ios/MullvadVPNTests/MullvadVPN/TunnelManager/StartTunnelOperationTests.swift
index 631e00d7fa..abf156b74f 100644
--- a/ios/MullvadVPNTests/MullvadVPN/TunnelManager/StartTunnelOperationTests.swift
+++ b/ios/MullvadVPNTests/MullvadVPN/TunnelManager/StartTunnelOperationTests.swift
@@ -10,9 +10,10 @@ import MullvadSettings
import MullvadTypes
import Network
import Operations
-import WireGuardKitTypes // For IPAddressRange
import XCTest
+import class WireGuardKitTypes.PrivateKey
+
@testable import MullvadMockData
class StartTunnelOperationTests: XCTestCase {
diff --git a/ios/MullvadVPNTests/MullvadVPN/TunnelManager/WgKeyRotationTests.swift b/ios/MullvadVPNTests/MullvadVPN/TunnelManager/WgKeyRotationTests.swift
index 6678615ba8..5f6ba6f609 100644
--- a/ios/MullvadVPNTests/MullvadVPN/TunnelManager/WgKeyRotationTests.swift
+++ b/ios/MullvadVPNTests/MullvadVPN/TunnelManager/WgKeyRotationTests.swift
@@ -8,9 +8,10 @@
import MullvadSettings
import MullvadTypes
-import WireGuardKitTypes // For IPAddressRange
import XCTest
+import class WireGuardKitTypes.PrivateKey
+
final class WgKeyRotationTests: XCTestCase {
func testKeyRotationLifecycle() {
let data = StoredDeviceData.mock(
diff --git a/ios/PacketTunnel/PostQuantum/MultiHopEphemeralPeerExchanger.swift b/ios/PacketTunnel/PostQuantum/MultiHopEphemeralPeerExchanger.swift
index 93c897a45e..2acbea53ea 100644
--- a/ios/PacketTunnel/PostQuantum/MultiHopEphemeralPeerExchanger.swift
+++ b/ios/PacketTunnel/PostQuantum/MultiHopEphemeralPeerExchanger.swift
@@ -11,7 +11,9 @@ import MullvadRustRuntime
import MullvadSettings
import MullvadTypes
import PacketTunnelCore
-import WireGuardKitTypes // IPAddressRange
+
+import class WireGuardKitTypes.PreSharedKey
+import class WireGuardKitTypes.PrivateKey
final class MultiHopEphemeralPeerExchanger: EphemeralPeerExchangingProtocol {
let entry: SelectedRelay
diff --git a/ios/PacketTunnel/PostQuantum/SingleHopEphemeralPeerExchanger.swift b/ios/PacketTunnel/PostQuantum/SingleHopEphemeralPeerExchanger.swift
index c869864c71..471e2f869b 100644
--- a/ios/PacketTunnel/PostQuantum/SingleHopEphemeralPeerExchanger.swift
+++ b/ios/PacketTunnel/PostQuantum/SingleHopEphemeralPeerExchanger.swift
@@ -11,7 +11,9 @@ import MullvadRustRuntime
import MullvadSettings
import MullvadTypes
import PacketTunnelCore
-import WireGuardKitTypes // IPAddressRange
+
+import class WireGuardKitTypes.PreSharedKey
+import class WireGuardKitTypes.PrivateKey
struct SingleHopEphemeralPeerExchanger: EphemeralPeerExchangingProtocol {
let exit: SelectedRelay
diff --git a/ios/PacketTunnel/WireGuardAdapter/WgAdapter.swift b/ios/PacketTunnel/WireGuardAdapter/WgAdapter.swift
index 329754f106..70325ade86 100644
--- a/ios/PacketTunnel/WireGuardAdapter/WgAdapter.swift
+++ b/ios/PacketTunnel/WireGuardAdapter/WgAdapter.swift
@@ -132,10 +132,16 @@ extension WgAdapter: TunnelDeviceInfoProtocol {
}
}
+private extension MullvadTypes.IPAddressRange {
+ var asWireGuardKitType: WireGuardKitTypes.IPAddressRange {
+ WireGuardKitTypes.IPAddressRange(from: description)!
+ }
+}
+
private extension TunnelAdapterConfiguration {
var asWgConfig: TunnelConfiguration {
var interfaceConfig = InterfaceConfiguration(privateKey: privateKey.wgKey)
- interfaceConfig.addresses = interfaceAddresses
+ interfaceConfig.addresses = interfaceAddresses.map { $0.asWireGuardKitType }
interfaceConfig.dns = dns.map { DNSServer(address: $0) }
interfaceConfig.listenPort = 0
@@ -143,7 +149,7 @@ private extension TunnelAdapterConfiguration {
if let peer {
var peerConfig = PeerConfiguration(publicKey: peer.publicKey.wgKey)
peerConfig.endpoint = peer.endpoint.wgEndpoint
- peerConfig.allowedIPs = allowedIPs
+ peerConfig.allowedIPs = allowedIPs.map { $0.asWireGuardKitType }
peerConfig.preSharedKey = peer.preSharedKey?.wgKey
peers.append(peerConfig)
}
diff --git a/ios/PacketTunnelCore/Actor/ConfigurationBuilder.swift b/ios/PacketTunnelCore/Actor/ConfigurationBuilder.swift
index 777618fdc7..fa212cdc86 100644
--- a/ios/PacketTunnelCore/Actor/ConfigurationBuilder.swift
+++ b/ios/PacketTunnelCore/Actor/ConfigurationBuilder.swift
@@ -9,7 +9,10 @@
import Foundation
import MullvadTypes
import Network
-import WireGuardKitTypes // For IPAddressRange
+
+import class WireGuardKitTypes.PreSharedKey
+import class WireGuardKitTypes.PrivateKey
+import class WireGuardKitTypes.PublicKey
/// Error returned when there is an endpoint but its public key is invalid.
public struct PublicKeyError: LocalizedError {
diff --git a/ios/PacketTunnelCore/Actor/ConnectionConfigurationBuilder.swift b/ios/PacketTunnelCore/Actor/ConnectionConfigurationBuilder.swift
index ba89545a32..9c8af2297d 100644
--- a/ios/PacketTunnelCore/Actor/ConnectionConfigurationBuilder.swift
+++ b/ios/PacketTunnelCore/Actor/ConnectionConfigurationBuilder.swift
@@ -9,7 +9,8 @@
import Foundation
import MullvadTypes
import Network
-import WireGuardKitTypes // For IPAddressRange
+
+import class WireGuardKitTypes.PrivateKey
protocol Configuration {
var name: String { get }
diff --git a/ios/PacketTunnelCore/Actor/EphemeralPeerNegotiationState.swift b/ios/PacketTunnelCore/Actor/EphemeralPeerNegotiationState.swift
index cb3dba7978..f4c40cfcd6 100644
--- a/ios/PacketTunnelCore/Actor/EphemeralPeerNegotiationState.swift
+++ b/ios/PacketTunnelCore/Actor/EphemeralPeerNegotiationState.swift
@@ -8,7 +8,9 @@
import MullvadREST
import MullvadTypes
-@preconcurrency import WireGuardKitTypes // For IPAddressRange
+
+@preconcurrency import class WireGuardKitTypes.PreSharedKey
+@preconcurrency import class WireGuardKitTypes.PrivateKey
public enum EphemeralPeerNegotiationState: Equatable, Sendable {
case single(EphemeralPeerRelayConfiguration)
diff --git a/ios/PacketTunnelCore/Actor/PacketTunnelActor+ErrorState.swift b/ios/PacketTunnelCore/Actor/PacketTunnelActor+ErrorState.swift
index 74b747e0c8..068a2d2e3a 100644
--- a/ios/PacketTunnelCore/Actor/PacketTunnelActor+ErrorState.swift
+++ b/ios/PacketTunnelCore/Actor/PacketTunnelActor+ErrorState.swift
@@ -9,7 +9,9 @@
import Foundation
import MullvadTypes
import Network
-import WireGuardKitTypes // For IPAddressRange
+
+import class WireGuardKitTypes.PrivateKey
+import class WireGuardKitTypes.PublicKey
extension PacketTunnelActor {
/**
diff --git a/ios/PacketTunnelCore/Actor/Protocols/SettingsReaderProtocol.swift b/ios/PacketTunnelCore/Actor/Protocols/SettingsReaderProtocol.swift
index f0b060b97a..1817a3e3e6 100644
--- a/ios/PacketTunnelCore/Actor/Protocols/SettingsReaderProtocol.swift
+++ b/ios/PacketTunnelCore/Actor/Protocols/SettingsReaderProtocol.swift
@@ -10,7 +10,8 @@ import Foundation
import MullvadSettings
import MullvadTypes
import Network
-@preconcurrency import WireGuardKitTypes // For IPAddressRange
+
+@preconcurrency import class WireGuardKitTypes.PrivateKey
/// A type that implements a reader that can return settings required by `PacketTunnelActor` in order to configure the tunnel.
public protocol SettingsReaderProtocol {
diff --git a/ios/PacketTunnelCore/Actor/Protocols/TunnelAdapterProtocol.swift b/ios/PacketTunnelCore/Actor/Protocols/TunnelAdapterProtocol.swift
index e3685df781..a06a42af12 100644
--- a/ios/PacketTunnelCore/Actor/Protocols/TunnelAdapterProtocol.swift
+++ b/ios/PacketTunnelCore/Actor/Protocols/TunnelAdapterProtocol.swift
@@ -10,7 +10,11 @@ import Foundation
import MullvadTypes
import Network
import NetworkExtension
-@preconcurrency import WireGuardKitTypes // For IPAddressRange, DaitaConfiguration
+
+@preconcurrency import struct WireGuardKitTypes.DaitaConfiguration
+@preconcurrency import class WireGuardKitTypes.PreSharedKey
+@preconcurrency import class WireGuardKitTypes.PrivateKey
+@preconcurrency import class WireGuardKitTypes.PublicKey
/// Protocol describing interface for any kind of adapter implementing a VPN tunnel.
public protocol TunnelAdapterProtocol: Sendable {
diff --git a/ios/PacketTunnelCoreTests/Mocks/SettingsReaderStub.swift b/ios/PacketTunnelCoreTests/Mocks/SettingsReaderStub.swift
index 743e57263d..090b19d6f6 100644
--- a/ios/PacketTunnelCoreTests/Mocks/SettingsReaderStub.swift
+++ b/ios/PacketTunnelCoreTests/Mocks/SettingsReaderStub.swift
@@ -9,7 +9,8 @@
import Foundation
import MullvadTypes
import PacketTunnelCore
-import WireGuardKitTypes // For IPAddressRange
+
+import class WireGuardKitTypes.PrivateKey
@testable import MullvadSettings
diff --git a/ios/PacketTunnelCoreTests/PacketTunnelActorTests.swift b/ios/PacketTunnelCoreTests/PacketTunnelActorTests.swift
index 94bcd8f1b0..561b3d0f18 100644
--- a/ios/PacketTunnelCoreTests/PacketTunnelActorTests.swift
+++ b/ios/PacketTunnelCoreTests/PacketTunnelActorTests.swift
@@ -9,9 +9,10 @@
@preconcurrency import Combine
import MullvadTypes
import Network
-import WireGuardKitTypes // For IPAddressRange
import XCTest
+import class WireGuardKitTypes.PrivateKey
+
@testable import MullvadMockData
@testable import MullvadREST
@testable import MullvadSettings