summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorBug Magnet <marco.nikic@mullvad.net>2025-04-25 17:02:34 +0200
committerBug Magnet <marco.nikic@mullvad.net>2025-04-25 17:02:34 +0200
commit4bdc7544216ce01424dbde5d5f2564bb7a3aed1c (patch)
treec768d95ba17a2b3db68702654ba17e735bb62f54
parentddbf642c562a1728b905034f7eeb164ac0fa86fb (diff)
downloadmullvadvpn-boringfun-ios.tar.xz
mullvadvpn-boringfun-ios.zip
Try getting it to workboringfun-ios
-rw-r--r--ios/BoringtunWrapper/BoringTunWrapper.swift19
-rw-r--r--ios/BoringtunWrapper/BoringtunWrapper.h10
-rw-r--r--ios/BoringtunWrapper/include/wireguard_ffi.h108
-rw-r--r--ios/BoringtunWrapper/module.private.modulemap5
-rw-r--r--ios/BoringtunWrapperTests/BoringtunWrapperTests.swift16
-rw-r--r--ios/MullvadVPN.xcodeproj/project.pbxproj371
-rw-r--r--ios/MullvadVPN.xcodeproj/xcshareddata/xcschemes/MullvadVPN.xcscheme11
-rw-r--r--ios/MullvadVPN.xcodeproj/xcshareddata/xcschemes/MullvadVPNUITests.xcscheme11
-rw-r--r--ios/MullvadVPN.xcodeproj/xcshareddata/xcschemes/PacketTunnel.xcscheme14
-rw-r--r--ios/PacketTunnel/PacketTunnelProvider/PacketTunnelProvider.swift2
-rw-r--r--ios/PacketTunnelCore/Actor/PacketTunnelActor.swift4
11 files changed, 553 insertions, 18 deletions
diff --git a/ios/BoringtunWrapper/BoringTunWrapper.swift b/ios/BoringtunWrapper/BoringTunWrapper.swift
new file mode 100644
index 0000000000..a91c77a37a
--- /dev/null
+++ b/ios/BoringtunWrapper/BoringTunWrapper.swift
@@ -0,0 +1,19 @@
+//
+// BoringTunWrapper.swift
+// BoringtunWrapper
+//
+// Created by Marco Nikic on 2025-04-25.
+// Copyright © 2025 Mullvad VPN AB. All rights reserved.
+//
+
+import Foundation
+import BoringTunProxy
+
+public class BoringTunWrapper {
+ public init() {}
+
+ public func createTunnel() {
+ print("Hello")
+ new_tunnel("helo", "hello", "hello", 0, 0)
+ }
+}
diff --git a/ios/BoringtunWrapper/BoringtunWrapper.h b/ios/BoringtunWrapper/BoringtunWrapper.h
new file mode 100644
index 0000000000..df317cb022
--- /dev/null
+++ b/ios/BoringtunWrapper/BoringtunWrapper.h
@@ -0,0 +1,10 @@
+//
+// BoringtunWrapper.h
+// BoringtunWrapper
+//
+// Created by Marco Nikic on 2025-04-25.
+// Copyright © 2025 Mullvad VPN AB. All rights reserved.
+//
+
+#import <Foundation/Foundation.h>
+#import "wireguard_ffi.h"
diff --git a/ios/BoringtunWrapper/include/wireguard_ffi.h b/ios/BoringtunWrapper/include/wireguard_ffi.h
new file mode 100644
index 0000000000..8078ecdbb6
--- /dev/null
+++ b/ios/BoringtunWrapper/include/wireguard_ffi.h
@@ -0,0 +1,108 @@
+// Copyright (c) 2019 Cloudflare, Inc. All rights reserved.
+// SPDX-License-Identifier: BSD-3-Clause
+
+
+#include <stdarg.h>
+#include <stdbool.h>
+#include <stdint.h>
+#include <stdlib.h>
+
+
+struct wireguard_tunnel; // This corresponds to the Rust type
+
+enum
+{
+ MAX_WIREGUARD_PACKET_SIZE = 65536 + 64,
+};
+
+enum result_type
+{
+ WIREGUARD_DONE = 0,
+ WRITE_TO_NETWORK = 1,
+ WIREGUARD_ERROR = 2,
+ WRITE_TO_TUNNEL_IPV4 = 4,
+ WRITE_TO_TUNNEL_IPV6 = 6,
+};
+
+struct wireguard_result
+{
+ enum result_type op;
+ size_t size;
+};
+
+struct stats
+{
+ int64_t time_since_last_handshake;
+ size_t tx_bytes;
+ size_t rx_bytes;
+ float estimated_loss;
+ int32_t estimated_rtt; // rtt estimated on time it took to complete latest initiated handshake in ms
+ uint8_t reserved[56]; // decrement appropriately when adding new fields
+};
+
+struct x25519_key
+{
+ uint8_t key[32];
+};
+
+// Generates a fresh x25519 secret key
+struct x25519_key x25519_secret_key();
+// Computes an x25519 public key from a secret key
+struct x25519_key x25519_public_key(struct x25519_key private_key);
+// Encodes a public or private x25519 key to base64. Must be freed with x25519_key_to_str_free.
+const char *x25519_key_to_base64(struct x25519_key key);
+// Encodes a public or private x25519 key to hex. Must be freed with x25519_key_to_str_free.
+const char *x25519_key_to_hex(struct x25519_key key);
+// Free string pointer obtained from either x25519_key_to_base64 or x25519_key_to_hex
+void x25519_key_to_str_free(const char *key_str);
+// Check if a null terminated string represents a valid x25519 key
+// Returns 0 if not
+int check_base64_encoded_x25519_key(const char *key);
+
+/// Sets the default tracing_subscriber to write to `log_func`.
+///
+/// Uses Compact format without level, target, thread ids, thread names, or ansi control characters.
+/// Subscribes to TRACE level events.
+///
+/// This function should only be called once as setting the default tracing_subscriber
+/// more than once will result in an error.
+///
+/// Returns false on failure.
+///
+/// # Safety
+///
+/// `c_char` will be freed by the library after calling `log_func`. If the value needs
+/// to be stored then `log_func` needs to create a copy, e.g. `strcpy`.
+bool set_logging_function(void (*log_func)(const char *));
+
+// Allocate a new tunnel
+struct wireguard_tunnel *new_tunnel(const char *static_private,
+ const char *server_static_public,
+ const char *preshared_key,
+ uint16_t keep_alive, // Keep alive interval in seconds
+ uint32_t index); // The 24bit index prefix to be used for session indexes
+
+// Deallocate the tunnel
+void tunnel_free(struct wireguard_tunnel *);
+
+struct wireguard_result wireguard_write(const struct wireguard_tunnel *tunnel,
+ const uint8_t *src,
+ uint32_t src_size,
+ uint8_t *dst,
+ uint32_t dst_size);
+
+struct wireguard_result wireguard_read(const struct wireguard_tunnel *tunnel,
+ const uint8_t *src,
+ uint32_t src_size,
+ uint8_t *dst,
+ uint32_t dst_size);
+
+struct wireguard_result wireguard_tick(const struct wireguard_tunnel *tunnel,
+ uint8_t *dst,
+ uint32_t dst_size);
+
+struct wireguard_result wireguard_force_handshake(const struct wireguard_tunnel *tunnel,
+ uint8_t *dst,
+ uint32_t dst_size);
+
+struct stats wireguard_stats(const struct wireguard_tunnel *tunnel);
diff --git a/ios/BoringtunWrapper/module.private.modulemap b/ios/BoringtunWrapper/module.private.modulemap
new file mode 100644
index 0000000000..b184c04c7f
--- /dev/null
+++ b/ios/BoringtunWrapper/module.private.modulemap
@@ -0,0 +1,5 @@
+framework module BoringTunProxy {
+ header "wireguard_ffi.h"
+ link "libboringtun"
+ export *
+}
diff --git a/ios/BoringtunWrapperTests/BoringtunWrapperTests.swift b/ios/BoringtunWrapperTests/BoringtunWrapperTests.swift
new file mode 100644
index 0000000000..881051e62a
--- /dev/null
+++ b/ios/BoringtunWrapperTests/BoringtunWrapperTests.swift
@@ -0,0 +1,16 @@
+//
+// BoringtunWrapperTests.swift
+// BoringtunWrapperTests
+//
+// Created by Marco Nikic on 2025-04-25.
+// Copyright © 2025 Mullvad VPN AB. All rights reserved.
+//
+
+@testable import BoringtunWrapper
+import Testing
+
+struct BoringtunWrapperTests {
+ @Test func example() async throws {
+ // Write your test here and use APIs like `#expect(...)` to check expected conditions.
+ }
+}
diff --git a/ios/MullvadVPN.xcodeproj/project.pbxproj b/ios/MullvadVPN.xcodeproj/project.pbxproj
index b22e3535c1..178e785dd3 100644
--- a/ios/MullvadVPN.xcodeproj/project.pbxproj
+++ b/ios/MullvadVPN.xcodeproj/project.pbxproj
@@ -3,7 +3,7 @@
archiveVersion = 1;
classes = {
};
- objectVersion = 60;
+ objectVersion = 70;
objects = {
/* Begin PBXBuildFile section */
@@ -779,6 +779,9 @@
A935594C2B4C2DA900D5D524 /* APIAvailabilityTestRequest.swift in Sources */ = {isa = PBXBuildFile; fileRef = A935594B2B4C2DA900D5D524 /* APIAvailabilityTestRequest.swift */; };
A939661B2CAE6CE1008128CA /* MigrationManagerMultiProcessUpgradeTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = A939661A2CAE6CE1008128CA /* MigrationManagerMultiProcessUpgradeTests.swift */; };
A93969812CE606190032A7A0 /* Maybenot.swift in Sources */ = {isa = PBXBuildFile; fileRef = A9840BB32C69F78A0030F05E /* Maybenot.swift */; };
+ A946CF452DBBCF8200D6B5EC /* BoringTunWrapper.swift in Sources */ = {isa = PBXBuildFile; fileRef = A946CF422DBBCF8200D6B5EC /* BoringTunWrapper.swift */; };
+ A946CF472DBBCF8200D6B5EC /* BoringtunWrapper.h in Headers */ = {isa = PBXBuildFile; fileRef = A946CF412DBBCF8200D6B5EC /* BoringtunWrapper.h */; settings = {ATTRIBUTES = (Public, ); }; };
+ A946CF4E2DBBD87C00D6B5EC /* wireguard_ffi.h in Headers */ = {isa = PBXBuildFile; fileRef = A946CF3F2DBBCF8200D6B5EC /* wireguard_ffi.h */; settings = {ATTRIBUTES = (Private, ); }; };
A959E23E2D75F33300F95DDB /* PersistentAccessMethod.swift in Sources */ = {isa = PBXBuildFile; fileRef = 586C0D962B04E0AC00E7CDD7 /* PersistentAccessMethod.swift */; };
A959E2412D75F39A00F95DDB /* MullvadTypes.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 58D223D5294C8E5E0029F5F8 /* MullvadTypes.framework */; };
A959E2422D75F3D200F95DDB /* AccessMethodKind.swift in Sources */ = {isa = PBXBuildFile; fileRef = 588D7ED72AF3A533005DF40A /* AccessMethodKind.swift */; };
@@ -906,6 +909,10 @@
A9A5FA412ACB05D90083449F /* DeviceStateAccessor.swift in Sources */ = {isa = PBXBuildFile; fileRef = 583D86472A2678DC0060D63B /* DeviceStateAccessor.swift */; };
A9A5FA422ACB05D90083449F /* DeviceStateAccessorProtocol.swift in Sources */ = {isa = PBXBuildFile; fileRef = 580810E42A30E13A00B74552 /* DeviceStateAccessorProtocol.swift */; };
A9A5FA432ACB05F20083449F /* UIColor+Helpers.swift in Sources */ = {isa = PBXBuildFile; fileRef = 587CBFE222807F530028DED3 /* UIColor+Helpers.swift */; };
+ A9A625A52DBBB83D0052E20D /* BoringtunWrapper.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = A9A625922DBBB83D0052E20D /* BoringtunWrapper.framework */; };
+ A9A625A62DBBB83D0052E20D /* BoringtunWrapper.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = A9A625922DBBB83D0052E20D /* BoringtunWrapper.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; };
+ A9A625B72DBBB9390052E20D /* libboringtun.a in Frameworks */ = {isa = PBXBuildFile; fileRef = CEB1F64E2DBBB12100840AA5 /* libboringtun.a */; };
+ A9A625BA2DBBB9BD0052E20D /* BoringtunWrapper.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = A9A625922DBBB83D0052E20D /* BoringtunWrapper.framework */; };
A9A8A8EB2A262AB30086D569 /* FileCache.swift in Sources */ = {isa = PBXBuildFile; fileRef = A9A8A8EA2A262AB30086D569 /* FileCache.swift */; };
A9B6AC182ADE8F4300F7802A /* MigrationManagerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = A9B6AC172ADE8F4300F7802A /* MigrationManagerTests.swift */; };
A9B6AC1A2ADE8FBB00F7802A /* InMemorySettingsStore.swift in Sources */ = {isa = PBXBuildFile; fileRef = A9B6AC192ADE8FBB00F7802A /* InMemorySettingsStore.swift */; };
@@ -1381,6 +1388,13 @@
remoteGlobalIDString = 58D223D4294C8E5E0029F5F8;
remoteInfo = MullvadTypes;
};
+ A946CF4C2DBBD84C00D6B5EC /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 58CE5E58224146200008646E /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = A9A625912DBBB83D0052E20D;
+ remoteInfo = BoringtunWrapper;
+ };
A959E23F2D75F37600F95DDB /* PBXContainerItemProxy */ = {
isa = PBXContainerItemProxy;
containerPortal = 58CE5E58224146200008646E /* Project object */;
@@ -1402,6 +1416,13 @@
remoteGlobalIDString = A992DA1C2C24709F00DE7CE5;
remoteInfo = MullvadRustRuntime;
};
+ A9A625A32DBBB83D0052E20D /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 58CE5E58224146200008646E /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = A9A625912DBBB83D0052E20D;
+ remoteInfo = BoringtunWrapper;
+ };
A9D9A4B92C36D2FD004088DD /* PBXContainerItemProxy */ = {
isa = PBXContainerItemProxy;
containerPortal = 58CE5E58224146200008646E /* Project object */;
@@ -1449,6 +1470,7 @@
06799AD228F98E1D00ACD94E /* MullvadREST.framework in Embed Frameworks */,
58D223CD294C8BCB0029F5F8 /* Operations.framework in Embed Frameworks */,
58C7A44A2A863F490060C66F /* PacketTunnelCore.framework in Embed Frameworks */,
+ A9A625A62DBBB83D0052E20D /* BoringtunWrapper.framework in Embed Frameworks */,
);
name = "Embed Frameworks";
runOnlyForDeploymentPostprocessing = 0;
@@ -2329,6 +2351,10 @@
A939661A2CAE6CE1008128CA /* MigrationManagerMultiProcessUpgradeTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MigrationManagerMultiProcessUpgradeTests.swift; sourceTree = "<group>"; };
A944F2712B8E02E800473F4C /* libmullvad_ios.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libmullvad_ios.a; path = "../target/aarch64-apple-ios/debug/libmullvad_ios.a"; sourceTree = "<group>"; };
A9467E7E2A29DEFE000DC21F /* RelayCacheTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RelayCacheTests.swift; sourceTree = "<group>"; };
+ A946CF3F2DBBCF8200D6B5EC /* wireguard_ffi.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = wireguard_ffi.h; sourceTree = "<group>"; };
+ A946CF412DBBCF8200D6B5EC /* BoringtunWrapper.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = BoringtunWrapper.h; sourceTree = "<group>"; };
+ A946CF422DBBCF8200D6B5EC /* BoringTunWrapper.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BoringTunWrapper.swift; sourceTree = "<group>"; };
+ A946CF432DBBCF8200D6B5EC /* module.private.modulemap */ = {isa = PBXFileReference; lastKnownFileType = "sourcecode.module-map"; path = module.private.modulemap; sourceTree = "<group>"; };
A948809A2BC9308D0090A44C /* EphemeralPeerExchangeActor.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EphemeralPeerExchangeActor.swift; sourceTree = "<group>"; };
A95EEE352B722CD600A8A39B /* TunnelMonitorState.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TunnelMonitorState.swift; sourceTree = "<group>"; };
A95EEE372B722DFC00A8A39B /* PingStats.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PingStats.swift; sourceTree = "<group>"; };
@@ -2359,6 +2385,7 @@
A9A1DE782AD5708E0073F689 /* TransportStrategy.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = TransportStrategy.swift; sourceTree = "<group>"; };
A9A557F42B7E3E5C0017ADA8 /* EphemeralPeerReceiver.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EphemeralPeerReceiver.swift; sourceTree = "<group>"; };
A9A5F9A12ACB003D0083449F /* TunnelManagerTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TunnelManagerTests.swift; sourceTree = "<group>"; };
+ A9A625922DBBB83D0052E20D /* BoringtunWrapper.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = BoringtunWrapper.framework; sourceTree = BUILT_PRODUCTS_DIR; };
A9A8A8EA2A262AB30086D569 /* FileCache.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FileCache.swift; sourceTree = "<group>"; };
A9B6AC172ADE8F4300F7802A /* MigrationManagerTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MigrationManagerTests.swift; sourceTree = "<group>"; };
A9B6AC192ADE8FBB00F7802A /* InMemorySettingsStore.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = InMemorySettingsStore.swift; sourceTree = "<group>"; };
@@ -2526,6 +2553,10 @@
F998EFF92D3656B100D88D01 /* SKProduct+Sorting.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "SKProduct+Sorting.swift"; sourceTree = "<group>"; };
/* End PBXFileReference section */
+/* Begin PBXFileSystemSynchronizedRootGroup section */
+ A9A6259F2DBBB83D0052E20D /* BoringtunWrapperTests */ = {isa = PBXFileSystemSynchronizedRootGroup; explicitFileTypes = {}; explicitFolders = (); path = BoringtunWrapperTests; sourceTree = "<group>"; };
+/* End PBXFileSystemSynchronizedRootGroup section */
+
/* Begin PBXFrameworksBuildPhase section */
06799AB928F98E1D00ACD94E /* Frameworks */ = {
isa = PBXFrameworksBuildPhase;
@@ -2603,6 +2634,7 @@
A992DA232C24709F00DE7CE5 /* MullvadRustRuntime.framework in Frameworks */,
06799AD128F98E1D00ACD94E /* MullvadREST.framework in Frameworks */,
58B2FDD92AA71D2A003EB5C6 /* MullvadSettings.framework in Frameworks */,
+ A9A625A52DBBB83D0052E20D /* BoringtunWrapper.framework in Frameworks */,
);
runOnlyForDeploymentPostprocessing = 0;
};
@@ -2610,6 +2642,7 @@
isa = PBXFrameworksBuildPhase;
buildActionMask = 2147483647;
files = (
+ A9A625BA2DBBB9BD0052E20D /* BoringtunWrapper.framework in Frameworks */,
58FE25C62AA72779003D1918 /* PacketTunnelCore.framework in Frameworks */,
58FE25CE2AA72802003D1918 /* MullvadSettings.framework in Frameworks */,
58D223EA294C8F3C0029F5F8 /* MullvadTypes.framework in Frameworks */,
@@ -2687,6 +2720,14 @@
);
runOnlyForDeploymentPostprocessing = 0;
};
+ A9A6258F2DBBB83D0052E20D /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ A9A625B72DBBB9390052E20D /* libboringtun.a in Frameworks */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
A9D9A4BD2C36D53C004088DD /* Frameworks */ = {
isa = PBXFrameworksBuildPhase;
buildActionMask = 2147483647;
@@ -3895,6 +3936,8 @@
58695A9E2A4ADA9200328DB3 /* TunnelObfuscationTests */,
A992DA1E2C24709F00DE7CE5 /* MullvadRustRuntime */,
A9D9A4C12C36D53C004088DD /* MullvadRustRuntimeTests */,
+ A946CF442DBBCF8200D6B5EC /* BoringtunWrapper */,
+ A9A6259F2DBBB83D0052E20D /* BoringtunWrapperTests */,
58CE5E61224146200008646E /* Products */,
584F991F2902CBDD001F858D /* Frameworks */,
);
@@ -3921,6 +3964,7 @@
F0ACE3082BE4E478006D5333 /* MullvadMockData.framework */,
A992DA1D2C24709F00DE7CE5 /* MullvadRustRuntime.framework */,
A9D9A4C02C36D53C004088DD /* MullvadRustRuntimeTests.xctest */,
+ A9A625922DBBB83D0052E20D /* BoringtunWrapper.framework */,
);
name = Products;
sourceTree = "<group>";
@@ -4539,6 +4583,25 @@
path = Socks5;
sourceTree = "<group>";
};
+ A946CF402DBBCF8200D6B5EC /* include */ = {
+ isa = PBXGroup;
+ children = (
+ A946CF3F2DBBCF8200D6B5EC /* wireguard_ffi.h */,
+ );
+ path = include;
+ sourceTree = "<group>";
+ };
+ A946CF442DBBCF8200D6B5EC /* BoringtunWrapper */ = {
+ isa = PBXGroup;
+ children = (
+ A946CF402DBBCF8200D6B5EC /* include */,
+ A946CF412DBBCF8200D6B5EC /* BoringtunWrapper.h */,
+ A946CF422DBBCF8200D6B5EC /* BoringTunWrapper.swift */,
+ A946CF432DBBCF8200D6B5EC /* module.private.modulemap */,
+ );
+ path = BoringtunWrapper;
+ sourceTree = "<group>";
+ };
A9840BB12C69F7190030F05E /* Daita */ = {
isa = PBXGroup;
children = (
@@ -4956,6 +5019,15 @@
);
runOnlyForDeploymentPostprocessing = 0;
};
+ A9A6258D2DBBB83D0052E20D /* Headers */ = {
+ isa = PBXHeadersBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ A946CF472DBBCF8200D6B5EC /* BoringtunWrapper.h in Headers */,
+ A946CF4E2DBBD87C00D6B5EC /* wireguard_ffi.h in Headers */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
F0ACE3032BE4E478006D5333 /* Headers */ = {
isa = PBXHeadersBuildPhase;
buildActionMask = 2147483647;
@@ -5088,6 +5160,7 @@
buildRules = (
);
dependencies = (
+ A946CF4D2DBBD84C00D6B5EC /* PBXTargetDependency */,
A9D9A4BA2C36D2FD004088DD /* PBXTargetDependency */,
58C7A45F2A8640490060C66F /* PBXTargetDependency */,
58FE65982AB1D90600E53CB5 /* PBXTargetDependency */,
@@ -5149,6 +5222,7 @@
58B2FDD82AA71D2A003EB5C6 /* PBXTargetDependency */,
F0ACE30F2BE4E478006D5333 /* PBXTargetDependency */,
A992DA222C24709F00DE7CE5 /* PBXTargetDependency */,
+ A9A625A42DBBB83D0052E20D /* PBXTargetDependency */,
);
name = MullvadVPN;
packageProductDependencies = (
@@ -5358,6 +5432,26 @@
productReference = A992DA1D2C24709F00DE7CE5 /* MullvadRustRuntime.framework */;
productType = "com.apple.product-type.framework";
};
+ A9A625912DBBB83D0052E20D /* BoringtunWrapper */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = A9A625B02DBBB83D0052E20D /* Build configuration list for PBXNativeTarget "BoringtunWrapper" */;
+ buildPhases = (
+ A9A6258D2DBBB83D0052E20D /* Headers */,
+ A9A6258E2DBBB83D0052E20D /* Sources */,
+ A9A6258F2DBBB83D0052E20D /* Frameworks */,
+ A9A625902DBBB83D0052E20D /* Resources */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ );
+ name = BoringtunWrapper;
+ packageProductDependencies = (
+ );
+ productName = BoringtunWrapper;
+ productReference = A9A625922DBBB83D0052E20D /* BoringtunWrapper.framework */;
+ productType = "com.apple.product-type.framework";
+ };
A9D9A4BF2C36D53C004088DD /* MullvadRustRuntimeTests */ = {
isa = PBXNativeTarget;
buildConfigurationList = A9D9A4C72C36D53C004088DD /* Build configuration list for PBXNativeTarget "MullvadRustRuntimeTests" */;
@@ -5410,7 +5504,7 @@
isa = PBXProject;
attributes = {
BuildIndependentTargetsInParallel = YES;
- LastSwiftUpdateCheck = 1520;
+ LastSwiftUpdateCheck = 1620;
LastUpgradeCheck = 1430;
ORGANIZATIONNAME = "Mullvad VPN AB";
TargetAttributes = {
@@ -5482,6 +5576,10 @@
CreatedOnToolsVersion = 15.2;
LastSwiftMigration = 1520;
};
+ A9A625912DBBB83D0052E20D = {
+ CreatedOnToolsVersion = 16.2;
+ LastSwiftMigration = 1620;
+ };
A9D9A4BF2C36D53C004088DD = {
CreatedOnToolsVersion = 15.2;
};
@@ -5526,6 +5624,7 @@
F0ACE3072BE4E478006D5333 /* MullvadMockData */,
A992DA1C2C24709F00DE7CE5 /* MullvadRustRuntime */,
A9D9A4BF2C36D53C004088DD /* MullvadRustRuntimeTests */,
+ A9A625912DBBB83D0052E20D /* BoringtunWrapper */,
);
};
/* End PBXProject section */
@@ -5646,6 +5745,13 @@
);
runOnlyForDeploymentPostprocessing = 0;
};
+ A9A625902DBBB83D0052E20D /* Resources */ = {
+ isa = PBXResourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
A9D9A4BE2C36D53C004088DD /* Resources */ = {
isa = PBXResourcesBuildPhase;
buildActionMask = 2147483647;
@@ -6880,6 +6986,14 @@
);
runOnlyForDeploymentPostprocessing = 0;
};
+ A9A6258E2DBBB83D0052E20D /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ A946CF452DBBCF8200D6B5EC /* BoringTunWrapper.swift in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
A9D9A4BC2C36D53C004088DD /* Sources */ = {
isa = PBXSourcesBuildPhase;
buildActionMask = 2147483647;
@@ -7123,6 +7237,11 @@
target = 58D223D4294C8E5E0029F5F8 /* MullvadTypes */;
targetProxy = A9173C332C36CCFB00F6A08C /* PBXContainerItemProxy */;
};
+ A946CF4D2DBBD84C00D6B5EC /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = A9A625912DBBB83D0052E20D /* BoringtunWrapper */;
+ targetProxy = A946CF4C2DBBD84C00D6B5EC /* PBXContainerItemProxy */;
+ };
A959E2402D75F37600F95DDB /* PBXTargetDependency */ = {
isa = PBXTargetDependency;
target = 58D223D4294C8E5E0029F5F8 /* MullvadTypes */;
@@ -7138,6 +7257,11 @@
target = A992DA1C2C24709F00DE7CE5 /* MullvadRustRuntime */;
targetProxy = A992DA212C24709F00DE7CE5 /* PBXContainerItemProxy */;
};
+ A9A625A42DBBB83D0052E20D /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = A9A625912DBBB83D0052E20D /* BoringtunWrapper */;
+ targetProxy = A9A625A32DBBB83D0052E20D /* PBXContainerItemProxy */;
+ };
A9D9A4BA2C36D2FD004088DD /* PBXTargetDependency */ = {
isa = PBXTargetDependency;
target = A992DA1C2C24709F00DE7CE5 /* MullvadRustRuntime */;
@@ -7282,7 +7406,6 @@
isa = XCBuildConfiguration;
baseConfigurationReference = 5808273928487E3E006B77A4 /* Base.xcconfig */;
buildSettings = {
- ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES;
INFOPLIST_FILE = MullvadVPNTests/Info.plist;
LD_RUNPATH_SEARCH_PATHS = (
"$(inherited)",
@@ -7302,7 +7425,6 @@
isa = XCBuildConfiguration;
baseConfigurationReference = 5808273928487E3E006B77A4 /* Base.xcconfig */;
buildSettings = {
- ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES;
INFOPLIST_FILE = MullvadVPNTests/Info.plist;
LD_RUNPATH_SEARCH_PATHS = (
"$(inherited)",
@@ -7642,7 +7764,6 @@
isa = XCBuildConfiguration;
baseConfigurationReference = 5808273B284888BC006B77A4 /* App.xcconfig */;
buildSettings = {
- ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES;
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
CLANG_ENABLE_MODULES = YES;
CODE_SIGN_ENTITLEMENTS = "MullvadVPN/Supporting Files/MullvadVPN.entitlements";
@@ -7670,7 +7791,6 @@
isa = XCBuildConfiguration;
baseConfigurationReference = 5808273B284888BC006B77A4 /* App.xcconfig */;
buildSettings = {
- ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES;
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
CLANG_ENABLE_MODULES = YES;
CODE_SIGN_ENTITLEMENTS = "MullvadVPN/Supporting Files/MullvadVPN.entitlements";
@@ -7702,7 +7822,7 @@
"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
"DEVELOPMENT_TEAM[sdk=iphoneos*]" = CKG9MXH72F;
ENABLE_BITCODE = NO;
- HEADER_SEARCH_PATHS = .;
+ HEADER_SEARCH_PATHS = "";
INFOPLIST_FILE = PacketTunnel/Info.plist;
LD_RUNPATH_SEARCH_PATHS = (
"$(inherited)",
@@ -7729,7 +7849,7 @@
CLANG_ENABLE_MODULES = YES;
CODE_SIGN_ENTITLEMENTS = PacketTunnel/PacketTunnel.entitlements;
ENABLE_BITCODE = NO;
- HEADER_SEARCH_PATHS = .;
+ HEADER_SEARCH_PATHS = "";
INFOPLIST_FILE = PacketTunnel/Info.plist;
LD_RUNPATH_SEARCH_PATHS = (
"$(inherited)",
@@ -8114,7 +8234,6 @@
isa = XCBuildConfiguration;
baseConfigurationReference = 5808273928487E3E006B77A4 /* Base.xcconfig */;
buildSettings = {
- ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES;
CLANG_CXX_LANGUAGE_STANDARD = "gnu++20";
CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
CODE_SIGN_STYLE = Manual;
@@ -8139,7 +8258,6 @@
isa = XCBuildConfiguration;
baseConfigurationReference = 5808273928487E3E006B77A4 /* Base.xcconfig */;
buildSettings = {
- ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES;
CLANG_CXX_LANGUAGE_STANDARD = "gnu++20";
CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
CODE_SIGN_STYLE = Manual;
@@ -8304,7 +8422,6 @@
isa = XCBuildConfiguration;
baseConfigurationReference = 5808273B284888BC006B77A4 /* App.xcconfig */;
buildSettings = {
- ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES;
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
CLANG_ENABLE_MODULES = YES;
CODE_SIGN_ENTITLEMENTS = "MullvadVPN/Supporting Files/MullvadVPN.entitlements";
@@ -8353,7 +8470,7 @@
"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
"DEVELOPMENT_TEAM[sdk=iphoneos*]" = CKG9MXH72F;
ENABLE_BITCODE = NO;
- HEADER_SEARCH_PATHS = .;
+ HEADER_SEARCH_PATHS = "";
INFOPLIST_FILE = PacketTunnel/Info.plist;
LD_RUNPATH_SEARCH_PATHS = (
"$(inherited)",
@@ -8377,7 +8494,6 @@
isa = XCBuildConfiguration;
baseConfigurationReference = 5808273928487E3E006B77A4 /* Base.xcconfig */;
buildSettings = {
- ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES;
INFOPLIST_FILE = MullvadVPNTests/Info.plist;
LD_RUNPATH_SEARCH_PATHS = (
"$(inherited)",
@@ -8719,7 +8835,6 @@
isa = XCBuildConfiguration;
baseConfigurationReference = 5808273928487E3E006B77A4 /* Base.xcconfig */;
buildSettings = {
- ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES;
CLANG_CXX_LANGUAGE_STANDARD = "gnu++20";
CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
CODE_SIGN_STYLE = Manual;
@@ -8996,6 +9111,218 @@
};
name = MockRelease;
};
+ A9A625A72DBBB83D0052E20D /* Debug */ = {
+ isa = XCBuildConfiguration;
+ baseConfigurationReference = 5808273928487E3E006B77A4 /* Base.xcconfig */;
+ buildSettings = {
+ ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES;
+ BUILD_LIBRARY_FOR_DISTRIBUTION = NO;
+ CLANG_CXX_LANGUAGE_STANDARD = "gnu++20";
+ CLANG_ENABLE_MODULES = YES;
+ CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
+ CODE_SIGN_IDENTITY = "Apple Development";
+ CODE_SIGN_STYLE = Manual;
+ CURRENT_PROJECT_VERSION = 1;
+ DEFINES_MODULE = YES;
+ DEVELOPMENT_TEAM = "";
+ "DEVELOPMENT_TEAM[sdk=iphoneos*]" = CKG9MXH72F;
+ DYLIB_COMPATIBILITY_VERSION = 1;
+ DYLIB_CURRENT_VERSION = 1;
+ DYLIB_INSTALL_NAME_BASE = "@rpath";
+ ENABLE_MODULE_VERIFIER = NO;
+ ENABLE_USER_SCRIPT_SANDBOXING = NO;
+ GCC_C_LANGUAGE_STANDARD = gnu17;
+ GENERATE_INFOPLIST_FILE = YES;
+ INFOPLIST_KEY_NSHumanReadableCopyright = "Copyright © 2025 Mullvad VPN AB. All rights reserved.";
+ INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks";
+ IPHONEOS_DEPLOYMENT_TARGET = 15.0;
+ LD_RUNPATH_SEARCH_PATHS = (
+ "$(inherited)",
+ "@executable_path/Frameworks",
+ "@loader_path/Frameworks",
+ );
+ "LIBRARY_SEARCH_PATHS[sdk=iphoneos*][arch=arm64]" = "$(PROJECT_DIR)/boringtun/target/aarch64-apple-ios/debug";
+ "LIBRARY_SEARCH_PATHS[sdk=iphonesimulator*][arch=arm64]" = "$(PROJECT_DIR)/boringtun/target/aarch64-apple-ios-sim/debug";
+ LOCALIZATION_PREFERS_STRING_CATALOGS = YES;
+ MARKETING_VERSION = 1.0;
+ MODULEMAP_PRIVATE_FILE = $PROJECT_DIR/BoringtunWrapper/module.private.modulemap;
+ MODULE_VERIFIER_SUPPORTED_LANGUAGES = "objective-c objective-c++";
+ MODULE_VERIFIER_SUPPORTED_LANGUAGE_STANDARDS = "gnu17 gnu++20";
+ PRODUCT_BUNDLE_IDENTIFIER = "$(APPLICATION_IDENTIFIER).BoringtunWrapper";
+ PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)";
+ PROVISIONING_PROFILE_SPECIFIER = "";
+ SKIP_INSTALL = YES;
+ SUPPORTED_PLATFORMS = "iphoneos iphonesimulator";
+ SUPPORTS_MACCATALYST = NO;
+ SWIFT_ACTIVE_COMPILATION_CONDITIONS = "DEBUG $(inherited)";
+ SWIFT_EMIT_LOC_STRINGS = YES;
+ SWIFT_INSTALL_OBJC_HEADER = YES;
+ SWIFT_OPTIMIZATION_LEVEL = "-Onone";
+ SWIFT_VERSION = 5.0;
+ TARGETED_DEVICE_FAMILY = "1,2";
+ VERSIONING_SYSTEM = "apple-generic";
+ VERSION_INFO_PREFIX = "";
+ };
+ name = Debug;
+ };
+ A9A625A82DBBB83D0052E20D /* Staging */ = {
+ isa = XCBuildConfiguration;
+ baseConfigurationReference = 5808273928487E3E006B77A4 /* Base.xcconfig */;
+ buildSettings = {
+ ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES;
+ BUILD_LIBRARY_FOR_DISTRIBUTION = NO;
+ CLANG_CXX_LANGUAGE_STANDARD = "gnu++20";
+ CLANG_ENABLE_MODULES = YES;
+ CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
+ CODE_SIGN_IDENTITY = "Apple Development";
+ CODE_SIGN_STYLE = Manual;
+ CURRENT_PROJECT_VERSION = 1;
+ DEFINES_MODULE = YES;
+ DEVELOPMENT_TEAM = "";
+ "DEVELOPMENT_TEAM[sdk=iphoneos*]" = CKG9MXH72F;
+ DYLIB_COMPATIBILITY_VERSION = 1;
+ DYLIB_CURRENT_VERSION = 1;
+ DYLIB_INSTALL_NAME_BASE = "@rpath";
+ ENABLE_MODULE_VERIFIER = NO;
+ ENABLE_USER_SCRIPT_SANDBOXING = NO;
+ GCC_C_LANGUAGE_STANDARD = gnu17;
+ GENERATE_INFOPLIST_FILE = YES;
+ INFOPLIST_KEY_NSHumanReadableCopyright = "Copyright © 2025 Mullvad VPN AB. All rights reserved.";
+ INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks";
+ IPHONEOS_DEPLOYMENT_TARGET = 15.0;
+ LD_RUNPATH_SEARCH_PATHS = (
+ "$(inherited)",
+ "@executable_path/Frameworks",
+ "@loader_path/Frameworks",
+ );
+ "LIBRARY_SEARCH_PATHS[sdk=iphoneos*][arch=arm64]" = "$(PROJECT_DIR)/boringtun/target/aarch64-apple-ios/debug";
+ "LIBRARY_SEARCH_PATHS[sdk=iphonesimulator*][arch=arm64]" = "$(PROJECT_DIR)/boringtun/target/aarch64-apple-ios-sim/debug";
+ LOCALIZATION_PREFERS_STRING_CATALOGS = YES;
+ MARKETING_VERSION = 1.0;
+ MODULEMAP_PRIVATE_FILE = $PROJECT_DIR/BoringtunWrapper/module.private.modulemap;
+ MODULE_VERIFIER_SUPPORTED_LANGUAGES = "objective-c objective-c++";
+ MODULE_VERIFIER_SUPPORTED_LANGUAGE_STANDARDS = "gnu17 gnu++20";
+ PRODUCT_BUNDLE_IDENTIFIER = "$(APPLICATION_IDENTIFIER).BoringtunWrapper";
+ PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)";
+ PROVISIONING_PROFILE_SPECIFIER = "";
+ SKIP_INSTALL = YES;
+ SUPPORTED_PLATFORMS = "iphoneos iphonesimulator";
+ SUPPORTS_MACCATALYST = NO;
+ SWIFT_EMIT_LOC_STRINGS = YES;
+ SWIFT_INSTALL_OBJC_HEADER = YES;
+ SWIFT_OPTIMIZATION_LEVEL = "-Onone";
+ SWIFT_VERSION = 5.0;
+ TARGETED_DEVICE_FAMILY = "1,2";
+ VERSIONING_SYSTEM = "apple-generic";
+ VERSION_INFO_PREFIX = "";
+ };
+ name = Staging;
+ };
+ A9A625A92DBBB83D0052E20D /* Release */ = {
+ isa = XCBuildConfiguration;
+ baseConfigurationReference = 5808273928487E3E006B77A4 /* Base.xcconfig */;
+ buildSettings = {
+ ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES;
+ BUILD_LIBRARY_FOR_DISTRIBUTION = NO;
+ CLANG_CXX_LANGUAGE_STANDARD = "gnu++20";
+ CLANG_ENABLE_MODULES = YES;
+ CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
+ CODE_SIGN_IDENTITY = "Apple Development";
+ "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "Apple Distribution";
+ CODE_SIGN_STYLE = Manual;
+ CURRENT_PROJECT_VERSION = 1;
+ DEFINES_MODULE = YES;
+ DEVELOPMENT_TEAM = "";
+ "DEVELOPMENT_TEAM[sdk=iphoneos*]" = CKG9MXH72F;
+ DYLIB_COMPATIBILITY_VERSION = 1;
+ DYLIB_CURRENT_VERSION = 1;
+ DYLIB_INSTALL_NAME_BASE = "@rpath";
+ ENABLE_MODULE_VERIFIER = NO;
+ ENABLE_USER_SCRIPT_SANDBOXING = NO;
+ GCC_C_LANGUAGE_STANDARD = gnu17;
+ GENERATE_INFOPLIST_FILE = YES;
+ INFOPLIST_KEY_NSHumanReadableCopyright = "Copyright © 2025 Mullvad VPN AB. All rights reserved.";
+ INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks";
+ IPHONEOS_DEPLOYMENT_TARGET = 15.0;
+ LD_RUNPATH_SEARCH_PATHS = (
+ "$(inherited)",
+ "@executable_path/Frameworks",
+ "@loader_path/Frameworks",
+ );
+ "LIBRARY_SEARCH_PATHS[sdk=iphoneos*][arch=arm64]" = "$(PROJECT_DIR)/boringtun/target/aarch64-apple-ios/release";
+ "LIBRARY_SEARCH_PATHS[sdk=iphonesimulator*][arch=arm64]" = "$(PROJECT_DIR)/boringtun/target/aarch64-apple-ios-sim/release";
+ LOCALIZATION_PREFERS_STRING_CATALOGS = YES;
+ MARKETING_VERSION = 1.0;
+ MODULEMAP_PRIVATE_FILE = $PROJECT_DIR/BoringtunWrapper/module.private.modulemap;
+ MODULE_VERIFIER_SUPPORTED_LANGUAGES = "objective-c objective-c++";
+ MODULE_VERIFIER_SUPPORTED_LANGUAGE_STANDARDS = "gnu17 gnu++20";
+ PRODUCT_BUNDLE_IDENTIFIER = "$(APPLICATION_IDENTIFIER).BoringtunWrapper";
+ PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)";
+ PROVISIONING_PROFILE_SPECIFIER = "";
+ SKIP_INSTALL = YES;
+ SUPPORTED_PLATFORMS = "iphoneos iphonesimulator";
+ SUPPORTS_MACCATALYST = NO;
+ SWIFT_EMIT_LOC_STRINGS = YES;
+ SWIFT_INSTALL_OBJC_HEADER = YES;
+ SWIFT_VERSION = 5.0;
+ TARGETED_DEVICE_FAMILY = "1,2";
+ VERSIONING_SYSTEM = "apple-generic";
+ VERSION_INFO_PREFIX = "";
+ };
+ name = Release;
+ };
+ A9A625AA2DBBB83D0052E20D /* MockRelease */ = {
+ isa = XCBuildConfiguration;
+ baseConfigurationReference = 5808273928487E3E006B77A4 /* Base.xcconfig */;
+ buildSettings = {
+ ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES;
+ BUILD_LIBRARY_FOR_DISTRIBUTION = NO;
+ CLANG_CXX_LANGUAGE_STANDARD = "gnu++20";
+ CLANG_ENABLE_MODULES = YES;
+ CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
+ CODE_SIGN_IDENTITY = "Apple Development";
+ CODE_SIGN_STYLE = Manual;
+ CURRENT_PROJECT_VERSION = 1;
+ DEFINES_MODULE = YES;
+ DEVELOPMENT_TEAM = "";
+ "DEVELOPMENT_TEAM[sdk=iphoneos*]" = CKG9MXH72F;
+ DYLIB_COMPATIBILITY_VERSION = 1;
+ DYLIB_CURRENT_VERSION = 1;
+ DYLIB_INSTALL_NAME_BASE = "@rpath";
+ ENABLE_MODULE_VERIFIER = NO;
+ ENABLE_USER_SCRIPT_SANDBOXING = NO;
+ GCC_C_LANGUAGE_STANDARD = gnu17;
+ GENERATE_INFOPLIST_FILE = YES;
+ INFOPLIST_KEY_NSHumanReadableCopyright = "Copyright © 2025 Mullvad VPN AB. All rights reserved.";
+ INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks";
+ IPHONEOS_DEPLOYMENT_TARGET = 15.0;
+ LD_RUNPATH_SEARCH_PATHS = (
+ "$(inherited)",
+ "@executable_path/Frameworks",
+ "@loader_path/Frameworks",
+ );
+ "LIBRARY_SEARCH_PATHS[sdk=iphoneos*][arch=arm64]" = "$(PROJECT_DIR)/boringtun/target/aarch64-apple-ios/release";
+ "LIBRARY_SEARCH_PATHS[sdk=iphonesimulator*][arch=arm64]" = "$(PROJECT_DIR)/boringtun/target/aarch64-apple-ios-sim/release";
+ LOCALIZATION_PREFERS_STRING_CATALOGS = YES;
+ MARKETING_VERSION = 1.0;
+ MODULEMAP_PRIVATE_FILE = $PROJECT_DIR/BoringtunWrapper/module.private.modulemap;
+ MODULE_VERIFIER_SUPPORTED_LANGUAGES = "objective-c objective-c++";
+ MODULE_VERIFIER_SUPPORTED_LANGUAGE_STANDARDS = "gnu17 gnu++20";
+ PRODUCT_BUNDLE_IDENTIFIER = "$(APPLICATION_IDENTIFIER).BoringtunWrapper";
+ PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)";
+ PROVISIONING_PROFILE_SPECIFIER = "";
+ SKIP_INSTALL = YES;
+ SUPPORTED_PLATFORMS = "iphoneos iphonesimulator";
+ SUPPORTS_MACCATALYST = NO;
+ SWIFT_EMIT_LOC_STRINGS = YES;
+ SWIFT_INSTALL_OBJC_HEADER = YES;
+ SWIFT_VERSION = 5.0;
+ TARGETED_DEVICE_FAMILY = "1,2";
+ VERSIONING_SYSTEM = "apple-generic";
+ VERSION_INFO_PREFIX = "";
+ };
+ name = MockRelease;
+ };
A9D9A4C82C36D53C004088DD /* Debug */ = {
isa = XCBuildConfiguration;
buildSettings = {
@@ -9160,7 +9487,6 @@
isa = XCBuildConfiguration;
baseConfigurationReference = 5808273B284888BC006B77A4 /* App.xcconfig */;
buildSettings = {
- ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES;
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
CLANG_ENABLE_MODULES = YES;
CODE_SIGN_ENTITLEMENTS = "MullvadVPN/Supporting Files/MullvadVPN.entitlements";
@@ -9205,7 +9531,7 @@
"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
"DEVELOPMENT_TEAM[sdk=iphoneos*]" = CKG9MXH72F;
ENABLE_BITCODE = NO;
- HEADER_SEARCH_PATHS = .;
+ HEADER_SEARCH_PATHS = "";
INFOPLIST_FILE = PacketTunnel/Info.plist;
LD_RUNPATH_SEARCH_PATHS = (
"$(inherited)",
@@ -9228,7 +9554,6 @@
isa = XCBuildConfiguration;
baseConfigurationReference = 5808273928487E3E006B77A4 /* Base.xcconfig */;
buildSettings = {
- ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES;
INFOPLIST_FILE = MullvadVPNTests/Info.plist;
LD_RUNPATH_SEARCH_PATHS = (
"$(inherited)",
@@ -9567,7 +9892,6 @@
isa = XCBuildConfiguration;
baseConfigurationReference = 5808273928487E3E006B77A4 /* Base.xcconfig */;
buildSettings = {
- ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES;
CLANG_CXX_LANGUAGE_STANDARD = "gnu++20";
CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
CODE_SIGN_STYLE = Manual;
@@ -9982,6 +10306,17 @@
defaultConfigurationIsVisible = 0;
defaultConfigurationName = Release;
};
+ A9A625B02DBBB83D0052E20D /* Build configuration list for PBXNativeTarget "BoringtunWrapper" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ A9A625A72DBBB83D0052E20D /* Debug */,
+ A9A625A82DBBB83D0052E20D /* Staging */,
+ A9A625A92DBBB83D0052E20D /* Release */,
+ A9A625AA2DBBB83D0052E20D /* MockRelease */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
A9D9A4C72C36D53C004088DD /* Build configuration list for PBXNativeTarget "MullvadRustRuntimeTests" */ = {
isa = XCConfigurationList;
buildConfigurations = (
diff --git a/ios/MullvadVPN.xcodeproj/xcshareddata/xcschemes/MullvadVPN.xcscheme b/ios/MullvadVPN.xcodeproj/xcshareddata/xcschemes/MullvadVPN.xcscheme
index f2cc3507bd..f093877bd8 100644
--- a/ios/MullvadVPN.xcodeproj/xcshareddata/xcschemes/MullvadVPN.xcscheme
+++ b/ios/MullvadVPN.xcodeproj/xcshareddata/xcschemes/MullvadVPN.xcscheme
@@ -282,6 +282,17 @@
ReferencedContainer = "container:MullvadVPN.xcodeproj">
</BuildableReference>
</TestableReference>
+ <TestableReference
+ skipped = "NO"
+ parallelizable = "YES">
+ <BuildableReference
+ BuildableIdentifier = "primary"
+ BlueprintIdentifier = "A9A625982DBBB83D0052E20D"
+ BuildableName = "BoringtunWrapperTests.xctest"
+ BlueprintName = "BoringtunWrapperTests"
+ ReferencedContainer = "container:MullvadVPN.xcodeproj">
+ </BuildableReference>
+ </TestableReference>
</Testables>
</TestAction>
<LaunchAction
diff --git a/ios/MullvadVPN.xcodeproj/xcshareddata/xcschemes/MullvadVPNUITests.xcscheme b/ios/MullvadVPN.xcodeproj/xcshareddata/xcschemes/MullvadVPNUITests.xcscheme
index c7c011fb01..d3a1cff60f 100644
--- a/ios/MullvadVPN.xcodeproj/xcshareddata/xcschemes/MullvadVPNUITests.xcscheme
+++ b/ios/MullvadVPN.xcodeproj/xcshareddata/xcschemes/MullvadVPNUITests.xcscheme
@@ -28,6 +28,17 @@
ReferencedContainer = "container:MullvadVPN.xcodeproj">
</BuildableReference>
</TestableReference>
+ <TestableReference
+ skipped = "NO"
+ parallelizable = "YES">
+ <BuildableReference
+ BuildableIdentifier = "primary"
+ BlueprintIdentifier = "A9A625982DBBB83D0052E20D"
+ BuildableName = "BoringtunWrapperTests.xctest"
+ BlueprintName = "BoringtunWrapperTests"
+ ReferencedContainer = "container:MullvadVPN.xcodeproj">
+ </BuildableReference>
+ </TestableReference>
</Testables>
</TestAction>
<LaunchAction
diff --git a/ios/MullvadVPN.xcodeproj/xcshareddata/xcschemes/PacketTunnel.xcscheme b/ios/MullvadVPN.xcodeproj/xcshareddata/xcschemes/PacketTunnel.xcscheme
index e3d0f107cf..393e070a26 100644
--- a/ios/MullvadVPN.xcodeproj/xcshareddata/xcschemes/PacketTunnel.xcscheme
+++ b/ios/MullvadVPN.xcodeproj/xcshareddata/xcschemes/PacketTunnel.xcscheme
@@ -51,6 +51,19 @@
reference = "container:TestPlans/MullvadVPNCI.xctestplan">
</TestPlanReference>
</TestPlans>
+ <Testables>
+ <TestableReference
+ skipped = "NO"
+ parallelizable = "YES">
+ <BuildableReference
+ BuildableIdentifier = "primary"
+ BlueprintIdentifier = "A9A625982DBBB83D0052E20D"
+ BuildableName = "BoringtunWrapperTests.xctest"
+ BlueprintName = "BoringtunWrapperTests"
+ ReferencedContainer = "container:MullvadVPN.xcodeproj">
+ </BuildableReference>
+ </TestableReference>
+ </Testables>
</TestAction>
<LaunchAction
buildConfiguration = "Debug"
@@ -80,6 +93,7 @@
savedToolIdentifier = ""
useCustomWorkingDirectory = "NO"
debugDocumentVersioning = "YES"
+ askForAppToLaunch = "Yes"
launchAutomaticallySubstyle = "2">
<BuildableProductRunnable
runnableDebuggingMode = "0">
diff --git a/ios/PacketTunnel/PacketTunnelProvider/PacketTunnelProvider.swift b/ios/PacketTunnel/PacketTunnelProvider/PacketTunnelProvider.swift
index 90f1aa8d69..119ba8226a 100644
--- a/ios/PacketTunnel/PacketTunnelProvider/PacketTunnelProvider.swift
+++ b/ios/PacketTunnel/PacketTunnelProvider/PacketTunnelProvider.swift
@@ -46,6 +46,8 @@ class PacketTunnelProvider: NEPacketTunnelProvider, @unchecked Sendable {
providerLogger = Logger(label: "PacketTunnelProvider")
providerLogger.info("Starting new packet tunnel")
+ BoringTunWrapper().createTunnel()
+
let containerURL = ApplicationConfiguration.containerURL
let addressCache = REST.AddressCache(canWriteToCache: false, cacheDirectory: containerURL)
addressCache.loadFromFile()
diff --git a/ios/PacketTunnelCore/Actor/PacketTunnelActor.swift b/ios/PacketTunnelCore/Actor/PacketTunnelActor.swift
index bf4feac3c1..cc3a58e386 100644
--- a/ios/PacketTunnelCore/Actor/PacketTunnelActor.swift
+++ b/ios/PacketTunnelCore/Actor/PacketTunnelActor.swift
@@ -14,6 +14,7 @@ import MullvadSettings
import MullvadTypes
import NetworkExtension
import WireGuardKitTypes
+import BoringtunWrapper
/**
Packet tunnel state machine implemented as an actor.
@@ -168,6 +169,9 @@ extension PacketTunnelActor {
private func start(options: StartOptions) async {
guard case .initial = state else { return }
+ let wrapper = BoringTunWrapper()
+ wrapper.createTunnel()
+
logger.debug("\(options.logFormat())")
// Start observing default network path to determine network reachability.