(report_data: &[u8; 64], app_id: Option<[u8; 20]>)
| 1027 | } |
| 1028 | |
| 1029 | pub fn quote_with_app_id(report_data: &[u8; 64], app_id: Option<[u8; 20]>) -> Result<Self> { |
| 1030 | // Lock to prevent concurrent quote generation (TDX driver doesn't support it) |
| 1031 | let _guard = QUOTE_LOCK |
| 1032 | .lock() |
| 1033 | .map_err(|_| anyhow!("Quote lock poisoned"))?; |
| 1034 | |
| 1035 | let mode = AttestationMode::detect()?; |
| 1036 | let runtime_events = if mode.is_composable() { |
| 1037 | RuntimeEvent::read_all().context("Failed to read runtime events")? |
| 1038 | } else if let Some(app_id) = app_id { |
| 1039 | vec![RuntimeEvent::new("app-id".to_string(), app_id.to_vec())] |
| 1040 | } else { |
| 1041 | vec![] |
| 1042 | }; |
| 1043 | |
| 1044 | let quote = match mode { |
| 1045 | AttestationMode::DstackTdx => { |
| 1046 | let quote = tdx_attest::get_quote(report_data).context("Failed to get quote")?; |
| 1047 | let event_log = |
| 1048 | cc_eventlog::tdx::read_event_log().context("Failed to read event log")?; |
| 1049 | AttestationQuote::DstackTdx(TdxQuote { quote, event_log }) |
| 1050 | } |
| 1051 | AttestationMode::DstackGcpTdx | AttestationMode::DstackNitroEnclave => { |
| 1052 | bail!("Unsupported attestation mode: {mode:?}"); |
| 1053 | } |
| 1054 | }; |
| 1055 | let config = match "e { |
| 1056 | AttestationQuote::DstackTdx(_) => { |
| 1057 | read_vm_config().context("Failed to read VM config")? |
| 1058 | } |
| 1059 | AttestationQuote::DstackGcpTdx | AttestationQuote::DstackNitroEnclave => { |
| 1060 | bail!("Unsupported attestation mode: {mode:?}"); |
| 1061 | } |
| 1062 | }; |
| 1063 | |
| 1064 | Ok(Self { |
| 1065 | quote, |
| 1066 | runtime_events, |
| 1067 | report_data: *report_data, |
| 1068 | config, |
| 1069 | report: (), |
| 1070 | }) |
| 1071 | } |
| 1072 | } |
| 1073 | |
| 1074 | impl Attestation { |
nothing calls this directly
no test coverage detected