#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)]
pub struct AttestationReport {
pub model_attestations: Vec<ModelAttestation>,
}
#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)]
pub struct ModelAttestation {
pub model_name: String,
pub signing_address: String,
pub signing_algo: String,
pub intel_quote: String,
pub nvidia_payload: String,
pub request_nonce: String,
pub info: AttestationInfo,
pub event_log: Vec<DstackEvent>,
}
#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)]
pub struct DstackEvent {
pub imr: u32,
pub digest: String,
pub event: String,
pub event_payload: String,
}
#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)]
pub struct AttestationInfo {
pub app_id: String,
pub compose_hash: String,
pub os_image_hash: String,
pub key_provider_info: String,
pub tcb_info: TcbInfo,
}
#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)]
pub struct TcbInfo {
pub app_compose: String,
}
#[cfg(test)]
mod tests {
use super::*;
const FIXTURE: &str = include_str!("../../tests/fixtures/near_report.json");
#[test]
fn deserializes_live_near_model_report() {
let report: AttestationReport =
serde_json::from_str(FIXTURE).expect("fixture should deserialize");
assert_eq!(report.model_attestations.len(), 1);
let m = &report.model_attestations[0];
assert_eq!(m.model_name, "zai-org/GLM-5.1-FP8");
assert_eq!(
m.signing_address,
"0xbb4d2e7ffe98eefcd9690e2139be41e92b95e333"
);
assert_eq!(m.signing_algo, "ecdsa");
assert_eq!(
m.request_nonce,
"9a01356cb451dc2c3c0ce9a195245a0be984a3f73617f55f87913fc2f059cba7"
);
assert!(m.intel_quote.starts_with("040002008100"));
assert!(m.nvidia_payload.contains("\"arch\":\"HOPPER\""));
assert_eq!(
m.info.compose_hash,
"c445f29994165e94e85bdfc4824f4bcba89b0a883f45e7912f1bfd7c2634a698"
);
}
}