Skip to main content

gatehouse_runtime_protocol/lifecycle/
installation.rs

1//! Protected installation snapshots. No process execution, daemon access or
2//! authority minting. Callers must keep/revalidate held descriptors through spawn.
3use super::{
4    canonical,
5    wire::{EngineBinding, Request, PROTOCOL},
6};
7use crate::{digest, Invalid, Result};
8use serde::{Deserialize, Serialize};
9
10#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
11#[serde(deny_unknown_fields)]
12struct Host {
13    schema: String,
14    installation_path: String,
15    installation_sha256: String,
16    config_path: String,
17    config_sha256: String,
18}
19#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
20#[serde(deny_unknown_fields)]
21struct Installation {
22    schema: String,
23    product: String,
24    version: String,
25    protocol: String,
26    executable_path: String,
27    executable_sha256: String,
28    config_schema: String,
29}
30#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
31#[serde(deny_unknown_fields)]
32struct Config {
33    schema: String,
34    engine_binding: EngineBinding,
35}
36
37fn parse<T: serde::de::DeserializeOwned + Serialize>(bytes: &[u8]) -> Result<T> {
38    let value = canonical::parse_canonical(bytes)?;
39    let typed: T = serde_json::from_value(value)
40        .map_err(|_| Invalid("invalid lifecycle installation schema"))?;
41    if canonical::encode(
42        &serde_json::to_value(&typed).map_err(|_| Invalid("invalid installation encoding"))?,
43    )? != bytes
44    {
45        return Err(Invalid("installation fields changed during parsing"));
46    }
47    Ok(typed)
48}
49#[cfg(unix)]
50mod files;
51#[cfg(unix)]
52pub use files::{InstallationSnapshot, VerifiedInstallation};
53
54#[cfg(target_os = "linux")]
55mod sealed;
56#[cfg(target_os = "linux")]
57pub use sealed::parse_protected_inputs;