diff -r 000000000000 -r ba25891c3a9e secureswitools/swisistools/source/signsis/main.cpp --- /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 +#include +#include +#include + +#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& 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& 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(aController.SignatureCertChain(i)); + CSisSignatureCertificateChain certChain(sigdata); + const std::vector& 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"<