From 43f5938c166977d6b0368fc551939b4fd714d936 Mon Sep 17 00:00:00 2001 From: kirbylife Date: Sat, 27 Jan 2024 06:21:19 +0000 Subject: [PATCH] Add new snippet --- TOTP-algorithm/Rust-TOTP-algoritm.md | 48 ++++++++++++++++++++++++++++ 1 file changed, 48 insertions(+) create mode 100644 TOTP-algorithm/Rust-TOTP-algoritm.md diff --git a/TOTP-algorithm/Rust-TOTP-algoritm.md b/TOTP-algorithm/Rust-TOTP-algoritm.md new file mode 100644 index 0000000..2dde276 --- /dev/null +++ b/TOTP-algorithm/Rust-TOTP-algoritm.md @@ -0,0 +1,48 @@ +# Implementation of the TOTP algorithm in Rust + +```Rust +use base32::decode; +use chrono::Utc; +use sha1::{digest::Update, Digest, Sha1}; + +const INTERVAL: u64 = 30; +const TOTP_KEY: &str = "BOMY6BV5BWVJEWJ4ZLDYKN3LSIS736B3"; + +fn generate() { + // Pre-process data + let epoch = Utc::now().timestamp() as u64; + let msg = epoch / INTERVAL; + let bytes_msg = msg.to_be_bytes(); + + let key_decoded = decode(base32::Alphabet::RFC4648 { padding: false }, TOTP_KEY).unwrap(); + + // HMAC-SHA1 + let mut key_pad = key_decoded.clone(); + key_pad.resize(64, 0); + + let i_key_pad: Vec = key_pad.iter().map(|&x| x ^ 0x36).collect(); + let o_key_pad: Vec = key_pad.iter().map(|&x| x ^ 0x5C).collect(); + + let mut i_key_pad_msg = Vec::new(); + i_key_pad_msg.extend_from_slice(&i_key_pad); + i_key_pad_msg.extend_from_slice(&bytes_msg); + + let i_key_pad_msg_hashed = Sha1::new().chain(&i_key_pad_msg).finalize(); + + let mut o_key_pad_msg = Vec::new(); + o_key_pad_msg.extend_from_slice(&o_key_pad); + o_key_pad_msg.extend_from_slice(&i_key_pad_msg_hashed); + + let hmac_result = Sha1::new().chain(&o_key_pad_msg).finalize(); + + // TOTP Algorithm + let start = (hmac_result[19] & 0xF) as usize; + let raw_bytes: [u8; 4] = hmac_result[start..start + 4].try_into().unwrap(); + let raw_token = u32::from_be_bytes(raw_bytes); + let raw_token = raw_token & 0x7F_FF_FF_FF; + let token = raw_token % 1_000_000; + + println!("{:06}", token); +} + +``` \ No newline at end of file