Skip to main content

product_policy/
product_policy_helpers.rs

1// Copyright (c) Microsoft Corporation.
2// Licensed under the MIT License.
3
4//! Shared helpers for product policy validation and serialization.
5
6#[cfg(feature = "manifest")]
7/// Custom serialization and deserialization for UEFI JSON bytes which is picked from igvm recipe.
8pub mod custom_uefi_json_serde {
9    extern crate alloc;
10
11    use alloc::format;
12    use alloc::string::String;
13    use alloc::vec::Vec;
14    use base64::Engine as _;
15    use serde::Deserialize as _;
16
17    /// Serialize a slice of bytes as a base64-encoded string.
18    pub fn serialize<S>(bytes: &[u8], s: S) -> Result<S::Ok, S::Error>
19    where
20        S: serde::Serializer,
21    {
22        let encoded = base64::engine::general_purpose::STANDARD.encode(bytes);
23        s.serialize_str(&encoded)
24    }
25
26    /// Deserialize a base64-encoded string into a vector of bytes.
27    pub fn deserialize<'de, D>(d: D) -> Result<Vec<u8>, D::Error>
28    where
29        D: serde::Deserializer<'de>,
30    {
31        let s = String::deserialize(d)?;
32        if s.is_empty() {
33            return Ok(Vec::new());
34        }
35        base64::engine::general_purpose::STANDARD
36            .decode(s.as_bytes())
37            .map_err(|e| serde::de::Error::custom(format!("failed to base64-decode bytes: {e}")))
38    }
39}