diff options
| -rw-r--r-- | NK_C_API.cc | 28 | ||||
| -rw-r--r-- | NK_C_API.h | 1 | ||||
| -rw-r--r-- | NitrokeyManager.cc | 7 | ||||
| -rw-r--r-- | include/NitrokeyManager.h | 3 | ||||
| -rw-r--r-- | unittest/test_bindings.py | 18 | 
5 files changed, 56 insertions, 1 deletions
| diff --git a/NK_C_API.cc b/NK_C_API.cc index e5febe1..d93fafc 100644 --- a/NK_C_API.cc +++ b/NK_C_API.cc @@ -5,6 +5,24 @@ using namespace nitrokey;  static uint8_t NK_last_command_status = 0;  template <typename T> +T* array_dup(std::vector<T>& v){ +    auto d = new T[v.size()]; +    std::copy(v.begin(), v.end(), d); +    return d; +} + +template <typename T> +uint8_t * get_with_array_result(T func){ +    try { +        return func(); +    } +    catch (CommandFailedException & commandFailedException){ +        NK_last_command_status = commandFailedException.last_command_status; +        return nullptr; +    } +} + +template <typename T>  const char* get_with_string_result(T func){      try {          return func(); @@ -114,6 +132,16 @@ extern int NK_write_config(bool numlock, bool capslock, bool scrolllock, bool en      });  } + +extern uint8_t* NK_read_config(){ +    auto m = NitrokeyManager::instance(); +    return get_with_array_result( [&](){ +        auto v = m->read_config(); +        return array_dup(v); +    }); +} + +  extern const char * NK_status() {      auto m = NitrokeyManager::instance();      try { @@ -21,6 +21,7 @@ extern int NK_factory_reset(const char* admin_password);  extern int NK_build_aes_key(const char* admin_password);  extern int NK_unlock_user_password(const char* admin_password);  extern int NK_write_config(bool numlock, bool capslock, bool scrolllock, bool enable_user_password, bool delete_user_password, const char *admin_temporary_password); +extern uint8_t* NK_read_config();  //otp  extern const char * NK_get_totp_slot_name(uint8_t slot_number);  extern const char * NK_get_hotp_slot_name(uint8_t slot_number); diff --git a/NitrokeyManager.cc b/NitrokeyManager.cc index 53e355e..2e2ad3d 100644 --- a/NitrokeyManager.cc +++ b/NitrokeyManager.cc @@ -337,4 +337,11 @@ namespace nitrokey{          WriteGeneralConfig::CommandTransaction::run(*device, p);      } +    vector<uint8_t> NitrokeyManager::read_config() { +        auto responsePayload = GetStatus::CommandTransaction::run(*device); +        vector<uint8_t> v = vector<uint8_t>(responsePayload.general_config, +                                            responsePayload.general_config+sizeof(responsePayload.general_config)); +        return v; +    } +  }
\ No newline at end of file diff --git a/include/NitrokeyManager.h b/include/NitrokeyManager.h index 0f24b1f..a63b51f 100644 --- a/include/NitrokeyManager.h +++ b/include/NitrokeyManager.h @@ -5,6 +5,7 @@  #include "log.h"  #include "device_proto.h"  #include "stick10_commands.h" +#include <vector>  namespace nitrokey {      using namespace nitrokey::device; @@ -70,6 +71,8 @@ namespace nitrokey {          void write_config(bool numlock, bool capslock, bool scrolllock, bool enable_user_password,                            bool delete_user_password, const char *admin_temporary_password); +        vector<uint8_t> read_config(); +      private:          NitrokeyManager();          ~NitrokeyManager(); diff --git a/unittest/test_bindings.py b/unittest/test_bindings.py index 839b9c3..5606f2f 100644 --- a/unittest/test_bindings.py +++ b/unittest/test_bindings.py @@ -213,9 +213,25 @@ def test_get_code_user_authorize(C):      code = C.NK_get_totp_code(0, 0, 0, 0)      assert code == 0      assert C.NK_get_last_command_status() == DeviceErrorCode.STATUS_NOT_AUTHORIZED -    assert C.NK_first_authenticate(DefaultPasswords.ADMIN, DefaultPasswords.ADMIN_TEMP) == DeviceErrorCode.STATUS_OK      # disable PIN protection with write_config +    assert C.NK_first_authenticate(DefaultPasswords.ADMIN, DefaultPasswords.ADMIN_TEMP) == DeviceErrorCode.STATUS_OK      assert C.NK_write_config(True, True, True, False, True, DefaultPasswords.ADMIN_TEMP) == DeviceErrorCode.STATUS_OK      code = C.NK_get_totp_code(0, 0, 0, 0)      assert code != 0      assert C.NK_get_last_command_status() == DeviceErrorCode.STATUS_OK + + +def cast_pointer_to_tuple(obj, typen, len): +    # usage: +    #     config = cast_pointer_to_tuple(config_raw_data, 'uint8_t', 5) +    return tuple(ffi.cast("%s [%d]" % (typen, len), obj)[0:len]) + + +def test_read_write_config(C): +    C.NK_set_debug(True) +    assert C.NK_first_authenticate(DefaultPasswords.ADMIN, DefaultPasswords.ADMIN_TEMP) == DeviceErrorCode.STATUS_OK +    assert C.NK_write_config(True, True, True, False, True, DefaultPasswords.ADMIN_TEMP) == DeviceErrorCode.STATUS_OK +    config_raw_data = C.NK_read_config() +    config = cast_pointer_to_tuple(config_raw_data, 'uint8_t', 5) +    assert config == (True, True, True, False, True) + | 
