sim_lib_compute_auto/
evidence.rs1use sim_lib_compute_model::ModeledComputeProfile;
4
5use crate::profile::ComputeDeviceIdentity;
6
7#[derive(Clone, Copy, Debug, PartialEq, Eq)]
9pub enum ComputeEvidenceKind {
10 Modeled,
12 HostEmulated,
14 PhysicalDevice,
16}
17
18impl ComputeEvidenceKind {
19 pub fn as_str(self) -> &'static str {
21 match self {
22 Self::Modeled => "modeled",
23 Self::HostEmulated => "host-emulated",
24 Self::PhysicalDevice => "physical-device",
25 }
26 }
27}
28
29impl TryFrom<&str> for ComputeEvidenceKind {
30 type Error = PhysicalEvidenceError;
31
32 fn try_from(value: &str) -> std::result::Result<Self, Self::Error> {
33 match value {
34 "modeled" => Ok(Self::Modeled),
35 "host-emulated" => Ok(Self::HostEmulated),
36 "physical-device" => Ok(Self::PhysicalDevice),
37 other => Err(PhysicalEvidenceError::new(format!(
38 "unknown compute evidence kind: {other}"
39 ))),
40 }
41 }
42}
43
44pub trait ComputePhysicalEvidence {
46 fn evidence_kind(&self) -> ComputeEvidenceKind;
48
49 fn claimed_identity(&self) -> Option<&ComputeDeviceIdentity> {
51 None
52 }
53
54 fn observed_identity(&self) -> Option<&ComputeDeviceIdentity> {
56 None
57 }
58}
59
60impl ComputePhysicalEvidence for ModeledComputeProfile {
61 fn evidence_kind(&self) -> ComputeEvidenceKind {
62 ComputeEvidenceKind::Modeled
63 }
64}
65
66#[derive(Clone, Debug, PartialEq, Eq)]
68pub struct PhysicalEvidenceError {
69 message: String,
70}
71
72impl PhysicalEvidenceError {
73 fn new(message: impl Into<String>) -> Self {
74 Self {
75 message: message.into(),
76 }
77 }
78}
79
80impl std::fmt::Display for PhysicalEvidenceError {
81 fn fmt(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
82 formatter.write_str(&self.message)
83 }
84}
85
86impl std::error::Error for PhysicalEvidenceError {}
87
88pub fn verify_physical(
90 evidence: &(impl ComputePhysicalEvidence + ?Sized),
91) -> std::result::Result<(), PhysicalEvidenceError> {
92 if evidence.evidence_kind() != ComputeEvidenceKind::PhysicalDevice {
93 return Err(PhysicalEvidenceError::new(format!(
94 "compute evidence is {}, not physical-device",
95 evidence.evidence_kind().as_str()
96 )));
97 }
98 match (evidence.claimed_identity(), evidence.observed_identity()) {
99 (Some(claimed), Some(observed)) if claimed == observed => Ok(()),
100 (Some(_), Some(_)) => Err(PhysicalEvidenceError::new(
101 "compute evidence identity was renamed after capture",
102 )),
103 _ => Err(PhysicalEvidenceError::new(
104 "compute physical evidence is missing observed identity",
105 )),
106 }
107}