First public contribution.
2 * Copyright (c) 2006-2009 Nokia Corporation and/or its subsidiary(-ies).
4 * This component and the accompanying materials are made available
5 * under the terms of the License "Eclipse Public License v1.0"
6 * which accompanies this distribution, and is available
7 * at the URL "http://www.eclipse.org/legal/epl-v10.html".
9 * Initial Contributors:
10 * Nokia Corporation - initial contribution.
26 #include <x509certext.h>
28 #include "displaytype.h"
30 _LIT(KAppName, "tcertdump");
33 void WriteAsUtf8L(const TDesC& aUtf16, RFile& aOutputFile)
35 HBufC8* utf8 = CnvUtfConverter::ConvertFromUnicodeToUtf8L(aUtf16);
36 CleanupStack::PushL(utf8);
37 User::LeaveIfError(aOutputFile.Write(*utf8));
38 CleanupStack::PopAndDestroy(utf8);
42 void PrintDistinguishedNameElementsL(const CX500DistinguishedName& dName, RFile& aOutputFile)
45 for (i=0;i<dName.Count();i++)
47 User::LeaveIfError(aOutputFile.Write(_L8("\t\t")));
48 //WriteAsUtf8L(dName.Element(i).Type(), aOutputFile);
51 WriteAsUtf8L(GetType(dName.Element(i).Type()), aOutputFile);
54 User::LeaveIfError(aOutputFile.Write(_L8(": ")));
57 value=dName.Element(i).ValueL();
58 CleanupStack::PushL(value);
61 if (dName.Element(i).Type().Compare(_L("2.5.4.3")))
63 WriteAsUtf8L(*value, aOutputFile);
68 temp=HBufC8::NewL(value->Length());
69 CleanupStack::PushL(temp);
71 TPtr8 ptr = temp->Des();
72 TPtr valuePtr = value->Des();
73 for (TInt j = 0;j < value->Length();++j)
75 TChar c = valuePtr[j];
76 ptr.Append(c % 0x10000);
79 User::LeaveIfError(aOutputFile.Write(*temp));
80 CleanupStack::PopAndDestroy(temp);
83 User::LeaveIfError(aOutputFile.Write(_L8("\r\n")));
84 CleanupStack::PopAndDestroy(value);
88 void DumpCertInfoL(const CX509Certificate& aCert, RFile& aOutputFile)
90 // common/display names
91 aOutputFile.Write(_L8("Issuer Display Name: "));
92 HBufC* issuer = aCert.IssuerL();
93 CleanupStack::PushL(issuer);
94 WriteAsUtf8L(*issuer, aOutputFile);
95 User::LeaveIfError(aOutputFile.Write(_L8("\r\n")));
96 CleanupStack::PopAndDestroy(issuer);
98 aOutputFile.Write(_L8("Subject Display Name: "));
99 HBufC* subject = aCert.SubjectL();
100 CleanupStack::PushL(subject);
101 WriteAsUtf8L(*subject, aOutputFile);
102 User::LeaveIfError(aOutputFile.Write(_L8("\r\n")));
103 CleanupStack::PopAndDestroy(subject);
106 // distinguished names
108 aOutputFile.Write(_L8("Issuer Distinguished Name:\r\n"));
109 PrintDistinguishedNameElementsL(aCert.IssuerName(),aOutputFile);
111 aOutputFile.Write(_L8("Subject Distinguished Name:\r\n"));
112 PrintDistinguishedNameElementsL(aCert.SubjectName(),aOutputFile);
115 const CX509CertExtension *subjectAltExt=aCert.Extension(KSubjectAltName);
116 if (subjectAltExt!=NULL)
118 aOutputFile.Write(_L8("Subject Alt Names:\r\n"));
119 CX509AltNameExt* subjectAltNameExt = CX509AltNameExt::NewLC(subjectAltExt->Data());
120 const CArrayPtrFlat<CX509GeneralName>&names = subjectAltNameExt->AltName();
121 for (TInt i = 0; i < names.Count(); i++)
123 CX509GeneralName* name = names.At(i);
124 if ( name->Tag() == EX509DirectoryName )
126 aOutputFile.Write(_L8("\tDirectory Name:\r\n"));
127 CX500DistinguishedName* dirName = CX500DistinguishedName::NewLC(name->Data());
128 PrintDistinguishedNameElementsL(*dirName,aOutputFile);
129 CleanupStack::PopAndDestroy(dirName);
132 CleanupStack::PopAndDestroy(subjectAltNameExt);
135 const CX509CertExtension *issuerAltExt=aCert.Extension(KIssuerAltName);
136 if (issuerAltExt!=NULL)
138 aOutputFile.Write(_L8("Issuer Alt Names:\r\n"));
139 CX509AltNameExt* issuerAltNameExt = CX509AltNameExt::NewLC(issuerAltExt->Data());
140 const CArrayPtrFlat<CX509GeneralName>&names = issuerAltNameExt->AltName();
141 for (TInt i = 0; i < names.Count(); i++)
143 CX509GeneralName* name = names.At(i);
144 if ( name->Tag() == EX509DirectoryName )
146 aOutputFile.Write(_L8("\tDirectory Name:\r\n"));
147 CX500DistinguishedName* dirName = CX500DistinguishedName::NewLC(name->Data());
148 PrintDistinguishedNameElementsL(*dirName,aOutputFile);
149 CleanupStack::PopAndDestroy(dirName);
152 CleanupStack::PopAndDestroy(issuerAltNameExt);
158 CCommandLineArguments* args = CCommandLineArguments::NewLC();
159 TInt count = args->Count();
160 if (args->Count() == 3)
162 const TPtrC certFileName = args->Arg(1);
163 const TPtrC outputFileName = args->Arg(2);
166 User::LeaveIfError(fs.Connect());
167 CleanupClosePushL(fs);
170 User::LeaveIfError(certFile.Open(fs, certFileName, EFileShareAny | EFileRead | EFileStream));
171 CleanupClosePushL(certFile);
174 User::LeaveIfError(certFile.Size(fileSize));
176 HBufC8* certBuffer = HBufC8::NewLC(fileSize);
177 TPtr8 ptr = certBuffer->Des();
178 User::LeaveIfError(certFile.Read(ptr, fileSize));
180 CX509Certificate* cert = CX509Certificate::NewLC(*certBuffer);
183 User::LeaveIfError(outputFile.Replace(fs, outputFileName, EFileWrite | EFileShareExclusive));
185 DumpCertInfoL(*cert, outputFile);
187 CleanupStack::PopAndDestroy(4, &fs); // outputFile, cert, certBuffer, certFile, fs
189 CleanupStack::PopAndDestroy(args);
194 CConsoleBase* console = Console::NewL(KAppName, TSize(KDefaultConsWidth, KDefaultConsHeight));
195 CleanupStack::PushL(console);
197 TRAPD(err, DumpCertL());
200 console->Printf(_L("Error %d\n"), err);
204 CleanupStack::PopAndDestroy(console);
207 GLDEF_C TInt E32Main() // main function called by E32
210 CTrapCleanup* cleanup=CTrapCleanup::New();
212 TRAP_IGNORE(DoMainL());