secureswitools/swianalysistoolkit/source/chainvalidityandinstallfilestatustools/common/dumpchainvaliditytool.cpp
author hgs
Thu, 24 Jun 2010 12:37:54 +0300
changeset 44 329d304c1aa1
parent 0 ba25891c3a9e
permissions -rw-r--r--
201025_01

/*
* 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 "dumpchainvaliditytool.h"
#include "osinterface.h"
using namespace std;

// Class DumpChainValidityTool
DumpChainValidityTool::DumpChainValidityTool()
	:iUnifiedCaps (0) ,
	iStore (0),
	iChain (0)
	{
	}


void DumpChainValidityTool::Run(const Options& aOptions)
	{
	string dumpSwiCertstoreData ;
	string directory ;
	ExecuteSupportingExe(aOptions , directory);
	iStore = new SWICertStore();
	iChain = new SISCertificateChain();
	iStore->Run(aOptions);
	int isSISSigned = iChain->Run(aOptions ,*iStore ,directory);
	if(!isSISSigned)
		{
		remove(CCIFile.c_str());
		return;
		}

	//if and only if any root certs validate the chain ,will this function be called
	if(iChain->GetValidatedRootSignature().size() > 0 || iChain->GetDevCertValidatedRootSignature().size() > 0)
		{
		iStore->UnifyCapabilitiesList(*iChain);
		}

	//Checks whether all the mandatory rootcerts in swicertstore have been used for signing sis file.
	//if no then installation may fail,hence provides info the user in case installation fails,even though 
	//the sis file is signed by a rootcert.
	iChain->VerifyMandatory(*iStore);

#ifdef DUMPCHAINVALIDITYTOOL
	if(aOptions.List())
		{
		cout<<"Unified Capabilities List : "<<endl<<endl;
		iStore->DisplayUnifiedCapabilities(*iChain);
		}
#endif

	//required by dumpinstallfilestatus.
#ifdef DUMPINSTALLFILESTATUSTOOL
	iUnifiedCaps = iStore->GetUnifiedCapabilities();
#endif
	
	RemoveFiles(directory);
	int success = OSInterface::DeleteDirectory(directory);
	if(!success)
		{
		cout << "Directory could not be deleted." << endl;
		}
	remove(CCIFile.c_str());
	}


void DumpChainValidityTool::ExecuteSupportingExe(const Options& aOptions , string& directory )
	{
	string dumpSwiCertstoreData ;
	string inputParameter ;
	ofstream fileName ;
	LaunchProcess launch ;

	inputParameter = SignSISInputParameter;
	inputParameter.append(aOptions.SISFile());
	directory = launch.ExecuteProcess(inputParameter , 0);

	inputParameter = DumpSwiCertstoreInputParameter;
	inputParameter.append(aOptions.CertstoreFile());
	dumpSwiCertstoreData = launch.ExecuteProcess(inputParameter  ,1);
	inputParameter.empty();
		
	if(WAIT_FAILED != WaitForMultipleObjects(2,launch.PrHandle,true,10))
		{
		if(launch.GetDumpSwiCertstoreExitCode() == 0 && launch.GetSignSISExitCode() == 0)
				{
				fileName.open("swicertstore.cci",ios::out);
				fileName.write(dumpSwiCertstoreData.c_str(),dumpSwiCertstoreData.length());
				fileName.close();
				}
		}

	else
		{
#ifdef DUMPCHAINVALIDITYTOOL
		cout << "Wait Error "<< GetLastError() << endl ; 
#endif
		ExitProcess(0); 
		}

	CloseHandle(launch.piProcessInfo.hProcess);
	CloseHandle(launch.piProcessInfo.hThread);
	}


void DumpChainValidityTool::RemoveFiles(string& aDirectorypath)
	{
	int certNumber = 1;
	char chainIndex[4];
	while(1)
		{
		string dirPath;
		dirPath = aDirectorypath;
		itoa(certNumber,chainIndex,10);
		dirPath.append("\\cert");
		dirPath.append(chainIndex) ;
		dirPath.append(".pem");
		if(remove(dirPath.c_str()) == -1)
			{
			return;
			}

		certNumber++;
		}
	}


DumpChainValidityTool::~DumpChainValidityTool()
	{
	delete iChain;
	delete iStore;
	}