|
@@ -8,14 +8,16 @@ use btfproto::{
|
|
use btlib::{
|
|
use btlib::{
|
|
config_helpers::from_envvar,
|
|
config_helpers::from_envvar,
|
|
crypto::{tpm::TpmCredStore, CredStore, Creds},
|
|
crypto::{tpm::TpmCredStore, CredStore, Creds},
|
|
|
|
+ log::BuilderExt,
|
|
};
|
|
};
|
|
|
|
+use btlib_tests::TpmCredStoreHarness;
|
|
use btmsg::Receiver;
|
|
use btmsg::Receiver;
|
|
use config::{Config, ConfigRef, Envvars};
|
|
use config::{Config, ConfigRef, Envvars};
|
|
use std::{
|
|
use std::{
|
|
- net::{IpAddr, Ipv6Addr},
|
|
|
|
|
|
+ net::{IpAddr, Ipv4Addr},
|
|
path::PathBuf,
|
|
path::PathBuf,
|
|
str::FromStr,
|
|
str::FromStr,
|
|
- sync::Arc,
|
|
|
|
|
|
+ sync::Arc, env::args,
|
|
};
|
|
};
|
|
|
|
|
|
const ENVVARS: Envvars<'static> = Envvars {
|
|
const ENVVARS: Envvars<'static> = Envvars {
|
|
@@ -23,13 +25,15 @@ const ENVVARS: Envvars<'static> = Envvars {
|
|
tabrmd: "BTFSD_TABRMD",
|
|
tabrmd: "BTFSD_TABRMD",
|
|
tpm_state_path: "BTFSD_TPMSTATE",
|
|
tpm_state_path: "BTFSD_TPMSTATE",
|
|
block_dir: "BTFSD_BLOCKDIR",
|
|
block_dir: "BTFSD_BLOCKDIR",
|
|
|
|
+ use_swtpm: "BTFSD_USESWTPM",
|
|
};
|
|
};
|
|
|
|
|
|
const DEFAULT_CONFIG: ConfigRef<'static> = ConfigRef {
|
|
const DEFAULT_CONFIG: ConfigRef<'static> = ConfigRef {
|
|
- ip_addr: IpAddr::V6(Ipv6Addr::LOCALHOST),
|
|
|
|
|
|
+ ip_addr: IpAddr::V4(Ipv4Addr::LOCALHOST),
|
|
tabrmd: "bus_type=session",
|
|
tabrmd: "bus_type=session",
|
|
- tpm_state_path: "./tpm_state",
|
|
|
|
- block_dir: "./bt",
|
|
|
|
|
|
+ tpm_state_path: "./state/tpm_state",
|
|
|
|
+ block_dir: "./state/bt",
|
|
|
|
+ use_swtpm: "true",
|
|
};
|
|
};
|
|
|
|
|
|
async fn provider<C: 'static + Send + Sync + Creds>(
|
|
async fn provider<C: 'static + Send + Sync + Creds>(
|
|
@@ -55,6 +59,8 @@ async fn receiver(config: Config) -> impl Receiver {
|
|
|
|
|
|
#[tokio::main]
|
|
#[tokio::main]
|
|
async fn main() {
|
|
async fn main() {
|
|
|
|
+ env_logger::Builder::from_default_env().btformat().init();
|
|
|
|
+
|
|
let ip_addr = from_envvar(ENVVARS.ip_addr)
|
|
let ip_addr = from_envvar(ENVVARS.ip_addr)
|
|
.unwrap()
|
|
.unwrap()
|
|
.map(|txt| IpAddr::from_str(&txt).unwrap());
|
|
.map(|txt| IpAddr::from_str(&txt).unwrap());
|
|
@@ -63,13 +69,33 @@ async fn main() {
|
|
.unwrap()
|
|
.unwrap()
|
|
.map(PathBuf::from);
|
|
.map(PathBuf::from);
|
|
let block_dir = from_envvar(ENVVARS.block_dir).unwrap().map(PathBuf::from);
|
|
let block_dir = from_envvar(ENVVARS.block_dir).unwrap().map(PathBuf::from);
|
|
- let config = Config::builder()
|
|
|
|
|
|
+ let use_swtpm = from_envvar(ENVVARS.use_swtpm)
|
|
|
|
+ .unwrap()
|
|
|
|
+ .map(|str| bool::from_str(&str).unwrap());
|
|
|
|
+ let mut config = Config::builder()
|
|
.with_ip_addr(ip_addr)
|
|
.with_ip_addr(ip_addr)
|
|
.with_tabrmd(tabrmd)
|
|
.with_tabrmd(tabrmd)
|
|
.with_tpm_state_path(tpm_state_path)
|
|
.with_tpm_state_path(tpm_state_path)
|
|
.with_block_dir(block_dir)
|
|
.with_block_dir(block_dir)
|
|
|
|
+ .with_use_swtpm(use_swtpm)
|
|
.build();
|
|
.build();
|
|
|
|
+ let _swtpm = if config.use_swtpm {
|
|
|
|
+ log::debug!("starting swtpm");
|
|
|
|
+ let root_pw = if let Some(root_pw) = args().next() {
|
|
|
|
+ root_pw
|
|
|
|
+ } else {
|
|
|
|
+ panic!("when BTFSD_USESWTPM is true, the root password must be given as the first argument")
|
|
|
|
+ };
|
|
|
|
+ let swtpm = TpmCredStoreHarness::new(root_pw).unwrap();
|
|
|
|
+ config.tabrmd = swtpm.swtpm().tabrmd_config().to_owned();
|
|
|
|
+ config.tpm_state_path = swtpm.swtpm().state_path().to_owned();
|
|
|
|
+ Some(swtpm)
|
|
|
|
+ } else {
|
|
|
|
+ None
|
|
|
|
+ };
|
|
|
|
+
|
|
let receiver = receiver(config).await;
|
|
let receiver = receiver(config).await;
|
|
|
|
+ log::debug!("ready to accept connections");
|
|
receiver.complete().unwrap().await.unwrap();
|
|
receiver.complete().unwrap().await.unwrap();
|
|
}
|
|
}
|
|
|
|
|
|
@@ -106,7 +132,7 @@ mod tests {
|
|
}
|
|
}
|
|
|
|
|
|
const ROOT_PASSWD: &str = "existential_threat";
|
|
const ROOT_PASSWD: &str = "existential_threat";
|
|
- const LOCALHOST: IpAddr = IpAddr::V6(Ipv6Addr::LOCALHOST);
|
|
|
|
|
|
+ const LOCALHOST: IpAddr = IpAddr::V4(Ipv4Addr::LOCALHOST);
|
|
const BT_DIR: &str = "bt";
|
|
const BT_DIR: &str = "bt";
|
|
|
|
|
|
async fn test_case(
|
|
async fn test_case(
|
|
@@ -119,6 +145,7 @@ mod tests {
|
|
tabrmd: harness.swtpm().tabrmd_config().to_owned(),
|
|
tabrmd: harness.swtpm().tabrmd_config().to_owned(),
|
|
tpm_state_path: harness.swtpm().state_path().to_owned(),
|
|
tpm_state_path: harness.swtpm().state_path().to_owned(),
|
|
block_dir: dir.path().join(BT_DIR),
|
|
block_dir: dir.path().join(BT_DIR),
|
|
|
|
+ use_swtpm: false,
|
|
};
|
|
};
|
|
let rx = receiver(config).await;
|
|
let rx = receiver(config).await;
|
|
let tx = rx.transmitter(rx.addr().clone()).await.unwrap();
|
|
let tx = rx.transmitter(rx.addr().clone()).await.unwrap();
|
|
@@ -676,7 +703,7 @@ mod tests {
|
|
.unwrap();
|
|
.unwrap();
|
|
creds.set_writecap(writecap);
|
|
creds.set_writecap(writecap);
|
|
let expected = IssuedProcRec {
|
|
let expected = IssuedProcRec {
|
|
- addr: IpAddr::V6(Ipv6Addr::LOCALHOST),
|
|
|
|
|
|
+ addr: IpAddr::V4(Ipv4Addr::LOCALHOST),
|
|
pub_creds: creds.concrete_pub(),
|
|
pub_creds: creds.concrete_pub(),
|
|
writecap: creds.writecap().unwrap().to_owned(),
|
|
writecap: creds.writecap().unwrap().to_owned(),
|
|
authz_attrs: AuthzAttrs {
|
|
authz_attrs: AuthzAttrs {
|
|
@@ -726,7 +753,7 @@ mod tests {
|
|
.unwrap();
|
|
.unwrap();
|
|
creds.set_writecap(writecap);
|
|
creds.set_writecap(writecap);
|
|
let expected = IssuedProcRec {
|
|
let expected = IssuedProcRec {
|
|
- addr: IpAddr::V6(Ipv6Addr::LOCALHOST),
|
|
|
|
|
|
+ addr: IpAddr::V4(Ipv4Addr::LOCALHOST),
|
|
pub_creds: creds.concrete_pub(),
|
|
pub_creds: creds.concrete_pub(),
|
|
writecap: creds.writecap().unwrap().to_owned(),
|
|
writecap: creds.writecap().unwrap().to_owned(),
|
|
authz_attrs: AuthzAttrs {
|
|
authz_attrs: AuthzAttrs {
|
|
@@ -803,7 +830,7 @@ mod tests {
|
|
creds
|
|
creds
|
|
};
|
|
};
|
|
let expected = IssuedProcRec {
|
|
let expected = IssuedProcRec {
|
|
- addr: IpAddr::V6(Ipv6Addr::LOCALHOST),
|
|
|
|
|
|
+ addr: IpAddr::V4(Ipv4Addr::LOCALHOST),
|
|
pub_creds: user_creds.concrete_pub(),
|
|
pub_creds: user_creds.concrete_pub(),
|
|
writecap: user_creds.writecap().unwrap().to_owned(),
|
|
writecap: user_creds.writecap().unwrap().to_owned(),
|
|
authz_attrs: AuthzAttrs {
|
|
authz_attrs: AuthzAttrs {
|