secureswitools/swianalysistoolkit/source/chainvalidityandinstallfilestatustools/dumpinstallfilestatustool/dumpinstallfilestatustool.cpp
changeset 0 ba25891c3a9e
child 44 329d304c1aa1
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/secureswitools/swianalysistoolkit/source/chainvalidityandinstallfilestatustools/dumpinstallfilestatustool/dumpinstallfilestatustool.cpp	Thu Dec 17 08:51:10 2009 +0200
@@ -0,0 +1,199 @@
+/*
+* Copyright (c) 2005-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: 
+*
+*/
+
+
+#include "dumpinstallfilestatustool.h"
+#include "osinterface.h"
+#ifdef _MSC_VER
+#include <new>
+#include <new.h>
+#endif /* _MSC_VER */
+using namespace std;
+
+#ifdef _MSC_VER
+// House-keeping to allow ::new to throw rather than return NULL in MSVC++
+int throwingHandler(size_t)
+{
+	throw std::bad_alloc();
+	return 0;
+}
+#endif /* _MSC_VER */
+
+
+// entry point
+int main(int argc,char *argv[])
+	{
+#ifdef _MSC_VER
+	_set_new_handler (throwingHandler);	// Make ::new throw rather than return NULL
+#endif /* _MSC_VER */
+
+	if(argc < 2)
+		{
+		Options::DisplayUsage();
+		return 0;
+		}
+
+	OpenSSL_add_all_algorithms ();
+	OpenSSL_add_all_ciphers ();
+	OpenSSL_add_all_digests ();
+
+	try
+		{
+		auto_ptr<DumpInstallFileStatusTool> tool(new DumpInstallFileStatusTool);
+		auto_ptr<Options> options(new Options(argc,argv));
+		tool->Run(*options);
+		}
+	
+	catch (Exceptions& aErr)
+		{
+		Options::DisplayError (aErr);
+		return aErr;
+		}
+	
+	catch (bad_alloc&)
+		{
+		cout << "Error Allocating Memory " << endl ;
+		}
+
+	return 0;
+	}
+
+// Class DumpInstallFileStatusTool
+DumpInstallFileStatusTool::DumpInstallFileStatusTool()
+	:iSISData(0) ,
+	iChainValidity(0)
+	{
+	}
+
+void DumpInstallFileStatusTool::Run(const Options& aOptions)
+	{
+	int dumpchainvalidityData = 0 ;
+	LaunchProcess launch;
+	ofstream fileName;
+
+	iChainValidity = new DumpChainValidityTool();
+	iChainValidity -> Run(aOptions);
+	dumpchainvalidityData = iChainValidity -> GetUnifiedCaps();
+
+	std::string inputParameter = KDumpsisInputParameter;
+	inputParameter.append(aOptions.SISFile());
+	string dumpsisData = launch.ExecuteProcess(inputParameter,2);
+	
+	fileName.open(KEciFile.c_str(),ios::out);
+	fileName.write(dumpsisData.c_str(),dumpsisData.length());
+	fileName.close();
+	
+
+	CloseHandle(launch.piProcessInfo.hProcess);
+	CloseHandle(launch.piProcessInfo.hThread);
+
+	iSISData = new SISFileData();
+	int isExe = iSISData->EciFileRead(KEciFile.c_str(),aOptions);
+	//in case sis file doesn't contain any executable.
+	if(!isExe)
+		{
+		return;
+		}
+
+	int mergedCaps = (aOptions.UserCapabilities())|(dumpchainvalidityData);
+	const SISFileData::ExeLabelAndCapabilitiesList* exeList = iSISData->ExeNameAndCapabilityList();
+	while(exeList)
+		{
+		Correlate(exeList -> iExeCapability, mergedCaps, dumpchainvalidityData, exeList -> iExeLabel);
+		exeList = exeList -> iNext;
+		}
+	remove(KEciFile.c_str());	
+	}
+
+void DumpInstallFileStatusTool::Correlate(const int aExeCapabilities , int MergedCapabilities , int aUnifiedSigningCertCaps , const string& aExeLabel)
+	{
+	int missingCaps;
+	int loc = aExeLabel.find(".exe" , 0);
+	int pos = aExeLabel.find(".dll" , 0);
+	//correlate only if the file is an exe or dll.
+	if(loc > 0 || pos > 0 )
+		{
+		cout << "Executable : " << endl << endl;
+		//when exe has no capabilities.
+		if(aExeCapabilities == 0)
+			{
+			cout << aExeLabel << endl << endl;
+			cout << "FILE STATUS : Has No Capabilities ." << endl << endl;
+			}
+	
+
+		//check whether exe capabilities are satisified by signing cert caps.In case unified caps(from chainvalidity) is 0, do not consider them.
+		else if(((aExeCapabilities & aUnifiedSigningCertCaps) == aExeCapabilities) && aUnifiedSigningCertCaps )
+			{
+			cout<< aExeLabel << endl << endl;
+			cout<<"FILE STATUS : Capabilities are satisfied by Signing Certificates ." << endl << endl;
+			}
+		
+		//checking whether exe caps are satisfied by signing chain 
+		//in conjunction with user specified capabilities(MergedCapabilities)
+		else if((aExeCapabilities & MergedCapabilities) == (aExeCapabilities))
+			{
+			cout << aExeLabel << endl << endl;
+			cout <<"FILE STATUS : Capabilities are satisfied by Signing Certificates ." << endl;
+			cout<<"\t\t in conjunction with User Capabilities" << endl << endl;
+			}
+
+		else
+			{
+			cout << aExeLabel << endl << endl;
+			cout <<"FILE STATUS : Capabilities are not satisfied ." << endl << endl;
+			cout <<"Missing Capabilities List :" << endl << endl;
+			int result = ((MergedCapabilities) & (aExeCapabilities));
+			missingCaps = (aExeCapabilities - result);
+			DisplayMissingCapabilities(missingCaps);
+			}
+		}
+	}
+
+void DumpInstallFileStatusTool::DisplayMissingCapabilities(int aMissingCaps)
+	{
+	int missingCapabilities = 0;
+	while(aMissingCaps)
+		{
+		if((aMissingCaps & 0x01))
+			{
+			if(missingCapabilities < KNumberOfCaps)
+				{
+				cout << CapabilityList[missingCapabilities] << endl;;
+				}
+			else
+				{
+				cout << "Unknown" << missingCapabilities << endl;
+				}
+			}
+
+	aMissingCaps = aMissingCaps >> 1;
+	missingCapabilities++;
+		}
+
+	cout << endl;
+	}
+
+DumpInstallFileStatusTool::~DumpInstallFileStatusTool()
+	{
+	delete iSISData;
+	delete iChainValidity;
+	}
+
+
+
+