use crate::{hotp::HotpBuilder, otp::secret_encoding};
use derive_builder::Builder;
use std::time::{SystemTime, UNIX_EPOCH};
const TOTP_PERIOD: u64 = 30u64;
#[derive(Default, Debug, Builder)]
pub struct Totp {
key: Vec<u8>,
}
impl TotpBuilder {
pub fn new() -> Self {
Self::default()
}
secret_encoding!(Self);
}
impl Totp {
pub fn generate(&mut self) -> String {
let hotp_client = HotpBuilder::new()
.key(self.key.to_owned())
.counter(
SystemTime::now()
.duration_since(UNIX_EPOCH)
.unwrap()
.as_secs()
/ TOTP_PERIOD,
)
.build()
.expect("failed to initialization");
hotp_client.generate()
}
}