From 1922d8c2cf7dcaacafd17394849577794b1f10eb Mon Sep 17 00:00:00 2001 From: open-license-manager <rillf@maildrop.cc> Date: 周六, 13 9月 2014 06:24:55 +0800 Subject: [PATCH] signature windows --- src/license-generator/win/LicenseSigner.cpp | 351 +++++++++++++++++++++++++++++++++++++++++++++++++++------- 1 files changed, 306 insertions(+), 45 deletions(-) diff --git a/src/license-generator/win/LicenseSigner.cpp b/src/license-generator/win/LicenseSigner.cpp index 4b104a9..c6aca67 100644 --- a/src/license-generator/win/LicenseSigner.cpp +++ b/src/license-generator/win/LicenseSigner.cpp @@ -1,45 +1,306 @@ -/* - * LicenseSigner.cpp (Windows) - * - * Created on: Apr 6, 2014 - * Author: devel - */ - -#include "../LicenseSigner.h" -#include "../private-key.h" -#include <stdexcept> -#include <string.h> -#include <iostream> -#include <cmath> - -namespace license { -using namespace std; - -LicenseSigner::LicenseSigner() { - os_initialize(); -} - -LicenseSigner::LicenseSigner(const std::string& alternatePrimaryKey) { - os_initialize(); -} - -string LicenseSigner::Opensslb64Encode(size_t slen, unsigned char* signature) { - - return NULL; -} - -string LicenseSigner::signString(const string& license) { - return NULL; -} - -void LicenseSigner::signLicense(FullLicenseInfo& licenseInfo) { - string license = licenseInfo.printForSign(); - string signature = signString(license); - licenseInfo.license_signature = signature; -} - -LicenseSigner::~LicenseSigner() { - -} - -} /* namespace license */ +/* + * LicenseSigner.cpp (Windows) + * + * Created on: Apr 6, 2014 + * Author: devel + */ + +#include <stdexcept> +#include <string.h> +#include <iostream> +#include <cmath> + +#pragma comment(lib, "crypt32.lib") + +#include <stdio.h> +#include <windows.h> +#include <Wincrypt.h> +#define MY_ENCODING_TYPE (PKCS_7_ASN_ENCODING | X509_ASN_ENCODING) +#include "../private-key.h" + +#include "../LicenseSigner.h" +#include "../../library/base/logger.h" +namespace license { + using namespace std; + + LicenseSigner::LicenseSigner() { + os_initialize(); + + if (CryptAcquireContext( + &hProv, + "license-manager2++", + MS_ENHANCED_PROV, + PROV_RSA_FULL, //CRYPT_NEWKEYSET + 0)) { + LOG_DEBUG("CSP context acquired."); + } + else + { + LOG_ERROR("Error during CryptAcquireContextc %d.",GetLastError()); + throw exception(); + } + if (CryptImportKey( + hProv, + PRIVATE_KEY, + sizeof(PRIVATE_KEY), + 0, + 0, + &hPubKey)) + { + LOG_DEBUG("The key has been imported.\n"); + } + else + { + LOG_ERROR("Private key import failed.\n"); + throw exception(); + } + + } + + LicenseSigner::LicenseSigner(const std::string& alternatePrimaryKey) { + os_initialize(); + } + + string LicenseSigner::Opensslb64Encode(size_t slen, unsigned char* signature) { + + return NULL; + } + + string LicenseSigner::signString(const string& license) { + + //------------------------------------------------------------------- + // Declare and initialize variables. + BYTE *pbBuffer = (BYTE *)license.c_str(); + DWORD dwBufferLen = strlen((char *)pbBuffer) + 1; + HCRYPTHASH hHash; + + HCRYPTKEY hKey; + BYTE *pbKeyBlob; + BYTE *pbSignature; + DWORD dwSigLen; + DWORD dwBlobLen; + + //------------------------------------------------------------------- + // Acquire a cryptographic provider context handle. + + + //------------------------------------------------------------------- + // Get the public at signature key. This is the public key + // that will be used by the receiver of the hash to verify + // the signature. In situations where the receiver could obtain the + // sender's public key from a certificate, this step would not be + // needed. + + if (CryptGetUserKey( + hProv, + AT_SIGNATURE, + &hKey)) + { + printf("The signature key has been acquired. \n"); + } + else + { + printf("Error during CryptGetUserKey for signkey. %d", GetLastError()); + } + + //------------------------------------------------------------------- + // Create the hash object. + + if (CryptCreateHash( + hProv, + CALG_SHA1, + 0, + 0, + &hHash)) + { + printf("Hash object created. \n"); + } + else + { + LOG_ERROR("Error during CryptCreateHash."); + } + //------------------------------------------------------------------- + // Compute the cryptographic hash of the buffer. + + if (CryptHashData( + hHash, + pbBuffer, + dwBufferLen, + 0)) + { + printf("The data buffer has been hashed.\n"); + } + else + { + LOG_ERROR("Error during CryptHashData."); + } + //------------------------------------------------------------------- + // Determine the size of the signature and allocate memory. + + dwSigLen = 0; + if (CryptSignHash( + hHash, + AT_SIGNATURE, + NULL, + 0, + NULL, + &dwSigLen)) + { + printf("Signature length %d found.\n", dwSigLen); + } + else + { + LOG_ERROR("Error during CryptSignHash."); + } + //------------------------------------------------------------------- + // Allocate memory for the signature buffer. + + if (pbSignature = (BYTE *)malloc(dwSigLen)) + { + printf("Memory allocated for the signature.\n"); + } + else + { + LOG_ERROR("Out of memory."); + } + //------------------------------------------------------------------- + // Sign the hash object. + + if (CryptSignHash( + hHash, + AT_SIGNATURE, + NULL, + 0, + pbSignature, + &dwSigLen)) + { + printf("pbSignature is the hash signature.\n"); + } + else + { + LOG_ERROR("Error during CryptSignHash."); + } + //------------------------------------------------------------------- + // Destroy the hash object. + + if (hHash) + CryptDestroyHash(hHash); + + printf("The hash object has been destroyed.\n"); + printf("The signing phase of this program is completed.\n\n"); + + //------------------------------------------------------------------- + // In the second phase, the hash signature is verified. + // This would most often be done by a different user in a + // separate program. The hash, signature, and the PUBLICKEYBLOB + // would be read from a file, an email message, + // or some other source. + + // Here, the original pbBuffer, pbSignature, szDescription. + // pbKeyBlob, and their lengths are used. + + // The contents of the pbBuffer must be the same data + // that was originally signed. + + //------------------------------------------------------------------- + // Get the public key of the user who created the digital signature + // and import it into the CSP by using CryptImportKey. This returns + // a handle to the public key in hPubKey. + + /*if (CryptImportKey( + hProv, + pbKeyBlob, + dwBlobLen, + 0, + 0, + &hPubKey)) + { + printf("The key has been imported.\n"); + } + else + { + MyHandleError("Public key import failed."); + } + //------------------------------------------------------------------- + // Create a new hash object. + + if (CryptCreateHash( + hProv, + CALG_MD5, + 0, + 0, + &hHash)) + { + printf("The hash object has been recreated. \n"); + } + else + { + MyHandleError("Error during CryptCreateHash."); + } + //------------------------------------------------------------------- + // Compute the cryptographic hash of the buffer. + + if (CryptHashData( + hHash, + pbBuffer, + dwBufferLen, + 0)) + { + printf("The new hash has been created.\n"); + } + else + { + MyHandleError("Error during CryptHashData."); + } + //------------------------------------------------------------------- + // Validate the digital signature. + + if (CryptVerifySignature( + hHash, + pbSignature, + dwSigLen, + hPubKey, + NULL, + 0)) + { + printf("The signature has been verified.\n"); + } + else + { + printf("Signature not validated!\n"); + } + //------------------------------------------------------------------- + // Free memory to be used to store signature. + + if (pbSignature) + free(pbSignature); + + //------------------------------------------------------------------- + // Destroy the hash object. + + if (hHash) + CryptDestroyHash(hHash);*/ + + //------------------------------------------------------------------- + // Release the provider handle. + + if (hProv) + CryptReleaseContext(hProv, 0); + return string(""); + } // End of main + + + + + + void LicenseSigner::signLicense(FullLicenseInfo& licenseInfo) { + string license = licenseInfo.printForSign(); + string signature = signString(license); + licenseInfo.license_signature = signature; + } + + LicenseSigner::~LicenseSigner() { + + } + +} /* namespace license */ -- Gitblit v1.9.1