1use std::collections::BTreeMap;
4
5use serde::{Deserialize, Serialize};
6use serde_json::Value;
7
8use crate::capability::{
9 runtime_attestation::{RuntimeAssuranceTier, RuntimeAttestationEvidence},
10 trust_policy::AttestationTrustError,
11 workload_identity::{WorkloadIdentity, WorkloadIdentityError},
12};
13use crate::receipt::lineage::SignedExportEnvelope;
14use chio_core_types::runtime_attestation::AttestationVerifierFamily;
15
16pub const AZURE_MAA_ATTESTATION_SCHEMA: &str = "chio.runtime-attestation.azure-maa.jwt.v1";
17pub const AWS_NITRO_ATTESTATION_SCHEMA: &str = "chio.runtime-attestation.aws-nitro-attestation.v1";
18pub const GOOGLE_CONFIDENTIAL_VM_ATTESTATION_SCHEMA: &str =
19 "chio.runtime-attestation.google-confidential-vm.jwt.v1";
20pub const ENTERPRISE_VERIFIER_ATTESTATION_SCHEMA: &str =
21 "chio.runtime-attestation.enterprise-verifier.json.v1";
22pub const AZURE_MAA_VERIFIER_ADAPTER: &str = "azure_maa";
23pub const AWS_NITRO_VERIFIER_ADAPTER: &str = "aws_nitro";
24pub const GOOGLE_CONFIDENTIAL_VM_VERIFIER_ADAPTER: &str = "google_confidential_vm";
25pub const ENTERPRISE_VERIFIER_ADAPTER: &str = "enterprise_verifier";
26
27pub const RUNTIME_ATTESTATION_APPRAISAL_SCHEMA: &str = "chio.runtime-attestation.appraisal.v1";
28pub const RUNTIME_ATTESTATION_APPRAISAL_ARTIFACT_SCHEMA: &str =
29 "chio.runtime-attestation.appraisal-artifact.v1";
30pub const RUNTIME_ATTESTATION_APPRAISAL_REPORT_SCHEMA: &str =
31 "chio.runtime-attestation.appraisal-report.v1";
32pub const RUNTIME_ATTESTATION_APPRAISAL_ARTIFACT_INVENTORY_SCHEMA: &str =
33 "chio.runtime-attestation.appraisal-artifact-inventory.v1";
34pub const RUNTIME_ATTESTATION_NORMALIZED_CLAIM_VOCABULARY_SCHEMA: &str =
35 "chio.runtime-attestation.normalized-claim-vocabulary.v1";
36pub const RUNTIME_ATTESTATION_REASON_TAXONOMY_SCHEMA: &str =
37 "chio.runtime-attestation.reason-taxonomy.v1";
38pub const RUNTIME_ATTESTATION_APPRAISAL_RESULT_SCHEMA: &str =
39 "chio.runtime-attestation.appraisal-result.v1";
40pub const RUNTIME_ATTESTATION_APPRAISAL_IMPORT_REPORT_SCHEMA: &str =
41 "chio.runtime-attestation.appraisal-import-report.v1";
42pub const RUNTIME_ATTESTATION_VERIFIER_DESCRIPTOR_SCHEMA: &str =
43 "chio.runtime-attestation.verifier-descriptor.v1";
44pub const RUNTIME_ATTESTATION_REFERENCE_VALUE_SET_SCHEMA: &str =
45 "chio.runtime-attestation.reference-values.v1";
46pub const RUNTIME_ATTESTATION_TRUST_BUNDLE_SCHEMA: &str =
47 "chio.runtime-attestation.trust-bundle.v1";
48
49#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
50#[serde(rename_all = "snake_case")]
51pub enum RuntimeAttestationAppraisalVerdict {
52 Accepted,
53 Rejected,
54}
55
56#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
57#[serde(rename_all = "snake_case")]
58pub enum RuntimeAttestationAppraisalReasonCode {
59 EvidenceVerified,
60 UnsupportedEvidence,
61 UnsupportedClaimMapping,
62 AmbiguousClaimMapping,
63 PolicyRejected,
64 InvalidClaims,
65 EvidenceStale,
66 MeasurementMismatch,
67 DebugStateUnknown,
68}
69
70#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Serialize, Deserialize)]
71#[serde(rename_all = "snake_case")]
72pub enum RuntimeAttestationNormalizedClaimCode {
73 AttestationType,
74 RuntimeIdentity,
75 WorkloadIdentityScheme,
76 WorkloadIdentityUri,
77 ModuleId,
78 MeasurementDigest,
79 MeasurementRegisters,
80 HardwareModel,
81 SecureBootState,
82}
83
84#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Serialize, Deserialize)]
85#[serde(rename_all = "snake_case")]
86pub enum RuntimeAttestationNormalizedClaimCategory {
87 Identity,
88 Measurement,
89 Platform,
90 Configuration,
91}
92
93#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Serialize, Deserialize)]
94#[serde(rename_all = "snake_case")]
95pub enum RuntimeAttestationNormalizedClaimConfidence {
96 Verified,
97 Derived,
98}
99
100#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Serialize, Deserialize)]
101#[serde(rename_all = "snake_case")]
102pub enum RuntimeAttestationNormalizedClaimFreshness {
103 EvidenceWindow,
104}
105
106#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Serialize, Deserialize)]
107#[serde(rename_all = "snake_case")]
108pub enum RuntimeAttestationClaimProvenance {
109 EvidenceEnvelope,
110 VendorClaims,
111 WorkloadProjection,
112}
113
114#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Serialize, Deserialize)]
115#[serde(rename_all = "snake_case")]
116pub enum RuntimeAttestationAppraisalReasonGroup {
117 Verification,
118 Compatibility,
119 Freshness,
120 Measurement,
121 DebugPosture,
122 Policy,
123}
124
125#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Serialize, Deserialize)]
126#[serde(rename_all = "snake_case")]
127pub enum RuntimeAttestationAppraisalReasonDisposition {
128 Pass,
129 Warn,
130 Deny,
131 Degrade,
132 Unknown,
133}
134
135#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
136#[serde(rename_all = "camelCase")]
137pub struct RuntimeAttestationNormalizedClaim {
138 pub code: RuntimeAttestationNormalizedClaimCode,
139 pub legacy_assertion_key: String,
140 pub category: RuntimeAttestationNormalizedClaimCategory,
141 pub confidence: RuntimeAttestationNormalizedClaimConfidence,
142 pub freshness: RuntimeAttestationNormalizedClaimFreshness,
143 pub provenance: RuntimeAttestationClaimProvenance,
144 pub value: Value,
145}
146
147#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
148#[serde(rename_all = "camelCase")]
149pub struct RuntimeAttestationNormalizedClaimVocabularyEntry {
150 pub code: RuntimeAttestationNormalizedClaimCode,
151 pub legacy_assertion_key: String,
152 pub category: RuntimeAttestationNormalizedClaimCategory,
153 pub confidence: RuntimeAttestationNormalizedClaimConfidence,
154 pub freshness: RuntimeAttestationNormalizedClaimFreshness,
155 pub description: String,
156 #[serde(default, skip_serializing_if = "Vec::is_empty")]
157 pub supported_verifier_families: Vec<AttestationVerifierFamily>,
158}
159
160#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
161#[serde(rename_all = "camelCase")]
162pub struct RuntimeAttestationNormalizedClaimVocabulary {
163 pub schema: String,
164 #[serde(default, skip_serializing_if = "Vec::is_empty")]
165 pub entries: Vec<RuntimeAttestationNormalizedClaimVocabularyEntry>,
166}
167
168#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
169#[serde(rename_all = "camelCase")]
170pub struct RuntimeAttestationAppraisalReason {
171 pub code: RuntimeAttestationAppraisalReasonCode,
172 pub group: RuntimeAttestationAppraisalReasonGroup,
173 pub disposition: RuntimeAttestationAppraisalReasonDisposition,
174 pub description: String,
175}
176
177#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
178#[serde(rename_all = "camelCase")]
179pub struct RuntimeAttestationReasonTaxonomy {
180 pub schema: String,
181 #[serde(default, skip_serializing_if = "Vec::is_empty")]
182 pub entries: Vec<RuntimeAttestationAppraisalReason>,
183}
184
185#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
186#[serde(rename_all = "camelCase")]
187pub struct RuntimeAttestationAppraisalResultSubject {
188 #[serde(default, skip_serializing_if = "Option::is_none")]
189 pub runtime_identity: Option<String>,
190 #[serde(default, skip_serializing_if = "Option::is_none")]
191 pub workload_identity: Option<WorkloadIdentity>,
192}
193
194#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
195#[serde(rename_all = "camelCase")]
196pub struct RuntimeAttestationAppraisalResult {
197 pub schema: String,
198 pub result_id: String,
199 pub exported_at: u64,
200 pub issuer: String,
201 pub appraisal: RuntimeAttestationAppraisalArtifact,
202 pub exporter_policy_outcome: RuntimeAttestationPolicyOutcome,
203 pub subject: RuntimeAttestationAppraisalResultSubject,
204}
205
206#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
207#[serde(rename_all = "snake_case")]
208pub enum RuntimeAttestationImportDisposition {
209 Allow,
210 Attenuate,
211 Reject,
212}
213
214#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
215#[serde(rename_all = "snake_case")]
216pub enum RuntimeAttestationImportReasonCode {
217 NoLocalPolicy,
218 InvalidSignature,
219 UnsupportedAppraisalSchema,
220 ResultStale,
221 EvidenceStale,
222 ExporterPolicyRejected,
223 UntrustedIssuer,
224 UntrustedSigner,
225 UnsupportedVerifierFamily,
226 MissingRequiredClaim,
227 ClaimMismatch,
228 TierAttenuated,
229}
230
231#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
232#[serde(rename_all = "camelCase")]
233pub struct RuntimeAttestationImportReason {
234 pub code: RuntimeAttestationImportReasonCode,
235 pub description: String,
236}
237
238#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
239#[serde(rename_all = "camelCase")]
240pub struct RuntimeAttestationImportedAppraisalPolicy {
241 #[serde(default, skip_serializing_if = "Vec::is_empty")]
242 pub trusted_issuers: Vec<String>,
243 #[serde(default, skip_serializing_if = "Vec::is_empty")]
244 pub trusted_signer_keys: Vec<String>,
245 #[serde(default, skip_serializing_if = "Vec::is_empty")]
246 pub allowed_verifier_families: Vec<AttestationVerifierFamily>,
247 #[serde(default, skip_serializing_if = "Option::is_none")]
248 pub max_result_age_seconds: Option<u64>,
249 #[serde(default, skip_serializing_if = "Option::is_none")]
250 pub max_evidence_age_seconds: Option<u64>,
251 #[serde(default, skip_serializing_if = "Option::is_none")]
252 pub maximum_effective_tier: Option<RuntimeAssuranceTier>,
253 #[serde(default, skip_serializing_if = "BTreeMap::is_empty")]
254 pub required_claims: BTreeMap<RuntimeAttestationNormalizedClaimCode, String>,
255}
256
257#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
258#[serde(rename_all = "camelCase")]
259pub struct RuntimeAttestationAppraisalImportOutcome {
260 pub disposition: RuntimeAttestationImportDisposition,
261 pub effective_tier: RuntimeAssuranceTier,
262 #[serde(default, skip_serializing_if = "Vec::is_empty")]
263 pub reason_codes: Vec<RuntimeAttestationImportReasonCode>,
264 #[serde(default, skip_serializing_if = "Vec::is_empty")]
265 pub reasons: Vec<RuntimeAttestationImportReason>,
266}
267
268#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
269#[serde(rename_all = "camelCase")]
270pub struct RuntimeAttestationAppraisalImportRequest {
271 pub signed_result: SignedRuntimeAttestationAppraisalResult,
272 pub local_policy: RuntimeAttestationImportedAppraisalPolicy,
273}
274
275#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
276#[serde(rename_all = "camelCase")]
277pub struct RuntimeAttestationAppraisalImportReport {
278 pub schema: String,
279 pub evaluated_at: u64,
280 pub signer_key_hex: String,
281 pub result: RuntimeAttestationAppraisalResult,
282 pub local_policy_outcome: RuntimeAttestationAppraisalImportOutcome,
283}
284
285#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
286#[serde(rename_all = "camelCase")]
287pub struct RuntimeAttestationVerifierDescriptorDocument {
288 pub schema: String,
289 pub descriptor_id: String,
290 pub verifier: String,
291 pub verifier_family: AttestationVerifierFamily,
292 pub adapter: String,
293 #[serde(default, skip_serializing_if = "Vec::is_empty")]
294 pub attestation_schemas: Vec<String>,
295 pub appraisal_artifact_schema: String,
296 pub appraisal_result_schema: String,
297 #[serde(default, skip_serializing_if = "Vec::is_empty")]
298 pub signing_key_fingerprints: Vec<String>,
299 #[serde(default, skip_serializing_if = "Option::is_none")]
300 pub reference_values_uri: Option<String>,
301 pub issued_at: u64,
302 pub expires_at: u64,
303}
304
305pub type SignedRuntimeAttestationVerifierDescriptor =
306 SignedExportEnvelope<RuntimeAttestationVerifierDescriptorDocument>;
307
308#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
309#[serde(rename_all = "snake_case")]
310pub enum RuntimeAttestationReferenceValueState {
311 Active,
312 Superseded,
313 Revoked,
314}
315
316#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
317#[serde(rename_all = "camelCase")]
318pub struct RuntimeAttestationReferenceValueSet {
319 pub schema: String,
320 pub reference_value_id: String,
321 pub descriptor_id: String,
322 pub verifier_family: AttestationVerifierFamily,
323 pub attestation_schema: String,
324 #[serde(default, skip_serializing_if = "Option::is_none")]
325 pub source_uri: Option<String>,
326 pub issued_at: u64,
327 pub expires_at: u64,
328 pub state: RuntimeAttestationReferenceValueState,
329 #[serde(default, skip_serializing_if = "Option::is_none")]
330 pub superseded_by: Option<String>,
331 #[serde(default, skip_serializing_if = "Option::is_none")]
332 pub revoked_reason: Option<String>,
333 #[serde(default, skip_serializing_if = "BTreeMap::is_empty")]
334 pub measurements: BTreeMap<String, Value>,
335}
336
337pub type SignedRuntimeAttestationReferenceValueSet =
338 SignedExportEnvelope<RuntimeAttestationReferenceValueSet>;
339
340#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
341#[serde(rename_all = "camelCase")]
342pub struct RuntimeAttestationTrustBundleDocument {
343 pub schema: String,
344 pub bundle_id: String,
345 pub publisher: String,
346 pub version: u64,
347 pub issued_at: u64,
348 pub expires_at: u64,
349 #[serde(default, skip_serializing_if = "Vec::is_empty")]
350 pub descriptors: Vec<SignedRuntimeAttestationVerifierDescriptor>,
351 #[serde(default, skip_serializing_if = "Vec::is_empty")]
352 pub reference_values: Vec<SignedRuntimeAttestationReferenceValueSet>,
353}
354
355pub type SignedRuntimeAttestationTrustBundle =
356 SignedExportEnvelope<RuntimeAttestationTrustBundleDocument>;
357
358#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
359#[serde(rename_all = "camelCase")]
360pub struct RuntimeAttestationTrustBundleVerification {
361 pub schema: String,
362 pub bundle_id: String,
363 pub publisher: String,
364 pub version: u64,
365 pub descriptor_count: usize,
366 pub reference_value_count: usize,
367 #[serde(default, skip_serializing_if = "Vec::is_empty")]
368 pub verifier_families: Vec<AttestationVerifierFamily>,
369 pub verified_at: u64,
370}
371
372#[derive(Debug, Clone, PartialEq, Eq, thiserror::Error)]
373pub enum RuntimeAttestationAppraisalError {
374 #[error("runtime attestation schema `{schema}` is not recognized by the canonical appraisal boundary")]
375 UnsupportedSchema { schema: String },
376}
377
378#[derive(Debug, Clone, thiserror::Error)]
379pub enum RuntimeAttestationVerificationError {
380 #[error("runtime attestation workload identity is invalid: {0}")]
381 InvalidWorkloadIdentity(#[from] WorkloadIdentityError),
382 #[error("runtime attestation evidence is stale at {now} (issued_at={issued_at}, expires_at={expires_at})")]
383 StaleEvidence {
384 now: u64,
385 issued_at: u64,
386 expires_at: u64,
387 },
388 #[error(transparent)]
389 Appraisal(#[from] RuntimeAttestationAppraisalError),
390 #[error("runtime attestation evidence rejected by local trust policy: {0}")]
391 TrustPolicy(#[from] AttestationTrustError),
392}
393
394#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
395#[serde(rename_all = "camelCase")]
396pub struct RuntimeAttestationVerifierDescriptor {
397 pub adapter: String,
398 pub verifier_family: AttestationVerifierFamily,
399}
400
401#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
402#[serde(rename_all = "camelCase")]
403pub struct RuntimeAttestationClaimSets {
404 #[serde(default, skip_serializing_if = "BTreeMap::is_empty")]
405 pub normalized_assertions: BTreeMap<String, Value>,
406 #[serde(default, skip_serializing_if = "Vec::is_empty")]
407 pub normalized_claims: Vec<RuntimeAttestationNormalizedClaim>,
408 #[serde(default, skip_serializing_if = "BTreeMap::is_empty")]
409 pub vendor_claims: BTreeMap<String, Value>,
410}
411
412#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
413#[serde(rename_all = "camelCase")]
414pub struct RuntimeAttestationPolicyProjection {
415 pub verdict: RuntimeAttestationAppraisalVerdict,
416 pub effective_tier: RuntimeAssuranceTier,
417 #[serde(default, skip_serializing_if = "Vec::is_empty")]
418 pub reason_codes: Vec<RuntimeAttestationAppraisalReasonCode>,
419 #[serde(default, skip_serializing_if = "Vec::is_empty")]
420 pub reasons: Vec<RuntimeAttestationAppraisalReason>,
421}
422
423#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
424#[serde(rename_all = "camelCase")]
425pub struct RuntimeAttestationAppraisalArtifact {
426 pub schema: String,
427 pub evidence: RuntimeAttestationEvidenceDescriptor,
428 pub verifier: RuntimeAttestationVerifierDescriptor,
429 pub claims: RuntimeAttestationClaimSets,
430 pub policy: RuntimeAttestationPolicyProjection,
431 #[serde(default, skip_serializing_if = "Option::is_none")]
432 pub workload_identity: Option<WorkloadIdentity>,
433}
434
435#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
436#[serde(rename_all = "camelCase")]
437pub struct RuntimeAttestationAppraisalArtifactInventoryEntry {
438 pub attestation_schema: String,
439 pub artifact_schema: String,
440 pub verifier_family: AttestationVerifierFamily,
441 pub adapter: String,
442 pub vendor_claim_namespace: String,
443 #[serde(default, skip_serializing_if = "Vec::is_empty")]
444 pub normalized_assertion_keys: Vec<String>,
445 #[serde(default, skip_serializing_if = "Vec::is_empty")]
446 pub normalized_claim_codes: Vec<RuntimeAttestationNormalizedClaimCode>,
447 #[serde(default, skip_serializing_if = "Vec::is_empty")]
448 pub default_reason_codes: Vec<RuntimeAttestationAppraisalReasonCode>,
449}
450
451#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
452#[serde(rename_all = "camelCase")]
453pub struct RuntimeAttestationAppraisalArtifactInventory {
454 pub schema: String,
455 #[serde(default, skip_serializing_if = "Vec::is_empty")]
456 pub entries: Vec<RuntimeAttestationAppraisalArtifactInventoryEntry>,
457}
458
459#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
460#[serde(rename_all = "camelCase")]
461pub struct RuntimeAttestationEvidenceDescriptor {
462 pub schema: String,
463 pub verifier: String,
464 pub issued_at: u64,
465 pub expires_at: u64,
466 pub evidence_sha256: String,
467}
468
469impl From<&RuntimeAttestationEvidence> for RuntimeAttestationEvidenceDescriptor {
470 fn from(value: &RuntimeAttestationEvidence) -> Self {
471 Self {
472 schema: value.schema.clone(),
473 verifier: value.verifier.clone(),
474 issued_at: value.issued_at,
475 expires_at: value.expires_at,
476 evidence_sha256: value.evidence_sha256.clone(),
477 }
478 }
479}
480
481#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
482#[serde(rename_all = "camelCase")]
483pub struct RuntimeAttestationAppraisal {
484 pub schema: String,
485 pub adapter: String,
486 pub verifier_family: AttestationVerifierFamily,
487 pub evidence: RuntimeAttestationEvidenceDescriptor,
488 pub verdict: RuntimeAttestationAppraisalVerdict,
489 pub effective_tier: RuntimeAssuranceTier,
490 #[serde(default, skip_serializing_if = "BTreeMap::is_empty")]
491 pub normalized_assertions: BTreeMap<String, Value>,
492 #[serde(default, skip_serializing_if = "Vec::is_empty")]
493 pub normalized_claims: Vec<RuntimeAttestationNormalizedClaim>,
494 #[serde(default, skip_serializing_if = "BTreeMap::is_empty")]
495 pub vendor_claims: BTreeMap<String, Value>,
496 #[serde(default, skip_serializing_if = "Vec::is_empty")]
497 pub reason_codes: Vec<RuntimeAttestationAppraisalReasonCode>,
498 #[serde(default, skip_serializing_if = "Vec::is_empty")]
499 pub reasons: Vec<RuntimeAttestationAppraisalReason>,
500 #[serde(default, skip_serializing_if = "Option::is_none")]
501 pub workload_identity: Option<WorkloadIdentity>,
502 #[serde(default, skip_serializing_if = "Option::is_none")]
503 pub artifact: Option<RuntimeAttestationAppraisalArtifact>,
504}
505
506#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
507#[serde(rename_all = "camelCase")]
508pub struct RuntimeAttestationAppraisalRequest {
509 pub runtime_attestation: RuntimeAttestationEvidence,
510}
511
512#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
513#[serde(rename_all = "camelCase")]
514pub struct RuntimeAttestationAppraisalResultExportRequest {
515 pub issuer: String,
516 pub runtime_attestation: RuntimeAttestationEvidence,
517}
518
519#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
520#[serde(rename_all = "camelCase")]
521pub struct RuntimeAttestationPolicyOutcome {
522 pub trust_policy_configured: bool,
523 pub accepted: bool,
524 pub effective_tier: RuntimeAssuranceTier,
525 #[serde(default, skip_serializing_if = "Option::is_none")]
526 pub reason: Option<String>,
527}
528
529#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
530#[serde(rename_all = "camelCase")]
531pub struct VerifiedRuntimeAttestationProvenance {
532 pub verifier_family: AttestationVerifierFamily,
533 pub verifier_adapter: String,
534 pub canonical_verifier: String,
535 #[serde(default, skip_serializing_if = "Option::is_none")]
536 pub matched_trust_rule: Option<String>,
537}
538
539#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
540#[serde(rename_all = "camelCase")]
541pub struct VerifiedRuntimeAttestationRecord {
542 pub evidence: RuntimeAttestationEvidence,
543 pub appraisal: RuntimeAttestationAppraisal,
544 pub policy_outcome: RuntimeAttestationPolicyOutcome,
545 pub subject: RuntimeAttestationAppraisalResultSubject,
546 pub provenance: VerifiedRuntimeAttestationProvenance,
547 pub verified_at: u64,
548}
549
550#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
551#[serde(rename_all = "camelCase")]
552pub struct RuntimeAttestationAppraisalReport {
553 pub schema: String,
554 pub generated_at: u64,
555 pub appraisal: RuntimeAttestationAppraisal,
556 pub policy_outcome: RuntimeAttestationPolicyOutcome,
557}
558
559pub type SignedRuntimeAttestationAppraisalReport =
560 SignedExportEnvelope<RuntimeAttestationAppraisalReport>;
561pub type SignedRuntimeAttestationAppraisalResult =
562 SignedExportEnvelope<RuntimeAttestationAppraisalResult>;