use serde::{Deserialize, Serialize};
use crate::error::{Result, SiliceraError};
use crate::hnep::IntegrityDigest;
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
pub enum TpmAvailability {
Stubbed,
Unavailable,
PresentUnbound,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct TpmBindingStub {
pub availability: TpmAvailability,
pub notes: String,
pub profile_digest: Option<IntegrityDigest>,
}
impl TpmBindingStub {
pub fn probe() -> Self {
Self {
availability: TpmAvailability::Stubbed,
notes: "TPM profile binding is an optional experiment stub. \
Specialization does not depend on TPM. On Windows, full TPM 2.0 \
attestation APIs are not wired; see docs/security/tpm.md."
.into(),
profile_digest: None,
}
}
pub fn bind_digest(&self, digest: &IntegrityDigest) -> Result<TpmBindingStub> {
let _ = digest;
Err(SiliceraError::Internal(
"TPM binding not implemented (stub only); specialization unaffected".into(),
))
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn probe_is_stubbed() {
let s = TpmBindingStub::probe();
assert_eq!(s.availability, TpmAvailability::Stubbed);
}
}