From f5106362b82b035dcd8e487d755316e886de3440 Mon Sep 17 00:00:00 2001
From: gcontini <1121667+gcontini@users.noreply.github.com>
Date: 周六, 23 11月 2019 22:48:18 +0800
Subject: [PATCH] signature verified, tests

---
 src/library/locate/ExternalDefinition.cpp     |    3 
 src/library/pc-identifiers.h                  |    5 
 src/library/limits/license_verifier.cpp       |  100 ++++
 src/library/limits/license_verifier.hpp       |   29 +
 test/functional/generate-license.cpp          |   86 ++
 src/library/locate/EnvironmentVarData.cpp     |    2 
 src/library/os/os.h                           |    2 
 src/library/os/os.c                           |   11 
 src/templates/licensecc_properties_test.h.in  |   16 
 CMakeLists.txt                                |   15 
 src/library/os/CMakeLists.txt                 |    7 
 src/library/pc-identifiers.c                  |  200 +++----
 test/functional/generate-license.h            |   14 
 test/functional/signature_verifier_test.cpp   |   46 +
 test/library/CMakeLists.txt                   |   14 
 src/library/base/EventRegistry.h              |   20 
 src/library/base/base.h                       |   34 
 test/functional/CMakeLists.txt                |   29 
 .travis.yml                                   |    1 
 test/functional/standard-license_test.cpp     |   78 +-
 src/library/os/openssl/signature_verifier.cpp |   14 
 test/functional/hijiaking_test.cpp            |    2 
 src/library/locate/LocatorFactory.hpp         |    2 
 cmake/Findlcc.cmake                           |    3 
 src/library/locate/ApplicationFolder.cpp      |    3 
 test/CMakeLists.txt                           |   12 
 src/templates/licensecc_properties.h.in       |    6 
 src/library/CMakeLists.txt                    |    6 
 test/functional/date_test.cpp                 |   21 
 src/library/base/EventRegistry.cpp            |   63 -
 test/library/LicenseReader_test.cpp           |    2 
 test/functional/volid_test.cpp                |   18 
 /dev/null                                     |   27 -
 src/library/LicenseReader.hpp                 |   44 -
 src/library/licensecc.cpp                     |   99 ++++
 src/library/os/windows/signature_verifier.cpp |    2 
 test/library/license_verifier_test.cpp        |   10 
 src/library/LicenseReader.cpp                 |  209 +-------
 src/CMakeLists.txt                            |   14 
 include/licensecc/datatypes.h                 |  132 +++++
 src/library/os/signature_verifier.h           |    8 
 include/licensecc/licensecc.h                 |    6 
 42 files changed, 834 insertions(+), 581 deletions(-)

diff --git a/.travis.yml b/.travis.yml
index 53a3cba..dde395e 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -94,6 +94,7 @@
              - mingw-w64-tools 
              - mingw-w64-x86-64-dev 
              - wine-development
+             - wine32-development
      before_script:
         - mkdir build
         - cd build
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 3f3bd3e..b58a488 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -29,7 +29,7 @@
 #find lcc executable or build it.
 find_package(lcc REQUIRED) 
 
-#Not sure about this. My system doesn't support binfmt misc
+#My system doesn't support binfmt misc
 IF( ( CMAKE_HOST_SYSTEM_NAME STREQUAL "Linux" ) AND CMAKE_CROSSCOMPILING AND NOT DEFINED CMAKE_CROSSCOMPILING_EMULATOR )
 	SET(CMAKE_CROSSCOMPILING_EMULATOR "wine")	
 ENDIF()
@@ -39,7 +39,7 @@
 	target_architecture( TARGET_ARCHITECTURE )
 	message(STATUS "architecture detected: ${TARGET_ARCHITECTURE}")
 	
-	#Boost > 3.15 handle the /MD flag more nicely than this
+	#cmake > 3.15 handle the /MD flag more nicely than this
 	if(${STATIC_RUNTIME})
 		string(REPLACE "/MD" "/MT" CMAKE_C_FLAGS_RELEASE "${CMAKE_C_FLAGS_RELEASE}")
 		string(REPLACE "/MD" "/MT" CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE}")
@@ -89,7 +89,7 @@
 	endif(NOT MINGW)
 endif(UNIX)
 
-
+#initialize project
 #load the current project from files or find it from environment variables or create a default one
 set(LCC_INCLUDE_DIR "${LCC_PROJECTS_BASE_DIR}/${LCC_PROJECT_NAME}/include/${PROJECT_NAME}/${LCC_PROJECT_NAME}" )
 set(LCC_PROJECT_PUBLIC_KEY "${LCC_INCLUDE_DIR}/public_key.h" )
@@ -101,10 +101,10 @@
   COMMENT "generating ${LCC_PROJECT_PUBLIC_KEY}"
   USES_TERMINAL
 )
-
 add_custom_target(project_initialize DEPENDS "${LCC_PROJECT_PUBLIC_KEY}" "${LCC_PROJECT_PRIVATE_KEY}")
 
-include_directories( ${LCC_INCLUDE_DIR} ${CMAKE_BINARY_DIR} )
+
+include_directories( ${LCC_INCLUDE_DIR} ${CMAKE_BINARY_DIR} "${CMAKE_CURRENT_SOURCE_DIR}/include")
 
 message( STATUS "C compiler        : " ${CMAKE_C_COMPILER})
 message( STATUS "C compiler flags  : " ${CMAKE_C_FLAGS})
@@ -133,7 +133,7 @@
 	    message(STATUS "Compiler architecture: ${CMAKE_CXX_COMPILER_ARCHITECTURE_ID}")
 endif()
 SET( Boost_USE_STATIC_LIBS ON )
-find_package(Boost REQUIRED COMPONENTS date_time unit_test_framework program_options system filesystem)
+find_package(Boost REQUIRED COMPONENTS unit_test_framework system filesystem)
 
 #if boost is found enable tests
 IF(Boost_FOUND)
@@ -141,9 +141,6 @@
 	IF(BUILD_TESTING)
 		SET(BUILDNAME "${BUILDNAME}" CACHE STRING "Name of build on the dashboard")
 		MARK_AS_ADVANCED(BUILDNAME)
-		add_definitions(-DBOOST_ALL_NO_LIB) #Disable Boost Microsoft magic, all dependencies are handled by cmake
-		add_definitions(-DBOOST_LIB_DIAGNOSTIC) #Check it is really disabled
-		include_directories(${Boost_INCLUDE_DIRS}) 
 		add_subdirectory(test)
 	ENDIF(BUILD_TESTING)
 ELSE(Boost_FOUND)
diff --git a/cmake/Findlcc.cmake b/cmake/Findlcc.cmake
index 728908c..48c02a4 100644
--- a/cmake/Findlcc.cmake
+++ b/cmake/Findlcc.cmake
@@ -49,7 +49,7 @@
 if(LCC_LOCATION)
 	# First search the PATH and specific locations.
 	find_program(LCC_EXECUTABLE
-	  NAMES ${lcc_names} HINTS ${LCC_LOCATION} DOC "lcc command line client")
+	NAMES ${lcc_names} HINTS ${LCC_LOCATION} DOC "lcc command line client")
 	FIND_PACKAGE_HANDLE_STANDARD_ARGS(lcc FOUND_VAR LCC_FOUND
                                        REQUIRED_VARS LCC_EXECUTABLE 
                                        FAIL_MESSAGE "Error finding lcc executable. variable LCC_LOCATION non set correctly.")
@@ -78,7 +78,6 @@
 		endif()
 		add_subdirectory("${PROJECT_SOURCE_DIR}/extern/license-generator")
 	ENDIF(NOT lcc_FOUND)
-	set(LCC_EXECUTABLE $<TARGET_FILE:license_generator::lcc>)
 ENDIF(LCC_LOCATION)
 
 
diff --git a/include/licensecc/datatypes.h b/include/licensecc/datatypes.h
new file mode 100644
index 0000000..b66543f
--- /dev/null
+++ b/include/licensecc/datatypes.h
@@ -0,0 +1,132 @@
+#ifndef DATATYPES_H_
+#define DATATYPES_H_
+
+#include <licensecc_properties.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+// definition of size_t
+#include <stdlib.h>
+#include <stdint.h>
+#ifndef _MSC_VER
+#include <stdbool.h>
+#endif
+
+#ifdef __unix__
+#define DllExport
+#ifndef MAX_PATH
+#define MAX_PATH 1024
+#endif
+#else
+#include <windows.h>
+#define DllExport __declspec(dllexport)
+#endif
+
+
+
+typedef enum {
+	LICENSE_OK = 0,  // OK
+	LICENSE_FILE_NOT_FOUND = 1,  // license file not found
+	LICENSE_SERVER_NOT_FOUND = 2,  // license server can't be contacted
+	ENVIRONMENT_VARIABLE_NOT_DEFINED = 3,  // environment variable not defined
+	FILE_FORMAT_NOT_RECOGNIZED = 4,  // license file has invalid format (not .ini file)
+	LICENSE_MALFORMED = 5,  // some mandatory field are missing, or data can't be fully read.
+	PRODUCT_NOT_LICENSED = 6,  // this product was not licensed
+	PRODUCT_EXPIRED = 7,
+	LICENSE_CORRUPTED = 8,  // License signature didn't match with current license
+	IDENTIFIERS_MISMATCH = 9,  // Calculated identifier and the one provided in license didn't match
+
+	LICENSE_SPECIFIED = 100,  // license location was specified
+	LICENSE_FOUND = 101,  // License file has been found or license data has been located
+	PRODUCT_FOUND = 102,  // License has been loaded and the declared product has been found
+	SIGNATURE_VERIFIED = 103
+} EVENT_TYPE;
+
+typedef enum {
+	LOCAL,
+	REMOTE  // remote licenses are not supported now.
+} LICENSE_TYPE;
+
+typedef enum { SVRT_INFO, SVRT_WARN, SVRT_ERROR } SEVERITY;
+
+typedef struct {
+	SEVERITY severity;
+	EVENT_TYPE event_type;
+	/**
+	 * License file name or location where the license is stored.
+	 */
+	char license_reference[MAX_PATH];
+	char param2[256];
+} AuditEvent;
+
+/**
+ * This structure contains informations on the raw license data. Software authors
+ * can specify the location of the license file or its full content.
+ *
+ * Can be NULL, in this case OpenLicenseManager will try to figure out the
+ * license file location on its own.
+ */
+typedef struct {
+	/**
+	 * A list of absolute path separated by ';' containing the eventual location
+	 * of the license files. Can be NULL.
+	 */
+	const char *licenseFileLocation;
+	/**
+	 * The application can provide the full license content through this string.
+	 * It can be both in encoded form (base64) or in plain. It's optional.
+	 */
+	const char *licenseData;
+} LicenseLocation;
+/**
+ * Informations on the software requiring the license
+ */
+typedef struct {
+	char version[16];  // software version in format xxxx.xxxx.xxxx
+	char project_name[16];  // name of the project (must correspond to the name in the license)
+	uint32_t magic;  // reserved
+} CallerInformations;
+typedef struct {
+	/**
+	 * Detailed reason of success/failure. Reasons for a failure can be
+	 * multiple (for instance, license expired and signature not verified).
+	 * Only the last AUDIT_EVENT_NUM are reported.
+	 */
+	AuditEvent status[AUDIT_EVENT_NUM];
+	/**
+	 * Eventual expiration date of the software,
+	 * can be '\0' if the software don't expire
+	 * */
+	char expiry_date[11];
+	unsigned int days_left;
+	bool has_expiry;
+	bool linked_to_pc;
+	LICENSE_TYPE license_type;  // Local or Remote
+	/* A string of character inserted into the license understood
+	 * by the calling application.
+	 * '\0' if the application didn't specify one */
+	char proprietary_data[PROPRIETARY_DATA_SIZE + 1];
+	int license_version;  // license file version
+} LicenseInfo;
+
+/**
+ * Enum to select a specific pc identification_strategy. DEFAULT Should be used
+ * in most cases.
+ */
+typedef enum {
+	DEFAULT,
+	ETHERNET,
+	IP_ADDRESS,
+	DISK_NUM,
+	DISK_LABEL,
+	PLATFORM_SPECIFIC,
+	STRATEGY_UNKNOWN
+} IDENTIFICATION_STRATEGY;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/src/library/api/license++.h b/include/licensecc/licensecc.h
similarity index 87%
rename from src/library/api/license++.h
rename to include/licensecc/licensecc.h
index ef1fbb6..be6f57d 100644
--- a/src/library/api/license++.h
+++ b/include/licensecc/licensecc.h
@@ -27,8 +27,6 @@
 /**
  * This method is used to request the use of one license for a product.
  * In case of local license it's used to check if the product is licensed.
- * [In case of network licenses this will decrease the count of the available
- *  licenses]
  *
  * @return LICENSE_OK(0) if successful. Other values if there are errors.
  * @param productName[in]
@@ -39,8 +37,8 @@
  * @param license[out] optional, can be NULL, if set it will return extra informations about the license.
  */
 
-EVENT_TYPE acquire_license(const char * productName,
-		const LicenseLocation* licenseLocation, LicenseInfo* license);
+EVENT_TYPE acquire_license(const CallerInformations* callerInformation, const LicenseLocation* licenseLocation,
+						   LicenseInfo* license_out);
 
 /**
  * Do nothing for now, useful for network licenses.
diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt
index 2cb7080..02e47aa 100644
--- a/src/CMakeLists.txt
+++ b/src/CMakeLists.txt
@@ -1,11 +1,7 @@
 add_subdirectory("library")
 
-
-configure_file (
-	"templates/licensecc_properties_test.h.in" 
-	"${CMAKE_BINARY_DIR}/licensecc_properties_test.h"
-)
-configure_file (
-	"templates/licensecc_properties.h.in" 
-	"${LCC_INCLUDE_DIR}/licensecc_properties.h"
-)
\ No newline at end of file
+#for no reason overwrite it (maybe it's manually customized)
+IF(NOT EXISTS "${LCC_INCLUDE_DIR}/licensecc_properties.h")
+	configure_file ("templates/licensecc_properties.h.in" 
+		"${LCC_INCLUDE_DIR}/licensecc_properties.h")
+ENDIF(NOT EXISTS "${LCC_INCLUDE_DIR}/licensecc_properties.h")
\ No newline at end of file
diff --git a/src/library/.gitignore b/src/library/.gitignore
deleted file mode 100644
index e9abf22..0000000
--- a/src/library/.gitignore
+++ /dev/null
@@ -1 +0,0 @@
-/Licensepp.h
diff --git a/src/library/CMakeLists.txt b/src/library/CMakeLists.txt
index 0589736..ad69712 100644
--- a/src/library/CMakeLists.txt
+++ b/src/library/CMakeLists.txt
@@ -1,18 +1,18 @@
 add_subdirectory("os")
 add_subdirectory("base")
-add_subdirectory("ini")
 add_subdirectory("locate")
 
 
 ADD_LIBRARY(licensecc_static STATIC
-    license++.cpp
+    licensecc.cpp
     LicenseReader.cpp
     pc-identifiers.c
+    limits/license_verifier.cpp
+    ini/ConvertUTF.c
 )
 
 target_link_libraries(
      licensecc_static
-     ini
      locators
      os
      base
diff --git a/src/library/LicenseReader.cpp b/src/library/LicenseReader.cpp
index 650ef25..0bb9262 100644
--- a/src/library/LicenseReader.cpp
+++ b/src/library/LicenseReader.cpp
@@ -6,9 +6,9 @@
  */
 
 #ifdef _WIN32
-# pragma warning(disable: 4786)
+#pragma warning(disable : 4786)
 #else
-# include <unistd.h>
+#include <unistd.h>
 #endif
 
 #include <cstring>
@@ -24,7 +24,9 @@
 
 #include <public_key.h>
 #include <licensecc_properties.h>
+#include <licensecc/licensecc.h>
 
+#include "base/base.h"
 #include "pc-identifiers.h"
 #include "LicenseReader.hpp"
 #include "base/StringUtils.h"
@@ -33,93 +35,17 @@
 
 namespace license {
 
-const char *FullLicenseInfo::UNUSED_TIME = "0000-00-00";
+FullLicenseInfo::FullLicenseInfo(const string &source, const string &product, const string &license_signature)
+	: source(source),
+	  m_project(product),  //
+	  license_signature(license_signature) {}
 
-FullLicenseInfo::FullLicenseInfo(const string &source, const string &product,
-		const string &license_signature, int licenseVersion, string from_date,
-		string to_date, const string &client_signature,
-		unsigned int from_sw_version, unsigned int to_sw_version,
-		const string &extra_data) :
-		source(source), product(product), //
-		license_signature(license_signature), license_version(licenseVersion), //
-		from_date(from_date), to_date(to_date), //
-		has_expiry(to_date != UNUSED_TIME), //
-		from_sw_version(from_sw_version), to_sw_version(to_sw_version), //
-		has_versions(
-				from_sw_version != UNUSED_SOFTWARE_VERSION
-						|| to_sw_version != UNUSED_SOFTWARE_VERSION), //
-		client_signature(client_signature), has_client_sig(
-				client_signature.length() > 0), //
-		extra_data(extra_data) {
-}
+LicenseReader::LicenseReader(const LicenseLocation *licenseLocation) : licenseLocation(licenseLocation) {}
 
-bool FullLicenseInfo::validate(int sw_version,
-		EventRegistry &eventRegistryOut) {
-	os_initialize();
-	const FUNCTION_RETURN sigVer = verifySignature(printForSign().c_str(),
-			license_signature.c_str());
-	bool is_valid = (sigVer == FUNC_RET_OK);
-	if (is_valid) {
-		eventRegistryOut.addEvent(SIGNATURE_VERIFIED, source);
-	} else {
-		eventRegistryOut.addEvent(LICENSE_CORRUPTED, source);
-	}
-	if (has_expiry) {
-		cout<<source<<endl;
-		const time_t now = time(nullptr);
-		if (expires_on() < now) {
-/*
-			eventRegistryOut.addEvent(PRODUCT_EXPIRED, source.c_str(),
-					string("Expired on: " + this->to_date).c_str());*/
-			eventRegistryOut.addEvent(PRODUCT_EXPIRED, source.c_str(),nullptr);
-			is_valid = false;
-		}
-		if (valid_from() > now) {
-			/*eventRegistryOut.addEvent(PRODUCT_EXPIRED, source.c_str(),
-					string("Valid from " + this->from_date).c_str());*/
-			eventRegistryOut.addEvent(PRODUCT_EXPIRED, source.c_str(),nullptr);
-			is_valid = false;
-		}
-	}
-	if (has_client_sig) {
-		PcSignature str_code;
-		strncpy(str_code, client_signature.c_str(), sizeof(str_code) - 1);
-		const EVENT_TYPE event = validate_pc_signature(str_code);
-		eventRegistryOut.addEvent(event, source);
-		is_valid = is_valid && (event == LICENSE_OK);
-	}
-	return is_valid;
-}
-
-void FullLicenseInfo::toLicenseInfo(LicenseInfo *license) const {
-	if (license != nullptr) {
-		strncpy(license->proprietary_data, extra_data.c_str(),
-		PROPRIETARY_DATA_SIZE);
-
-		license->linked_to_pc = has_client_sig;
-		license->has_expiry = has_expiry;
-		if (!has_expiry) {
-			license->expiry_date[0] = '\0';
-			license->days_left = 999999;
-		} else {
-			strncpy(license->expiry_date, to_date.c_str(), 11);
-			const double secs = difftime(seconds_from_epoch(to_date.c_str()),
-					time(nullptr));
-			license->days_left = round(secs / (60 * 60 * 24));
-		}
-	}
-}
-
-LicenseReader::LicenseReader(const LicenseLocation* licenseLocation) :
-		licenseLocation(licenseLocation) {
-}
-
-EventRegistry LicenseReader::readLicenses(const string &product,
-		vector<FullLicenseInfo> &licenseInfoOut) {
+EventRegistry LicenseReader::readLicenses(const string &product, vector<FullLicenseInfo> &licenseInfoOut) {
 	vector<string> diskFiles;
 	vector<unique_ptr<locate::LocatorStrategy>> locator_strategies;
-	FUNCTION_RETURN ret = locate::LocatorFactory::get_active_strategies(
-			locator_strategies, licenseLocation);
+	FUNCTION_RETURN ret = locate::LocatorFactory::get_active_strategies(locator_strategies, licenseLocation);
 	EventRegistry eventRegistry;
 	if (ret != FUNC_RET_OK) {
 		eventRegistry.addEvent(LICENSE_FILE_NOT_FOUND);
@@ -129,19 +55,17 @@
 
 	bool atLeastOneLicenseComplete = false;
 	for (unique_ptr<locate::LocatorStrategy> &locator : locator_strategies) {
-		vector<string> licenseLocations = locator->license_locations(
-				eventRegistry);
+		vector<string> licenseLocations = locator->license_locations(eventRegistry);
 		if (licenseLocations.size() == 0) {
 			continue;
 		}
 		CSimpleIniA ini;
-		for (auto it = licenseLocations.begin(); it != licenseLocations.end();
-				it++) {
+		for (auto it = licenseLocations.begin(); it != licenseLocations.end(); it++) {
 			ini.Reset();
 			string license = locator->retrieve_license_content((*it).c_str());
 			const SI_Error rc = ini.LoadData(license.c_str(), license.size());
 			if (rc < 0) {
-				eventRegistry.addEvent(FILE_FORMAT_NOT_RECOGNIZED, 	*it);
+				eventRegistry.addEvent(FILE_FORMAT_NOT_RECOGNIZED, *it);
 				continue;
 			}
 			const char *productNamePtr = product.c_str();
@@ -150,7 +74,7 @@
 				eventRegistry.addEvent(PRODUCT_NOT_LICENSED, *it);
 				continue;
 			} else {
-				eventRegistry.addEvent(PRODUCT_FOUND, 	*it);
+				eventRegistry.addEvent(PRODUCT_FOUND, *it);
 			}
 			/*
 			 *  sw_version_from = (optional int)
@@ -158,37 +82,18 @@
 			 *  from_date = YYYY-MM-DD (optional)
 			 *  to_date  = YYYY-MM-DD (optional)
 			 *  client_signature = XXXX-XXXX-XXXX-XXXX (optional string 16)
-			 *  license_signature = XXXXXXXXXX (mandatory, 1024)
+			 *  sig = XXXXXXXXXX (mandatory, 1024)
 			 *  application_data = xxxxxxxxx (optional string 16)
 			 */
-			const char *license_signature = ini.GetValue(productNamePtr,
-					"license_signature", nullptr);
-			long license_version = ini.GetLongValue(productNamePtr,
-					"license_version", -1);
-			if (license_signature != nullptr && license_version > 0) {
-				const string from_date = trim_copy(
-						ini.GetValue(productNamePtr, "from_date",
-								FullLicenseInfo::UNUSED_TIME));
-				const string to_date = trim_copy(
-						ini.GetValue(productNamePtr, "to_date",
-								FullLicenseInfo::UNUSED_TIME));
-				string client_signature = trim_copy(
-						ini.GetValue(productNamePtr, "client_signature", ""));
-				/*client_signature.erase(
-				 std::remove(client_signature.begin(), client_signature.end(), '-'),
-				 client_signature.end());*/
-				const int from_sw_version = ini.GetLongValue(productNamePtr,
-						"from_sw_version",
-						FullLicenseInfo::UNUSED_SOFTWARE_VERSION);
-				const int to_sw_version = ini.GetLongValue(productNamePtr,
-						"to_sw_version",
-						FullLicenseInfo::UNUSED_SOFTWARE_VERSION);
-				string extra_data = trim_copy(
-						ini.GetValue(productNamePtr, "extra_data", ""));
-				FullLicenseInfo licInfo(*it, product, license_signature,
-						(int) license_version, from_date, to_date,
-						client_signature, from_sw_version, to_sw_version,
-						extra_data);
+			const char *license_signature = ini.GetValue(productNamePtr, "sig", nullptr);
+			long license_version = ini.GetLongValue(productNamePtr, "lic_ver", -1);
+			if (license_signature != nullptr && license_version == 200) {
+				CSimpleIniA::TNamesDepend keys;
+				ini.GetAllKeys(productNamePtr, keys);
+				FullLicenseInfo licInfo(*it, product, license_signature);
+				for (auto &it : keys) {
+					licInfo.m_limits[it.pItem] = ini.GetValue(productNamePtr, it.pItem, nullptr);
+				}
 				licenseInfoOut.push_back(licInfo);
 				atLeastOneLicenseComplete = true;
 			} else {
@@ -202,69 +107,21 @@
 	return eventRegistry;
 }
 
-LicenseReader::~LicenseReader() {
-}
+LicenseReader::~LicenseReader() {}
 
 string FullLicenseInfo::printForSign() const {
 	ostringstream oss;
-	oss << toupper_copy(trim_copy(this->product));
-	//oss << SHARED_RANDOM;
-	if (has_client_sig) {
-		oss << trim_copy(this->client_signature);
+	oss << toupper_copy(trim_copy(m_project));
+	for (auto &it : m_limits) {
+		if (it.first != LICENSE_VERSION && it.first != LICENSE_SIGNATURE) {
+			oss << trim_copy(it.first) << trim_copy(it.second);
+		}
 	}
-	if (has_versions) {
-		oss << "|" << this->from_sw_version << "-" << this->to_sw_version;
-	}
-	if (has_expiry) {
-		oss << "|" << this->from_date << "|" << this->to_date;
-	}
-	if (this->extra_data.length() > 0) {
-		oss << "|" << extra_data;
-	}
+
 #ifdef _DEBUG
 	cout << "[" << oss.str() << "]" << endl;
 #endif
 	return oss.str();
-
 }
 
-void FullLicenseInfo::printAsIni(ostream &a_ostream) const {
-	CSimpleIniA ini;
-	string result;
-	const string product = toupper_copy(trim_copy(this->product));
-	CSimpleIniA::StreamWriter sw(a_ostream);
-	ini.SetLongValue(product.c_str(), "license_version",
-	PROJECT_INT_VERSION);
-	ini.SetValue(product.c_str(), "license_signature",
-			this->license_signature.c_str());
-	if (has_client_sig) {
-		ini.SetValue(product.c_str(), "client_signature",
-				this->client_signature.c_str());
-	}
-	if (has_versions) {
-		ini.SetLongValue(product.c_str(), "from_sw_version", from_sw_version);
-		ini.SetLongValue(product.c_str(), "to_sw_version", to_sw_version);
-	}
-
-	if (this->from_date != UNUSED_TIME) {
-		ini.SetValue(product.c_str(), "from_date", from_date.c_str());
-	}
-	if (this->to_date != UNUSED_TIME) {
-		ini.SetValue(product.c_str(), "to_date", to_date.c_str());
-	}
-	if (this->extra_data.length() > 0) {
-		ini.SetValue(product.c_str(), "extra_data", this->extra_data.c_str());
-	}
-	ini.Save(sw);
-}
-
-time_t FullLicenseInfo::expires_on() const {
-	return seconds_from_epoch(this->to_date.c_str());
-}
-
-time_t FullLicenseInfo::valid_from() const {
-	return seconds_from_epoch(this->from_date.c_str());
-}
-
-}
-
+}  // namespace license
diff --git a/src/library/LicenseReader.hpp b/src/library/LicenseReader.hpp
index 661bd05..de3bfa0 100644
--- a/src/library/LicenseReader.hpp
+++ b/src/library/LicenseReader.hpp
@@ -11,7 +11,8 @@
 #include <ctime>
 
 #define SI_SUPPORT_IOSTREAMS
-#include "api/datatypes.h"
+#include <licensecc/datatypes.h>
+
 #include "base/EventRegistry.h"
 #include "os/os.h"
 #include "ini/SimpleIni.h"
@@ -20,37 +21,14 @@
 
 class FullLicenseInfo {
 public:
-	std::string source;
-	std::string product;
-	std::string license_signature;
-	int license_version;
-	std::string from_date;
-	std::string to_date;
-	bool has_expiry;
-	unsigned int from_sw_version;
-	unsigned int to_sw_version;
-	bool has_versions;
-	std::string client_signature;
-	bool has_client_sig;
-	std::string extra_data;
+	const std::string license_signature;
+	const std::string source;
+	const std::string m_project;
+	std::map<std::string, std::string> m_limits;
 
-	static const char* UNUSED_TIME;
-	static const unsigned int UNUSED_SOFTWARE_VERSION = 0;
-
-	FullLicenseInfo(const std::string& source, const std::string& product,
-			const std::string& license_signature, int licenseVersion,
-			std::string from_date = UNUSED_TIME,
-			std::string to_date = UNUSED_TIME, //
-			const std::string& client_signature = "", //
-			unsigned int from_sw_version = UNUSED_SOFTWARE_VERSION,
-			unsigned int to_sw_version = UNUSED_SOFTWARE_VERSION,
-			const std::string& extra_data = "");
+	FullLicenseInfo(const std::string& source, const std::string& product, const std::string& license_signature);
 	std::string printForSign() const;
-	void printAsIni(std::ostream & a_ostream) const;
-	void toLicenseInfo(LicenseInfo* license) const;
-	bool validate(int sw_version, EventRegistry& eventRegistryOut);
-	time_t expires_on() const;
-	time_t valid_from() const;
+	operator LicenseInfo() const;
 };
 
 /**
@@ -74,11 +52,11 @@
 class LicenseReader {
 private:
 	const LicenseLocation* licenseLocation;
+
 public:
 	LicenseReader(const LicenseLocation* licenseLocation);
-	EventRegistry readLicenses(const std::string &product,
-			std::vector<FullLicenseInfo>& licenseInfoOut);
+	EventRegistry readLicenses(const std::string& product, std::vector<FullLicenseInfo>& licenseInfoOut);
 	virtual ~LicenseReader();
 };
-}
+}  // namespace license
 #endif /* LICENSEREADER_H_ */
diff --git a/src/library/api/datatypes.h b/src/library/api/datatypes.h
deleted file mode 100644
index 439f477..0000000
--- a/src/library/api/datatypes.h
+++ /dev/null
@@ -1,128 +0,0 @@
-#ifndef DATATYPES_H_
-#define DATATYPES_H_
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-//definition of size_t
-#include <stdlib.h>
-#ifndef _MSC_VER
-#include <stdbool.h>
-#endif
-
-#ifdef __unix__
-#define DllExport
-#ifndef MAX_PATH
-	#define MAX_PATH 1024
-#endif
-#else
-#include <windows.h>
-#define DllExport  __declspec( dllexport )
-#endif
-
-
-#define PC_IDENTIFIER_SIZE 18
-#define PROPRIETARY_DATA_SIZE 16
-#define AUDIT_EVENT_NUM 5
-
-#define LICENESE_INT_VERSION 110
-#define LICENSEPP_VERSION "1.1.0"
-
-typedef enum {
-	LICENSE_OK = 0, 					//OK
-	LICENSE_FILE_NOT_FOUND = 1, 		//license file not found
-	LICENSE_SERVER_NOT_FOUND = 2, 		//license server can't be contacted
-	ENVIRONMENT_VARIABLE_NOT_DEFINED = 3, //environment variable not defined
-	FILE_FORMAT_NOT_RECOGNIZED = 4,		 //license file has invalid format (not .ini file)
-	LICENSE_MALFORMED = 5,			//some mandatory field are missing, or data can't be fully read.
-	PRODUCT_NOT_LICENSED = 6,		//this product was not licensed
-	PRODUCT_EXPIRED = 7,
-	LICENSE_CORRUPTED = 8,		//License signature didn't match with current license
-	IDENTIFIERS_MISMATCH = 9,   //Calculated identifier and the one provided in license didn't match
-
-	LICENSE_SPECIFIED = 100,	//license location was specified
-	LICENSE_FOUND = 101, 		//License file has been found or license data has been located
-	PRODUCT_FOUND = 102,		//License has been loaded and the declared product has been found
-	SIGNATURE_VERIFIED = 103
-
-} EVENT_TYPE;
-
-typedef enum {
-	LOCAL, REMOTE //remote licenses are not supported now.
-} LICENSE_TYPE;
-
-typedef enum {
-	SVRT_INFO, SVRT_WARN, SVRT_ERROR
-} SEVERITY;
-
-typedef struct {
-	SEVERITY severity;
-	EVENT_TYPE event_type;
-	/**
-	 * License file name or location where the license is stored.
-	 */
-	char license_reference[MAX_PATH];
-	char param2[256];
-} AuditEvent;
-
-/**
- * This structure contains informations on the raw license data. Software authors
- * can specify the location of the license file or its full content.
- *
- * Can be NULL, in this case OpenLicenseManager will try to figure out the
- * license file location on its own.
- */
-typedef struct {
-	/**
-	 * A list of absolute path separated by ';' containing the eventual location
-	 * of the license files. Can be NULL.
-	 */
-	const char *licenseFileLocation;
-	/**
-	 * The application can provide the full license content through this string.
-	 * It can be both in encoded form (base64) or in plain. It's optional.
-	 */
-	const char *licenseData;
-} LicenseLocation;
-
-typedef struct {
-	/**
-	 * Detailed reason of success/failure. Reasons for a failure can be
-	 * multiple (for instance, license expired and signature not verified).
-	 * Only the last AUDIT_EVENT_NUM are reported.
-	 */
-	AuditEvent status[AUDIT_EVENT_NUM];
-	/**
-	 * Eventual expiration date of the software,
-	 * can be '\0' if the software don't expire
-	 * */
-	char expiry_date[11];
-	unsigned int days_left;bool has_expiry;bool linked_to_pc;
-	LICENSE_TYPE license_type; // Local or Remote
-	/* A string of character inserted into the license understood
-	 * by the calling application.
-	 * '\0' if the application didn't specify one */
-	char proprietary_data[PROPRIETARY_DATA_SIZE + 1];
-	int license_version; //license file version
-} LicenseInfo;
-
-/**
- * Enum to select a specific pc identification_strategy. DEFAULT Should be used
- * in most cases.
- */
-typedef enum {
-	DEFAULT,
-	ETHERNET,
-	IP_ADDRESS,
-	DISK_NUM,
-	DISK_LABEL,
-	PLATFORM_SPECIFIC,
-	STRATEGY_UNKNOWN
-} IDENTIFICATION_STRATEGY;
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif
diff --git a/src/library/base/EventRegistry.cpp b/src/library/base/EventRegistry.cpp
index ec9d4c1..920e735 100644
--- a/src/library/base/EventRegistry.cpp
+++ b/src/library/base/EventRegistry.cpp
@@ -17,50 +17,42 @@
 namespace license {
 using namespace std;
 
-const map<EVENT_TYPE, int> PROGRESS_BY_EVENT_TYPE = { { LICENSE_SPECIFIED, 0 },
-		{ LICENSE_FOUND, 1 }, { PRODUCT_FOUND, 2 }, { SIGNATURE_VERIFIED, 3 }, {
-				LICENSE_OK, 4 } };
+const map<EVENT_TYPE, int> PROGRESS_BY_EVENT_TYPE = {
+	{LICENSE_SPECIFIED, 0}, {LICENSE_FOUND, 1}, {PRODUCT_FOUND, 2}, {SIGNATURE_VERIFIED, 3}, {LICENSE_OK, 4}};
 
-EventRegistry::EventRegistry() {
-	current_validation_step = -1;
-}
+EventRegistry::EventRegistry() { current_validation_step = -1; }
 
-EventRegistry& operator<<(EventRegistry &eventRegistry,
-		AuditEvent &securityEvent) {
+EventRegistry &operator<<(EventRegistry &eventRegistry, AuditEvent &securityEvent) {
 	eventRegistry.logs.push_back(securityEvent);
 	return eventRegistry;
 }
 
-EventRegistry& operator<<(EventRegistry &eventRegistry1,
-		EventRegistry &otherRegistry) {
+EventRegistry &operator<<(EventRegistry &eventRegistry1, EventRegistry &otherRegistry) {
 	eventRegistry1.append(otherRegistry);
 	return eventRegistry1;
 }
 
-ostream& operator<<(std::ostream &out, const EventRegistry &er) {
-	out << string("EventReg[step:") << er.current_validation_step
-			<< ",events:{";
+ostream &operator<<(std::ostream &out, const EventRegistry &er) {
+	out << string("EventReg[step:") << er.current_validation_step << ",events:{";
 	for (auto &it : er.logs) {
-		out << "[ev:" << it.event_type << ",sev:" << it.severity << "ref:"
-				<< it.license_reference << "]";
+		out << "[ev:" << it.event_type << ",sev:" << it.severity << "ref:" << it.license_reference << "]";
 	}
 	out << "]";
 	return out;
 }
 
 void EventRegistry::append(const EventRegistry &eventRegistry) {
-	logs.insert(logs.end(), eventRegistry.logs.begin(),
-			eventRegistry.logs.end());
+	logs.insert(logs.end(), eventRegistry.logs.begin(), eventRegistry.logs.end());
 }
 
-AuditEvent const* EventRegistry::getLastFailure() const {
+const AuditEvent *EventRegistry::getLastFailure() const {
 	const AuditEvent *result = nullptr;
 	if (logs.size() == 0) {
 		return result;
 	}
-	//try to find a failure between the licenses who progressed the most
+	// try to find a failure between the licenses who progressed the most
 	if (mostAdvancedLogIdx_by_LicenseId.size() > 0) {
-		for (auto const &mostAdvLogIter : mostAdvancedLogIdx_by_LicenseId) {
+		for (const auto &mostAdvLogIter : mostAdvancedLogIdx_by_LicenseId) {
 			const AuditEvent &currentLog = logs[mostAdvLogIter.second];
 			if (currentLog.severity == SVRT_ERROR) {
 				result = &(currentLog);
@@ -81,13 +73,11 @@
 	return result;
 }
 
-void EventRegistry::addEvent(EVENT_TYPE event,
-		const std::string &licenseLocationId) {
+void EventRegistry::addEvent(EVENT_TYPE event, const std::string &licenseLocationId) {
 	addEvent(event, licenseLocationId.c_str(), nullptr);
 }
 
-void EventRegistry::addEvent(EVENT_TYPE event, const char *licenseLocationId,
-		const char *info) {
+void EventRegistry::addEvent(EVENT_TYPE event, const char *licenseLocationId, const char *info) {
 	AuditEvent audit;
 	auto eventIterator = PROGRESS_BY_EVENT_TYPE.find(event);
 	bool successEvent = (eventIterator != PROGRESS_BY_EVENT_TYPE.end());
@@ -104,7 +94,7 @@
 		strncpy(audit.param2, info, 255);
 	}
 	logs.push_back(audit);
-//udpate the status of the log
+	// udpate the status of the log
 	if (successEvent) {
 		int step = eventIterator->second;
 		if (step > current_validation_step) {
@@ -113,23 +103,19 @@
 		}
 
 		if (step == current_validation_step) {
-			mostAdvancedLogIdx_by_LicenseId[audit.license_reference] =
-					logs.size() - 1;
+			mostAdvancedLogIdx_by_LicenseId[audit.license_reference] = logs.size() - 1;
 		}
-	} else if (mostAdvancedLogIdx_by_LicenseId.find(audit.license_reference)
-			!= mostAdvancedLogIdx_by_LicenseId.end()) {
-		mostAdvancedLogIdx_by_LicenseId[audit.license_reference] = logs.size()
-				- 1;
+	} else if (mostAdvancedLogIdx_by_LicenseId.find(audit.license_reference) != mostAdvancedLogIdx_by_LicenseId.end()) {
+		mostAdvancedLogIdx_by_LicenseId[audit.license_reference] = logs.size() - 1;
 	}
 }
 
 bool EventRegistry::turnWarningsIntoErrors() {
 	bool eventFound = false;
 	if (mostAdvancedLogIdx_by_LicenseId.size() > 0) {
-		for (auto const &mostAdvLogIter : mostAdvancedLogIdx_by_LicenseId) {
+		for (const auto &mostAdvLogIter : mostAdvancedLogIdx_by_LicenseId) {
 			AuditEvent &currentLog = logs[mostAdvLogIter.second];
-			if (currentLog.severity == SVRT_WARN
-					|| currentLog.severity == SVRT_ERROR) {
+			if (currentLog.severity == SVRT_WARN || currentLog.severity == SVRT_ERROR) {
 				currentLog.severity = SVRT_ERROR;
 				eventFound = true;
 			}
@@ -158,13 +144,10 @@
 }
 
 void EventRegistry::exportLastEvents(AuditEvent *auditEvents, int nlogs) {
-	const int sizeToCopy = min(nlogs, (int) logs.size());
+	const int sizeToCopy = min(nlogs, (int)logs.size());
 	std::copy(logs.end() - sizeToCopy, logs.end(), auditEvents);
 }
 
-bool EventRegistry::isGood() const {
-	return getLastFailure() == nullptr;
-}
+bool EventRegistry::isGood() const { return getLastFailure() == nullptr; }
 
-}
-
+}  // namespace license
diff --git a/src/library/base/EventRegistry.h b/src/library/base/EventRegistry.h
index af5389b..23a53a5 100644
--- a/src/library/base/EventRegistry.h
+++ b/src/library/base/EventRegistry.h
@@ -8,7 +8,8 @@
 #ifndef EVENTREGISTRY_H_
 #define EVENTREGISTRY_H_
 
-#include "../api/datatypes.h"
+#include <licensecc/datatypes.h>
+
 #include <vector>
 #include <map>
 #include <set>
@@ -22,21 +23,21 @@
  */
 class EventRegistry {
 private:
-	friend EventRegistry& operator<<(EventRegistry&, AuditEvent&);
-	friend EventRegistry& operator<<(EventRegistry&, EventRegistry&);
-	friend std::ostream & operator << (std::ostream &out, const EventRegistry &er);
+	friend EventRegistry &operator<<(EventRegistry &, AuditEvent &);
+	friend EventRegistry &operator<<(EventRegistry &, EventRegistry &);
+	friend std::ostream &operator<<(std::ostream &out, const EventRegistry &er);
 
 	std::vector<AuditEvent> logs;
 	/**
 	 * For every license keep track of the events who progressed most
 	 * in the validation process
 	 */
-	std::map<std::string,size_t> mostAdvancedLogIdx_by_LicenseId;
+	std::map<std::string, size_t> mostAdvancedLogIdx_by_LicenseId;
 	int current_validation_step;
 
 public:
 	EventRegistry();
-	//operator <<
+	// operator <<
 	void append(const EventRegistry &eventRegistry);
 	/**
 	 * Turn the event warning for the license with the most advanced status
@@ -50,11 +51,10 @@
 	 * for the license with the most advanced status.
 	 * @return NULL if no failures are found.
 	 */
-	AuditEvent const* getLastFailure() const;
+	const AuditEvent *getLastFailure() const;
 	void addEvent(EVENT_TYPE event, const std::string &licenseLocationId);
-	void addEvent(EVENT_TYPE event, const char *licenseLocationId = nullptr,
-			const char *info = nullptr);
+	void addEvent(EVENT_TYPE event, const char *licenseLocationId = nullptr, const char *info = nullptr);
 	void exportLastEvents(AuditEvent *auditEvents, int nlogs);
 };
-}
+}  // namespace license
 #endif /* EVENTREGISTRY_H_ */
diff --git a/src/library/base/base.h b/src/library/base/base.h
index 898688f..978298d 100644
--- a/src/library/base/base.h
+++ b/src/library/base/base.h
@@ -9,12 +9,12 @@
 #include <limits.h>
 #define DllExport
 #ifndef MAX_PATH
-	#define MAX_PATH PATH_MAX
+#define MAX_PATH PATH_MAX
 #endif
 
-#else //windows
+#else  // windows
 #include <windows.h>
-#define DllExport  __declspec( dllexport )
+#define DllExport __declspec(dllexport)
 
 #ifndef __cplusplus
 #ifndef _MSC_VER
@@ -22,21 +22,31 @@
 #else
 typedef int bool;
 #define false 0
-#define true -1
+#define true - 1
 #endif
 #endif
 
 #endif
-/* #define _DEBUG */
 
-#define cmin(a,b) \
-   ({ __typeof__ (a) _a = (a); \
-       __typeof__ (b) _b = (b); \
-     _a < _b ? _a : _b; })
+// license file parameters
+#define PARAM_EXPIRY_DATE "valid-to"
+#define PARAM_BEGIN_DATE "valid-from"
+#define PARAM_VERSION_FROM "start-version"
+#define PARAM_CLIENT_SIGNATURE "client-signature"
+#define PARAM_VERSION_TO "end-version"
+#define PARAM_EXTRA_DATA "extra-data"
+// license file extra entries
+#define LICENSE_SIGNATURE "sig"
+#define LICENSE_VERSION "lic_ver"
 
-typedef enum  {
-	FUNC_RET_OK, FUNC_RET_NOT_AVAIL, FUNC_RET_ERROR, FUNC_RET_BUFFER_TOO_SMALL
-} FUNCTION_RETURN;
+typedef enum { FUNC_RET_OK, FUNC_RET_NOT_AVAIL, FUNC_RET_ERROR, FUNC_RET_BUFFER_TOO_SMALL } FUNCTION_RETURN;
+
+#define cmin(a, b)              \
+	({                          \
+		__typeof__(a) _a = (a); \
+		__typeof__(b) _b = (b); \
+		_a < _b ? _a : _b;      \
+	})
 
 #ifdef __cplusplus
 }
diff --git a/src/library/ini/CMakeLists.txt b/src/library/ini/CMakeLists.txt
deleted file mode 100644
index b08ac95..0000000
--- a/src/library/ini/CMakeLists.txt
+++ /dev/null
@@ -1,9 +0,0 @@
-
-ADD_LIBRARY(ini STATIC
-    ConvertUTF.c
-)
-
-target_link_libraries(
-     ini
-)
-
diff --git a/src/library/license++.cpp b/src/library/license++.cpp
deleted file mode 100644
index b702d51..0000000
--- a/src/library/license++.cpp
+++ /dev/null
@@ -1,92 +0,0 @@
-//============================================================================
-// Name        : license-manager-cpp.cpp
-// Author      :
-// Version     :
-// Copyright   : BSD
-//============================================================================
-
-#include <fstream>
-#include <stdio.h>
-#include <stdlib.h>
-#include <cstring>
-#include <iostream>
-
-#include "api/license++.h"
-
-#include "LicenseReader.hpp"
-
-using namespace std;
-void print_error(char out_buffer[256], LicenseInfo* licenseInfo) {
-
-}
-
-void identify_pc(IDENTIFICATION_STRATEGY pc_id_method, char chbuffer[PC_IDENTIFIER_SIZE + 1]) {
-
-}
-
-static void mergeLicenses(vector<license::FullLicenseInfo> licenses,
-		LicenseInfo* license) {
-	if (license != nullptr) {
-		time_t curLicense_exp = 0;
-		for (auto it = licenses.begin(); it != licenses.end(); it++) {
-			//choose the license that expires later...
-			if (!it->has_expiry) {
-				it->toLicenseInfo(license);
-				break;
-			} else if (curLicense_exp < it->expires_on()) {
-				curLicense_exp = it->expires_on();
-				it->toLicenseInfo(license);
-			}
-		}
-	}
-}
-
-EVENT_TYPE acquire_license(const char * product,
-		const LicenseLocation* licenseLocation, LicenseInfo* licenseInfoOut) {
-	license::LicenseReader lr = license::LicenseReader(licenseLocation);
-	vector<license::FullLicenseInfo> licenses;
-	license::EventRegistry er = lr.readLicenses(string(product), licenses);
-	EVENT_TYPE result;
-	if (licenses.size() > 0) {
-		vector<license::FullLicenseInfo> licenses_with_errors;
-		vector<license::FullLicenseInfo> licenses_ok;
-		for (auto it = licenses.begin(); it != licenses.end(); it++) {
-			bool valid = it->validate(0,er);
-			if (valid) {
-				licenses_ok.push_back(*it);
-			} else {
-				licenses_with_errors.push_back(*it);
-			}
-		}
-		if (licenses_ok.size() > 0) {
-			er.turnErrorsIntoWarnings();
-			result = LICENSE_OK;
-			mergeLicenses(licenses_ok, licenseInfoOut);
-		} else {
-			er.turnWarningsIntoErrors();
-			result = er.getLastFailure()->event_type;
-			mergeLicenses(licenses_with_errors, licenseInfoOut);
-		}
-
-	} else {
-		er.turnWarningsIntoErrors();
-		result = er.getLastFailure()->event_type;
-	}
-#ifdef _DEBUG
-	cout << er <<endl;
-#endif
-	if (licenseInfoOut != nullptr) {
-		er.exportLastEvents(licenseInfoOut->status, AUDIT_EVENT_NUM);
-	}
-	return result;
-}
-
-EVENT_TYPE confirm_license(char * product,
-		LicenseLocation licenseLocation) {
-	return LICENSE_OK;
-}
-
-EVENT_TYPE release_license(char * product,
-		LicenseLocation licenseLocation) {
-	return LICENSE_OK;
-}
diff --git a/src/library/licensecc.cpp b/src/library/licensecc.cpp
new file mode 100644
index 0000000..fe1b3a7
--- /dev/null
+++ b/src/library/licensecc.cpp
@@ -0,0 +1,99 @@
+//============================================================================
+// Name        : license-manager-cpp.cpp
+// Author      :
+// Version     :
+// Copyright   : BSD
+//============================================================================
+
+#include <fstream>
+#include <stdio.h>
+#include <stdlib.h>
+#include <cstring>
+#include <iostream>
+
+#include <licensecc/datatypes.h>
+#include <licensecc/licensecc.h>
+
+#include "limits/license_verifier.hpp"
+#include "LicenseReader.hpp"
+
+using namespace std;
+void print_error(char out_buffer[256], LicenseInfo* licenseInfo) {}
+
+void identify_pc(IDENTIFICATION_STRATEGY pc_id_method, char chbuffer[PC_IDENTIFIER_SIZE + 1]) {}
+
+static void mergeLicenses(const vector<LicenseInfo>& licenses, LicenseInfo* license_out) {
+	if (license_out != nullptr) {
+		int days_left = -1;
+		for (auto it = licenses.begin(); it != licenses.end(); it++) {
+			// choose the license that expires later...
+			if (!it->has_expiry) {
+				*license_out = *it;
+				break;
+			} else if (days_left < it->days_left) {
+				*license_out = *it;
+				days_left = it->days_left;
+			}
+		}
+	}
+}
+
+EVENT_TYPE acquire_license(const CallerInformations* callerInformation, const LicenseLocation* licenseLocation,
+						   LicenseInfo* license_out) {
+	license::LicenseReader lr = license::LicenseReader(licenseLocation);
+	vector<license::FullLicenseInfo> licenses;
+	string project;
+	if (callerInformation != nullptr && strlen(callerInformation->project_name) > 0) {
+		project = string(callerInformation->project_name);
+	} else {
+		project = string(LCC_PROJECT_NAME);
+	}
+	license::EventRegistry er = lr.readLicenses(string(project), licenses);
+	EVENT_TYPE result;
+	if (licenses.size() > 0) {
+		vector<LicenseInfo> licenses_with_errors;
+		vector<LicenseInfo> licenses_ok;
+		license::LicenseVerifier verifier(er);
+		for (auto it = licenses.begin(); it != licenses.end(); it++) {
+			FUNCTION_RETURN signatureValid = verifier.verify_signature(*it);
+			if (signatureValid == FUNC_RET_OK) {
+				if (verifier.verify_limits(*it) == FUNC_RET_OK) {
+					licenses_ok.push_back(verifier.toLicenseInfo(*it));
+				} else {
+					licenses_with_errors.push_back(verifier.toLicenseInfo(*it));
+				}
+			} else {
+				licenses_with_errors.push_back(verifier.toLicenseInfo(*it));
+			}
+		}
+		if (licenses_ok.size() > 0) {
+			er.turnErrorsIntoWarnings();
+			result = LICENSE_OK;
+			mergeLicenses(licenses_ok, license_out);
+		} else {
+			er.turnWarningsIntoErrors();
+			result = er.getLastFailure()->event_type;
+			mergeLicenses(licenses_with_errors, license_out);
+		}
+	} else {
+		er.turnWarningsIntoErrors();
+		result = er.getLastFailure()->event_type;
+		if (license_out != nullptr) {
+			license_out->proprietary_data[0] = '\0';
+			license_out->linked_to_pc = false;
+			license_out->days_left = 0;
+		}
+	}
+#ifdef _DEBUG
+	cout << er << endl;
+#endif
+
+	if (license_out != nullptr) {
+		er.exportLastEvents(license_out->status, AUDIT_EVENT_NUM);
+	}
+	return result;
+}
+
+EVENT_TYPE confirm_license(char* product, LicenseLocation licenseLocation) { return LICENSE_OK; }
+
+EVENT_TYPE release_license(char* product, LicenseLocation licenseLocation) { return LICENSE_OK; }
diff --git a/src/library/limits/license_verifier.cpp b/src/library/limits/license_verifier.cpp
new file mode 100644
index 0000000..a3fefdd
--- /dev/null
+++ b/src/library/limits/license_verifier.cpp
@@ -0,0 +1,100 @@
+/*
+ * LicenseVerifier.cpp
+ *
+ *  Created on: Nov 17, 2019
+ *      Author: GC
+ */
+#include <cmath>
+#include <algorithm>
+
+#include "license_verifier.hpp"
+#include "../os/signature_verifier.h"
+#include "../base/StringUtils.h"
+#include "../pc-identifiers.h"
+
+namespace license {
+using namespace std;
+
+LicenseVerifier::LicenseVerifier(EventRegistry& er) : m_event_registry(er) {}
+
+LicenseVerifier::~LicenseVerifier() {}
+
+FUNCTION_RETURN LicenseVerifier::verify_signature(const FullLicenseInfo& licInfo) {
+	const string licInfoData(licInfo.printForSign());
+
+	FUNCTION_RETURN ret = license::verify_signature(licInfoData, licInfo.license_signature);
+
+	if (ret == FUNC_RET_OK) {
+		m_event_registry.addEvent(SIGNATURE_VERIFIED, licInfo.source);
+	} else {
+		m_event_registry.addEvent(LICENSE_CORRUPTED, licInfo.source);
+	}
+	return ret;
+}
+
+// TODO: split in different classes
+FUNCTION_RETURN LicenseVerifier::verify_limits(const FullLicenseInfo& licInfo) {
+	bool is_valid = true;
+	const time_t now = time(nullptr);
+	auto expiry = licInfo.m_limits.find(PARAM_EXPIRY_DATE);
+	if (expiry != licInfo.m_limits.end()) {
+		if (seconds_from_epoch(expiry->second.c_str()) < now) {
+			/*
+						eventRegistryOut.addEvent(PRODUCT_EXPIRED, source.c_str(),
+								string("Expired on: " + this->to_date).c_str());*/
+			m_event_registry.addEvent(PRODUCT_EXPIRED, licInfo.source.c_str(), ("Expired " + expiry->second).c_str());
+			is_valid = false;
+		}
+	}
+	auto start_date = licInfo.m_limits.find(PARAM_BEGIN_DATE);
+	if (is_valid && start_date != licInfo.m_limits.end()) {
+		if (seconds_from_epoch(start_date->second.c_str()) > now) {
+			/*eventRegistryOut.addEvent(PRODUCT_EXPIRED, source.c_str(),
+					string("Valid from " + this->from_date).c_str());*/
+			m_event_registry.addEvent(PRODUCT_EXPIRED, licInfo.source.c_str(),
+									  ("Valid from " + start_date->second).c_str());
+			is_valid = false;
+		}
+	}
+	auto client_sig = licInfo.m_limits.find(PARAM_CLIENT_SIGNATURE);
+	if (is_valid && client_sig != licInfo.m_limits.end()) {
+		PcSignature str_code;
+		strncpy(str_code, client_sig->second.c_str(), sizeof(str_code) - 1);
+		const EVENT_TYPE event = validate_pc_signature(str_code);
+		m_event_registry.addEvent(event, licInfo.source);
+		is_valid = is_valid && (event == LICENSE_OK);
+	}
+	return is_valid ? FUNC_RET_OK : FUNC_RET_ERROR;
+}
+
+LicenseInfo LicenseVerifier::toLicenseInfo(const FullLicenseInfo& fullLicInfo) const {
+	LicenseInfo info;
+	info.license_type = LOCAL;
+
+	auto expiry = fullLicInfo.m_limits.find(PARAM_EXPIRY_DATE);
+	if (expiry != fullLicInfo.m_limits.end()) {
+		strncpy(info.expiry_date, expiry->second.c_str(), sizeof(info.expiry_date));
+		info.has_expiry = true;
+		const double secs = difftime(seconds_from_epoch(expiry->second.c_str()), time(nullptr));
+		info.days_left = max((int)round(secs / (60 * 60 * 24)), 0);
+	} else {
+		info.has_expiry = false;
+		info.days_left = 9999;
+		info.expiry_date[0] = '\0';
+	}
+
+	auto start_date = fullLicInfo.m_limits.find(PARAM_BEGIN_DATE);
+	if (start_date != fullLicInfo.m_limits.end()) {
+	}
+
+	auto client_sig = fullLicInfo.m_limits.find(PARAM_CLIENT_SIGNATURE);
+	info.linked_to_pc = (client_sig != fullLicInfo.m_limits.end());
+
+	auto proprietary_data = fullLicInfo.m_limits.find(PARAM_EXTRA_DATA);
+	if (proprietary_data != fullLicInfo.m_limits.end()) {
+		strncpy(info.proprietary_data, proprietary_data->second.c_str(), PROPRIETARY_DATA_SIZE);
+	}
+	return info;
+}
+
+} /* namespace license */
diff --git a/src/library/limits/license_verifier.hpp b/src/library/limits/license_verifier.hpp
new file mode 100644
index 0000000..339f2de
--- /dev/null
+++ b/src/library/limits/license_verifier.hpp
@@ -0,0 +1,29 @@
+/*
+ * LicenseVerifier.hpp
+ *
+ *  Created on: Nov 17, 2019
+ *      Author: GC
+ */
+
+#ifndef SRC_LIBRARY_LIMITS_LICENSEVERIFIER_HPP_
+#define SRC_LIBRARY_LIMITS_LICENSEVERIFIER_HPP_
+#include "../base/EventRegistry.h"
+#include "../LicenseReader.hpp"
+
+namespace license {
+
+class LicenseVerifier {
+private:
+	EventRegistry& m_event_registry;
+
+public:
+	LicenseVerifier(EventRegistry& er);
+	FUNCTION_RETURN verify_signature(const FullLicenseInfo& licInfo);
+	FUNCTION_RETURN verify_limits(const FullLicenseInfo& licInfo);
+	LicenseInfo toLicenseInfo(const FullLicenseInfo& fullLicInfo) const;
+	virtual ~LicenseVerifier();
+};
+
+} /* namespace license */
+
+#endif /* SRC_LIBRARY_LIMITS_LICENSEVERIFIER_HPP_ */
diff --git a/src/library/locate/ApplicationFolder.cpp b/src/library/locate/ApplicationFolder.cpp
index e6a7446..e8535d6 100644
--- a/src/library/locate/ApplicationFolder.cpp
+++ b/src/library/locate/ApplicationFolder.cpp
@@ -8,10 +8,9 @@
 #include <sstream>
 #include <string>
 
-//B#include <build_properties.h>
+#include <licensecc/datatypes.h>
 
 #include "../base/logger.h"
-#include "../api/datatypes.h"
 #include "../base/base.h"
 #include "../base/EventRegistry.h"
 #include "../base/FileUtils.hpp"
diff --git a/src/library/locate/EnvironmentVarData.cpp b/src/library/locate/EnvironmentVarData.cpp
index 6a65d35..486175b 100644
--- a/src/library/locate/EnvironmentVarData.cpp
+++ b/src/library/locate/EnvironmentVarData.cpp
@@ -6,6 +6,7 @@
  */
 
 #include "EnvironmentVarData.hpp"
+#include <licensecc/datatypes.h>
 
 #include <licensecc_properties.h>
 #include <cstdlib>
@@ -13,7 +14,6 @@
 #include <string>
 #include <vector>
 
-#include "../api/datatypes.h"
 #include "../base/base64.h"
 #include "../base/EventRegistry.h"
 #include "../base/StringUtils.h"
diff --git a/src/library/locate/ExternalDefinition.cpp b/src/library/locate/ExternalDefinition.cpp
index ec0428f..78b9825 100644
--- a/src/library/locate/ExternalDefinition.cpp
+++ b/src/library/locate/ExternalDefinition.cpp
@@ -10,7 +10,8 @@
 #include <string>
 #include <vector>
 
-#include "../api/datatypes.h"
+#include <licensecc/datatypes.h>
+
 #include "../base/base64.h"
 #include "../base/EventRegistry.h"
 #include "../base/FileUtils.hpp"
diff --git a/src/library/locate/LocatorFactory.hpp b/src/library/locate/LocatorFactory.hpp
index 6f1cd30..9c54b51 100644
--- a/src/library/locate/LocatorFactory.hpp
+++ b/src/library/locate/LocatorFactory.hpp
@@ -4,9 +4,9 @@
 #include <cstddef>
 #include <string>
 #include <vector>
+#include <licensecc/datatypes.h>
 
 #include "../base/base.h"
-#include "../api/datatypes.h"
 #include "LocatorStrategy.hpp"
 
 namespace license {
diff --git a/src/library/os/CMakeLists.txt b/src/library/os/CMakeLists.txt
index 91e00fb..861bf67 100644
--- a/src/library/os/CMakeLists.txt
+++ b/src/library/os/CMakeLists.txt
@@ -1,6 +1,6 @@
 IF(UNIX)
     ADD_LIBRARY(os STATIC
-        linux/verifier.cpp
+        openssl/signature_verifier.cpp
         os.c
         os-linux.c
         network_id.c)
@@ -8,14 +8,15 @@
 	target_link_libraries(
 	     os
 	     base
-	     OpenSSL::Crypto
+	     OpenSSL::Crypto 
 	     ${EXTERNAL_LIBS}
+	     ${CMAKE_DL_LIBS}
 	     ##ZLIB::ZLIB
 	)
 	
 ELSE(UNIX)
     ADD_LIBRARY(os STATIC
-        windows/verifier.cpp
+        windows/signature_verifier.cpp
         os.c
         os-win.c)
 
diff --git a/src/library/os/linux/verifier.cpp b/src/library/os/openssl/signature_verifier.cpp
similarity index 88%
rename from src/library/os/linux/verifier.cpp
rename to src/library/os/openssl/signature_verifier.cpp
index 26bd2d8..9c9f9fb 100644
--- a/src/library/os/linux/verifier.cpp
+++ b/src/library/os/openssl/signature_verifier.cpp
@@ -12,7 +12,7 @@
 
 #include <public_key.h>
 
-#include "../verifier.hpp"
+#include "../signature_verifier.h"
 
 namespace license {
 #include "../../base/logger.h"
@@ -26,7 +26,7 @@
 	}
 }
 
-Verifier::Verifier() {
+static void initialize() {
 	static int initialized = 0;
 	if (initialized == 0) {
 		initialized = 1;
@@ -36,13 +36,14 @@
 	}
 }
 
-FUNCTION_RETURN Verifier::verifySignature(const std::string& stringToVerify, const std::string& signatureB64) {
+FUNCTION_RETURN verify_signature(const std::string& stringToVerify, const std::string& signatureB64) {
 	EVP_MD_CTX* mdctx = NULL;
 	const unsigned char pubKey[] = PUBLIC_KEY;
 	int func_ret = 0;
+	initialize();
 
-	BIO* bio = BIO_new_mem_buf((void*)(pubKey), PUBLIC_KEY_LEN);
-	RSA* rsa = PEM_read_bio_RSAPublicKey(bio, NULL, NULL, NULL);
+	BIO* bio = BIO_new_mem_buf((void*)(pubKey), sizeof(pubKey));
+	RSA* rsa = d2i_RSAPublicKey_bio(bio, NULL);
 	BIO_free(bio);
 	if (rsa == NULL) {
 		LOG_ERROR("Error reading public key");
@@ -97,9 +98,6 @@
 
 	free_resources(pkey, mdctx);
 	return result;
-}
-
-Verifier::~Verifier() {
 }
 
 } /* namespace license */
diff --git a/src/library/os/os.c b/src/library/os/os.c
index 802a46d..ed602ac 100644
--- a/src/library/os/os.c
+++ b/src/library/os/os.c
@@ -6,7 +6,7 @@
 #ifdef __linux__
 
 #include <openssl/pem.h>
-
+/*
 static void free_resources(EVP_PKEY* pkey, EVP_MD_CTX* mdctx) {
 	if (pkey) {
 		EVP_PKEY_free(pkey);
@@ -14,8 +14,8 @@
 	if (mdctx) {
 		EVP_MD_CTX_destroy(mdctx);
 	}
-}
-
+}*/
+/*
 FUNCTION_RETURN verifySignature(const char* stringToVerify,
 		const char* signatureB64) {
 	EVP_MD_CTX *mdctx = NULL;
@@ -37,7 +37,7 @@
 	 RSA *key = 0;
 	 PEM_read_bio_RSAPublicKey(bo, &key, 0, 0);
 	 BIO_free(bo);*/
-
+/*
 //RSA* rsa = EVP_PKEY_get1_RSA( key );
 //RSA * pubKey = d2i_RSA_PUBKEY(NULL, <der encoded byte stream pointer>, <num bytes>);
 	unsigned char buffer[512];
@@ -52,7 +52,6 @@
 
 	BIO_free_all(biosig);
 
-	/* Create the Message Digest Context */
 	if (!(mdctx = EVP_MD_CTX_create())) {
 		free_resources(pkey, mdctx);
 		LOG_ERROR("Error creating context");
@@ -79,7 +78,7 @@
 
 	free_resources(pkey, mdctx);
 	return result;
-}
+}*/
 
 #else
 
diff --git a/src/library/os/os.h b/src/library/os/os.h
index 1371786..f32ca92 100644
--- a/src/library/os/os.h
+++ b/src/library/os/os.h
@@ -77,7 +77,7 @@
 VIRTUALIZATION getVirtualization();
 void os_initialize();
 
-FUNCTION_RETURN verifySignature(const char* stringToVerify, const char* signatureB64);
+// FUNCTION_RETURN verifySignature(const char* stringToVerify, const char* signatureB64);
 
 #ifdef _WIN32
 #define SETENV(VAR,VAL) _putenv_s(VAR, VAL);
diff --git a/src/library/os/verifier.hpp b/src/library/os/signature_verifier.h
similarity index 72%
rename from src/library/os/verifier.hpp
rename to src/library/os/signature_verifier.h
index 3909010..4dfe1d0 100644
--- a/src/library/os/verifier.hpp
+++ b/src/library/os/signature_verifier.h
@@ -13,13 +13,7 @@
 
 namespace license {
 
-class Verifier {
-
-public:
-	Verifier();
-	FUNCTION_RETURN verifySignature(const std::string& stringToVerify, const std::string& signatureB64);
-	~Verifier();
-};
+FUNCTION_RETURN verify_signature(const std::string& stringToVerify, const std::string& signatureB64);
 
 } /* namespace license */
 
diff --git a/src/library/os/windows/verifier.cpp b/src/library/os/windows/signature_verifier.cpp
similarity index 89%
rename from src/library/os/windows/verifier.cpp
rename to src/library/os/windows/signature_verifier.cpp
index c5225c9..6d73513 100644
--- a/src/library/os/windows/verifier.cpp
+++ b/src/library/os/windows/signature_verifier.cpp
@@ -1,7 +1,7 @@
 /*
  * verifier.cpp
  *
- *  Created on: Nov 15, 2019
+ *  Created on: Nov 16, 2019
  *      Author: devel
  */
 
diff --git a/src/library/pc-identifiers.c b/src/library/pc-identifiers.c
index 0f39760..ff08202 100644
--- a/src/library/pc-identifiers.c
+++ b/src/library/pc-identifiers.c
@@ -23,18 +23,15 @@
 #endif
 #endif
 
-static FUNCTION_RETURN generate_disk_pc_id(PcIdentifier * identifiers,
-		unsigned int * num_identifiers, bool use_label);
+static FUNCTION_RETURN generate_disk_pc_id(PcIdentifier *identifiers, unsigned int *num_identifiers, bool use_label);
 
-static FUNCTION_RETURN generate_ethernet_pc_id(PcIdentifier * identifiers,
-		unsigned int * num_identifiers, int use_mac);
+static FUNCTION_RETURN generate_ethernet_pc_id(PcIdentifier *identifiers, unsigned int *num_identifiers, int use_mac);
 
-static FUNCTION_RETURN generate_default_pc_id(PcIdentifier * identifiers,
-		unsigned int * num_identifiers) {
+static FUNCTION_RETURN generate_default_pc_id(PcIdentifier *identifiers, unsigned int *num_identifiers) {
 	size_t adapter_num, disk_num;
 	FUNCTION_RETURN result_adapterInfos, result_diskinfos, function_return;
 	unsigned int caller_identifiers, i, j, k, array_index;
-	DiskInfo * diskInfoPtr;
+	DiskInfo *diskInfoPtr;
 	OsAdapterInfo *adapterInfoPtr;
 
 	if (identifiers == NULL || *num_identifiers == 0) {
@@ -49,20 +46,17 @@
 		*num_identifiers = disk_num * adapter_num;
 		function_return = FUNC_RET_OK;
 	} else {
-		adapterInfoPtr = (OsAdapterInfo*) malloc(
-				(*num_identifiers) * sizeof(OsAdapterInfo));
+		adapterInfoPtr = (OsAdapterInfo *)malloc((*num_identifiers) * sizeof(OsAdapterInfo));
 		adapter_num = *num_identifiers;
 		result_adapterInfos = getAdapterInfos(adapterInfoPtr, &adapter_num);
-		if (result_adapterInfos != FUNC_RET_OK
-				&& result_adapterInfos != FUNC_RET_BUFFER_TOO_SMALL) {
+		if (result_adapterInfos != FUNC_RET_OK && result_adapterInfos != FUNC_RET_BUFFER_TOO_SMALL) {
 			free(adapterInfoPtr);
 			return generate_disk_pc_id(identifiers, num_identifiers, false);
 		}
-		diskInfoPtr = (DiskInfo*) malloc((*num_identifiers) * sizeof(DiskInfo));
+		diskInfoPtr = (DiskInfo *)malloc((*num_identifiers) * sizeof(DiskInfo));
 		disk_num = *num_identifiers;
 		result_diskinfos = getDiskInfos(diskInfoPtr, &disk_num);
-		if (result_diskinfos != FUNC_RET_OK
-				&& result_diskinfos != FUNC_RET_BUFFER_TOO_SMALL) {
+		if (result_diskinfos != FUNC_RET_OK && result_diskinfos != FUNC_RET_BUFFER_TOO_SMALL) {
 			free(diskInfoPtr);
 			free(adapterInfoPtr);
 			return generate_ethernet_pc_id(identifiers, num_identifiers, true);
@@ -75,19 +69,18 @@
 				array_index = i * adapter_num + j;
 				if (array_index >= caller_identifiers) {
 					function_return = FUNC_RET_BUFFER_TOO_SMALL;
-					//sweet memories...
+					// sweet memories...
 					goto end;
 				}
 				for (k = 0; k < 6; k++)
-					identifiers[array_index][k] = diskInfoPtr[i].disk_sn[k + 2]
-							^ adapterInfoPtr[j].mac_address[k + 2];
+					identifiers[array_index][k] = diskInfoPtr[i].disk_sn[k + 2] ^ adapterInfoPtr[j].mac_address[k + 2];
 			}
 		}
-end:
+	end:
 #ifdef _MSC_VER
-        *num_identifiers = min(*num_identifiers, adapter_num * disk_num);
+		*num_identifiers = min(*num_identifiers, adapter_num * disk_num);
 #else
-        *num_identifiers = cmin(*num_identifiers, adapter_num * disk_num);
+		*num_identifiers = cmin(*num_identifiers, adapter_num * disk_num);
 #endif
 		free(diskInfoPtr);
 		free(adapterInfoPtr);
@@ -95,8 +88,7 @@
 	return function_return;
 }
 
-static FUNCTION_RETURN generate_ethernet_pc_id(PcIdentifier * identifiers,
-		unsigned int * num_identifiers, int use_mac) {
+static FUNCTION_RETURN generate_ethernet_pc_id(PcIdentifier *identifiers, unsigned int *num_identifiers, int use_mac) {
 	FUNCTION_RETURN result_adapterInfos;
 	unsigned int j, k;
 	OsAdapterInfo *adapterInfos;
@@ -104,56 +96,50 @@
 
 	if (identifiers == NULL || *num_identifiers == 0) {
 		result_adapterInfos = getAdapterInfos(NULL, &adapters);
-		if (result_adapterInfos == FUNC_RET_OK
-				|| result_adapterInfos == FUNC_RET_BUFFER_TOO_SMALL) {
+		if (result_adapterInfos == FUNC_RET_OK || result_adapterInfos == FUNC_RET_BUFFER_TOO_SMALL) {
 			*num_identifiers = adapters;
 			result_adapterInfos = FUNC_RET_OK;
 		}
 	} else {
 		defined_adapters = adapters = *num_identifiers;
-		adapterInfos = (OsAdapterInfo*) malloc(
-				adapters * sizeof(OsAdapterInfo));
+		adapterInfos = (OsAdapterInfo *)malloc(adapters * sizeof(OsAdapterInfo));
 		result_adapterInfos = getAdapterInfos(adapterInfos, &adapters);
-		if (result_adapterInfos == FUNC_RET_BUFFER_TOO_SMALL
-				|| result_adapterInfos == FUNC_RET_OK) {
+		if (result_adapterInfos == FUNC_RET_BUFFER_TOO_SMALL || result_adapterInfos == FUNC_RET_OK) {
 			for (j = 0; j < adapters; j++) {
 				for (k = 0; k < 6; k++)
 					if (use_mac) {
 						identifiers[j][k] = adapterInfos[j].mac_address[k + 2];
 					} else {
-						//use ip
+						// use ip
 						if (k < 4) {
 							identifiers[j][k] = adapterInfos[j].ipv4_address[k];
 						} else {
-							//padding
+							// padding
 							identifiers[j][k] = 42;
 						}
 					}
 			}
-			result_adapterInfos = (
-					adapters > defined_adapters ?
-							FUNC_RET_BUFFER_TOO_SMALL : FUNC_RET_OK);
+			result_adapterInfos = (adapters > defined_adapters ? FUNC_RET_BUFFER_TOO_SMALL : FUNC_RET_OK);
 		}
 		free(adapterInfos);
 	}
 	return result_adapterInfos;
 }
 
-static FUNCTION_RETURN generate_disk_pc_id(PcIdentifier * identifiers,
-		unsigned int * num_identifiers, bool use_label) {
+static FUNCTION_RETURN generate_disk_pc_id(PcIdentifier *identifiers, unsigned int *num_identifiers, bool use_label) {
 	size_t disk_num, available_disk_info = 0;
 	FUNCTION_RETURN result_diskinfos;
 	unsigned int i, j;
 	int defined_identifiers;
 	char firstChar;
-	DiskInfo * diskInfos;
+	DiskInfo *diskInfos;
 
 	result_diskinfos = getDiskInfos(NULL, &disk_num);
 	if (result_diskinfos != FUNC_RET_OK) {
 		return result_diskinfos;
 	}
-	diskInfos = (DiskInfo*) malloc(disk_num * sizeof(DiskInfo));
-	memset(diskInfos,0,disk_num * sizeof(DiskInfo));
+	diskInfos = (DiskInfo *)malloc(disk_num * sizeof(DiskInfo));
+	memset(diskInfos, 0, disk_num * sizeof(DiskInfo));
 	result_diskinfos = getDiskInfos(diskInfos, &disk_num);
 	if (result_diskinfos != FUNC_RET_OK) {
 		free(diskInfos);
@@ -178,15 +164,13 @@
 	for (i = 0; i < disk_num; i++) {
 		if (use_label) {
 			if (diskInfos[i].label[0] != 0) {
-				memset(identifiers[j], 0, sizeof(PcIdentifier)); //!!!!!!!
-				strncpy((char*)identifiers[j], diskInfos[i].label,
-						sizeof(PcIdentifier));
+				memset(identifiers[j], 0, sizeof(PcIdentifier));  //!!!!!!!
+				strncpy((char *)identifiers[j], diskInfos[i].label, sizeof(PcIdentifier));
 				j++;
 			}
 		} else {
 			if (diskInfos[i].disk_sn[0] != 0) {
-				memcpy(identifiers[j], &diskInfos[i].disk_sn[2],
-						sizeof(PcIdentifier));
+				memcpy(identifiers[j], &diskInfos[i].disk_sn[2], sizeof(PcIdentifier));
 				j++;
 			}
 		}
@@ -211,43 +195,42 @@
  * @return
  */
 
-FUNCTION_RETURN generate_pc_id(PcIdentifier * identifiers,
-		unsigned int * array_size, IDENTIFICATION_STRATEGY strategy) {
+FUNCTION_RETURN generate_pc_id(PcIdentifier *identifiers, unsigned int *array_size, IDENTIFICATION_STRATEGY strategy) {
 	FUNCTION_RETURN result;
 	unsigned int i, j;
 	const unsigned int original_array_size = *array_size;
 	unsigned char strategy_num;
 	switch (strategy) {
-	case DEFAULT:
-		result = generate_default_pc_id(identifiers, array_size);
-		break;
-	case ETHERNET:
-		result = generate_ethernet_pc_id(identifiers, array_size, true);
-		break;
-	case IP_ADDRESS:
-		result = generate_ethernet_pc_id(identifiers, array_size, false);
-		break;
-	case DISK_NUM:
-		result = generate_disk_pc_id(identifiers, array_size, false);
-		break;
-	case DISK_LABEL:
-		result = generate_disk_pc_id(identifiers, array_size, true);
-		break;
-	default:
-		return FUNC_RET_ERROR;
+		case DEFAULT:
+			result = generate_default_pc_id(identifiers, array_size);
+			break;
+		case ETHERNET:
+			result = generate_ethernet_pc_id(identifiers, array_size, true);
+			break;
+		case IP_ADDRESS:
+			result = generate_ethernet_pc_id(identifiers, array_size, false);
+			break;
+		case DISK_NUM:
+			result = generate_disk_pc_id(identifiers, array_size, false);
+			break;
+		case DISK_LABEL:
+			result = generate_disk_pc_id(identifiers, array_size, true);
+			break;
+		default:
+			return FUNC_RET_ERROR;
 	}
 
 	if (result == FUNC_RET_OK && identifiers != NULL) {
 		strategy_num = strategy << 5;
 		for (i = 0; i < *array_size; i++) {
-			//encode strategy in the first three bits of the pc_identifier
+			// encode strategy in the first three bits of the pc_identifier
 			identifiers[i][0] = (identifiers[i][0] & 15) | strategy_num;
 		}
-		//fill array if larger
+		// fill array if larger
 		for (i = *array_size; i < original_array_size; i++) {
 			identifiers[i][0] = STRATEGY_UNKNOWN << 5;
 			for (j = 1; j < sizeof(PcIdentifier); j++) {
-				identifiers[i][j] = 42; //padding
+				identifiers[i][j] = 42;  // padding
 			}
 		}
 	}
@@ -255,36 +238,33 @@
 }
 
 char *MakeCRC(char *BitString) {
-	static char Res[3];                                 // CRC Result
+	static char Res[3];  // CRC Result
 	char CRC[2];
 	int i;
 	char DoInvert;
 
-	for (i = 0; i < 2; ++i)
-		CRC[i] = 0;                    // Init before calculation
+	for (i = 0; i < 2; ++i) CRC[i] = 0;  // Init before calculation
 
 	for (i = 0; i < strlen(BitString); ++i) {
-		DoInvert = ('1' == BitString[i]) ^ CRC[1];         // XOR required?
+		DoInvert = ('1' == BitString[i]) ^ CRC[1];  // XOR required?
 
 		CRC[1] = CRC[0];
 		CRC[0] = DoInvert;
 	}
 
-	for (i = 0; i < 2; ++i)
-		Res[1 - i] = CRC[i] ? '1' : '0'; // Convert binary to ASCII
-	Res[2] = 0;                                         // Set string terminator
+	for (i = 0; i < 2; ++i) Res[1 - i] = CRC[i] ? '1' : '0';  // Convert binary to ASCII
+	Res[2] = 0;  // Set string terminator
 
 	return (Res);
 }
 
-FUNCTION_RETURN encode_pc_id(PcIdentifier identifier1, PcIdentifier identifier2,
-		PcSignature pc_identifier_out) {
-	//TODO base62 encoding, now uses base64
+FUNCTION_RETURN encode_pc_id(PcIdentifier identifier1, PcIdentifier identifier2, PcSignature pc_identifier_out) {
+	// TODO base62 encoding, now uses base64
 	PcIdentifier concat_identifiers[2];
-	char* b64_data = NULL;
+	char *b64_data = NULL;
 	int b64_size = 0;
 	const size_t concatIdentifiersSize = sizeof(PcIdentifier) * 2;
-	//concat_identifiers = (PcIdentifier *) malloc(concatIdentifiersSize);
+	// concat_identifiers = (PcIdentifier *) malloc(concatIdentifiersSize);
 	memcpy(&concat_identifiers[0], identifier1, sizeof(PcIdentifier));
 	memcpy(&concat_identifiers[1], identifier2, sizeof(PcIdentifier));
 	b64_data = base64(concat_identifiers, concatIdentifiersSize, &b64_size);
@@ -292,21 +272,17 @@
 		free(b64_data);
 		return FUNC_RET_BUFFER_TOO_SMALL;
 	}
-	sprintf(pc_identifier_out, "%.4s-%.4s-%.4s-%.4s", &b64_data[0],
-			&b64_data[4], &b64_data[8], &b64_data[12]);
-	//free(concat_identifiers);
+	sprintf(pc_identifier_out, "%.4s-%.4s-%.4s-%.4s", &b64_data[0], &b64_data[4], &b64_data[8], &b64_data[12]);
+	// free(concat_identifiers);
 	free(b64_data);
 	return FUNC_RET_OK;
 }
 
-FUNCTION_RETURN parity_check_id(PcSignature pc_identifier) {
-	return FUNC_RET_OK;
-}
+FUNCTION_RETURN parity_check_id(PcSignature pc_identifier) { return FUNC_RET_OK; }
 
-FUNCTION_RETURN generate_user_pc_signature(PcSignature identifier_out,
-		IDENTIFICATION_STRATEGY strategy) {
+FUNCTION_RETURN generate_user_pc_signature(PcSignature identifier_out, IDENTIFICATION_STRATEGY strategy) {
 	FUNCTION_RETURN result;
-	PcIdentifier* identifiers;
+	PcIdentifier *identifiers;
 	unsigned int req_buffer_size = 0;
 	result = generate_pc_id(NULL, &req_buffer_size, strategy);
 	if (result != FUNC_RET_OK) {
@@ -316,8 +292,7 @@
 		return FUNC_RET_ERROR;
 	}
 	req_buffer_size = req_buffer_size < 2 ? 2 : req_buffer_size;
-	identifiers = (PcIdentifier *) malloc(
-			sizeof(PcIdentifier) * req_buffer_size);
+	identifiers = (PcIdentifier *)malloc(sizeof(PcIdentifier) * req_buffer_size);
 	memset(identifiers, 0, sizeof(PcIdentifier) * req_buffer_size);
 	result = generate_pc_id(identifiers, &req_buffer_size, strategy);
 	if (result != FUNC_RET_OK) {
@@ -343,40 +318,38 @@
  * @param str_code: the code in the string format XXXX-XXXX-XXXX-XXXX
  * @return
  */
-static FUNCTION_RETURN decode_pc_id(PcIdentifier identifier1_out,
-		PcIdentifier identifier2_out, PcSignature pc_signature_in) {
-	//TODO base62 encoding, now uses base64
+static FUNCTION_RETURN decode_pc_id(PcIdentifier identifier1_out, PcIdentifier identifier2_out,
+									PcSignature pc_signature_in) {
+	// TODO base62 encoding, now uses base64
 
-	unsigned char * concat_identifiers = NULL;
+	unsigned char *concat_identifiers = NULL;
 	char base64ids[17];
 	int identifiers_size;
 
-	sscanf(pc_signature_in, "%4s-%4s-%4s-%4s", &base64ids[0], &base64ids[4],
-			&base64ids[8], &base64ids[12]);
+	sscanf(pc_signature_in, "%4s-%4s-%4s-%4s", &base64ids[0], &base64ids[4], &base64ids[8], &base64ids[12]);
 	concat_identifiers = unbase64(base64ids, 16, &identifiers_size);
 	if (identifiers_size > sizeof(PcIdentifier) * 2) {
 		free(concat_identifiers);
 		return FUNC_RET_BUFFER_TOO_SMALL;
 	}
 	memcpy(identifier1_out, concat_identifiers, sizeof(PcIdentifier));
-	memcpy(identifier2_out, concat_identifiers + sizeof(PcIdentifier),
-			sizeof(PcIdentifier));
+	memcpy(identifier2_out, concat_identifiers + sizeof(PcIdentifier), sizeof(PcIdentifier));
 	free(concat_identifiers);
 	return FUNC_RET_OK;
 }
 
 static IDENTIFICATION_STRATEGY strategy_from_pc_id(PcIdentifier identifier) {
-	return (IDENTIFICATION_STRATEGY) identifier[0] >> 5;
+	return (IDENTIFICATION_STRATEGY)identifier[0] >> 5;
 }
 
 EVENT_TYPE validate_pc_signature(PcSignature str_code) {
 	PcIdentifier user_identifiers[2];
 	FUNCTION_RETURN result;
 	IDENTIFICATION_STRATEGY previous_strategy_id, current_strategy_id;
-	PcIdentifier* calculated_identifiers = NULL;
+	PcIdentifier *calculated_identifiers = NULL;
 	unsigned int calc_identifiers_size = 0;
 	int i = 0, j = 0;
-	//bool found;
+	// bool found;
 #ifdef _DEBUG
 	printf("Comparing pc identifiers: \n");
 #endif
@@ -385,14 +358,14 @@
 		return result;
 	}
 	previous_strategy_id = STRATEGY_UNKNOWN;
-	//found = false;
+	// found = false;
 	for (i = 0; i < 2; i++) {
 		current_strategy_id = strategy_from_pc_id(user_identifiers[i]);
-		if (current_strategy_id == STRATEGY_UNKNOWN && previous_strategy_id == STRATEGY_UNKNOWN && i==1) {
+		if (current_strategy_id == STRATEGY_UNKNOWN && previous_strategy_id == STRATEGY_UNKNOWN && i == 1) {
 			free(calculated_identifiers);
-			printf("Comparing pc identifiers: %d %d %d %s\n",current_strategy_id,previous_strategy_id,i, str_code);
+			printf("Comparing pc identifiers: %d %d %d %s\n", current_strategy_id, previous_strategy_id, i, str_code);
 			return LICENSE_MALFORMED;
-		} else if (current_strategy_id == STRATEGY_UNKNOWN ){
+		} else if (current_strategy_id == STRATEGY_UNKNOWN) {
 			continue;
 		}
 		if (current_strategy_id != previous_strategy_id) {
@@ -401,23 +374,22 @@
 			}
 			previous_strategy_id = current_strategy_id;
 			generate_pc_id(NULL, &calc_identifiers_size, current_strategy_id);
-			calculated_identifiers = (PcIdentifier *) malloc(
-					sizeof(PcIdentifier) * calc_identifiers_size);
+			calculated_identifiers = (PcIdentifier *)malloc(sizeof(PcIdentifier) * calc_identifiers_size);
 			memset(calculated_identifiers, 0, sizeof(PcIdentifier) * calc_identifiers_size);
-			generate_pc_id(calculated_identifiers, &calc_identifiers_size,
-					current_strategy_id);
+			generate_pc_id(calculated_identifiers, &calc_identifiers_size, current_strategy_id);
 		}
-		//maybe skip the byte 0
+		// maybe skip the byte 0
 		for (j = 0; j < calc_identifiers_size; j++) {
 #ifdef _DEBUG
-			printf("generated id: %02x%02x%02x%02x%02x%02x index %d, user_supplied id %02x%02x%02x%02x%02x%02x idx: %d\n",
-					calculated_identifiers[j][0], calculated_identifiers[j][1], calculated_identifiers[j][2],
-					calculated_identifiers[j][3], calculated_identifiers[j][4], calculated_identifiers[j][5], j,
-					user_identifiers[i][0], user_identifiers[i][1], user_identifiers[i][2], user_identifiers[i][3], user_identifiers[i][4], user_identifiers[i][5], i);
+			printf(
+				"generated id: %02x%02x%02x%02x%02x%02x index %d, user_supplied id %02x%02x%02x%02x%02x%02x idx: %d\n",
+				calculated_identifiers[j][0], calculated_identifiers[j][1], calculated_identifiers[j][2],
+				calculated_identifiers[j][3], calculated_identifiers[j][4], calculated_identifiers[j][5], j,
+				user_identifiers[i][0], user_identifiers[i][1], user_identifiers[i][2], user_identifiers[i][3],
+				user_identifiers[i][4], user_identifiers[i][5], i);
 
 #endif
-			if (!memcmp(user_identifiers[i], calculated_identifiers[j],
-					sizeof(PcIdentifier))) {
+			if (!memcmp(user_identifiers[i], calculated_identifiers[j], sizeof(PcIdentifier))) {
 				free(calculated_identifiers);
 				return LICENSE_OK;
 			}
diff --git a/src/library/pc-identifiers.h b/src/library/pc-identifiers.h
index 2d36da8..dee1a52 100644
--- a/src/library/pc-identifiers.h
+++ b/src/library/pc-identifiers.h
@@ -2,12 +2,13 @@
  * pc-identifiers.h
  *
  *  Created on: Apr 16, 2014
- *      
+ *
  */
 
 #ifndef PC_IDENTIFIERS_H_
 #define PC_IDENTIFIERS_H_
-#include "api/datatypes.h"
+
+#include <licensecc/datatypes.h>
 #include "base/base.h"
 
 #ifdef __cplusplus
diff --git a/src/templates/licensecc_properties.h.in b/src/templates/licensecc_properties.h.in
index 52b7d98..8c92c93 100644
--- a/src/templates/licensecc_properties.h.in
+++ b/src/templates/licensecc_properties.h.in
@@ -1,6 +1,7 @@
 #ifndef BUILD_PROPERTIES_H_
 #define BUILD_PROPERTIES_H_
 
+#define LCC_PROJECT_NAME "@LCC_PROJECT_NAME@"
 #define PROJECT_INT_VERSION @LICENSECC_INT_VERSION@
 #define PROJECT_VERSION "@LICENSECC_VERSION@"
 
@@ -11,6 +12,11 @@
 #define LICENSE_LOCATION_ENV_VAR "LICENSE_LOCATION"
 #define LICENSE_DATA_ENV_VAR "LICENSE_DATA"
 
+//define api structure sizes
+#define PC_IDENTIFIER_SIZE 18
+#define PROPRIETARY_DATA_SIZE 16
+#define AUDIT_EVENT_NUM 5
+
 //Internal data structures limits
 #define MAX_LICENSE_LENGTH 256*1024
 
diff --git a/src/templates/licensecc_properties_test.h.in b/src/templates/licensecc_properties_test.h.in
index ce2eabe..071b788 100644
--- a/src/templates/licensecc_properties_test.h.in
+++ b/src/templates/licensecc_properties_test.h.in
@@ -8,6 +8,20 @@
 #define PROJECT_TEST_SRC_DIR "@CMAKE_SOURCE_DIR@/test"
 #define PROJECT_TEST_TEMP_DIR "@CMAKE_BINARY_DIR@/Testing/Temporary"
 #define BUILD_TYPE "@CMAKE_BUILD_TYPE@"
-#define LCC_EXE "@LCC_EXECUTABLE@"
+#define LCC_EXE "$<TARGET_FILE:license_generator::lcc>"
+
+#define LCC_TEST_LICENSES_PROJECT "@CMAKE_BINARY_DIR@/Testing/Temporary/@LCC_PROJECT_NAME@"
+#define LCC_LICENSES_BASE LCC_TEST_LICENSES_PROJECT "/licenses"
+#define LCC_PROJECTS_BASE_DIR "@LCC_PROJECTS_BASE_DIR@"
+#define LCC_PROJECT_PRIVATE_KEY "@LCC_PROJECT_PRIVATE_KEY@"
+
+/*
+ * command line parameters 
+ */
+#define PARAM_BASE64 "base64"
+#define PARAM_LICENSE_NAME "license-name"
+#define PARAM_PRODUCT_NAME "product-name"
+#define PARAM_PROJECT_FOLDER "project-folder"
+#define PARAM_PRIMARY_KEY "primary-key"
 
 #endif
diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt
index 7f2bae9..d790c3f 100644
--- a/test/CMakeLists.txt
+++ b/test/CMakeLists.txt
@@ -1,7 +1,17 @@
 #if we're here boost has been found
+add_definitions(-DBOOST_ALL_NO_LIB) #Disable Boost Microsoft magic, all dependencies are handled by cmake
+add_definitions(-DBOOST_LIB_DIAGNOSTIC) #Check it is really disabled
 include_directories(${Boost_INCLUDE_DIR})
 include_directories(${CMAKE_CURRENT_BINARY_DIR})
 link_directories ( ${Boost_LIBRARY_DIR} )
 
+configure_file (
+	"${CMAKE_CURRENT_SOURCE_DIR}/../src/templates/licensecc_properties_test.h.in" 
+	"${CMAKE_BINARY_DIR}/licensecc_properties_test.h.tmp"
+)
+
+file(GENERATE OUTPUT "${CMAKE_BINARY_DIR}/licensecc_properties_test.h" 
+		INPUT "${CMAKE_BINARY_DIR}/licensecc_properties_test.h.tmp")
+		
 add_subdirectory(library)
-#add_subdirectory(functional)
\ No newline at end of file
+add_subdirectory(functional)
\ No newline at end of file
diff --git a/test/functional/CMakeLists.txt b/test/functional/CMakeLists.txt
index 0dd0a42..8143ef5 100644
--- a/test/functional/CMakeLists.txt
+++ b/test/functional/CMakeLists.txt
@@ -32,6 +32,19 @@
 )
 
 add_executable(
+ test_signature_verifier
+ signature_verifier_test.cpp
+)
+
+target_link_libraries(
+ test_signature_verifier
+ licensecc_static
+ license_generator_snippet
+ ${Boost_LIBRARIES}
+)
+
+
+add_executable(
  test_volid
  volid_test.cpp
 )
@@ -43,16 +56,10 @@
  ${Boost_LIBRARIES}
 )
 
-#set CROSSCOMPILING_EMULATOR
-IF( ( CMAKE_HOST_SYSTEM_NAME STREQUAL "Linux") AND CMAKE_CROSSCOMPILING)
-#binfmt_misc doesn't work in my system :(
-	ADD_TEST(NAME test_standard_license COMMAND wine ${CMAKE_CURRENT_BINARY_DIR}/test_standard_license WORKING_DIRECTORY ${CMAKE_BINARY_DIR})
-	ADD_TEST(NAME test_date COMMAND wine ${CMAKE_CURRENT_BINARY_DIR}/test_date WORKING_DIRECTORY ${CMAKE_BINARY_DIR})
-	ADD_TEST(NAME test_volid COMMAND wine ${CMAKE_CURRENT_BINARY_DIR}/test_volid WORKING_DIRECTORY ${CMAKE_BINARY_DIR})
-ELSE()
-	ADD_TEST(NAME test_standard_license COMMAND test_standard_license WORKING_DIRECTORY ${CMAKE_BINARY_DIR})
-	ADD_TEST(NAME test_date COMMAND test_date WORKING_DIRECTORY ${CMAKE_BINARY_DIR})
-	ADD_TEST(NAME test_volid COMMAND test_volid WORKING_DIRECTORY ${CMAKE_BINARY_DIR})
-ENDIF()
+
+ADD_TEST(NAME test_date COMMAND test_date WORKING_DIRECTORY ${CMAKE_BINARY_DIR})
+ADD_TEST(NAME test_standard_license COMMAND test_standard_license WORKING_DIRECTORY ${CMAKE_BINARY_DIR})
+ADD_TEST(NAME test_signature_verifier COMMAND test_signature_verifier WORKING_DIRECTORY ${CMAKE_BINARY_DIR})
+ADD_TEST(NAME test_volid COMMAND test_volid WORKING_DIRECTORY ${CMAKE_BINARY_DIR})
 
 
diff --git a/test/functional/date_test.cpp b/test/functional/date_test.cpp
index 44a9911..2c9c43d 100644
--- a/test/functional/date_test.cpp
+++ b/test/functional/date_test.cpp
@@ -3,9 +3,10 @@
 #include <boost/test/unit_test.hpp>
 #include <boost/filesystem.hpp>
 
-#include <build_properties.h>
-#include "../../src/tools/license-generator/license-generator.h"
-#include "../../src/library/api/license++.h"
+#include <licensecc_properties.h>
+#include <licensecc_properties_test.h>
+
+#include <licensecc/licensecc.h>
 #include "../../src/library/ini/SimpleIni.h"
 #include "generate-license.h"
 
@@ -13,9 +14,10 @@
 using namespace license;
 using namespace std;
 
+namespace license {
 namespace test {
 
-BOOST_AUTO_TEST_CASE( license_not_expired ) {
+BOOST_AUTO_TEST_CASE(license_not_expired) {
 	const string licLocation(PROJECT_TEST_TEMP_DIR "/not_expired.lic");
 	vector<string> extraArgs;
 	extraArgs.push_back("-e");
@@ -26,14 +28,13 @@
 	LicenseLocation licenseLocation;
 	licenseLocation.licenseFileLocation = licLocation.c_str();
 	licenseLocation.licenseData = "";
-	const EVENT_TYPE result = acquire_license("TEST", &licenseLocation,
-			&license);
+	const EVENT_TYPE result = acquire_license(nullptr, &licenseLocation, &license);
 	BOOST_CHECK_EQUAL(result, LICENSE_OK);
 	BOOST_CHECK_EQUAL(license.has_expiry, true);
 	BOOST_CHECK_EQUAL(license.linked_to_pc, false);
 }
 
-BOOST_AUTO_TEST_CASE( license_expired ) {
+BOOST_AUTO_TEST_CASE(license_expired) {
 	const string licLocation(PROJECT_TEST_TEMP_DIR "/expired.lic");
 	remove(licLocation.c_str());
 	vector<string> extraArgs;
@@ -46,11 +47,11 @@
 	licenseLocation.licenseFileLocation = licLocation.c_str();
 	licenseLocation.licenseData = nullptr;
 	BOOST_TEST_MESSAGE("before acquire license");
-	const EVENT_TYPE result = acquire_license("TEST", &licenseLocation,
-			&license);
+	const EVENT_TYPE result = acquire_license(nullptr, &licenseLocation, &license);
 	BOOST_CHECK_EQUAL(result, PRODUCT_EXPIRED);
 	BOOST_CHECK_EQUAL(license.has_expiry, true);
 	BOOST_CHECK_EQUAL(license.linked_to_pc, false);
 }
 
-}
+}  // namespace test
+}  // namespace license
diff --git a/test/functional/generate-license.cpp b/test/functional/generate-license.cpp
index 7f81722..b41ff66 100644
--- a/test/functional/generate-license.cpp
+++ b/test/functional/generate-license.cpp
@@ -6,36 +6,78 @@
  */
 
 #include <boost/test/unit_test.hpp>
-#include <build_properties.h>
 #include <boost/filesystem.hpp>
+#include <sstream>
+#include <iostream>
 
-#include "../../src/tools/license-generator/license-generator.h"
+#include <licensecc_properties_test.h>
+
+#include "../../src/library/base/base.h"
 #include "../../src/library/ini/SimpleIni.h"
 #include "generate-license.h"
 
 namespace fs = boost::filesystem;
-using namespace license;
 using namespace std;
-
-void generate_license(const string& fname, const vector<string>& other_args) {
-	remove(fname.c_str());
-	const int argc = 4+other_args.size();
-	const char** argv = new const char*[argc + 1];
-	unsigned int i=0;
-	argv[i++] = "lic-generator";
-	for(;i<=other_args.size();i++){
-		argv[i] = other_args[i-1].c_str();
+namespace license {
+namespace test {
+string generate_license(const string& license_name, const vector<string>& other_args) {
+	fs::path lcc_exe(LCC_EXE);
+	BOOST_REQUIRE_MESSAGE(fs::is_regular_file(lcc_exe), "License generator not found: " LCC_EXE);
+	fs::path licenses_base(LCC_LICENSES_BASE);
+	if (!fs::exists(licenses_base)) {
+		BOOST_REQUIRE_MESSAGE(fs::create_directories(licenses_base), "test folders created " + licenses_base.string());
 	}
-	argv[i++] = "-o";
-	argv[i++] = fname.c_str();
-	argv[i++] = "TEST";
-	const int retCode = LicenseGenerator::generateLicense(argc, argv);
-	delete[] (argv);
+
+	fs::path license_fname(licenses_base / (license_name + ".lic"));
+	remove(license_fname.c_str());
+
+	stringstream ss;
+	ss << LCC_EXE << " license issue";
+	ss << " --" PARAM_PRIMARY_KEY " " << LCC_PROJECT_PRIVATE_KEY;
+	ss << " --" PARAM_LICENSE_NAME " " << license_name;
+	ss << " --" PARAM_PROJECT_FOLDER " " << LCC_TEST_LICENSES_PROJECT;
+
+	for (int i = 0; i < other_args.size(); i++) {
+		ss << " " << other_args[i];
+	}
+	cout << "executing :" << ss.str() << endl;
+	const int retCode = std::system(ss.str().c_str());
 	BOOST_CHECK_EQUAL(retCode, 0);
-	BOOST_ASSERT(fs::exists(fname));
+	BOOST_ASSERT(fs::exists(license_fname));
 	CSimpleIniA ini;
-	const SI_Error rc = ini.LoadFile(fname.c_str());
-	BOOST_CHECK_GE(rc,0);
-	const int sectionSize = ini.GetSectionSize("TEST");
-	BOOST_CHECK_GT(sectionSize,0);
+	const SI_Error rc = ini.LoadFile(license_fname.c_str());
+	BOOST_CHECK_GE(rc, 0);
+	const int sectionSize = ini.GetSectionSize("DEFAULT");
+	BOOST_CHECK_GT(sectionSize, 0);
+	return license_fname.string();
 }
+
+string sign_data(const string& data, const string& test_name) {
+	fs::path lcc_exe(LCC_EXE);
+	BOOST_REQUIRE_MESSAGE(fs::is_regular_file(lcc_exe), "License generator not found: " LCC_EXE);
+	fs::path licenses_base(LCC_LICENSES_BASE);
+	if (!fs::exists(licenses_base)) {
+		BOOST_REQUIRE_MESSAGE(fs::create_directories(licenses_base), "test folders created " + licenses_base.string());
+	}
+
+	fs::path outputFile(fs::path(PROJECT_TEST_TEMP_DIR) / (test_name + ".tmp"));
+
+	remove(outputFile.c_str());
+
+	stringstream ss;
+	ss << LCC_EXE << " test sign";
+	ss << " --" PARAM_PRIMARY_KEY " " << LCC_PROJECT_PRIVATE_KEY;
+	ss << " -d " << data;
+	ss << " -o " << outputFile.string();
+
+	cout << "executing :" << ss.str() << endl;
+	const int retCode = std::system(ss.str().c_str());
+	BOOST_CHECK_EQUAL(retCode, 0);
+	BOOST_ASSERT(fs::exists(outputFile));
+	std::ifstream ifs(outputFile.c_str());
+	std::string content((std::istreambuf_iterator<char>(ifs)), (std::istreambuf_iterator<char>()));
+	return content;
+}
+
+}  // namespace test
+}  // namespace license
diff --git a/test/functional/generate-license.h b/test/functional/generate-license.h
index 4c1dcc0..28fba23 100644
--- a/test/functional/generate-license.h
+++ b/test/functional/generate-license.h
@@ -1,5 +1,11 @@
-#include<string>
-#include<vector>
+#include <string>
+#include <vector>
 
-using namespace std;
-void generate_license(const string& fname, const vector<string>& other_args);
+namespace license {
+namespace test {
+
+std::string generate_license(const std::string& fname, const std::vector<std::string>& other_args);
+std::string sign_data(const std::string& data, const std::string& test_name);
+
+}  // namespace test
+}  // namespace license
diff --git a/test/functional/hijiaking_test.cpp b/test/functional/hijiaking_test.cpp
index b4871b1..d18b84d 100644
--- a/test/functional/hijiaking_test.cpp
+++ b/test/functional/hijiaking_test.cpp
@@ -5,7 +5,7 @@
 #include <boost/test/unit_test.hpp>
 
 #include "../../src/tools/license-generator/license-generator.h"
-#include "../../src/library/api/license++.h"
+#include <licensecc/licensecc.h>
 #include "../../src/library/ini/SimpleIni.h"
 #include "generate-license.h"
 
diff --git a/test/functional/signature_verifier_test.cpp b/test/functional/signature_verifier_test.cpp
new file mode 100644
index 0000000..709f7fc
--- /dev/null
+++ b/test/functional/signature_verifier_test.cpp
@@ -0,0 +1,46 @@
+/*
+ * LicenseVerifier_test.cpp
+ *
+ *  Created on: Nov 17, 2019
+ *      Author: GC
+ */
+#define BOOST_TEST_MODULE test_signature_verifier
+
+#include <boost/test/unit_test.hpp>
+#include <licensecc_properties_test.h>
+#include <licensecc_properties.h>
+
+#include "../../src/library/os/signature_verifier.h"
+#include "generate-license.h"
+
+namespace license {
+namespace test {
+using namespace std;
+
+BOOST_AUTO_TEST_CASE(verify_signature_ok) {
+	const string test_data("test_data");
+	const string signature = sign_data(test_data, string("verify_signature"));
+
+	FUNCTION_RETURN result = license::verify_signature(test_data, signature);
+	BOOST_CHECK_MESSAGE(result == FUNC_RET_OK, "signature verified");
+}
+
+BOOST_AUTO_TEST_CASE(verify_signature_data_mismatch) {
+	const string test_data("test_data");
+	const string signature = sign_data(test_data, string("verify_signature"));
+
+	FUNCTION_RETURN result = license::verify_signature(string("other data"), signature);
+	BOOST_CHECK_MESSAGE(result == FUNC_RET_ERROR, "signature NOT verified");
+}
+
+BOOST_AUTO_TEST_CASE(verify_signature_modified) {
+	const string test_data("test_data");
+	string signature = sign_data(test_data, string("verify_signature"));
+	signature[2] = signature[2] + 1;
+	FUNCTION_RETURN result = license::verify_signature(test_data, signature);
+	BOOST_CHECK_MESSAGE(result == FUNC_RET_ERROR, "signature NOT verified");
+}
+
+}  // namespace test
+
+} /* namespace license */
diff --git a/test/functional/standard-license_test.cpp b/test/functional/standard-license_test.cpp
index b30d690..0378607 100644
--- a/test/functional/standard-license_test.cpp
+++ b/test/functional/standard-license_test.cpp
@@ -3,29 +3,29 @@
 #include <boost/test/unit_test.hpp>
 #include <boost/filesystem.hpp>
 
-#include "../../src/tools/license-generator/license-generator.h"
-#include "../../src/library/api/license++.h"
-#include <build_properties.h>
+#include <licensecc/licensecc.h>
+#include <licensecc_properties_test.h>
+#include <licensecc_properties.h>
+
 #include "../../src/library/ini/SimpleIni.h"
 #include "generate-license.h"
 #include "../../src/library/base/FileUtils.hpp"
 
+namespace license {
 namespace test {
 namespace fs = boost::filesystem;
 using namespace license;
 using namespace std;
 
 BOOST_AUTO_TEST_CASE( standard_lic_file ) {
-	const string licLocation(PROJECT_TEST_TEMP_DIR "/standard_license.lic");
 	const vector<string> extraArgs;
-	generate_license(licLocation, extraArgs);
+	const string licLocation = generate_license("standard_license", extraArgs);
 	/* */
 	LicenseInfo license;
 	LicenseLocation licenseLocation;
 	licenseLocation.licenseFileLocation = licLocation.c_str();
 	licenseLocation.licenseData = nullptr;
-	const EVENT_TYPE result = acquire_license("TEST", &licenseLocation,
-			&license);
+	const EVENT_TYPE result = acquire_license(nullptr, &licenseLocation, &license);
 	BOOST_CHECK_EQUAL(result, LICENSE_OK);
 	BOOST_CHECK_EQUAL(license.has_expiry, false);
 	BOOST_CHECK_EQUAL(license.linked_to_pc, false);
@@ -34,36 +34,38 @@
 /**
  * Pass the license data to the application.
  */
-BOOST_AUTO_TEST_CASE( b64_environment_variable ) {
-	const string licLocation(PROJECT_TEST_TEMP_DIR "/standard_env_license.lic");
-	const vector<string> extraArgs;
-	generate_license(licLocation, extraArgs);
-	const string licensestr(license::get_file_contents(licLocation.c_str(), MAX_LICENSE_LENGTH));
-	/* */
-	LicenseInfo license;
-	LicenseLocation licenseLocation;
-	licenseLocation.licenseFileLocation = nullptr;
-	licenseLocation.licenseData = licensestr.c_str();
-	const EVENT_TYPE result = acquire_license("TEST", &licenseLocation,
-			&license);
-	BOOST_CHECK_EQUAL(result, LICENSE_OK);
-	BOOST_CHECK_EQUAL(license.has_expiry, false);
-	BOOST_CHECK_EQUAL(license.linked_to_pc, false);
-}
 
-BOOST_AUTO_TEST_CASE( pc_identifier ) {
-	const string licLocation(PROJECT_TEST_TEMP_DIR "/pc_identifier.lic");
-	const vector<string> extraArgs = { "-s", "Jaaa-aaaa-MG9F-ZhB1" };
-	generate_license(licLocation, extraArgs);
-
-	LicenseInfo license;
-	LicenseLocation licenseLocation;
-	licenseLocation.licenseFileLocation = licLocation.c_str();
-	licenseLocation.licenseData = "";
-	const EVENT_TYPE result = acquire_license("TEST", &licenseLocation,
-			&license);
-	BOOST_CHECK_EQUAL(result, IDENTIFIERS_MISMATCH);
-	BOOST_CHECK_EQUAL(license.has_expiry, false);
-	BOOST_CHECK_EQUAL(license.linked_to_pc, true);
+// BOOST_AUTO_TEST_CASE( b64_environment_variable ) {
+//	const string licLocation(PROJECT_TEST_TEMP_DIR "/standard_env_license.lic");
+//	const vector<string> extraArgs;
+//	generate_license(licLocation, extraArgs);
+//	const string licensestr(license::get_file_contents(licLocation.c_str(), MAX_LICENSE_LENGTH));
+//	/* */
+//	LicenseInfo license;
+//	LicenseLocation licenseLocation;
+//	licenseLocation.licenseFileLocation = nullptr;
+//	licenseLocation.licenseData = licensestr.c_str();
+//	const EVENT_TYPE result = acquire_license("TEST", &licenseLocation,
+//			&license);
+//	BOOST_CHECK_EQUAL(result, LICENSE_OK);
+//	BOOST_CHECK_EQUAL(license.has_expiry, false);
+//	BOOST_CHECK_EQUAL(license.linked_to_pc, false);
+//}
+//
+// BOOST_AUTO_TEST_CASE( pc_identifier ) {
+//	const string licLocation(PROJECT_TEST_TEMP_DIR "/pc_identifier.lic");
+//	const vector<string> extraArgs = { "-s", "Jaaa-aaaa-MG9F-ZhB1" };
+//	generate_license(licLocation, extraArgs);
+//
+//	LicenseInfo license;
+//	LicenseLocation licenseLocation;
+//	licenseLocation.licenseFileLocation = licLocation.c_str();
+//	licenseLocation.licenseData = "";
+//	const EVENT_TYPE result = acquire_license("TEST", &licenseLocation,
+//			&license);
+//	BOOST_CHECK_EQUAL(result, IDENTIFIERS_MISMATCH);
+//	BOOST_CHECK_EQUAL(license.has_expiry, false);
+//	BOOST_CHECK_EQUAL(license.linked_to_pc, true);
+//}
 }
-}
+}  // namespace license
diff --git a/test/functional/volid_test.cpp b/test/functional/volid_test.cpp
index cdd00bc..71bcb02 100644
--- a/test/functional/volid_test.cpp
+++ b/test/functional/volid_test.cpp
@@ -2,23 +2,27 @@
 
 #include <boost/test/unit_test.hpp>
 #include <fstream>
+#include <iostream>
 #include <stdio.h>
 #include <cstring>
-#include "../../src/tools/license-generator/license-generator.h"
-#include "../../src/library/api/license++.h"
 #include <boost/filesystem.hpp>
 #include <licensecc_properties.h>
 #include <licensecc_properties_test.h>
+
+#include <licensecc/licensecc.h>
 #include "../../src/library/ini/SimpleIni.h"
-#include "generate-license.h"
 #include "../../src/library/pc-identifiers.h"
+#include "../../src/library/os/os.h"
+#include "generate-license.h"
 
 namespace fs = boost::filesystem;
 using namespace license;
 using namespace std;
 
+namespace license {
+namespace test {
+
 BOOST_AUTO_TEST_CASE( default_volid_lic_file ) {
-	const string licLocation(PROJECT_TEST_TEMP_DIR "/volid_license.lic");
 	PcSignature identifier_out;
 
 	const IDENTIFICATION_STRATEGY strategy = IDENTIFICATION_STRATEGY::ETHERNET;
@@ -32,13 +36,13 @@
 	extraArgs.push_back("-s");
 	extraArgs.push_back(identifier_out);
 	BOOST_TEST_CHECKPOINT("Before generate license");
-	generate_license(licLocation, extraArgs);
+	const string licLocation = generate_license("volid_license", extraArgs);
 
 	LicenseInfo license;
 	LicenseLocation licenseLocation;
 	licenseLocation.licenseFileLocation = licLocation.c_str();
 	licenseLocation.licenseData = "";
-	const EVENT_TYPE result = acquire_license("TEST", &licenseLocation, &license);
+	const EVENT_TYPE result = acquire_license(nullptr, &licenseLocation, &license);
 	BOOST_CHECK_EQUAL(result, LICENSE_OK);
 	BOOST_CHECK_EQUAL(license.has_expiry, false);
 	BOOST_CHECK_EQUAL(license.linked_to_pc, true);
@@ -137,3 +141,5 @@
 	}
 }
 
+}  // namespace test
+}  // namespace license
diff --git a/test/library/CMakeLists.txt b/test/library/CMakeLists.txt
index d10f25d..dfb681a 100644
--- a/test/library/CMakeLists.txt
+++ b/test/library/CMakeLists.txt
@@ -70,17 +70,3 @@
 ELSE()
 	ADD_TEST(NAME test_event_registry COMMAND test_event_registry)
 ENDIF()
-
-### verifier tests
-add_executable(
- test_verifier
- verifier_test.cpp
-)
-
-target_link_libraries(
- test_verifier
- base
- ${Boost_LIBRARIES}
-)
-
-ADD_TEST(NAME test_verifier COMMAND test_verfier)
\ No newline at end of file
diff --git a/test/library/LicenseReader_test.cpp b/test/library/LicenseReader_test.cpp
index b064acc..03ea2e8 100644
--- a/test/library/LicenseReader_test.cpp
+++ b/test/library/LicenseReader_test.cpp
@@ -7,8 +7,8 @@
 
 #include <licensecc_properties.h>
 #include <licensecc_properties_test.h>
+#include <licensecc/datatypes.h>
 
-#include "../../src/library/api/datatypes.h"
 #include "../../src/library/base/EventRegistry.h"
 #include "../../src/library/os/os.h"
 #include "../../src/library/LicenseReader.hpp"
diff --git a/test/library/license_verifier_test.cpp b/test/library/license_verifier_test.cpp
new file mode 100644
index 0000000..50bd9d3
--- /dev/null
+++ b/test/library/license_verifier_test.cpp
@@ -0,0 +1,10 @@
+/*
+ * LicenseVerifier_test.cpp
+ *
+ *  Created on: Nov 20, 2019
+ *      Author: devel
+ */
+
+#include "LicenseVerifier.hpp"
+
+namespace license {} /* namespace license */
diff --git a/test/library/verifier_test.cpp b/test/library/verifier_test.cpp
deleted file mode 100644
index 19643e9..0000000
--- a/test/library/verifier_test.cpp
+++ /dev/null
@@ -1,27 +0,0 @@
-/*
- * verifier_test.cpp
- *
- *  Created on: Nov 16, 2019
- *      Author: GC
- */
-#define BOOST_TEST_MODULE "test_verifier"
-
-#include <iostream>
-#include <iterator>
-
-#include <fstream>
-#include <string>
-#include <vector>
-
-#include <boost/filesystem.hpp>
-#include <boost/optional.hpp>
-#include <boost/test/unit_test.hpp>
-#include <stdlib.h>
-#include <cstdio>
-
-#include "../../src/library/os/verifier.hpp"
-
-namespace license {
-
-BOOST_AUTO_TEST_CASE(verify_string) {}
-} /* namespace license */

--
Gitblit v1.9.1