#[cfg(feature = "fido-support")]
use crate::error::Error;
#[cfg(feature = "fido-support")]
pub mod generate;
#[cfg(any(feature = "fido-support", feature = "fido-lite"))]
pub mod parsing;
#[cfg(any(feature = "fido-support", feature = "fido-lite"))]
pub use parsing::{AuthData, CoseKey};
#[cfg(feature = "fido-support")]
pub mod signing;
#[cfg(any(feature = "fido-support", feature = "fido-lite"))]
pub mod verification;
#[cfg(feature = "fido-support")]
pub use generate::FIDOSSHKey;
#[cfg(feature = "fido-support")]
#[derive(Clone, Debug, PartialEq, PartialOrd)]
pub struct FidoDeviceDescriptor {
pub product_string: String,
pub path: String,
}
#[cfg(feature = "fido-support")]
pub fn list_fido_devices() -> Vec<FidoDeviceDescriptor> {
use ctap_hid_fido2::HidParam;
ctap_hid_fido2::get_fidokey_devices()
.into_iter()
.filter_map(|x| match x.param {
HidParam::Path(p) => Some(FidoDeviceDescriptor {
path: p,
product_string: x.product_string,
}),
_ => None,
})
.collect()
}
#[cfg(feature = "fido-support")]
pub fn device_requires_pin(path: &str) -> Result<bool, Error> {
use ctap_hid_fido2::{fidokey::get_info::InfoOption, Cfg, FidoKeyHid, HidParam};
let device = match FidoKeyHid::new(&[HidParam::Path(path.to_string())], &Cfg::init()) {
Ok(dev) => dev,
Err(e) => return Err(Error::FidoError(e.to_string())),
};
match device.enable_info_option(&InfoOption::ClientPin) {
Ok(Some(result)) => Ok(result),
Ok(None) => return Err(Error::FidoError("Could not get pin status".to_owned())),
Err(e) => return Err(Error::FidoError(e.to_string())),
}
}
#[cfg(feature = "fido-support")]
pub fn device_pin_retries(path: &str) -> Result<i32, Error> {
use ctap_hid_fido2::{Cfg, FidoKeyHid, HidParam};
let device = match FidoKeyHid::new(&[HidParam::Path(path.to_string())], &Cfg::init()) {
Ok(dev) => dev,
Err(e) => return Err(Error::FidoError(e.to_string())),
};
device
.get_pin_retries()
.map_err(|e| Error::FidoError(e.to_string()))
}