naive-totp 0.1.0

naive implementation of totp-like algorithm
Documentation
use rand::{Rng, SeedableRng, rngs::StdRng};
use std::{
    hash::{DefaultHasher, Hash, Hasher},
    time::{SystemTime, UNIX_EPOCH},
};

pub fn new(size: usize) -> Vec<u8> {
    let mut buf = vec![0; size];
    rand::rng().fill_bytes(&mut buf);
    buf
}

pub fn generate(secret: &[u8], size: usize) -> Vec<u8> {
    let time = SystemTime::now()
        .duration_since(UNIX_EPOCH)
        .unwrap()
        .as_secs()
        .to_be_bytes();
    let mut hasher = DefaultHasher::new();
    let s = vec![
        secret, &time,
    ];
    s.hash(&mut hasher);
    let mut rng = StdRng::seed_from_u64(hasher.finish());
    let mut buf = vec![0; size];
    rng.fill_bytes(&mut buf);
    buf
}

#[cfg(test)]
mod tests {
    use std::{thread::sleep, time::Duration};

    use super::*;

    #[test]
    fn test() {
        // secret doesnt have to be same size as the generations
        // but generations needs to be same size as each other
        const SIZE: usize = 160;
        let secret = new(SIZE);
        let gen1 = generate(
            &secret, SIZE,
        );
        let gen2 = generate(
            &secret, SIZE,
        );
        assert_eq!(
            gen1,
            gen2
        );
    }

    #[test]
    fn test_different() {
        const SIZE: usize = 160;
        let secret = new(SIZE);
        let gen1 = generate(
            &secret, SIZE,
        );
        sleep(Duration::from_secs(2));
        let gen2 = generate(
            &secret, SIZE,
        );
        assert_ne!(
            gen1,
            gen2
        );
    }
}