From 8d9e0ccbd762efb9efdd12a2192ddfea9fdb38e5 Mon Sep 17 00:00:00 2001
From: Gabriele Contini <contini.mailing@gmail.com>
Date: 周三, 01 1月 2020 20:22:21 +0800
Subject: [PATCH] add magic number

---
 src/templates/licensecc_properties.h.in |    4 +
 src/library/limits/license_verifier.cpp |   28 +++++++------
 src/CMakeLists.txt                      |   11 ++++-
 test/functional/crack_test.cpp          |   38 +++++++++++++++++++
 4 files changed, 64 insertions(+), 17 deletions(-)

diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt
index 02e47aa..1c14fc3 100644
--- a/src/CMakeLists.txt
+++ b/src/CMakeLists.txt
@@ -1,7 +1,12 @@
-add_subdirectory("library")
-
 #for no reason overwrite it (maybe it's manually customized)
+
+IF (NOT LCC_PROJECT_MAGIC_NUM) 
+	set(LCC_PROJECT_MAGIC_NUM 0)  
+ENDIF (NOT LCC_PROJECT_MAGIC_NUM)
+
 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
+ENDIF(NOT EXISTS "${LCC_INCLUDE_DIR}/licensecc_properties.h")
+
+add_subdirectory("library")
\ No newline at end of file
diff --git a/src/library/limits/license_verifier.cpp b/src/library/limits/license_verifier.cpp
index 38abbeb..86ff3a1 100644
--- a/src/library/limits/license_verifier.cpp
+++ b/src/library/limits/license_verifier.cpp
@@ -6,11 +6,12 @@
  */
 #include <cmath>
 #include <algorithm>
+#include <licensecc_properties.h>
 
 #include "license_verifier.hpp"
+#include "../pc_identifier_facade.hpp"
 #include "../os/signature_verifier.h"
 #include "../base/StringUtils.h"
-#include "../pc-identifiers.h"
 
 namespace license {
 using namespace std;
@@ -34,10 +35,13 @@
 
 // TODO: split in different classes
 FUNCTION_RETURN LicenseVerifier::verify_limits(const FullLicenseInfo& licInfo) {
-	bool is_valid = true;
-	const time_t now = time(nullptr);
+	bool is_valid = VERIFY_MAGIC;
+	if (!is_valid) {
+		m_event_registry.addEvent(LICENSE_CORRUPTED, licInfo.source.c_str());
+	}
+	const const time_t now = time(nullptr);
 	auto expiry = licInfo.m_limits.find(PARAM_EXPIRY_DATE);
-	if (expiry != licInfo.m_limits.end()) {
+	if (is_valid && expiry != licInfo.m_limits.end()) {
 		if (seconds_from_epoch(expiry->second) < now) {
 			/*
 						eventRegistryOut.addEvent(PRODUCT_EXPIRED, source.c_str(),
@@ -46,7 +50,7 @@
 			is_valid = false;
 		}
 	}
-	auto start_date = licInfo.m_limits.find(PARAM_BEGIN_DATE);
+	const 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) > now) {
 			/*eventRegistryOut.addEvent(PRODUCT_EXPIRED, source.c_str(),
@@ -56,11 +60,9 @@
 			is_valid = false;
 		}
 	}
-	auto client_sig = licInfo.m_limits.find(PARAM_CLIENT_SIGNATURE);
+	const 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);
+		const EVENT_TYPE event = PcIdentifierFacade::validate_pc_signature(client_sig->second);
 		m_event_registry.addEvent(event, licInfo.source);
 		is_valid = is_valid && (event == LICENSE_OK);
 	}
@@ -71,7 +73,7 @@
 	LicenseInfo info;
 	info.license_type = LOCAL;
 
-	auto expiry = fullLicInfo.m_limits.find(PARAM_EXPIRY_DATE);
+	const 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;
@@ -83,14 +85,14 @@
 		info.expiry_date[0] = '\0';
 	}
 
-	auto start_date = fullLicInfo.m_limits.find(PARAM_BEGIN_DATE);
+	const 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);
+	const 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);
+	const 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);
 	}
diff --git a/src/templates/licensecc_properties.h.in b/src/templates/licensecc_properties.h.in
index c1af888..6839823 100644
--- a/src/templates/licensecc_properties.h.in
+++ b/src/templates/licensecc_properties.h.in
@@ -12,6 +12,8 @@
 #define LICENSE_DATA_ENV_VAR "LICENSE_DATA"
 
 //Internal data structures limits
-#define MAX_LICENSE_LENGTH 256*1024
+#define MAX_LICENSE_LENGTH 256 * 1024
+
+#define VERIFY_MAGIC (lic_info.m_magic == @LCC_PROJECT_MAGIC_NUM@)
 
 #endif
diff --git a/test/functional/crack_test.cpp b/test/functional/crack_test.cpp
new file mode 100644
index 0000000..bb437d7
--- /dev/null
+++ b/test/functional/crack_test.cpp
@@ -0,0 +1,38 @@
+#define BOOST_TEST_MODULE standard_license_test
+
+#include <boost/test/unit_test.hpp>
+#include <boost/filesystem.hpp>
+
+#include <licensecc/licensecc.h>
+#include <licensecc_properties_test.h>
+#include <licensecc_properties.h>
+#include <iostream>
+#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;
+
+/**
+ * Test a generic license, passing a bad license number trough the api.
+ * see projects/DEFAULT/include/licensecc/DEFAULT/licensecc_properties.h (magic should be 0)
+ */
+BOOST_AUTO_TEST_CASE(test_bad_magic_number) {
+	const vector<string> extraArgs;
+	const string licLocation = generate_license("standard_license", extraArgs);
+	/* */
+	LicenseInfo license;
+	LicenseLocation location = {LICENSE_PATH};
+	std::copy(licLocation.begin(), licLocation.end(), location.licenseData);
+	// magic should be 0 for this build...
+	CallerInformations callInfo{{0}, {0}, 42};
+	const EVENT_TYPE result = acquire_license(&callInfo, &location, &license);
+	BOOST_CHECK_EQUAL(result, LICENSE_CORRUPTED);
+}
+
+}  // namespace test
+}  // namespace license

--
Gitblit v1.9.1