secureswitools/swisistools/source/signsis/main.cpp
changeset 0 ba25891c3a9e
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/secureswitools/swisistools/source/signsis/main.cpp	Thu Dec 17 08:51:10 2009 +0200
@@ -0,0 +1,329 @@
+/*
+* 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: 
+*
+*/
+
+
+/**
+ @file 
+ @internalComponent
+ @released
+*/
+
+#include <iostream>
+#include <string>
+#include <fstream>
+#include <openssl/err.h>
+
+#include "parameter.h"
+#include "siscontents.h"
+#include "utility_interface.h"
+#include "siscontroller.h"
+#include "signsis.h"
+#include "certificateinfo.h"
+#include "sissignaturecertificatechain.h"
+
+const char* KMonthString[]=
+	{
+	"Jan",
+	"Feb",
+	"Mar",
+	"Apr",
+	"May",
+	"Jun",
+	"Jul",
+	"Aug",
+	"Sep",
+	"Oct",
+	"Nov",
+	"Dec"
+	};
+
+void DeletePEMFiles(std::string& aDirectorypath)
+	{
+	int certNumber = 1;
+	char intChain[2];
+	while(true)
+		{
+		std::string dirPath = aDirectorypath;
+		itoa(certNumber,intChain,10);
+		dirPath.append("/cert");
+		dirPath.append(intChain) ;
+		dirPath.append(".pem");
+		if(remove(dirPath.c_str())==-1)
+			{
+			if(RemoveDirectoryA(dirPath.c_str()))
+				{
+				std::cout << "Cannot delete directory" << std::endl;
+				}
+			break;
+			}
+		certNumber++;
+		}
+	}
+
+
+inline void PrintWithIndent(std::ostream& aStream, const std::string& aString, int aIndent)
+	{
+	aStream.width(aIndent);
+	aStream << "";
+	aStream << aString;
+	}
+
+inline void PrintWithIndent(std::wostream& aStream, const std::wstring& aString, int aIndent)
+	{
+	aStream.width(aIndent);
+	aStream << L"";
+	aStream << aString;
+	}
+
+void PrintExtensions(const std::vector<TExtension>& aExtensions, int aIndent)
+	{
+	if(aExtensions.size() > 0)
+		{
+		PrintWithIndent(std::cout, "X509v3 extensions:", aIndent);
+		}
+	for(int i = 0; i < aExtensions.size(); ++i)
+		{
+		std::cout << std::endl;
+		PrintWithIndent(std::cout, aExtensions[i].iExtensionName, aIndent+4); 
+		std::cout << ": ";
+		std::cout << (aExtensions[i].iIsCritical? "critical":"") << std::endl;
+		if(aExtensions[i].iValue != "")
+			{
+			PrintWithIndent(std::cout, aExtensions[i].iValue, aIndent+4);
+			std::cout << std::endl;  
+			}
+		else
+			{
+			for(int j = 0; j < aExtensions[i].iValueList.size(); ++j)
+				{
+				if(0 != j)
+					{
+					if(aExtensions[i].iIsMultiLine)
+						{
+						std::cout << std::endl;
+						PrintWithIndent(std::cout, "", aIndent+4); 
+						}
+					else
+						std::cout << ", ";
+					}
+				else
+					{
+					PrintWithIndent(std::cout, "", aIndent+4);
+					}
+				std::cout << aExtensions[i].iValueList[j].iName;
+				if(aExtensions[i].iValueList[j].iName != "" && aExtensions[i].iValueList[j].iValue != "")
+					{
+					std::cout << ":";
+					}
+				std::cout << aExtensions[i].iValueList[j].iValue;
+				}
+			}
+		std::cout << ((aExtensions[i].iIsMultiLine)? "\n": "") ;
+		}
+	}
+
+void PrintDateTime(const CSISDateTime& aDateTime)
+	{
+	int year 	= aDateTime.Date().Year();
+	int month 	= aDateTime.Date().Month();
+	int day		= aDateTime.Date().Day();
+	int hours 	= aDateTime.Time().Hours();
+	int mins 	= aDateTime.Time().Minutes();
+	int secs 	= aDateTime.Time().Seconds();
+	printf("%s %d %02d:%02d:%02d %d GMT", KMonthString[month], day, hours, mins, secs, year);
+	}
+
+inline std::ostream& operator << (std::ostream& aStream, const CSISDate& aDate)
+	{
+	aStream << (int)aDate.Day() << "/" << (int)aDate.Month()+1 << "/" << (int)aDate.Year();
+	return aStream; 
+	}
+
+void PrintCertificateInfo(CCertificateInfo* aCertInfo)
+	{
+	std::wcout << L"Issued by : " << aCertInfo->IssuerName(false) << "." << std::endl;
+	std::wcout << L"Issued to : " << aCertInfo->SubjectName(false) << "." << std::endl;
+	std::cout << "Valid from " << aCertInfo->ValidFrom().Date() << " to " <<  aCertInfo->ValidTo().Date() << std::endl;
+	}
+
+
+void PrintCertificateDetails(CCertificateInfo* aCertInfo)
+	{
+	std::cout << "Certificate: " << std::endl;
+	PrintWithIndent(std::cout, "Data:", 4);
+	std::cout << std::endl;
+	int version = aCertInfo->Version();
+	PrintWithIndent(std::cout, "Version: ", 8);
+	std::cout << version+1 << "(0x" << version << ")" << std::endl;
+	PrintWithIndent(std::cout, "Serial Number: ", 8);
+	std::cout << aCertInfo->SerialNumber();
+	std::cout << std::endl;
+	PrintWithIndent(std::cout, "Signature Algorithm: ", 8);
+	std::cout << aCertInfo->SignatureAlgo() << std::endl;
+	PrintWithIndent(std::wcout, L"Issuer: ", 8);
+	std::wcout << aCertInfo->IssuerName(true) << std::endl;
+	PrintWithIndent(std::cout, "Validity", 8);
+	std::cout << std::endl;
+	PrintWithIndent(std::cout, "Not Before: ", 12);
+	PrintDateTime(aCertInfo->ValidFrom());
+	std::cout << std::endl;
+	PrintWithIndent(std::cout, "Not After : ", 12);
+	PrintDateTime(aCertInfo->ValidTo());
+	std::cout << std::endl;
+	PrintWithIndent(std::wcout, L"Subject: ", 8);
+	std::wcout << aCertInfo->SubjectName(true) << std::endl;
+	PrintWithIndent(std::cout, "Subject Public Key Info:", 8);
+	std::cout << std::endl;
+	PrintWithIndent(std::cout, "Public Key Algorithm: ", 12);
+	std::cout << aCertInfo->PublicKeyAlgo() << std::endl;
+	aCertInfo->PrintPublicKey(std::cout, 16);
+	const std::vector<TExtension>& extList = aCertInfo->Extensions();
+	PrintExtensions(extList, 8);
+	aCertInfo->PrintSignature(std::cout, 12);
+	}
+
+void ReportSignatures(const CSISController& aController, bool aExtractCerts = false)
+	{
+	int signatureCount = aController.SignatureCount();
+	if(0 == signatureCount)
+		{
+		std::cout << "No primary signatures." << std::endl;
+		return;
+		}
+
+	std::string directoryPath = "Chain";
+	if(aExtractCerts)
+		{
+		DeletePEMFiles(directoryPath);
+
+		CreateDirectoryA(directoryPath.c_str(),NULL);
+		}
+
+	std::cout << std::endl << "Primary:" << std::endl;
+	for(int i = 0; i < signatureCount; ++i)
+		{
+		CSignatureCertChainData& sigdata = const_cast<CSignatureCertChainData&>(aController.SignatureCertChain(i));
+		CSisSignatureCertificateChain certChain(sigdata);
+		const std::vector<CCertificateInfo*>& certList = certChain.CertChain();
+		for(int j = 0; j < certList.size(); ++j)
+			{
+			if(aExtractCerts)
+				{
+				PrintCertificateDetails(certList[j]);
+				}
+			else
+				{
+				PrintCertificateInfo(certList[j]);
+				std::cout << std::endl;
+				}
+			}
+		if(aExtractCerts)
+			{
+			char intChain[2];
+			itoa(i+1,intChain,10);
+			std::string certFullPath = directoryPath + "/cert";
+			certFullPath = certFullPath + intChain;
+			certFullPath = certFullPath + ".pem";
+			certChain.ExtractCertificateChain(certFullPath);
+			}
+		}
+	}
+
+int main(int argc, char *argv[])
+	{
+    wchar_t **argv1 = CommandLineArgs(argc,argv);
+
+	CParameter parameter;
+	
+	if (! parameter.CommandLine (argc, argv1))
+		{
+		return 4;
+		}
+	if (parameter.Sis().empty())
+		{
+		cleanup(argc,argv1);
+		return 0;
+		}
+
+	ERR_load_crypto_strings ();
+	OpenSSL_add_all_algorithms ();
+	OpenSSL_add_all_ciphers ();
+	OpenSSL_add_all_digests ();
+	int retValue = 0;
+	try
+		{
+		bool isSisFile = CSISContents::IsSisFile(parameter.Sis ());
+
+		if(isSisFile)
+			{
+			CSISContents content;
+			content.Load (parameter.Sis ());
+			CSignSis signsis(parameter.Sis ());
+			if (parameter.Sign ())
+				{
+				if (parameter.Verbose ())
+					{
+					std::cout << "Signing" << std::endl;
+					}
+				signsis.SignSis(parameter.Output (), parameter.Certificate(), parameter.Key(), parameter.PassPhrase(), parameter.Algorithm());
+				}
+			if (parameter.Unsign ())
+				{
+				if (parameter.Verbose ())
+					{
+					std::cout << "Removing signature" << std::endl;
+					}
+				signsis.RemoveSignature (parameter.Output ());
+				}
+			if (parameter.Report() || parameter.ExtractCert())
+				{
+				ReportSignatures(content.Controller(), parameter.ExtractCert());
+				}
+			if (parameter.Dump ())
+				{
+				content.Dump (std::cout, 0);
+				}
+			}
+		else
+			{
+			if (parameter.Report ()||parameter.ExtractCert())
+				{
+				std::cout<<"Reporting Stub Sis Controller"<<std::endl;
+				CSISController ctrl;
+				ctrl.Load (parameter.Sis ());
+				ReportSignatures(ctrl, parameter.ExtractCert());
+				}
+			}
+		}
+	catch(const CSISException& oops)
+		{
+		std::wcout << oops.widewhat () << std::endl;
+		retValue = 1;
+		}
+	catch (...)
+		{
+		std::wcout << L"Unexpected error." << std::endl;
+		retValue = 1;
+		}
+	EVP_cleanup ();
+	ERR_free_strings ();
+
+	// cleanup the memory
+	cleanup(argc,argv1);
+	return retValue;
+	}
+