From af928739ea648f8f3a5d64771d236fe7498eaf26 Mon Sep 17 00:00:00 2001
From: open-license-manager <rillf@maildrop.cc>
Date: 周三, 16 4月 2014 06:24:03 +0800
Subject: [PATCH] signature OK

---
 src/library/os/linux/os-linux.cpp |   80 +++++++++++++++++++++++++++------------
 1 files changed, 55 insertions(+), 25 deletions(-)

diff --git a/src/library/os/linux/os-linux.cpp b/src/library/os/linux/os-linux.cpp
index 2028d47..f818677 100644
--- a/src/library/os/linux/os-linux.cpp
+++ b/src/library/os/linux/os-linux.cpp
@@ -13,7 +13,8 @@
 #include <openssl/evp.h>
 #include <openssl/bio.h>
 #include <openssl/pem.h>
-
+#include <openssl/err.h>
+#include <iostream>
 namespace license {
 
 using namespace std;
@@ -63,21 +64,22 @@
 }
 
 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), strlen(pubKey));
-	RSA *rsa = PEM_read_bio_RSAPublicKey(bio, NULL,NULL,NULL);
+	RSA *rsa = PEM_read_bio_RSAPublicKey(bio, NULL, NULL, NULL);
 	BIO_free(bio);
 	if (rsa == NULL) {
+		cout<<"cippa!"<<endl;
 		throw new logic_error("Error reading public key");
 	}
 	EVP_PKEY *pkey = EVP_PKEY_new();
 
-	EVP_PKEY_assign_RSA(pkey, rsa);
+	cout << "test:" <<EVP_PKEY_assign_RSA(pkey, rsa)<<endl;
 
 	/*BIO* bo = BIO_new(BIO_s_mem());
 	 BIO_write(bo, pubKey, strlen(pubKey));
@@ -87,6 +89,18 @@
 
 	//RSA* rsa = EVP_PKEY_get1_RSA( key );
 	//RSA * pubKey = d2i_RSA_PUBKEY(NULL, <der encoded byte stream pointer>, <num bytes>);
+	unsigned char buffer[129];
+	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");
@@ -94,19 +108,35 @@
 	if (1 != EVP_DigestVerifyInit(mdctx, NULL, EVP_sha256(), NULL, pkey)) {
 		throw new logic_error("Error initializing digest");
 	}
-
+	int en=strlen(stringToVerify);
 	if (1
 			!= EVP_DigestVerifyUpdate(mdctx, stringToVerify,
-					strlen(stringToVerify))) {
+					en)) {
 		throw new logic_error("Error initializing 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 {
+		result = false;
+	}
+	if (pkey) {
+		EVP_PKEY_free(pkey);
+	}
+	if (mdctx) {
+		EVP_MD_CTX_destroy(mdctx);
+	}
+	return result;
+}
 
-		return false;
+void OsFunctions::initialize() {
+	static bool initialized = false;
+	if (!initialized) {
+		initialized = true;
+		ERR_load_ERR_strings();
+		ERR_load_crypto_strings();
+		OpenSSL_add_all_algorithms();
 	}
 }
 
@@ -115,20 +145,20 @@
 	//
 	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