diff -r 000000000000 -r ba25891c3a9e secureswitools/makekeys/src/DSAKeyGenerator.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/secureswitools/makekeys/src/DSAKeyGenerator.cpp Thu Dec 17 08:51:10 2009 +0200 @@ -0,0 +1,162 @@ +/* +* Copyright (c) 2007-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 CDSAKeyGenerator class +* INCLUDES +* +*/ + + +#include "DSAKeyGenerator.h" +#include + +// =========================================================================== +// Construction/Destruction +// =========================================================================== + +CDSAKeyGenerator::CDSAKeyGenerator() + { + + } + +CDSAKeyGenerator::~CDSAKeyGenerator() + { + + } + +int CDSAKeyGenerator::Generate() +//Generate a DSA key with pre-determined length + { + unsigned char* pbSeed = NULL; + DSA* pDSAParams = 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 dwKeyLength = 0; + dwKeyLength = GetKeyLength(); + + try + { + retVal = GenerateSeed(dwKeyLength, &pbSeed); + if(retVal != SUCCESS) + { + throw EMSCrypto; + } + + //Generate DSA params (p,q and g) + _tprintf(_T("\nGenerating DSA key .")); + pDSAParams = DSA_generate_parameters(dwKeyLength, pbSeed, dwKeyLength, NULL, NULL, DSAKeyStatus, NULL); + if(!pDSAParams) + { + PrintErrorInfo("Error generating DSA key params!", EOPENSSL, constparams); + throw EOPENSSL; + } + + //Generate DSA key + retVal = DSA_generate_key(pDSAParams); + if(!retVal) + { + PrintErrorInfo("DSA 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 EOPENSSL; + } + + //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_DSAPrivateKey(fp, pDSAParams, EVP_des_ede3_cbc(), (unsigned char *) pbPassword, len, NULL, NULL); + delete pbPassword; + } + else if(m_bAsk) + { + retVal = PEM_write_DSAPrivateKey(fp, pDSAParams, EVP_des_ede3_cbc(), NULL, 0, NULL, NULL); + } + else + { + _tprintf(_T("\n")); + retVal = PEM_write_DSAPrivateKey(fp, pDSAParams, NULL , NULL, 0, NULL, NULL); + } + + if(!retVal) + { + PrintErrorInfo("Error writing to key file", EOPENSSL, constparams); + throw EOPENSSL; + } + //Free variables + DSA_free(pDSAParams); + fclose(fp); + SYMBIAN_FREE_MEM(pbSeed); + + //Get command prompt handle + HANDLE hndl = 0; + hndl = GetStdHandle(STD_OUTPUT_HANDLE); + _tprintf(_T("\nCreated key: ")); + DWORD bytesWritten; + WriteConsole(hndl, pPrivKeyFile, wcslen(pPrivKeyFile), &bytesWritten, NULL); + retFunc = SUCCESS; + + } + catch (...) + { + //Delete dsa params + if(pDSAParams) + { + DSA_free(pDSAParams); + } + if (fp) + { + fclose(fp); + } + SYMBIAN_FREE_MEM(pbSeed); + } + + return retFunc; +} + +//DSA key generation callback function +static void DSAKeyStatus(int aCode, int aArg, void* aCbArg) + { + + if (aCode == 1 && aArg && !(aArg % 3)) + { + printf("."); + } + return; + }