rusotp 0.5.0

Rust implementation of the HOTP and TOTP algorithms
Documentation
// Copyright (c) Indrajit Roy
//
// This file is licensed under the Affero General Public License version 3 or
// any later version.
//
// See the file LICENSE for details.

use crate::{Algorithm, AlgorithmTrait};
use hmac::Mac;
use sha1::Sha1;
use sha2::{Sha256, Sha512};
use std::any::Any;

#[test]
fn to_string_should_properly_convert_algorithm_to_string() {
    assert_eq!(Algorithm::SHA1.to_string(), "SHA1");
    assert_eq!(Algorithm::SHA1.to_string().type_id(), String::from("SHA1").type_id());
    assert_eq!(Algorithm::SHA256.to_string(), "SHA256");
    assert_eq!(Algorithm::SHA256.to_string().type_id(), String::from("SHA256").type_id());
    assert_eq!(Algorithm::SHA512.to_string(), "SHA512");
    assert_eq!(Algorithm::SHA512.to_string().type_id(), String::from("SHA512").type_id());
}

#[test]
fn from_string_should_properly_convert_algorithm_from_string() {
    assert_eq!(Algorithm::from_string("SHA1".to_string()).unwrap(), Algorithm::SHA1);
    assert_eq!(Algorithm::from_string("SHA256".to_string()).unwrap(), Algorithm::SHA256);
    assert_eq!(Algorithm::from_string("SHA512".to_string()).unwrap(), Algorithm::SHA512);
}

#[test]
fn from_string_should_return_none_with_invalid_algorithm_name() {
    assert_eq!(Algorithm::from_string("INVALID".to_string()), None);
}

#[test]
fn hash_should_be_generated_using_sha1() {
    let secret = b"mysecret".to_vec();
    let data = 12345u64;
    let result = Algorithm::SHA1.hash(secret.clone(), data).unwrap();
    let mut mac = hmac::Hmac::<Sha1>::new_from_slice(&secret).unwrap();
    mac.update(&data.to_be_bytes());
    assert_eq!(result, mac.finalize().into_bytes().to_vec());
}

#[test]
fn hash_should_be_generated_using_sha256() {
    let secret = b"mysecret".to_vec();
    let data = 12345u64;
    let result = Algorithm::SHA256.hash(secret.clone(), data).unwrap();
    let mut mac = hmac::Hmac::<Sha256>::new_from_slice(&secret).unwrap();
    mac.update(&data.to_be_bytes());
    assert_eq!(result, mac.finalize().into_bytes().to_vec());
}

#[test]
fn hash_should_be_generated_using_sha512() {
    let secret = b"mysecret".to_vec();
    let data = 12345u64;
    let result = Algorithm::SHA512.hash(secret.clone(), data).unwrap();
    let mut mac = hmac::Hmac::<Sha512>::new_from_slice(&secret).unwrap();
    mac.update(&data.to_be_bytes());
    assert_eq!(result, mac.finalize().into_bytes().to_vec());
}