// SPDX-License-Identifier: AGPL-3.0-or-later //! Module containing [TpmCredStoreHarness]. use btlib::{ crypto::{tpm::TpmCredStore, CredStore, Creds}, error::AnyhowErrorExt, Epoch, Principaled, Result, }; use core::time::Duration; use swtpm_harness::SwtpmHarness; /// A test harness which allows a [TpmCredStore] to be accessed. pub struct TpmCredStoreHarness { root_passwd: String, cred_store: TpmCredStore, swtpm: SwtpmHarness, } impl TpmCredStoreHarness { /// Creates a new test harness by starting a new instance of swtpm, generating root and node /// creds, and issuing a writecap to the node creds. pub fn new(root_passwd: String) -> Result { let swtpm = SwtpmHarness::new().bterr()?; let cred_store = TpmCredStore::from_context(swtpm.context()?, swtpm.state_path().to_owned())?; let root_creds = cred_store.gen_root_creds(&root_passwd).unwrap(); let mut node_creds = cred_store.node_creds().unwrap(); let expires = Epoch::now() + Duration::from_secs(3600); let writecap = root_creds .issue_writecap(node_creds.principal(), vec![], expires) .unwrap(); cred_store .assign_node_writecap(&mut node_creds, writecap) .unwrap(); Ok(Self { root_passwd, swtpm, cred_store, }) } pub fn root_passwd(&self) -> &str { &self.root_passwd } pub fn swtpm(&self) -> &SwtpmHarness { &self.swtpm } pub fn cred_store(&self) -> &TpmCredStore { &self.cred_store } }