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