diff options
author | Szczepan Zalega <szczepan@nitrokey.com> | 2016-08-09 13:25:19 +0200 |
---|---|---|
committer | Szczepan Zalega <szczepan@nitrokey.com> | 2016-08-09 18:34:00 +0200 |
commit | bcfc7f44632717855ed75a3e643278a3ddee7309 (patch) | |
tree | badc4598f7fe5e42c37d214cc212563b12505992 | |
parent | 95a4b415b76ff94cd270dcc3c6a53efd8b152914 (diff) | |
download | libnitrokey-bcfc7f44632717855ed75a3e643278a3ddee7309.tar.gz libnitrokey-bcfc7f44632717855ed75a3e643278a3ddee7309.tar.bz2 |
Return a vector to C API to duplicate there
Signed-off-by: Szczepan Zalega <szczepan@nitrokey.com>
-rw-r--r-- | NK_C_API.cc | 21 | ||||
-rw-r--r-- | NitrokeyManager.cc | 12 | ||||
-rw-r--r-- | include/NitrokeyManager.h | 2 |
3 files changed, 15 insertions, 20 deletions
diff --git a/NK_C_API.cc b/NK_C_API.cc index 556ec65..577f2d6 100644 --- a/NK_C_API.cc +++ b/NK_C_API.cc @@ -5,9 +5,10 @@ using namespace nitrokey; static uint8_t NK_last_command_status = 0; template <typename T> -T* array_dup(std::vector<T>& v){ +T* duplicate_vector_and_clear(std::vector<T> &v){ auto d = new T[v.size()]; std::copy(v.begin(), v.end(), d); + std::fill(v.begin(), v.end(), 0); return d; } @@ -141,7 +142,7 @@ extern uint8_t* NK_read_config(){ auto m = NitrokeyManager::instance(); return get_with_array_result( [&](){ auto v = m->read_config(); - return array_dup(v); + return duplicate_vector_and_clear(v); }); } @@ -274,18 +275,12 @@ extern int NK_enable_password_safe(const char *user_pin){ }); } extern uint8_t * NK_get_password_safe_slot_status(){ - NK_last_command_status = 0; auto m = NitrokeyManager::instance(); - auto null_result = new uint8_t[16]; - memset(null_result, 0, 16); - try { - const auto slot_status = m->get_password_safe_slot_status(); - return slot_status; //TODO FIXME - } - catch (CommandFailedException & commandFailedException){ - NK_last_command_status = commandFailedException.last_command_status; - } - return null_result; + return get_with_array_result( [&](){ + auto slot_status = m->get_password_safe_slot_status(); + return duplicate_vector_and_clear(slot_status); + }); + } extern uint8_t NK_get_user_retry_count(){ diff --git a/NitrokeyManager.cc b/NitrokeyManager.cc index 14e31b2..4b7f591 100644 --- a/NitrokeyManager.cc +++ b/NitrokeyManager.cc @@ -282,12 +282,12 @@ namespace nitrokey{ EnablePasswordSafe::CommandTransaction::run(*device, p); } - uint8_t * NitrokeyManager::get_password_safe_slot_status() { - auto responsePayload = GetPasswordSafeSlotStatus::CommandTransaction::run(*device); //TODO FIXME - auto res = new uint8_t[16]; - memcpy(res, responsePayload.data().password_safe_status, 16*sizeof (uint8_t)); - //FIXME return vector<uint8_t> and do copy on C_API side - return res; + vector <uint8_t> NitrokeyManager::get_password_safe_slot_status() { + auto responsePayload = GetPasswordSafeSlotStatus::CommandTransaction::run(*device); + vector<uint8_t> v = vector<uint8_t>(responsePayload.data().password_safe_status, + responsePayload.data().password_safe_status + + sizeof(responsePayload.data().password_safe_status)); + return v; } uint8_t NitrokeyManager::get_user_retry_count() { diff --git a/include/NitrokeyManager.h b/include/NitrokeyManager.h index 19b54bd..d2ea991 100644 --- a/include/NitrokeyManager.h +++ b/include/NitrokeyManager.h @@ -49,7 +49,7 @@ namespace nitrokey { void enable_password_safe(const char *user_pin); - uint8_t * get_password_safe_slot_status(); + vector <uint8_t> get_password_safe_slot_status(); uint8_t get_admin_retry_count(); uint8_t get_user_retry_count(); |