diff options
| author | Szczepan Zalega <szczepan@nitrokey.com> | 2018-06-28 11:41:49 +0200 | 
|---|---|---|
| committer | Szczepan Zalega <szczepan@nitrokey.com> | 2018-06-28 11:41:49 +0200 | 
| commit | 494f5b3c285bf4b42c57e85f3b7b7e26620378e8 (patch) | |
| tree | 79b6f00c541d71a2488fbe48c619e57a99605fce | |
| parent | 5d4003a6053667ec4ef75a5b39e38cf3f305cbea (diff) | |
| parent | 9601681dd9aea8a87444d36711e0a908ad4ec7d2 (diff) | |
| download | libnitrokey-494f5b3c285bf4b42c57e85f3b7b7e26620378e8.tar.gz libnitrokey-494f5b3c285bf4b42c57e85f3b7b7e26620378e8.tar.bz2 | |
Merge branch 'production_info'
Handle command for getting production info
| -rw-r--r-- | NK_C_API.cc | 39 | ||||
| -rw-r--r-- | NK_C_API.h | 27 | ||||
| -rw-r--r-- | NitrokeyManager.cc | 5 | ||||
| -rw-r--r-- | libnitrokey/NitrokeyManager.h | 2 | 
4 files changed, 68 insertions, 5 deletions
| diff --git a/NK_C_API.cc b/NK_C_API.cc index 103f34d..1d9ff4f 100644 --- a/NK_C_API.cc +++ b/NK_C_API.cc @@ -631,7 +631,44 @@ extern "C" {  		return 0;  	} -	NK_C_API char* NK_get_SD_usage_data_as_string() { +  NK_C_API int NK_get_storage_production_info(NK_storage_ProductionTest * out){ +    if (out == nullptr) { +      return -1; +    } +    auto m = NitrokeyManager::instance(); +    auto result = get_with_status([&]() { +      return m->production_info(); +    }, proto::stick20::ProductionTest::ResponsePayload()); + +		auto error_code = std::get<0>(result); +		if (error_code != 0) { +			return error_code; +		} + +		stick20::ProductionTest::ResponsePayload status = std::get<1>(result); +		// Cannot use memcpy without declaring C API struct packed +    // (which is not parsed by Python's CFFI apparently), hence the manual way. +#define a(x) out->x = status.x; +		 a(FirmwareVersion_au8[0]); +		 a(FirmwareVersion_au8[1]); +		 a(FirmwareVersionInternal_u8); +		 a(SD_Card_Size_u8); +		 a(CPU_CardID_u32); +		 a(SmartCardID_u32); +		 a(SD_CardID_u32); +		 a(SC_UserPwRetryCount); +		 a(SC_AdminPwRetryCount); +		 a(SD_Card_ManufacturingYear_u8); +		 a(SD_Card_ManufacturingMonth_u8); +		 a(SD_Card_OEM_u16); +		 a(SD_WriteSpeed_u16); +		 a(SD_Card_Manufacturer_u8); +#undef a +		return 0; +  } + + +NK_C_API char* NK_get_SD_usage_data_as_string() {  		auto m = NitrokeyManager::instance();  		return get_with_string_result([&]() {  			return m->get_SD_usage_data_as_string(); @@ -122,10 +122,29 @@ extern "C" {  		bool stick_initialized;          }; -	/** -	 * Set debug level of messages written on stderr -	 * @param state state=True - most messages, state=False - only errors level -	 */ +   struct NK_storage_ProductionTest{ +    uint8_t FirmwareVersion_au8[2]; +    uint8_t FirmwareVersionInternal_u8; +    uint8_t SD_Card_Size_u8; +    uint32_t CPU_CardID_u32; +    uint32_t SmartCardID_u32; +    uint32_t SD_CardID_u32; +    uint8_t SC_UserPwRetryCount; +    uint8_t SC_AdminPwRetryCount; +    uint8_t SD_Card_ManufacturingYear_u8; +    uint8_t SD_Card_ManufacturingMonth_u8; +    uint16_t SD_Card_OEM_u16; +    uint16_t SD_WriteSpeed_u16; +    uint8_t SD_Card_Manufacturer_u8; +  }; + +  NK_C_API int NK_get_storage_production_info(struct NK_storage_ProductionTest * out); + + +/** + * Set debug level of messages written on stderr + * @param state state=True - most messages, state=False - only errors level + */  	NK_C_API void NK_set_debug(bool state);  	/** diff --git a/NitrokeyManager.cc b/NitrokeyManager.cc index 600193d..a950e4b 100644 --- a/NitrokeyManager.cc +++ b/NitrokeyManager.cc @@ -1141,4 +1141,9 @@ using nitrokey::misc::strcpyT;      stick20::Wink::CommandTransaction::run(device);    }; +  stick20::ProductionTest::ResponsePayload NitrokeyManager::production_info(){ +    auto data = stick20::ProductionTest::CommandTransaction::run(device); +    return data.data(); +  }; +  } diff --git a/libnitrokey/NitrokeyManager.h b/libnitrokey/NitrokeyManager.h index b48afc5..d6e5df4 100644 --- a/libnitrokey/NitrokeyManager.h +++ b/libnitrokey/NitrokeyManager.h @@ -293,6 +293,8 @@ char * strndup(const char* str, size_t maxlen);         * Blink red and green LED alternatively and infinitely (until device is reconnected).         */        void wink(); + +      stick20::ProductionTest::ResponsePayload production_info();      };  } | 
