sl@0: /* sl@0: * Copyright (c) 2006-2009 Nokia Corporation and/or its subsidiary(-ies). sl@0: * All rights reserved. sl@0: * This component and the accompanying materials are made available sl@0: * under the terms of the License "Eclipse Public License v1.0" sl@0: * which accompanies this distribution, and is available sl@0: * at the URL "http://www.eclipse.org/legal/epl-v10.html". sl@0: * sl@0: * Initial Contributors: sl@0: * Nokia Corporation - initial contribution. sl@0: * sl@0: * Contributors: sl@0: * sl@0: * Description: sl@0: * sl@0: */ sl@0: sl@0: sl@0: #include sl@0: #include sl@0: #include sl@0: #include sl@0: #include sl@0: #include sl@0: #include sl@0: #include sl@0: sl@0: #include "displaytype.h" sl@0: sl@0: _LIT(KAppName, "tcertdump"); sl@0: sl@0: sl@0: void WriteAsUtf8L(const TDesC& aUtf16, RFile& aOutputFile) sl@0: { sl@0: HBufC8* utf8 = CnvUtfConverter::ConvertFromUnicodeToUtf8L(aUtf16); sl@0: CleanupStack::PushL(utf8); sl@0: User::LeaveIfError(aOutputFile.Write(*utf8)); sl@0: CleanupStack::PopAndDestroy(utf8); sl@0: } sl@0: sl@0: sl@0: void PrintDistinguishedNameElementsL(const CX500DistinguishedName& dName, RFile& aOutputFile) sl@0: { sl@0: TInt i; sl@0: for (i=0;iLength()); sl@0: CleanupStack::PushL(temp); sl@0: sl@0: TPtr8 ptr = temp->Des(); sl@0: TPtr valuePtr = value->Des(); sl@0: for (TInt j = 0;j < value->Length();++j) sl@0: { sl@0: TChar c = valuePtr[j]; sl@0: ptr.Append(c % 0x10000); sl@0: } sl@0: sl@0: User::LeaveIfError(aOutputFile.Write(*temp)); sl@0: CleanupStack::PopAndDestroy(temp); sl@0: } sl@0: sl@0: User::LeaveIfError(aOutputFile.Write(_L8("\r\n"))); sl@0: CleanupStack::PopAndDestroy(value); sl@0: } sl@0: } sl@0: sl@0: void DumpCertInfoL(const CX509Certificate& aCert, RFile& aOutputFile) sl@0: { sl@0: // common/display names sl@0: aOutputFile.Write(_L8("Issuer Display Name: ")); sl@0: HBufC* issuer = aCert.IssuerL(); sl@0: CleanupStack::PushL(issuer); sl@0: WriteAsUtf8L(*issuer, aOutputFile); sl@0: User::LeaveIfError(aOutputFile.Write(_L8("\r\n"))); sl@0: CleanupStack::PopAndDestroy(issuer); sl@0: sl@0: aOutputFile.Write(_L8("Subject Display Name: ")); sl@0: HBufC* subject = aCert.SubjectL(); sl@0: CleanupStack::PushL(subject); sl@0: WriteAsUtf8L(*subject, aOutputFile); sl@0: User::LeaveIfError(aOutputFile.Write(_L8("\r\n"))); sl@0: CleanupStack::PopAndDestroy(subject); sl@0: sl@0: sl@0: // distinguished names sl@0: sl@0: aOutputFile.Write(_L8("Issuer Distinguished Name:\r\n")); sl@0: PrintDistinguishedNameElementsL(aCert.IssuerName(),aOutputFile); sl@0: sl@0: aOutputFile.Write(_L8("Subject Distinguished Name:\r\n")); sl@0: PrintDistinguishedNameElementsL(aCert.SubjectName(),aOutputFile); sl@0: sl@0: // alt names sl@0: const CX509CertExtension *subjectAltExt=aCert.Extension(KSubjectAltName); sl@0: if (subjectAltExt!=NULL) sl@0: { sl@0: aOutputFile.Write(_L8("Subject Alt Names:\r\n")); sl@0: CX509AltNameExt* subjectAltNameExt = CX509AltNameExt::NewLC(subjectAltExt->Data()); sl@0: const CArrayPtrFlat&names = subjectAltNameExt->AltName(); sl@0: for (TInt i = 0; i < names.Count(); i++) sl@0: { sl@0: CX509GeneralName* name = names.At(i); sl@0: if ( name->Tag() == EX509DirectoryName ) sl@0: { sl@0: aOutputFile.Write(_L8("\tDirectory Name:\r\n")); sl@0: CX500DistinguishedName* dirName = CX500DistinguishedName::NewLC(name->Data()); sl@0: PrintDistinguishedNameElementsL(*dirName,aOutputFile); sl@0: CleanupStack::PopAndDestroy(dirName); sl@0: } sl@0: } sl@0: CleanupStack::PopAndDestroy(subjectAltNameExt); sl@0: } sl@0: sl@0: const CX509CertExtension *issuerAltExt=aCert.Extension(KIssuerAltName); sl@0: if (issuerAltExt!=NULL) sl@0: { sl@0: aOutputFile.Write(_L8("Issuer Alt Names:\r\n")); sl@0: CX509AltNameExt* issuerAltNameExt = CX509AltNameExt::NewLC(issuerAltExt->Data()); sl@0: const CArrayPtrFlat&names = issuerAltNameExt->AltName(); sl@0: for (TInt i = 0; i < names.Count(); i++) sl@0: { sl@0: CX509GeneralName* name = names.At(i); sl@0: if ( name->Tag() == EX509DirectoryName ) sl@0: { sl@0: aOutputFile.Write(_L8("\tDirectory Name:\r\n")); sl@0: CX500DistinguishedName* dirName = CX500DistinguishedName::NewLC(name->Data()); sl@0: PrintDistinguishedNameElementsL(*dirName,aOutputFile); sl@0: CleanupStack::PopAndDestroy(dirName); sl@0: } sl@0: } sl@0: CleanupStack::PopAndDestroy(issuerAltNameExt); sl@0: } sl@0: } sl@0: sl@0: void DumpCertL() sl@0: { sl@0: CCommandLineArguments* args = CCommandLineArguments::NewLC(); sl@0: TInt count = args->Count(); sl@0: if (args->Count() == 3) sl@0: { sl@0: const TPtrC certFileName = args->Arg(1); sl@0: const TPtrC outputFileName = args->Arg(2); sl@0: sl@0: RFs fs; sl@0: User::LeaveIfError(fs.Connect()); sl@0: CleanupClosePushL(fs); sl@0: sl@0: RFile certFile; sl@0: User::LeaveIfError(certFile.Open(fs, certFileName, EFileShareAny | EFileRead | EFileStream)); sl@0: CleanupClosePushL(certFile); sl@0: sl@0: TInt fileSize; sl@0: User::LeaveIfError(certFile.Size(fileSize)); sl@0: sl@0: HBufC8* certBuffer = HBufC8::NewLC(fileSize); sl@0: TPtr8 ptr = certBuffer->Des(); sl@0: User::LeaveIfError(certFile.Read(ptr, fileSize)); sl@0: sl@0: CX509Certificate* cert = CX509Certificate::NewLC(*certBuffer); sl@0: sl@0: RFile outputFile; sl@0: User::LeaveIfError(outputFile.Replace(fs, outputFileName, EFileWrite | EFileShareExclusive)); sl@0: sl@0: DumpCertInfoL(*cert, outputFile); sl@0: sl@0: CleanupStack::PopAndDestroy(4, &fs); // outputFile, cert, certBuffer, certFile, fs sl@0: } sl@0: CleanupStack::PopAndDestroy(args); sl@0: } sl@0: sl@0: void DoMainL(void) sl@0: { sl@0: CConsoleBase* console = Console::NewL(KAppName, TSize(KDefaultConsWidth, KDefaultConsHeight)); sl@0: CleanupStack::PushL(console); sl@0: __UHEAP_MARK; sl@0: TRAPD(err, DumpCertL()); sl@0: if (err) sl@0: { sl@0: console->Printf(_L("Error %d\n"), err); sl@0: console->Getch(); sl@0: } sl@0: __UHEAP_MARKEND; sl@0: CleanupStack::PopAndDestroy(console); sl@0: } sl@0: sl@0: GLDEF_C TInt E32Main() // main function called by E32 sl@0: { sl@0: __UHEAP_MARK; sl@0: CTrapCleanup* cleanup=CTrapCleanup::New(); sl@0: sl@0: TRAP_IGNORE(DoMainL()); sl@0: sl@0: delete cleanup; sl@0: __UHEAP_MARKEND; sl@0: return 0; sl@0: } sl@0: