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)
}
}