twoken 0.4.0

Generate One-Time Passwords from stored token secrets.
Documentation
use crate::core::{deserialize_hex, serialize_hex};
use crate::token::Token;
use libreauth::{key::KeyBuilder, oath::TOTPBuilder};
use serde::{Deserialize, Serialize};

#[derive(Serialize, Deserialize, Debug)]
pub struct TOTP {
    #[serde(serialize_with = "serialize_hex", deserialize_with = "deserialize_hex")]
    pub key: [u8; 20],
}

impl Default for TOTP {
    fn default() -> Self {
        Self {
            key: KeyBuilder::new().generate().as_vec()[0..20]
                .try_into()
                .unwrap(),
        }
    }
}

impl Token for TOTP {
    const NAME: &'static str = "totp";

    fn generate_password(&self) -> String {
        TOTPBuilder::new()
            .key(&self.key)
            .finalize()
            .unwrap()
            .generate()
    }
}

#[cfg(test)]
mod tests {
    use super::*;

    #[test]
    fn test_totp() {
        let key = TOTP::default();
        assert_eq!(key.generate_password().len(), 6)
    }
}