aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--NK_C_API.cc9
-rw-r--r--NK_C_API.h6
-rw-r--r--NitrokeyManager.cc7
-rw-r--r--include/NitrokeyManager.h1
-rw-r--r--include/misc.h2
-rw-r--r--include/stick10_commands.h9
-rw-r--r--misc.cc8
-rw-r--r--unittest/test_bindings.py7
8 files changed, 42 insertions, 7 deletions
diff --git a/NK_C_API.cc b/NK_C_API.cc
index b755c70..6265215 100644
--- a/NK_C_API.cc
+++ b/NK_C_API.cc
@@ -175,6 +175,15 @@ extern const char * NK_status() {
});
}
+extern const char * NK_device_serial_number(){
+ auto m = NitrokeyManager::instance();
+ return get_with_string_result([&](){
+ string && s = m->get_serial_number();
+ char * rs = strdup(s.c_str());
+ clear_string(s);
+ return rs;
+ });
+}
extern uint32_t NK_get_hotp_code(uint8_t slot_number) {
return NK_get_hotp_code_PIN(slot_number, "");
diff --git a/NK_C_API.h b/NK_C_API.h
index 5960885..3c851a5 100644
--- a/NK_C_API.h
+++ b/NK_C_API.h
@@ -40,6 +40,12 @@ extern int NK_logout();
extern const char * NK_status();
/**
+ * Return the device's serial number string in hex.
+ * @return string device's serial number in hex
+ */
+extern const char * NK_device_serial_number();
+
+/**
* 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 161f7aa..5b648b5 100644
--- a/NitrokeyManager.cc
+++ b/NitrokeyManager.cc
@@ -88,6 +88,11 @@ namespace nitrokey{
}
}
+ string NitrokeyManager::get_serial_number() {
+ auto response = GetStatus::CommandTransaction::run(*device);
+ return response.data().get_card_serial_hex();
+ }
+
string NitrokeyManager::get_status() {
auto response = GetStatus::CommandTransaction::run(*device);
return response.data().dissect();
@@ -410,4 +415,4 @@ namespace nitrokey{
return true;
}
-} \ No newline at end of file
+}
diff --git a/include/NitrokeyManager.h b/include/NitrokeyManager.h
index d2ea991..1e518f4 100644
--- a/include/NitrokeyManager.h
+++ b/include/NitrokeyManager.h
@@ -40,6 +40,7 @@ namespace nitrokey {
bool disconnect();
void set_debug(bool state);
string get_status();
+ string get_serial_number();
const char * get_totp_slot_name(uint8_t slot_number);
const char * get_hotp_slot_name(uint8_t slot_number);
diff --git a/include/misc.h b/include/misc.h
index a5d9e6d..cccd830 100644
--- a/include/misc.h
+++ b/include/misc.h
@@ -15,7 +15,7 @@ typename T::CommandPayload get_payload(){
}
- std::string hexdump(const char *p, size_t size);
+ std::string hexdump(const char *p, size_t size, bool print_header=true);
uint32_t stm_crc32(const uint8_t *data, size_t size);
}
}
diff --git a/include/stick10_commands.h b/include/stick10_commands.h
index ef83747..a60be59 100644
--- a/include/stick10_commands.h
+++ b/include/stick10_commands.h
@@ -324,15 +324,20 @@ class GetStatus : Command<CommandID::GET_STATUS> {
};
bool isValid() const { return enable_user_password!=delete_user_password; }
+ std::string get_card_serial_hex() const {
+ return ::nitrokey::misc::hexdump((const char *)(card_serial),
+ sizeof card_serial, false);
+ }
+
std::string dissect() const {
std::stringstream ss;
ss << "firmware_version:\t" << firmware_version << std::endl;
ss << "card_serial:\t"
<< ::nitrokey::misc::hexdump((const char *)(card_serial),
- sizeof card_serial);
+ sizeof card_serial, false);
ss << "general_config:\t"
<< ::nitrokey::misc::hexdump((const char *)(general_config),
- sizeof general_config);
+ sizeof general_config, false);
ss << "numlock:\t" << (int)numlock << std::endl;
ss << "capslock:\t" << (int)capslock << std::endl;
ss << "scrolllock:\t" << (int)scrolllock << std::endl;
diff --git a/misc.cc b/misc.cc
index a31d9bc..d004d0f 100644
--- a/misc.cc
+++ b/misc.cc
@@ -6,14 +6,16 @@
namespace nitrokey {
namespace misc {
-std::string hexdump(const char *p, size_t size) {
+std::string hexdump(const char *p, size_t size, bool print_header) {
std::stringstream out;
char formatbuf[128];
const char *pstart = p;
for (const char *pend = p + size; p < pend;) {
- snprintf(formatbuf, 128, "%04lx\t", p - pstart);
- out << formatbuf;
+ if (print_header){
+ snprintf(formatbuf, 128, "%04lx\t", p - pstart);
+ out << formatbuf;
+ }
for (const char *le = p + 16; p < le && p < pend; p++) {
snprintf(formatbuf, 128, "%02x ", uint8_t(*p));
diff --git a/unittest/test_bindings.py b/unittest/test_bindings.py
index 2ffa046..eeda247 100644
--- a/unittest/test_bindings.py
+++ b/unittest/test_bindings.py
@@ -496,3 +496,10 @@ def test_get_status(C):
status = C.NK_status()
s = gs(status)
assert len(s) > 0
+
+
+def test_get_serial_number(C):
+ sn = C.NK_device_serial_number()
+ sn = gs(sn)
+ assert len(sn) > 0
+ print(('Serial number of the device: ', sn))