use abscissa::{
secrets::{BorrowSecret, DebugSecret, Secret},
util::Zeroize,
};
use std::process;
use yubihsm::{Credentials, HttpConfig, SerialNumber, UsbConfig};
#[derive(Clone, Deserialize, Debug)]
pub struct YubihsmConfig {
pub adapter: AdapterConfig,
pub auth: AuthConfig,
#[serde(default)]
pub keys: Vec<SigningKeyConfig>,
pub serial_number: Option<SerialNumber>,
}
impl YubihsmConfig {
#[allow(dead_code)]
pub fn http_config(&self) -> HttpConfig {
match self.adapter {
AdapterConfig::Http { ref connector } => connector.clone(),
AdapterConfig::Usb { .. } => {
status_err!("YubiHSM2 HTTP adapter support required, sorry");
process::exit(1);
}
}
}
pub fn usb_config(&self) -> UsbConfig {
match self.adapter {
AdapterConfig::Http { .. } => {
status_err!("YubiHSM2 USB adapter support required, sorry");
process::exit(1);
}
AdapterConfig::Usb { timeout_ms } => UsbConfig {
serial: self.serial_number,
timeout_ms,
},
}
}
}
#[derive(Clone, Deserialize, Debug)]
#[serde(tag = "type")]
pub enum AdapterConfig {
#[serde(rename = "usb")]
Usb {
#[serde(default = "usb_timeout_ms_default")]
timeout_ms: u64,
},
#[serde(rename = "http")]
Http {
connector: HttpConfig,
},
}
#[derive(Clone, Debug, Deserialize)]
pub struct AuthConfig {
pub key: u16,
pub password: Secret<Password>,
}
impl AuthConfig {
pub fn credentials(&self) -> Credentials {
Credentials::from_password(self.key, self.password.borrow_secret().0.as_bytes())
}
}
#[derive(Clone, Deserialize)]
pub struct Password(String);
impl DebugSecret for Password {
fn debug_secret(&self) -> &'static str {
"REDACTED PASSWORD"
}
}
impl Zeroize for Password {
fn zeroize(&mut self) {
self.0.zeroize();
}
}
#[derive(Clone, Debug, Deserialize)]
pub struct SigningKeyConfig {
pub id: String,
pub key: u16,
}
fn usb_timeout_ms_default() -> u64 {
1000
}