diff options
| author | David Lönnhager <david.l@mullvad.net> | 2022-08-15 11:34:01 +0200 |
|---|---|---|
| committer | David Lönnhager <david.l@mullvad.net> | 2022-08-15 11:34:01 +0200 |
| commit | 428ad126d8ca0bdb42bbde6442028e9497d0e171 (patch) | |
| tree | f36a2bfedde74a08e41f4bb42528ce6cd8ef0090 | |
| parent | 844714165375e3a8ec45dcc7a97e4907ccda8e27 (diff) | |
| parent | c5197218e9612242c36df2504c52f4af8b4b0472 (diff) | |
| download | mullvadvpn-428ad126d8ca0bdb42bbde6442028e9497d0e171.tar.xz mullvadvpn-428ad126d8ca0bdb42bbde6442028e9497d0e171.zip | |
Merge branch 'update-wireguard-go'
| -rw-r--r-- | .github/workflows/android-app.yml | 4 | ||||
| -rw-r--r-- | .github/workflows/daemon.yml | 12 | ||||
| -rw-r--r-- | .github/workflows/ios.yml | 2 | ||||
| -rw-r--r-- | CHANGELOG.md | 2 | ||||
| -rw-r--r-- | Dockerfile | 8 | ||||
| -rw-r--r-- | README.md | 5 | ||||
| -rw-r--r-- | android/docker/Dockerfile | 16 | ||||
| -rw-r--r-- | android/docker/README.md | 2 | ||||
| -rwxr-xr-x | android/fdroid-build/init.sh | 11 | ||||
| m--------- | dist-assets/binaries | 0 | ||||
| -rw-r--r-- | dist-assets/windows/installer.nsh | 7 | ||||
| -rw-r--r-- | talpid-core/src/tunnel/openvpn/mod.rs | 28 | ||||
| -rw-r--r-- | talpid-core/src/tunnel/openvpn/wintun.rs | 192 | ||||
| -rw-r--r-- | windows/driverlogic/src/driverlogic.cpp | 17 | ||||
| -rw-r--r-- | windows/driverlogic/src/wintun.h | 10 | ||||
| -rwxr-xr-x | wireguard/build-wireguard-go.sh | 2 | ||||
| -rw-r--r-- | wireguard/libwg/Android.mk | 5 | ||||
| -rw-r--r-- | wireguard/libwg/Dockerfile_AndroidPatchedGoruntime | 8 | ||||
| -rw-r--r-- | wireguard/libwg/go.mod | 16 | ||||
| -rw-r--r-- | wireguard/libwg/go.sum | 58 | ||||
| -rw-r--r-- | wireguard/libwg/libwg_windows.go | 16 |
21 files changed, 112 insertions, 309 deletions
diff --git a/.github/workflows/android-app.yml b/.github/workflows/android-app.yml index 00161fecd9..4e8379e709 100644 --- a/.github/workflows/android-app.yml +++ b/.github/workflows/android-app.yml @@ -57,9 +57,9 @@ jobs: - name: Configure Go if: steps.cache-native-libs.outputs.cache-hit != 'true' - uses: actions/setup-go@v2.1.3 + uses: actions/setup-go@v3 with: - go-version: 1.16 + go-version: 1.18.5 - name: Configure Android NDK if: steps.cache-native-libs.outputs.cache-hit != 'true' diff --git a/.github/workflows/daemon.yml b/.github/workflows/daemon.yml index d4eda3e2dc..f0c8b843d6 100644 --- a/.github/workflows/daemon.yml +++ b/.github/workflows/daemon.yml @@ -54,9 +54,9 @@ jobs: default: true - name: Install Go - uses: actions/setup-go@v2.1.3 + uses: actions/setup-go@v3 with: - go-version: 1.16 + go-version: 1.18.5 - name: Install build dependencies run: | @@ -79,9 +79,9 @@ jobs: default: true - name: Install Go - uses: actions/setup-go@v2.1.3 + uses: actions/setup-go@v3 with: - go-version: 1.16 + go-version: 1.18.5 - name: Build and test crates run: ./ci/check-rust.sh @@ -121,9 +121,9 @@ jobs: default: true - name: Install Go - uses: actions/setup-go@v2.1.3 + uses: actions/setup-go@v3 with: - go-version: 1.16 + go-version: 1.18.5 - name: Install msbuild uses: microsoft/setup-msbuild@v1.0.2 diff --git a/.github/workflows/ios.yml b/.github/workflows/ios.yml index 3e4998dc5d..cf1ff4b058 100644 --- a/.github/workflows/ios.yml +++ b/.github/workflows/ios.yml @@ -48,7 +48,7 @@ jobs: - name: Setup go-lang uses: actions/setup-go@v3 with: - go-version: '1.16.5' + go-version: 1.18.5 - name: Prepare iOS simulator run: | diff --git a/CHANGELOG.md b/CHANGELOG.md index aad8dd68b8..a22ab1c6ff 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -43,6 +43,7 @@ Line wrap the file at 100 chars. Th ### Changed - Reject invalid WireGuard ports in the CLI. - Reorganize settings into more logical categories. +- Upgrade wireguard-go to 20220703234212 (Windows: v0.5.3). #### Android - Lowered default MTU to 1280 on Android. @@ -50,6 +51,7 @@ Line wrap the file at 100 chars. Th #### Windows - Remove dependency on `ipconfig.exe`. Call `DnsFlushResolverCache` to flush the DNS cache. +- Upgrade Wintun to 0.14.1. ### Removed #### Android diff --git a/Dockerfile b/Dockerfile index 563cc13c86..c9dc12294c 100644 --- a/Dockerfile +++ b/Dockerfile @@ -14,10 +14,10 @@ RUN apt update -y && apt install build-essential \ # Install golang -ENV GOLANG_VERSION 1.16 -# Found on https://golang.org/dl/ -ENV GOLANG_HASH 013a489ebb3e24ef3d915abe5b94c3286c070dfe0818d5bca8108f1d6e8440d2 -RUN curl -Lo go.tgz https://golang.org/dl/go${GOLANG_VERSION}.linux-amd64.tar.gz && \ +ENV GOLANG_VERSION 1.18.5 +# Checksum from: https://go.dev/dl/ +ENV GOLANG_HASH 9e5de37f9c49942c601b191ac5fba404b868bfc21d446d6960acc12283d6e5f2 +RUN curl -Lo go.tgz https://go.dev/dl/go${GOLANG_VERSION}.linux-amd64.tar.gz && \ echo $(sha256sum go.tgz) && \ echo "${GOLANG_HASH} go.tgz" | sha256sum -c - && \ tar -C /usr/local -xzf go.tgz && \ @@ -291,7 +291,7 @@ storePassword = keystore-password npm install -g npm ``` -1. Install Go (ideally version `1.16`) by following the [official +1. Install Go (ideally version `1.18`) by following the [official instructions](https://golang.org/doc/install). Newer versions may work too. Since `cgo` is being used, make sure to have a C compiler in your path. [*On Windows*](https://github.com/golang/go/wiki/cgo#windows) `mingw`'s `gcc` compiler should work. @@ -338,9 +338,6 @@ After that copy the files from `gui/src/main/management_interface/` and `gui/bui directories into a single directory on your Apple Silicon Mac, and set the value of `MANAGEMENT_INTERFACE_PROTO_BUILD_DIR` to that directory while running the main build. -Make sure that the version of Go on your Mac is 1.16 (the first version to add -[support](https://tip.golang.org/doc/go1.16#darwin) for Apple Silicon) or newer. - Install `protobuf` by running: ```bash diff --git a/android/docker/Dockerfile b/android/docker/Dockerfile index 7a46151646..3a2bfd73ac 100644 --- a/android/docker/Dockerfile +++ b/android/docker/Dockerfile @@ -43,17 +43,19 @@ RUN cd /tmp && \ ENV ANDROID_NDK_HOME="/opt/android/android-ndk-r20b" \ NDK_TOOLCHAIN_DIR="/opt/android/android-ndk-r20b/toolchains/llvm/prebuilt/linux-x86_64/bin" -# Install Go +# Install golang +ENV GOLANG_VERSION 1.18.5 +# Checksum from: https://go.dev/dl/ +ENV GOLANG_HASH 9e5de37f9c49942c601b191ac5fba404b868bfc21d446d6960acc12283d6e5f2 COPY goruntime-boottime-over-monotonic.diff /tmp/goruntime-boottime-over-monotonic.diff - RUN cd /tmp && \ - curl -sf -L -O https://dl.google.com/go/go1.16.linux-amd64.tar.gz && \ - echo "013a489ebb3e24ef3d915abe5b94c3286c070dfe0818d5bca8108f1d6e8440d2 go1.16.linux-amd64.tar.gz" | sha256sum -c && \ + curl -sf -L -o go.tgz https://go.dev/dl/go${GOLANG_VERSION}.linux-amd64.tar.gz && \ + echo "$GOLANG_HASH go.tgz" | sha256sum -c && \ cd /opt && \ - tar -xzf /tmp/go1.16.linux-amd64.tar.gz && \ + tar -xzf /tmp/go.tgz && \ patch -p1 -f -N -r- -d "/opt/go" < /tmp/goruntime-boottime-over-monotonic.diff && \ mkdir /opt/go/go-path && \ - rm /tmp/goruntime-boottime-over-monotonic.diff /tmp/go1.16.linux-amd64.tar.gz + rm /tmp/goruntime-boottime-over-monotonic.diff /tmp/go.tgz ENV GOROOT=/opt/go GOPATH=/opt/go/go-path PATH=${PATH}:/opt/go/bin @@ -72,7 +74,7 @@ ENV PATH="${PATH}:/root/.cargo/bin" \ RUN curl -sf -L https://sh.rustup.rs > /tmp/rustup.sh && \ cd /tmp && \ - echo "a3cb081f88a6789d104518b30d4aa410009cd08c3822a1226991d6cf0442a0f8 rustup.sh" | sha256sum -c && \ + echo "173f4881e2de99ba9ad1acb59e65be01b2a44979d83b6ec648d0d22f8654cbce rustup.sh" | sha256sum -c && \ chmod +x rustup.sh && \ ./rustup.sh -y && \ rm rustup.sh && \ diff --git a/android/docker/README.md b/android/docker/README.md index 38cf5a38ee..4594f65466 100644 --- a/android/docker/README.md +++ b/android/docker/README.md @@ -39,7 +39,7 @@ The example below builds only for 64-bit ARM and x86-64: docker run \ --rm \ -it \ - -e ARCHITECTURES="aarch64 x86_64" + -e ARCHITECTURES="aarch64 x86_64" \ --name mullvad-android-build \ -v /home/user/mullvadvpn-app:/project \ -w /project \ diff --git a/android/fdroid-build/init.sh b/android/fdroid-build/init.sh index f363372df7..f8d498e10c 100755 --- a/android/fdroid-build/init.sh +++ b/android/fdroid-build/init.sh @@ -19,11 +19,14 @@ rustup target add \ aarch64-linux-android \ armv7-linux-androideabi -# Install Go +# Install golang +GOLANG_VERSION="1.18.5" +# Checksum from: https://golang.org/dl/ +GOLANG_HASH="9e5de37f9c49942c601b191ac5fba404b868bfc21d446d6960acc12283d6e5f2" cd "$HOME" -curl -sf -L -O https://golang.org/dl/go1.16.linux-amd64.tar.gz -echo "013a489ebb3e24ef3d915abe5b94c3286c070dfe0818d5bca8108f1d6e8440d2 go1.16.linux-amd64.tar.gz" | sha256sum -c -tar -xzvf go1.16.linux-amd64.tar.gz +curl -sf -L -o go.tgz https://go.dev/dl/go${GOLANG_VERSION}.linux-amd64.tar.gz +echo "$GOLANG_HASH go.tgz" | sha256sum -c +tar -xzvf go.tgz patch -p1 -f -N -r- -d "$HOME/go" < "$REPO_DIR/wireguard/libwg/goruntime-boottime-over-monotonic.diff" # Configure Cargo for cross-compilation diff --git a/dist-assets/binaries b/dist-assets/binaries -Subproject b63c5c8c7977963aeb585b6ddd4537dffe2aeee +Subproject 1c5f5202fc522ecbf9d5e972ed70df5cbb71cf6 diff --git a/dist-assets/windows/installer.nsh b/dist-assets/windows/installer.nsh index cb4ea8a417..b699982ad0 100644 --- a/dist-assets/windows/installer.nsh +++ b/dist-assets/windows/installer.nsh @@ -12,8 +12,6 @@ # Do not compare variables using the <> operator - broken # -!define WINTUN_POOL "Mullvad" - # "sc" exit code !define SERVICE_STARTED 0 !define SERVICE_START_PENDING 2 @@ -148,13 +146,12 @@ log::Log "RemoveWintun()" - nsExec::ExecToStack '"$TEMP\driverlogic.exe" wintun-delete-pool-driver ${WINTUN_POOL}' + nsExec::ExecToStack '"$TEMP\driverlogic.exe" wintun-delete-driver' Pop $0 Pop $1 ${If} $0 != ${DL_GENERAL_SUCCESS} - IntFmt $0 "0x%X" $0 - StrCpy $R0 "Failed to remove Wintun pool: error $0" + StrCpy $R0 "Failed to remove Wintun driver. It may be in use." log::LogWithDetails $R0 $1 Goto RemoveWintun_return_only ${EndIf} diff --git a/talpid-core/src/tunnel/openvpn/mod.rs b/talpid-core/src/tunnel/openvpn/mod.rs index 9c09c935f8..15d9013610 100644 --- a/talpid-core/src/tunnel/openvpn/mod.rs +++ b/talpid-core/src/tunnel/openvpn/mod.rs @@ -43,7 +43,7 @@ mod wintun; #[cfg(windows)] lazy_static! { static ref ADAPTER_ALIAS: U16CString = U16CString::from_str("Mullvad").unwrap(); - static ref ADAPTER_POOL: U16CString = U16CString::from_str("Mullvad").unwrap(); + static ref ADAPTER_TUNNEL_TYPE: U16CString = U16CString::from_str("Mullvad").unwrap(); } #[cfg(windows)] @@ -87,11 +87,6 @@ pub enum Error { #[error(display = "Failed to create Wintun adapter")] WintunCreateAdapterError(#[error(source)] io::Error), - /// cannot determine adapter name - #[cfg(windows)] - #[error(display = "Failed to determine alias of Wintun adapter")] - WintunFindAlias(#[error(source)] io::Error), - /// OpenVPN process died unexpectedly #[error(display = "OpenVPN process died unexpectedly")] ChildProcessDied, @@ -215,7 +210,7 @@ impl std::fmt::Debug for dyn WintunContext { #[cfg(windows)] #[derive(Debug)] struct WintunContextImpl { - adapter: wintun::TemporaryWintunAdapter, + adapter: wintun::WintunAdapter, wait_v6_interface: bool, _logger: wintun::WintunLoggerHandle, } @@ -224,7 +219,7 @@ struct WintunContextImpl { #[async_trait::async_trait] impl WintunContext for WintunContextImpl { fn luid(&self) -> NET_LUID { - self.adapter.adapter().luid() + self.adapter.luid() } fn ipv6(&self) -> bool { @@ -232,22 +227,19 @@ impl WintunContext for WintunContextImpl { } async fn wait_for_interfaces(&self) -> io::Result<()> { - let luid = self.adapter.adapter().luid(); + let luid = self.adapter.luid(); crate::windows::wait_for_interfaces(luid, true, self.wait_v6_interface).await } fn prepare_interface(&self) { - self.adapter.adapter().prepare_interface(); + self.adapter.prepare_interface(); } } #[cfg(windows)] impl WintunContextImpl { - fn alias(&self) -> Result<U16CString> { - self.adapter - .adapter() - .name() - .map_err(Error::WintunFindAlias) + fn alias(&self) -> U16CString { + self.adapter.name() } } @@ -300,7 +292,7 @@ impl OpenVpnMonitor<OpenVpnCommand> { resource_dir, &proxy_monitor, #[cfg(windows)] - wintun.alias()?.to_os_string(), + wintun.alias().to_os_string(), )?; let plugin_path = Self::get_plugin_path(resource_dir)?; @@ -347,10 +339,10 @@ impl OpenVpnMonitor<OpenVpnCommand> { let dll = wintun::WintunDll::instance(resource_dir).map_err(Error::WintunDllError)?; let wintun_logger = dll.activate_logging(); - let (wintun_adapter, _reboot_required) = wintun::TemporaryWintunAdapter::create( + let wintun_adapter = wintun::WintunAdapter::create( dll.clone(), &*ADAPTER_ALIAS, - &*ADAPTER_POOL, + &*ADAPTER_TUNNEL_TYPE, Some(ADAPTER_GUID.clone()), ) .map_err(Error::WintunCreateAdapterError)?; diff --git a/talpid-core/src/tunnel/openvpn/wintun.rs b/talpid-core/src/tunnel/openvpn/wintun.rs index 813d0de2e7..9d9996aefc 100644 --- a/talpid-core/src/tunnel/openvpn/wintun.rs +++ b/talpid-core/src/tunnel/openvpn/wintun.rs @@ -14,7 +14,7 @@ use winapi::{ shared::{ guiddef::GUID, ifdef::NET_LUID, - minwindef::{BOOL, FARPROC, HINSTANCE, HMODULE}, + minwindef::{FARPROC, HINSTANCE, HMODULE}, netioapi::ConvertInterfaceLuidToGuid, winerror::NO_ERROR, }, @@ -35,33 +35,17 @@ lazy_static! { static ref WINTUN_DLL: Mutex<Option<Arc<WintunDll>>> = Mutex::new(None); } -/// Longest possible adapter name (in characters), including null terminator -const MAX_ADAPTER_NAME: usize = 128; - -type WintunOpenAdapterFn = - unsafe extern "stdcall" fn(pool: *const u16, name: *const u16) -> RawHandle; - type WintunCreateAdapterFn = unsafe extern "stdcall" fn( - pool: *const u16, name: *const u16, + tunnel_type: *const u16, requested_guid: *const GUID, - reboot_required: *mut BOOL, ) -> RawHandle; -type WintunFreeAdapterFn = unsafe extern "stdcall" fn(adapter: RawHandle); - -type WintunDeleteAdapterFn = unsafe extern "stdcall" fn( - adapter: RawHandle, - force_close_sessions: BOOL, - reboot_required: *mut BOOL, -) -> BOOL; - -type WintunGetAdapterNameFn = - unsafe extern "stdcall" fn(adapter: RawHandle, name: *mut u16) -> BOOL; +type WintunCloseAdapterFn = unsafe extern "stdcall" fn(adapter: RawHandle); type WintunGetAdapterLuidFn = unsafe extern "stdcall" fn(adapter: RawHandle, luid: *mut NET_LUID); -type WintunLoggerCbFn = extern "stdcall" fn(WintunLoggerLevel, *const u16); +type WintunLoggerCbFn = extern "stdcall" fn(WintunLoggerLevel, u64, *const u16); type WintunSetLoggerFn = unsafe extern "stdcall" fn(Option<WintunLoggerCbFn>); @@ -75,11 +59,8 @@ enum WintunLoggerLevel { pub struct WintunDll { handle: HINSTANCE, - func_open: WintunOpenAdapterFn, func_create: WintunCreateAdapterFn, - func_free: WintunFreeAdapterFn, - func_delete: WintunDeleteAdapterFn, - func_get_adapter_name: WintunGetAdapterNameFn, + func_close: WintunCloseAdapterFn, func_get_adapter_luid: WintunGetAdapterLuidFn, func_set_logger: WintunSetLoggerFn, } @@ -87,50 +68,11 @@ pub struct WintunDll { unsafe impl Send for WintunDll {} unsafe impl Sync for WintunDll {} -type RebootRequired = bool; - -/// A new Wintun adapter that is destroyed when dropped. -#[derive(Debug)] -pub struct TemporaryWintunAdapter { - pub adapter: WintunAdapter, -} - -impl TemporaryWintunAdapter { - pub fn create( - dll_handle: Arc<WintunDll>, - pool: &U16CStr, - name: &U16CStr, - requested_guid: Option<GUID>, - ) -> io::Result<(Self, RebootRequired)> { - let (adapter, reboot_required) = - WintunAdapter::create(dll_handle, pool, name, requested_guid)?; - Ok((TemporaryWintunAdapter { adapter }, reboot_required)) - } - - pub fn adapter(&self) -> &WintunAdapter { - &self.adapter - } -} - -impl Drop for TemporaryWintunAdapter { - fn drop(&mut self) { - if let Err(error) = unsafe { - self.adapter - .dll_handle - .delete_adapter(self.adapter.handle, true) - } { - log::error!( - "{}", - error.display_chain_with_msg("Failed to delete Wintun adapter") - ); - } - } -} - /// Represents a Wintun adapter. pub struct WintunAdapter { dll_handle: Arc<WintunDll>, handle: RawHandle, + name: U16CString, } impl fmt::Debug for WintunAdapter { @@ -145,41 +87,20 @@ unsafe impl Send for WintunAdapter {} unsafe impl Sync for WintunAdapter {} impl WintunAdapter { - pub fn open(dll_handle: Arc<WintunDll>, pool: &U16CStr, name: &U16CStr) -> io::Result<Self> { - Ok(Self { - handle: dll_handle.open_adapter(pool, name)?, - dll_handle, - }) - } - pub fn create( dll_handle: Arc<WintunDll>, - pool: &U16CStr, name: &U16CStr, + tunnel_type: &U16CStr, requested_guid: Option<GUID>, - ) -> io::Result<(Self, RebootRequired)> { - { - if let Ok(adapter) = Self::open(dll_handle.clone(), name, pool) { - // Delete existing adapter in case it has residual config - adapter.delete(false).map_err(|error| { - log::error!( - "{}", - error.display_chain_with_msg("Failed to delete existing Wintun adapter") - ); - error - })?; - } - } - - let (handle, restart_required) = dll_handle.create_adapter(pool, name, requested_guid)?; - - if restart_required { - log::warn!("You may need to restart Windows to complete the install of Wintun"); - } - - let adapter = Self { dll_handle, handle }; + ) -> io::Result<Self> { + let handle = dll_handle.create_adapter(name, tunnel_type, requested_guid)?; + let adapter = Self { + dll_handle, + handle, + name: name.to_owned(), + }; adapter.restore_missing_component_id(); - Ok((adapter, restart_required)) + Ok(adapter) } pub fn prepare_interface(&self) { @@ -191,15 +112,8 @@ impl WintunAdapter { } } - pub fn delete(self, force_close_sessions: bool) -> io::Result<RebootRequired> { - unsafe { - self.dll_handle - .delete_adapter(self.handle, force_close_sessions) - } - } - - pub fn name(&self) -> io::Result<U16CString> { - unsafe { self.dll_handle.get_adapter_name(self.handle) } + pub fn name(&self) -> U16CString { + self.name.to_owned() } pub fn luid(&self) -> NET_LUID { @@ -262,7 +176,7 @@ impl WintunAdapter { impl Drop for WintunAdapter { fn drop(&mut self) { - unsafe { self.dll_handle.free_adapter(self.handle) }; + unsafe { self.dll_handle.close_adapter(self.handle) }; } } @@ -301,34 +215,16 @@ impl WintunDll { ) -> io::Result<Self> { Ok(WintunDll { handle, - func_open: unsafe { - *((&get_proc_fn( - handle, - CStr::from_bytes_with_nul(b"WintunOpenAdapter\0").unwrap(), - )?) as *const _ as *const _) - }, func_create: unsafe { *((&get_proc_fn( handle, CStr::from_bytes_with_nul(b"WintunCreateAdapter\0").unwrap(), )?) as *const _ as *const _) }, - func_delete: unsafe { + func_close: unsafe { *((&get_proc_fn( handle, - CStr::from_bytes_with_nul(b"WintunDeleteAdapter\0").unwrap(), - )?) as *const _ as *const _) - }, - func_free: unsafe { - *((&get_proc_fn( - handle, - CStr::from_bytes_with_nul(b"WintunFreeAdapter\0").unwrap(), - )?) as *const _ as *const _) - }, - func_get_adapter_name: unsafe { - *((&get_proc_fn( - handle, - CStr::from_bytes_with_nul(b"WintunGetAdapterName\0").unwrap(), + CStr::from_bytes_with_nul(b"WintunCloseAdapter\0").unwrap(), )?) as *const _ as *const _) }, func_get_adapter_luid: unsafe { @@ -354,59 +250,25 @@ impl WintunDll { Ok(handle) } - pub fn open_adapter(&self, pool: &U16CStr, name: &U16CStr) -> io::Result<RawHandle> { - let handle = unsafe { (self.func_open)(pool.as_ptr(), name.as_ptr()) }; - if handle == ptr::null_mut() { - return Err(io::Error::last_os_error()); - } - Ok(handle) - } - pub fn create_adapter( &self, - pool: &U16CStr, name: &U16CStr, + tunnel_type: &U16CStr, requested_guid: Option<GUID>, - ) -> io::Result<(RawHandle, RebootRequired)> { + ) -> io::Result<RawHandle> { let guid_ptr = match requested_guid.as_ref() { Some(guid) => guid as *const _, None => ptr::null_mut(), }; - let mut reboot_required = 0; - let handle = unsafe { - (self.func_create)(pool.as_ptr(), name.as_ptr(), guid_ptr, &mut reboot_required) - }; + let handle = unsafe { (self.func_create)(name.as_ptr(), tunnel_type.as_ptr(), guid_ptr) }; if handle == ptr::null_mut() { return Err(io::Error::last_os_error()); } - Ok((handle, reboot_required != 0)) - } - - pub unsafe fn delete_adapter( - &self, - adapter: RawHandle, - force_close_sessions: bool, - ) -> io::Result<RebootRequired> { - let mut reboot_required = 0; - let force_close_sessions = if force_close_sessions { 1 } else { 0 }; - let result = (self.func_delete)(adapter, force_close_sessions, &mut reboot_required); - if result == 0 { - return Err(io::Error::last_os_error()); - } - Ok(reboot_required != 0) - } - - pub unsafe fn free_adapter(&self, adapter: RawHandle) { - (self.func_free)(adapter); + Ok(handle) } - pub unsafe fn get_adapter_name(&self, adapter: RawHandle) -> io::Result<U16CString> { - let mut alias_buffer = vec![0u16; MAX_ADAPTER_NAME]; - let result = (self.func_get_adapter_name)(adapter, alias_buffer.as_mut_ptr()); - if result == 0 { - return Err(io::Error::last_os_error()); - } - Ok(U16CString::from_vec_truncate(alias_buffer)) + pub unsafe fn close_adapter(&self, adapter: RawHandle) { + (self.func_close)(adapter); } pub unsafe fn get_adapter_luid(&self, adapter: RawHandle) -> NET_LUID { @@ -440,7 +302,7 @@ impl WintunLoggerHandle { Self { dll_handle } } - extern "stdcall" fn callback(level: WintunLoggerLevel, message: *const u16) { + extern "stdcall" fn callback(level: WintunLoggerLevel, _timestamp: u64, message: *const u16) { if message.is_null() { return; } diff --git a/windows/driverlogic/src/driverlogic.cpp b/windows/driverlogic/src/driverlogic.cpp index aba746d3e3..2fdcc3046c 100644 --- a/windows/driverlogic/src/driverlogic.cpp +++ b/windows/driverlogic/src/driverlogic.cpp @@ -228,26 +228,23 @@ ReturnCode CommandSplitTunnelForceInstall(const std::vector<std::wstring> &args) return CommandSplitTunnelNewInstall(args); } -ReturnCode CommandWintunDeletePool(const std::vector<std::wstring> &args) +ReturnCode CommandWintunDeleteDriver(const std::vector<std::wstring> &args) { ArgumentContext argsContext(args); - argsContext.ensureExactArgumentCount(1); - - const auto poolName = argsContext.next(); + argsContext.ensureExactArgumentCount(0); WintunDll wintun; - BOOL rebootRequired; - - if (FALSE == wintun.deletePoolDriver(poolName.c_str(), &rebootRequired)) + if (FALSE == wintun.deleteDriver()) { - throw std::runtime_error("Failed to delete wintun pool"); + // NOTE: This is expected if there are other adapters in use. + throw std::runtime_error("Failed to delete wintun driver"); } std::wstringstream ss; - ss << L"Successfully deleted wintun pool. Reboot required: " << rebootRequired; + ss << L"Deleted Wintun driver"; Log(ss.str()); @@ -343,7 +340,7 @@ int wmain(int argc, const wchar_t *argv[]) { L"st-new-install", CommandSplitTunnelNewInstall }, { L"st-force-install", CommandSplitTunnelForceInstall }, { L"st-remove", CommandSplitTunnelRemove }, - { L"wintun-delete-pool-driver", CommandWintunDeletePool }, + { L"wintun-delete-driver", CommandWintunDeleteDriver }, { L"wintun-delete-abandoned-device", CommandWintunDeleteAbandonedDevice }, { L"wg-nt-cleanup", CommandWireGuardNtCleanup } }; diff --git a/windows/driverlogic/src/wintun.h b/windows/driverlogic/src/wintun.h index 3d81be97e3..22444fcd94 100644 --- a/windows/driverlogic/src/wintun.h +++ b/windows/driverlogic/src/wintun.h @@ -20,10 +20,7 @@ public: try { - createAdapter = getProcAddressOrThrow<WINTUN_CREATE_ADAPTER_FUNC>("WintunCreateAdapter"); - openAdapter = getProcAddressOrThrow<WINTUN_OPEN_ADAPTER_FUNC>("WintunOpenAdapter"); - freeAdapter = getProcAddressOrThrow<WINTUN_FREE_ADAPTER_FUNC>("WintunFreeAdapter"); - deletePoolDriver = getProcAddressOrThrow<WINTUN_DELETE_POOL_DRIVER_FUNC>("WintunDeletePoolDriver"); + deleteDriver = getProcAddressOrThrow<WINTUN_DELETE_DRIVER_FUNC*>("WintunDeleteDriver"); } catch (...) { @@ -40,10 +37,7 @@ public: } } - WINTUN_CREATE_ADAPTER_FUNC createAdapter; - WINTUN_OPEN_ADAPTER_FUNC openAdapter; - WINTUN_FREE_ADAPTER_FUNC freeAdapter; - WINTUN_DELETE_POOL_DRIVER_FUNC deletePoolDriver; + WINTUN_DELETE_DRIVER_FUNC *deleteDriver; private: diff --git a/wireguard/build-wireguard-go.sh b/wireguard/build-wireguard-go.sh index 0b63cc3f43..33330c9298 100755 --- a/wireguard/build-wireguard-go.sh +++ b/wireguard/build-wireguard-go.sh @@ -109,7 +109,7 @@ function build_unix { function build_android { echo "Building for android" - local docker_image_hash="5e3ad65f2d344a891343633a7f545b56fd4cbc0a9776b921ce245773150cf781" + local docker_image_hash="afa84a78b428163b4585d04259fad801df2ebf5ab079f53b3a90892afd18dd9f" if is_docker_build $@; then docker run --rm \ diff --git a/wireguard/libwg/Android.mk b/wireguard/libwg/Android.mk index cfbf5e3eb5..54fd160db8 100644 --- a/wireguard/libwg/Android.mk +++ b/wireguard/libwg/Android.mk @@ -22,8 +22,9 @@ default: $(DESTDIR)/libwg.so GOBUILDARCH := $(NDK_GO_ARCH_MAP_$(shell uname -m)) GOBUILDOS := $(shell uname -s | tr '[:upper:]' '[:lower:]') -GOBUILDVERSION := 1.12 -GOBUILDTARBALL := https://dl.google.com/go/go$(GOBUILDVERSION).$(GOBUILDOS)-$(GOBUILDARCH).tar.gz +GOBUILDVERSION := 1.18.5 +# TODO: Add checksum? +GOBUILDTARBALL := https://go.dev/dl/go$(GOBUILDVERSION).$(GOBUILDOS)-$(GOBUILDARCH).tar.gz GOBUILDVERSION_NEEDED := go version go$(GOBUILDVERSION) $(GOBUILDOS)/$(GOBUILDARCH) $(DESTDIR)/libwg.so: diff --git a/wireguard/libwg/Dockerfile_AndroidPatchedGoruntime b/wireguard/libwg/Dockerfile_AndroidPatchedGoruntime index 12b1248fa1..32e1591fe3 100644 --- a/wireguard/libwg/Dockerfile_AndroidPatchedGoruntime +++ b/wireguard/libwg/Dockerfile_AndroidPatchedGoruntime @@ -1,5 +1,5 @@ # To build the image: -# docker build . -t quay.io/mullvad/mullvad-android-app-build +# docker build . -t quay.io/mullvad/mullvad-android-app-build -f Dockerfile_AndroidPatchedGoruntime # To push the image to Quay.io: # docker push quay.io/mullvad/mullvad-android-app-build @@ -27,13 +27,13 @@ RUN cd /tmp && \ ENV ANDROID_NDK_HOME="/opt/android/android-ndk-r20b" ENV NDK_TOOLCHAIN_DIR="${ANDROID_NDK_HOME}/toolchains/llvm/prebuilt/linux-x86_64/bin" -ENV GOLANG_VERSION 1.16 -ENV GOLANG_HASH 013a489ebb3e24ef3d915abe5b94c3286c070dfe0818d5bca8108f1d6e8440d2 +ENV GOLANG_VERSION 1.18.5 +ENV GOLANG_HASH 9e5de37f9c49942c601b191ac5fba404b868bfc21d446d6960acc12283d6e5f2 # Install Go-lang and patch it to use the appropriate monotonic clock COPY goruntime-boottime-over-monotonic.diff /opt/goruntime-boottime-over-monotonic.diff RUN cd /tmp && \ - curl -sf -L -o go.tgz https://golang.org/dl/go${GOLANG_VERSION}.linux-amd64.tar.gz && \ + curl -sf -L -o go.tgz https://go.dev/dl/go${GOLANG_VERSION}.linux-amd64.tar.gz && \ echo "${GOLANG_HASH} go.tgz" | sha256sum -c - && \ cd /opt && \ tar -xzf /tmp/go.tgz && \ diff --git a/wireguard/libwg/go.mod b/wireguard/libwg/go.mod index cde1c8b121..27f48a3d06 100644 --- a/wireguard/libwg/go.mod +++ b/wireguard/libwg/go.mod @@ -1,11 +1,15 @@ module github.com/mullvad/mullvadvpn-app/wireguard/libwg -go 1.16 +go 1.18 require ( - golang.org/x/crypto v0.0.0-20210513164829-c07d793c2f9a // indirect - golang.org/x/net v0.0.0-20210525063256-abc453219eb5 // indirect - golang.org/x/sys v0.0.0-20210521203332-0cec03c779c1 - golang.zx2c4.com/wireguard v0.0.0-20210521230051-c27ff9b9f6f7 - golang.zx2c4.com/wireguard/windows v0.3.14 + golang.org/x/sys v0.0.0-20220808155132-1c4a2a72c664 + golang.zx2c4.com/wireguard v0.0.0-20220703234212-c31a7b1ab478 + golang.zx2c4.com/wireguard/windows v0.5.3 +) + +require ( + golang.org/x/crypto v0.0.0-20220722155217-630584e8d5aa // indirect + golang.org/x/net v0.0.0-20220809184613-07c6da5e1ced // indirect + golang.zx2c4.com/wintun v0.0.0-20211104114900-415007cec224 // indirect ) diff --git a/wireguard/libwg/go.sum b/wireguard/libwg/go.sum index 56874032e0..d1f125b01c 100644 --- a/wireguard/libwg/go.sum +++ b/wireguard/libwg/go.sum @@ -1,46 +1,12 @@ -github.com/lxn/walk v0.0.0-20210112085537-c389da54e794/go.mod h1:E23UucZGqpuUANJooIbHWCufXvOcT6E7Stq81gU+CSQ= -github.com/lxn/win v0.0.0-20210218163916-a377121e959e/go.mod h1:KxxjdtRkfNoYDCUP5ryK7XJJNTnpC8atvtmTheChOtk= -golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= -golang.org/x/crypto v0.0.0-20210220033148-5ea612d1eb83 h1:/ZScEX8SfEmUGRHs0gxpqteO5nfNW6axyZbBdw9A12g= -golang.org/x/crypto v0.0.0-20210220033148-5ea612d1eb83/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I= -golang.org/x/crypto v0.0.0-20210506145944-38f3c27a63bf/go.mod h1:P+XmwS30IXTQdn5tA2iutPOUgjI07+tq3H3K9MVA1s8= -golang.org/x/crypto v0.0.0-20210513164829-c07d793c2f9a h1:kr2P4QFmQr29mSLA43kwrOcgcReGTfbE9N577tCTuBc= -golang.org/x/crypto v0.0.0-20210513164829-c07d793c2f9a/go.mod h1:P+XmwS30IXTQdn5tA2iutPOUgjI07+tq3H3K9MVA1s8= -golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20210224082022-3d97a244fca7/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= -golang.org/x/net v0.0.0-20210226172049-e18ecbb05110 h1:qWPm9rbaAMKs8Bq/9LRpbMqxWRVUAQwMI9fVrssnTfw= -golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= -golang.org/x/net v0.0.0-20210510120150-4163338589ed/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20210525063256-abc453219eb5 h1:wjuX4b5yYQnEQHzd+CBcrcC6OVR2J1CN6mUy0oSxIPo= -golang.org/x/net v0.0.0-20210525063256-abc453219eb5/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20201018230417-eeed37f84f13/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210225014209-683adc9d29d7/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210225134936-a50acf3fe073/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210303074136-134d130e1a04 h1:cEhElsAv9LUt9ZUUocxzWe05oFLVd+AA2nstydTeI8g= -golang.org/x/sys v0.0.0-20210303074136-134d130e1a04/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210309040221-94ec62e08169 h1:fpeMGRM6A+XFcw4RPCO8s8hH7ppgrGR22pSIjwM7YUI= -golang.org/x/sys v0.0.0-20210309040221-94ec62e08169/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210521203332-0cec03c779c1 h1:lCnv+lfrU9FRPGf8NeRuWAAPjNnema5WtBinMgs1fD8= -golang.org/x/sys v0.0.0-20210521203332-0cec03c779c1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw= -golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= -golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= -golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.6-0.20210220033129-8f690f22cf1c/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.7-0.20210503195748-5c7c50ebbd4f/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= -golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.zx2c4.com/wireguard v0.0.0-20210225140808-70b7b7158fc9 h1:TJSR8+LPfs2r4KYDa8DMfYm4RH/PdjY7GoyidowPqXo= -golang.zx2c4.com/wireguard v0.0.0-20210225140808-70b7b7158fc9/go.mod h1:39ZQQ95hUxDxT7opsWy/rtfgvXXc8s30qfZ02df69Fo= -golang.zx2c4.com/wireguard v0.0.0-20210424170727-c9db4b7aaa22 h1:ytS28bw9HtZVDRMDxviC6ryCJuccw+zXhh04u2IRWJw= -golang.zx2c4.com/wireguard v0.0.0-20210424170727-c9db4b7aaa22/go.mod h1:a057zjmoc00UN7gVkaJt2sXVK523kMJcogDTEvPIasg= -golang.zx2c4.com/wireguard v0.0.0-20210510202332-9844c74f67ec/go.mod h1:a057zjmoc00UN7gVkaJt2sXVK523kMJcogDTEvPIasg= -golang.zx2c4.com/wireguard v0.0.0-20210521230051-c27ff9b9f6f7 h1:49xj+395UVX4Bo7Qvm9JR44mewBtqUpWqHqreDuPQI8= -golang.zx2c4.com/wireguard v0.0.0-20210521230051-c27ff9b9f6f7/go.mod h1:a057zjmoc00UN7gVkaJt2sXVK523kMJcogDTEvPIasg= -golang.zx2c4.com/wireguard/windows v0.3.14 h1:5yIDYyrQyGkLqV+tzY4ilMNeIvQeMXAz0glZz9u179A= -golang.zx2c4.com/wireguard/windows v0.3.14/go.mod h1:3P4IEAsb+BjlKZmpUXgy74c0iX9AVwwr3WcVJ8nPgME= +golang.org/x/crypto v0.0.0-20220722155217-630584e8d5aa h1:zuSxTR4o9y82ebqCUJYNGJbGPo6sKVl54f/TVDObg1c= +golang.org/x/crypto v0.0.0-20220722155217-630584e8d5aa/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= +golang.org/x/net v0.0.0-20220809184613-07c6da5e1ced h1:3dYNDff0VT5xj+mbj2XucFst9WKk6PdGOrb9n+SbIvw= +golang.org/x/net v0.0.0-20220809184613-07c6da5e1ced/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk= +golang.org/x/sys v0.0.0-20220808155132-1c4a2a72c664 h1:v1W7bwXHsnLLloWYTVEdvGvA7BHMeBYsPcF0GLDxIRs= +golang.org/x/sys v0.0.0-20220808155132-1c4a2a72c664/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.zx2c4.com/wintun v0.0.0-20211104114900-415007cec224 h1:Ug9qvr1myri/zFN6xL17LSCBGFDnphBBhzmILHsM5TY= +golang.zx2c4.com/wintun v0.0.0-20211104114900-415007cec224/go.mod h1:deeaetjYA+DHMHg+sMSMI58GrEteJUUzzw7en6TJQcI= +golang.zx2c4.com/wireguard v0.0.0-20220703234212-c31a7b1ab478 h1:vDy//hdR+GnROE3OdYbQKt9rdtNdHkDtONvpRwmls/0= +golang.zx2c4.com/wireguard v0.0.0-20220703234212-c31a7b1ab478/go.mod h1:bVQfyl2sCM/QIIGHpWbFGfHPuDvqnCNkT6MQLTCjO/U= +golang.zx2c4.com/wireguard/windows v0.5.3 h1:On6j2Rpn3OEMXqBq00QEDC7bWSZrPIHKIus8eIuExIE= +golang.zx2c4.com/wireguard/windows v0.5.3/go.mod h1:9TEe8TJmtwyQebdFwAkEWOPr3prrtqm+REGFifP60hI= diff --git a/wireguard/libwg/libwg_windows.go b/wireguard/libwg/libwg_windows.go index af7d7f6488..a1dc4fd265 100644 --- a/wireguard/libwg/libwg_windows.go +++ b/wireguard/libwg/libwg_windows.go @@ -11,7 +11,6 @@ import "C" import ( "bufio" - "fmt" "strings" "unsafe" @@ -20,7 +19,6 @@ import ( "golang.zx2c4.com/wireguard/conn" "golang.zx2c4.com/wireguard/device" "golang.zx2c4.com/wireguard/tun" - "golang.zx2c4.com/wireguard/tun/wintun" "github.com/mullvad/mullvadvpn-app/wireguard/libwg/logging" "github.com/mullvad/mullvadvpn-app/wireguard/libwg/tunnelcontainer" @@ -31,16 +29,6 @@ import ( type LogSink = unsafe.Pointer type LogContext = unsafe.Pointer -var MullvadPool *wintun.Pool - -func init() { - var err error - MullvadPool, err = wintun.MakePool("Mullvad") - if err != nil { - panic(fmt.Errorf("Failed to make pool: %w", err)) - } -} - //export wgTurnOn func wgTurnOn(cIfaceName *C.char, mtu int, cSettings *C.char, cIfaceNameOut **C.char, cLuidOut *uint64, logSink LogSink, logContext LogContext) int32 { logger := logging.NewLogger(logSink, logContext) @@ -64,9 +52,7 @@ func wgTurnOn(cIfaceName *C.char, mtu int, cSettings *C.char, cIfaceNameOut **C. // {AFE43773-E1F8-4EBB-8536-576AB86AFE9A} networkId := windows.GUID{0xafe43773, 0xe1f8, 0x4ebb, [8]byte{0x85, 0x36, 0x57, 0x6a, 0xb8, 0x6a, 0xfe, 0x9a}} - if tun.WintunPool != MullvadPool { - tun.WintunPool = MullvadPool - } + tun.WintunTunnelType = "Mullvad" wintun, err := tun.CreateTUNWithRequestedGUID(ifaceName, &networkId, mtu) if err != nil { |
