summaryrefslogtreecommitdiffhomepage
path: root/mullvad-update/src
diff options
context:
space:
mode:
authorDavid Lönnhager <david.l@mullvad.net>2025-02-25 17:51:07 +0100
committerDavid Lönnhager <david.l@mullvad.net>2025-03-06 00:09:17 +0100
commitfcc8ae39aa2bcd89a857cd16603019192bd3faf9 (patch)
tree514b825b607c9c3005da82be5040390bef382b7c /mullvad-update/src
parent2ac281969fde80ce9e2baa62092bd5d94884f6be (diff)
downloadmullvadvpn-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.rs2
-rw-r--r--mullvad-update/src/client/verify.rs34
-rw-r--r--mullvad-update/src/hash.rs29
-rw-r--r--mullvad-update/src/lib.rs7
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;