diff -r 675a964f4eb5 -r 35751d3474b7 cryptoservices/certificateandkeymgmt/tcertdump/tcertdump.cpp --- a/cryptoservices/certificateandkeymgmt/tcertdump/tcertdump.cpp Tue Jul 21 01:04:32 2009 +0100 +++ b/cryptoservices/certificateandkeymgmt/tcertdump/tcertdump.cpp Thu Sep 10 14:01:51 2009 +0300 @@ -1,217 +1,218 @@ -/* -* 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; - } +/* +* 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; + } +