Add to_hex and to_b64 methods to SKey.
This commit is contained in:
@@ -17,3 +17,4 @@ thiserror = "1.0.37"
|
|||||||
anyerror = "0.1.7"
|
anyerror = "0.1.7"
|
||||||
home = "0.5.4"
|
home = "0.5.4"
|
||||||
sha1 = "0.10.5"
|
sha1 = "0.10.5"
|
||||||
|
base64 = "0.20.0"
|
||||||
|
|||||||
+27
-5
@@ -1,5 +1,7 @@
|
|||||||
use sha1::{Digest, Sha1};
|
use sha1::{Digest, Sha1};
|
||||||
use std::vec::Vec;
|
use std::vec::Vec;
|
||||||
|
use std::fmt::Write;
|
||||||
|
use base64;
|
||||||
|
|
||||||
type SKeyOTP = Vec<Vec<u8>>;
|
type SKeyOTP = Vec<Vec<u8>>;
|
||||||
|
|
||||||
@@ -63,6 +65,21 @@ impl SKey {
|
|||||||
pub fn to_words(&self) -> [&str; 6] {
|
pub fn to_words(&self) -> [&str; 6] {
|
||||||
self.to_dec().map(|x| WORDS[x as usize])
|
self.to_dec().map(|x| WORDS[x as usize])
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn to_hex(&self) -> String {
|
||||||
|
let mut hex_string = String::new();
|
||||||
|
for inner_vec in &self.otp {
|
||||||
|
for byte in inner_vec {
|
||||||
|
write!(hex_string, "{:0>2x}", byte).expect("Failed to write to string");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
hex_string
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn to_b64(&self) -> String {
|
||||||
|
let flat_vec: Vec<u8> = self.otp.iter().map(|v| { let mut v: Vec<u8> = v.clone(); v.reverse(); v }).flatten().collect();
|
||||||
|
base64::encode(flat_vec).trim_end_matches('=').to_string()
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#[cfg(test)]
|
#[cfg(test)]
|
||||||
@@ -70,22 +87,27 @@ mod tests {
|
|||||||
use super::*;
|
use super::*;
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn calc_test() {
|
fn encoding_test() {
|
||||||
assert_eq!(SKey::sha1(&vec![vec![116, 101, 115, 116, 49, 109, 121, 32, 115, 101, 99, 114, 101, 116]]), [[141, 231, 26, 167], [106, 250, 4, 49]]);
|
assert_eq!(SKey::sha1(&vec![vec![116, 101, 115, 116, 49, 109, 121, 32, 115, 101, 99, 114, 101, 116]]), [[141, 231, 26, 167], [106, 250, 4, 49]]);
|
||||||
assert_eq!(SKey::sha1(&vec![vec![141, 231, 26, 167], vec![106, 250, 4, 49]]), [[217, 8, 211, 18], [165, 49, 161, 222]]);
|
assert_eq!(SKey::sha1(&vec![vec![141, 231, 26, 167], vec![106, 250, 4, 49]]), [[217, 8, 211, 18], [165, 49, 161, 222]]);
|
||||||
|
|
||||||
let pwd = "test1";
|
let pwd = "test1";
|
||||||
let sec = "my secret";
|
let sec = "my secret";
|
||||||
assert_eq!(SKey::otp_sha1(pwd.clone(), 99, &sec), [[229, 163, 138, 210], [154, 252, 63, 203]]);
|
assert_eq!(SKey::otp_sha1(&pwd, 99, &sec), [[229, 163, 138, 210], [154, 252, 63, 203]]);
|
||||||
|
|
||||||
let skey = SKey::new(pwd.clone(), 99, &sec);
|
let skey = SKey::new(&pwd, 99, &sec);
|
||||||
assert_eq!(skey.to_dec(), [1684, 680, 1995, 1203, 2046, 619]);
|
assert_eq!(skey.to_dec(), [1684, 680, 1995, 1203, 2046, 619]);
|
||||||
assert_eq!(skey.to_words(), ["ross", "beau", "week", "held", "yoga", "anti"]);
|
assert_eq!(skey.to_words(), ["ross", "beau", "week", "held", "yoga", "anti"]);
|
||||||
|
assert_eq!(skey.to_hex(), "e5a38ad29afc3fcb");
|
||||||
|
assert_eq!(SKey::new("test3", 99, &sec).to_hex(), "0330ce0b90086467");
|
||||||
|
assert_eq!(skey.to_b64(), "0oqj5cs//Jo");
|
||||||
|
assert_eq!(SKey::new("test3", 99, &sec).to_b64(), "C84wA2dkCJA");
|
||||||
|
assert_eq!(SKey::new("test5", 99, &sec).to_b64(), "FeXiWc7HWEY");
|
||||||
|
|
||||||
let skey = SKey::new(pwd.clone(), 30, &sec);
|
let skey = SKey::new(&pwd, 30, &sec);
|
||||||
assert_eq!(skey.to_dec(), [949, 415, 1008, 1225, 809, 165]);
|
assert_eq!(skey.to_dec(), [949, 415, 1008, 1225, 809, 165]);
|
||||||
|
|
||||||
let skey = SKey::new(pwd.clone(), 300, &sec);
|
let skey = SKey::new(&pwd, 300, &sec);
|
||||||
assert_eq!(skey.to_dec(), [1375, 1256, 2010, 333, 33, 893]);
|
assert_eq!(skey.to_dec(), [1375, 1256, 2010, 333, 33, 893]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user