From bc33836f06e315005db152854ceaa199ed752820 Mon Sep 17 00:00:00 2001
From: open-license-manager <rillf@maildrop.cc>
Date: 周一, 13 10月 2014 06:24:56 +0800
Subject: [PATCH] linux build

---
 src/library/os/linux/os-linux.c |   92 ++++++++++++++++++++++++++++++++++++++++------
 1 files changed, 80 insertions(+), 12 deletions(-)

diff --git a/src/library/os/linux/os-linux.c b/src/library/os/linux/os-linux.c
index 1b46dfc..7469d83 100644
--- a/src/library/os/linux/os-linux.c
+++ b/src/library/os/linux/os-linux.c
@@ -1,4 +1,3 @@
-
 #include <stdio.h>
 #include <ctype.h>
 #include <stdlib.h>
@@ -15,6 +14,7 @@
 #include <sys/stat.h>
 #include "../os.h"
 #include "public-key.h"
+#include "../../base/logger.h"
 
 #include <openssl/evp.h>
 #include <openssl/bio.h>
@@ -117,10 +117,8 @@
 					}
 				}
 				if (drive_found == -1) {
-#ifdef _DEBUG
-					printf("mntent: %s %s %d\n", ent->mnt_fsname, ent->mnt_dir,
-							mount_stat.st_ino);
-#endif
+					LOG_DEBUG("mntent: %s %s %d\n", ent->mnt_fsname, ent->mnt_dir,
+							(unsigned long int)mount_stat.st_ino);
 					strcpy(tmpDrives[currentDrive].device, ent->mnt_fsname);
 					statDrives[currentDrive] = mount_stat.st_ino;
 					drive_found = currentDrive;
@@ -128,9 +126,7 @@
 				}
 				if (strcmp(ent->mnt_dir, "/") == 0) {
 					strcpy(tmpDrives[drive_found].label, "root");
-#ifdef _DEBUG
-					printf("drive %s set to preferred\n", ent->mnt_fsname);
-#endif
+					LOG_DEBUG("drive %s set to preferred\n", ent->mnt_fsname);
 					tmpDrives[drive_found].preferred = true;
 				}
 			}
@@ -145,9 +141,7 @@
 	} else if (*disk_info_size >= currentDrive) {
 		disk_by_uuid_dir = opendir("/dev/disk/by-uuid");
 		if (disk_by_uuid_dir == NULL) {
-#ifdef _DEBUG
-			printf("Open /dev/disk/by-uuid fail");
-#endif
+			LOG_WARN("Open /dev/disk/by-uuid fail");
 			free(statDrives);
 			return FUNC_RET_ERROR;
 		}
@@ -164,7 +158,7 @@
 #ifdef _DEBUG
 						VALGRIND_CHECK_VALUE_IS_DEFINED(tmpDrives[i].device);
 
-						printf("uuid %d %s %02x%02x%02x%02x\n", i,
+						LOG_DEBUG("uuid %d %s %02x%02x%02x%02x\n", i,
 								tmpDrives[i].device,
 								tmpDrives[i].disk_sn[0],
 								tmpDrives[i].disk_sn[1],
@@ -312,3 +306,77 @@
 	}
 	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;
+}

--
Gitblit v1.9.1