diff options
author | Szczepan Zalega <szczepan@nitrokey.com> | 2020-06-13 18:50:34 +0200 |
---|---|---|
committer | Szczepan Zalega <szczepan@nitrokey.com> | 2020-06-13 18:50:34 +0200 |
commit | 8009c37af6198e712e458d0810fe5eae4b2f0ee6 (patch) | |
tree | 026dc64d014c78bf664834e74e16c760773f616e | |
parent | e0f58556806ecde0a1ea3f1b306cb039cab00fc5 (diff) | |
parent | fedf828e394938fb6f84407b4de7412a3fb6ec40 (diff) | |
download | libnitrokey-8009c37af6198e712e458d0810fe5eae4b2f0ee6.tar.gz libnitrokey-8009c37af6198e712e458d0810fe5eae4b2f0ee6.tar.bz2 |
Merge branch 'serial-number-u32'
Return serial number as uint32_t
Fixes #174
-rw-r--r-- | NK_C_API.cc | 7 | ||||
-rw-r--r-- | NK_C_API.h | 8 | ||||
-rw-r--r-- | NitrokeyManager.cc | 21 | ||||
-rw-r--r-- | libnitrokey/NitrokeyManager.h | 1 | ||||
-rw-r--r-- | unittest/test_offline.cc | 4 | ||||
-rw-r--r-- | unittest/test_pro.py | 9 |
6 files changed, 45 insertions, 5 deletions
diff --git a/NK_C_API.cc b/NK_C_API.cc index 75c8b97..ddf7bef 100644 --- a/NK_C_API.cc +++ b/NK_C_API.cc @@ -304,6 +304,13 @@ extern "C" { }); } + NK_C_API uint32_t NK_device_serial_number_as_u32() { + auto m = NitrokeyManager::instance(); + return get_with_result([&]() { + return m->get_serial_number_as_u32(); + }); + } + NK_C_API char * NK_get_hotp_code(uint8_t slot_number) { return NK_get_hotp_code_PIN(slot_number, ""); } @@ -393,6 +393,14 @@ extern "C" { NK_C_API char * NK_device_serial_number(); /** + * Return the device's serial number string as an integer. Use + * NK_last_command_status to check for an error if this function + * returns zero. + * @return device's serial number as an integer + */ + NK_C_API uint32_t NK_device_serial_number_as_u32(); + + /** * Get last command processing status. Useful for commands which returns the results of their own and could not return * an error code. * @return previous command processing error code diff --git a/NitrokeyManager.cc b/NitrokeyManager.cc index 71d156f..329d155 100644 --- a/NitrokeyManager.cc +++ b/NitrokeyManager.cc @@ -392,23 +392,36 @@ using nitrokey::misc::strcpyT; string NitrokeyManager::get_serial_number() { - if (device == nullptr) { return ""; }; + try { + auto serial_number = this->get_serial_number_as_u32(); + if (serial_number == 0) { + return "NA"; + } else { + return nitrokey::misc::toHex(serial_number); + } + } catch (DeviceNotConnected& e) { + return ""; + } + } + + uint32_t NitrokeyManager::get_serial_number_as_u32() { + if (device == nullptr) { throw DeviceNotConnected("device not connected"); } switch (device->get_device_model()) { case DeviceModel::LIBREM: case DeviceModel::PRO: { auto response = GetStatus::CommandTransaction::run(device); - return nitrokey::misc::toHex(response.data().card_serial_u32); + return response.data().card_serial_u32; } break; case DeviceModel::STORAGE: { auto response = stick20::GetDeviceStatus::CommandTransaction::run(device); - return nitrokey::misc::toHex(response.data().ActiveSmartCardID_u32); + return response.data().ActiveSmartCardID_u32; } break; } - return "NA"; + return 0; } stick10::GetStatus::ResponsePayload NitrokeyManager::get_status(){ diff --git a/libnitrokey/NitrokeyManager.h b/libnitrokey/NitrokeyManager.h index 33ede1b..163a799 100644 --- a/libnitrokey/NitrokeyManager.h +++ b/libnitrokey/NitrokeyManager.h @@ -104,6 +104,7 @@ char * strndup(const char* str, size_t maxlen); stick10::GetStatus::ResponsePayload get_status(); string get_status_as_string(); string get_serial_number(); + uint32_t get_serial_number_as_u32(); char * get_totp_slot_name(uint8_t slot_number); char * get_hotp_slot_name(uint8_t slot_number); diff --git a/unittest/test_offline.cc b/unittest/test_offline.cc index 320ad48..3ca3905 100644 --- a/unittest/test_offline.cc +++ b/unittest/test_offline.cc @@ -67,6 +67,10 @@ TEST_CASE("Test C++ side behaviour in offline", "[fast]") { REQUIRE(serial_number.empty()); REQUIRE_THROWS_AS( + i->get_serial_number_as_u32(), DeviceNotConnected + ); + + REQUIRE_THROWS_AS( i->get_status(), DeviceNotConnected ); diff --git a/unittest/test_pro.py b/unittest/test_pro.py index 99d7b1f..d25a50e 100644 --- a/unittest/test_pro.py +++ b/unittest/test_pro.py @@ -704,6 +704,13 @@ def test_get_serial_number(C): print(('Serial number of the device: ', sn)) +@pytest.mark.status +def test_get_serial_number_as_u32(C): + sn = C.NK_device_serial_number_as_u32() + assert sn > 0 + print(('Serial number of the device (u32): ', sn)) + + @pytest.mark.otp @pytest.mark.parametrize("secret", ['000001', '00'*10+'ff', '00'*19+'ff', '000102', '00'*29+'ff', '00'*39+'ff', '002EF43F51AFA97BA2B46418768123C9E1809A5B' ]) @@ -1038,4 +1045,4 @@ def test_OTP_all_rw(C): this_loop_codes.append(('H', i, code)) all_codes.append(this_loop_codes) from pprint import pprint - pprint(all_codes)
\ No newline at end of file + pprint(all_codes) |