summaryrefslogtreecommitdiffhomepage
path: root/mullvad-update/src
diff options
context:
space:
mode:
authorDavid Lönnhager <david.l@mullvad.net>2025-03-26 09:40:41 +0100
committerDavid Lönnhager <david.l@mullvad.net>2025-03-28 17:04:58 +0100
commit200d4837f16cc9501bdeefc034d16646f56f303d (patch)
treef38192648b661d914c2f152bb5a81628181a4a2e /mullvad-update/src
parent8fbf46194b975655f6b0e5131032d17ed47875fc (diff)
downloadmullvadvpn-200d4837f16cc9501bdeefc034d16646f56f303d.tar.xz
mullvadvpn-200d4837f16cc9501bdeefc034d16646f56f303d.zip
Switch from staging to prod for version metadata
Diffstat (limited to 'mullvad-update/src')
-rw-r--r--mullvad-update/src/format/key.rs3
-rw-r--r--mullvad-update/src/keys.rs41
-rw-r--r--mullvad-update/src/lib.rs2
3 files changed, 44 insertions, 2 deletions
diff --git a/mullvad-update/src/format/key.rs b/mullvad-update/src/format/key.rs
index c61b2dd9e0..1f49efa5c4 100644
--- a/mullvad-update/src/format/key.rs
+++ b/mullvad-update/src/format/key.rs
@@ -75,8 +75,7 @@ impl Serialize for SecretKey {
}
/// ed25519 verifying key
-#[derive(Debug, PartialEq, Eq)]
-#[cfg_attr(test, derive(Clone))]
+#[derive(Debug, PartialEq, Eq, Clone)]
pub struct VerifyingKey(pub ed25519_dalek::VerifyingKey);
impl fmt::Display for VerifyingKey {
diff --git a/mullvad-update/src/keys.rs b/mullvad-update/src/keys.rs
new file mode 100644
index 0000000000..9b0abf5c6b
--- /dev/null
+++ b/mullvad-update/src/keys.rs
@@ -0,0 +1,41 @@
+//! Keys that may be used for verifying data
+
+use crate::format::key::VerifyingKey;
+use std::sync::LazyLock;
+use vec1::Vec1;
+
+/// Pubkeys used to verify metadata from the Mullvad API (production)
+pub static TRUSTED_METADATA_SIGNING_PUBKEYS: LazyLock<Vec1<VerifyingKey>> =
+ LazyLock::new(|| parse_keys(include_str!("../trusted-metadata-signing-pubkeys")));
+
+fn parse_keys(keys: &str) -> Vec1<VerifyingKey> {
+ let mut v = vec![];
+ for key in keys.split('\n') {
+ let key = key.trim();
+ if key.starts_with('#') || key.is_empty() {
+ continue;
+ }
+ v.push(VerifyingKey::from_hex(key).expect("invalid pubkey"));
+ }
+ v.try_into().expect("need at least one key")
+}
+
+#[cfg(test)]
+#[test]
+fn test_parse_keys() {
+ let key1 = "AB4EF63FFDCC6BD5A19C30CD23B9DE03099407A04463418F17AE338B98AA09D4".to_lowercase();
+ let key2 = "BB4EF63FFDCC6BD5A19C30CD23B9DE03099407A04463418F17AE338B98AA09D4".to_lowercase();
+ let keys = parse_keys(&format!(
+ r#"
+# test
+{key1}
+# test 2
+{key2}
+"#
+ ));
+ assert_eq!(format!("{}", keys[0]), key1);
+ assert_eq!(format!("{}", keys[1]), key2);
+
+ // Test that actual keys are validly parsed
+ let _prod = &*TRUSTED_METADATA_SIGNING_PUBKEYS;
+}
diff --git a/mullvad-update/src/lib.rs b/mullvad-update/src/lib.rs
index 4efd060b4b..88e78034a7 100644
--- a/mullvad-update/src/lib.rs
+++ b/mullvad-update/src/lib.rs
@@ -6,6 +6,8 @@ mod client;
#[cfg(feature = "client")]
pub use client::*;
+pub mod keys;
+
pub mod version;
/// Parser and serializer for version metadata