From 0288790e61dec962f43b4ebf4a4fa3057dbd2d02 Mon Sep 17 00:00:00 2001 From: open-license-manager <rillf@maildrop.cc> Date: 周一, 21 4月 2014 18:14:24 +0800 Subject: [PATCH] network adapter detection linux --- src/library/os/linux/os-linux.cpp | 137 +++++++++++++++++++++++++-------------------- 1 files changed, 75 insertions(+), 62 deletions(-) diff --git a/src/library/os/linux/os-linux.cpp b/src/library/os/linux/os-linux.cpp index b8ad61c..722c8ad 100644 --- a/src/library/os/linux/os-linux.cpp +++ b/src/library/os/linux/os-linux.cpp @@ -1,5 +1,17 @@ -#include <paths.h> +#define _GNU_SOURCE /* To get defns of NI_MAXSERV and NI_MAXHOST */ +#include <arpa/inet.h> +#include <sys/socket.h> +#include <netdb.h> +#include <ifaddrs.h> #include <stdio.h> +#include <stdlib.h> +#include <unistd.h> +#include <linux/if_link.h> +#include <sys/socket.h> +#include <netpacket/packet.h> + +#include <paths.h> + #include <stdlib.h> #include <cstring> #include <string> @@ -8,36 +20,17 @@ #include <sstream> #include <sys/ioctl.h> #include <sys/stat.h> -#include "../os.hpp" +#include "../os-cpp.h" #include "../../base/public-key.h" + #include <openssl/evp.h> #include <openssl/bio.h> #include <openssl/pem.h> +#include <openssl/err.h> namespace license { using namespace std; - -vector<AdapterInfo> OsFunctions::getAdapterInfos() { - return vector<AdapterInfo>(); -} -vector<DiskInfo> OsFunctions::getDiskInfos() { - struct stat filename_stat, mount_stat; - static char discard[1024]; - char device[64], name[64], type[64]; - FILE *mounts = fopen(_PATH_MOUNTED, "r"); - - while (fscanf(mounts, "%64s %64s %64s %1024[^\n]", device, name, type, - discard) != EOF) { - if (stat(device, &mount_stat) != 0) - continue; - if (filename_stat.st_dev == mount_stat.st_rdev) - fprintf(stderr, "device: %s; name: %s; type: %s\n", device, name, - type); - } - - return vector<DiskInfo>(); -} string OsFunctions::getModuleName() { char path[2048] = { 0 }; @@ -58,73 +51,93 @@ return result; } -string OsFunctions::getUserHomePath() { - return ""; -} + bool OsFunctions::verifySignature(const char* stringToVerify, - const char* signature) { + const char* signatureB64) { EVP_MD_CTX *mdctx = NULL; char *pubKey = PUBLIC_KEY ; - BIO* bio = BIO_new_mem_buf((void*) (pubKey), sizeof(pubKey)); - EVP_PKEY *pktmp = PEM_read_bio_PUBKEY(bio, NULL, NULL, NULL); + BIO* bio = BIO_new_mem_buf((void*) (pubKey), strlen(pubKey)); + RSA *rsa = PEM_read_bio_RSAPublicKey(bio, NULL, NULL, NULL); BIO_free(bio); - if (pktmp == NULL) { + if (rsa == NULL) { throw new logic_error("Error reading public key"); } + 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>); +//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())) { throw new logic_error("Error creating context"); } - if (1 != EVP_DigestVerifyInit(mdctx, NULL, EVP_sha256(), NULL, pktmp)) { + if (1 != EVP_DigestVerifyInit(mdctx, NULL, EVP_sha256(), NULL, pkey)) { throw new logic_error("Error initializing digest"); } - - if (1 - != EVP_DigestVerifyUpdate(mdctx, stringToVerify, - strlen(stringToVerify))) { - throw new logic_error("Error initializing digest"); + int en = strlen(stringToVerify); + if (1 != EVP_DigestVerifyUpdate(mdctx, stringToVerify, en)) { + throw new logic_error("Error verifying digest"); } - if (1 - == EVP_DigestVerifyFinal(mdctx, (unsigned char *) signature, - (unsigned long int) strlen(signature))) { - return true; + bool result; + int res = EVP_DigestVerifyFinal(mdctx, buffer, len); + if (1 == res) { + result = true; } else { - - return false; + result = false; } + if (pkey) { + EVP_PKEY_free(pkey); + } + if (mdctx) { + EVP_MD_CTX_destroy(mdctx); + } + return result; } -VIRTUALIZATION OsFunctions::getVirtualization() { - //http://www.ibiblio.org/gferg/ldp/GCC-Inline-Assembly-HOWTO.html - // - bool rc = true; + + +VIRTUALIZATION getVirtualization() { +//http://www.ibiblio.org/gferg/ldp/GCC-Inline-Assembly-HOWTO.html +// +//bool rc = true; /*__asm__ ( - "push %edx\n" - "push %ecx\n" - "push %ebx\n" - "mov %eax, 'VMXh'\n" - "mov %ebx, 0\n" // any value but not the MAGIC VALUE - "mov %ecx, 10\n"// get VMWare version - "mov %edx, 'VX'\n"// port number - "in %eax, dx\n"// read port on return EAX returns the VERSION - "cmp %ebx, 'VMXh'\n"// is it a reply from VMWare? - "setz [rc] \n"// set return value - "pop %ebx \n" - "pop %ecx \n" - "pop %edx \n" - );*/ + "push %edx\n" + "push %ecx\n" + "push %ebx\n" + "mov %eax, 'VMXh'\n" + "mov %ebx, 0\n" // any value but not the MAGIC VALUE + "mov %ecx, 10\n"// get VMWare version + "mov %edx, 'VX'\n"// port number + "in %eax, dx\n"// read port on return EAX returns the VERSION + "cmp %ebx, 'VMXh'\n"// is it a reply from VMWare? + "setz [rc] \n"// set return value + "pop %ebx \n" + "pop %ecx \n" + "pop %edx \n" + );*/ return NONE; } -- Gitblit v1.9.1