From b446e4d14a0694d23573d77672ef6d70c51d6a08 Mon Sep 17 00:00:00 2001 From: Maximilien Siavelis <maximilien.siavelis@simulease.com> Date: 周五, 05 1月 2018 09:10:37 +0800 Subject: [PATCH] make install and some cleanup --- src/library/os/linux/os-linux.c | 100 +++++++++++++++++++++++++++++++++++++++++++------ 1 files changed, 87 insertions(+), 13 deletions(-) diff --git a/src/library/os/linux/os-linux.c b/src/library/os/linux/os-linux.c index 1b46dfc..79ec0e5 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> @@ -25,8 +25,10 @@ #include <dirent.h> #include <stdio.h> -#include <dbus-1.0/dbus/dbus.h> #include <sys/utsname.h> +#ifdef USE_DBUS +#include <dbus-1.0/dbus/dbus.h> +#endif /** *Usually uuid are hex number separated by "-". this method read up to 8 hex @@ -117,10 +119,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 +128,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 +143,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 +160,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], @@ -283,6 +279,7 @@ } FUNCTION_RETURN getOsSpecificIdentifier(unsigned char identifier[6]) { +#if USE_DBUS char* dbus_id = dbus_get_local_machine_id(); if (dbus_id == NULL) { return FUNC_RET_ERROR; @@ -290,6 +287,9 @@ memcpy(identifier, dbus_id, 6); dbus_free(dbus_id); return FUNC_RET_OK; +#else + return FUNC_RET_NOT_AVAIL; +#endif } FUNCTION_RETURN getModuleName(char buffer[MAX_PATH]) { @@ -312,3 +312,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