From ee5f3358f70f7f394d8f6bd6c47c2e900772f486 Mon Sep 17 00:00:00 2001 From: shimunn Date: Tue, 17 Sep 2019 15:15:09 +0200 Subject: [PATCH] added connected command --- src/cli.rs | 4 ++++ src/device.rs | 36 +++++++++++++++++++++++++++--------- src/main.rs | 14 ++++++++++++-- 3 files changed, 43 insertions(+), 11 deletions(-) diff --git a/src/cli.rs b/src/cli.rs index c7dc56b..75abb55 100644 --- a/src/cli.rs +++ b/src/cli.rs @@ -90,3 +90,7 @@ pub fn add_key_to_luks(conf: &Config) -> Fido2LuksResult { let slot = handle.add_keyslot(&secret, None, None)?; Ok(slot) } + +pub fn authenticator_connected() -> Fido2LuksResult { + Ok(!device::get_devices()?.is_empty()) +} diff --git a/src/device.rs b/src/device.rs index 938daea..818388a 100644 --- a/src/device.rs +++ b/src/device.rs @@ -2,7 +2,7 @@ use crate::error::*; use ctap; use ctap::extensions::hmac::{FidoHmacCredential, HmacExtension}; -use ctap::FidoDevice; +use ctap::{FidoDevice, FidoError, FidoErrorKind}; pub fn perform_challenge(credential_id: &str, salt: &[u8; 32]) -> Fido2LuksResult<[u8; 32]> { let cred = FidoHmacCredential { @@ -10,16 +10,34 @@ pub fn perform_challenge(credential_id: &str, salt: &[u8; 32]) -> Fido2LuksResul rp_id: "hmac".to_string(), }; let mut errs = Vec::new(); - for di in ctap::get_devices()? { - let mut dev = FidoDevice::new(&di)?; - match dev.hmac_challange(&cred, &salt[..]) { - Ok(secret) => { - return Ok(secret); - } - Err(e) => { - errs.push(e); + match get_devices()? { + ref devs if devs.is_empty() => Err(Fido2LuksError::NoAuthenticatorError)?, + devs => { + for mut dev in devs.into_iter() { + match dev.hmac_challange(&cred, &salt[..]) { + Ok(secret) => { + return Ok(secret); + } + Err(e) => { + errs.push(e); + } + } } } } Err(errs.pop().ok_or(Fido2LuksError::NoAuthenticatorError)?)? } + +pub fn get_devices() -> Fido2LuksResult> { + let mut devices = Vec::with_capacity(2); + for di in ctap::get_devices()? { + match FidoDevice::new(&di) { + Err(e) => match e.kind() { + FidoErrorKind::ParseCtap | FidoErrorKind::DeviceUnsupported => (), + err => Err(FidoError::from(err))?, + }, + Ok(dev) => devices.push(dev), + } + } + Ok(devices) +} diff --git a/src/main.rs b/src/main.rs index 204784d..639e117 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,6 +1,5 @@ #[macro_use] extern crate failure; -#[macro_use] extern crate serde_derive; use crate::cli::*; use crate::config::*; @@ -20,6 +19,7 @@ use std::env; use std::io::{self, Write}; use std::path::PathBuf; +use std::process::exit; mod cli; mod config; @@ -104,8 +104,18 @@ fn main() -> Fido2LuksResult<()> { match args.first().map(|s| s.as_ref()).unwrap() { "addkey" => add_key_to_luks(&Config::load_default_location()?).map(|_| ()), "setup" => setup(), + "connected" => match authenticator_connected()? { + false => { + println!("no"); + exit(1) + } + _ => { + println!("yes"); + exit(0) + } + }, _ => { - eprintln!("Usage: setup | addkey"); + eprintln!("Usage: setup | addkey | connected"); Ok(()) } //"selfcontain" => package_self() }