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