use super::collateral::fetch_collateral;
use super::dcap::DcapQuoteVerifier;
use super::reportdata::CurveTag;
use super::{
ExpectedReportData, MeasurementPolicy, VerifiedQuote, VerifyError, verify_attestation,
};
#[derive(Clone)]
pub struct LiveVerifyParams {
pub pccs_url: String,
pub policy: MeasurementPolicy,
pub expected_pubkeys: Vec<(CurveTag, Vec<u8>)>,
pub expected_image_digests: Vec<u8>,
pub accepted_tcb: Vec<String>,
pub now_secs: u64,
}
pub async fn verify_signer_attestation(
stack_url: String,
nonce: Vec<u8>,
params: LiveVerifyParams,
) -> Result<VerifiedQuote, VerifyError> {
let response = crate::commands::config::get_attestation(stack_url, Some(nonce.clone()))
.await
.map_err(|e| VerifyError::Transport(format!("{e:?}")))?;
let report = response.report.ok_or_else(|| {
VerifyError::Transport("stack returned no attestation report".to_string())
})?;
let raw_quote = report.raw_quote;
if raw_quote.is_empty() {
return Err(VerifyError::EmptyQuote);
}
let collateral = fetch_collateral(¶ms.pccs_url, &raw_quote).await?;
let verifier = DcapQuoteVerifier::new(collateral, params.now_secs)
.accept_tcb_statuses(params.accepted_tcb);
let expected = ExpectedReportData {
pubkeys: params.expected_pubkeys,
image_digests: params.expected_image_digests,
report_data: nonce,
};
verify_attestation(&raw_quote, &verifier, ¶ms.policy, &expected)
}