diff -r 000000000000 -r 2c201484c85f cryptoservices/certificateandkeymgmt/tcertdump/tcertdump.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/cryptoservices/certificateandkeymgmt/tcertdump/tcertdump.cpp Wed Jul 08 11:25:26 2009 +0100 @@ -0,0 +1,217 @@ +/* +* Copyright (c) 2006-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 +#include +#include +#include +#include +#include +#include +#include + +#include "displaytype.h" + +_LIT(KAppName, "tcertdump"); + + +void WriteAsUtf8L(const TDesC& aUtf16, RFile& aOutputFile) + { + HBufC8* utf8 = CnvUtfConverter::ConvertFromUnicodeToUtf8L(aUtf16); + CleanupStack::PushL(utf8); + User::LeaveIfError(aOutputFile.Write(*utf8)); + CleanupStack::PopAndDestroy(utf8); + } + + +void PrintDistinguishedNameElementsL(const CX500DistinguishedName& dName, RFile& aOutputFile) + { + TInt i; + for (i=0;iLength()); + CleanupStack::PushL(temp); + + TPtr8 ptr = temp->Des(); + TPtr valuePtr = value->Des(); + for (TInt j = 0;j < value->Length();++j) + { + TChar c = valuePtr[j]; + ptr.Append(c % 0x10000); + } + + User::LeaveIfError(aOutputFile.Write(*temp)); + CleanupStack::PopAndDestroy(temp); + } + + User::LeaveIfError(aOutputFile.Write(_L8("\r\n"))); + CleanupStack::PopAndDestroy(value); + } + } + +void DumpCertInfoL(const CX509Certificate& aCert, RFile& aOutputFile) + { + // common/display names + aOutputFile.Write(_L8("Issuer Display Name: ")); + HBufC* issuer = aCert.IssuerL(); + CleanupStack::PushL(issuer); + WriteAsUtf8L(*issuer, aOutputFile); + User::LeaveIfError(aOutputFile.Write(_L8("\r\n"))); + CleanupStack::PopAndDestroy(issuer); + + aOutputFile.Write(_L8("Subject Display Name: ")); + HBufC* subject = aCert.SubjectL(); + CleanupStack::PushL(subject); + WriteAsUtf8L(*subject, aOutputFile); + User::LeaveIfError(aOutputFile.Write(_L8("\r\n"))); + CleanupStack::PopAndDestroy(subject); + + + // distinguished names + + aOutputFile.Write(_L8("Issuer Distinguished Name:\r\n")); + PrintDistinguishedNameElementsL(aCert.IssuerName(),aOutputFile); + + aOutputFile.Write(_L8("Subject Distinguished Name:\r\n")); + PrintDistinguishedNameElementsL(aCert.SubjectName(),aOutputFile); + + // alt names + const CX509CertExtension *subjectAltExt=aCert.Extension(KSubjectAltName); + if (subjectAltExt!=NULL) + { + aOutputFile.Write(_L8("Subject Alt Names:\r\n")); + CX509AltNameExt* subjectAltNameExt = CX509AltNameExt::NewLC(subjectAltExt->Data()); + const CArrayPtrFlat&names = subjectAltNameExt->AltName(); + for (TInt i = 0; i < names.Count(); i++) + { + CX509GeneralName* name = names.At(i); + if ( name->Tag() == EX509DirectoryName ) + { + aOutputFile.Write(_L8("\tDirectory Name:\r\n")); + CX500DistinguishedName* dirName = CX500DistinguishedName::NewLC(name->Data()); + PrintDistinguishedNameElementsL(*dirName,aOutputFile); + CleanupStack::PopAndDestroy(dirName); + } + } + CleanupStack::PopAndDestroy(subjectAltNameExt); + } + + const CX509CertExtension *issuerAltExt=aCert.Extension(KIssuerAltName); + if (issuerAltExt!=NULL) + { + aOutputFile.Write(_L8("Issuer Alt Names:\r\n")); + CX509AltNameExt* issuerAltNameExt = CX509AltNameExt::NewLC(issuerAltExt->Data()); + const CArrayPtrFlat&names = issuerAltNameExt->AltName(); + for (TInt i = 0; i < names.Count(); i++) + { + CX509GeneralName* name = names.At(i); + if ( name->Tag() == EX509DirectoryName ) + { + aOutputFile.Write(_L8("\tDirectory Name:\r\n")); + CX500DistinguishedName* dirName = CX500DistinguishedName::NewLC(name->Data()); + PrintDistinguishedNameElementsL(*dirName,aOutputFile); + CleanupStack::PopAndDestroy(dirName); + } + } + CleanupStack::PopAndDestroy(issuerAltNameExt); + } + } + +void DumpCertL() + { + CCommandLineArguments* args = CCommandLineArguments::NewLC(); + TInt count = args->Count(); + if (args->Count() == 3) + { + const TPtrC certFileName = args->Arg(1); + const TPtrC outputFileName = args->Arg(2); + + RFs fs; + User::LeaveIfError(fs.Connect()); + CleanupClosePushL(fs); + + RFile certFile; + User::LeaveIfError(certFile.Open(fs, certFileName, EFileShareAny | EFileRead | EFileStream)); + CleanupClosePushL(certFile); + + TInt fileSize; + User::LeaveIfError(certFile.Size(fileSize)); + + HBufC8* certBuffer = HBufC8::NewLC(fileSize); + TPtr8 ptr = certBuffer->Des(); + User::LeaveIfError(certFile.Read(ptr, fileSize)); + + CX509Certificate* cert = CX509Certificate::NewLC(*certBuffer); + + RFile outputFile; + User::LeaveIfError(outputFile.Replace(fs, outputFileName, EFileWrite | EFileShareExclusive)); + + DumpCertInfoL(*cert, outputFile); + + CleanupStack::PopAndDestroy(4, &fs); // outputFile, cert, certBuffer, certFile, fs + } + CleanupStack::PopAndDestroy(args); + } + +void DoMainL(void) + { + CConsoleBase* console = Console::NewL(KAppName, TSize(KDefaultConsWidth, KDefaultConsHeight)); + CleanupStack::PushL(console); + __UHEAP_MARK; + TRAPD(err, DumpCertL()); + if (err) + { + console->Printf(_L("Error %d\n"), err); + console->Getch(); + } + __UHEAP_MARKEND; + CleanupStack::PopAndDestroy(console); + } + +GLDEF_C TInt E32Main() // main function called by E32 + { + __UHEAP_MARK; + CTrapCleanup* cleanup=CTrapCleanup::New(); + + TRAP_IGNORE(DoMainL()); + + delete cleanup; + __UHEAP_MARKEND; + return 0; + }