From 7d39d4e2e89c4f8e8fa2e7db5a275a112807313c Mon Sep 17 00:00:00 2001 From: Julien Cretin Date: Thu, 3 Mar 2022 10:10:56 +0100 Subject: [PATCH] Create a tock environment --- src/env/mod.rs | 1 + src/env/tock.rs | 43 +++++++++++++++++++++++++++++++++++++++++++ src/main.rs | 33 ++------------------------------- 3 files changed, 46 insertions(+), 31 deletions(-) create mode 100644 src/env/tock.rs diff --git a/src/env/mod.rs b/src/env/mod.rs index c66bd4f..04f849c 100644 --- a/src/env/mod.rs +++ b/src/env/mod.rs @@ -4,6 +4,7 @@ use crypto::rng256::Rng256; #[cfg(feature = "std")] pub mod test; +pub mod tock; pub trait UserPresence { /// Blocks for user presence. diff --git a/src/env/tock.rs b/src/env/tock.rs new file mode 100644 index 0000000..29f8ed3 --- /dev/null +++ b/src/env/tock.rs @@ -0,0 +1,43 @@ +use crypto::rng256::TockRng256; + +use crate::ctap::hid::ChannelID; +use crate::ctap::status_code::Ctap2StatusCode; +use crate::env::{Env, UserPresence}; + +pub struct TockEnv Result<(), Ctap2StatusCode>> { + rng: TockRng256, + check_user_presence: CheckUserPresence, +} + +impl Result<(), Ctap2StatusCode>> TockEnv { + pub fn new(check_user_presence: CheckUserPresence) -> Self { + let rng = TockRng256 {}; + TockEnv { + rng, + check_user_presence, + } + } +} + +impl Result<(), Ctap2StatusCode>> UserPresence + for TockEnv +{ + fn check(&self, cid: ChannelID) -> Result<(), Ctap2StatusCode> { + (self.check_user_presence)(cid) + } +} + +impl Result<(), Ctap2StatusCode>> Env + for TockEnv +{ + type Rng = TockRng256; + type UserPresence = Self; + + fn rng(&mut self) -> &mut Self::Rng { + &mut self.rng + } + + fn user_presence(&mut self) -> &mut Self::UserPresence { + self + } +} diff --git a/src/main.rs b/src/main.rs index 4332fe3..4e49a65 100644 --- a/src/main.rs +++ b/src/main.rs @@ -24,10 +24,9 @@ extern crate lang_items; use core::cell::Cell; #[cfg(feature = "debug_ctap")] use core::fmt::Write; -use crypto::rng256::TockRng256; use ctap2::ctap::hid::{ChannelID, CtapHid, KeepaliveStatus, ProcessedPacket}; use ctap2::ctap::status_code::Ctap2StatusCode; -use ctap2::env; +use ctap2::env::tock::TockEnv; use libtock_core::result::{CommandError, EALREADY}; use libtock_drivers::buttons; use libtock_drivers::buttons::ButtonState; @@ -49,31 +48,6 @@ const KEEPALIVE_DELAY_MS: isize = 100; const KEEPALIVE_DELAY: Duration = Duration::from_ms(KEEPALIVE_DELAY_MS); const SEND_TIMEOUT: Duration = Duration::from_ms(1000); -struct TockEnv { - rng: TockRng256, - user_presence: UserPresence, -} - -struct UserPresence; -impl env::UserPresence for UserPresence { - fn check(&self, cid: ChannelID) -> Result<(), Ctap2StatusCode> { - check_user_presence(cid) - } -} - -impl env::Env for TockEnv { - type Rng = TockRng256; - type UserPresence = UserPresence; - - fn rng(&mut self) -> &mut Self::Rng { - &mut self.rng - } - - fn user_presence(&mut self) -> &mut Self::UserPresence { - &mut self.user_presence - } -} - fn main() { // Setup the timer with a dummy callback (we only care about reading the current time, but the // API forces us to set an alarm callback too). @@ -86,10 +60,7 @@ fn main() { } let boot_time = timer.get_current_clock().flex_unwrap(); - let env = TockEnv { - rng: TockRng256 {}, - user_presence: UserPresence, - }; + let env = TockEnv::new(check_user_presence); let mut ctap = ctap2::Ctap::new(env, boot_time); let mut led_counter = 0;