diff options
| author | David Lönnhager <david.l@mullvad.net> | 2025-02-25 17:51:07 +0100 |
|---|---|---|
| committer | David Lönnhager <david.l@mullvad.net> | 2025-03-06 00:09:17 +0100 |
| commit | fcc8ae39aa2bcd89a857cd16603019192bd3faf9 (patch) | |
| tree | 514b825b607c9c3005da82be5040390bef382b7c /mullvad-update/src | |
| parent | 2ac281969fde80ce9e2baa62092bd5d94884f6be (diff) | |
| download | mullvadvpn-fcc8ae39aa2bcd89a857cd16603019192bd3faf9.tar.xz mullvadvpn-fcc8ae39aa2bcd89a857cd16603019192bd3faf9.zip | |
Make meta tool build on Linux
Diffstat (limited to 'mullvad-update/src')
| -rw-r--r-- | mullvad-update/src/client/app.rs | 2 | ||||
| -rw-r--r-- | mullvad-update/src/client/verify.rs | 34 | ||||
| -rw-r--r-- | mullvad-update/src/hash.rs | 29 | ||||
| -rw-r--r-- | mullvad-update/src/lib.rs | 7 |
4 files changed, 39 insertions, 33 deletions
diff --git a/mullvad-update/src/client/app.rs b/mullvad-update/src/client/app.rs index decf8d932b..6b894dd201 100644 --- a/mullvad-update/src/client/app.rs +++ b/mullvad-update/src/client/app.rs @@ -1,3 +1,5 @@ +#![cfg(any(target_os = "macos", target_os = "windows"))] + //! This module implements the flow of downloading and verifying the app. use std::{ffi::OsString, path::PathBuf, time::Duration}; diff --git a/mullvad-update/src/client/verify.rs b/mullvad-update/src/client/verify.rs index 08738206ee..28a53f839d 100644 --- a/mullvad-update/src/client/verify.rs +++ b/mullvad-update/src/client/verify.rs @@ -1,8 +1,7 @@ use anyhow::Context; -use sha2::Digest; use tokio::{ fs, - io::{AsyncRead, AsyncReadExt, BufReader}, + io::{AsyncRead, BufReader}, }; use std::{future::Future, path::Path}; @@ -22,11 +21,6 @@ pub trait AppVerifier: 'static + Clone { #[derive(Clone)] pub struct Sha256Verifier; -impl Sha256Verifier { - /// Maximum number of bytes to read at a time - const BUF_SIZE: usize = 1024 * 1024; -} - impl AppVerifier for Sha256Verifier { /// The checksum type Parameters = [u8; 32]; @@ -49,34 +43,11 @@ impl AppVerifier for Sha256Verifier { } impl Sha256Verifier { - pub async fn generate_hash( - mut reader: impl AsyncRead + Unpin, - ) -> anyhow::Result<[u8; 32]> - { - let mut hasher = sha2::Sha256::new(); - - // Read data into hasher - let mut buffer = vec![0u8; Self::BUF_SIZE]; - loop { - let read_n = reader - .read(&mut buffer) - .await - .context("Error reading bin file")?; - if read_n == 0 { - // We're done - break; - } - hasher.update(&buffer[..read_n]); - } - - Ok(hasher.finalize().into()) - } - async fn verify_inner( reader: impl AsyncRead + Unpin, expected_hash: [u8; 32], ) -> anyhow::Result<()> { - let actual_hash = Self::generate_hash(reader).await?; + let actual_hash = crate::hash::checksum(reader).await?; // Verify that hash is correct if expected_hash != actual_hash { @@ -90,6 +61,7 @@ impl Sha256Verifier { #[cfg(test)] mod test { use rand::RngCore; + use sha2::Digest; use std::io::Cursor; use super::*; diff --git a/mullvad-update/src/hash.rs b/mullvad-update/src/hash.rs new file mode 100644 index 0000000000..4a5891124e --- /dev/null +++ b/mullvad-update/src/hash.rs @@ -0,0 +1,29 @@ +//! Compute checksum for SHA-256 + +use anyhow::Context; +use sha2::Digest; +use tokio::io::{AsyncRead, AsyncReadExt}; + +/// Maximum number of bytes to read at a time +const BUF_SIZE: usize = 10 * 1024 * 1024; + +/// Generate SHA256 checksum for `reader` +pub async fn checksum(mut reader: impl AsyncRead + Unpin) -> anyhow::Result<[u8; 32]> { + let mut hasher = sha2::Sha256::new(); + + // Read data into hasher + let mut buffer = vec![0u8; BUF_SIZE]; + loop { + let read_n = reader + .read(&mut buffer) + .await + .context("Error reading bin file")?; + if read_n == 0 { + // We're done + break; + } + hasher.update(&buffer[..read_n]); + } + + Ok(hasher.finalize().into()) +} diff --git a/mullvad-update/src/lib.rs b/mullvad-update/src/lib.rs index 2c78908089..4efd060b4b 100644 --- a/mullvad-update/src/lib.rs +++ b/mullvad-update/src/lib.rs @@ -1,12 +1,15 @@ //! Support functions for securely installing or updating Mullvad VPN -#[cfg(all(feature = "client", any(target_os = "windows", target_os = "macos")))] +#[cfg(feature = "client")] mod client; -#[cfg(all(feature = "client", any(target_os = "windows", target_os = "macos")))] +#[cfg(feature = "client")] pub use client::*; pub mod version; /// Parser and serializer for version metadata pub mod format; + +#[cfg(feature = "client")] +pub mod hash; |
