diff options
Diffstat (limited to 'tests')
| -rw-r--r-- | tests/device.rs | 151 | ||||
| -rw-r--r-- | tests/otp.rs | 62 | ||||
| -rw-r--r-- | tests/util/mod.rs | 12 | 
3 files changed, 118 insertions, 107 deletions
| diff --git a/tests/device.rs b/tests/device.rs index ecc3cfa..5c52024 100644 --- a/tests/device.rs +++ b/tests/device.rs @@ -97,34 +97,41 @@ fn get_firmware_version(device: Pro) {      assert!(version.minor > 0);  } -fn admin_retry<T: Authenticate + Device>(device: &mut T, suffix: &str, count: u8) { -    assert_any_ok!(device.authenticate_admin(&(DEFAULT_ADMIN_PIN.to_owned() + suffix))); +fn admin_retry<T: Authenticate + Device>(device: T, suffix: &str, count: u8) -> T { +    let result = device.authenticate_admin(&(DEFAULT_ADMIN_PIN.to_owned() + suffix)); +    let device = match result { +        Ok(admin) => admin.device(), +        Err((device, _)) => device, +    };      assert_ok!(count, device.get_admin_retry_count()); +    return device;  } -fn user_retry<T: Authenticate + Device>(device: &mut T, suffix: &str, count: u8) { -    assert_any_ok!(device.authenticate_user(&(DEFAULT_USER_PIN.to_owned() + suffix))); +fn user_retry<T: Authenticate + Device>(device: T, suffix: &str, count: u8) -> T { +    let result = device.authenticate_user(&(DEFAULT_USER_PIN.to_owned() + suffix)); +    let device = match result { +        Ok(admin) => admin.device(), +        Err((device, _)) => device, +    };      assert_ok!(count, device.get_user_retry_count()); +    return device;  }  #[test_device]  fn get_retry_count(device: DeviceWrapper) { -    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); +    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);  }  #[test_device]  fn config(device: DeviceWrapper) { -    let mut device = device;      let mut admin = unwrap_ok!(device.authenticate_admin(DEFAULT_ADMIN_PIN));      let config = Config::new(None, None, None, true); @@ -145,24 +152,22 @@ fn config(device: DeviceWrapper) {  #[test_device]  fn change_user_pin(device: DeviceWrapper) { -    let mut device = device; -    assert_any_ok!(device.authenticate_user(DEFAULT_USER_PIN)); -    assert_cmd_err!( -        CommandError::WrongPassword, -        device.authenticate_user(USER_NEW_PASSWORD) -    ); +    let device = device.authenticate_user(DEFAULT_USER_PIN).unwrap().device(); +    let device = device.authenticate_user(USER_NEW_PASSWORD).unwrap_err().0; +    let mut device = device;      assert_ok!(          (),          device.change_user_pin(DEFAULT_USER_PIN, USER_NEW_PASSWORD)      ); -    assert_cmd_err!( -        CommandError::WrongPassword, -        device.authenticate_user(DEFAULT_USER_PIN) -    ); -    assert_any_ok!(device.authenticate_user(USER_NEW_PASSWORD)); +    let device = device.authenticate_user(DEFAULT_USER_PIN).unwrap_err().0; +    let device = device +        .authenticate_user(USER_NEW_PASSWORD) +        .unwrap() +        .device(); +    let mut device = device;      let result = device.change_user_pin(DEFAULT_USER_PIN, DEFAULT_USER_PIN);      assert_cmd_err!(CommandError::WrongPassword, result); @@ -171,32 +176,28 @@ fn change_user_pin(device: DeviceWrapper) {          device.change_user_pin(USER_NEW_PASSWORD, DEFAULT_USER_PIN)      ); -    assert_any_ok!(device.authenticate_user(DEFAULT_USER_PIN)); -    assert_cmd_err!( -        CommandError::WrongPassword, -        device.authenticate_user(USER_NEW_PASSWORD) -    ); +    let device = device.authenticate_user(DEFAULT_USER_PIN).unwrap().device(); +    assert!(device.authenticate_user(USER_NEW_PASSWORD).is_err());  }  #[test_device]  fn change_admin_pin(device: DeviceWrapper) { -    let mut device = device; -    assert_any_ok!(device.authenticate_admin(DEFAULT_ADMIN_PIN)); -    assert_cmd_err!( -        CommandError::WrongPassword, -        device.authenticate_admin(ADMIN_NEW_PASSWORD) -    ); +    let device = device +        .authenticate_admin(DEFAULT_ADMIN_PIN) +        .unwrap() +        .device(); +    let mut device = device.authenticate_admin(ADMIN_NEW_PASSWORD).unwrap_err().0;      assert_ok!(          (),          device.change_admin_pin(DEFAULT_ADMIN_PIN, ADMIN_NEW_PASSWORD)      ); -    assert_cmd_err!( -        CommandError::WrongPassword, -        device.authenticate_admin(DEFAULT_ADMIN_PIN) -    ); -    assert_any_ok!(device.authenticate_admin(ADMIN_NEW_PASSWORD)); +    let device = device.authenticate_admin(DEFAULT_ADMIN_PIN).unwrap_err().0; +    let mut device = device +        .authenticate_admin(ADMIN_NEW_PASSWORD) +        .unwrap() +        .device();      assert_cmd_err!(          CommandError::WrongPassword, @@ -208,24 +209,31 @@ fn change_admin_pin(device: DeviceWrapper) {          device.change_admin_pin(ADMIN_NEW_PASSWORD, DEFAULT_ADMIN_PIN)      ); -    assert_any_ok!(device.authenticate_admin(DEFAULT_ADMIN_PIN)); -    assert_cmd_err!( -        CommandError::WrongPassword, -        device.authenticate_admin(ADMIN_NEW_PASSWORD) -    ); +    let device = device +        .authenticate_admin(DEFAULT_ADMIN_PIN) +        .unwrap() +        .device(); +    device.authenticate_admin(ADMIN_NEW_PASSWORD).unwrap_err();  } -fn require_failed_user_login<D: Authenticate + Device>(device: &mut D, password: &str) { -    assert_cmd_err!( -        CommandError::WrongPassword, -        device.authenticate_user(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  }  #[test_device]  fn unlock_user_pin(device: DeviceWrapper) { -    let mut device = device; -    assert_any_ok!(device.authenticate_user(DEFAULT_USER_PIN)); +    let mut device = device.authenticate_user(DEFAULT_USER_PIN).unwrap().device();      assert_ok!(          (),          device.unlock_user_pin(DEFAULT_ADMIN_PIN, DEFAULT_USER_PIN) @@ -237,10 +245,11 @@ fn unlock_user_pin(device: DeviceWrapper) {      // block user PIN      let wrong_password = DEFAULT_USER_PIN.to_owned() + "foo"; -    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, DEFAULT_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, DEFAULT_USER_PIN, CommandError::WrongPassword);      // unblock with current PIN      assert_cmd_err!( @@ -251,13 +260,14 @@ fn unlock_user_pin(device: DeviceWrapper) {          (),          device.unlock_user_pin(DEFAULT_ADMIN_PIN, DEFAULT_USER_PIN)      ); -    assert_any_ok!(device.authenticate_user(DEFAULT_USER_PIN)); +    let device = device.authenticate_user(DEFAULT_USER_PIN).unwrap().device();      // block user PIN -    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, DEFAULT_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, DEFAULT_USER_PIN, CommandError::WrongPassword);      // unblock with new PIN      assert_cmd_err!( @@ -286,11 +296,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(DEFAULT_ADMIN_PIN));      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(DEFAULT_USER_PIN));      assert_ok!((), pws.write_slot(0, "test", "testlogin", "testpw"));      drop(pws); @@ -314,11 +324,15 @@ fn factory_reset(device: DeviceWrapper) {      );      assert_ok!((), device.factory_reset(ADMIN_NEW_PASSWORD)); -    assert_any_ok!(device.authenticate_admin(DEFAULT_ADMIN_PIN)); +    let device = device +        .authenticate_admin(DEFAULT_ADMIN_PIN) +        .unwrap() +        .device();      let user = unwrap_ok!(device.authenticate_user(DEFAULT_USER_PIN));      assert_cmd_err!(CommandError::SlotNotProgrammed, user.get_totp_slot_name(1)); +    let mut device = user.device();      let pws = unwrap_ok!(device.get_password_safe(DEFAULT_USER_PIN));      assert_utf8_err_or_ne("test", pws.get_slot_name(0));      assert_utf8_err_or_ne("testlogin", pws.get_slot_login(0)); @@ -341,7 +355,10 @@ fn build_aes_key(device: DeviceWrapper) {      );      assert_ok!((), device.build_aes_key(DEFAULT_ADMIN_PIN)); -    assert_any_ok!(device.authenticate_admin(DEFAULT_ADMIN_PIN)); +    let mut device = device +        .authenticate_admin(DEFAULT_ADMIN_PIN) +        .unwrap() +        .device();      let pws = unwrap_ok!(device.get_password_safe(DEFAULT_USER_PIN));      assert_utf8_err_or_ne("test", pws.get_slot_name(0)); diff --git a/tests/otp.rs b/tests/otp.rs index d55d54a..c0bbecf 100644 --- a/tests/otp.rs +++ b/tests/otp.rs @@ -3,6 +3,7 @@  mod util; +use std::fmt::Debug;  use std::ops::DerefMut;  use nitrokey::{ @@ -35,9 +36,10 @@ enum TotpTimestampSize {      U64,  } -fn make_admin_test_device<'a, T>(device: &'a mut T) -> Admin<'a, T> +fn make_admin_test_device<T>(device: T) -> Admin<T>  where      T: Device, +    (T, nitrokey::Error): Debug,  {      unwrap_ok!(device.authenticate_admin(DEFAULT_ADMIN_PIN))  } @@ -66,8 +68,7 @@ fn set_time(device: DeviceWrapper) {  #[test_device]  fn hotp_no_pin(device: DeviceWrapper) { -    let mut device = device; -    let mut admin = make_admin_test_device(&mut device); +    let mut admin = make_admin_test_device(device);      let config = Config::new(None, None, None, false);      assert_ok!((), admin.write_config(config)); @@ -78,38 +79,36 @@ fn hotp_no_pin(device: DeviceWrapper) {      check_hotp_codes(admin.deref_mut(), 5);      configure_hotp(&mut admin, 0); -    check_hotp_codes(&mut device, 0); +    check_hotp_codes(&mut admin.device(), 0);  }  #[test_device]  fn hotp_pin(device: DeviceWrapper) { -    let mut device = device; -    let mut admin = make_admin_test_device(&mut device); +    let mut admin = make_admin_test_device(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!(device.authenticate_user(DEFAULT_USER_PIN)); +    let mut user = unwrap_ok!(admin.device().authenticate_user(DEFAULT_USER_PIN));      check_hotp_codes(&mut user, 0); -    assert_cmd_err!(CommandError::NotAuthorized, user.get_hotp_code(1)); +    assert_cmd_err!(CommandError::NotAuthorized, user.device().get_hotp_code(1));  }  #[test_device]  fn hotp_slot_name(device: DeviceWrapper) { -    let mut device = device; -    let mut admin = make_admin_test_device(&mut device); +    let mut admin = make_admin_test_device(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 device = device; -    let mut admin = make_admin_test_device(&mut device); +    let mut admin = make_admin_test_device(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); @@ -128,8 +127,7 @@ fn hotp_error(device: DeviceWrapper) {  #[test_device]  fn hotp_erase(device: DeviceWrapper) { -    let mut device = device; -    let mut admin = make_admin_test_device(&mut device); +    let mut admin = make_admin_test_device(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); @@ -139,6 +137,7 @@ 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); @@ -175,8 +174,7 @@ fn check_totp_codes(device: &mut GenerateOtp, factor: u64, timestamp_size: TotpT  #[test_device]  fn totp_no_pin(device: DeviceWrapper) { -    let mut device = device; -    let mut admin = make_admin_test_device(&mut device); +    let mut admin = make_admin_test_device(device);      let config = Config::new(None, None, None, false);      assert_ok!((), admin.write_config(config)); @@ -187,15 +185,14 @@ fn totp_no_pin(device: DeviceWrapper) {      check_totp_codes(admin.deref_mut(), 2, TotpTimestampSize::U32);      configure_totp(&mut admin, 1); -    check_totp_codes(&mut device, 1, TotpTimestampSize::U32); +    check_totp_codes(&mut admin.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 device = device; -    let mut admin = make_admin_test_device(&mut device); +    let mut admin = make_admin_test_device(device);      let config = Config::new(None, None, None, false);      assert_ok!((), admin.write_config(config)); @@ -206,45 +203,43 @@ 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 device, 1, TotpTimestampSize::U64); +    check_totp_codes(&mut admin.device(), 1, TotpTimestampSize::U64);  }  #[test_device]  fn totp_pin(device: DeviceWrapper) { -    let mut device = device; -    let mut admin = make_admin_test_device(&mut device); +    let mut admin = make_admin_test_device(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!(device.authenticate_user(DEFAULT_USER_PIN)); +    let mut user = unwrap_ok!(admin.device().authenticate_user(DEFAULT_USER_PIN));      check_totp_codes(&mut user, 1, TotpTimestampSize::U32); -    assert_cmd_err!(CommandError::NotAuthorized, user.get_totp_code(1)); +    assert_cmd_err!(CommandError::NotAuthorized, user.device().get_totp_code(1));  }  #[test_device]  // See comment for totp_no_pin_64.  fn totp_pin_64(device: Pro) { -    let mut device = device; -    let mut admin = make_admin_test_device(&mut device); +    let mut admin = make_admin_test_device(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.authenticate_user(DEFAULT_USER_PIN)); +    let mut user = unwrap_ok!(admin.device().authenticate_user(DEFAULT_USER_PIN));      check_totp_codes(&mut user, 1, TotpTimestampSize::U64); -    assert_cmd_err!(CommandError::NotAuthorized, device.get_totp_code(1)); +    assert_cmd_err!(CommandError::NotAuthorized, user.device().get_totp_code(1));  }  #[test_device]  fn totp_slot_name(device: DeviceWrapper) { -    let mut device = device; -    let mut admin = make_admin_test_device(&mut device); +    let mut admin = make_admin_test_device(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); @@ -253,8 +248,7 @@ fn totp_slot_name(device: DeviceWrapper) {  #[test_device]  fn totp_error(device: DeviceWrapper) { -    let mut device = device; -    let mut admin = make_admin_test_device(&mut device); +    let mut admin = make_admin_test_device(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); @@ -273,8 +267,7 @@ fn totp_error(device: DeviceWrapper) {  #[test_device]  fn totp_erase(device: DeviceWrapper) { -    let mut device = device; -    let mut admin = make_admin_test_device(&mut device); +    let mut admin = make_admin_test_device(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); @@ -284,6 +277,7 @@ 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 5bd19d1..f2b20ec 100644 --- a/tests/util/mod.rs +++ b/tests/util/mod.rs @@ -3,7 +3,7 @@  #[macro_export]  macro_rules! unwrap_ok { -    ($val:expr) => { +    ($val:expr) => {{          match $val {              Ok(val) => val,              Err(err) => panic!( @@ -13,12 +13,12 @@ macro_rules! unwrap_ok {                  err              ),          } -    }; +    }};  }  #[macro_export]  macro_rules! assert_any_ok { -    ($val:expr) => { +    ($val:expr) => {{          match &$val {              Ok(_) => {}              Err(err) => panic!( @@ -28,12 +28,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 => { @@ -54,7 +54,7 @@ macro_rules! assert_ok {                  $left, right_err              ),          } -    }; +    }};  }  #[macro_export] | 
