diff options
Diffstat (limited to 'tests')
| -rw-r--r-- | tests/device.rs | 137 | ||||
| -rw-r--r-- | tests/otp.rs | 66 | ||||
| -rw-r--r-- | tests/util/mod.rs | 12 | 
3 files changed, 108 insertions, 107 deletions
| diff --git a/tests/device.rs b/tests/device.rs index 7a69214..bffd767 100644 --- a/tests/device.rs +++ b/tests/device.rs @@ -98,41 +98,34 @@ fn get_firmware_version(device: Pro) {      assert!(version.minor > 0);  } -fn admin_retry<T: Authenticate + Device>(device: T, suffix: &str, count: u8) -> T { -    let result = device.authenticate_admin(&(ADMIN_PASSWORD.to_owned() + suffix)); -    let device = match result { -        Ok(admin) => admin.device(), -        Err((device, _)) => device, -    }; +fn admin_retry<T: Authenticate + Device>(device: &mut T, suffix: &str, count: u8) { +    assert_any_ok!(device.authenticate_admin(&(ADMIN_PASSWORD.to_owned() + suffix)));      assert_ok!(count, device.get_admin_retry_count()); -    return device;  } -fn user_retry<T: Authenticate + Device>(device: T, suffix: &str, count: u8) -> T { -    let result = device.authenticate_user(&(USER_PASSWORD.to_owned() + suffix)); -    let device = match result { -        Ok(admin) => admin.device(), -        Err((device, _)) => device, -    }; +fn user_retry<T: Authenticate + Device>(device: &mut T, suffix: &str, count: u8) { +    assert_any_ok!(device.authenticate_user(&(USER_PASSWORD.to_owned() + suffix)));      assert_ok!(count, device.get_user_retry_count()); -    return device;  }  #[test_device]  fn get_retry_count(device: DeviceWrapper) { -    let device = admin_retry(device, "", 3); -    let device = admin_retry(device, "123", 2); -    let device = admin_retry(device, "456", 1); -    let device = admin_retry(device, "", 3); - -    let device = user_retry(device, "", 3); -    let device = user_retry(device, "123", 2); -    let device = user_retry(device, "456", 1); -    user_retry(device, "", 3); +    let mut device = device; + +    admin_retry(&mut device, "", 3); +    admin_retry(&mut device, "123", 2); +    admin_retry(&mut device, "456", 1); +    admin_retry(&mut device, "", 3); + +    user_retry(&mut device, "", 3); +    user_retry(&mut device, "123", 2); +    user_retry(&mut device, "456", 1); +    user_retry(&mut device, "", 3);  }  #[test_device]  fn config(device: DeviceWrapper) { +    let mut device = device;      let mut admin = unwrap_ok!(device.authenticate_admin(ADMIN_PASSWORD));      let config = Config::new(None, None, None, true); @@ -153,43 +146,52 @@ fn config(device: DeviceWrapper) {  #[test_device]  fn change_user_pin(device: DeviceWrapper) { -    let device = device.authenticate_user(USER_PASSWORD).unwrap().device(); -    let device = device.authenticate_user(USER_NEW_PASSWORD).unwrap_err().0; -      let mut device = device; +    assert_any_ok!(device.authenticate_user(USER_PASSWORD)); +    assert_cmd_err!( +        CommandError::WrongPassword, +        device.authenticate_user(USER_NEW_PASSWORD) +    ); +      assert_ok!((), device.change_user_pin(USER_PASSWORD, USER_NEW_PASSWORD)); -    let device = device.authenticate_user(USER_PASSWORD).unwrap_err().0; -    let device = device -        .authenticate_user(USER_NEW_PASSWORD) -        .unwrap() -        .device(); +    assert_cmd_err!( +        CommandError::WrongPassword, +        device.authenticate_user(USER_PASSWORD) +    ); +    assert_any_ok!(device.authenticate_user(USER_NEW_PASSWORD)); -    let mut device = device;      let result = device.change_user_pin(USER_PASSWORD, USER_PASSWORD);      assert_cmd_err!(CommandError::WrongPassword, result);      assert_ok!((), device.change_user_pin(USER_NEW_PASSWORD, USER_PASSWORD)); -    let device = device.authenticate_user(USER_PASSWORD).unwrap().device(); -    assert!(device.authenticate_user(USER_NEW_PASSWORD).is_err()); +    assert_any_ok!(device.authenticate_user(USER_PASSWORD)); +    assert_cmd_err!( +        CommandError::WrongPassword, +        device.authenticate_user(USER_NEW_PASSWORD) +    );  }  #[test_device]  fn change_admin_pin(device: DeviceWrapper) { -    let device = device.authenticate_admin(ADMIN_PASSWORD).unwrap().device(); -    let mut device = device.authenticate_admin(ADMIN_NEW_PASSWORD).unwrap_err().0; +    let mut device = device; +    assert_any_ok!(device.authenticate_admin(ADMIN_PASSWORD)); +    assert_cmd_err!( +        CommandError::WrongPassword, +        device.authenticate_admin(ADMIN_NEW_PASSWORD) +    );      assert_ok!(          (),          device.change_admin_pin(ADMIN_PASSWORD, ADMIN_NEW_PASSWORD)      ); -    let device = device.authenticate_admin(ADMIN_PASSWORD).unwrap_err().0; -    let mut device = device -        .authenticate_admin(ADMIN_NEW_PASSWORD) -        .unwrap() -        .device(); +    assert_cmd_err!( +        CommandError::WrongPassword, +        device.authenticate_admin(ADMIN_PASSWORD) +    ); +    assert_any_ok!(device.authenticate_admin(ADMIN_NEW_PASSWORD));      assert_cmd_err!(          CommandError::WrongPassword, @@ -201,28 +203,24 @@ fn change_admin_pin(device: DeviceWrapper) {          device.change_admin_pin(ADMIN_NEW_PASSWORD, ADMIN_PASSWORD)      ); -    let device = device.authenticate_admin(ADMIN_PASSWORD).unwrap().device(); -    device.authenticate_admin(ADMIN_NEW_PASSWORD).unwrap_err(); +    assert_any_ok!(device.authenticate_admin(ADMIN_PASSWORD)); +    assert_cmd_err!( +        CommandError::WrongPassword, +        device.authenticate_admin(ADMIN_NEW_PASSWORD) +    );  } -fn require_failed_user_login<D>(device: D, password: &str, error: CommandError) -> D -where -    D: Device + Authenticate, -    nitrokey::User<D>: std::fmt::Debug, -{ -    let result = device.authenticate_user(password); -    assert!(result.is_err()); -    let err = result.unwrap_err(); -    match err.1 { -        Error::CommandError(err) => assert_eq!(error, err), -        _ => assert!(false), -    }; -    err.0 +fn require_failed_user_login<D: Authenticate + Device>(device: &mut D, password: &str) { +    assert_cmd_err!( +        CommandError::WrongPassword, +        device.authenticate_user(password) +    );  }  #[test_device]  fn unlock_user_pin(device: DeviceWrapper) { -    let mut device = device.authenticate_user(USER_PASSWORD).unwrap().device(); +    let mut device = device; +    assert_any_ok!(device.authenticate_user(USER_PASSWORD));      assert_ok!((), device.unlock_user_pin(ADMIN_PASSWORD, USER_PASSWORD));      assert_cmd_err!(          CommandError::WrongPassword, @@ -231,10 +229,10 @@ fn unlock_user_pin(device: DeviceWrapper) {      // block user PIN      let wrong_password = USER_PASSWORD.to_owned() + "foo"; -    let device = require_failed_user_login(device, &wrong_password, CommandError::WrongPassword); -    let device = require_failed_user_login(device, &wrong_password, CommandError::WrongPassword); -    let device = require_failed_user_login(device, &wrong_password, CommandError::WrongPassword); -    let mut device = require_failed_user_login(device, USER_PASSWORD, CommandError::WrongPassword); +    require_failed_user_login(&mut device, &wrong_password); +    require_failed_user_login(&mut device, &wrong_password); +    require_failed_user_login(&mut device, &wrong_password); +    require_failed_user_login(&mut device, USER_PASSWORD);      // unblock with current PIN      assert_cmd_err!( @@ -242,13 +240,13 @@ fn unlock_user_pin(device: DeviceWrapper) {          device.unlock_user_pin(USER_PASSWORD, USER_PASSWORD)      );      assert_ok!((), device.unlock_user_pin(ADMIN_PASSWORD, USER_PASSWORD)); -    let device = device.authenticate_user(USER_PASSWORD).unwrap().device(); +    assert_any_ok!(device.authenticate_user(USER_PASSWORD));      // block user PIN -    let device = require_failed_user_login(device, &wrong_password, CommandError::WrongPassword); -    let device = require_failed_user_login(device, &wrong_password, CommandError::WrongPassword); -    let device = require_failed_user_login(device, &wrong_password, CommandError::WrongPassword); -    let mut device = require_failed_user_login(device, USER_PASSWORD, CommandError::WrongPassword); +    require_failed_user_login(&mut device, &wrong_password); +    require_failed_user_login(&mut device, &wrong_password); +    require_failed_user_login(&mut device, &wrong_password); +    require_failed_user_login(&mut device, USER_PASSWORD);      // unblock with new PIN      assert_cmd_err!( @@ -274,11 +272,11 @@ fn assert_utf8_err_or_ne(left: &str, right: Result<String, Error>) {  #[test_device]  fn factory_reset(device: DeviceWrapper) { +    let mut device = device;      let mut admin = unwrap_ok!(device.authenticate_admin(ADMIN_PASSWORD));      let otp_data = OtpSlotData::new(1, "test", "0123468790", OtpMode::SixDigits);      assert_ok!((), admin.write_totp_slot(otp_data, 30)); -    let mut device = admin.device();      let mut pws = unwrap_ok!(device.get_password_safe(USER_PASSWORD));      assert_ok!((), pws.write_slot(0, "test", "testlogin", "testpw"));      drop(pws); @@ -299,12 +297,11 @@ fn factory_reset(device: DeviceWrapper) {      );      assert_ok!((), device.factory_reset(ADMIN_NEW_PASSWORD)); -    let device = device.authenticate_admin(ADMIN_PASSWORD).unwrap().device(); +    assert_any_ok!(device.authenticate_admin(ADMIN_PASSWORD));      let user = unwrap_ok!(device.authenticate_user(USER_PASSWORD));      assert_cmd_err!(CommandError::SlotNotProgrammed, user.get_totp_slot_name(1)); -    let mut device = user.device();      let pws = unwrap_ok!(device.get_password_safe(USER_PASSWORD));      assert_utf8_err_or_ne("test", pws.get_slot_name(0));      assert_utf8_err_or_ne("testlogin", pws.get_slot_login(0)); @@ -327,7 +324,7 @@ fn build_aes_key(device: DeviceWrapper) {      );      assert_ok!((), device.build_aes_key(ADMIN_PASSWORD)); -    let mut device = device.authenticate_admin(ADMIN_PASSWORD).unwrap().device(); +    assert_any_ok!(device.authenticate_admin(ADMIN_PASSWORD));      let pws = unwrap_ok!(device.get_password_safe(USER_PASSWORD));      assert_utf8_err_or_ne("test", pws.get_slot_name(0)); diff --git a/tests/otp.rs b/tests/otp.rs index 28a8d7c..8ca8311 100644 --- a/tests/otp.rs +++ b/tests/otp.rs @@ -3,7 +3,6 @@  mod util; -use std::fmt::Debug;  use std::ops::DerefMut;  use nitrokey::{ @@ -38,14 +37,11 @@ enum TotpTimestampSize {      U64,  } -fn make_admin_test_device<T>(device: T) -> Admin<T> +fn make_admin_test_device<'a, T>(device: &'a mut T) -> Admin<'a, T>  where      T: Device, -    (T, nitrokey::Error): Debug,  { -    device -        .authenticate_admin(ADMIN_PASSWORD) -        .expect("Could not login as admin.") +    unwrap_ok!(device.authenticate_admin(ADMIN_PASSWORD))  }  fn configure_hotp(admin: &mut ConfigureOtp, counter: u8) { @@ -72,7 +68,8 @@ fn set_time(device: DeviceWrapper) {  #[test_device]  fn hotp_no_pin(device: DeviceWrapper) { -    let mut admin = make_admin_test_device(device); +    let mut device = device; +    let mut admin = make_admin_test_device(&mut device);      let config = Config::new(None, None, None, false);      assert_ok!((), admin.write_config(config)); @@ -83,36 +80,38 @@ fn hotp_no_pin(device: DeviceWrapper) {      check_hotp_codes(admin.deref_mut(), 5);      configure_hotp(&mut admin, 0); -    check_hotp_codes(&mut admin.device(), 0); +    check_hotp_codes(&mut device, 0);  }  #[test_device]  fn hotp_pin(device: DeviceWrapper) { -    let mut admin = make_admin_test_device(device); +    let mut device = device; +    let mut admin = make_admin_test_device(&mut device);      let config = Config::new(None, None, None, true);      assert_ok!((), admin.write_config(config));      configure_hotp(&mut admin, 0); -    let mut user = unwrap_ok!(admin.device().authenticate_user(USER_PASSWORD)); +    let mut user = unwrap_ok!(device.authenticate_user(USER_PASSWORD));      check_hotp_codes(&mut user, 0); -    assert_cmd_err!(CommandError::NotAuthorized, user.device().get_hotp_code(1)); +    assert_cmd_err!(CommandError::NotAuthorized, user.get_hotp_code(1));  }  #[test_device]  fn hotp_slot_name(device: DeviceWrapper) { -    let mut admin = make_admin_test_device(device); +    let mut device = device; +    let mut admin = make_admin_test_device(&mut device);      let slot_data = OtpSlotData::new(1, "test-hotp", HOTP_SECRET, OtpMode::SixDigits);      assert_ok!((), admin.write_hotp_slot(slot_data, 0)); -    let device = admin.device();      assert_ok!("test-hotp".to_string(), device.get_hotp_slot_name(1));      assert_lib_err!(LibraryError::InvalidSlot, device.get_hotp_slot_name(4));  }  #[test_device]  fn hotp_error(device: DeviceWrapper) { -    let mut admin = make_admin_test_device(device); +    let mut device = device; +    let mut admin = make_admin_test_device(&mut device);      let slot_data = OtpSlotData::new(1, "", HOTP_SECRET, OtpMode::SixDigits);      assert_cmd_err!(CommandError::NoName, admin.write_hotp_slot(slot_data, 0));      let slot_data = OtpSlotData::new(4, "test", HOTP_SECRET, OtpMode::SixDigits); @@ -131,7 +130,8 @@ fn hotp_error(device: DeviceWrapper) {  #[test_device]  fn hotp_erase(device: DeviceWrapper) { -    let mut admin = make_admin_test_device(device); +    let mut device = device; +    let mut admin = make_admin_test_device(&mut device);      let config = Config::new(None, None, None, false);      assert_ok!((), admin.write_config(config));      let slot_data = OtpSlotData::new(1, "test1", HOTP_SECRET, OtpMode::SixDigits); @@ -141,7 +141,6 @@ fn hotp_erase(device: DeviceWrapper) {      assert_ok!((), admin.erase_hotp_slot(1)); -    let mut device = admin.device();      let result = device.get_hotp_slot_name(1);      assert_cmd_err!(CommandError::SlotNotProgrammed, result);      let result = device.get_hotp_code(1); @@ -178,7 +177,8 @@ fn check_totp_codes(device: &mut GenerateOtp, factor: u64, timestamp_size: TotpT  #[test_device]  fn totp_no_pin(device: DeviceWrapper) { -    let mut admin = make_admin_test_device(device); +    let mut device = device; +    let mut admin = make_admin_test_device(&mut device);      let config = Config::new(None, None, None, false);      assert_ok!((), admin.write_config(config)); @@ -189,14 +189,15 @@ fn totp_no_pin(device: DeviceWrapper) {      check_totp_codes(admin.deref_mut(), 2, TotpTimestampSize::U32);      configure_totp(&mut admin, 1); -    check_totp_codes(&mut admin.device(), 1, TotpTimestampSize::U32); +    check_totp_codes(&mut device, 1, TotpTimestampSize::U32);  }  #[test_device]  // Nitrokey Storage does only support timestamps that fit in a 32-bit  // unsigned integer, so don't test with it.  fn totp_no_pin_64(device: Pro) { -    let mut admin = make_admin_test_device(device); +    let mut device = device; +    let mut admin = make_admin_test_device(&mut device);      let config = Config::new(None, None, None, false);      assert_ok!((), admin.write_config(config)); @@ -207,43 +208,45 @@ fn totp_no_pin_64(device: Pro) {      check_totp_codes(admin.deref_mut(), 2, TotpTimestampSize::U64);      configure_totp(&mut admin, 1); -    check_totp_codes(&mut admin.device(), 1, TotpTimestampSize::U64); +    check_totp_codes(&mut device, 1, TotpTimestampSize::U64);  }  #[test_device]  fn totp_pin(device: DeviceWrapper) { -    let mut admin = make_admin_test_device(device); +    let mut device = device; +    let mut admin = make_admin_test_device(&mut device);      let config = Config::new(None, None, None, true);      assert_ok!((), admin.write_config(config));      configure_totp(&mut admin, 1); -    let mut user = unwrap_ok!(admin.device().authenticate_user(USER_PASSWORD)); +    let mut user = unwrap_ok!(device.authenticate_user(USER_PASSWORD));      check_totp_codes(&mut user, 1, TotpTimestampSize::U32); -    assert_cmd_err!(CommandError::NotAuthorized, user.device().get_totp_code(1)); +    assert_cmd_err!(CommandError::NotAuthorized, user.get_totp_code(1));  }  #[test_device]  // See comment for totp_no_pin_64.  fn totp_pin_64(device: Pro) { -    let mut admin = make_admin_test_device(device); +    let mut device = device; +    let mut admin = make_admin_test_device(&mut device);      let config = Config::new(None, None, None, true);      assert_ok!((), admin.write_config(config));      configure_totp(&mut admin, 1); -    let mut user = unwrap_ok!(admin.device().authenticate_user(USER_PASSWORD)); +    let mut user = unwrap_ok!(admin.authenticate_user(USER_PASSWORD));      check_totp_codes(&mut user, 1, TotpTimestampSize::U64); -    assert_cmd_err!(CommandError::NotAuthorized, user.device().get_totp_code(1)); +    assert_cmd_err!(CommandError::NotAuthorized, device.get_totp_code(1));  }  #[test_device]  fn totp_slot_name(device: DeviceWrapper) { -    let mut admin = make_admin_test_device(device); +    let mut device = device; +    let mut admin = make_admin_test_device(&mut device);      let slot_data = OtpSlotData::new(1, "test-totp", TOTP_SECRET, OtpMode::EightDigits);      assert_ok!((), admin.write_totp_slot(slot_data, 0)); -    let device = admin.device();      let result = device.get_totp_slot_name(1);      assert_ok!("test-totp", result);      let result = device.get_totp_slot_name(16); @@ -252,7 +255,8 @@ fn totp_slot_name(device: DeviceWrapper) {  #[test_device]  fn totp_error(device: DeviceWrapper) { -    let mut admin = make_admin_test_device(device); +    let mut device = device; +    let mut admin = make_admin_test_device(&mut device);      let slot_data = OtpSlotData::new(1, "", TOTP_SECRET, OtpMode::SixDigits);      assert_cmd_err!(CommandError::NoName, admin.write_totp_slot(slot_data, 0));      let slot_data = OtpSlotData::new(20, "test", TOTP_SECRET, OtpMode::SixDigits); @@ -271,7 +275,8 @@ fn totp_error(device: DeviceWrapper) {  #[test_device]  fn totp_erase(device: DeviceWrapper) { -    let mut admin = make_admin_test_device(device); +    let mut device = device; +    let mut admin = make_admin_test_device(&mut device);      let config = Config::new(None, None, None, false);      assert_ok!((), admin.write_config(config));      let slot_data = OtpSlotData::new(1, "test1", TOTP_SECRET, OtpMode::SixDigits); @@ -281,7 +286,6 @@ fn totp_erase(device: DeviceWrapper) {      assert_ok!((), admin.erase_totp_slot(1)); -    let device = admin.device();      let result = device.get_totp_slot_name(1);      assert_cmd_err!(CommandError::SlotNotProgrammed, result);      let result = device.get_totp_code(1); diff --git a/tests/util/mod.rs b/tests/util/mod.rs index bd207a9..f80372d 100644 --- a/tests/util/mod.rs +++ b/tests/util/mod.rs @@ -8,7 +8,7 @@ pub static USER_PASSWORD: &str = "123456";  #[macro_export]  macro_rules! unwrap_ok { -    ($val:expr) => {{ +    ($val:expr) => {          match $val {              Ok(val) => val,              Err(err) => panic!( @@ -18,12 +18,12 @@ macro_rules! unwrap_ok {                  err              ),          } -    }}; +    };  }  #[macro_export]  macro_rules! assert_any_ok { -    ($val:expr) => {{ +    ($val:expr) => {          match &$val {              Ok(_) => {}              Err(err) => panic!( @@ -33,12 +33,12 @@ macro_rules! assert_any_ok {                  err              ),          } -    }}; +    };  }  #[macro_export]  macro_rules! assert_ok { -    ($left:expr, $right:expr) => {{ +    ($left:expr, $right:expr) => {          match &$right {              Ok(right) => match &$left {                  left => { @@ -59,7 +59,7 @@ macro_rules! assert_ok {                  $left, right_err              ),          } -    }}; +    };  }  #[macro_export] | 
