saddle-core 0.2.0

Shared contracts for Saddle components
Documentation
use serde::Deserialize;
use std::sync::atomic::{AtomicBool, Ordering};

const APPROVED: &[u8] = include_bytes!("approved-inputs/golden-c8-rc9-startup-assembly.json");
static CONSUMED: AtomicBool = AtomicBool::new(false);

/// The sole source-controlled rc.9 Golden/C8 startup-assembly input.
#[doc(hidden)]
pub struct ApprovedGoldenC8StartupAssemblyInput {
    bytes: &'static [u8],
}

/// Opaque, non-Clone permission for one Golden/C8 listener-preclosure run.
#[doc(hidden)]
pub struct VerifiedGoldenC8StartupAssemblyInputOwner {
    _input: ApprovedGoldenC8StartupAssemblyInput,
}

#[doc(hidden)]
pub struct GoldenC8StartupAssemblyRejection {
    input: ApprovedGoldenC8StartupAssemblyInput,
}

impl GoldenC8StartupAssemblyRejection {
    #[doc(hidden)]
    pub fn into_input(self) -> ApprovedGoldenC8StartupAssemblyInput {
        self.input
    }
}

#[doc(hidden)]
pub fn approved_golden_c8_startup_assembly_input() -> ApprovedGoldenC8StartupAssemblyInput {
    ApprovedGoldenC8StartupAssemblyInput { bytes: APPROVED }
}

#[doc(hidden)]
pub fn verify_golden_c8_startup_assembly_input(
    input: ApprovedGoldenC8StartupAssemblyInput,
) -> Result<VerifiedGoldenC8StartupAssemblyInputOwner, GoldenC8StartupAssemblyRejection> {
    if !matches_approved(&input)
        || CONSUMED
            .compare_exchange(false, true, Ordering::AcqRel, Ordering::Acquire)
            .is_err()
    {
        return Err(GoldenC8StartupAssemblyRejection { input });
    }
    Ok(VerifiedGoldenC8StartupAssemblyInputOwner { _input: input })
}

fn matches_approved(input: &ApprovedGoldenC8StartupAssemblyInput) -> bool {
    if input.bytes.as_ptr() != APPROVED.as_ptr() || input.bytes.len() != APPROVED.len() {
        return false;
    }
    let Ok(value) = serde_json::from_slice::<Document>(input.bytes) else {
        return false;
    };
    value == Document::approved()
}

#[derive(Deserialize, PartialEq, Eq)]
#[serde(deny_unknown_fields)]
struct Document {
    schema: String,
    authority_scope: String,
    rust_manifest_sha256: String,
    skill_tgz_sha256: String,
    compatibility_manifest_sha256: String,
    artifact_pair_identity: String,
    application_a_manifest_sha256: String,
    application_b_manifest_sha256: String,
    environment_identity: String,
    run_identity: String,
    validation_permit_sha256: String,
    semantic_whole_sha256: String,
    startup_profile_identity: String,
    startup_transaction_entry_sha256: String,
    single_use: bool,
    listener_preclosure_authority: bool,
    listener_open_authority: bool,
    production_authority: bool,
    release_authority: bool,
    publish_authority: bool,
    signing_authority: bool,
}

impl Document {
    fn approved() -> Self {
        serde_json::from_slice(APPROVED).expect("approved startup assembly input")
    }
}

#[cfg(test)]
mod tests {
    use super::*;

    fn reject(value: serde_json::Value) {
        let bytes = Box::leak(serde_json::to_vec(&value).unwrap().into_boxed_slice());
        let pointer = bytes.as_ptr();
        let input = ApprovedGoldenC8StartupAssemblyInput { bytes };
        let restored = verify_golden_c8_startup_assembly_input(input)
            .err()
            .expect("drift must fail")
            .into_input();
        assert_eq!(restored.bytes.as_ptr(), pointer);
        assert_eq!(restored.bytes, bytes);
    }

    #[test]
    fn exact_closure_is_single_run_and_all_drift_is_recoverable() {
        let base: serde_json::Value = serde_json::from_slice(APPROVED).unwrap();
        for field in [
            "rust_manifest_sha256",
            "skill_tgz_sha256",
            "compatibility_manifest_sha256",
            "artifact_pair_identity",
            "application_a_manifest_sha256",
            "application_b_manifest_sha256",
            "environment_identity",
            "run_identity",
            "validation_permit_sha256",
            "semantic_whole_sha256",
            "startup_profile_identity",
            "startup_transaction_entry_sha256",
        ] {
            let mut changed = base.clone();
            changed[field] = serde_json::Value::String("0".repeat(64));
            reject(changed);
        }
        let _owner =
            verify_golden_c8_startup_assembly_input(approved_golden_c8_startup_assembly_input())
                .ok()
                .expect("approved input must issue once");
        assert!(
            verify_golden_c8_startup_assembly_input(approved_golden_c8_startup_assembly_input())
                .is_err()
        );
    }
}