From ec3965cbc675c4546185caa847cb83191e1a3fcb Mon Sep 17 00:00:00 2001
From: Maximilien Siavelis <maximilien.siavelis@simulease.com>
Date: 周六, 06 1月 2018 19:54:45 +0800
Subject: [PATCH] refactor to fix MINGW consistency

---
 src/library/CMakeLists.txt    |   10 
 /dev/null                     |   11 -
 src/library/os/os-win.c       |  100 ------------
 src/library/os/os-linux.c     |   96 -----------
 src/library/os/network_id.c   |    2 
 src/library/os/os.c           |  195 ++++++++++++++++++++++++
 src/library/os/CMakeLists.txt |   18 ++
 7 files changed, 225 insertions(+), 207 deletions(-)

diff --git a/src/library/CMakeLists.txt b/src/library/CMakeLists.txt
index f9c58dd..1b679f5 100644
--- a/src/library/CMakeLists.txt
+++ b/src/library/CMakeLists.txt
@@ -1,10 +1,6 @@
-IF(WIN32)
-    add_subdirectory("os/win")
-ELSE(WIN32)
-    add_subdirectory("os/linux")    
-ENDIF(WIN32)
-add_subdirectory("base") 
-add_subdirectory("ini")   
+add_subdirectory("os")
+add_subdirectory("base")
+add_subdirectory("ini")
 
 ADD_LIBRARY(license++_static STATIC
     license++.cpp
diff --git a/src/library/os/CMakeLists.txt b/src/library/os/CMakeLists.txt
new file mode 100644
index 0000000..45b1cd5
--- /dev/null
+++ b/src/library/os/CMakeLists.txt
@@ -0,0 +1,18 @@
+IF(WIN32)
+    ADD_LIBRARY(os STATIC
+        os.c
+        os-win.c)
+ELSE(WIN32)
+    ADD_LIBRARY(os STATIC
+        os.c
+        os-linux.c
+        network_id.c)
+ENDIF(WIN32)
+
+target_link_libraries(
+     os
+     base
+     ${EXTERNAL_LIBS}
+)
+
+install(TARGETS os ARCHIVE DESTINATION lib)
diff --git a/src/library/os/linux/CMakeLists.txt b/src/library/os/linux/CMakeLists.txt
deleted file mode 100644
index 690f989..0000000
--- a/src/library/os/linux/CMakeLists.txt
+++ /dev/null
@@ -1,12 +0,0 @@
-ADD_LIBRARY(os STATIC
-	os-linux.c
-	network_id.c
-)
-
-target_link_libraries(
-     os
-     base
-     ${EXTERNAL_LIBS}
-)
-
-install(TARGETS os ARCHIVE DESTINATION lib)
diff --git a/src/library/os/linux/network_id.c b/src/library/os/network_id.c
similarity index 99%
rename from src/library/os/linux/network_id.c
rename to src/library/os/network_id.c
index 4880bb1..1c112b2 100644
--- a/src/library/os/linux/network_id.c
+++ b/src/library/os/network_id.c
@@ -25,7 +25,7 @@
 #include <string.h>
 #include <stdio.h>
 
-#include "../os.h"
+#include "os.h"
 
 /**
  *
diff --git a/src/library/os/linux/os-linux.c b/src/library/os/os-linux.c
similarity index 74%
rename from src/library/os/linux/os-linux.c
rename to src/library/os/os-linux.c
index 79ec0e5..717373a 100644
--- a/src/library/os/linux/os-linux.c
+++ b/src/library/os/os-linux.c
@@ -1,29 +1,15 @@
-#include <stdio.h>
-#include <ctype.h>
-#include <stdlib.h>
-#include <unistd.h>
-
-#include <valgrind/memcheck.h>
 #include <paths.h>
-
-#include <stdlib.h>
-#include <stddef.h>
-#include <string.h>
-#include <unistd.h>
-#include <sys/ioctl.h>
 #include <sys/stat.h>
-#include "../os.h"
-#include "public-key.h"
-#include "../../base/logger.h"
+#include "os.h"
+#include "../base/logger.h"
 
-#include <openssl/evp.h>
-#include <openssl/bio.h>
+//#include <openssl/evp.h>
+//#include <openssl/bio.h>
 #include <openssl/pem.h>
 #include <openssl/err.h>
 
 #include <mntent.h>
 #include <dirent.h>
-#include <stdio.h>
 
 #include <sys/utsname.h>
 #ifdef USE_DBUS
@@ -310,79 +296,5 @@
 	} else {
 		result = FUNC_RET_ERROR;
 	}
-	return result;
-}
-
-static void free_resources(EVP_PKEY* pkey, EVP_MD_CTX* mdctx) {
-	if (pkey) {
-		EVP_PKEY_free(pkey);
-	}
-	if (mdctx) {
-		EVP_MD_CTX_destroy(mdctx);
-	}
-}
-
-FUNCTION_RETURN verifySignature(const char* stringToVerify,
-		const char* signatureB64) {
-	EVP_MD_CTX *mdctx = NULL;
-	const char *pubKey = PUBLIC_KEY;
-	int func_ret = 0;
-
-	BIO* bio = BIO_new_mem_buf((void*) (pubKey), strlen(pubKey));
-	RSA *rsa = PEM_read_bio_RSAPublicKey(bio, NULL, NULL, NULL);
-	BIO_free(bio);
-	if (rsa == NULL) {
-		LOG_ERROR("Error reading public key");
-		return FUNC_RET_ERROR;
-	}
-	EVP_PKEY *pkey = EVP_PKEY_new();
-	EVP_PKEY_assign_RSA(pkey, rsa);
-
-	/*BIO* bo = BIO_new(BIO_s_mem());
-	 BIO_write(bo, pubKey, strlen(pubKey));
-	 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];
-	BIO* b64 = BIO_new(BIO_f_base64());
-	BIO* encoded_signature = BIO_new_mem_buf((void *) signatureB64,
-			strlen(signatureB64));
-	BIO* biosig = BIO_push(b64, encoded_signature);
-	BIO_set_flags(biosig, BIO_FLAGS_BASE64_NO_NL); //Do not use newlines to flush buffer
-	unsigned int len = BIO_read(biosig, (void *) buffer, strlen(signatureB64));
-//Can test here if len == decodeLen - if not, then return an error
-	buffer[len] = 0;
-
-	BIO_free_all(biosig);
-
-	/* Create the Message Digest Context */
-	if (!(mdctx = EVP_MD_CTX_create())) {
-		free_resources(pkey, mdctx);
-		LOG_ERROR("Error creating context");
-		return FUNC_RET_ERROR;
-	}
-	if (1 != EVP_DigestVerifyInit(mdctx, NULL, EVP_sha256(), NULL, pkey)) {
-		LOG_ERROR("Error initializing digest");
-		free_resources(pkey, mdctx);
-		return FUNC_RET_ERROR;
-	}
-	int en = strlen(stringToVerify);
-	func_ret = EVP_DigestVerifyUpdate(mdctx, stringToVerify, en);
-	if (1 != func_ret) {
-		LOG_ERROR("Error verifying digest %d", func_ret);
-		free_resources(pkey, mdctx);
-		return FUNC_RET_ERROR;
-	}
-	FUNCTION_RETURN result;
-	func_ret = EVP_DigestVerifyFinal(mdctx, buffer, len);
-	if (1 != func_ret) {
-		LOG_ERROR("Error verifying digest %d", func_ret);
-	}
-	result = (1 == func_ret ? FUNC_RET_OK : FUNC_RET_ERROR);
-
-	free_resources(pkey, mdctx);
 	return result;
 }
diff --git a/src/library/os/win/os-win.c b/src/library/os/os-win.c
similarity index 65%
rename from src/library/os/win/os-win.c
rename to src/library/os/os-win.c
index d3899e7..b6a7f77 100644
--- a/src/library/os/win/os-win.c
+++ b/src/library/os/os-win.c
@@ -1,18 +1,11 @@
-#ifdef __MINGW32__
-#include <windows.h>
-#else
+#ifdef _MSC_VER
 #include <Windows.h>
 #endif
 #include <iphlpapi.h>
-//definition of size_t
-#include <stdlib.h>
-#include <stdio.h>
-//#include "../../base/base64.h"
-#include "../../base/logger.h"
-#include"../os.h"
-#include "public-key.h"
-
+#include "../base/logger.h"
+#include "os.h"
 #pragma comment(lib, "IPHLPAPI.lib")
+
 unsigned char* unbase64(const char* ascii, int len, int *flen);
 
 FUNCTION_RETURN getOsSpecificIdentifier(unsigned char identifier[6]) {
@@ -215,88 +208,3 @@
 		free(hashStr);
 	}
 }
-
-FUNCTION_RETURN verifySignature(const char* stringToVerify,
-		const char* signatureB64) {
-	//--------------------------------------------------------------------
-	// Declare variables.
-	//
-	// hProv:           Cryptographic service provider (CSP). This example
-	//                  uses the Microsoft Enhanced Cryptographic 
-	//                  Provider.
-	// hKey:            Key to be used. In this example, you import the 
-	//                  key as a PLAINTEXTKEYBLOB.
-	// dwBlobLen:       Length of the plaintext key.
-	// pbKeyBlob:       Pointer to the exported key.
-	BYTE pubKey[] = PUBLIC_KEY;
-
-	HCRYPTPROV hProv = 0;
-	HCRYPTKEY hKey = 0;
-	HCRYPTHASH hHash = 0;
-	DWORD dwSigLen;
-	BYTE* sigBlob;
-
-	//--------------------------------------------------------------------
-	// Acquire a handle to the CSP.
-
-	if (!CryptAcquireContext(&hProv,
-	NULL, MS_ENHANCED_PROV, PROV_RSA_FULL, CRYPT_VERIFYCONTEXT)) {
-		// If the key container cannot be opened, try creating a new
-		// container by specifying a container name and setting the 
-		// CRYPT_NEWKEYSET flag.
-		LOG_INFO("Error in AcquireContext 0x%08x \n", GetLastError());
-		if (NTE_BAD_KEYSET == GetLastError()) {
-			if (!CryptAcquireContext(&hProv, "license++verify",
-					MS_ENHANCED_PROV, PROV_RSA_FULL,
-					CRYPT_NEWKEYSET | CRYPT_VERIFYCONTEXT)) {
-				LOG_ERROR("Error in AcquireContext 0x%08x \n", GetLastError());
-				return FUNC_RET_ERROR;
-			}
-		} else {
-			LOG_ERROR(" Error in AcquireContext 0x%08x \n", GetLastError());
-			return FUNC_RET_ERROR;
-		}
-	}
-
-	// Use the CryptImportKey function to import the PLAINTEXTKEYBLOB
-	// BYTE array into the key container. The function returns a 
-	// pointer to an HCRYPTKEY variable that contains the handle of
-	// the imported key.
-	if (!CryptImportKey(hProv, &pubKey[0], sizeof(pubKey), 0, 0, &hKey)) {
-		LOG_ERROR("Error 0x%08x in importing the PublicKey \n", GetLastError());
-		return FUNC_RET_ERROR;
-	}
-
-	if (CryptCreateHash(hProv, CALG_SHA1, 0, 0, &hHash)) {
-		LOG_DEBUG("Hash object created.");
-	} else {
-		LOG_ERROR("Error in hash creation 0x%08x ", GetLastError());
-		CryptReleaseContext(hProv, 0);
-		return FUNC_RET_ERROR;
-	}
-
-	if (!CryptHashData(hHash, stringToVerify, (DWORD) strlen(stringToVerify), 0)) {
-		LOG_ERROR("Error in hashing data 0x%08x ", GetLastError());
-		CryptDestroyHash(hHash);
-		CryptReleaseContext(hProv, 0);
-		return FUNC_RET_ERROR;
-	}
-#ifdef _DEBUG
-	LOG_DEBUG("Lenght %d, hashed Data: [%s]", strlen(stringToVerify), stringToVerify);
-	printHash(&hHash);
-#endif
-	sigBlob = unbase64(signatureB64, (int) strlen(signatureB64), &dwSigLen);
-	LOG_DEBUG("raw signature lenght %d", dwSigLen);
-	if (!CryptVerifySignature(hHash, sigBlob, dwSigLen, hKey, NULL, 0)) {
-		LOG_ERROR("Signature not validated!  0x%08x ", GetLastError());
-		free(sigBlob);
-		CryptDestroyHash(hHash);
-		CryptReleaseContext(hProv, 0);
-		return FUNC_RET_ERROR;
-	}
-	CryptDestroyHash(hHash);
-	free(sigBlob);
-	CryptReleaseContext(hProv, 0);
-	return FUNC_RET_OK;
-}
-
diff --git a/src/library/os/os.c b/src/library/os/os.c
new file mode 100644
index 0000000..633917d
--- /dev/null
+++ b/src/library/os/os.c
@@ -0,0 +1,195 @@
+//#include <stdlib.h>
+#include <stdio.h>
+#include "../base/logger.h"
+#include "os.h"
+#include "public-key.h"
+
+#ifndef _MSC_VER
+
+#include <openssl/pem.h>
+
+static void free_resources(EVP_PKEY* pkey, EVP_MD_CTX* mdctx) {
+	if (pkey) {
+		EVP_PKEY_free(pkey);
+	}
+	if (mdctx) {
+		EVP_MD_CTX_destroy(mdctx);
+	}
+}
+
+FUNCTION_RETURN verifySignature(const char* stringToVerify,
+		const char* signatureB64) {
+	EVP_MD_CTX *mdctx = NULL;
+	const char *pubKey = PUBLIC_KEY;
+	int func_ret = 0;
+
+	BIO* bio = BIO_new_mem_buf((void*) (pubKey), strlen(pubKey));
+	RSA *rsa = PEM_read_bio_RSAPublicKey(bio, NULL, NULL, NULL);
+	BIO_free(bio);
+	if (rsa == NULL) {
+		LOG_ERROR("Error reading public key");
+		return FUNC_RET_ERROR;
+	}
+	EVP_PKEY *pkey = EVP_PKEY_new();
+	EVP_PKEY_assign_RSA(pkey, rsa);
+
+	/*BIO* bo = BIO_new(BIO_s_mem());
+	 BIO_write(bo, pubKey, strlen(pubKey));
+	 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];
+	BIO* b64 = BIO_new(BIO_f_base64());
+	BIO* encoded_signature = BIO_new_mem_buf((void *) signatureB64,
+			strlen(signatureB64));
+	BIO* biosig = BIO_push(b64, encoded_signature);
+	BIO_set_flags(biosig, BIO_FLAGS_BASE64_NO_NL); //Do not use newlines to flush buffer
+	unsigned int len = BIO_read(biosig, (void *) buffer, strlen(signatureB64));
+//Can test here if len == decodeLen - if not, then return an error
+	buffer[len] = 0;
+
+	BIO_free_all(biosig);
+
+	/* Create the Message Digest Context */
+	if (!(mdctx = EVP_MD_CTX_create())) {
+		free_resources(pkey, mdctx);
+		LOG_ERROR("Error creating context");
+		return FUNC_RET_ERROR;
+	}
+	if (1 != EVP_DigestVerifyInit(mdctx, NULL, EVP_sha256(), NULL, pkey)) {
+		LOG_ERROR("Error initializing digest");
+		free_resources(pkey, mdctx);
+		return FUNC_RET_ERROR;
+	}
+	int en = strlen(stringToVerify);
+	func_ret = EVP_DigestVerifyUpdate(mdctx, stringToVerify, en);
+	if (1 != func_ret) {
+		LOG_ERROR("Error verifying digest %d", func_ret);
+		free_resources(pkey, mdctx);
+		return FUNC_RET_ERROR;
+	}
+	FUNCTION_RETURN result;
+	func_ret = EVP_DigestVerifyFinal(mdctx, buffer, len);
+	if (1 != func_ret) {
+		LOG_ERROR("Error verifying digest %d", func_ret);
+	}
+	result = (1 == func_ret ? FUNC_RET_OK : FUNC_RET_ERROR);
+
+	free_resources(pkey, mdctx);
+	return result;
+}
+
+#else
+
+#include <iphlpapi.h>
+#include <Windows.h>
+#pragma comment(lib, "IPHLPAPI.lib")
+
+static void printHash(HCRYPTHASH* hHash) {
+	BYTE *pbHash;
+	DWORD dwHashLen;
+	DWORD dwHashLenSize = sizeof(DWORD);
+	char* hashStr;
+	unsigned int i;
+
+	if (CryptGetHashParam(*hHash, HP_HASHSIZE, (BYTE *) &dwHashLen,
+			&dwHashLenSize, 0)) {
+		pbHash = (BYTE*) malloc(dwHashLen);
+		hashStr = (char*) malloc(dwHashLen * 2 + 1);
+		if (CryptGetHashParam(*hHash, HP_HASHVAL, pbHash, &dwHashLen, 0)) {
+			for (i = 0; i < dwHashLen; i++) {
+				sprintf(&hashStr[i * 2], "%02x", pbHash[i]);
+			} LOG_DEBUG("Hash to verify: %s", hashStr);
+		}
+		free(pbHash);
+		free(hashStr);
+	}
+}
+
+FUNCTION_RETURN verifySignature(const char* stringToVerify,
+		const char* signatureB64) {
+	//--------------------------------------------------------------------
+	// Declare variables.
+	//
+	// hProv:           Cryptographic service provider (CSP). This example
+	//                  uses the Microsoft Enhanced Cryptographic 
+	//                  Provider.
+	// hKey:            Key to be used. In this example, you import the 
+	//                  key as a PLAINTEXTKEYBLOB.
+	// dwBlobLen:       Length of the plaintext key.
+	// pbKeyBlob:       Pointer to the exported key.
+	BYTE pubKey[] = PUBLIC_KEY;
+
+	HCRYPTPROV hProv = 0;
+	HCRYPTKEY hKey = 0;
+	HCRYPTHASH hHash = 0;
+	DWORD dwSigLen;
+	BYTE* sigBlob;
+
+	//--------------------------------------------------------------------
+	// Acquire a handle to the CSP.
+
+	if (!CryptAcquireContext(&hProv,
+	NULL, MS_ENHANCED_PROV, PROV_RSA_FULL, CRYPT_VERIFYCONTEXT)) {
+		// If the key container cannot be opened, try creating a new
+		// container by specifying a container name and setting the 
+		// CRYPT_NEWKEYSET flag.
+		LOG_INFO("Error in AcquireContext 0x%08x \n", GetLastError());
+		if (NTE_BAD_KEYSET == GetLastError()) {
+			if (!CryptAcquireContext(&hProv, "license++verify",
+					MS_ENHANCED_PROV, PROV_RSA_FULL,
+					CRYPT_NEWKEYSET | CRYPT_VERIFYCONTEXT)) {
+				LOG_ERROR("Error in AcquireContext 0x%08x \n", GetLastError());
+				return FUNC_RET_ERROR;
+			}
+		} else {
+			LOG_ERROR(" Error in AcquireContext 0x%08x \n", GetLastError());
+			return FUNC_RET_ERROR;
+		}
+	}
+
+	// Use the CryptImportKey function to import the PLAINTEXTKEYBLOB
+	// BYTE array into the key container. The function returns a 
+	// pointer to an HCRYPTKEY variable that contains the handle of
+	// the imported key.
+	if (!CryptImportKey(hProv, &pubKey[0], sizeof(pubKey), 0, 0, &hKey)) {
+		LOG_ERROR("Error 0x%08x in importing the PublicKey \n", GetLastError());
+		return FUNC_RET_ERROR;
+	}
+
+	if (CryptCreateHash(hProv, CALG_SHA1, 0, 0, &hHash)) {
+		LOG_DEBUG("Hash object created.");
+	} else {
+		LOG_ERROR("Error in hash creation 0x%08x ", GetLastError());
+		CryptReleaseContext(hProv, 0);
+		return FUNC_RET_ERROR;
+	}
+
+	if (!CryptHashData(hHash, stringToVerify, (DWORD) strlen(stringToVerify), 0)) {
+		LOG_ERROR("Error in hashing data 0x%08x ", GetLastError());
+		CryptDestroyHash(hHash);
+		CryptReleaseContext(hProv, 0);
+		return FUNC_RET_ERROR;
+	}
+#ifdef _DEBUG
+	LOG_DEBUG("Lenght %d, hashed Data: [%s]", strlen(stringToVerify), stringToVerify);
+	printHash(&hHash);
+#endif
+	sigBlob = unbase64(signatureB64, (int) strlen(signatureB64), &dwSigLen);
+	LOG_DEBUG("raw signature lenght %d", dwSigLen);
+	if (!CryptVerifySignature(hHash, sigBlob, dwSigLen, hKey, NULL, 0)) {
+		LOG_ERROR("Signature not validated!  0x%08x ", GetLastError());
+		free(sigBlob);
+		CryptDestroyHash(hHash);
+		CryptReleaseContext(hProv, 0);
+		return FUNC_RET_ERROR;
+	}
+	CryptDestroyHash(hHash);
+	free(sigBlob);
+	CryptReleaseContext(hProv, 0);
+	return FUNC_RET_OK;
+}
+#endif
diff --git a/src/library/os/win/CMakeLists.txt b/src/library/os/win/CMakeLists.txt
deleted file mode 100644
index 972fdb8..0000000
--- a/src/library/os/win/CMakeLists.txt
+++ /dev/null
@@ -1,11 +0,0 @@
-ADD_LIBRARY(os STATIC
-	os-win.c
-)
-
-target_link_libraries(
-     os
-     base
-     ${EXTERNAL_LIBS}
-)
-
-install(TARGETS os ARCHIVE DESTINATION lib)

--
Gitblit v1.9.1