1use std::sync::Arc;
7use tpm_resources::RequestAkCertKind;
8use vm_resource::CanResolveTo;
9
10pub enum TpmAkCertType {
12 None,
14 Trusted(Arc<dyn RequestAkCert>),
17 HwAttested(Arc<dyn RequestAkCert>),
21}
22
23impl TpmAkCertType {
24 pub fn get_ak_cert_helper(&self) -> Option<&Arc<dyn RequestAkCert>> {
26 match self {
27 TpmAkCertType::HwAttested(helper) => Some(helper),
28 TpmAkCertType::Trusted(helper) => Some(helper),
29 TpmAkCertType::None => None,
30 }
31 }
32}
33
34impl CanResolveTo<ResolvedRequestAkCert> for RequestAkCertKind {
35 type Input<'a> = &'a ();
37}
38
39pub struct ResolvedRequestAkCert(pub Arc<dyn RequestAkCert>);
41
42impl<T: 'static + RequestAkCert> From<T> for ResolvedRequestAkCert {
43 fn from(value: T) -> Self {
44 Self(Arc::new(value))
45 }
46}
47
48#[async_trait::async_trait]
50pub trait RequestAkCert: Send + Sync {
51 fn create_ak_cert_request(
53 &self,
54 ak_pub_modulus: &[u8],
55 ak_pub_exponent: &[u8],
56 ek_pub_modulus: &[u8],
57 ek_pub_exponent: &[u8],
58 guest_input: &[u8],
59 ) -> Result<Vec<u8>, Box<dyn std::error::Error + Send + Sync>>;
60
61 async fn request_ak_cert(
63 &self,
64 request: Vec<u8>,
65 ) -> Result<Vec<u8>, Box<dyn std::error::Error + Send + Sync + 'static>>;
66}