diff options
| author | Szczepan Zalega <szczepan@nitrokey.com> | 2016-11-09 19:22:46 +0100 | 
|---|---|---|
| committer | Szczepan Zalega <szczepan@nitrokey.com> | 2016-12-03 16:01:49 +0100 | 
| commit | 2ba87abdb5c69e3d72b88164030ed5633986a63d (patch) | |
| tree | 306d12e51452ed53a09ad7132f19ded512d652f6 | |
| parent | b94d61b2f3c446c46ac2f660d954841d740782f5 (diff) | |
| download | libnitrokey-2ba87abdb5c69e3d72b88164030ed5633986a63d.tar.gz libnitrokey-2ba87abdb5c69e3d72b88164030ed5633986a63d.tar.bz2 | |
Convinient function for checking if authorization command is supported
Signed-off-by: Szczepan Zalega <szczepan@nitrokey.com>
| -rw-r--r-- | NitrokeyManager.cc | 16 | ||||
| -rw-r--r-- | include/NitrokeyManager.h | 4 | ||||
| -rw-r--r-- | include/device.h | 9 | 
3 files changed, 28 insertions, 1 deletions
| diff --git a/NitrokeyManager.cc b/NitrokeyManager.cc index 20f4f14..b254071 100644 --- a/NitrokeyManager.cc +++ b/NitrokeyManager.cc @@ -3,6 +3,7 @@  #include "include/NitrokeyManager.h"  #include "include/LibraryException.h"  #include <algorithm> +#include <unordered_map>  #include "include/misc.h"  namespace nitrokey{ @@ -35,7 +36,11 @@ namespace nitrokey{      // package type to auth, auth type [Authorize,UserAuthorize]      template <typename S, typename A, typename T> -    void authorize_packet(T &package, const char *admin_temporary_password, shared_ptr<Device> device){ +    void NitrokeyManager::authorize_packet(T &package, const char *admin_temporary_password, shared_ptr<Device> device){ +      if (!is_authorization_command_supported()){ +        Log::instance()("Authorization command not supported, skipping", Loglevel::WARNING); +        return; +      }          auto auth = get_payload<A>();          strcpyT(auth.temporary_password, admin_temporary_password);          auth.crc_to_authorize = S::CommandTransaction::getCRC(package); @@ -480,6 +485,15 @@ namespace nitrokey{          return v;      } +    bool NitrokeyManager::is_authorization_command_supported(){ +        auto m = std::unordered_map<DeviceModel , int, EnumClassHash>({ +                                                     {DeviceModel::PRO, 7}, +                                                     {DeviceModel::STORAGE, 43}, +         }); +      auto status_p = GetStatus::CommandTransaction::run(*device); +      return status_p.data().firmware_version <= m[device->get_device_model()]; +    } +      bool NitrokeyManager::is_AES_supported(const char *user_password) {          auto a = get_payload<IsAESSupported>();          strcpyT(a.user_password, user_password); diff --git a/include/NitrokeyManager.h b/include/NitrokeyManager.h index 60fa753..24a83ec 100644 --- a/include/NitrokeyManager.h +++ b/include/NitrokeyManager.h @@ -110,6 +110,10 @@ namespace nitrokey {          int get_progress_bar_value();          ~NitrokeyManager(); +        bool is_authorization_command_supported(); + +        template <typename S, typename A, typename T> +        void authorize_packet(T &package, const char *admin_temporary_password, shared_ptr<Device> device);      private:          NitrokeyManager(); diff --git a/include/device.h b/include/device.h index 3f18921..62c4073 100644 --- a/include/device.h +++ b/include/device.h @@ -12,6 +12,15 @@ namespace nitrokey {  namespace device {      using namespace std::chrono_literals; +    struct EnumClassHash +    { +        template <typename T> +        std::size_t operator()(T t) const +        { +          return static_cast<std::size_t>(t); +        } +    }; +  enum class DeviceModel{      PRO,      STORAGE | 
