diff options
| author | Daniel Mueller <deso@posteo.net> | 2019-08-12 22:07:44 -0700 | 
|---|---|---|
| committer | Daniel Mueller <deso@posteo.net> | 2019-08-12 22:07:44 -0700 | 
| commit | 4dc73375e0364aea70b52682b916635b7b75a2eb (patch) | |
| tree | b92b238d61c14bb634db699dedcd714918b84975 /nitrokey/tests | |
| parent | a18066a1a10792ddbd57527ad58f75fc84fafad2 (diff) | |
| download | nitrocli-4dc73375e0364aea70b52682b916635b7b75a2eb.tar.gz nitrocli-4dc73375e0364aea70b52682b916635b7b75a2eb.tar.bz2 | |
Update nitrokey crate to 0.4.0-alpha.2
This change updates the dependency to nitrokey to version 0.4.0-alpha.2.
In addition to minor interface changes for the get_*_firmware_version
and get_*_retry_count functions, several functions that change the
device state now require a mutable handle to the nitrokey. Hence, this
patch a number of function signatures to accept mutable device objects.
Import subrepo nitrokey/:nitrokey at 34efcfadf1436102e42144f710edabaa2c4b55cd
Diffstat (limited to 'nitrokey/tests')
| -rw-r--r-- | nitrokey/tests/device.rs | 266 | ||||
| -rw-r--r-- | nitrokey/tests/lib.rs | 4 | ||||
| -rw-r--r-- | nitrokey/tests/otp.rs | 116 | ||||
| -rw-r--r-- | nitrokey/tests/pws.rs | 54 | ||||
| -rw-r--r-- | nitrokey/tests/util/mod.rs | 31 | 
5 files changed, 288 insertions, 183 deletions
| diff --git a/nitrokey/tests/device.rs b/nitrokey/tests/device.rs index c790049..5c52024 100644 --- a/nitrokey/tests/device.rs +++ b/nitrokey/tests/device.rs @@ -10,11 +10,10 @@ use std::{thread, time};  use nitrokey::{      Authenticate, CommandError, CommunicationError, Config, ConfigureOtp, Device, Error,      GenerateOtp, GetPasswordSafe, LibraryError, OtpMode, OtpSlotData, Storage, VolumeMode, +    DEFAULT_ADMIN_PIN, DEFAULT_USER_PIN,  };  use nitrokey_test::test as test_device; -use crate::util::{ADMIN_PASSWORD, USER_PASSWORD}; -  static ADMIN_NEW_PASSWORD: &str = "1234567890";  static UPDATE_PIN: &str = "12345678";  static UPDATE_NEW_PIN: &str = "87654321"; @@ -55,9 +54,9 @@ fn connect_pro(device: Pro) {      assert_eq!(device.get_model(), nitrokey::Model::Pro);      drop(device); -    assert!(nitrokey::connect().is_ok()); -    assert!(nitrokey::connect_model(nitrokey::Model::Pro).is_ok()); -    assert!(nitrokey::Pro::connect().is_ok()); +    assert_any_ok!(nitrokey::connect()); +    assert_any_ok!(nitrokey::connect_model(nitrokey::Model::Pro)); +    assert_any_ok!(nitrokey::Pro::connect());  }  #[test_device] @@ -65,9 +64,9 @@ fn connect_storage(device: Storage) {      assert_eq!(device.get_model(), nitrokey::Model::Storage);      drop(device); -    assert!(nitrokey::connect().is_ok()); -    assert!(nitrokey::connect_model(nitrokey::Model::Storage).is_ok()); -    assert!(nitrokey::Storage::connect().is_ok()); +    assert_any_ok!(nitrokey::connect()); +    assert_any_ok!(nitrokey::connect_model(nitrokey::Model::Storage)); +    assert_any_ok!(nitrokey::Storage::connect());  }  fn assert_empty_serial_number() { @@ -87,36 +86,34 @@ fn disconnect(device: DeviceWrapper) {  #[test_device]  fn get_serial_number(device: DeviceWrapper) { -    let result = device.get_serial_number(); -    assert!(result.is_ok()); -    let serial_number = result.unwrap(); +    let serial_number = unwrap_ok!(device.get_serial_number());      assert!(serial_number.is_ascii());      assert!(serial_number.chars().all(|c| c.is_ascii_hexdigit()));  }  #[test_device]  fn get_firmware_version(device: Pro) { -    assert_eq!(0, device.get_major_firmware_version()); -    let minor = device.get_minor_firmware_version(); -    assert!(minor > 0); +    let version = unwrap_ok!(device.get_firmware_version()); +    assert_eq!(0, version.major); +    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 result = device.authenticate_admin(&(DEFAULT_ADMIN_PIN.to_owned() + suffix));      let device = match result {          Ok(admin) => admin.device(),          Err((device, _)) => device,      }; -    assert_eq!(count, device.get_admin_retry_count()); +    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 result = device.authenticate_user(&(DEFAULT_USER_PIN.to_owned() + suffix));      let device = match result {          Ok(admin) => admin.device(),          Err((device, _)) => device,      }; -    assert_eq!(count, device.get_user_retry_count()); +    assert_ok!(count, device.get_user_retry_count());      return device;  } @@ -135,7 +132,7 @@ fn get_retry_count(device: DeviceWrapper) {  #[test_device]  fn config(device: DeviceWrapper) { -    let admin = device.authenticate_admin(ADMIN_PASSWORD).unwrap(); +    let mut admin = unwrap_ok!(device.authenticate_admin(DEFAULT_ADMIN_PIN));      let config = Config::new(None, None, None, true);      assert_ok!((), admin.write_config(config)); @@ -155,53 +152,67 @@ 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(DEFAULT_USER_PIN).unwrap().device();      let device = device.authenticate_user(USER_NEW_PASSWORD).unwrap_err().0; -    assert_ok!((), device.change_user_pin(USER_PASSWORD, USER_NEW_PASSWORD)); +    let mut device = device; +    assert_ok!( +        (), +        device.change_user_pin(DEFAULT_USER_PIN, USER_NEW_PASSWORD) +    ); -    let device = device.authenticate_user(USER_PASSWORD).unwrap_err().0; +    let device = device.authenticate_user(DEFAULT_USER_PIN).unwrap_err().0;      let device = device          .authenticate_user(USER_NEW_PASSWORD)          .unwrap()          .device(); -    let result = device.change_user_pin(USER_PASSWORD, USER_PASSWORD); +    let mut device = device; +    let result = device.change_user_pin(DEFAULT_USER_PIN, DEFAULT_USER_PIN);      assert_cmd_err!(CommandError::WrongPassword, result); -    assert_ok!((), device.change_user_pin(USER_NEW_PASSWORD, USER_PASSWORD)); +    assert_ok!( +        (), +        device.change_user_pin(USER_NEW_PASSWORD, DEFAULT_USER_PIN) +    ); -    let device = device.authenticate_user(USER_PASSWORD).unwrap().device(); +    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 device = device.authenticate_admin(ADMIN_PASSWORD).unwrap().device(); -    let device = device.authenticate_admin(ADMIN_NEW_PASSWORD).unwrap_err().0; +    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(ADMIN_PASSWORD, ADMIN_NEW_PASSWORD) +        device.change_admin_pin(DEFAULT_ADMIN_PIN, ADMIN_NEW_PASSWORD)      ); -    let device = device.authenticate_admin(ADMIN_PASSWORD).unwrap_err().0; -    let device = device +    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, -        device.change_admin_pin(ADMIN_PASSWORD, ADMIN_PASSWORD) +        device.change_admin_pin(DEFAULT_ADMIN_PIN, DEFAULT_ADMIN_PIN)      );      assert_ok!(          (), -        device.change_admin_pin(ADMIN_NEW_PASSWORD, ADMIN_PASSWORD) +        device.change_admin_pin(ADMIN_NEW_PASSWORD, DEFAULT_ADMIN_PIN)      ); -    let device = device.authenticate_admin(ADMIN_PASSWORD).unwrap().device(); +    let device = device +        .authenticate_admin(DEFAULT_ADMIN_PIN) +        .unwrap() +        .device();      device.authenticate_admin(ADMIN_NEW_PASSWORD).unwrap_err();  } @@ -222,63 +233,85 @@ where  #[test_device]  fn unlock_user_pin(device: DeviceWrapper) { -    let device = device.authenticate_user(USER_PASSWORD).unwrap().device(); -    assert_ok!((), device.unlock_user_pin(ADMIN_PASSWORD, USER_PASSWORD)); +    let mut device = device.authenticate_user(DEFAULT_USER_PIN).unwrap().device(); +    assert_ok!( +        (), +        device.unlock_user_pin(DEFAULT_ADMIN_PIN, DEFAULT_USER_PIN) +    );      assert_cmd_err!(          CommandError::WrongPassword, -        device.unlock_user_pin(USER_PASSWORD, USER_PASSWORD) +        device.unlock_user_pin(DEFAULT_USER_PIN, DEFAULT_USER_PIN)      );      // block user PIN -    let wrong_password = USER_PASSWORD.to_owned() + "foo"; +    let wrong_password = DEFAULT_USER_PIN.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 device = require_failed_user_login(device, USER_PASSWORD, CommandError::WrongPassword); +    let mut device = +        require_failed_user_login(device, DEFAULT_USER_PIN, CommandError::WrongPassword);      // unblock with current PIN      assert_cmd_err!(          CommandError::WrongPassword, -        device.unlock_user_pin(USER_PASSWORD, USER_PASSWORD) +        device.unlock_user_pin(DEFAULT_USER_PIN, DEFAULT_USER_PIN)      ); -    assert_ok!((), device.unlock_user_pin(ADMIN_PASSWORD, USER_PASSWORD)); -    let device = device.authenticate_user(USER_PASSWORD).unwrap().device(); +    assert_ok!( +        (), +        device.unlock_user_pin(DEFAULT_ADMIN_PIN, DEFAULT_USER_PIN) +    ); +    let device = device.authenticate_user(DEFAULT_USER_PIN).unwrap().device();      // 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 device = require_failed_user_login(device, USER_PASSWORD, CommandError::WrongPassword); +    let mut device = +        require_failed_user_login(device, DEFAULT_USER_PIN, CommandError::WrongPassword);      // unblock with new PIN      assert_cmd_err!(          CommandError::WrongPassword, -        device.unlock_user_pin(USER_PASSWORD, USER_PASSWORD) +        device.unlock_user_pin(DEFAULT_USER_PIN, DEFAULT_USER_PIN)      );      assert_ok!(          (), -        device.unlock_user_pin(ADMIN_PASSWORD, USER_NEW_PASSWORD) +        device.unlock_user_pin(DEFAULT_ADMIN_PIN, USER_NEW_PASSWORD)      );      // reset user PIN -    assert_ok!((), device.change_user_pin(USER_NEW_PASSWORD, USER_PASSWORD)); +    assert_ok!( +        (), +        device.change_user_pin(USER_NEW_PASSWORD, DEFAULT_USER_PIN) +    ); +} + +fn assert_utf8_err_or_ne(left: &str, right: Result<String, Error>) { +    match right { +        Ok(s) => assert_ne!(left.to_string(), s), +        Err(Error::Utf8Error(_)) => {} +        Err(err) => panic!("Expected Utf8Error, got {}!", err), +    }  }  #[test_device]  fn factory_reset(device: DeviceWrapper) { -    let admin = device.authenticate_admin(ADMIN_PASSWORD).unwrap(); +    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 device = admin.device(); -    let pws = device.get_password_safe(USER_PASSWORD).unwrap(); +    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); -    assert_ok!((), device.change_user_pin(USER_PASSWORD, USER_NEW_PASSWORD));      assert_ok!(          (), -        device.change_admin_pin(ADMIN_PASSWORD, ADMIN_NEW_PASSWORD) +        device.change_user_pin(DEFAULT_USER_PIN, USER_NEW_PASSWORD) +    ); +    assert_ok!( +        (), +        device.change_admin_pin(DEFAULT_ADMIN_PIN, ADMIN_NEW_PASSWORD)      );      assert_cmd_err!( @@ -287,46 +320,55 @@ fn factory_reset(device: DeviceWrapper) {      );      assert_cmd_err!(          CommandError::WrongPassword, -        device.factory_reset(ADMIN_PASSWORD) +        device.factory_reset(DEFAULT_ADMIN_PIN)      );      assert_ok!((), device.factory_reset(ADMIN_NEW_PASSWORD)); -    let device = device.authenticate_admin(ADMIN_PASSWORD).unwrap().device(); +    let device = device +        .authenticate_admin(DEFAULT_ADMIN_PIN) +        .unwrap() +        .device(); -    let user = device.authenticate_user(USER_PASSWORD).unwrap(); +    let user = unwrap_ok!(device.authenticate_user(DEFAULT_USER_PIN));      assert_cmd_err!(CommandError::SlotNotProgrammed, user.get_totp_slot_name(1)); -    let device = user.device(); -    let pws = device.get_password_safe(USER_PASSWORD).unwrap(); -    assert_ne!("test".to_string(), pws.get_slot_name(0).unwrap()); -    assert_ne!("testlogin".to_string(), pws.get_slot_login(0).unwrap()); -    assert_ne!("testpw".to_string(), pws.get_slot_password(0).unwrap()); +    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)); +    assert_utf8_err_or_ne("testpw", pws.get_slot_password(0)); +    drop(pws); -    assert_ok!((), device.build_aes_key(ADMIN_PASSWORD)); +    assert_ok!((), device.build_aes_key(DEFAULT_ADMIN_PIN));  }  #[test_device]  fn build_aes_key(device: DeviceWrapper) { -    let pws = device.get_password_safe(USER_PASSWORD).unwrap(); +    let mut device = device; +    let mut pws = unwrap_ok!(device.get_password_safe(DEFAULT_USER_PIN));      assert_ok!((), pws.write_slot(0, "test", "testlogin", "testpw"));      drop(pws);      assert_cmd_err!(          CommandError::WrongPassword, -        device.build_aes_key(USER_PASSWORD) +        device.build_aes_key(DEFAULT_USER_PIN)      ); -    assert_ok!((), device.build_aes_key(ADMIN_PASSWORD)); +    assert_ok!((), device.build_aes_key(DEFAULT_ADMIN_PIN)); -    let device = device.authenticate_admin(ADMIN_PASSWORD).unwrap().device(); +    let mut device = device +        .authenticate_admin(DEFAULT_ADMIN_PIN) +        .unwrap() +        .device(); -    let pws = device.get_password_safe(USER_PASSWORD).unwrap(); -    assert_ne!("test".to_string(), pws.get_slot_name(0).unwrap()); -    assert_ne!("testlogin".to_string(), pws.get_slot_login(0).unwrap()); -    assert_ne!("testpw".to_string(), pws.get_slot_password(0).unwrap()); +    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)); +    assert_utf8_err_or_ne("testpw", pws.get_slot_password(0));  }  #[test_device]  fn change_update_pin(device: Storage) { +    let mut device = device;      assert_cmd_err!(          CommandError::WrongPassword,          device.change_update_pin(UPDATE_NEW_PIN, UPDATE_PIN) @@ -337,6 +379,7 @@ fn change_update_pin(device: Storage) {  #[test_device]  fn encrypted_volume(device: Storage) { +    let mut device = device;      assert_ok!((), device.lock());      assert_eq!(1, count_nitrokey_block_devices()); @@ -347,7 +390,7 @@ fn encrypted_volume(device: Storage) {          device.enable_encrypted_volume("123")      );      assert_eq!(1, count_nitrokey_block_devices()); -    assert_ok!((), device.enable_encrypted_volume(USER_PASSWORD)); +    assert_ok!((), device.enable_encrypted_volume(DEFAULT_USER_PIN));      assert_eq!(2, count_nitrokey_block_devices());      assert_ok!((), device.disable_encrypted_volume());      assert_eq!(1, count_nitrokey_block_devices()); @@ -355,13 +398,14 @@ fn encrypted_volume(device: Storage) {  #[test_device]  fn hidden_volume(device: Storage) { +    let mut device = device;      assert_ok!((), device.lock());      assert_eq!(1, count_nitrokey_block_devices());      assert_ok!((), device.disable_hidden_volume());      assert_eq!(1, count_nitrokey_block_devices()); -    assert_ok!((), device.enable_encrypted_volume(USER_PASSWORD)); +    assert_ok!((), device.enable_encrypted_volume(DEFAULT_USER_PIN));      assert_eq!(2, count_nitrokey_block_devices());      // TODO: why this error code? @@ -390,51 +434,85 @@ fn hidden_volume(device: Storage) {  #[test_device]  fn lock(device: Storage) { -    assert_ok!((), device.enable_encrypted_volume(USER_PASSWORD)); +    let mut device = device; +    assert_ok!((), device.enable_encrypted_volume(DEFAULT_USER_PIN));      assert_ok!((), device.lock());      assert_eq!(1, count_nitrokey_block_devices());  }  #[test_device] +fn set_encrypted_volume_mode(device: Storage) { +    // This test case does not check the device status as the command only works with firmware +    // version 0.49.  For later versions, it does not do anything and always returns Ok(()). +    let mut device = device; + +    assert_ok!( +        (), +        device.set_encrypted_volume_mode(DEFAULT_ADMIN_PIN, VolumeMode::ReadOnly) +    ); + +    // TODO: re-enable once the password is checked in the firmware +    // assert_cmd_err!( +    //     CommandError::WrongPassword, +    //     device.set_encrypted_volume_mode(DEFAULT_USER_PIN, VolumeMode::ReadOnly) +    // ); + +    assert_ok!( +        (), +        device.set_encrypted_volume_mode(DEFAULT_ADMIN_PIN, VolumeMode::ReadOnly) +    ); +    assert_ok!( +        (), +        device.set_encrypted_volume_mode(DEFAULT_ADMIN_PIN, VolumeMode::ReadWrite) +    ); +    assert_ok!( +        (), +        device.set_encrypted_volume_mode(DEFAULT_ADMIN_PIN, VolumeMode::ReadOnly) +    ); +} + +#[test_device]  fn set_unencrypted_volume_mode(device: Storage) {      fn assert_mode(device: &Storage, mode: VolumeMode) { -        let status = device.get_status(); -        assert!(status.is_ok()); +        let status = unwrap_ok!(device.get_status());          assert_eq!( -            status.unwrap().unencrypted_volume.read_only, +            status.unencrypted_volume.read_only,              mode == VolumeMode::ReadOnly          );      } -    fn assert_success(device: &Storage, mode: VolumeMode) { -        assert_ok!((), device.set_unencrypted_volume_mode(ADMIN_PASSWORD, mode)); +    fn assert_success(device: &mut Storage, mode: VolumeMode) { +        assert_ok!( +            (), +            device.set_unencrypted_volume_mode(DEFAULT_ADMIN_PIN, mode) +        );          assert_mode(&device, mode);      } -    assert_success(&device, VolumeMode::ReadOnly); +    let mut device = device; +    assert_success(&mut device, VolumeMode::ReadOnly);      assert_cmd_err!(          CommandError::WrongPassword, -        device.set_unencrypted_volume_mode(USER_PASSWORD, VolumeMode::ReadOnly) +        device.set_unencrypted_volume_mode(DEFAULT_USER_PIN, VolumeMode::ReadOnly)      );      assert_mode(&device, VolumeMode::ReadOnly); -    assert_success(&device, VolumeMode::ReadWrite); -    assert_success(&device, VolumeMode::ReadWrite); -    assert_success(&device, VolumeMode::ReadOnly); +    assert_success(&mut device, VolumeMode::ReadWrite); +    assert_success(&mut device, VolumeMode::ReadWrite); +    assert_success(&mut device, VolumeMode::ReadOnly);  }  #[test_device]  fn get_storage_status(device: Storage) { -    let status = device.get_status().unwrap(); - +    let status = unwrap_ok!(device.get_status());      assert!(status.serial_number_sd_card > 0);      assert!(status.serial_number_smart_card > 0);  }  #[test_device]  fn get_production_info(device: Storage) { -    let info = device.get_production_info().unwrap(); +    let info = unwrap_ok!(device.get_production_info());      assert_eq!(0, info.firmware_version.major);      assert!(info.firmware_version.minor != 0);      assert!(info.serial_number_cpu != 0); @@ -447,43 +525,45 @@ fn get_production_info(device: Storage) {      assert!(info.sd_card.oem != 0);      assert!(info.sd_card.manufacturer != 0); -    let status = device.get_status().unwrap(); +    let status = unwrap_ok!(device.get_status());      assert_eq!(status.firmware_version, info.firmware_version);      assert_eq!(status.serial_number_sd_card, info.sd_card.serial_number);  }  #[test_device]  fn clear_new_sd_card_warning(device: Storage) { -    assert_ok!((), device.factory_reset(ADMIN_PASSWORD)); +    let mut device = device; +    assert_ok!((), device.factory_reset(DEFAULT_ADMIN_PIN));      thread::sleep(time::Duration::from_secs(3)); -    assert_ok!((), device.build_aes_key(ADMIN_PASSWORD)); +    assert_ok!((), device.build_aes_key(DEFAULT_ADMIN_PIN));      // We have to perform an SD card operation to reset the new_sd_card_found field      assert_ok!((), device.lock()); -    let status = device.get_status().unwrap(); +    let status = unwrap_ok!(device.get_status());      assert!(status.new_sd_card_found); -    assert_ok!((), device.clear_new_sd_card_warning(ADMIN_PASSWORD)); +    assert_ok!((), device.clear_new_sd_card_warning(DEFAULT_ADMIN_PIN)); -    let status = device.get_status().unwrap(); +    let status = unwrap_ok!(device.get_status());      assert!(!status.new_sd_card_found);  }  #[test_device]  fn export_firmware(device: Storage) { +    let mut device = device;      assert_cmd_err!(          CommandError::WrongPassword,          device.export_firmware("someadminpn")      ); -    assert_ok!((), device.export_firmware(ADMIN_PASSWORD)); +    assert_ok!((), device.export_firmware(DEFAULT_ADMIN_PIN));      assert_ok!(          (), -        device.set_unencrypted_volume_mode(ADMIN_PASSWORD, VolumeMode::ReadWrite) +        device.set_unencrypted_volume_mode(DEFAULT_ADMIN_PIN, VolumeMode::ReadWrite)      ); -    assert_ok!((), device.export_firmware(ADMIN_PASSWORD)); +    assert_ok!((), device.export_firmware(DEFAULT_ADMIN_PIN));      assert_ok!(          (), -        device.set_unencrypted_volume_mode(ADMIN_PASSWORD, VolumeMode::ReadOnly) +        device.set_unencrypted_volume_mode(DEFAULT_ADMIN_PIN, VolumeMode::ReadOnly)      );  } diff --git a/nitrokey/tests/lib.rs b/nitrokey/tests/lib.rs index 697024d..8ab75f6 100644 --- a/nitrokey/tests/lib.rs +++ b/nitrokey/tests/lib.rs @@ -1,9 +1,11 @@  // Copyright (C) 2019 Robin Krahl <robin.krahl@ireas.org>  // SPDX-License-Identifier: MIT +mod util; +  #[test]  fn get_library_version() { -    let version = nitrokey::get_library_version().unwrap(); +    let version = unwrap_ok!(nitrokey::get_library_version());      assert!(version.git.is_empty() || version.git.starts_with("v"));      assert!(version.major > 0); diff --git a/nitrokey/tests/otp.rs b/nitrokey/tests/otp.rs index e424673..c0bbecf 100644 --- a/nitrokey/tests/otp.rs +++ b/nitrokey/tests/otp.rs @@ -4,16 +4,14 @@  mod util;  use std::fmt::Debug; -use std::ops::Deref; +use std::ops::DerefMut;  use nitrokey::{      Admin, Authenticate, CommandError, Config, ConfigureOtp, Device, GenerateOtp, LibraryError, -    OtpMode, OtpSlotData, +    OtpMode, OtpSlotData, DEFAULT_ADMIN_PIN, DEFAULT_USER_PIN,  };  use nitrokey_test::test as test_device; -use crate::util::{ADMIN_PASSWORD, USER_PASSWORD}; -  // test suite according to RFC 4226, Appendix D  static HOTP_SECRET: &str = "3132333435363738393031323334353637383930";  static HOTP_CODES: &[&str] = &[ @@ -43,27 +41,25 @@ where      T: Device,      (T, nitrokey::Error): Debug,  { -    device -        .authenticate_admin(ADMIN_PASSWORD) -        .expect("Could not login as admin.") +    unwrap_ok!(device.authenticate_admin(DEFAULT_ADMIN_PIN))  } -fn configure_hotp(admin: &ConfigureOtp, counter: u8) { +fn configure_hotp(admin: &mut ConfigureOtp, counter: u8) {      let slot_data = OtpSlotData::new(1, "test-hotp", HOTP_SECRET, OtpMode::SixDigits);      assert_ok!((), admin.write_hotp_slot(slot_data, counter.into()));  } -fn check_hotp_codes(device: &GenerateOtp, offset: u8) { +fn check_hotp_codes(device: &mut GenerateOtp, offset: u8) {      HOTP_CODES.iter().enumerate().for_each(|(i, code)| {          if i >= offset as usize { -            let result = device.get_hotp_code(1); -            assert_eq!(code, &result.unwrap()); +            assert_ok!(code.to_string(), device.get_hotp_code(1));          }      });  }  #[test_device]  fn set_time(device: DeviceWrapper) { +    let mut device = device;      assert_ok!((), device.set_time(1546385382, true));      assert_ok!((), device.set_time(1546385392, false));      assert_cmd_err!(CommandError::Timestamp, device.set_time(1546385292, false)); @@ -72,49 +68,47 @@ fn set_time(device: DeviceWrapper) {  #[test_device]  fn hotp_no_pin(device: DeviceWrapper) { -    let admin = make_admin_test_device(device); +    let mut admin = make_admin_test_device(device);      let config = Config::new(None, None, None, false);      assert_ok!((), admin.write_config(config)); -    configure_hotp(&admin, 0); -    check_hotp_codes(admin.deref(), 0); +    configure_hotp(&mut admin, 0); +    check_hotp_codes(admin.deref_mut(), 0); -    configure_hotp(&admin, 5); -    check_hotp_codes(admin.deref(), 5); +    configure_hotp(&mut admin, 5); +    check_hotp_codes(admin.deref_mut(), 5); -    configure_hotp(&admin, 0); -    check_hotp_codes(&admin.device(), 0); +    configure_hotp(&mut admin, 0); +    check_hotp_codes(&mut admin.device(), 0);  }  #[test_device]  fn hotp_pin(device: DeviceWrapper) { -    let admin = make_admin_test_device(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(&admin, 0); -    let user = admin.device().authenticate_user(USER_PASSWORD).unwrap(); -    check_hotp_codes(&user, 0); +    configure_hotp(&mut admin, 0); +    let mut user = unwrap_ok!(admin.device().authenticate_user(DEFAULT_USER_PIN)); +    check_hotp_codes(&mut user, 0);      assert_cmd_err!(CommandError::NotAuthorized, user.device().get_hotp_code(1));  }  #[test_device]  fn hotp_slot_name(device: DeviceWrapper) { -    let admin = make_admin_test_device(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(); -    let result = device.get_hotp_slot_name(1); -    assert_eq!("test-hotp", result.unwrap()); -    let result = device.get_hotp_slot_name(4); -    assert_lib_err!(LibraryError::InvalidSlot, result); +    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 admin = make_admin_test_device(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); @@ -133,7 +127,7 @@ fn hotp_error(device: DeviceWrapper) {  #[test_device]  fn hotp_erase(device: DeviceWrapper) { -    let admin = make_admin_test_device(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); @@ -143,22 +137,22 @@ fn hotp_erase(device: DeviceWrapper) {      assert_ok!((), admin.erase_hotp_slot(1)); -    let device = admin.device(); +    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);      assert_cmd_err!(CommandError::SlotNotProgrammed, result); -    assert_eq!("test2", device.get_hotp_slot_name(2).unwrap()); +    assert_ok!("test2".to_string(), device.get_hotp_slot_name(2));  } -fn configure_totp(admin: &ConfigureOtp, factor: u64) { +fn configure_totp(admin: &mut ConfigureOtp, factor: u64) {      let slot_data = OtpSlotData::new(1, "test-totp", TOTP_SECRET, OtpMode::EightDigits);      let time_window = 30u64.checked_mul(factor).unwrap();      assert_ok!((), admin.write_totp_slot(slot_data, time_window as u16));  } -fn check_totp_codes(device: &GenerateOtp, factor: u64, timestamp_size: TotpTimestampSize) { +fn check_totp_codes(device: &mut GenerateOtp, factor: u64, timestamp_size: TotpTimestampSize) {      for (base_time, codes) in TOTP_CODES {          let time = base_time.checked_mul(factor).unwrap();          let is_u64 = time > u32::max_value() as u64; @@ -167,7 +161,7 @@ fn check_totp_codes(device: &GenerateOtp, factor: u64, timestamp_size: TotpTimes          }          assert_ok!((), device.set_time(time, true)); -        let code = device.get_totp_code(1).unwrap(); +        let code = unwrap_ok!(device.get_totp_code(1));          assert!(              code.contains(&code),              "Generated TOTP code {} for {}, but expected one of {}", @@ -180,49 +174,47 @@ fn check_totp_codes(device: &GenerateOtp, factor: u64, timestamp_size: TotpTimes  #[test_device]  fn totp_no_pin(device: DeviceWrapper) { -    // TODO: this test may fail due to bad timing --> find solution -    let admin = make_admin_test_device(device); +    let mut admin = make_admin_test_device(device);      let config = Config::new(None, None, None, false);      assert_ok!((), admin.write_config(config)); -    configure_totp(&admin, 1); -    check_totp_codes(admin.deref(), 1, TotpTimestampSize::U32); +    configure_totp(&mut admin, 1); +    check_totp_codes(admin.deref_mut(), 1, TotpTimestampSize::U32); -    configure_totp(&admin, 2); -    check_totp_codes(admin.deref(), 2, TotpTimestampSize::U32); +    configure_totp(&mut admin, 2); +    check_totp_codes(admin.deref_mut(), 2, TotpTimestampSize::U32); -    configure_totp(&admin, 1); -    check_totp_codes(&admin.device(), 1, TotpTimestampSize::U32); +    configure_totp(&mut admin, 1); +    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 admin = make_admin_test_device(device); +    let mut admin = make_admin_test_device(device);      let config = Config::new(None, None, None, false);      assert_ok!((), admin.write_config(config)); -    configure_totp(&admin, 1); -    check_totp_codes(admin.deref(), 1, TotpTimestampSize::U64); +    configure_totp(&mut admin, 1); +    check_totp_codes(admin.deref_mut(), 1, TotpTimestampSize::U64); -    configure_totp(&admin, 2); -    check_totp_codes(admin.deref(), 2, TotpTimestampSize::U64); +    configure_totp(&mut admin, 2); +    check_totp_codes(admin.deref_mut(), 2, TotpTimestampSize::U64); -    configure_totp(&admin, 1); -    check_totp_codes(&admin.device(), 1, TotpTimestampSize::U64); +    configure_totp(&mut admin, 1); +    check_totp_codes(&mut admin.device(), 1, TotpTimestampSize::U64);  }  #[test_device]  fn totp_pin(device: DeviceWrapper) { -    // TODO: this test may fail due to bad timing --> find solution -    let admin = make_admin_test_device(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(&admin, 1); -    let user = admin.device().authenticate_user(USER_PASSWORD).unwrap(); -    check_totp_codes(&user, 1, TotpTimestampSize::U32); +    configure_totp(&mut admin, 1); +    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.device().get_totp_code(1));  } @@ -230,20 +222,20 @@ fn totp_pin(device: DeviceWrapper) {  #[test_device]  // See comment for totp_no_pin_64.  fn totp_pin_64(device: Pro) { -    let admin = make_admin_test_device(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(&admin, 1); -    let user = admin.device().authenticate_user(USER_PASSWORD).unwrap(); -    check_totp_codes(&user, 1, TotpTimestampSize::U64); +    configure_totp(&mut admin, 1); +    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, user.device().get_totp_code(1));  }  #[test_device]  fn totp_slot_name(device: DeviceWrapper) { -    let admin = make_admin_test_device(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)); @@ -256,7 +248,7 @@ fn totp_slot_name(device: DeviceWrapper) {  #[test_device]  fn totp_error(device: DeviceWrapper) { -    let admin = make_admin_test_device(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); @@ -275,7 +267,7 @@ fn totp_error(device: DeviceWrapper) {  #[test_device]  fn totp_erase(device: DeviceWrapper) { -    let admin = make_admin_test_device(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); @@ -291,5 +283,5 @@ fn totp_erase(device: DeviceWrapper) {      let result = device.get_totp_code(1);      assert_cmd_err!(CommandError::SlotNotProgrammed, result); -    assert_eq!("test2", device.get_totp_slot_name(2).unwrap()); +    assert_ok!("test2".to_string(), device.get_totp_slot_name(2));  } diff --git a/nitrokey/tests/pws.rs b/nitrokey/tests/pws.rs index df99e1c..b0e5abe 100644 --- a/nitrokey/tests/pws.rs +++ b/nitrokey/tests/pws.rs @@ -7,13 +7,12 @@ use std::ffi::CStr;  use libc::{c_int, c_void, free};  use nitrokey::{ -    CommandError, Device, Error, GetPasswordSafe, LibraryError, PasswordSafe, SLOT_COUNT, +    CommandError, Device, Error, GetPasswordSafe, LibraryError, PasswordSafe, DEFAULT_ADMIN_PIN, +    DEFAULT_USER_PIN, SLOT_COUNT,  };  use nitrokey_sys;  use nitrokey_test::test as test_device; -use crate::util::{ADMIN_PASSWORD, USER_PASSWORD}; -  fn get_slot_name_direct(slot: u8) -> Result<String, Error> {      let ptr = unsafe { nitrokey_sys::NK_get_password_safe_slot_name(slot) };      if ptr.is_null() { @@ -33,33 +32,35 @@ fn get_slot_name_direct(slot: u8) -> Result<String, Error> {      }  } -fn get_pws<T>(device: &T) -> PasswordSafe +fn get_pws<T>(device: &mut T) -> PasswordSafe  where      T: Device,  { -    device.get_password_safe(USER_PASSWORD).unwrap() +    unwrap_ok!(device.get_password_safe(DEFAULT_USER_PIN))  }  #[test_device]  fn enable(device: DeviceWrapper) { +    let mut device = device;      assert_cmd_err!(          CommandError::WrongPassword, -        device.get_password_safe(&(USER_PASSWORD.to_owned() + "123")) +        device.get_password_safe(&(DEFAULT_USER_PIN.to_owned() + "123"))      ); -    assert!(device.get_password_safe(USER_PASSWORD).is_ok()); +    assert_any_ok!(device.get_password_safe(DEFAULT_USER_PIN));      assert_cmd_err!(          CommandError::WrongPassword, -        device.get_password_safe(ADMIN_PASSWORD) +        device.get_password_safe(DEFAULT_ADMIN_PIN)      ); -    assert!(device.get_password_safe(USER_PASSWORD).is_ok()); +    assert_any_ok!(device.get_password_safe(DEFAULT_USER_PIN));  }  #[test_device]  fn drop(device: DeviceWrapper) { +    let mut device = device;      { -        let pws = get_pws(&device); +        let mut pws = get_pws(&mut device);          assert_ok!((), pws.write_slot(1, "name", "login", "password")); -        assert_eq!("name", pws.get_slot_name(1).unwrap()); +        assert_ok!("name".to_string(), pws.get_slot_name(1));          let result = get_slot_name_direct(1);          assert_ok!(String::from("name"), result);      } @@ -72,15 +73,16 @@ fn drop(device: DeviceWrapper) {  #[test_device]  fn get_status(device: DeviceWrapper) { -    let pws = get_pws(&device); +    let mut device = device; +    let mut pws = get_pws(&mut device);      for i in 0..SLOT_COUNT {          assert_ok!((), pws.erase_slot(i));      } -    let status = pws.get_slot_status().unwrap(); +    let status = unwrap_ok!(pws.get_slot_status());      assert_eq!(status, [false; SLOT_COUNT as usize]);      assert_ok!((), pws.write_slot(1, "name", "login", "password")); -    let status = pws.get_slot_status().unwrap(); +    let status = unwrap_ok!(pws.get_slot_status());      for i in 0..SLOT_COUNT {          assert_eq!(i == 1, status[i as usize]);      } @@ -88,17 +90,17 @@ fn get_status(device: DeviceWrapper) {      for i in 0..SLOT_COUNT {          assert_ok!((), pws.write_slot(i, "name", "login", "password"));      } -    let status = pws.get_slot_status().unwrap(); -    assert_eq!(status, [true; SLOT_COUNT as usize]); +    assert_ok!([true; SLOT_COUNT as usize], pws.get_slot_status());  }  #[test_device]  fn get_data(device: DeviceWrapper) { -    let pws = get_pws(&device); +    let mut device = device; +    let mut pws = get_pws(&mut device);      assert_ok!((), pws.write_slot(1, "name", "login", "password")); -    assert_eq!("name", pws.get_slot_name(1).unwrap()); -    assert_eq!("login", pws.get_slot_login(1).unwrap()); -    assert_eq!("password", pws.get_slot_password(1).unwrap()); +    assert_ok!("name".to_string(), pws.get_slot_name(1)); +    assert_ok!("login".to_string(), pws.get_slot_login(1)); +    assert_ok!("password".to_string(), pws.get_slot_password(1));      assert_ok!((), pws.erase_slot(1));      assert_cmd_err!(CommandError::SlotNotProgrammed, pws.get_slot_name(1)); @@ -109,9 +111,9 @@ fn get_data(device: DeviceWrapper) {      let login = "pär@test.com";      let password = "'i3lJc[09?I:,[u7dWz9";      assert_ok!((), pws.write_slot(1, name, login, password)); -    assert_eq!(name, pws.get_slot_name(1).unwrap()); -    assert_eq!(login, pws.get_slot_login(1).unwrap()); -    assert_eq!(password, pws.get_slot_password(1).unwrap()); +    assert_ok!(name.to_string(), pws.get_slot_name(1)); +    assert_ok!(login.to_string(), pws.get_slot_login(1)); +    assert_ok!(password.to_string(), pws.get_slot_password(1));      assert_lib_err!(LibraryError::InvalidSlot, pws.get_slot_name(SLOT_COUNT));      assert_lib_err!(LibraryError::InvalidSlot, pws.get_slot_login(SLOT_COUNT)); @@ -120,7 +122,8 @@ fn get_data(device: DeviceWrapper) {  #[test_device]  fn write(device: DeviceWrapper) { -    let pws = get_pws(&device); +    let mut device = device; +    let mut pws = get_pws(&mut device);      assert_lib_err!(          LibraryError::InvalidSlot, @@ -145,7 +148,8 @@ fn write(device: DeviceWrapper) {  #[test_device]  fn erase(device: DeviceWrapper) { -    let pws = get_pws(&device); +    let mut device = device; +    let mut pws = get_pws(&mut device);      assert_lib_err!(LibraryError::InvalidSlot, pws.erase_slot(SLOT_COUNT));      assert_ok!((), pws.write_slot(0, "name", "login", "password")); diff --git a/nitrokey/tests/util/mod.rs b/nitrokey/tests/util/mod.rs index 49ec13e..f2b20ec 100644 --- a/nitrokey/tests/util/mod.rs +++ b/nitrokey/tests/util/mod.rs @@ -1,8 +1,35 @@  // Copyright (C) 2018-2019 Robin Krahl <robin.krahl@ireas.org>  // SPDX-License-Identifier: MIT -pub static ADMIN_PASSWORD: &str = "12345678"; -pub static USER_PASSWORD: &str = "123456"; +#[macro_export] +macro_rules! unwrap_ok { +    ($val:expr) => {{ +        match $val { +            Ok(val) => val, +            Err(err) => panic!( +                r#"assertion failed: `(left == right)` +  left: `Ok(_)`, + right: `Err({:?})`"#, +                err +            ), +        } +    }}; +} + +#[macro_export] +macro_rules! assert_any_ok { +    ($val:expr) => {{ +        match &$val { +            Ok(_) => {} +            Err(err) => panic!( +                r#"assertion failed: `(left == right)` +  left: `Ok(_)`, + right: `Err({:?})`"#, +                err +            ), +        } +    }}; +}  #[macro_export]  macro_rules! assert_ok { | 
