use btlib::{
crypto::{
tpm::{TpmCredStore, TpmCreds},
CredStore, CredStoreMut, Creds,
},
error::AnyhowErrorExt,
Epoch, Principaled, Result,
};
use core::time::Duration;
use swtpm_harness::SwtpmHarness;
pub struct TpmCredStoreHarness {
root_passwd: String,
cred_store: TpmCredStore,
swtpm: SwtpmHarness,
}
impl TpmCredStoreHarness {
pub fn new(root_passwd: String) -> Result<Self> {
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(), &mut std::iter::empty(), 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
}
pub fn root_creds(&self) -> Result<TpmCreds> {
self.cred_store.root_creds(&self.root_passwd)
}
}