--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/secureswitools/swisistools/source/signsis/parameter.cpp Tue Jan 26 12:06:03 2010 +0200
@@ -0,0 +1,391 @@
+/*
+* Copyright (c) 2004-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:
+* Note: This file may contain code to generate corrupt files for test purposes.
+* Such code is excluded from production builds by use of compiler defines;
+* it is recommended that such code should be removed if this code is ever published publicly.
+*
+*/
+
+
+/**
+ @file
+ @internalComponent
+ @released
+*/
+
+#include "parameter.h"
+#include "openssllicense.h"
+#include "utility.h"
+#include <string.h>
+
+
+#include <iostream>
+
+CParameter::CParameter () :
+ iSign (false),
+ iUnsign (false),
+ iReport (false),
+ iVerbose (false),
+ iDump (false),
+ iAlgorithm (CSISSignatureAlgorithm::EAlgNone)
+ {
+ }
+
+
+
+bool CParameter::CommandLine (int argc, _TCHAR* argv[])
+
+{
+ bool help = argc == 1;
+ bool ssl = false;
+ unsigned char stage = 0;
+ bool bien = argc > 1;
+ bool multi = false;
+
+ iSign = true;
+
+ for (int index = 1; index < argc; index++)
+ {
+ if ( (argv [index][0] == '-') ||
+ (argv [index][0] == '/'))
+ {
+ // cope with multiple arguments following the '-' or '/'
+ int wCharacter = 1;
+ while (argv[index][wCharacter] !='\0')
+ {
+ switch (argv [index][wCharacter])
+ {
+ case 'a' :
+ case 'A' :
+#ifdef _DEBUG
+ iDump = true;
+#endif
+ break;
+#ifdef GENERATE_ERRORS
+ case 'b' :
+ case 'B' :
+ {
+ for (int offset = wCharacter+1; argv [index] [offset]; offset++)
+ {
+ switch(argv [index] [offset])
+ {
+ case 'a' :
+ case 'A' :
+ CSISFieldRoot::SetBug (CSISFieldRoot::EBugArrayCount);
+ break;
+ case 'b' :
+ case 'B' :
+ CSISFieldRoot::SetBug (CSISFieldRoot::EBugInsaneBlob);
+ break;
+ case 'c' :
+ case 'C' :
+ CSISFieldRoot::SetBug (CSISFieldRoot::EBugCRCError);
+ break;
+ case 'e' :
+ case 'E' :
+ CSISFieldRoot::SetBug (CSISFieldRoot::EBugBigEndian);
+ break;
+
+ case 'f' :
+ case 'F' :
+ CSISFieldRoot::SetBug (CSISFieldRoot::EBugDuffFieldType);
+ break;
+ case 'h' :
+ case 'H' :
+ CSISFieldRoot::SetBug (CSISFieldRoot::EBugHashError);
+ break;
+ case 'l' :
+ case 'L' :
+ CSISFieldRoot::SetBug (CSISFieldRoot::EBugInvalidLength);
+ break;
+ case 'm' :
+ case 'M' :
+ CSISFieldRoot::SetBug (CSISFieldRoot::EBugMissingField);
+ break;
+ case 'n' :
+ case 'N' :
+ CSISFieldRoot::SetBug (CSISFieldRoot::EBugNegativeLength);
+ break;
+ case 's' :
+ case 'S' :
+ CSISFieldRoot::SetBug (CSISFieldRoot::EBugInsaneString);
+ break;
+ case 't' :
+ case 'T' :
+ CSISFieldRoot::SetBug (CSISFieldRoot::EBug32As64);
+ break;
+ case 'u' :
+ case 'U' :
+ CSISFieldRoot::SetBug (CSISFieldRoot::EBugUnexpectedField);
+ break;
+ case 'v' :
+ case 'V' :
+ CSISFieldRoot::SetBug (CSISFieldRoot::EBugInvalidValues);
+ break;
+ case 'x' :
+ case 'X' :
+ CSISFieldRoot::SetBug (CSISFieldRoot::EBugUnknownField);
+ break;
+ }
+ wCharacter++;
+ }
+ }
+ break;
+#endif // GENERATE_ERRORS
+ case 'c' :
+ case 'C' :
+ {
+ switch (argv [index][wCharacter+1])
+ {
+ case 'd' :
+ case 'D' :
+ if (iAlgorithm != CSISSignatureAlgorithm::EAlgNone)
+ {
+ multi = true;
+ break;
+ }
+ iAlgorithm = CSISSignatureAlgorithm::EAlgDSA;
+ break;
+ case 'r' :
+ case 'R' :
+ if (iAlgorithm != CSISSignatureAlgorithm::EAlgNone)
+ {
+ multi = true;
+ break;
+ }
+ iAlgorithm = CSISSignatureAlgorithm::EAlgRSA;
+ break;
+ }
+ wCharacter++;
+ }
+ break;
+ case 'h' :
+ case 'H' :
+ case '?' :
+ help = true;
+ break;
+ case 'i' :
+ case 'I' :
+ ssl = true;
+ break;
+ case 'o' :
+ case 'O' :
+ iReport = true;
+ iSign = false;
+ break;
+ //EC023 additional prarameter added to extract the certificate
+ case 'p' :
+ case 'P' :
+ iExtractCert = true;
+ iSign = false;
+ break;
+#ifdef GENERATE_ERRORS
+ case 'q' :
+ case 'Q' :
+ CSISFieldRoot::SetBugStart (atoi(wstring2string (&argv [index] [wCharacter+1]).c_str ()));
+ wCharacter++;
+ break;
+ case 'r' :
+ case 'R' :
+ CSISFieldRoot::SetBugRepeat (atoi (wstring2string (&argv [index] [wCharacter+1]).c_str ()));
+ wCharacter++;
+ break;
+#endif // GENERATE_ERRORS
+ case 's' :
+ case 'S' :
+ iSign = true;
+ break;
+ case 'u' :
+ case 'U' :
+ iUnsign = true;
+ iSign = false;
+ break;
+ case 'v' :
+ case 'V' :
+ iVerbose = true;
+ break;
+ case 'x' :
+ case 'X' :
+ {
+ for (int offset = wCharacter+1; argv [index][offset]; offset++)
+ {
+ switch(argv[index][offset])
+ {
+ case 'c' :
+ case 'C' :
+ CSISFieldRoot::SetDebugOption (CSISFieldRoot::EDbgControllerChecksum);
+ break;
+ case 'd' :
+ case 'D' :
+ CSISFieldRoot::SetDebugOption (CSISFieldRoot::EDbgDataChecksum);
+ break;
+ case 'w' :
+ case 'W' :
+ CSISFieldRoot::SetDebugOption (CSISFieldRoot::EDbgCompress);
+ break;
+ case 'x' :
+ case 'X' :
+ CSISFieldRoot::SetDebugOption (CSISFieldRoot::EDbgNoCompress);
+ break;
+ }
+ wCharacter++;
+ }
+ }
+ break;
+
+ default :
+ std::cout << "Unknown switch " << argv [index];
+ bien = false;
+ break;
+ }
+ wCharacter++;
+ }
+ }
+ else
+ {
+ switch (stage)
+ {
+ case 0 :
+ iSISFileName = argv [index];
+ break;
+ case 1 :
+ iOutput = argv [index];
+ break;
+ case 2 :
+ iCertificate = argv [index];
+ break;
+ case 3 :
+ iKey = argv [index];
+ break;
+ case 4 :
+ iPassPhrase = argv [index];
+ break;
+ default :
+ if (bien)
+ {
+ std::cout << "Unexpected arguments from "; //<< std::string (argv [index]) << "." << std::endl;
+ HANDLE hndl;
+ DWORD bytesWritten;
+ //Get command prompt handle
+ hndl = GetStdHandle(STD_OUTPUT_HANDLE);
+ WriteConsole(hndl, argv [index], wcslen(argv [index]), &bytesWritten, 0);
+ std::cout << "." << std::endl;
+ bien = false;
+ }
+ break;
+ }
+ stage++;
+ }
+ }
+
+ if (bien && ! iSign && ! iUnsign && ! iReport && !iExtractCert)
+ {
+ std::cout << "Nothing to do." << std::endl;
+ bien = false;
+ }
+
+ if (bien && multi)
+ {
+ std::cout << "More than one signing algorithm specified." << std::endl;
+ bien = false;
+ }
+
+ if (bien)
+ {
+ if (iSign && iUnsign)
+ {
+ std::cout << "Can't sign and unsign in single operation." << std::endl;
+ bien = false;
+ }
+ else
+ if (iSign || iUnsign || iReport || iExtractCert)
+ {
+ if (iSISFileName.empty ())
+ {
+ std::cout << "Please name the input file." << std::endl;
+ bien = false;
+ }
+ else
+ if ((! iReport && iOutput.empty ())&& (! iExtractCert && iOutput.empty()))
+ {
+ std::cout << "Please name the output file." << std::endl;
+ bien = false;
+ }
+ }
+ }
+
+ if (iVerbose)
+ {
+ ShowBanner ();
+ }
+
+ if (bien && ! iSign && ! iCertificate.empty ())
+ {
+ std::cout << "A certificate is only used for signing a sis file." << std::endl;
+ bien = false;
+ }
+
+ if (! bien && ! help)
+ {
+ std::cout << "Type \"" << "signsis" << " -?\" for command line options." << std::endl;
+ }
+
+ if (ssl)
+ {
+ for (int index = 0; index < (sizeof(openSSLLicenseString)/sizeof(openSSLLicenseString[0])); index++)
+ std::cout << openSSLLicenseString [index] << std::endl;
+ std::cout << std::endl;
+ bien = false;
+ }
+
+ if (help)
+ {
+ std::cout << "Usage: SignSIS [-?] [-c...] [-i] [-o[-p]] [-s] [-u] [-v] input [output [certificate key [passphrase] ] ]" << std::endl << std::endl;
+ std::cout << "-? or -h Output this information" << std::endl;
+ std::cout << "-c... Sign using specific algorithm: -cd for DSA, -cr for RSA" << std::endl;
+ std::cout << "-i Output licence information" << std::endl;
+ std::cout << "-o Report on content of sis file (after any other operation)" << std::endl;
+ std::cout << "-p Extracts the certificates present (This option has to be given along with -o option)"<< std::endl;
+ std::cout << "-s Sign SIS file (requires sis file, certificate, key and passphrase)" << std::endl;
+ std::cout << "-u Remove most recent signature from SIS file" << std::endl;
+ std::cout << "-v Verbose output" << std::endl;
+ std::cout << "input The SIS file to be sign, unsigned or investigated" << std::endl;
+ std::cout << "output The SIS file generated by signing or unsigned" << std::endl;
+ std::cout << "certificate The certificate file used for signing" << std::endl;
+ std::cout << "key The certificate's private key file" << std::endl << std::endl;
+ std::cout << "passphrase The certificate's private key file's passphrase" << std::endl << std::endl;
+ std::cout << "You can sign or unsign a file in a single operation." << std::endl;
+ std::cout << "You can generate SIS files using MakeSIS v5." << std::endl << std::endl;
+ bien = false;
+ }
+
+ return bien;
+}
+
+void CParameter::ShowBanner()
+// Displays the copyright...
+ {
+ std::cout << std::endl << "SIGNSIS " << " Version 5.1" << std::endl;
+ std::cout << "A utility for signing Software Installation (SIS) files." << std::endl;
+ std::cout << "Copyright (c) 2007 Symbian Software Ltd. All rights reserved. " << std::endl;
+#ifdef _DEBUG
+ std::cout << std::endl << "Development Version" << std::endl;
+#endif
+ std::cout << std::endl;
+ }
+
+
+
+bool CParameter::iExtractCert=false;