summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSzczepan Zalega <szczepan@nitrokey.com>2017-03-09 18:49:24 +0100
committerSzczepan Zalega <szczepan@nitrokey.com>2017-03-11 15:41:45 +0100
commitadbc664125142c434294bfa795666c90c7608429 (patch)
tree15db66af5acd4422b5e66678dbe45a953b9dbdb0
parentc69604e8ba099b1421af86c34d904b0b380f996c (diff)
downloadlibnitrokey-adbc664125142c434294bfa795666c90c7608429.tar.gz
libnitrokey-adbc664125142c434294bfa795666c90c7608429.tar.bz2
Adjust for compilation on Visual Studio 2017
Building works however tests are not. Possibly linking with original hidapi solution would work.
-rw-r--r--.gitignore1
-rw-r--r--CMakeLists.txt4
-rw-r--r--CMakeSettings.json37
-rw-r--r--NK_C_API.cc4
-rw-r--r--NitrokeyManager.cc12
-rw-r--r--device.cc12
-rw-r--r--include/LibraryException.h2
-rw-r--r--include/command.h7
-rw-r--r--include/cxx_semantics.h4
-rw-r--r--include/device_proto.h8
-rw-r--r--include/misc.h2
-rw-r--r--include/stick10_commands.h8
-rw-r--r--include/stick20_commands.h5
-rw-r--r--misc.cc11
14 files changed, 89 insertions, 28 deletions
diff --git a/.gitignore b/.gitignore
index 47b7703..c98c3a9 100644
--- a/.gitignore
+++ b/.gitignore
@@ -7,3 +7,4 @@ core
.cache/
.idea/
CMakeFiles/
+/.vs
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 2b9f580..e77de6e 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -65,7 +65,7 @@ set(SOURCE_FILES
# add_library(hidapi-libusb STATIC hidapi/libusb/hid.c )
#ELSE()
include_directories(hidapi/hidapi)
- add_library(hidapi-libusb STATIC hidapi/windows/hid.c )
+ add_library(hidapi-libusb SHARED hidapi/windows/hid.c )
target_link_libraries(hidapi-libusb setupapi setupapi kernel32 user32 gdi32 winspool comdlg32 advapi32 shell32 ole32 oleaut32 uuid odbc32 odbccp32)
#ENDIF()
@@ -85,7 +85,7 @@ install (FILES ${LIB_INCLUDES} DESTINATION "include")
IF (COMPILE_TESTS)
include_directories(unittest/Catch/include)
- add_library(catch STATIC unittest/catch_main.cpp )
+ add_library(catch SHARED unittest/catch_main.cpp )
add_executable (test_C_API unittest/test_C_API.cpp)
target_link_libraries (test_C_API ${EXTRA_LIBS} ${LIBNAME} catch)
diff --git a/CMakeSettings.json b/CMakeSettings.json
new file mode 100644
index 0000000..e8c1f1d
--- /dev/null
+++ b/CMakeSettings.json
@@ -0,0 +1,37 @@
+{
+ // See https://go.microsoft.com//fwlink//?linkid=834763 for more information about this file.
+ "configurations": [
+ {
+ "name": "x86-Debug",
+ "generator": "Visual Studio 15 2017",
+ "configurationType" : "Debug",
+ "buildRoot": "${env.LOCALAPPDATA}\\CMakeBuild\\${workspaceHash}\\build\\${name}",
+ "cmakeCommandArgs": "",
+ "buildCommandArgs": "-m -v:minimal"
+ },
+ {
+ "name": "x86-Release",
+ "generator": "Visual Studio 15 2017",
+ "configurationType" : "Release",
+ "buildRoot": "${env.LOCALAPPDATA}\\CMakeBuild\\${workspaceHash}\\build\\${name}",
+ "cmakeCommandArgs": "",
+ "buildCommandArgs": "-m -v:minimal"
+ },
+ {
+ "name": "x64-Debug",
+ "generator": "Visual Studio 15 2017 Win64",
+ "configurationType" : "Debug",
+ "buildRoot": "${env.LOCALAPPDATA}\\CMakeBuild\\${workspaceHash}\\build\\${name}",
+ "cmakeCommandArgs": "",
+ "buildCommandArgs": "-m -v:minimal"
+ },
+ {
+ "name": "x64-Release",
+ "generator": "Visual Studio 15 2017 Win64",
+ "configurationType" : "Release",
+ "buildRoot": "${env.LOCALAPPDATA}\\CMakeBuild\\${workspaceHash}\\build\\${name}",
+ "cmakeCommandArgs": "",
+ "buildCommandArgs": "-m -v:minimal"
+ }
+ ]
+} \ No newline at end of file
diff --git a/NK_C_API.cc b/NK_C_API.cc
index 6d18e52..4e53cd1 100644
--- a/NK_C_API.cc
+++ b/NK_C_API.cc
@@ -169,7 +169,7 @@ extern const char * NK_status() {
auto m = NitrokeyManager::instance();
return get_with_string_result([&](){
string && s = m->get_status_as_string();
- char * rs = strdup(s.c_str());
+ char * rs = _strdup(s.c_str());
clear_string(s);
return rs;
});
@@ -179,7 +179,7 @@ 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());
+ char * rs = _strdup(s.c_str());
clear_string(s);
return rs;
});
diff --git a/NitrokeyManager.cc b/NitrokeyManager.cc
index 6ce9910..a120085 100644
--- a/NitrokeyManager.cc
+++ b/NitrokeyManager.cc
@@ -397,7 +397,7 @@ namespace nitrokey{
auto payload = get_payload<GetSlotName>();
payload.slot_number = slot_number;
auto resp = GetSlotName::CommandTransaction::run(device, payload);
- return strdup((const char *) resp.data().slot_name);
+ return _strdup((const char *) resp.data().slot_name);
}
bool NitrokeyManager::first_authenticate(const char *pin, const char *temporary_password) {
@@ -504,7 +504,7 @@ namespace nitrokey{
auto p = get_payload<GetPasswordSafeSlotName>();
p.slot_number = slot_number;
auto response = GetPasswordSafeSlotName::CommandTransaction::run(device, p);
- return strdup((const char *) response.data().slot_name);
+ return _strdup((const char *) response.data().slot_name);
}
bool NitrokeyManager::is_valid_password_safe_slot_number(uint8_t slot_number) const { return slot_number < 16; }
@@ -514,7 +514,7 @@ namespace nitrokey{
auto p = get_payload<GetPasswordSafeSlotLogin>();
p.slot_number = slot_number;
auto response = GetPasswordSafeSlotLogin::CommandTransaction::run(device, p);
- return strdup((const char *) response.data().slot_login);
+ return _strdup((const char *) response.data().slot_login);
}
const char *NitrokeyManager::get_password_safe_slot_password(uint8_t slot_number) {
@@ -522,7 +522,7 @@ namespace nitrokey{
auto p = get_payload<GetPasswordSafeSlotPassword>();
p.slot_number = slot_number;
auto response = GetPasswordSafeSlotPassword::CommandTransaction::run(device, p);
- return strdup((const char *) response.data().slot_password); //FIXME use secure way
+ return _strdup((const char *) response.data().slot_password); //FIXME use secure way
}
void NitrokeyManager::write_password_safe_slot(uint8_t slot_number, const char *slot_name, const char *slot_login,
@@ -724,7 +724,7 @@ namespace nitrokey{
const char * NitrokeyManager::get_status_storage_as_string(){
auto p = stick20::GetDeviceStatus::CommandTransaction::run(device);
- return strdup(p.data().dissect().c_str());
+ return _strdup(p.data().dissect().c_str());
}
stick20::DeviceConfigurationResponsePacket::ResponsePayload NitrokeyManager::get_status_storage(){
@@ -734,7 +734,7 @@ namespace nitrokey{
const char * NitrokeyManager::get_SD_usage_data_as_string(){
auto p = stick20::GetSDCardOccupancy::CommandTransaction::run(device);
- return strdup(p.data().dissect().c_str());
+ return _strdup(p.data().dissect().c_str());
}
int NitrokeyManager::get_progress_bar_value(){
diff --git a/device.cc b/device.cc
index d904fd9..0111572 100644
--- a/device.cc
+++ b/device.cc
@@ -2,7 +2,7 @@
#include <thread>
#include <cstddef>
#include <stdexcept>
-#include <hidapi/hidapi.h>
+#include "hidapi/hidapi.h"
#include "include/misc.h"
#include "include/device.h"
#include "include/log.h"
@@ -31,7 +31,7 @@ Device::Device(const uint16_t vid, const uint16_t pid, const DeviceModel model,
bool Device::disconnect() {
//called in object's destructor
- Log::instance()(__PRETTY_FUNCTION__, Loglevel::DEBUG_L2);
+ Log::instance()(__FUNCTION__, Loglevel::DEBUG_L2);
std::lock_guard<std::mutex> lock(mex_dev_com);
Log::instance()(std::string(__FUNCTION__) + std::string(m_model==DeviceModel::PRO?"PRO":"STORAGE"), Loglevel::DEBUG_L2);
Log::instance()(std::string(__FUNCTION__) + std::string(" *IN* "), Loglevel::DEBUG_L2);
@@ -45,7 +45,7 @@ bool Device::disconnect() {
return true;
}
bool Device::connect() {
- Log::instance()(__PRETTY_FUNCTION__, Loglevel::DEBUG_L2);
+ Log::instance()(__FUNCTION__, Loglevel::DEBUG_L2);
std::lock_guard<std::mutex> lock(mex_dev_com);
Log::instance()(std::string(__FUNCTION__) + std::string(" *IN* "), Loglevel::DEBUG_L2);
@@ -57,7 +57,7 @@ bool Device::connect() {
}
int Device::send(const void *packet) {
- Log::instance()(__PRETTY_FUNCTION__, Loglevel::DEBUG_L2);
+ Log::instance()(__FUNCTION__, Loglevel::DEBUG_L2);
std::lock_guard<std::mutex> lock(mex_dev_com);
Log::instance()(std::string(__FUNCTION__) + std::string(" *IN* "), Loglevel::DEBUG_L2);
@@ -71,7 +71,7 @@ int Device::send(const void *packet) {
}
int Device::recv(void *packet) {
- Log::instance()(__PRETTY_FUNCTION__, Loglevel::DEBUG_L2);
+ Log::instance()(__FUNCTION__, Loglevel::DEBUG_L2);
std::lock_guard<std::mutex> lock(mex_dev_com);
Log::instance()(std::string(__FUNCTION__) + std::string(" *IN* "), Loglevel::DEBUG_L2);
int status;
@@ -115,7 +115,7 @@ int Device::recv(void *packet) {
}
bool Device::is_connected() {
- Log::instance()(__PRETTY_FUNCTION__, Loglevel::DEBUG_L2);
+ Log::instance()(__FUNCTION__, Loglevel::DEBUG_L2);
std::lock_guard<std::mutex> lock(mex_dev_com);
if (mp_devhandle==nullptr){
return false;
diff --git a/include/LibraryException.h b/include/LibraryException.h
index e62788d..daf0155 100644
--- a/include/LibraryException.h
+++ b/include/LibraryException.h
@@ -27,7 +27,7 @@ public:
virtual const char *what() const throw() override {
std::string s = " ";
- auto ts = [](int x){ return std::to_string(x); };
+ auto ts = [](size_t x){ return std::to_string(x); };
std::string msg = std::string("Target buffer size is smaller than source: [source size, buffer size]")
+s+ ts(source_size) +s+ ts(target_size);
return msg.c_str();
diff --git a/include/command.h b/include/command.h
index 0a875e4..fc374f7 100644
--- a/include/command.h
+++ b/include/command.h
@@ -28,6 +28,7 @@ namespace stick20{
template<CommandID cmd_id, PasswordKind Tpassword_kind = PasswordKind::User, int password_length = 20>
class PasswordCommand : public Command<cmd_id> {
+ constexpr static CommandID _command_id() { return cmd_id; }
public:
struct CommandPayload {
uint8_t kind;
@@ -69,8 +70,10 @@ namespace stick20{
} __packed;
- typedef Transaction<Command<cmd_id>::command_id(), struct CommandPayload, struct EmptyPayload>
- CommandTransaction;
+ //typedef Transaction<Command<cmd_id>::command_id(), struct CommandPayload, struct EmptyPayload>
+ // CommandTransaction;
+ using CommandTransaction = Transaction<cmd_id, CommandPayload, EmptyPayload>;
+ //using CommandTransaction = Transaction<_command_id(), CommandPayload, EmptyPayload>;
};
}
diff --git a/include/cxx_semantics.h b/include/cxx_semantics.h
index b846317..29e51c3 100644
--- a/include/cxx_semantics.h
+++ b/include/cxx_semantics.h
@@ -1,7 +1,11 @@
#ifndef CXX_SEMANTICS_H
#define CXX_SEMANTICS_H
+#ifndef _WINDOWS
#define __packed __attribute__((__packed__))
+#else
+#define __packed
+#endif
/*
* There's no need to include Boost for a simple subset this project needs.
diff --git a/include/device_proto.h b/include/device_proto.h
index cbb74fb..1e381dd 100644
--- a/include/device_proto.h
+++ b/include/device_proto.h
@@ -6,7 +6,6 @@
#include <type_traits>
#include <stdexcept>
#include <string>
-#include <strings.h>
// a local version for compatibility with Windows
#include <stdint.h>
#include "cxx_semantics.h"
@@ -34,6 +33,7 @@
#include <mutex>
#include "DeviceCommunicationExceptions.h"
+#define bzero(b,len) (memset((b), '\0', (len)), (void) 0)
namespace nitrokey {
namespace proto {
@@ -43,7 +43,7 @@ namespace nitrokey {
*
* TODO (future) support for Big Endian
*/
-
+#pragma pack (push,1)
/*
* Every packet is a USB HID report (check USB spec)
*/
@@ -181,8 +181,10 @@ namespace nitrokey {
typedef command_payload CommandPayload;
typedef response_payload ResponsePayload;
+
typedef struct HIDReport<cmd_id, CommandPayload> OutgoingPacket;
typedef struct DeviceResponse<cmd_id, ResponsePayload> ResponsePacket;
+#pragma pack (pop)
static_assert(std::is_pod<OutgoingPacket>::value,
"outgoingpacket must be a pod type");
@@ -216,7 +218,7 @@ namespace nitrokey {
static std::mutex send_receive_mtx;
std::lock_guard<std::mutex> guard(send_receive_mtx);
- Log::instance()(__PRETTY_FUNCTION__, Loglevel::DEBUG_L2);
+ Log::instance()(__FUNCTION__, Loglevel::DEBUG_L2);
if (dev == nullptr){
throw DeviceNotConnected("Device not initialized");
diff --git a/include/misc.h b/include/misc.h
index 9e4659d..330654a 100644
--- a/include/misc.h
+++ b/include/misc.h
@@ -27,7 +27,7 @@ namespace misc {
strncpy((char*) &dest, src, s_dest);
}
-
+#define bzero(b,len) (memset((b), '\0', (len)), (void) 0)
template <typename T>
typename T::CommandPayload get_payload(){
//Create, initialize and return by value command payload
diff --git a/include/stick10_commands.h b/include/stick10_commands.h
index 8d37dbd..3d9e234 100644
--- a/include/stick10_commands.h
+++ b/include/stick10_commands.h
@@ -1,5 +1,6 @@
#ifndef STICK10_COMMANDS_H
#define STICK10_COMMANDS_H
+
#include <bitset>
#include <iomanip>
#include <string>
@@ -8,9 +9,13 @@
#include "command.h"
#include "device_proto.h"
+#pragma pack (push,1)
+
namespace nitrokey {
namespace proto {
+
+
/*
* Stick10 protocol definition
*/
@@ -844,8 +849,11 @@ class BuildAESKey : Command<CommandID::NEW_AES_KEY> {
typedef Transaction<command_id(), struct CommandPayload, struct EmptyPayload>
CommandTransaction;
+
};
+
}
}
}
+#pragma pack (pop)
#endif
diff --git a/include/stick20_commands.h b/include/stick20_commands.h
index b887636..e3bea3f 100644
--- a/include/stick20_commands.h
+++ b/include/stick20_commands.h
@@ -1,12 +1,15 @@
#ifndef STICK20_COMMANDS_H
#define STICK20_COMMANDS_H
+
+
#include <stdint.h>
#include "command.h"
#include <string>
#include <sstream>
#include "device_proto.h"
+#pragma pack (push,1)
namespace nitrokey {
namespace proto {
@@ -332,10 +335,12 @@ namespace nitrokey {
typedef Transaction<command_id(), struct EmptyPayload, struct ResponsePayload>
CommandTransaction;
};
+
}
}
}
#undef print_to_ss
+#pragma pack (pop)
#endif
diff --git a/misc.cc b/misc.cc
index a76bfb6..f85d486 100644
--- a/misc.cc
+++ b/misc.cc
@@ -5,18 +5,19 @@
#include <cstdlib>
#include <cstring>
#include "LibraryException.h"
+#include <vector>
namespace nitrokey {
namespace misc {
-std::vector<uint8_t> hex_string_to_byte(const char* hexString){
+::std::vector<uint8_t> hex_string_to_byte(const char* hexString){
const size_t big_string_size = 256; //arbitrary 'big' number
const size_t s_size = strlen(hexString);
const size_t d_size = s_size/2;
if (s_size%2!=0 || s_size>big_string_size){
throw InvalidHexString(0);
}
- auto data = std::vector<uint8_t>();
+ auto data = ::std::vector<uint8_t>();
data.reserve(d_size);
char buf[2];
@@ -36,9 +37,9 @@ std::vector<uint8_t> hex_string_to_byte(const char* hexString){
};
#include <cctype>
-std::string hexdump(const char *p, size_t size, bool print_header,
+::std::string hexdump(const char *p, size_t size, bool print_header,
bool print_ascii, bool print_empty) {
- std::stringstream out;
+ ::std::stringstream out;
char formatbuf[128];
const char *pstart = p;
@@ -68,7 +69,7 @@ std::string hexdump(const char *p, size_t size, bool print_header,
out << '.';
}
}
- out << std::endl;
+ out << ::std::endl;
}
return out.str();
}