diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/auth.rs | 54 | ||||
| -rw-r--r-- | src/config.rs | 8 | ||||
| -rw-r--r-- | src/device.rs | 182 | ||||
| -rw-r--r-- | src/error.rs | 11 | ||||
| -rw-r--r-- | src/lib.rs | 14 | ||||
| -rw-r--r-- | src/otp.rs | 62 | ||||
| -rw-r--r-- | src/pws.rs | 62 | ||||
| -rw-r--r-- | src/util.rs | 24 | 
8 files changed, 214 insertions, 203 deletions
diff --git a/src/auth.rs b/src/auth.rs index e805e54..509d3aa 100644 --- a/src/auth.rs +++ b/src/auth.rs @@ -6,7 +6,7 @@ use nitrokey_sys;  use crate::config::{Config, RawConfig};  use crate::device::{Device, DeviceWrapper, Pro, Storage}; -use crate::error::CommandError; +use crate::error::{CommandError, Error};  use crate::otp::{ConfigureOtp, GenerateOtp, OtpMode, OtpSlotData, RawOtpSlotData};  use crate::util::{generate_password, get_command_result, get_cstring, result_from_string}; @@ -33,12 +33,12 @@ pub trait Authenticate {      ///      /// ```no_run      /// use nitrokey::{Authenticate, DeviceWrapper, User}; -    /// # use nitrokey::CommandError; +    /// # use nitrokey::Error;      ///      /// fn perform_user_task(device: &User<DeviceWrapper>) {}      /// fn perform_other_task(device: &DeviceWrapper) {}      /// -    /// # fn try_main() -> Result<(), CommandError> { +    /// # fn try_main() -> Result<(), Error> {      /// let device = nitrokey::connect()?;      /// let device = match device.authenticate_user("123456") {      ///     Ok(user) => { @@ -58,7 +58,7 @@ pub trait Authenticate {      /// [`InvalidString`]: enum.CommandError.html#variant.InvalidString      /// [`RngError`]: enum.CommandError.html#variant.RngError      /// [`WrongPassword`]: enum.CommandError.html#variant.WrongPassword -    fn authenticate_user(self, password: &str) -> Result<User<Self>, (Self, CommandError)> +    fn authenticate_user(self, password: &str) -> Result<User<Self>, (Self, Error)>      where          Self: Device + Sized; @@ -79,12 +79,12 @@ pub trait Authenticate {      ///      /// ```no_run      /// use nitrokey::{Authenticate, Admin, DeviceWrapper}; -    /// # use nitrokey::CommandError; +    /// # use nitrokey::Error;      ///      /// fn perform_admin_task(device: &Admin<DeviceWrapper>) {}      /// fn perform_other_task(device: &DeviceWrapper) {}      /// -    /// # fn try_main() -> Result<(), CommandError> { +    /// # fn try_main() -> Result<(), Error> {      /// let device = nitrokey::connect()?;      /// let device = match device.authenticate_admin("123456") {      ///     Ok(admin) => { @@ -104,7 +104,7 @@ pub trait Authenticate {      /// [`InvalidString`]: enum.CommandError.html#variant.InvalidString      /// [`RngError`]: enum.CommandError.html#variant.RngError      /// [`WrongPassword`]: enum.CommandError.html#variant.WrongPassword -    fn authenticate_admin(self, password: &str) -> Result<Admin<Self>, (Self, CommandError)> +    fn authenticate_admin(self, password: &str) -> Result<Admin<Self>, (Self, Error)>      where          Self: Device + Sized;  } @@ -143,7 +143,7 @@ pub struct Admin<T: Device> {      temp_password: Vec<u8>,  } -fn authenticate<D, A, T>(device: D, password: &str, callback: T) -> Result<A, (D, CommandError)> +fn authenticate<D, A, T>(device: D, password: &str, callback: T) -> Result<A, (D, Error)>  where      D: Device,      A: AuthenticatedDevice<D>, @@ -161,7 +161,7 @@ where      let temp_password_ptr = temp_password.as_ptr() as *const c_char;      return match callback(password_ptr, temp_password_ptr) {          0 => Ok(A::new(device, temp_password)), -        rv => Err((device, CommandError::from(rv))), +        rv => Err((device, CommandError::from(rv).into())),      };  } @@ -169,7 +169,7 @@ fn authenticate_user_wrapper<T, C>(      device: T,      constructor: C,      password: &str, -) -> Result<User<DeviceWrapper>, (DeviceWrapper, CommandError)> +) -> Result<User<DeviceWrapper>, (DeviceWrapper, Error)>  where      T: Device,      C: Fn(T) -> DeviceWrapper, @@ -185,7 +185,7 @@ fn authenticate_admin_wrapper<T, C>(      device: T,      constructor: C,      password: &str, -) -> Result<Admin<DeviceWrapper>, (DeviceWrapper, CommandError)> +) -> Result<Admin<DeviceWrapper>, (DeviceWrapper, Error)>  where      T: Device,      C: Fn(T) -> DeviceWrapper, @@ -215,14 +215,14 @@ impl<T: Device> Deref for User<T> {  }  impl<T: Device> GenerateOtp for User<T> { -    fn get_hotp_code(&self, slot: u8) -> Result<String, CommandError> { +    fn get_hotp_code(&self, slot: u8) -> Result<String, Error> {          unsafe {              let temp_password_ptr = self.temp_password.as_ptr() as *const c_char;              return result_from_string(nitrokey_sys::NK_get_hotp_code_PIN(slot, temp_password_ptr));          }      } -    fn get_totp_code(&self, slot: u8) -> Result<String, CommandError> { +    fn get_totp_code(&self, slot: u8) -> Result<String, Error> {          unsafe {              let temp_password_ptr = self.temp_password.as_ptr() as *const c_char;              return result_from_string(nitrokey_sys::NK_get_totp_code_PIN( @@ -271,9 +271,9 @@ impl<T: Device> Admin<T> {      ///      /// ```no_run      /// use nitrokey::{Authenticate, Config}; -    /// # use nitrokey::CommandError; +    /// # use nitrokey::Error;      /// -    /// # fn try_main() -> Result<(), CommandError> { +    /// # fn try_main() -> Result<(), Error> {      /// let device = nitrokey::connect()?;      /// let config = Config::new(None, None, None, false);      /// match device.authenticate_admin("12345678") { @@ -288,7 +288,7 @@ impl<T: Device> Admin<T> {      /// ```      ///      /// [`InvalidSlot`]: enum.CommandError.html#variant.InvalidSlot -    pub fn write_config(&self, config: Config) -> Result<(), CommandError> { +    pub fn write_config(&self, config: Config) -> Result<(), Error> {          let raw_config = RawConfig::try_from(config)?;          unsafe {              get_command_result(nitrokey_sys::NK_write_config( @@ -302,7 +302,7 @@ impl<T: Device> Admin<T> {          }      } -    fn write_otp_slot<C>(&self, data: OtpSlotData, callback: C) -> Result<(), CommandError> +    fn write_otp_slot<C>(&self, data: OtpSlotData, callback: C) -> Result<(), Error>      where          C: Fn(RawOtpSlotData, *const c_char) -> c_int,      { @@ -313,7 +313,7 @@ impl<T: Device> Admin<T> {  }  impl<T: Device> ConfigureOtp for Admin<T> { -    fn write_hotp_slot(&self, data: OtpSlotData, counter: u64) -> Result<(), CommandError> { +    fn write_hotp_slot(&self, data: OtpSlotData, counter: u64) -> Result<(), Error> {          self.write_otp_slot(data, |raw_data: RawOtpSlotData, temp_password_ptr| unsafe {              nitrokey_sys::NK_write_hotp_slot(                  raw_data.number, @@ -329,7 +329,7 @@ impl<T: Device> ConfigureOtp for Admin<T> {          })      } -    fn write_totp_slot(&self, data: OtpSlotData, time_window: u16) -> Result<(), CommandError> { +    fn write_totp_slot(&self, data: OtpSlotData, time_window: u16) -> Result<(), Error> {          self.write_otp_slot(data, |raw_data: RawOtpSlotData, temp_password_ptr| unsafe {              nitrokey_sys::NK_write_totp_slot(                  raw_data.number, @@ -345,12 +345,12 @@ impl<T: Device> ConfigureOtp for Admin<T> {          })      } -    fn erase_hotp_slot(&self, slot: u8) -> Result<(), CommandError> { +    fn erase_hotp_slot(&self, slot: u8) -> Result<(), Error> {          let temp_password_ptr = self.temp_password.as_ptr() as *const c_char;          unsafe { get_command_result(nitrokey_sys::NK_erase_hotp_slot(slot, temp_password_ptr)) }      } -    fn erase_totp_slot(&self, slot: u8) -> Result<(), CommandError> { +    fn erase_totp_slot(&self, slot: u8) -> Result<(), Error> {          let temp_password_ptr = self.temp_password.as_ptr() as *const c_char;          unsafe { get_command_result(nitrokey_sys::NK_erase_totp_slot(slot, temp_password_ptr)) }      } @@ -366,7 +366,7 @@ impl<T: Device> AuthenticatedDevice<T> for Admin<T> {  }  impl Authenticate for DeviceWrapper { -    fn authenticate_user(self, password: &str) -> Result<User<Self>, (Self, CommandError)> { +    fn authenticate_user(self, password: &str) -> Result<User<Self>, (Self, Error)> {          match self {              DeviceWrapper::Storage(storage) => {                  authenticate_user_wrapper(storage, DeviceWrapper::Storage, password) @@ -375,7 +375,7 @@ impl Authenticate for DeviceWrapper {          }      } -    fn authenticate_admin(self, password: &str) -> Result<Admin<Self>, (Self, CommandError)> { +    fn authenticate_admin(self, password: &str) -> Result<Admin<Self>, (Self, Error)> {          match self {              DeviceWrapper::Storage(storage) => {                  authenticate_admin_wrapper(storage, DeviceWrapper::Storage, password) @@ -388,13 +388,13 @@ impl Authenticate for DeviceWrapper {  }  impl Authenticate for Pro { -    fn authenticate_user(self, password: &str) -> Result<User<Self>, (Self, CommandError)> { +    fn authenticate_user(self, password: &str) -> Result<User<Self>, (Self, Error)> {          authenticate(self, password, |password_ptr, temp_password_ptr| unsafe {              nitrokey_sys::NK_user_authenticate(password_ptr, temp_password_ptr)          })      } -    fn authenticate_admin(self, password: &str) -> Result<Admin<Self>, (Self, CommandError)> { +    fn authenticate_admin(self, password: &str) -> Result<Admin<Self>, (Self, Error)> {          authenticate(self, password, |password_ptr, temp_password_ptr| unsafe {              nitrokey_sys::NK_first_authenticate(password_ptr, temp_password_ptr)          }) @@ -402,13 +402,13 @@ impl Authenticate for Pro {  }  impl Authenticate for Storage { -    fn authenticate_user(self, password: &str) -> Result<User<Self>, (Self, CommandError)> { +    fn authenticate_user(self, password: &str) -> Result<User<Self>, (Self, Error)> {          authenticate(self, password, |password_ptr, temp_password_ptr| unsafe {              nitrokey_sys::NK_user_authenticate(password_ptr, temp_password_ptr)          })      } -    fn authenticate_admin(self, password: &str) -> Result<Admin<Self>, (Self, CommandError)> { +    fn authenticate_admin(self, password: &str) -> Result<Admin<Self>, (Self, Error)> {          authenticate(self, password, |password_ptr, temp_password_ptr| unsafe {              nitrokey_sys::NK_first_authenticate(password_ptr, temp_password_ptr)          }) diff --git a/src/config.rs b/src/config.rs index 277dc5e..741d67e 100644 --- a/src/config.rs +++ b/src/config.rs @@ -1,4 +1,4 @@ -use crate::error::CommandError; +use crate::error::{CommandError, Error};  /// The configuration for a Nitrokey.  #[derive(Clone, Copy, Debug, PartialEq)] @@ -35,13 +35,13 @@ fn config_otp_slot_to_option(value: u8) -> Option<u8> {      None  } -fn option_to_config_otp_slot(value: Option<u8>) -> Result<u8, CommandError> { +fn option_to_config_otp_slot(value: Option<u8>) -> Result<u8, Error> {      match value {          Some(value) => {              if value < 3 {                  Ok(value)              } else { -                Err(CommandError::InvalidSlot) +                Err(CommandError::InvalidSlot.into())              }          }          None => Ok(255), @@ -66,7 +66,7 @@ impl Config {  }  impl RawConfig { -    pub fn try_from(config: Config) -> Result<RawConfig, CommandError> { +    pub fn try_from(config: Config) -> Result<RawConfig, Error> {          Ok(RawConfig {              numlock: option_to_config_otp_slot(config.numlock)?,              capslock: option_to_config_otp_slot(config.capslock)?, diff --git a/src/device.rs b/src/device.rs index 603a986..ccd0597 100644 --- a/src/device.rs +++ b/src/device.rs @@ -5,7 +5,7 @@ use nitrokey_sys;  use crate::auth::Authenticate;  use crate::config::{Config, RawConfig}; -use crate::error::CommandError; +use crate::error::{CommandError, Error};  use crate::otp::GenerateOtp;  use crate::pws::GetPasswordSafe;  use crate::util::{get_command_result, get_cstring, get_last_error, result_from_string}; @@ -63,12 +63,12 @@ impl fmt::Display for VolumeMode {  ///  /// ```no_run  /// use nitrokey::{Authenticate, DeviceWrapper, User}; -/// # use nitrokey::CommandError; +/// # use nitrokey::Error;  ///  /// fn perform_user_task(device: &User<DeviceWrapper>) {}  /// fn perform_other_task(device: &DeviceWrapper) {}  /// -/// # fn try_main() -> Result<(), CommandError> { +/// # fn try_main() -> Result<(), Error> {  /// let device = nitrokey::connect()?;  /// let device = match device.authenticate_user("123456") {  ///     Ok(user) => { @@ -89,12 +89,12 @@ impl fmt::Display for VolumeMode {  ///  /// ```no_run  /// use nitrokey::{DeviceWrapper, Storage}; -/// # use nitrokey::CommandError; +/// # use nitrokey::Error;  ///  /// fn perform_common_task(device: &DeviceWrapper) {}  /// fn perform_storage_task(device: &Storage) {}  /// -/// # fn try_main() -> Result<(), CommandError> { +/// # fn try_main() -> Result<(), Error> {  /// let device = nitrokey::connect()?;  /// perform_common_task(&device);  /// match device { @@ -127,12 +127,12 @@ pub enum DeviceWrapper {  ///  /// ```no_run  /// use nitrokey::{Authenticate, User, Pro}; -/// # use nitrokey::CommandError; +/// # use nitrokey::Error;  ///  /// fn perform_user_task(device: &User<Pro>) {}  /// fn perform_other_task(device: &Pro) {}  /// -/// # fn try_main() -> Result<(), CommandError> { +/// # fn try_main() -> Result<(), Error> {  /// let device = nitrokey::Pro::connect()?;  /// let device = match device.authenticate_user("123456") {  ///     Ok(user) => { @@ -169,12 +169,12 @@ pub struct Pro {}  ///  /// ```no_run  /// use nitrokey::{Authenticate, User, Storage}; -/// # use nitrokey::CommandError; +/// # use nitrokey::Error;  ///  /// fn perform_user_task(device: &User<Storage>) {}  /// fn perform_other_task(device: &Storage) {}  /// -/// # fn try_main() -> Result<(), CommandError> { +/// # fn try_main() -> Result<(), Error> {  /// let device = nitrokey::Storage::connect()?;  /// let device = match device.authenticate_user("123456") {  ///     Ok(user) => { @@ -293,9 +293,9 @@ pub trait Device: Authenticate + GetPasswordSafe + GenerateOtp {      ///      /// ```no_run      /// use nitrokey::Device; -    /// # use nitrokey::CommandError; +    /// # use nitrokey::Error;      /// -    /// # fn try_main() -> Result<(), CommandError> { +    /// # fn try_main() -> Result<(), Error> {      /// let device = nitrokey::connect()?;      /// println!("Connected to a Nitrokey {}", device.get_model());      /// #    Ok(()) @@ -309,9 +309,9 @@ pub trait Device: Authenticate + GetPasswordSafe + GenerateOtp {      ///      /// ```no_run      /// use nitrokey::Device; -    /// # use nitrokey::CommandError; +    /// # use nitrokey::Error;      /// -    /// # fn try_main() -> Result<(), CommandError> { +    /// # fn try_main() -> Result<(), Error> {      /// let device = nitrokey::connect()?;      /// match device.get_serial_number() {      ///     Ok(number) => println!("serial no: {}", number), @@ -320,7 +320,7 @@ pub trait Device: Authenticate + GetPasswordSafe + GenerateOtp {      /// #     Ok(())      /// # }      /// ``` -    fn get_serial_number(&self) -> Result<String, CommandError> { +    fn get_serial_number(&self) -> Result<String, Error> {          unsafe { result_from_string(nitrokey_sys::NK_device_serial_number()) }      } @@ -331,9 +331,9 @@ pub trait Device: Authenticate + GetPasswordSafe + GenerateOtp {      ///      /// ```no_run      /// use nitrokey::Device; -    /// # use nitrokey::CommandError; +    /// # use nitrokey::Error;      /// -    /// # fn try_main() -> Result<(), CommandError> { +    /// # fn try_main() -> Result<(), Error> {      /// let device = nitrokey::connect()?;      /// let count = device.get_user_retry_count();      /// println!("{} remaining authentication attempts (user)", count); @@ -351,9 +351,9 @@ pub trait Device: Authenticate + GetPasswordSafe + GenerateOtp {      ///      /// ```no_run      /// use nitrokey::Device; -    /// # use nitrokey::CommandError; +    /// # use nitrokey::Error;      /// -    /// # fn try_main() -> Result<(), CommandError> { +    /// # fn try_main() -> Result<(), Error> {      /// let device = nitrokey::connect()?;      /// let count = device.get_admin_retry_count();      /// println!("{} remaining authentication attempts (admin)", count); @@ -370,9 +370,9 @@ pub trait Device: Authenticate + GetPasswordSafe + GenerateOtp {      ///      /// ```no_run      /// use nitrokey::Device; -    /// # use nitrokey::CommandError; +    /// # use nitrokey::Error;      /// -    /// # fn try_main() -> Result<(), CommandError> { +    /// # fn try_main() -> Result<(), Error> {      /// let device = nitrokey::connect()?;      /// println!(      ///     "Firmware version: {}.{}", @@ -392,9 +392,9 @@ pub trait Device: Authenticate + GetPasswordSafe + GenerateOtp {      ///      /// ```no_run      /// use nitrokey::Device; -    /// # use nitrokey::CommandError; +    /// # use nitrokey::Error;      /// -    /// # fn try_main() -> Result<(), CommandError> { +    /// # fn try_main() -> Result<(), Error> {      /// let device = nitrokey::connect()?;      /// println!(      ///     "Firmware version: {}.{}", @@ -413,9 +413,9 @@ pub trait Device: Authenticate + GetPasswordSafe + GenerateOtp {      ///      /// ```no_run      /// use nitrokey::Device; -    /// # use nitrokey::CommandError; +    /// # use nitrokey::Error;      /// -    /// # fn try_main() -> Result<(), CommandError> { +    /// # fn try_main() -> Result<(), Error> {      /// let device = nitrokey::connect()?;      /// let config = device.get_config()?;      /// println!("numlock binding:          {:?}", config.numlock); @@ -425,7 +425,7 @@ pub trait Device: Authenticate + GetPasswordSafe + GenerateOtp {      /// #     Ok(())      /// # }      /// ``` -    fn get_config(&self) -> Result<Config, CommandError> { +    fn get_config(&self) -> Result<Config, Error> {          unsafe {              let config_ptr = nitrokey_sys::NK_read_config();              if config_ptr.is_null() { @@ -449,9 +449,9 @@ pub trait Device: Authenticate + GetPasswordSafe + GenerateOtp {      ///      /// ```no_run      /// use nitrokey::Device; -    /// # use nitrokey::CommandError; +    /// # use nitrokey::Error;      /// -    /// # fn try_main() -> Result<(), CommandError> { +    /// # fn try_main() -> Result<(), Error> {      /// let device = nitrokey::connect()?;      /// match device.change_admin_pin("12345678", "12345679") {      ///     Ok(()) => println!("Updated admin PIN."), @@ -463,7 +463,7 @@ pub trait Device: Authenticate + GetPasswordSafe + GenerateOtp {      ///      /// [`InvalidString`]: enum.CommandError.html#variant.InvalidString      /// [`WrongPassword`]: enum.CommandError.html#variant.WrongPassword -    fn change_admin_pin(&self, current: &str, new: &str) -> Result<(), CommandError> { +    fn change_admin_pin(&self, current: &str, new: &str) -> Result<(), Error> {          let current_string = get_cstring(current)?;          let new_string = get_cstring(new)?;          unsafe { @@ -485,9 +485,9 @@ pub trait Device: Authenticate + GetPasswordSafe + GenerateOtp {      ///      /// ```no_run      /// use nitrokey::Device; -    /// # use nitrokey::CommandError; +    /// # use nitrokey::Error;      /// -    /// # fn try_main() -> Result<(), CommandError> { +    /// # fn try_main() -> Result<(), Error> {      /// let device = nitrokey::connect()?;      /// match device.change_user_pin("123456", "123457") {      ///     Ok(()) => println!("Updated admin PIN."), @@ -499,7 +499,7 @@ pub trait Device: Authenticate + GetPasswordSafe + GenerateOtp {      ///      /// [`InvalidString`]: enum.CommandError.html#variant.InvalidString      /// [`WrongPassword`]: enum.CommandError.html#variant.WrongPassword -    fn change_user_pin(&self, current: &str, new: &str) -> Result<(), CommandError> { +    fn change_user_pin(&self, current: &str, new: &str) -> Result<(), Error> {          let current_string = get_cstring(current)?;          let new_string = get_cstring(new)?;          unsafe { @@ -521,9 +521,9 @@ pub trait Device: Authenticate + GetPasswordSafe + GenerateOtp {      ///      /// ```no_run      /// use nitrokey::Device; -    /// # use nitrokey::CommandError; +    /// # use nitrokey::Error;      /// -    /// # fn try_main() -> Result<(), CommandError> { +    /// # fn try_main() -> Result<(), Error> {      /// let device = nitrokey::connect()?;      /// match device.unlock_user_pin("12345678", "123456") {      ///     Ok(()) => println!("Unlocked user PIN."), @@ -535,7 +535,7 @@ pub trait Device: Authenticate + GetPasswordSafe + GenerateOtp {      ///      /// [`InvalidString`]: enum.CommandError.html#variant.InvalidString      /// [`WrongPassword`]: enum.CommandError.html#variant.WrongPassword -    fn unlock_user_pin(&self, admin_pin: &str, user_pin: &str) -> Result<(), CommandError> { +    fn unlock_user_pin(&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)?;          unsafe { @@ -555,9 +555,9 @@ pub trait Device: Authenticate + GetPasswordSafe + GenerateOtp {      ///      /// ```no_run      /// use nitrokey::Device; -    /// # use nitrokey::CommandError; +    /// # use nitrokey::Error;      /// -    /// # fn try_main() -> Result<(), CommandError> { +    /// # fn try_main() -> Result<(), Error> {      /// let device = nitrokey::connect()?;      /// match device.lock() {      ///     Ok(()) => println!("Locked the Nitrokey device."), @@ -566,7 +566,7 @@ pub trait Device: Authenticate + GetPasswordSafe + GenerateOtp {      /// #     Ok(())      /// # }      /// ``` -    fn lock(&self) -> Result<(), CommandError> { +    fn lock(&self) -> Result<(), Error> {          unsafe { get_command_result(nitrokey_sys::NK_lock_device()) }      } @@ -586,9 +586,9 @@ pub trait Device: Authenticate + GetPasswordSafe + GenerateOtp {      ///      /// ```no_run      /// use nitrokey::Device; -    /// # use nitrokey::CommandError; +    /// # use nitrokey::Error;      /// -    /// # fn try_main() -> Result<(), CommandError> { +    /// # fn try_main() -> Result<(), Error> {      /// let device = nitrokey::connect()?;      /// match device.factory_reset("12345678") {      ///     Ok(()) => println!("Performed a factory reset."), @@ -599,7 +599,7 @@ pub trait Device: Authenticate + GetPasswordSafe + GenerateOtp {      /// ```      ///      /// [`build_aes_key`]: #method.build_aes_key -    fn factory_reset(&self, admin_pin: &str) -> Result<(), CommandError> { +    fn factory_reset(&self, admin_pin: &str) -> Result<(), Error> {          let admin_pin_string = get_cstring(admin_pin)?;          unsafe { get_command_result(nitrokey_sys::NK_factory_reset(admin_pin_string.as_ptr())) }      } @@ -620,9 +620,9 @@ pub trait Device: Authenticate + GetPasswordSafe + GenerateOtp {      ///      /// ```no_run      /// use nitrokey::Device; -    /// # use nitrokey::CommandError; +    /// # use nitrokey::Error;      /// -    /// # fn try_main() -> Result<(), CommandError> { +    /// # fn try_main() -> Result<(), Error> {      /// let device = nitrokey::connect()?;      /// match device.build_aes_key("12345678") {      ///     Ok(()) => println!("New AES keys have been built."), @@ -633,7 +633,7 @@ pub trait Device: Authenticate + GetPasswordSafe + GenerateOtp {      /// ```      ///      /// [`factory_reset`]: #method.factory_reset -    fn build_aes_key(&self, admin_pin: &str) -> Result<(), CommandError> { +    fn build_aes_key(&self, admin_pin: &str) -> Result<(), Error> {          let admin_pin_string = get_cstring(admin_pin)?;          unsafe { get_command_result(nitrokey_sys::NK_build_aes_key(admin_pin_string.as_ptr())) }      } @@ -660,14 +660,14 @@ pub trait Device: Authenticate + GetPasswordSafe + GenerateOtp {  /// ```  ///  /// [`Undefined`]: enum.CommandError.html#variant.Undefined -pub fn connect() -> Result<DeviceWrapper, CommandError> { +pub fn connect() -> Result<DeviceWrapper, Error> {      unsafe {          match nitrokey_sys::NK_login_auto() {              1 => match get_connected_device() {                  Some(wrapper) => Ok(wrapper), -                None => Err(CommandError::Undefined), +                None => Err(CommandError::Undefined.into()),              }, -            _ => Err(CommandError::Undefined), +            _ => Err(CommandError::Undefined.into()),          }      }  } @@ -693,11 +693,11 @@ pub fn connect() -> Result<DeviceWrapper, CommandError> {  /// ```  ///  /// [`Undefined`]: enum.CommandError.html#variant.Undefined -pub fn connect_model(model: Model) -> Result<DeviceWrapper, CommandError> { +pub fn connect_model(model: Model) -> Result<DeviceWrapper, Error> {      if connect_enum(model) {          Ok(create_device_wrapper(model))      } else { -        Err(CommandError::Undefined) +        Err(CommandError::Undefined.into())      }  } @@ -740,19 +740,19 @@ impl DeviceWrapper {  }  impl GenerateOtp for DeviceWrapper { -    fn get_hotp_slot_name(&self, slot: u8) -> Result<String, CommandError> { +    fn get_hotp_slot_name(&self, slot: u8) -> Result<String, Error> {          self.device().get_hotp_slot_name(slot)      } -    fn get_totp_slot_name(&self, slot: u8) -> Result<String, CommandError> { +    fn get_totp_slot_name(&self, slot: u8) -> Result<String, Error> {          self.device().get_totp_slot_name(slot)      } -    fn get_hotp_code(&self, slot: u8) -> Result<String, CommandError> { +    fn get_hotp_code(&self, slot: u8) -> Result<String, Error> {          self.device().get_hotp_code(slot)      } -    fn get_totp_code(&self, slot: u8) -> Result<String, CommandError> { +    fn get_totp_code(&self, slot: u8) -> Result<String, Error> {          self.device().get_totp_code(slot)      }  } @@ -787,11 +787,11 @@ impl Pro {      /// ```      ///      /// [`Undefined`]: enum.CommandError.html#variant.Undefined -    pub fn connect() -> Result<Pro, CommandError> { +    pub fn connect() -> Result<Pro, Error> {          // TODO: maybe Option instead of Result?          match connect_enum(Model::Pro) {              true => Ok(Pro {}), -            false => Err(CommandError::Undefined), +            false => Err(CommandError::Undefined.into()),          }      }  } @@ -833,11 +833,11 @@ impl Storage {      /// ```      ///      /// [`Undefined`]: enum.CommandError.html#variant.Undefined -    pub fn connect() -> Result<Storage, CommandError> { +    pub fn connect() -> Result<Storage, Error> {          // TODO: maybe Option instead of Result?          match connect_enum(Model::Storage) {              true => Ok(Storage {}), -            false => Err(CommandError::Undefined), +            false => Err(CommandError::Undefined.into()),          }      } @@ -855,9 +855,9 @@ impl Storage {      /// # Example      ///      /// ```no_run -    /// # use nitrokey::CommandError; +    /// # use nitrokey::Error;      /// -    /// # fn try_main() -> Result<(), CommandError> { +    /// # fn try_main() -> Result<(), Error> {      /// let device = nitrokey::Storage::connect()?;      /// match device.change_update_pin("12345678", "87654321") {      ///     Ok(()) => println!("Updated update PIN."), @@ -869,7 +869,7 @@ impl Storage {      ///      /// [`InvalidString`]: enum.CommandError.html#variant.InvalidString      /// [`WrongPassword`]: enum.CommandError.html#variant.WrongPassword -    pub fn change_update_pin(&self, current: &str, new: &str) -> Result<(), CommandError> { +    pub fn change_update_pin(&self, current: &str, new: &str) -> Result<(), Error> {          let current_string = get_cstring(current)?;          let new_string = get_cstring(new)?;          unsafe { @@ -895,9 +895,9 @@ impl Storage {      /// # Example      ///      /// ```no_run -    /// # use nitrokey::CommandError; +    /// # use nitrokey::Error;      /// -    /// # fn try_main() -> Result<(), CommandError> { +    /// # fn try_main() -> Result<(), Error> {      /// let device = nitrokey::Storage::connect()?;      /// match device.enable_firmware_update("12345678") {      ///     Ok(()) => println!("Nitrokey entered update mode."), @@ -909,7 +909,7 @@ impl Storage {      ///      /// [`InvalidString`]: enum.CommandError.html#variant.InvalidString      /// [`WrongPassword`]: enum.CommandError.html#variant.WrongPassword -    pub fn enable_firmware_update(&self, update_pin: &str) -> Result<(), CommandError> { +    pub fn enable_firmware_update(&self, update_pin: &str) -> Result<(), Error> {          let update_pin_string = get_cstring(update_pin)?;          unsafe {              get_command_result(nitrokey_sys::NK_enable_firmware_update( @@ -931,9 +931,9 @@ impl Storage {      /// # Example      ///      /// ```no_run -    /// # use nitrokey::CommandError; +    /// # use nitrokey::Error;      /// -    /// # fn try_main() -> Result<(), CommandError> { +    /// # fn try_main() -> Result<(), Error> {      /// let device = nitrokey::Storage::connect()?;      /// match device.enable_encrypted_volume("123456") {      ///     Ok(()) => println!("Enabled the encrypted volume."), @@ -945,7 +945,7 @@ impl Storage {      ///      /// [`InvalidString`]: enum.CommandError.html#variant.InvalidString      /// [`WrongPassword`]: enum.CommandError.html#variant.WrongPassword -    pub fn enable_encrypted_volume(&self, user_pin: &str) -> Result<(), CommandError> { +    pub fn enable_encrypted_volume(&self, user_pin: &str) -> Result<(), Error> {          let user_pin = get_cstring(user_pin)?;          unsafe { get_command_result(nitrokey_sys::NK_unlock_encrypted_volume(user_pin.as_ptr())) }      } @@ -958,11 +958,11 @@ impl Storage {      /// # Example      ///      /// ```no_run -    /// # use nitrokey::CommandError; +    /// # use nitrokey::Error;      ///      /// fn use_volume() {}      /// -    /// # fn try_main() -> Result<(), CommandError> { +    /// # fn try_main() -> Result<(), Error> {      /// let device = nitrokey::Storage::connect()?;      /// match device.enable_encrypted_volume("123456") {      ///     Ok(()) => { @@ -980,7 +980,7 @@ impl Storage {      /// #     Ok(())      /// # }      /// ``` -    pub fn disable_encrypted_volume(&self) -> Result<(), CommandError> { +    pub fn disable_encrypted_volume(&self) -> Result<(), Error> {          unsafe { get_command_result(nitrokey_sys::NK_lock_encrypted_volume()) }      } @@ -1006,9 +1006,9 @@ impl Storage {      /// # Example      ///      /// ```no_run -    /// # use nitrokey::CommandError; +    /// # use nitrokey::Error;      /// -    /// # fn try_main() -> Result<(), CommandError> { +    /// # fn try_main() -> Result<(), Error> {      /// let device = nitrokey::Storage::connect()?;      /// device.enable_encrypted_volume("123445")?;      /// match device.enable_hidden_volume("hidden-pw") { @@ -1022,7 +1022,7 @@ impl Storage {      /// [`enable_encrypted_volume`]: #method.enable_encrypted_volume      /// [`AesDecryptionFailed`]: enum.CommandError.html#variant.AesDecryptionFailed      /// [`InvalidString`]: enum.CommandError.html#variant.InvalidString -    pub fn enable_hidden_volume(&self, volume_password: &str) -> Result<(), CommandError> { +    pub fn enable_hidden_volume(&self, volume_password: &str) -> Result<(), Error> {          let volume_password = get_cstring(volume_password)?;          unsafe {              get_command_result(nitrokey_sys::NK_unlock_hidden_volume( @@ -1039,11 +1039,11 @@ impl Storage {      /// # Example      ///      /// ```no_run -    /// # use nitrokey::CommandError; +    /// # use nitrokey::Error;      ///      /// fn use_volume() {}      /// -    /// # fn try_main() -> Result<(), CommandError> { +    /// # fn try_main() -> Result<(), Error> {      /// let device = nitrokey::Storage::connect()?;      /// device.enable_encrypted_volume("123445")?;      /// match device.enable_hidden_volume("hidden-pw") { @@ -1062,7 +1062,7 @@ impl Storage {      /// #     Ok(())      /// # }      /// ``` -    pub fn disable_hidden_volume(&self) -> Result<(), CommandError> { +    pub fn disable_hidden_volume(&self) -> Result<(), Error> {          unsafe { get_command_result(nitrokey_sys::NK_lock_hidden_volume()) }      } @@ -1088,9 +1088,9 @@ impl Storage {      /// # Example      ///      /// ```no_run -    /// # use nitrokey::CommandError; +    /// # use nitrokey::Error;      /// -    /// # fn try_main() -> Result<(), CommandError> { +    /// # fn try_main() -> Result<(), Error> {      /// let device = nitrokey::Storage::connect()?;      /// device.enable_encrypted_volume("123445")?;      /// device.create_hidden_volume(0, 0, 100, "hidden-pw")?; @@ -1106,7 +1106,7 @@ impl Storage {          start: u8,          end: u8,          password: &str, -    ) -> Result<(), CommandError> { +    ) -> Result<(), Error> {          let password = get_cstring(password)?;          unsafe {              get_command_result(nitrokey_sys::NK_create_hidden_volume( @@ -1132,10 +1132,10 @@ impl Storage {      /// # Example      ///      /// ```no_run -    /// # use nitrokey::CommandError; +    /// # use nitrokey::Error;      /// use nitrokey::VolumeMode;      /// -    /// # fn try_main() -> Result<(), CommandError> { +    /// # fn try_main() -> Result<(), Error> {      /// let device = nitrokey::Storage::connect()?;      /// match device.set_unencrypted_volume_mode("123456", VolumeMode::ReadWrite) {      ///     Ok(()) => println!("Set the unencrypted volume to read-write mode."), @@ -1151,7 +1151,7 @@ impl Storage {          &self,          admin_pin: &str,          mode: VolumeMode, -    ) -> Result<(), CommandError> { +    ) -> Result<(), Error> {          let admin_pin = get_cstring(admin_pin)?;          let result = match mode {              VolumeMode::ReadOnly => unsafe { @@ -1169,11 +1169,11 @@ impl Storage {      /// # Example      ///      /// ```no_run -    /// # use nitrokey::CommandError; +    /// # use nitrokey::Error;      ///      /// fn use_volume() {}      /// -    /// # fn try_main() -> Result<(), CommandError> { +    /// # fn try_main() -> Result<(), Error> {      /// let device = nitrokey::Storage::connect()?;      /// match device.get_status() {      ///     Ok(status) => { @@ -1184,7 +1184,7 @@ impl Storage {      /// #     Ok(())      /// # }      /// ``` -    pub fn get_status(&self) -> Result<StorageStatus, CommandError> { +    pub fn get_status(&self) -> Result<StorageStatus, Error> {          let mut raw_status = nitrokey_sys::NK_storage_status {              unencrypted_volume_read_only: false,              unencrypted_volume_active: false, @@ -1213,11 +1213,11 @@ impl Storage {      /// # Example      ///      /// ```no_run -    /// # use nitrokey::CommandError; +    /// # use nitrokey::Error;      ///      /// fn use_volume() {}      /// -    /// # fn try_main() -> Result<(), CommandError> { +    /// # fn try_main() -> Result<(), Error> {      /// let device = nitrokey::Storage::connect()?;      /// match device.get_production_info() {      ///     Ok(data) => { @@ -1229,7 +1229,7 @@ impl Storage {      /// #     Ok(())      /// # }      /// ``` -    pub fn get_production_info(&self) -> Result<StorageProductionInfo, CommandError> { +    pub fn get_production_info(&self) -> Result<StorageProductionInfo, Error> {          let mut raw_data = nitrokey_sys::NK_storage_ProductionTest {              FirmwareVersion_au8: [0, 2],              FirmwareVersionInternal_u8: 0, @@ -1264,9 +1264,9 @@ impl Storage {      /// # Example      ///      /// ```no_run -    /// # use nitrokey::CommandError; +    /// # use nitrokey::Error;      /// -    /// # fn try_main() -> Result<(), CommandError> { +    /// # fn try_main() -> Result<(), Error> {      /// let device = nitrokey::Storage::connect()?;      /// match device.clear_new_sd_card_warning("12345678") {      ///     Ok(()) => println!("Cleared the new SD card warning."), @@ -1278,7 +1278,7 @@ impl Storage {      ///      /// [`InvalidString`]: enum.CommandError.html#variant.InvalidString      /// [`WrongPassword`]: enum.CommandError.html#variant.WrongPassword -    pub fn clear_new_sd_card_warning(&self, admin_pin: &str) -> Result<(), CommandError> { +    pub fn clear_new_sd_card_warning(&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()) @@ -1286,7 +1286,7 @@ impl Storage {      }      /// Blinks the red and green LED alternatively and infinitely until the device is reconnected. -    pub fn wink(&self) -> Result<(), CommandError> { +    pub fn wink(&self) -> Result<(), Error> {          get_command_result(unsafe { nitrokey_sys::NK_wink() })      } @@ -1306,7 +1306,7 @@ impl Storage {      ///      /// [`InvalidString`]: enum.CommandError.html#variant.InvalidString      /// [`WrongPassword`]: enum.CommandError.html#variant.WrongPassword -    pub fn export_firmware(&self, admin_pin: &str) -> Result<(), CommandError> { +    pub fn export_firmware(&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()) })      } diff --git a/src/error.rs b/src/error.rs index 89c4c82..3f60af2 100644 --- a/src/error.rs +++ b/src/error.rs @@ -9,6 +9,8 @@ use std::result;  pub enum Error {      /// An error reported by the Nitrokey device in the response packet.      CommandError(CommandError), +    /// Placeholder for testing. +    CommunicationError(CommunicationError),  }  impl From<CommandError> for Error { @@ -21,6 +23,7 @@ impl error::Error for Error {      fn source(&self) -> Option<&(dyn error::Error + 'static)> {          match *self {              Error::CommandError(ref err) => Some(err), +            Error::CommunicationError(_) => None,          }      }  } @@ -29,6 +32,7 @@ impl fmt::Display for Error {      fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {          match *self {              Error::CommandError(ref err) => write!(f, "Command error: {}", err), +            Error::CommunicationError(_) => write!(f, "Placeholder"),          }      }  } @@ -78,6 +82,13 @@ pub enum CommandError {      RngError,  } +/// Placeholder for testing. +#[derive(Debug)] +pub enum CommunicationError { +    /// Placeholder for testing. +    NotConnected, +} +  impl CommandError {      fn as_str(&self) -> borrow::Cow<'static, str> {          match *self { @@ -25,9 +25,9 @@  //!  //! ```no_run  //! use nitrokey::Device; -//! # use nitrokey::CommandError; +//! # use nitrokey::Error;  //! -//! # fn try_main() -> Result<(), CommandError> { +//! # fn try_main() -> Result<(), Error> {  //! let device = nitrokey::connect()?;  //! println!("{}", device.get_serial_number()?);  //! #     Ok(()) @@ -38,9 +38,9 @@  //!  //! ```no_run  //! use nitrokey::{Authenticate, ConfigureOtp, OtpMode, OtpSlotData}; -//! # use nitrokey::CommandError; +//! # use nitrokey::Error;  //! -//! # fn try_main() -> Result<(), (CommandError)> { +//! # fn try_main() -> Result<(), Error> {  //! let device = nitrokey::connect()?;  //! let slot_data = OtpSlotData::new(1, "test", "01234567890123456689", OtpMode::SixDigits);  //! match device.authenticate_admin("12345678") { @@ -60,9 +60,9 @@  //!  //! ```no_run  //! use nitrokey::{Device, GenerateOtp}; -//! # use nitrokey::CommandError; +//! # use nitrokey::Error;  //! -//! # fn try_main() -> Result<(), (CommandError)> { +//! # fn try_main() -> Result<(), Error> {  //! let device = nitrokey::connect()?;  //! match device.get_hotp_code(1) {  //!     Ok(code) => println!("Generated HOTP code: {}", code), @@ -104,7 +104,7 @@ pub use crate::device::{      connect, connect_model, Device, DeviceWrapper, Model, Pro, SdCardData, Storage,      StorageProductionInfo, StorageStatus, VolumeMode, VolumeStatus,  }; -pub use crate::error::{CommandError, Error, Result}; +pub use crate::error::{CommandError, CommunicationError, Error, Result};  pub use crate::otp::{ConfigureOtp, GenerateOtp, OtpMode, OtpSlotData};  pub use crate::pws::{GetPasswordSafe, PasswordSafe, SLOT_COUNT};  pub use crate::util::LogLevel; @@ -2,7 +2,7 @@ use std::ffi::CString;  use nitrokey_sys; -use crate::error::CommandError; +use crate::error::Error;  use crate::util::{get_command_result, get_cstring, result_from_string};  /// Modes for one-time password generation. @@ -29,9 +29,9 @@ pub trait ConfigureOtp {      ///      /// ```no_run      /// use nitrokey::{Authenticate, ConfigureOtp, OtpMode, OtpSlotData}; -    /// # use nitrokey::CommandError; +    /// # use nitrokey::Error;      /// -    /// # fn try_main() -> Result<(), (CommandError)> { +    /// # fn try_main() -> Result<(), Error> {      /// let device = nitrokey::connect()?;      /// let slot_data = OtpSlotData::new(1, "test", "01234567890123456689", OtpMode::SixDigits);      /// match device.authenticate_admin("12345678") { @@ -50,7 +50,7 @@ pub trait ConfigureOtp {      /// [`InvalidSlot`]: enum.CommandError.html#variant.InvalidSlot      /// [`InvalidString`]: enum.CommandError.html#variant.InvalidString      /// [`NoName`]: enum.CommandError.html#variant.NoName -    fn write_hotp_slot(&self, data: OtpSlotData, counter: u64) -> Result<(), CommandError>; +    fn write_hotp_slot(&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). @@ -65,9 +65,9 @@ pub trait ConfigureOtp {      ///      /// ```no_run      /// use nitrokey::{Authenticate, ConfigureOtp, OtpMode, OtpSlotData}; -    /// # use nitrokey::CommandError; +    /// # use nitrokey::Error;      /// -    /// # fn try_main() -> Result<(), (CommandError)> { +    /// # fn try_main() -> Result<(), Error> {      /// let device = nitrokey::connect()?;      /// let slot_data = OtpSlotData::new(1, "test", "01234567890123456689", OtpMode::EightDigits);      /// match device.authenticate_admin("12345678") { @@ -86,7 +86,7 @@ pub trait ConfigureOtp {      /// [`InvalidSlot`]: enum.CommandError.html#variant.InvalidSlot      /// [`InvalidString`]: enum.CommandError.html#variant.InvalidString      /// [`NoName`]: enum.CommandError.html#variant.NoName -    fn write_totp_slot(&self, data: OtpSlotData, time_window: u16) -> Result<(), CommandError>; +    fn write_totp_slot(&self, data: OtpSlotData, time_window: u16) -> Result<(), Error>;      /// Erases an HOTP slot.      /// @@ -98,9 +98,9 @@ pub trait ConfigureOtp {      ///      /// ```no_run      /// use nitrokey::{Authenticate, ConfigureOtp}; -    /// # use nitrokey::CommandError; +    /// # use nitrokey::Error;      /// -    /// # fn try_main() -> Result<(), (CommandError)> { +    /// # fn try_main() -> Result<(), Error> {      /// let device = nitrokey::connect()?;      /// match device.authenticate_admin("12345678") {      ///     Ok(admin) => { @@ -116,7 +116,7 @@ pub trait ConfigureOtp {      /// ```      ///      /// [`InvalidSlot`]: enum.CommandError.html#variant.InvalidSlot -    fn erase_hotp_slot(&self, slot: u8) -> Result<(), CommandError>; +    fn erase_hotp_slot(&self, slot: u8) -> Result<(), Error>;      /// Erases a TOTP slot.      /// @@ -128,9 +128,9 @@ pub trait ConfigureOtp {      ///      /// ```no_run      /// use nitrokey::{Authenticate, ConfigureOtp}; -    /// # use nitrokey::CommandError; +    /// # use nitrokey::Error;      /// -    /// # fn try_main() -> Result<(), (CommandError)> { +    /// # fn try_main() -> Result<(), Error> {      /// let device = nitrokey::connect()?;      /// match device.authenticate_admin("12345678") {      ///     Ok(admin) => { @@ -146,7 +146,7 @@ pub trait ConfigureOtp {      /// ```      ///      /// [`InvalidSlot`]: enum.CommandError.html#variant.InvalidSlot -    fn erase_totp_slot(&self, slot: u8) -> Result<(), CommandError>; +    fn erase_totp_slot(&self, slot: u8) -> Result<(), Error>;  }  /// Provides methods to generate OTP codes and to query OTP slots on a Nitrokey @@ -165,9 +165,9 @@ pub trait GenerateOtp {      /// ```no_run      /// use std::time;      /// use nitrokey::GenerateOtp; -    /// # use nitrokey::CommandError; +    /// # use nitrokey::Error;      /// -    /// # fn try_main() -> Result<(), CommandError> { +    /// # fn try_main() -> Result<(), Error> {      /// let device = nitrokey::connect()?;      /// let time = time::SystemTime::now().duration_since(time::UNIX_EPOCH);      /// match time { @@ -184,7 +184,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<(), CommandError> { +    fn set_time(&self, time: u64, force: bool) -> Result<(), Error> {          let result = if force {              unsafe { nitrokey_sys::NK_totp_set_time(time) }          } else { @@ -203,13 +203,13 @@ pub trait GenerateOtp {      /// # Example      ///      /// ```no_run -    /// use nitrokey::{CommandError, GenerateOtp}; +    /// use nitrokey::{CommandError, Error, GenerateOtp};      /// -    /// # fn try_main() -> Result<(), CommandError> { +    /// # fn try_main() -> Result<(), Error> {      /// let device = nitrokey::connect()?;      /// match device.get_hotp_slot_name(1) {      ///     Ok(name) => println!("HOTP slot 1: {}", name), -    ///     Err(CommandError::SlotNotProgrammed) => println!("HOTP slot 1 not programmed"), +    ///     Err(Error::CommandError(CommandError::SlotNotProgrammed)) => println!("HOTP slot 1 not programmed"),      ///     Err(err) => println!("Could not get slot name: {}", err),      /// };      /// #     Ok(()) @@ -218,7 +218,7 @@ pub trait GenerateOtp {      ///      /// [`InvalidSlot`]: enum.CommandError.html#variant.InvalidSlot      /// [`SlotNotProgrammed`]: enum.CommandError.html#variant.SlotNotProgrammed -    fn get_hotp_slot_name(&self, slot: u8) -> Result<String, CommandError> { +    fn get_hotp_slot_name(&self, slot: u8) -> Result<String, Error> {          unsafe { result_from_string(nitrokey_sys::NK_get_hotp_slot_name(slot)) }      } @@ -232,13 +232,13 @@ pub trait GenerateOtp {      /// # Example      ///      /// ```no_run -    /// use nitrokey::{CommandError, GenerateOtp}; +    /// use nitrokey::{CommandError, Error, GenerateOtp};      /// -    /// # fn try_main() -> Result<(), CommandError> { +    /// # fn try_main() -> Result<(), Error> {      /// let device = nitrokey::connect()?;      /// match device.get_totp_slot_name(1) {      ///     Ok(name) => println!("TOTP slot 1: {}", name), -    ///     Err(CommandError::SlotNotProgrammed) => println!("TOTP slot 1 not programmed"), +    ///     Err(Error::CommandError(CommandError::SlotNotProgrammed)) => println!("TOTP slot 1 not programmed"),      ///     Err(err) => println!("Could not get slot name: {}", err),      /// };      /// #     Ok(()) @@ -247,7 +247,7 @@ pub trait GenerateOtp {      ///      /// [`InvalidSlot`]: enum.CommandError.html#variant.InvalidSlot      /// [`SlotNotProgrammed`]: enum.CommandError.html#variant.SlotNotProgrammed -    fn get_totp_slot_name(&self, slot: u8) -> Result<String, CommandError> { +    fn get_totp_slot_name(&self, slot: u8) -> Result<String, Error> {          unsafe { result_from_string(nitrokey_sys::NK_get_totp_slot_name(slot)) }      } @@ -264,9 +264,9 @@ pub trait GenerateOtp {      ///      /// ```no_run      /// use nitrokey::GenerateOtp; -    /// # use nitrokey::CommandError; +    /// # use nitrokey::Error;      /// -    /// # fn try_main() -> Result<(), CommandError> { +    /// # fn try_main() -> Result<(), Error> {      /// let device = nitrokey::connect()?;      /// let code = device.get_hotp_code(1)?;      /// println!("Generated HOTP code on slot 1: {}", code); @@ -278,7 +278,7 @@ pub trait GenerateOtp {      /// [`InvalidSlot`]: enum.CommandError.html#variant.InvalidSlot      /// [`NotAuthorized`]: enum.CommandError.html#variant.NotAuthorized      /// [`SlotNotProgrammed`]: enum.CommandError.html#variant.SlotNotProgrammed -    fn get_hotp_code(&self, slot: u8) -> Result<String, CommandError> { +    fn get_hotp_code(&self, slot: u8) -> Result<String, Error> {          unsafe {              return result_from_string(nitrokey_sys::NK_get_hotp_code(slot));          } @@ -301,9 +301,9 @@ pub trait GenerateOtp {      /// ```no_run      /// use std::time;      /// use nitrokey::GenerateOtp; -    /// # use nitrokey::CommandError; +    /// # use nitrokey::Error;      /// -    /// # fn try_main() -> Result<(), CommandError> { +    /// # fn try_main() -> Result<(), Error> {      /// let device = nitrokey::connect()?;      /// let time = time::SystemTime::now().duration_since(time::UNIX_EPOCH);      /// match time { @@ -323,7 +323,7 @@ pub trait GenerateOtp {      /// [`InvalidSlot`]: enum.CommandError.html#variant.InvalidSlot      /// [`NotAuthorized`]: enum.CommandError.html#variant.NotAuthorized      /// [`SlotNotProgrammed`]: enum.CommandError.html#variant.SlotNotProgrammed -    fn get_totp_code(&self, slot: u8) -> Result<String, CommandError> { +    fn get_totp_code(&self, slot: u8) -> Result<String, Error> {          unsafe {              return result_from_string(nitrokey_sys::NK_get_totp_code(slot, 0, 0, 0));          } @@ -396,7 +396,7 @@ impl OtpSlotData {  }  impl RawOtpSlotData { -    pub fn new(data: OtpSlotData) -> Result<RawOtpSlotData, CommandError> { +    pub fn new(data: OtpSlotData) -> Result<RawOtpSlotData, Error> {          let name = get_cstring(data.name)?;          let secret = get_cstring(data.secret)?;          let use_token_id = data.token_id.is_some(); @@ -2,7 +2,7 @@ use libc;  use nitrokey_sys;  use crate::device::{Device, DeviceWrapper, Pro, Storage}; -use crate::error::CommandError; +use crate::error::{CommandError, Error};  use crate::util::{get_command_result, get_cstring, get_last_error, result_from_string};  /// The number of slots in a [`PasswordSafe`][]. @@ -29,9 +29,9 @@ pub const SLOT_COUNT: u8 = 16;  ///  /// ```no_run  /// use nitrokey::{Device, GetPasswordSafe, PasswordSafe}; -/// # use nitrokey::CommandError; +/// # use nitrokey::Error;  /// -/// fn use_password_safe(pws: &PasswordSafe) -> Result<(), CommandError> { +/// fn use_password_safe(pws: &PasswordSafe) -> Result<(), Error> {  ///     let name = pws.get_slot_name(0)?;  ///     let login = pws.get_slot_login(0)?;  ///     let password = pws.get_slot_login(0)?; @@ -39,7 +39,7 @@ pub const SLOT_COUNT: u8 = 16;  ///     Ok(())  /// }  /// -/// # fn try_main() -> Result<(), CommandError> { +/// # fn try_main() -> Result<(), Error> {  /// let device = nitrokey::connect()?;  /// let pws = device.get_password_safe("123456")?;  /// use_password_safe(&pws); @@ -88,11 +88,11 @@ pub trait GetPasswordSafe {      ///      /// ```no_run      /// use nitrokey::{Device, GetPasswordSafe, PasswordSafe}; -    /// # use nitrokey::CommandError; +    /// # use nitrokey::Error;      ///      /// fn use_password_safe(pws: &PasswordSafe) {}      /// -    /// # fn try_main() -> Result<(), CommandError> { +    /// # fn try_main() -> Result<(), Error> {      /// let device = nitrokey::connect()?;      /// match device.get_password_safe("123456") {      ///     Ok(pws) => { @@ -112,13 +112,13 @@ pub trait GetPasswordSafe {      /// [`InvalidString`]: enum.CommandError.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<'_>, CommandError>; +    fn get_password_safe(&self, user_pin: &str) -> Result<PasswordSafe<'_>, Error>;  }  fn get_password_safe<'a>(      device: &'a dyn Device,      user_pin: &str, -) -> Result<PasswordSafe<'a>, CommandError> { +) -> Result<PasswordSafe<'a>, Error> {      let user_pin_string = get_cstring(user_pin)?;      let result = unsafe {          get_command_result(nitrokey_sys::NK_enable_password_safe( @@ -128,9 +128,9 @@ fn get_password_safe<'a>(      result.map(|()| PasswordSafe { _device: device })  } -fn get_pws_result(s: String) -> Result<String, CommandError> { +fn get_pws_result(s: String) -> Result<String, Error> {      if s.is_empty() { -        Err(CommandError::SlotNotProgrammed) +        Err(CommandError::SlotNotProgrammed.into())      } else {          Ok(s)      } @@ -145,9 +145,9 @@ impl<'a> PasswordSafe<'a> {      ///      /// ```no_run      /// use nitrokey::{GetPasswordSafe, SLOT_COUNT}; -    /// # use nitrokey::CommandError; +    /// # use nitrokey::Error;      /// -    /// # fn try_main() -> Result<(), CommandError> { +    /// # fn try_main() -> Result<(), Error> {      /// let device = nitrokey::connect()?;      /// let pws = device.get_password_safe("123456")?;      /// pws.get_slot_status()?.iter().enumerate().for_each(|(slot, programmed)| { @@ -160,7 +160,7 @@ impl<'a> PasswordSafe<'a> {      /// #     Ok(())      /// # }      /// ``` -    pub fn get_slot_status(&self) -> Result<[bool; SLOT_COUNT as usize], CommandError> { +    pub fn get_slot_status(&self) -> Result<[bool; SLOT_COUNT as usize], Error> {          let status_ptr = unsafe { nitrokey_sys::NK_get_password_safe_slot_status() };          if status_ptr.is_null() {              return Err(get_last_error()); @@ -190,9 +190,9 @@ impl<'a> PasswordSafe<'a> {      ///      /// ```no_run      /// use nitrokey::GetPasswordSafe; -    /// # use nitrokey::CommandError; +    /// # use nitrokey::Error;      /// -    /// # fn try_main() -> Result<(), CommandError> { +    /// # fn try_main() -> Result<(), Error> {      /// let device = nitrokey::connect()?;      /// match device.get_password_safe("123456") {      ///     Ok(pws) => { @@ -209,7 +209,7 @@ impl<'a> PasswordSafe<'a> {      ///      /// [`InvalidSlot`]: enum.CommandError.html#variant.InvalidSlot      /// [`SlotNotProgrammed`]: enum.CommandError.html#variant.SlotNotProgrammed -    pub fn get_slot_name(&self, slot: u8) -> Result<String, CommandError> { +    pub fn get_slot_name(&self, slot: u8) -> Result<String, Error> {          unsafe { result_from_string(nitrokey_sys::NK_get_password_safe_slot_name(slot)) }              .and_then(get_pws_result)      } @@ -227,9 +227,9 @@ impl<'a> PasswordSafe<'a> {      ///      /// ```no_run      /// use nitrokey::GetPasswordSafe; -    /// # use nitrokey::CommandError; +    /// # use nitrokey::Error;      /// -    /// # fn try_main() -> Result<(), CommandError> { +    /// # fn try_main() -> Result<(), Error> {      /// let device = nitrokey::connect()?;      /// let pws = device.get_password_safe("123456")?;      /// let name = pws.get_slot_name(0)?; @@ -242,7 +242,7 @@ impl<'a> PasswordSafe<'a> {      ///      /// [`InvalidSlot`]: enum.CommandError.html#variant.InvalidSlot      /// [`SlotNotProgrammed`]: enum.CommandError.html#variant.SlotNotProgrammed -    pub fn get_slot_login(&self, slot: u8) -> Result<String, CommandError> { +    pub fn get_slot_login(&self, slot: u8) -> Result<String, Error> {          unsafe { result_from_string(nitrokey_sys::NK_get_password_safe_slot_login(slot)) }              .and_then(get_pws_result)      } @@ -260,9 +260,9 @@ impl<'a> PasswordSafe<'a> {      ///      /// ```no_run      /// use nitrokey::GetPasswordSafe; -    /// # use nitrokey::CommandError; +    /// # use nitrokey::Error;      /// -    /// # fn try_main() -> Result<(), CommandError> { +    /// # fn try_main() -> Result<(), Error> {      /// let device = nitrokey::connect()?;      /// let pws = device.get_password_safe("123456")?;      /// let name = pws.get_slot_name(0)?; @@ -275,7 +275,7 @@ impl<'a> PasswordSafe<'a> {      ///      /// [`InvalidSlot`]: enum.CommandError.html#variant.InvalidSlot      /// [`SlotNotProgrammed`]: enum.CommandError.html#variant.SlotNotProgrammed -    pub fn get_slot_password(&self, slot: u8) -> Result<String, CommandError> { +    pub fn get_slot_password(&self, slot: u8) -> Result<String, Error> {          unsafe { result_from_string(nitrokey_sys::NK_get_password_safe_slot_password(slot)) }              .and_then(get_pws_result)      } @@ -291,9 +291,9 @@ impl<'a> PasswordSafe<'a> {      ///      /// ```no_run      /// use nitrokey::GetPasswordSafe; -    /// # use nitrokey::CommandError; +    /// # use nitrokey::Error;      /// -    /// # fn try_main() -> Result<(), CommandError> { +    /// # fn try_main() -> Result<(), Error> {      /// let device = nitrokey::connect()?;      /// let pws = device.get_password_safe("123456")?;      /// let name = pws.get_slot_name(0)?; @@ -312,7 +312,7 @@ impl<'a> PasswordSafe<'a> {          name: &str,          login: &str,          password: &str, -    ) -> Result<(), CommandError> { +    ) -> Result<(), Error> {          let name_string = get_cstring(name)?;          let login_string = get_cstring(login)?;          let password_string = get_cstring(password)?; @@ -337,9 +337,9 @@ impl<'a> PasswordSafe<'a> {      ///      /// ```no_run      /// use nitrokey::GetPasswordSafe; -    /// # use nitrokey::CommandError; +    /// # use nitrokey::Error;      /// -    /// # fn try_main() -> Result<(), CommandError> { +    /// # fn try_main() -> Result<(), Error> {      /// let device = nitrokey::connect()?;      /// let pws = device.get_password_safe("123456")?;      /// match pws.erase_slot(0) { @@ -351,7 +351,7 @@ impl<'a> PasswordSafe<'a> {      /// ```      ///      /// [`InvalidSlot`]: enum.CommandError.html#variant.InvalidSlot -    pub fn erase_slot(&self, slot: u8) -> Result<(), CommandError> { +    pub fn erase_slot(&self, slot: u8) -> Result<(), Error> {          unsafe { get_command_result(nitrokey_sys::NK_erase_password_safe_slot(slot)) }      }  } @@ -364,19 +364,19 @@ impl<'a> Drop for PasswordSafe<'a> {  }  impl GetPasswordSafe for Pro { -    fn get_password_safe(&self, user_pin: &str) -> Result<PasswordSafe<'_>, CommandError> { +    fn get_password_safe(&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<'_>, CommandError> { +    fn get_password_safe(&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<'_>, CommandError> { +    fn get_password_safe(&self, user_pin: &str) -> Result<PasswordSafe<'_>, Error> {          get_password_safe(self, user_pin)      }  } diff --git a/src/util.rs b/src/util.rs index 88a381c..8855275 100644 --- a/src/util.rs +++ b/src/util.rs @@ -5,7 +5,7 @@ use libc::{c_void, free};  use rand_core::RngCore;  use rand_os::OsRng; -use crate::error::CommandError; +use crate::error::{CommandError, Error};  /// Log level for libnitrokey.  /// @@ -34,9 +34,9 @@ pub fn owned_str_from_ptr(ptr: *const c_char) -> String {      }  } -pub fn result_from_string(ptr: *const c_char) -> Result<String, CommandError> { +pub fn result_from_string(ptr: *const c_char) -> Result<String, Error> {      if ptr.is_null() { -        return Err(CommandError::Undefined); +        return Err(CommandError::Undefined.into());      }      unsafe {          let s = owned_str_from_ptr(ptr); @@ -51,34 +51,34 @@ pub fn result_from_string(ptr: *const c_char) -> Result<String, CommandError> {      }  } -pub fn get_command_result(value: c_int) -> Result<(), CommandError> { +pub fn get_command_result(value: c_int) -> Result<(), Error> {      match value {          0 => Ok(()), -        other => Err(CommandError::from(other)), +        other => Err(CommandError::from(other).into()),      }  } -pub fn get_last_result() -> Result<(), CommandError> { +pub fn get_last_result() -> Result<(), Error> {      let value = unsafe { nitrokey_sys::NK_get_last_command_status() } as c_int;      get_command_result(value)  } -pub fn get_last_error() -> CommandError { +pub fn get_last_error() -> Error {      return match get_last_result() { -        Ok(()) => CommandError::Undefined, +        Ok(()) => CommandError::Undefined.into(),          Err(err) => err,      };  } -pub fn generate_password(length: usize) -> Result<Vec<u8>, CommandError> { -    let mut rng = OsRng::new()?; +pub fn generate_password(length: usize) -> Result<Vec<u8>, Error> { +    let mut rng = OsRng::new().map_err(CommandError::from)?;      let mut data = vec![0u8; length];      rng.fill_bytes(&mut data[..]);      Ok(data)  } -pub fn get_cstring<T: Into<Vec<u8>>>(s: T) -> Result<CString, CommandError> { -    CString::new(s).or(Err(CommandError::InvalidString)) +pub fn get_cstring<T: Into<Vec<u8>>>(s: T) -> Result<CString, Error> { +    CString::new(s).or(Err(CommandError::InvalidString.into()))  }  impl Into<i32> for LogLevel {  | 
