diff options
| author | David Lönnhager <david.l@mullvad.net> | 2025-03-26 09:40:41 +0100 |
|---|---|---|
| committer | David Lönnhager <david.l@mullvad.net> | 2025-03-28 17:04:58 +0100 |
| commit | 200d4837f16cc9501bdeefc034d16646f56f303d (patch) | |
| tree | f38192648b661d914c2f152bb5a81628181a4a2e /mullvad-update/src | |
| parent | 8fbf46194b975655f6b0e5131032d17ed47875fc (diff) | |
| download | mullvadvpn-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.rs | 3 | ||||
| -rw-r--r-- | mullvad-update/src/keys.rs | 41 | ||||
| -rw-r--r-- | mullvad-update/src/lib.rs | 2 |
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 |
