added connected command

This commit is contained in:
shimunn 2019-09-17 15:15:09 +02:00
parent b9f3f793a7
commit ee5f3358f7
Signed by: shimun
GPG Key ID: E81D8382DC2F971B
3 changed files with 43 additions and 11 deletions

View File

@ -90,3 +90,7 @@ pub fn add_key_to_luks(conf: &Config) -> Fido2LuksResult<u8> {
let slot = handle.add_keyslot(&secret, None, None)?; let slot = handle.add_keyslot(&secret, None, None)?;
Ok(slot) Ok(slot)
} }
pub fn authenticator_connected() -> Fido2LuksResult<bool> {
Ok(!device::get_devices()?.is_empty())
}

View File

@ -2,7 +2,7 @@ use crate::error::*;
use ctap; use ctap;
use ctap::extensions::hmac::{FidoHmacCredential, HmacExtension}; 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]> { pub fn perform_challenge(credential_id: &str, salt: &[u8; 32]) -> Fido2LuksResult<[u8; 32]> {
let cred = FidoHmacCredential { let cred = FidoHmacCredential {
@ -10,16 +10,34 @@ pub fn perform_challenge(credential_id: &str, salt: &[u8; 32]) -> Fido2LuksResul
rp_id: "hmac".to_string(), rp_id: "hmac".to_string(),
}; };
let mut errs = Vec::new(); let mut errs = Vec::new();
for di in ctap::get_devices()? { match get_devices()? {
let mut dev = FidoDevice::new(&di)?; ref devs if devs.is_empty() => Err(Fido2LuksError::NoAuthenticatorError)?,
match dev.hmac_challange(&cred, &salt[..]) { devs => {
Ok(secret) => { for mut dev in devs.into_iter() {
return Ok(secret); match dev.hmac_challange(&cred, &salt[..]) {
} Ok(secret) => {
Err(e) => { return Ok(secret);
errs.push(e); }
Err(e) => {
errs.push(e);
}
}
} }
} }
} }
Err(errs.pop().ok_or(Fido2LuksError::NoAuthenticatorError)?)? Err(errs.pop().ok_or(Fido2LuksError::NoAuthenticatorError)?)?
} }
pub fn get_devices() -> Fido2LuksResult<Vec<FidoDevice>> {
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)
}

View File

@ -1,6 +1,5 @@
#[macro_use] #[macro_use]
extern crate failure; extern crate failure;
#[macro_use]
extern crate serde_derive; extern crate serde_derive;
use crate::cli::*; use crate::cli::*;
use crate::config::*; use crate::config::*;
@ -20,6 +19,7 @@ use std::env;
use std::io::{self, Write}; use std::io::{self, Write};
use std::path::PathBuf; use std::path::PathBuf;
use std::process::exit;
mod cli; mod cli;
mod config; mod config;
@ -104,8 +104,18 @@ fn main() -> Fido2LuksResult<()> {
match args.first().map(|s| s.as_ref()).unwrap() { match args.first().map(|s| s.as_ref()).unwrap() {
"addkey" => add_key_to_luks(&Config::load_default_location()?).map(|_| ()), "addkey" => add_key_to_luks(&Config::load_default_location()?).map(|_| ()),
"setup" => setup(), "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(()) Ok(())
} //"selfcontain" => package_self() } //"selfcontain" => package_self()
} }