diff options
| -rw-r--r-- | CHANGELOG.md | 1 | ||||
| -rw-r--r-- | src/auth.rs | 14 | ||||
| -rw-r--r-- | src/device.rs | 72 | ||||
| -rw-r--r-- | src/lib.rs | 4 | ||||
| -rw-r--r-- | src/otp.rs | 26 | ||||
| -rw-r--r-- | src/pws.rs | 33 | ||||
| -rw-r--r-- | tests/device.rs | 46 | ||||
| -rw-r--r-- | tests/otp.rs | 93 | ||||
| -rw-r--r-- | tests/pws.rs | 18 | 
9 files changed, 163 insertions, 144 deletions
| diff --git a/CHANGELOG.md b/CHANGELOG.md index 718b796..e98e857 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -37,6 +37,7 @@ SPDX-License-Identifier: MIT  - Use mutability to represent changes to the device status:    - Implement `DerefMut` for `User<T>` and `Admin<T>`.    - Add `device_mut` method to `DeviceWrapper`. +  - Require a mutable `Device` reference if a method changes the device state.  # v0.3.4 (2019-01-20)  - Fix authentication methods that assumed that `char` is signed. diff --git a/src/auth.rs b/src/auth.rs index 8cec49c..f9f50fa 100644 --- a/src/auth.rs +++ b/src/auth.rs @@ -226,7 +226,7 @@ impl<T: Device> ops::DerefMut for User<T> {  }  impl<T: Device> GenerateOtp for User<T> { -    fn get_hotp_code(&self, slot: u8) -> Result<String, Error> { +    fn get_hotp_code(&mut self, slot: u8) -> Result<String, Error> {          result_from_string(unsafe {              nitrokey_sys::NK_get_hotp_code_PIN(slot, self.temp_password_ptr())          }) @@ -290,7 +290,7 @@ impl<T: Device> Admin<T> {      /// let device = nitrokey::connect()?;      /// let config = Config::new(None, None, None, false);      /// match device.authenticate_admin("12345678") { -    ///     Ok(admin) => { +    ///     Ok(mut admin) => {      ///         admin.write_config(config);      ///         ()      ///     }, @@ -301,7 +301,7 @@ impl<T: Device> Admin<T> {      /// ```      ///      /// [`InvalidSlot`]: enum.LibraryError.html#variant.InvalidSlot -    pub fn write_config(&self, config: Config) -> Result<(), Error> { +    pub fn write_config(&mut self, config: Config) -> Result<(), Error> {          let raw_config = RawConfig::try_from(config)?;          get_command_result(unsafe {              nitrokey_sys::NK_write_config( @@ -317,7 +317,7 @@ impl<T: Device> Admin<T> {  }  impl<T: Device> ConfigureOtp for Admin<T> { -    fn write_hotp_slot(&self, data: OtpSlotData, counter: u64) -> Result<(), Error> { +    fn write_hotp_slot(&mut self, data: OtpSlotData, counter: u64) -> Result<(), Error> {          let raw_data = RawOtpSlotData::new(data)?;          get_command_result(unsafe {              nitrokey_sys::NK_write_hotp_slot( @@ -334,7 +334,7 @@ impl<T: Device> ConfigureOtp for Admin<T> {          })      } -    fn write_totp_slot(&self, data: OtpSlotData, time_window: u16) -> Result<(), Error> { +    fn write_totp_slot(&mut self, data: OtpSlotData, time_window: u16) -> Result<(), Error> {          let raw_data = RawOtpSlotData::new(data)?;          get_command_result(unsafe {              nitrokey_sys::NK_write_totp_slot( @@ -351,13 +351,13 @@ impl<T: Device> ConfigureOtp for Admin<T> {          })      } -    fn erase_hotp_slot(&self, slot: u8) -> Result<(), Error> { +    fn erase_hotp_slot(&mut self, slot: u8) -> Result<(), Error> {          get_command_result(unsafe {              nitrokey_sys::NK_erase_hotp_slot(slot, self.temp_password_ptr())          })      } -    fn erase_totp_slot(&self, slot: u8) -> Result<(), Error> { +    fn erase_totp_slot(&mut self, slot: u8) -> Result<(), Error> {          get_command_result(unsafe {              nitrokey_sys::NK_erase_totp_slot(slot, self.temp_password_ptr())          }) diff --git a/src/device.rs b/src/device.rs index 462e9dc..f6492cd 100644 --- a/src/device.rs +++ b/src/device.rs @@ -452,7 +452,7 @@ pub trait Device: Authenticate + GetPasswordSafe + GenerateOtp + fmt::Debug {      /// # use nitrokey::Error;      ///      /// # fn try_main() -> Result<(), Error> { -    /// let device = nitrokey::connect()?; +    /// let mut device = nitrokey::connect()?;      /// match device.change_admin_pin("12345678", "12345679") {      ///     Ok(()) => println!("Updated admin PIN."),      ///     Err(err) => eprintln!("Failed to update admin PIN: {}", err), @@ -463,7 +463,7 @@ pub trait Device: Authenticate + GetPasswordSafe + GenerateOtp + fmt::Debug {      ///      /// [`InvalidString`]: enum.LibraryError.html#variant.InvalidString      /// [`WrongPassword`]: enum.CommandError.html#variant.WrongPassword -    fn change_admin_pin(&self, current: &str, new: &str) -> Result<(), Error> { +    fn change_admin_pin(&mut self, current: &str, new: &str) -> Result<(), Error> {          let current_string = get_cstring(current)?;          let new_string = get_cstring(new)?;          get_command_result(unsafe { @@ -485,7 +485,7 @@ pub trait Device: Authenticate + GetPasswordSafe + GenerateOtp + fmt::Debug {      /// # use nitrokey::Error;      ///      /// # fn try_main() -> Result<(), Error> { -    /// let device = nitrokey::connect()?; +    /// let mut device = nitrokey::connect()?;      /// match device.change_user_pin("123456", "123457") {      ///     Ok(()) => println!("Updated admin PIN."),      ///     Err(err) => eprintln!("Failed to update admin PIN: {}", err), @@ -496,7 +496,7 @@ pub trait Device: Authenticate + GetPasswordSafe + GenerateOtp + fmt::Debug {      ///      /// [`InvalidString`]: enum.LibraryError.html#variant.InvalidString      /// [`WrongPassword`]: enum.CommandError.html#variant.WrongPassword -    fn change_user_pin(&self, current: &str, new: &str) -> Result<(), Error> { +    fn change_user_pin(&mut self, current: &str, new: &str) -> Result<(), Error> {          let current_string = get_cstring(current)?;          let new_string = get_cstring(new)?;          get_command_result(unsafe { @@ -518,7 +518,7 @@ pub trait Device: Authenticate + GetPasswordSafe + GenerateOtp + fmt::Debug {      /// # use nitrokey::Error;      ///      /// # fn try_main() -> Result<(), Error> { -    /// let device = nitrokey::connect()?; +    /// let mut device = nitrokey::connect()?;      /// match device.unlock_user_pin("12345678", "123456") {      ///     Ok(()) => println!("Unlocked user PIN."),      ///     Err(err) => eprintln!("Failed to unlock user PIN: {}", err), @@ -529,7 +529,7 @@ pub trait Device: Authenticate + GetPasswordSafe + GenerateOtp + fmt::Debug {      ///      /// [`InvalidString`]: enum.LibraryError.html#variant.InvalidString      /// [`WrongPassword`]: enum.CommandError.html#variant.WrongPassword -    fn unlock_user_pin(&self, admin_pin: &str, user_pin: &str) -> Result<(), Error> { +    fn unlock_user_pin(&mut self, admin_pin: &str, user_pin: &str) -> Result<(), Error> {          let admin_pin_string = get_cstring(admin_pin)?;          let user_pin_string = get_cstring(user_pin)?;          get_command_result(unsafe { @@ -552,7 +552,7 @@ pub trait Device: Authenticate + GetPasswordSafe + GenerateOtp + fmt::Debug {      /// # use nitrokey::Error;      ///      /// # fn try_main() -> Result<(), Error> { -    /// let device = nitrokey::connect()?; +    /// let mut device = nitrokey::connect()?;      /// match device.lock() {      ///     Ok(()) => println!("Locked the Nitrokey device."),      ///     Err(err) => eprintln!("Could not lock the Nitrokey device: {}", err), @@ -560,7 +560,7 @@ pub trait Device: Authenticate + GetPasswordSafe + GenerateOtp + fmt::Debug {      /// #     Ok(())      /// # }      /// ``` -    fn lock(&self) -> Result<(), Error> { +    fn lock(&mut self) -> Result<(), Error> {          get_command_result(unsafe { nitrokey_sys::NK_lock_device() })      } @@ -583,7 +583,7 @@ pub trait Device: Authenticate + GetPasswordSafe + GenerateOtp + fmt::Debug {      /// # use nitrokey::Error;      ///      /// # fn try_main() -> Result<(), Error> { -    /// let device = nitrokey::connect()?; +    /// let mut device = nitrokey::connect()?;      /// match device.factory_reset("12345678") {      ///     Ok(()) => println!("Performed a factory reset."),      ///     Err(err) => eprintln!("Could not perform a factory reset: {}", err), @@ -593,7 +593,7 @@ pub trait Device: Authenticate + GetPasswordSafe + GenerateOtp + fmt::Debug {      /// ```      ///      /// [`build_aes_key`]: #method.build_aes_key -    fn factory_reset(&self, admin_pin: &str) -> Result<(), Error> { +    fn factory_reset(&mut self, admin_pin: &str) -> Result<(), Error> {          let admin_pin_string = get_cstring(admin_pin)?;          get_command_result(unsafe { nitrokey_sys::NK_factory_reset(admin_pin_string.as_ptr()) })      } @@ -617,7 +617,7 @@ pub trait Device: Authenticate + GetPasswordSafe + GenerateOtp + fmt::Debug {      /// # use nitrokey::Error;      ///      /// # fn try_main() -> Result<(), Error> { -    /// let device = nitrokey::connect()?; +    /// let mut device = nitrokey::connect()?;      /// match device.build_aes_key("12345678") {      ///     Ok(()) => println!("New AES keys have been built."),      ///     Err(err) => eprintln!("Could not build new AES keys: {}", err), @@ -627,7 +627,7 @@ pub trait Device: Authenticate + GetPasswordSafe + GenerateOtp + fmt::Debug {      /// ```      ///      /// [`factory_reset`]: #method.factory_reset -    fn build_aes_key(&self, admin_pin: &str) -> Result<(), Error> { +    fn build_aes_key(&mut self, admin_pin: &str) -> Result<(), Error> {          let admin_pin_string = get_cstring(admin_pin)?;          get_command_result(unsafe { nitrokey_sys::NK_build_aes_key(admin_pin_string.as_ptr()) })      } @@ -758,8 +758,8 @@ impl GenerateOtp for DeviceWrapper {          self.device().get_totp_slot_name(slot)      } -    fn get_hotp_code(&self, slot: u8) -> Result<String, Error> { -        self.device().get_hotp_code(slot) +    fn get_hotp_code(&mut self, slot: u8) -> Result<String, Error> { +        self.device_mut().get_hotp_code(slot)      }      fn get_totp_code(&self, slot: u8) -> Result<String, Error> { @@ -882,7 +882,7 @@ impl Storage {      /// # use nitrokey::Error;      ///      /// # fn try_main() -> Result<(), Error> { -    /// let device = nitrokey::Storage::connect()?; +    /// let mut device = nitrokey::Storage::connect()?;      /// match device.change_update_pin("12345678", "87654321") {      ///     Ok(()) => println!("Updated update PIN."),      ///     Err(err) => eprintln!("Failed to update update PIN: {}", err), @@ -893,7 +893,7 @@ impl Storage {      ///      /// [`InvalidString`]: enum.LibraryError.html#variant.InvalidString      /// [`WrongPassword`]: enum.CommandError.html#variant.WrongPassword -    pub fn change_update_pin(&self, current: &str, new: &str) -> Result<(), Error> { +    pub fn change_update_pin(&mut self, current: &str, new: &str) -> Result<(), Error> {          let current_string = get_cstring(current)?;          let new_string = get_cstring(new)?;          get_command_result(unsafe { @@ -919,7 +919,7 @@ impl Storage {      /// # use nitrokey::Error;      ///      /// # fn try_main() -> Result<(), Error> { -    /// let device = nitrokey::Storage::connect()?; +    /// let mut device = nitrokey::Storage::connect()?;      /// match device.enable_firmware_update("12345678") {      ///     Ok(()) => println!("Nitrokey entered update mode."),      ///     Err(err) => eprintln!("Could not enter update mode: {}", err), @@ -930,7 +930,7 @@ impl Storage {      ///      /// [`InvalidString`]: enum.LibraryError.html#variant.InvalidString      /// [`WrongPassword`]: enum.CommandError.html#variant.WrongPassword -    pub fn enable_firmware_update(&self, update_pin: &str) -> Result<(), Error> { +    pub fn enable_firmware_update(&mut self, update_pin: &str) -> Result<(), Error> {          let update_pin_string = get_cstring(update_pin)?;          get_command_result(unsafe {              nitrokey_sys::NK_enable_firmware_update(update_pin_string.as_ptr()) @@ -953,7 +953,7 @@ impl Storage {      /// # use nitrokey::Error;      ///      /// # fn try_main() -> Result<(), Error> { -    /// let device = nitrokey::Storage::connect()?; +    /// let mut device = nitrokey::Storage::connect()?;      /// match device.enable_encrypted_volume("123456") {      ///     Ok(()) => println!("Enabled the encrypted volume."),      ///     Err(err) => eprintln!("Could not enable the encrypted volume: {}", err), @@ -964,7 +964,7 @@ impl Storage {      ///      /// [`InvalidString`]: enum.LibraryError.html#variant.InvalidString      /// [`WrongPassword`]: enum.CommandError.html#variant.WrongPassword -    pub fn enable_encrypted_volume(&self, user_pin: &str) -> Result<(), Error> { +    pub fn enable_encrypted_volume(&mut self, user_pin: &str) -> Result<(), Error> {          let user_pin = get_cstring(user_pin)?;          get_command_result(unsafe { nitrokey_sys::NK_unlock_encrypted_volume(user_pin.as_ptr()) })      } @@ -982,7 +982,7 @@ impl Storage {      /// fn use_volume() {}      ///      /// # fn try_main() -> Result<(), Error> { -    /// let device = nitrokey::Storage::connect()?; +    /// let mut device = nitrokey::Storage::connect()?;      /// match device.enable_encrypted_volume("123456") {      ///     Ok(()) => {      ///         println!("Enabled the encrypted volume."); @@ -999,7 +999,7 @@ impl Storage {      /// #     Ok(())      /// # }      /// ``` -    pub fn disable_encrypted_volume(&self) -> Result<(), Error> { +    pub fn disable_encrypted_volume(&mut self) -> Result<(), Error> {          get_command_result(unsafe { nitrokey_sys::NK_lock_encrypted_volume() })      } @@ -1028,7 +1028,7 @@ impl Storage {      /// # use nitrokey::Error;      ///      /// # fn try_main() -> Result<(), Error> { -    /// let device = nitrokey::Storage::connect()?; +    /// let mut device = nitrokey::Storage::connect()?;      /// device.enable_encrypted_volume("123445")?;      /// match device.enable_hidden_volume("hidden-pw") {      ///     Ok(()) => println!("Enabled a hidden volume."), @@ -1041,7 +1041,7 @@ impl Storage {      /// [`enable_encrypted_volume`]: #method.enable_encrypted_volume      /// [`AesDecryptionFailed`]: enum.CommandError.html#variant.AesDecryptionFailed      /// [`InvalidString`]: enum.LibraryError.html#variant.InvalidString -    pub fn enable_hidden_volume(&self, volume_password: &str) -> Result<(), Error> { +    pub fn enable_hidden_volume(&mut self, volume_password: &str) -> Result<(), Error> {          let volume_password = get_cstring(volume_password)?;          get_command_result(unsafe {              nitrokey_sys::NK_unlock_hidden_volume(volume_password.as_ptr()) @@ -1061,7 +1061,7 @@ impl Storage {      /// fn use_volume() {}      ///      /// # fn try_main() -> Result<(), Error> { -    /// let device = nitrokey::Storage::connect()?; +    /// let mut device = nitrokey::Storage::connect()?;      /// device.enable_encrypted_volume("123445")?;      /// match device.enable_hidden_volume("hidden-pw") {      ///     Ok(()) => { @@ -1079,7 +1079,7 @@ impl Storage {      /// #     Ok(())      /// # }      /// ``` -    pub fn disable_hidden_volume(&self) -> Result<(), Error> { +    pub fn disable_hidden_volume(&mut self) -> Result<(), Error> {          get_command_result(unsafe { nitrokey_sys::NK_lock_hidden_volume() })      } @@ -1108,7 +1108,7 @@ impl Storage {      /// # use nitrokey::Error;      ///      /// # fn try_main() -> Result<(), Error> { -    /// let device = nitrokey::Storage::connect()?; +    /// let mut device = nitrokey::Storage::connect()?;      /// device.enable_encrypted_volume("123445")?;      /// device.create_hidden_volume(0, 0, 100, "hidden-pw")?;      /// #     Ok(()) @@ -1118,7 +1118,7 @@ impl Storage {      /// [`AesDecryptionFailed`]: enum.CommandError.html#variant.AesDecryptionFailed      /// [`InvalidString`]: enum.LibraryError.html#variant.InvalidString      pub fn create_hidden_volume( -        &self, +        &mut self,          slot: u8,          start: u8,          end: u8, @@ -1148,7 +1148,7 @@ impl Storage {      /// use nitrokey::VolumeMode;      ///      /// # fn try_main() -> Result<(), Error> { -    /// let device = nitrokey::Storage::connect()?; +    /// let mut device = nitrokey::Storage::connect()?;      /// match device.set_unencrypted_volume_mode("12345678", VolumeMode::ReadWrite) {      ///     Ok(()) => println!("Set the unencrypted volume to read-write mode."),      ///     Err(err) => eprintln!("Could not set the unencrypted volume to read-write mode: {}", err), @@ -1160,7 +1160,7 @@ impl Storage {      /// [`InvalidString`]: enum.LibraryError.html#variant.InvalidString      /// [`WrongPassword`]: enum.CommandError.html#variant.WrongPassword      pub fn set_unencrypted_volume_mode( -        &self, +        &mut self,          admin_pin: &str,          mode: VolumeMode,      ) -> Result<(), Error> { @@ -1193,7 +1193,7 @@ impl Storage {      /// use nitrokey::VolumeMode;      ///      /// # fn try_main() -> Result<(), Error> { -    /// let device = nitrokey::Storage::connect()?; +    /// let mut device = nitrokey::Storage::connect()?;      /// match device.set_encrypted_volume_mode("12345678", VolumeMode::ReadWrite) {      ///     Ok(()) => println!("Set the encrypted volume to read-write mode."),      ///     Err(err) => eprintln!("Could not set the encrypted volume to read-write mode: {}", err), @@ -1205,7 +1205,7 @@ impl Storage {      /// [`InvalidString`]: enum.LibraryError.html#variant.InvalidString      /// [`WrongPassword`]: enum.CommandError.html#variant.WrongPassword      pub fn set_encrypted_volume_mode( -        &self, +        &mut self,          admin_pin: &str,          mode: VolumeMode,      ) -> Result<(), Error> { @@ -1322,7 +1322,7 @@ impl Storage {      /// # use nitrokey::Error;      ///      /// # fn try_main() -> Result<(), Error> { -    /// let device = nitrokey::Storage::connect()?; +    /// let mut device = nitrokey::Storage::connect()?;      /// match device.clear_new_sd_card_warning("12345678") {      ///     Ok(()) => println!("Cleared the new SD card warning."),      ///     Err(err) => eprintln!("Could not set the clear the new SD card warning: {}", err), @@ -1333,7 +1333,7 @@ impl Storage {      ///      /// [`InvalidString`]: enum.LibraryError.html#variant.InvalidString      /// [`WrongPassword`]: enum.CommandError.html#variant.WrongPassword -    pub fn clear_new_sd_card_warning(&self, admin_pin: &str) -> Result<(), Error> { +    pub fn clear_new_sd_card_warning(&mut self, admin_pin: &str) -> Result<(), Error> {          let admin_pin = get_cstring(admin_pin)?;          get_command_result(unsafe {              nitrokey_sys::NK_clear_new_sd_card_warning(admin_pin.as_ptr()) @@ -1341,7 +1341,7 @@ impl Storage {      }      /// Blinks the red and green LED alternatively and infinitely until the device is reconnected. -    pub fn wink(&self) -> Result<(), Error> { +    pub fn wink(&mut self) -> Result<(), Error> {          get_command_result(unsafe { nitrokey_sys::NK_wink() })      } @@ -1361,7 +1361,7 @@ impl Storage {      ///      /// [`InvalidString`]: enum.LibraryError.html#variant.InvalidString      /// [`WrongPassword`]: enum.CommandError.html#variant.WrongPassword -    pub fn export_firmware(&self, admin_pin: &str) -> Result<(), Error> { +    pub fn export_firmware(&mut self, admin_pin: &str) -> Result<(), Error> {          let admin_pin_string = get_cstring(admin_pin)?;          get_command_result(unsafe { nitrokey_sys::NK_export_firmware(admin_pin_string.as_ptr()) })      } @@ -47,7 +47,7 @@  //! let device = nitrokey::connect()?;  //! let slot_data = OtpSlotData::new(1, "test", "01234567890123456689", OtpMode::SixDigits);  //! match device.authenticate_admin("12345678") { -//!     Ok(admin) => { +//!     Ok(mut admin) => {  //!         match admin.write_hotp_slot(slot_data, 0) {  //!             Ok(()) => println!("Successfully wrote slot."),  //!             Err(err) => eprintln!("Could not write slot: {}", err), @@ -66,7 +66,7 @@  //! # use nitrokey::Error;  //!  //! # fn try_main() -> Result<(), Error> { -//! let device = nitrokey::connect()?; +//! let mut device = nitrokey::connect()?;  //! match device.get_hotp_code(1) {  //!     Ok(code) => println!("Generated HOTP code: {}", code),  //!     Err(err) => eprintln!("Could not generate HOTP code: {}", err), @@ -38,7 +38,7 @@ pub trait ConfigureOtp {      /// let device = nitrokey::connect()?;      /// let slot_data = OtpSlotData::new(1, "test", "01234567890123456689", OtpMode::SixDigits);      /// match device.authenticate_admin("12345678") { -    ///     Ok(admin) => { +    ///     Ok(mut admin) => {      ///         match admin.write_hotp_slot(slot_data, 0) {      ///             Ok(()) => println!("Successfully wrote slot."),      ///             Err(err) => eprintln!("Could not write slot: {}", err), @@ -53,7 +53,7 @@ pub trait ConfigureOtp {      /// [`InvalidSlot`]: enum.LibraryError.html#variant.InvalidSlot      /// [`InvalidString`]: enum.LibraryError.html#variant.InvalidString      /// [`NoName`]: enum.CommandError.html#variant.NoName -    fn write_hotp_slot(&self, data: OtpSlotData, counter: u64) -> Result<(), Error>; +    fn write_hotp_slot(&mut self, data: OtpSlotData, counter: u64) -> Result<(), Error>;      /// Configure a TOTP slot with the given data and set the TOTP time window to the given value      /// (default 30). @@ -74,7 +74,7 @@ pub trait ConfigureOtp {      /// let device = nitrokey::connect()?;      /// let slot_data = OtpSlotData::new(1, "test", "01234567890123456689", OtpMode::EightDigits);      /// match device.authenticate_admin("12345678") { -    ///     Ok(admin) => { +    ///     Ok(mut admin) => {      ///         match admin.write_totp_slot(slot_data, 30) {      ///             Ok(()) => println!("Successfully wrote slot."),      ///             Err(err) => eprintln!("Could not write slot: {}", err), @@ -89,7 +89,7 @@ pub trait ConfigureOtp {      /// [`InvalidSlot`]: enum.LibraryError.html#variant.InvalidSlot      /// [`InvalidString`]: enum.LibraryError.html#variant.InvalidString      /// [`NoName`]: enum.CommandError.html#variant.NoName -    fn write_totp_slot(&self, data: OtpSlotData, time_window: u16) -> Result<(), Error>; +    fn write_totp_slot(&mut self, data: OtpSlotData, time_window: u16) -> Result<(), Error>;      /// Erases an HOTP slot.      /// @@ -106,7 +106,7 @@ pub trait ConfigureOtp {      /// # fn try_main() -> Result<(), Error> {      /// let device = nitrokey::connect()?;      /// match device.authenticate_admin("12345678") { -    ///     Ok(admin) => { +    ///     Ok(mut admin) => {      ///         match admin.erase_hotp_slot(1) {      ///             Ok(()) => println!("Successfully erased slot."),      ///             Err(err) => eprintln!("Could not erase slot: {}", err), @@ -119,7 +119,7 @@ pub trait ConfigureOtp {      /// ```      ///      /// [`InvalidSlot`]: enum.LibraryError.html#variant.InvalidSlot -    fn erase_hotp_slot(&self, slot: u8) -> Result<(), Error>; +    fn erase_hotp_slot(&mut self, slot: u8) -> Result<(), Error>;      /// Erases a TOTP slot.      /// @@ -136,7 +136,7 @@ pub trait ConfigureOtp {      /// # fn try_main() -> Result<(), Error> {      /// let device = nitrokey::connect()?;      /// match device.authenticate_admin("12345678") { -    ///     Ok(admin) => { +    ///     Ok(mut admin) => {      ///         match admin.erase_totp_slot(1) {      ///             Ok(()) => println!("Successfully erased slot."),      ///             Err(err) => eprintln!("Could not erase slot: {}", err), @@ -149,7 +149,7 @@ pub trait ConfigureOtp {      /// ```      ///      /// [`InvalidSlot`]: enum.LibraryError.html#variant.InvalidSlot -    fn erase_totp_slot(&self, slot: u8) -> Result<(), Error>; +    fn erase_totp_slot(&mut self, slot: u8) -> Result<(), Error>;  }  /// Provides methods to generate OTP codes and to query OTP slots on a Nitrokey @@ -171,7 +171,7 @@ pub trait GenerateOtp {      /// # use nitrokey::Error;      ///      /// # fn try_main() -> Result<(), Error> { -    /// let device = nitrokey::connect()?; +    /// let mut device = nitrokey::connect()?;      /// let time = time::SystemTime::now().duration_since(time::UNIX_EPOCH);      /// match time {      ///     Ok(time) => device.set_time(time.as_secs(), false)?, @@ -187,7 +187,7 @@ pub trait GenerateOtp {      ///      /// [`get_totp_code`]: #method.get_totp_code      /// [`Timestamp`]: enum.CommandError.html#variant.Timestamp -    fn set_time(&self, time: u64, force: bool) -> Result<(), Error> { +    fn set_time(&mut self, time: u64, force: bool) -> Result<(), Error> {          let result = if force {              unsafe { nitrokey_sys::NK_totp_set_time(time) }          } else { @@ -270,7 +270,7 @@ pub trait GenerateOtp {      /// # use nitrokey::Error;      ///      /// # fn try_main() -> Result<(), Error> { -    /// let device = nitrokey::connect()?; +    /// let mut device = nitrokey::connect()?;      /// let code = device.get_hotp_code(1)?;      /// println!("Generated HOTP code on slot 1: {}", code);      /// #     Ok(()) @@ -281,7 +281,7 @@ pub trait GenerateOtp {      /// [`InvalidSlot`]: enum.LibraryError.html#variant.InvalidSlot      /// [`NotAuthorized`]: enum.CommandError.html#variant.NotAuthorized      /// [`SlotNotProgrammed`]: enum.CommandError.html#variant.SlotNotProgrammed -    fn get_hotp_code(&self, slot: u8) -> Result<String, Error> { +    fn get_hotp_code(&mut self, slot: u8) -> Result<String, Error> {          result_from_string(unsafe { nitrokey_sys::NK_get_hotp_code(slot) })      } @@ -305,7 +305,7 @@ pub trait GenerateOtp {      /// # use nitrokey::Error;      ///      /// # fn try_main() -> Result<(), Error> { -    /// let device = nitrokey::connect()?; +    /// let mut device = nitrokey::connect()?;      /// let time = time::SystemTime::now().duration_since(time::UNIX_EPOCH);      /// match time {      ///     Ok(time) => { @@ -43,9 +43,10 @@ pub const SLOT_COUNT: u8 = 16;  /// }  ///  /// # fn try_main() -> Result<(), Error> { -/// let device = nitrokey::connect()?; +/// let mut device = nitrokey::connect()?;  /// let pws = device.get_password_safe("123456")?;  /// use_password_safe(&pws); +/// drop(pws);  /// device.lock()?;  /// #     Ok(())  /// # } @@ -97,14 +98,14 @@ pub trait GetPasswordSafe {      /// fn use_password_safe(pws: &PasswordSafe) {}      ///      /// # fn try_main() -> Result<(), Error> { -    /// let device = nitrokey::connect()?; +    /// let mut device = nitrokey::connect()?;      /// match device.get_password_safe("123456") {      ///     Ok(pws) => {      ///         use_password_safe(&pws); -    ///         device.lock()?;      ///     },      ///     Err(err) => eprintln!("Could not open the password safe: {}", err),      /// }; +    /// device.lock()?;      /// #     Ok(())      /// # }      /// ``` @@ -116,7 +117,7 @@ pub trait GetPasswordSafe {      /// [`InvalidString`]: enum.LibraryError.html#variant.InvalidString      /// [`Unknown`]: enum.CommandError.html#variant.Unknown      /// [`WrongPassword`]: enum.CommandError.html#variant.WrongPassword -    fn get_password_safe(&self, user_pin: &str) -> Result<PasswordSafe<'_>, Error>; +    fn get_password_safe(&mut self, user_pin: &str) -> Result<PasswordSafe<'_>, Error>;  }  fn get_password_safe<'a>( @@ -148,7 +149,7 @@ impl<'a> PasswordSafe<'a> {      /// # use nitrokey::Error;      ///      /// # fn try_main() -> Result<(), Error> { -    /// let device = nitrokey::connect()?; +    /// let mut device = nitrokey::connect()?;      /// let pws = device.get_password_safe("123456")?;      /// pws.get_slot_status()?.iter().enumerate().for_each(|(slot, programmed)| {      ///     let status = match *programmed { @@ -193,7 +194,7 @@ impl<'a> PasswordSafe<'a> {      /// # use nitrokey::Error;      ///      /// # fn try_main() -> Result<(), Error> { -    /// let device = nitrokey::connect()?; +    /// let mut device = nitrokey::connect()?;      /// match device.get_password_safe("123456") {      ///     Ok(pws) => {      ///         let name = pws.get_slot_name(0)?; @@ -230,7 +231,7 @@ impl<'a> PasswordSafe<'a> {      /// # use nitrokey::Error;      ///      /// # fn try_main() -> Result<(), Error> { -    /// let device = nitrokey::connect()?; +    /// let mut device = nitrokey::connect()?;      /// let pws = device.get_password_safe("123456")?;      /// let name = pws.get_slot_name(0)?;      /// let login = pws.get_slot_login(0)?; @@ -263,7 +264,7 @@ impl<'a> PasswordSafe<'a> {      /// # use nitrokey::Error;      ///      /// # fn try_main() -> Result<(), Error> { -    /// let device = nitrokey::connect()?; +    /// let mut device = nitrokey::connect()?;      /// let pws = device.get_password_safe("123456")?;      /// let name = pws.get_slot_name(0)?;      /// let login = pws.get_slot_login(0)?; @@ -294,7 +295,7 @@ impl<'a> PasswordSafe<'a> {      /// # use nitrokey::Error;      ///      /// # fn try_main() -> Result<(), Error> { -    /// let device = nitrokey::connect()?; +    /// let mut device = nitrokey::connect()?;      /// let pws = device.get_password_safe("123456")?;      /// let name = pws.get_slot_name(0)?;      /// let login = pws.get_slot_login(0)?; @@ -307,7 +308,7 @@ impl<'a> PasswordSafe<'a> {      /// [`InvalidSlot`]: enum.LibraryError.html#variant.InvalidSlot      /// [`InvalidString`]: enum.LibraryError.html#variant.InvalidString      pub fn write_slot( -        &self, +        &mut self,          slot: u8,          name: &str,          login: &str, @@ -340,8 +341,8 @@ impl<'a> PasswordSafe<'a> {      /// # use nitrokey::Error;      ///      /// # fn try_main() -> Result<(), Error> { -    /// let device = nitrokey::connect()?; -    /// let pws = device.get_password_safe("123456")?; +    /// let mut device = nitrokey::connect()?; +    /// let mut pws = device.get_password_safe("123456")?;      /// match pws.erase_slot(0) {      ///     Ok(()) => println!("Erased slot 0."),      ///     Err(err) => eprintln!("Could not erase slot 0: {}", err), @@ -351,7 +352,7 @@ impl<'a> PasswordSafe<'a> {      /// ```      ///      /// [`InvalidSlot`]: enum.LibraryError.html#variant.InvalidSlot -    pub fn erase_slot(&self, slot: u8) -> Result<(), Error> { +    pub fn erase_slot(&mut self, slot: u8) -> Result<(), Error> {          get_command_result(unsafe { nitrokey_sys::NK_erase_password_safe_slot(slot) })      }  } @@ -364,19 +365,19 @@ impl<'a> Drop for PasswordSafe<'a> {  }  impl GetPasswordSafe for Pro { -    fn get_password_safe(&self, user_pin: &str) -> Result<PasswordSafe<'_>, Error> { +    fn get_password_safe(&mut self, user_pin: &str) -> Result<PasswordSafe<'_>, Error> {          get_password_safe(self, user_pin)      }  }  impl GetPasswordSafe for Storage { -    fn get_password_safe(&self, user_pin: &str) -> Result<PasswordSafe<'_>, Error> { +    fn get_password_safe(&mut self, user_pin: &str) -> Result<PasswordSafe<'_>, Error> {          get_password_safe(self, user_pin)      }  }  impl GetPasswordSafe for DeviceWrapper { -    fn get_password_safe(&self, user_pin: &str) -> Result<PasswordSafe<'_>, Error> { +    fn get_password_safe(&mut self, user_pin: &str) -> Result<PasswordSafe<'_>, Error> {          get_password_safe(self, user_pin)      }  } diff --git a/tests/device.rs b/tests/device.rs index 969a7df..7a69214 100644 --- a/tests/device.rs +++ b/tests/device.rs @@ -133,7 +133,7 @@ fn get_retry_count(device: DeviceWrapper) {  #[test_device]  fn config(device: DeviceWrapper) { -    let admin = unwrap_ok!(device.authenticate_admin(ADMIN_PASSWORD)); +    let mut admin = unwrap_ok!(device.authenticate_admin(ADMIN_PASSWORD));      let config = Config::new(None, None, None, true);      assert_ok!((), admin.write_config(config)); @@ -156,6 +156,7 @@ 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_ok!((), device.change_user_pin(USER_PASSWORD, USER_NEW_PASSWORD));      let device = device.authenticate_user(USER_PASSWORD).unwrap_err().0; @@ -164,6 +165,7 @@ fn change_user_pin(device: DeviceWrapper) {          .unwrap()          .device(); +    let mut device = device;      let result = device.change_user_pin(USER_PASSWORD, USER_PASSWORD);      assert_cmd_err!(CommandError::WrongPassword, result); @@ -176,7 +178,7 @@ fn change_user_pin(device: DeviceWrapper) {  #[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 mut device = device.authenticate_admin(ADMIN_NEW_PASSWORD).unwrap_err().0;      assert_ok!(          (), @@ -184,7 +186,7 @@ fn change_admin_pin(device: DeviceWrapper) {      );      let device = device.authenticate_admin(ADMIN_PASSWORD).unwrap_err().0; -    let device = device +    let mut device = device          .authenticate_admin(ADMIN_NEW_PASSWORD)          .unwrap()          .device(); @@ -220,7 +222,7 @@ where  #[test_device]  fn unlock_user_pin(device: DeviceWrapper) { -    let device = device.authenticate_user(USER_PASSWORD).unwrap().device(); +    let mut device = device.authenticate_user(USER_PASSWORD).unwrap().device();      assert_ok!((), device.unlock_user_pin(ADMIN_PASSWORD, USER_PASSWORD));      assert_cmd_err!(          CommandError::WrongPassword, @@ -232,7 +234,7 @@ fn unlock_user_pin(device: DeviceWrapper) {      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, USER_PASSWORD, CommandError::WrongPassword);      // unblock with current PIN      assert_cmd_err!( @@ -246,7 +248,7 @@ fn unlock_user_pin(device: DeviceWrapper) {      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, USER_PASSWORD, CommandError::WrongPassword);      // unblock with new PIN      assert_cmd_err!( @@ -272,12 +274,12 @@ fn assert_utf8_err_or_ne(left: &str, right: Result<String, Error>) {  #[test_device]  fn factory_reset(device: DeviceWrapper) { -    let admin = unwrap_ok!(device.authenticate_admin(ADMIN_PASSWORD)); +    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 device = admin.device(); -    let pws = unwrap_ok!(device.get_password_safe(USER_PASSWORD)); +    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); @@ -302,18 +304,20 @@ fn factory_reset(device: DeviceWrapper) {      let user = unwrap_ok!(device.authenticate_user(USER_PASSWORD));      assert_cmd_err!(CommandError::SlotNotProgrammed, user.get_totp_slot_name(1)); -    let device = user.device(); +    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));      assert_utf8_err_or_ne("testpw", pws.get_slot_password(0)); +    drop(pws);      assert_ok!((), device.build_aes_key(ADMIN_PASSWORD));  }  #[test_device]  fn build_aes_key(device: DeviceWrapper) { -    let pws = unwrap_ok!(device.get_password_safe(USER_PASSWORD)); +    let mut device = device; +    let mut pws = unwrap_ok!(device.get_password_safe(USER_PASSWORD));      assert_ok!((), pws.write_slot(0, "test", "testlogin", "testpw"));      drop(pws); @@ -323,7 +327,7 @@ fn build_aes_key(device: DeviceWrapper) {      );      assert_ok!((), device.build_aes_key(ADMIN_PASSWORD)); -    let device = device.authenticate_admin(ADMIN_PASSWORD).unwrap().device(); +    let mut device = device.authenticate_admin(ADMIN_PASSWORD).unwrap().device();      let pws = unwrap_ok!(device.get_password_safe(USER_PASSWORD));      assert_utf8_err_or_ne("test", pws.get_slot_name(0)); @@ -333,6 +337,7 @@ fn build_aes_key(device: DeviceWrapper) {  #[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) @@ -343,6 +348,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()); @@ -361,6 +367,7 @@ 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()); @@ -396,6 +403,7 @@ fn hidden_volume(device: Storage) {  #[test_device]  fn lock(device: Storage) { +    let mut device = device;      assert_ok!((), device.enable_encrypted_volume(USER_PASSWORD));      assert_ok!((), device.lock());      assert_eq!(1, count_nitrokey_block_devices()); @@ -405,6 +413,7 @@ fn lock(device: Storage) {  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!(          (), @@ -441,12 +450,13 @@ fn set_unencrypted_volume_mode(device: Storage) {          );      } -    fn assert_success(device: &Storage, mode: VolumeMode) { +    fn assert_success(device: &mut Storage, mode: VolumeMode) {          assert_ok!((), device.set_unencrypted_volume_mode(ADMIN_PASSWORD, 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, @@ -454,9 +464,9 @@ fn set_unencrypted_volume_mode(device: Storage) {      );      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] @@ -488,6 +498,7 @@ fn get_production_info(device: Storage) {  #[test_device]  fn clear_new_sd_card_warning(device: Storage) { +    let mut device = device;      assert_ok!((), device.factory_reset(ADMIN_PASSWORD));      thread::sleep(time::Duration::from_secs(3));      assert_ok!((), device.build_aes_key(ADMIN_PASSWORD)); @@ -506,6 +517,7 @@ fn clear_new_sd_card_warning(device: Storage) {  #[test_device]  fn export_firmware(device: Storage) { +    let mut device = device;      assert_cmd_err!(          CommandError::WrongPassword,          device.export_firmware("someadminpn") diff --git a/tests/otp.rs b/tests/otp.rs index fc0e79e..28a8d7c 100644 --- a/tests/otp.rs +++ b/tests/otp.rs @@ -4,7 +4,7 @@  mod util;  use std::fmt::Debug; -use std::ops::Deref; +use std::ops::DerefMut;  use nitrokey::{      Admin, Authenticate, CommandError, Config, ConfigureOtp, Device, GenerateOtp, LibraryError, @@ -48,12 +48,12 @@ where          .expect("Could not login as admin.")  } -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 {              assert_ok!(code.to_string(), device.get_hotp_code(1)); @@ -63,6 +63,7 @@ fn check_hotp_codes(device: &GenerateOtp, offset: u8) {  #[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)); @@ -71,36 +72,36 @@ 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 = unwrap_ok!(admin.device().authenticate_user(USER_PASSWORD)); -    check_hotp_codes(&user, 0); +    configure_hotp(&mut admin, 0); +    let mut user = unwrap_ok!(admin.device().authenticate_user(USER_PASSWORD)); +    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)); @@ -111,7 +112,7 @@ fn hotp_slot_name(device: DeviceWrapper) {  #[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); @@ -130,7 +131,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); @@ -140,7 +141,7 @@ 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); @@ -149,13 +150,13 @@ fn hotp_erase(device: DeviceWrapper) {      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; @@ -177,49 +178,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 = unwrap_ok!(admin.device().authenticate_user(USER_PASSWORD)); -    check_totp_codes(&user, 1, TotpTimestampSize::U32); +    configure_totp(&mut admin, 1); +    let mut user = unwrap_ok!(admin.device().authenticate_user(USER_PASSWORD)); +    check_totp_codes(&mut user, 1, TotpTimestampSize::U32);      assert_cmd_err!(CommandError::NotAuthorized, user.device().get_totp_code(1));  } @@ -227,20 +226,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 = unwrap_ok!(admin.device().authenticate_user(USER_PASSWORD)); -    check_totp_codes(&user, 1, TotpTimestampSize::U64); +    configure_totp(&mut admin, 1); +    let mut user = unwrap_ok!(admin.device().authenticate_user(USER_PASSWORD)); +    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)); @@ -253,7 +252,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); @@ -272,7 +271,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); diff --git a/tests/pws.rs b/tests/pws.rs index 32dc8f7..7805803 100644 --- a/tests/pws.rs +++ b/tests/pws.rs @@ -33,7 +33,7 @@ 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,  { @@ -42,6 +42,7 @@ where  #[test_device]  fn enable(device: DeviceWrapper) { +    let mut device = device;      assert_cmd_err!(          CommandError::WrongPassword,          device.get_password_safe(&(USER_PASSWORD.to_owned() + "123")) @@ -56,8 +57,9 @@ fn enable(device: DeviceWrapper) {  #[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_ok!("name".to_string(), pws.get_slot_name(1));          let result = get_slot_name_direct(1); @@ -72,7 +74,8 @@ 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));      } @@ -93,7 +96,8 @@ fn get_status(device: DeviceWrapper) {  #[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_ok!("name".to_string(), pws.get_slot_name(1));      assert_ok!("login".to_string(), pws.get_slot_login(1)); @@ -119,7 +123,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, @@ -144,7 +149,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")); | 
