extern crate ctap_hmac as ctap; use crossbeam::thread; use crypto::digest::Digest; use crypto::sha2::Sha256; use ctap::{ FidoAssertionRequestBuilder, FidoCredential, FidoCredentialRequestBuilder, FidoDevice, FidoError, FidoResult, }; use failure::_core::time::Duration; use hex; use std::env::args; use std::io::prelude::*; use std::io::stdin; use std::io::stdout; use std::sync::mpsc::channel; use std::sync::Mutex; const RP_ID: &str = "ctap_demo"; fn run() -> ctap::FidoResult<()> { let mut credentials = args() .skip(1) .map(|id| FidoCredential { id: hex::decode(&id).expect("Invalid credential"), public_key: None, }) .collect::>(); if credentials.len() == 0 { credentials = ctap::get_devices()? .map(|h| { FidoDevice::new(&h).and_then(|mut dev| { FidoCredentialRequestBuilder::default() .rp_id(RP_ID) .build() .unwrap() .make_credential(&mut dev) }) }) .collect::>>()?; } let credentials = credentials.iter().collect::>(); let req = FidoAssertionRequestBuilder::default() .rp_id(RP_ID) .credentials(&credentials[..]) .build() .unwrap(); let mut devices = ctap::get_devices()? .map(|handle| FidoDevice::new(&handle)) .collect::>>()?; let (cred, _) = ctap::get_assertion_devices(&req, devices.iter_mut())?; println!("Success, got assertion for: {}", hex::encode(&cred.id)); Ok(()) } fn main() { dbg!(run()); }