secureswitools/makekeys/src/RSAKeyGenerator.cpp
author Santosh V Patil <santosh.v.patil@nokia.com>
Fri, 19 Feb 2010 14:53:53 +0530
branchADM
changeset 13 8ed1157e9487
parent 0 ba25891c3a9e
permissions -rw-r--r--
Adding branch for contribution of boostrap component of Smart Installer

/*
* Copyright (c) 2006-2009 Nokia Corporation and/or its subsidiary(-ies).
* All rights reserved.
* This component and the accompanying materials are made available
* under the terms of the License "Eclipse Public License v1.0"
* which accompanies this distribution, and is available
* at the URL "http://www.eclipse.org/legal/epl-v10.html".
*
* Initial Contributors:
* Nokia Corporation - initial contribution.
*
* Contributors:
*
* Description: 
* Implementation of the CRSAKeyGenerator class
* INCLUDES
*
*/


#include "RSAKeyGenerator.h"
#include <iostream.h>

// ===========================================================================
// Construction/Destruction
// ===========================================================================

CRSAKeyGenerator::CRSAKeyGenerator()
{

}

CRSAKeyGenerator::~CRSAKeyGenerator()
{

}

int CRSAKeyGenerator::Generate()
//Generate an RSA key with pre-determined length
{
	RSA*		   pRSAKey	    = NULL;
	FILE*		   fp		    = NULL;
	LPSTR		   pbPassword   = NULL;
	const _TCHAR*  pPrivKeyFile = NULL;

	int retVal  = FAIL;
	int retFunc = FAIL;

	pPrivKeyFile = GetPrivateKeyFile();
	if(!pPrivKeyFile)
		{
		PrintErrorInfo("Bad parameter error!", EGeneric, constparams);
		return 0;
		}
	
	OPENSSL_add_all_algorithms_conf();
	ERR_load_crypto_strings();

	int keyLength = 0;
	keyLength = GetKeyLength();
	try
		{
		//Generate RSA key
		_tprintf(_T("\nGenerating RSA key ."));
		do
			{
			pRSAKey = RSA_generate_key(keyLength, RSA_F4, RSAKeyStatus, NULL);

			}
		while((retVal = RSA_check_key(pRSAKey)) == 0); // if return is 0, the key should be regenerated!

		if(retVal != 1)
			{
			PrintErrorInfo("RSA key generation failed!", EOPENSSL, constparams);
			throw EOPENSSL;
			}

		_tprintf(_T("Generated!\n"));
		//Create a key file
		fp = _tfopen(pPrivKeyFile, _T("w"));
		
		if(!fp)
			{
			PrintErrorInfo("Error creating key file!", EGeneric, constparams);
			throw EGeneric;
			}

		//Write generated DSA key to the key file
		if(m_bPassword)
			{
			DWORD len = 0;
			len = _tcslen(GetPassword());
			pbPassword = MakeMBCSString(GetPassword(), CP_UTF8, len);
			retVal = PEM_write_RSAPrivateKey(fp, pRSAKey, EVP_des_ede3_cbc(), (unsigned char *) pbPassword, len, NULL, NULL);
			delete pbPassword;
			}
		else if(m_bAsk)
			{
			retVal = PEM_write_RSAPrivateKey(fp, pRSAKey, EVP_des_ede3_cbc(), NULL, 0, NULL, NULL);
			}

		if(!retVal)
			{
			PrintErrorInfo("Error writing to key file", EOPENSSL, constparams);
			throw EOPENSSL;
			}
		
		//Free variables
		RSA_free(pRSAKey);
		fclose(fp);	
		
		//Get command prompt handle
		HANDLE	hndl = 0;
		DWORD bytesWritten;
		hndl = GetStdHandle(STD_OUTPUT_HANDLE);
		_tprintf(_T("\nCreated key: "));
		WriteConsole(hndl, pPrivKeyFile, wcslen(pPrivKeyFile), &bytesWritten, 0);
		retFunc = SUCCESS;

		}
	catch (...)
		{
		//Delete rsa params
		if(pRSAKey != NULL) 
			{
			RSA_free(pRSAKey);
			}

		}
	return retFunc;
	}


//RSA key generation callback function
static void RSAKeyStatus(int aCode, int aArg, void *aCbArg)
	{
	
	if (aCode == 1 && aArg && !(aArg % 3))
		{
		printf(".");
		}
	return;
	}