From 8f4fb5d6320241a27d4d8c93d819daba40c58867 Mon Sep 17 00:00:00 2001 From: Szczepan Zalega Date: Mon, 25 Jul 2016 17:38:15 +0200 Subject: Handle changing user and admin PINs Signed-off-by: Szczepan Zalega --- NK_C_API.cc | 25 +++++++++++++++++++++++++ NK_C_API.h | 2 ++ NitrokeyManager.cc | 15 ++++++++++++++- include/NitrokeyManager.h | 4 ++++ include/stick10_commands.h | 12 ++++++++++++ 5 files changed, 57 insertions(+), 1 deletion(-) diff --git a/NK_C_API.cc b/NK_C_API.cc index 440e824..5571f0d 100644 --- a/NK_C_API.cc +++ b/NK_C_API.cc @@ -173,4 +173,29 @@ extern int NK_totp_get_time(){ return 0; } +extern int NK_change_admin_PIN(char *current_PIN, char *new_PIN){ + auto m = NitrokeyManager::instance(); + try { + m->change_admin_PIN(current_PIN, new_PIN); + } + catch (CommandFailedException & commandFailedException){ + NK_last_command_status = commandFailedException.last_command_status; + return commandFailedException.last_command_status; + } + return 0; +} + +extern int NK_change_user_PIN(char *current_PIN, char *new_PIN){ + auto m = NitrokeyManager::instance(); + try { + m->change_user_PIN(current_PIN, new_PIN); + } + catch (CommandFailedException & commandFailedException){ + NK_last_command_status = commandFailedException.last_command_status; + return commandFailedException.last_command_status; + } + return 0; +} + + } \ No newline at end of file diff --git a/NK_C_API.h b/NK_C_API.h index 0c91095..a692a26 100644 --- a/NK_C_API.h +++ b/NK_C_API.h @@ -23,6 +23,8 @@ extern uint32_t NK_get_totp_code(uint8_t slot_number, uint64_t challenge, uint64 extern int NK_totp_set_time(uint64_t time); extern int NK_totp_get_time(); extern uint8_t NK_get_last_command_status(); +extern int NK_change_admin_PIN(char *current_PIN, char *new_PIN); +extern int NK_change_user_PIN(char *current_PIN, char *new_PIN); } diff --git a/NitrokeyManager.cc b/NitrokeyManager.cc index 2a0033f..2b46927 100644 --- a/NitrokeyManager.cc +++ b/NitrokeyManager.cc @@ -176,7 +176,7 @@ namespace nitrokey{ bool NitrokeyManager::authorize(const char *pin, const char *temporary_password) { auto authreq = get_payload(); - assert(strlen(pin) < sizeof authreq.card_password); //160 bits + assert(strlen(pin) < sizeof authreq.card_password); assert(strlen(temporary_password) < sizeof authreq.temporary_password); strcpyT(authreq.card_password, pin); @@ -200,5 +200,18 @@ namespace nitrokey{ return false; } + void NitrokeyManager::change_user_PIN(char *current_PIN, char *new_PIN) { + auto p = get_payload(); + strcpyT(p.old_pin, current_PIN); + strcpyT(p.new_pin, new_PIN); + ChangeUserPin::CommandTransaction::run(*device, p); + } + void NitrokeyManager::change_admin_PIN(char *current_PIN, char *new_PIN) { + auto p = get_payload(); + strcpyT(p.old_pin, current_PIN); + strcpyT(p.new_pin, new_PIN); + ChangeAdminPin::CommandTransaction::run(*device, p); + } + } \ No newline at end of file diff --git a/include/NitrokeyManager.h b/include/NitrokeyManager.h index d4e19e7..a3399fa 100644 --- a/include/NitrokeyManager.h +++ b/include/NitrokeyManager.h @@ -37,6 +37,9 @@ namespace nitrokey { const char * get_totp_slot_name(uint8_t slot_number); const char * get_hotp_slot_name(uint8_t slot_number); + void change_user_PIN(char *current_PIN, char *new_PIN); + void change_admin_PIN(char *current_PIN, char *new_PIN); + private: NitrokeyManager(); ~NitrokeyManager(); @@ -51,6 +54,7 @@ namespace nitrokey { uint8_t get_internal_slot_number_for_totp(uint8_t slot_number) const; bool erase_slot(uint8_t slot_number); uint8_t *get_slot_name(uint8_t slot_number) const; + }; } diff --git a/include/stick10_commands.h b/include/stick10_commands.h index ca836db..d923d93 100644 --- a/include/stick10_commands.h +++ b/include/stick10_commands.h @@ -611,6 +611,12 @@ class ChangeUserPin : Command { struct CommandPayload { uint8_t old_pin[25]; uint8_t new_pin[25]; + std::string dissect() const { + std::stringstream ss; + ss << " old_pin:\t" << old_pin<< std::endl; + ss << " new_pin:\t" << new_pin<< std::endl; + return ss.str(); + } } __packed; typedef Transaction @@ -633,6 +639,12 @@ class ChangeAdminPin : Command { struct CommandPayload { uint8_t old_pin[25]; uint8_t new_pin[25]; + std::string dissect() const { + std::stringstream ss; + ss << " old_pin:\t" << old_pin<< std::endl; + ss << " new_pin:\t" << new_pin<< std::endl; + return ss.str(); + } } __packed; typedef Transaction -- cgit v1.2.3