use crate::authenticator::AuthenticatorService;
use crate::pin_storage::PinStorage;
use crate::storage::CredentialStorage;
use log::debug;
pub const CMD_CUSTOM_CREDENTIAL_MGMT: u8 = 0x41;
pub fn register_yubikey_credential_mgmt<S: CredentialStorage + 'static, P: PinStorage + 'static>(
service: &mut AuthenticatorService<S, P>,
) {
debug!("Registering Yubikey credential management command (0x41)");
service.register_custom_command(CMD_CUSTOM_CREDENTIAL_MGMT, |request| {
debug!(
"Yubikey credential management (0x41) called with {} bytes: {:02x?}",
request.len(),
&request[..request.len().min(32)]
);
Ok(vec![0xa0])
});
debug!("Yubikey credential management command (0x41) registered successfully");
}
#[cfg(test)]
mod tests {
use super::*;
use crate::storage::LocalStorageAdapter;
#[test]
fn test_register_yubikey_command() {
use passless_core::config::{PinConfig, SecurityConfig};
let temp_dir = std::env::temp_dir().join("test_passless_custom");
if let Err(e) = std::fs::create_dir_all(&temp_dir) {
panic!("Failed to create temp directory: {}", e);
}
let storage = match LocalStorageAdapter::new(temp_dir.clone()) {
Ok(s) => s,
Err(e) => panic!("Failed to create local storage: {}", e),
};
let service =
AuthenticatorService::new(storage, SecurityConfig::default(), PinConfig::default());
assert!(service.is_ok(), "Service creation should succeed");
register_yubikey_credential_mgmt(&mut service.unwrap());
let _ = std::fs::remove_dir_all(temp_dir);
}
}