--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/secureswitools/makekeys/src/PARSECMD.CPP Thu Dec 17 08:51:10 2009 +0200
@@ -0,0 +1,345 @@
+/*
+* Copyright (c) 1999-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:
+* handles parsing of makekeys command line args
+* INCLUDES
+*
+*/
+
+
+#include <windows.h>
+#include <tchar.h>
+
+#include "ParseCMD.h"
+#include "openssllicense.h"
+
+//#include <winCertificateGenerator.h>
+
+// ===========================================================================
+// CParseCmd
+// Responsable for processing and maintaining the command line options
+// ===========================================================================
+
+CParseCmd::CParseCmd()
+:m_dwOptions(0L),
+m_fShowSyntax(FALSE)
+ {
+ m_dwKeyLen = DEFAULTKEYLEN;
+ m_dwCertExpiryInDays = DEFAULTCERTEXPIRYDAYS;
+ m_bPassword = FALSE;
+ m_CMDKey = EDSACipher;
+ m_bVerbose = FALSE;
+ }
+
+BOOL CParseCmd::ParseCommandLine(const int argc, const _TCHAR *argv[], Mode* aApp)
+// Purpose : Proceses the command line, and options
+// Inputs : argc, argv - command line as passed to the process
+ {
+
+ // Test the number of arguments
+ if(argc < 2) throw ErrInsufficientArgs;
+
+ int wCount = 1;
+ int dname = 0;
+ int founddname = 0;
+ int command_count = 0;
+
+ int MBCSstrlen; //used to store the length of MBCS strings
+
+ // walk through the argv[] list, picking out -parameters and parameter strings.
+ // Also sets mode of operation of the app
+ while(wCount < argc)
+ {
+
+ //check we don't have a NULL string here
+ if(argv[wCount][1] == '\0')
+ throw ErrBadCommandFlag;
+
+
+ /* Uncomment below for standalone key generation support
+ //parse command list for operational parameters
+ if (_tcscmp("-keys", argv[wCount]) == 0)
+ {
+ *aApp = EKeys;
+ //wcscpy(m_privateKeyFile, argv[argc - 2]);
+ wcscpy(m_privateKeyFile, argv[argc - 1]);
+ }
+
+ else
+ */
+
+ //display OpenSSL copyright notice.
+ if (_tcsicmp(_T("-i"), argv[wCount]) == 0)
+ {
+ for (int index = 0; index < (sizeof(openSSLLicenseString)/sizeof(openSSLLicenseString[0])); ++index)
+ {
+ std::cout << openSSLLicenseString [index] << std::endl ;
+ }
+ break;
+ }
+
+ if (_tcsicmp(_T("-cert"), argv[wCount]) == 0)
+ {
+ if ((*aApp == ECert) || (*aApp == EReq))
+ {
+ throw ErrMalformedCommand;
+ }
+ else
+ {
+ *aApp = ECert;
+ }
+
+ if (argc < MIN_CERT_ARGS) throw ErrInsufficientArgs;
+
+ }
+
+ else if (_tcsicmp(_T("-req"), argv[wCount]) == 0)
+ {
+ if ((*aApp == ECert) || (*aApp == EReq))
+ {
+ throw ErrMalformedCommand;
+ }
+ else
+ {
+ *aApp = EReq;
+ }
+
+ if (argc < MIN_REQ_ARGS) throw ErrBadReqCommand;
+
+ founddname = 1;
+ }
+
+#ifdef OPTIONAL
+ else if (_tcsicmp(_T("-chain"), argv[wCount]) == 0)
+ {
+ *aApp = EChain;
+ command_count++;
+ }
+#endif
+ else if (_tcsicmp(_T("-view"), argv[wCount]) == 0)
+ {
+
+ if (argc == MIN_VIEW_ARGS)
+ {
+ CCertificateGenerator* pView = new CCertificateGenerator;
+ if (!pView) throw ErrCantViewCertificate;
+
+ pView->View(argv[wCount + 1]);
+
+ delete pView;
+ }
+ else
+ throw ErrMalformedCommand;
+
+ }
+
+ else if (_tcsicmp(_T("-password"), argv[wCount]) == 0)
+ {
+ m_bPassword = true;
+ command_count+=2;
+
+ if (wCount < argc - 1)
+ {
+ _tcscpy(m_password, argv[wCount + 1]);
+ if(!(_tcslen(m_password) >=4) )
+ {
+ _tprintf(_T("Error: Invalid Password\n"));
+ throw ErrInvalidPassword;
+ }
+ }
+ else
+ throw ErrInsufficientArgs;
+
+ }
+
+#ifndef NORSA
+ else if (_tcsicmp(_T("-rsa"), argv[wCount]) == 0)
+ {
+ m_CMDKey = ERSACipher;
+ command_count++;
+ }
+#endif
+
+ else if (_tcsicmp(_T("-dsa"), argv[wCount]) == 0)
+ {
+ m_CMDKey = EDSACipher;
+ command_count++;
+ }
+
+ else if(_tcsicmp(_T("-dname"), argv[wCount]) == 0)
+ {
+ if(wCount < argc - 1)
+ {
+ //handle MBCS correctly (we are assuming that the parameter after -dname IS the dname string
+ MBCSstrlen = _tcslen(argv[wCount + 1]) * sizeof(TCHAR);
+ _tcscpy(m_dname, argv[wCount + 1]);
+ dname = 1;
+ }
+ else
+ throw ErrInsufficientArgs;
+ }
+ else if(_tcsicmp(_T("-len"), argv[wCount]) == 0)
+ {
+ //handle MBCS correctly
+ if(wCount < argc - 1)
+ {
+ _tcscpy(m_KeyLenStr, argv[wCount + 1]);
+ _stscanf(m_KeyLenStr, _T("%d"), &m_dwKeyLen);
+
+ command_count+=2; //len takes an additional parameter, so bump by 2
+
+ if (m_dwKeyLen < 512 || m_dwKeyLen > 4096)
+ {
+ _tprintf(_T("Error: key length should be between 512 and 4096\n"));
+ throw ErrInsufficientArgs;
+ }
+ }
+ else
+ throw ErrInsufficientArgs;
+ }
+
+ else if (_tcsicmp(_T("-expdays") , argv[wCount]) == 0 )
+ {
+ if(wCount < argc - 1)
+ {
+ _tcscpy(m_CertExpiryInDaysStr, argv[wCount + 1]);
+ _stscanf(m_CertExpiryInDaysStr, _T("%d"), &m_dwCertExpiryInDays);
+
+ command_count+=2; //expiry days takes an additional parameter, so command_count+2
+ }
+
+ else
+ {
+ throw ErrInsufficientArgs;
+ }
+ }
+
+ else if(_tcsicmp(_T("-v"), argv[wCount]) == 0)
+ {
+ SetVerbose(TRUE);
+ command_count++; //-v does not take args, so bump by 1
+ }
+ else if(argv[wCount][0] == '-')
+ //if we get here we can't parse the option chosen
+ {
+ _tprintf(_T("Error: unknown command option %s\n"), argv[wCount]);
+ throw ErrUnknownCommandFlag;
+ }
+
+ wCount++;
+ }
+
+ //distinguished names are not optional, so throw up a message
+ if (!dname && founddname)
+ {
+ _tprintf(_T("Error: Missing \"-dname\" command\n"));
+ throw ErrInsufficientArgs;
+ }
+
+
+ //check to see if all the optional commands have the correct number of arguments
+ if (((command_count + MIN_REQ_ARGS > argc) && (*aApp == EReq)) ||
+ ((command_count + MIN_CERT_ARGS > argc) && (*aApp == ECert)))
+
+ {
+ printf("Error: Command Line malformed - too few arguements\n");
+ throw ErrInsufficientArgs;
+ }
+
+ if (*aApp == EReq)
+ {
+ _tcscpy(m_privateKeyFile, argv[command_count + 4]);
+ _tcscpy(m_publicKeyFile, argv[command_count + 5]);
+ _tcscpy(m_requestFile, argv[command_count + 6]);
+
+
+ if (wCount >= (command_count+2) + MIN_REQ_ARGS - 1)
+ {
+ printf("Error: Too many arguments for -req command\n");
+ throw ErrTooManyArgs;
+ }
+ }
+
+ if (*aApp == ECert)
+ {
+ _tcscpy(m_privateKeyFile, argv[command_count + 4]);
+ _tcscpy(m_publicKeyFile, argv[command_count + 5]);
+
+ if (wCount >= (command_count+2) + MIN_CERT_ARGS - 1)
+ {
+ _tprintf(_T("Error: too many arguments for -cert command\n"));
+ throw ErrTooManyArgs;
+ }
+ }
+ }
+
+int CParseCmd::GetCMDKeyLen()
+ {
+ return m_dwKeyLen;
+ }
+
+int CParseCmd::GetCMDCertExpiryInDays()
+ {
+ return m_dwCertExpiryInDays;
+ }
+
+_TCHAR* CParseCmd::GetPrivateName()
+ {
+ return m_privateKeyFile;
+ }
+
+_TCHAR* CParseCmd::GetPublicName()
+ {
+ return m_publicKeyFile;
+ }
+
+_TCHAR* CParseCmd::GetRequestName()
+ {
+ return m_requestFile;
+ }
+
+_TCHAR* CParseCmd::GetDNameString()
+ {
+ return m_dname;
+ }
+
+
+
+
+_TCHAR* CParseCmd::GetPassword()
+ {
+ return m_password;
+ }
+
+TKeyType CParseCmd::GetKeyType()
+ {
+ return m_CMDKey;
+ }
+
+bool CParseCmd::GetPasswordEnabled()
+ {
+ return m_bPassword;
+ }
+
+void CParseCmd::SetVerbose(const bool bVerbose)
+ {
+ m_bVerbose = bVerbose;
+
+ }
+
+bool CParseCmd::GetVerbose()
+ {
+ return m_bVerbose;
+
+ }