From a97ebb240931704cdc28a30a47c2630cbe60b13e Mon Sep 17 00:00:00 2001 From: Gabriele Contini <gcontini@users.noreply.github.com> Date: 周二, 10 9月 2019 23:29:10 +0800 Subject: [PATCH] fix issue #37 tests in windows --- src/tools/base_lib/win/CryptoHelperWindows.cpp | 69 +++++++++++++++++++--------------- 1 files changed, 38 insertions(+), 31 deletions(-) diff --git a/src/tools/base_lib/win/CryptoHelperWindows.cpp b/src/tools/base_lib/win/CryptoHelperWindows.cpp index 7bf0ffb..98d14b3 100644 --- a/src/tools/base_lib/win/CryptoHelperWindows.cpp +++ b/src/tools/base_lib/win/CryptoHelperWindows.cpp @@ -5,9 +5,10 @@ * */ -#include "CryptoHelperWindows.h" #include <sstream> #include <vector> +#include <string> +#include "CryptoHelperWindows.h" // The RSA public-key key exchange algorithm #define ENCRYPT_ALGORITHM CALG_RSA_SIGN // The high order WORD 0x0200 (decimal 512) @@ -20,20 +21,26 @@ CryptoHelperWindows::CryptoHelperWindows() { m_hCryptProv = NULL; m_hCryptKey = NULL; - if (!CryptAcquireContext(&m_hCryptProv, "license++sign", MS_ENHANCED_PROV, - PROV_RSA_FULL, 0)) { + if (!CryptAcquireContext(&m_hCryptProv, "license_sign", NULL, PROV_RSA_FULL, 0)) { // If the key container cannot be opened, try creating a new // container by specifying a container name and setting the // CRYPT_NEWKEYSET flag. - printf("Error in AcquireContext 0x%08x \n", GetLastError()); - if (NTE_BAD_KEYSET == GetLastError()) { - if (!CryptAcquireContext(&m_hCryptProv, "license++sign", - MS_ENHANCED_PROV, PROV_RSA_FULL, CRYPT_NEWKEYSET)) { - printf("Error in AcquireContext 0x%08x \n", GetLastError()); - throw logic_error(""); + DWORD lastError = GetLastError(); + printf("Error in CryptAcquireContext (1) 0x%08x \n", lastError); + if (NTE_BAD_KEYSET == lastError) { + if (!CryptAcquireContext(&m_hCryptProv, "license_sign", NULL, PROV_RSA_FULL, CRYPT_NEWKEYSET)) { + printf("Warn in CryptAcquireContext: acquiring new user keyset failed 0x%08x, trying less secure mackine keyset \n", GetLastError()); + //maybe access to protected storage disabled. Try with machine keys (less secure) + if (!CryptAcquireContext(&m_hCryptProv, "license_sign", NULL, PROV_RSA_FULL, CRYPT_MACHINE_KEYSET)) { + printf("Error in CryptAcquireContext (2) 0x%08x \n", GetLastError()); + if (!CryptAcquireContext(&m_hCryptProv, "license_sign", NULL, PROV_RSA_FULL, CRYPT_NEWKEYSET|CRYPT_MACHINE_KEYSET)) { + printf("Error in CryptAcquireContext (3): acquiring new keyset(machine) failed 0x%08x \n", GetLastError()); + throw logic_error(""); + } + } } } else { - printf(" Error in AcquireContext 0x%08x \n", GetLastError()); + printf(" Error in CryptAcquireContext (4) 0x%08x \n", lastError); throw logic_error(""); } } @@ -57,12 +64,12 @@ m_hCryptKey = NULL; // Call the CryptGenKey method to get a handle // to a new exportable key-pair. - if (!CryptGenKey(m_hCryptProv, - ENCRYPT_ALGORITHM, + if (!CryptGenKey(m_hCryptProv, ENCRYPT_ALGORITHM, KEYLENGTH | CRYPT_EXPORTABLE, &m_hCryptKey)) { dwErrCode = GetLastError(); throw logic_error( - string("Error generating keys ") + to_string(static_cast<long long>(dwErrCode))); + string("Error generating keys ") + + to_string(static_cast<long long>(dwErrCode))); } } @@ -81,8 +88,7 @@ // This call here determines the length of the key // blob. if (!CryptExportKey(m_hCryptKey, - NULL, PUBLICKEYBLOB, 0, - nullptr, &dwBlobLen)) { + NULL, PUBLICKEYBLOB, 0, nullptr, &dwBlobLen)) { dwErrCode = GetLastError(); throw logic_error( string("Error calculating size of public key ") @@ -98,7 +104,8 @@ delete pbKeyBlob; dwErrCode = GetLastError(); throw logic_error( - string("Error exporting public key ") + to_string(static_cast<long long>(dwErrCode))); + string("Error exporting public key ") + + to_string(static_cast<long long>(dwErrCode))); } else { ss << "\t"; for (unsigned int i = 0; i < dwBlobLen; i++) { @@ -141,8 +148,7 @@ // This call here determines the length of the key // blob. if (!CryptExportKey(m_hCryptKey, - NULL, PRIVATEKEYBLOB, 0, - nullptr, &dwBlobLen)) { + NULL, PRIVATEKEYBLOB, 0, nullptr, &dwBlobLen)) { dwErrCode = GetLastError(); throw logic_error( string("Error calculating size of private key ") @@ -159,7 +165,8 @@ delete pbKeyBlob; dwErrCode = GetLastError(); throw logic_error( - string("Error exporting private key ") + to_string(static_cast<long long>(dwErrCode))); + string("Error exporting private key ") + + to_string(static_cast<long long>(dwErrCode))); } else { ss << "\t"; for (unsigned int i = 0; i < dwBlobLen; i++) { @@ -176,14 +183,14 @@ return ss.str(); } -void CryptoHelperWindows::printHash(HCRYPTHASH* hHash) const { +void CryptoHelperWindows::printHash(HCRYPTHASH *hHash) const { BYTE *pbHash; DWORD dwHashLen; DWORD dwHashLenSize = sizeof(DWORD); - char* hashStr; + char *hashStr; unsigned int i; - if (CryptGetHashParam(*hHash, HP_HASHSIZE, (BYTE *) &dwHashLen, + if (CryptGetHashParam(*hHash, HP_HASHSIZE, (BYTE*) &dwHashLen, &dwHashLenSize, 0)) { pbHash = (BYTE*) malloc(dwHashLen); hashStr = (char*) malloc(dwHashLen * 2 + 1); @@ -198,10 +205,10 @@ } } -const string CryptoHelperWindows::signString(const void* privateKey, - size_t pklen, const string& license) const { - BYTE *pbBuffer = (BYTE *) license.c_str(); - const DWORD dwBufferLen = (DWORD)strlen((char *)pbBuffer); +const string CryptoHelperWindows::signString(const void *privateKey, + size_t pklen, const string &license) const { + BYTE *pbBuffer = (BYTE*) license.c_str(); + const DWORD dwBufferLen = (DWORD) strlen((char*) pbBuffer); HCRYPTHASH hHash; HCRYPTKEY hKey; @@ -212,8 +219,8 @@ //------------------------------------------------------------------- // Acquire a cryptographic provider context handle. - if (!CryptImportKey(m_hCryptProv, (const BYTE *) privateKey, (DWORD) pklen, 0, 0, - &hKey)) { + if (!CryptImportKey(m_hCryptProv, (const BYTE*) privateKey, (DWORD) pklen, + 0, 0, &hKey)) { throw logic_error( string("Error in importing the PrivateKey ") + to_string(static_cast<long long>(GetLastError()))); @@ -251,7 +258,7 @@ //------------------------------------------------------------------- // Allocate memory for the signature buffer. - if (pbSignature = (BYTE *) malloc(dwSigLen)) { + if (pbSignature = (BYTE*) malloc(dwSigLen)) { printf("Memory allocated for the signature.\n"); } else { throw logic_error(string("Out of memory.")); @@ -259,8 +266,8 @@ //------------------------------------------------------------------- // Sign the hash object. - if (CryptSignHash(hHash, AT_SIGNATURE, - nullptr, 0, pbSignature, &dwSigLen)) { + if (CryptSignHash(hHash, AT_SIGNATURE, nullptr, 0, pbSignature, + &dwSigLen)) { printf("pbSignature is the signature length. %d\n", dwSigLen); } else { throw logic_error(string("Error during CryptSignHash.")); -- Gitblit v1.9.1