summaryrefslogtreecommitdiffhomepage
path: root/mullvad-update/src/client
diff options
context:
space:
mode:
authorDavid Lönnhager <david.l@mullvad.net>2025-03-06 17:40:25 +0100
committerDavid Lönnhager <david.l@mullvad.net>2025-03-07 10:21:26 +0100
commita2bb3a2bfee997ca657906ec391a576327d07dfe (patch)
tree6c803656b48dfae82efb397cd8c9614aa101b694 /mullvad-update/src/client
parent2dc82d54771bcb4111b0611072f9d9321fd899dc (diff)
downloadmullvadvpn-a2bb3a2bfee997ca657906ec391a576327d07dfe.tar.xz
mullvadvpn-a2bb3a2bfee997ca657906ec391a576327d07dfe.zip
Support multiple verifying keys in mullvad-update
Diffstat (limited to 'mullvad-update/src/client')
-rw-r--r--mullvad-update/src/client/api.rs14
1 files changed, 8 insertions, 6 deletions
diff --git a/mullvad-update/src/client/api.rs b/mullvad-update/src/client/api.rs
index 62b550603f..d3e4ea1790 100644
--- a/mullvad-update/src/client/api.rs
+++ b/mullvad-update/src/client/api.rs
@@ -1,6 +1,7 @@
//! This module implements fetching of information about app versions
use anyhow::Context;
+use vec1::Vec1;
use crate::format;
use crate::version::{VersionInfo, VersionParameters};
@@ -19,7 +20,7 @@ pub struct HttpVersionInfoProvider {
/// Accepted root certificate. Defaults are used unless specified
pub pinned_certificate: Option<reqwest::Certificate>,
/// Key to use for verifying the response
- pub verifying_key: format::key::VerifyingKey,
+ pub verifying_keys: Vec1<format::key::VerifyingKey>,
}
#[async_trait::async_trait]
@@ -41,7 +42,7 @@ impl HttpVersionInfoProvider {
) -> anyhow::Result<format::SignedResponse> {
let raw_json = Self::get(&self.url, self.pinned_certificate.clone()).await?;
let response = format::SignedResponse::deserialize_and_verify(
- &self.verifying_key,
+ &self.verifying_keys,
&raw_json,
lowest_metadata_version,
)?;
@@ -101,6 +102,7 @@ impl HttpVersionInfoProvider {
#[cfg(test)]
mod test {
use insta::assert_yaml_snapshot;
+ use vec1::vec1;
use crate::version::VersionArchitecture;
@@ -115,9 +117,9 @@ mod test {
/// We're not testing the correctness of [version] here, only the HTTP client
#[tokio::test]
async fn test_http_version_provider() -> anyhow::Result<()> {
- let verifying_key =
- crate::format::key::VerifyingKey::from_hex(include_str!("../../test-pubkey"))
- .expect("valid key");
+ let valid_key = crate::format::key::VerifyingKey::from_hex(include_str!("../../test-pubkey"))
+ .expect("valid key");
+ let verifying_keys = vec1![valid_key];
// Start HTTP server
let mut server = mockito::Server::new_async().await;
@@ -138,7 +140,7 @@ mod test {
let info_provider = HttpVersionInfoProvider {
url,
pinned_certificate: None,
- verifying_key,
+ verifying_keys,
};
let info = info_provider