secureswitools/makekeys/src/MAKEKEYS.CPP
changeset 4 32704c33136d
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/secureswitools/makekeys/src/MAKEKEYS.CPP	Tue Jan 26 12:06:03 2010 +0200
@@ -0,0 +1,304 @@
+/*
+* Copyright (c) 1997-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: 
+* makekeys main function
+* INCLUDES
+*
+*/
+
+
+#include <windows.h>
+#include <iostream> 
+#include <tchar.h>
+#include "utils.h"
+#include "makekeys.h"
+
+#define NORSA	//to keep DTI sweet!
+
+#ifdef KEYS	//define KEYS for standalone keygen support (ie -KEYS works)
+#undef KEYS
+#endif
+
+// ===========================================================================
+// CONSTANTS
+// ===========================================================================
+
+// Set up the cout stream so that we can use it with either narrow or wide
+// chars at build time
+using namespace std;
+#undef OUT
+
+#ifdef _UNICODE
+#define OUT wcout
+#else
+#define OUT cout
+#endif
+
+
+// ===========================================================================
+// CMakeKeys
+// The main application object. Interfaces to Wincrypto.lib
+// ===========================================================================
+
+
+CMakeKeys::CMakeKeys()
+:m_fVerbose(FALSE)
+	{ ; }
+
+int CMakeKeys::Run(const int argc, const _TCHAR *argv[], const _TCHAR *envp[])
+// Inputs   : argc, argv, envp - The command line passed to the process
+	{	
+	BOOL bValid = TRUE;
+	m_KeyGen = NULL;
+	pMakeCert = NULL;
+	pReq = NULL;
+
+	try
+		{
+		m_CmdOptions.ParseCommandLine(argc, argv, &m_dwMode);
+
+		// We now have valid parameters
+		SetVerbose(m_CmdOptions.GetVerbose());
+		}
+	catch(TCommandLineException)
+		{
+		// Show the title and help
+		ShowBanner();
+		ShowUsage();
+		
+		return 1;
+		}
+	catch(TUtilsException err)
+		{
+		ShowUtilsError(err);
+		}
+	catch(TAppError apperr)
+		{
+		OUT << endl << _T("Internal application error" << apperr) << endl;
+		}
+	
+#ifdef KEYS
+	//Key maker, -keys is not in the spec but its handy to have for testing!
+
+	DoVerbage(_T("Generating private key..."));
+	if (m_dwMode == EKeys)
+		{ 
+		if (m_CmdOptions.GetKeyType() == EDSACipher)
+			{
+			m_KeyGen = new CDSAKeyGenerator;
+			}
+		else
+			{
+			m_KeyGen = new CRSAKeyGenerator;
+			}
+		
+		if (!m_KeyGen) throw ErrOutOfMemory;
+		
+		m_KeyGen->SetKeyLength(m_CmdOptions.GetCMDKeyLen());
+		m_KeyGen->SetPasswordRequirement(m_CmdOptions.GetPasswordEnabled());
+		m_KeyGen->SetPrivateKeyFile(m_CmdOptions.GetPrivateName());
+		m_KeyGen->SetVerbose(m_CmdOptions.GetVerbose());
+		
+		//If user did not supply password to encrypt private key before writing, get it
+		if (!m_CmdOptions.GetPasswordEnabled())
+			{
+			char Warn[128];
+
+			OUT << _T("Warning: the private key should be encrypted with the -password option") << endl;
+			OUT << _T("Do you want to use a password (y/n)? ");
+
+			cin >> Warn;
+
+			if (stricmp(Warn, "n") != 0)
+				{
+				m_KeyGen->SetAskPassword(TRUE);
+				}
+			} 
+		else
+			{
+			m_KeyGen->SetPassword(m_CmdOptions.GetPassword());
+			}
+
+		m_KeyGen->Generate();
+
+		if (m_KeyGen) delete m_KeyGen;
+		}
+#endif
+	
+	//create a Self Signed Cert
+	if (m_dwMode == ECert)
+		{
+		DoVerbage(_T("Generating private key and self-signed certificate..."));
+		
+		pMakeCert = new CCertificateGenerator;
+		if (!pMakeCert) throw ErrOutOfMemory;
+			
+		pMakeCert->SetKeyLength(m_CmdOptions.GetCMDKeyLen());
+		pMakeCert->SetPasswordRequirement(m_CmdOptions.GetPasswordEnabled());
+		if(m_CmdOptions.GetPasswordEnabled())
+		pMakeCert->SetPassword(m_CmdOptions.GetPassword());
+		if(m_CmdOptions.GetDNameString())
+			pMakeCert->SetDName(m_CmdOptions.GetDNameString());
+		pMakeCert->SetPrivKeyName(m_CmdOptions.GetPrivateName());
+		pMakeCert->SetCertificateName(m_CmdOptions.GetPublicName());
+		pMakeCert->SetVerbose(m_CmdOptions.GetVerbose());
+		
+#ifndef NORSA
+		pMakeCert->SetKeyType(m_CmdOptions.GetKeyType());
+#else
+			pMakeCert->SetKeyType(EDSACipher);
+#endif
+		
+			if ((!m_CmdOptions.GetPasswordEnabled()) && (!pMakeCert->Exists(m_CmdOptions.GetPrivateName()) ))
+				{
+				char Warn[128];
+
+				OUT << _T("Warning: the private key should be encrypted with the -password option") << endl;
+				OUT << _T("Do you want to use a password (y/n)? ");
+
+				cin >> Warn;
+
+				if (stricmp(Warn, "n") != 0)
+					{
+					pMakeCert->SetAskPassword(TRUE);
+					}
+				}
+		
+			if (!pMakeCert->Exists(m_CmdOptions.GetPrivateName()))
+				{
+				//OUT << _T("Generating private key...") << endl;
+				}
+
+			pMakeCert->MakeSelfSigned(_T(""),m_CmdOptions.GetDNameString(),
+			m_CmdOptions.GetPrivateName(), m_CmdOptions.GetPublicName(),
+			m_CmdOptions.GetCMDKeyLen(),0,m_CmdOptions.GetCMDCertExpiryInDays());
+
+			if (pMakeCert) delete pMakeCert;
+			}
+	
+		//Create a CSR from command line parameters
+		
+		if (m_dwMode == EReq)
+			{
+			DoVerbage(_T("Generating certificate request...\n"));
+			
+			pReq = new CCertificateRequestGenerator();
+			if (!pReq) throw ErrOutOfMemory;
+			
+			pReq->SetVerbose(m_CmdOptions.GetVerbose());	//enable additional reporting within Wincrypto
+			pReq->SetPasswordRequirement(m_CmdOptions.GetPasswordEnabled());
+			pReq->SetPassword(m_CmdOptions.GetPassword());
+			pReq->SetDName(m_CmdOptions.GetDNameString());
+			pReq->SetPrivKeyName(m_CmdOptions.GetPrivateName());
+			pReq->SetCertificateName(m_CmdOptions.GetPublicName());
+			pReq->SetRequestName(m_CmdOptions.GetRequestName());
+			
+			pReq->Generate();
+
+			if (pReq) delete pReq;
+			}
+		
+			return 0;
+		}
+	
+	void CMakeKeys::ShowBanner()
+		// Displays the copyright gumph...
+		{
+		short	major = KMakeKeysVersion / 100,
+				minor = KMakeKeysVersion % 100;
+	
+		// Show the title
+		OUT << endl << _T("MakeKeys, version ") << major << _T(".") << minor << endl;
+		OUT << _T("Creates public/private key pairs and certificate requests for use with makesis.") << endl;
+#ifdef _DEBUG
+		OUT << _T("Development Version") << endl;
+#endif
+	OUT << _T("Copyright (c) 2007 Symbian Ltd. All rights reserved.") << endl;
+	OUT << endl;
+	}
+
+	void CMakeKeys::ShowUtilsError(TUtilsException err)
+		// Purpose  : Not currently used
+		// Inputs   : err - the error ID
+		{
+		switch(err)
+			{
+			case ErrNotEnoughMemory:
+				DoErrMsg(_T("not enough memory"));
+				break;
+			}
+		}
+
+	void CMakeKeys::ShowUsage()
+		// Write command line help to STDOUT (cout/wcout)
+		{
+		OUT << _T("Usage:") << endl;
+		
+	OUT << _T(" makekeys -cert [-expdays <cert-expiry-in-days>] [-password <password> <At least 4 characters>] [-len <key-length>] -dname <distinguised-name-string> <private-key-file> <public-key-cert>") << endl;	
+	OUT << _T(" makekeys -req [-password <password> <At least 4 characters>] -dname <distinguised-name-string> <private-key-file> <public-key-cert> <cert-request-file>") << endl;	
+	OUT << _T(" makekeys -view <certificate-file>") << endl << endl;
+	OUT << _T(" (use -v on the command line for verbose mode)") << endl;
+	OUT << _T(" (use -i on the command line for license information)") << endl;
+	OUT << endl;
+		
+
+		OUT << _T("Notes:") << endl;
+		OUT << _T(" For -cert if the private-key-file does not exist it will be created") << endl;	
+		OUT << _T(" Distinguished name string format:") << endl;	
+		OUT << _T("    CN - Common Name, e.g. CN=Joe Bloggs") << endl;
+		OUT << _T("    C - Country, e.g. C=GB") << endl;
+		OUT << _T("    O - Organisation, e.g. O=Acme Ltd") << endl;
+		OUT << _T("    OU - Organisational Unit, e.g. OU=Development") << endl;
+		OUT << _T("    EM - E-Mail address, e.g. EM=noone@nowhere.com") << endl;
+		OUT << _T(" A distinguished name strings needs at least two attributes") << endl;
+		OUT << _T(" Certificate expiry date(in days) can be specified by the user (optional) , else defaults to a year.") << endl;
+		OUT << endl;
+
+
+		OUT << _T("Example Usage:") << endl;
+		
+		OUT << _T(" makekeys -cert -expdays 3650 -password yourpassword -len 2048 -dname \"CN=Joe Bloggs OU=Development O=Acme Ltd C=GB EM=noone@nowhere.com\" mykey.key mycert.cer") << endl;
+		OUT << _T(" makekeys -req -password yourpassword -dname \"CN=Joe Bloggs OU=Development O=Acme Ltd C=GB EM=noone@nowhere.com\" mykey.key mycert.cer myreq.p10") << endl; 
+		}
+
+
+	void CMakeKeys::DoVerbage(const _TCHAR* pszText) const
+		// Purpose  : Displays 'verbose' output text - if appropriate
+		// Inputs   : pszText - The text to display
+		{
+		if(Verbose())
+			DoMsg(_T(""),pszText);
+		}
+
+	void CMakeKeys::DoErrMsg(const _TCHAR* pszText) const
+		{
+		DoMsg(_T("error: "),pszText);
+		}	
+
+	void CMakeKeys::DoMsg(const _TCHAR* pszText1, const _TCHAR* pszText2) const
+	// Purpose  : Displays 'verbose' output text - if appropriate
+	// Inputs   : pszText - The text to display
+		{
+		OUT << pszText1 << pszText2 << endl;
+		}
+
+	// main function - constructs a CMakeKeys object and calls it's run method
+	extern "C"
+		{
+		int _tmain(int argc, const _TCHAR *argv[], const _TCHAR *envp[])
+			{
+			CMakeKeys app;
+			return app.Run(argc, argv, envp);
+			}
+		}