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);
#[doc(hidden)]
pub struct ApprovedGoldenC8StartupAssemblyInput {
bytes: &'static [u8],
}
#[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()
);
}
}