os/security/cryptoservices/certificateandkeymgmt/tcertstore/t_certstoreout.cpp
author sl@SLION-WIN7.fritz.box
Fri, 15 Jun 2012 03:10:57 +0200
changeset 0 bde4ae8d615e
permissions -rw-r--r--
First public contribution.
     1 /*
     2 * Copyright (c) 1998-2009 Nokia Corporation and/or its subsidiary(-ies).
     3 * All rights reserved.
     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".
     8 *
     9 * Initial Contributors:
    10 * Nokia Corporation - initial contribution.
    11 *
    12 * Contributors:
    13 *
    14 * Description: 
    15 * TCERTSTOREOUT.CPP
    16 *
    17 */
    18 
    19 
    20 #include "t_certstoreout.h"
    21 
    22 X509CertWriter::X509CertWriter(Output& aOut)
    23 	:iOut(aOut)
    24 	{
    25 	}
    26 
    27 void X509CertWriter::WriteCert(const CX509Certificate& aCertificate)
    28 	{
    29 #ifdef SHOW_EXTENDED
    30 	ShowSerialNumber(aCertificate.SerialNumber());
    31 	ShowValidityPeriod(aCertificate);
    32 	iOut.writeString(_L("Issuer Name = "));
    33 	iOut.writeNewLine();	
    34 	ShowDN(aCertificate.IssuerName());	
    35 	iOut.writeString(_L("Subject Name = "));
    36 	iOut.writeNewLine();	
    37 	ShowDN(aCertificate.SubjectName());
    38 	ShowSigningAlgorithm(aCertificate.SigningAlgorithm());
    39 	ShowExtensions(aCertificate);
    40 	WriteEncodings(aCertificate);
    41 #endif // SHOW_EXTENDED
    42 	iOut.writeString(_L("\t\tShort Issuer Name = "));
    43 	HBufC* issuer = aCertificate.IssuerL();
    44 	iOut.writeString(*issuer);
    45 	iOut.writeNewLine();
    46 	delete issuer;
    47 
    48 	iOut.writeString(_L("\t\tShort Subject Name = "));
    49 	HBufC* subject = aCertificate.SubjectL();
    50 	iOut.writeString(*subject);
    51 	iOut.writeNewLine();
    52 	delete subject;
    53 	}
    54 
    55 // The rest of these are only compiled of SHOW_EXTENDED defined - this 
    56 // eliminates warnings from WINS/UREL build
    57 #ifdef SHOW_EXTENDED
    58 void X509CertWriter::ShowSigningAlgorithm(const CSigningAlgorithmIdentifier& aSigningAlgorithm)
    59 	{
    60 	iOut.writeString(_L("Signed using: "));
    61 	iOut.writeNewLine();
    62 	iOut.writeSpaces(4);
    63 	iOut.writeString(_L("Asymmetric algorithm = "));
    64 	const CAlgorithmIdentifier& algId = aSigningAlgorithm.AsymmetricAlgorithm();
    65 	switch(algId.Algorithm())
    66 	{
    67 	case ERSA:
    68 		{
    69 		iOut.writeString(_L("RSA"));
    70 		break;
    71 		}
    72 	case EDSA:
    73 		{
    74 		iOut.writeString(_L("DSA"));
    75 		break;
    76 		}
    77 	case EDH:
    78 		{
    79 		iOut.writeString(_L("DH"));
    80 		break;
    81 		}
    82 	default:
    83 		iOut.writeString(_L("Unknown"));
    84 		break;
    85 	}
    86 	iOut.writeNewLine();
    87 	iOut.writeSpaces(4);
    88 	iOut.writeString(_L("Digest algorithm = "));
    89 	const CAlgorithmIdentifier& digestId = aSigningAlgorithm.DigestAlgorithm();
    90 	switch(digestId.Algorithm())
    91 	{
    92 	case EMD2:
    93 		{
    94 		iOut.writeString(_L("MD2"));
    95 		break;
    96 		}
    97 	case EMD5:
    98 		{
    99 		iOut.writeString(_L("MD5"));
   100 		break;
   101 		}
   102 	case ESHA1:
   103 		{
   104 		iOut.writeString(_L("SHA1"));
   105 		break;
   106 		}
   107 	default:
   108 		iOut.writeString(_L("Unknown"));
   109 	}
   110 	iOut.writeNewLine();
   111 	}
   112 
   113 void X509CertWriter::ShowSerialNumber(const TPtrC8& aSerialNumber)
   114 	{
   115 	iOut.writeString(_L("Serial Number = "));
   116 	iOut.writeOctetString(aSerialNumber);
   117 	iOut.writeNewLine();
   118 	}
   119 
   120 //dn display code
   121 void X509CertWriter::ShowAVA(const CX520AttributeTypeAndValue& aAva)
   122 	{
   123 	iOut.writeString(aAva.Type());
   124 	HBufC* val = aAva.ValueL();
   125 	CleanupStack::PushL(val);
   126 	iOut.writeString(_L(" = "));
   127 	iOut.writeString(val->Des());
   128 	CleanupStack::PopAndDestroy();
   129 	}
   130 
   131 void X509CertWriter::ShowDN(const CX500DistinguishedName& aName)
   132 	{
   133 	TInt count = aName.Count();
   134 	for (TInt i = 0; i < count; i++)
   135 		{
   136   		const CX520AttributeTypeAndValue& ava = aName.Element(i);
   137 		iOut.writeSpaces(4);
   138 		ShowAVA(ava);
   139 		iOut.writeNewLine();
   140 		}
   141 	}
   142 
   143 void X509CertWriter::ShowAKI(const CX509Certificate& aCert)
   144 	{
   145 	const CX509CertExtension* akiExt = aCert.Extension(KAuthorityKeyId);
   146 	if (akiExt)
   147 		{
   148 		iOut.writeString(_L("Authority Key ID = "));
   149 		iOut.writeNewLine();
   150 		const CX509AuthorityKeyIdExt* ext = CX509AuthorityKeyIdExt::NewLC(akiExt->Data());
   151 		const CArrayPtrFlat<CX509GeneralName>& authorityName = ext->AuthorityName();
   152 		TInt count = authorityName.Count();
   153 		if (count > 0)
   154 			{
   155 			iOut.writeSpaces(4);
   156 			iOut.writeString(_L("Authority name = "));
   157 			iOut.writeNewLine();
   158 			for (TInt i = 0; i < count; i++)
   159 				{
   160 				ShowGN(*(authorityName.At(i)));
   161 				}
   162 			}
   163 		if (ext->AuthorityCertSerialNumber().Length() > 0)
   164 			{
   165 			iOut.writeSpaces(4);
   166 			iOut.writeString(_L("Authority cert serial no = "));
   167 			iOut.writeOctetString(ext->AuthorityCertSerialNumber());
   168 			iOut.writeNewLine();
   169 			}
   170 		iOut.writeSpaces(4);
   171 		iOut.writeString(_L("Key Id = "));
   172 		iOut.writeOctetString(ext->KeyId());
   173 		iOut.writeNewLine();
   174 		CleanupStack::PopAndDestroy();
   175 		}
   176 	}
   177 
   178 void X509CertWriter::ShowSKI(const CX509Certificate& aCert)
   179 	{
   180 	const CX509CertExtension* skiExt = aCert.Extension(KSubjectKeyId);
   181 	if (skiExt)
   182 		{
   183 		iOut.writeString(_L("Subject Key ID = "));
   184 		iOut.writeNewLine();
   185 		const CX509SubjectKeyIdExt* ext = CX509SubjectKeyIdExt::NewLC(skiExt->Data());
   186 		iOut.writeSpaces(4);
   187 		iOut.writeString(_L("Key Id = "));
   188 		iOut.writeOctetString(ext->KeyId());
   189 		iOut.writeNewLine();
   190 		CleanupStack::PopAndDestroy();
   191 		}
   192 	}
   193 
   194 void X509CertWriter::ShowGN(const CX509GeneralName& aName)
   195 	{
   196 	iOut.writeSpaces(4);
   197 	switch(aName.Tag())
   198 		{
   199 		case 1:
   200 			{
   201 			//rfc822
   202 			CX509RFC822NameSubtree* email = CX509RFC822NameSubtree::NewLC(aName.Data());
   203 			const RArray<TPtrC>& rep = email->Rep();
   204 			TInt count = rep.Count();
   205 			for (TInt i = 0; i < count; i++)
   206 				{
   207 				iOut.writeString(rep[i]);
   208 				iOut.writeSpaces(1);
   209 				}
   210 			iOut.writeNewLine();
   211 			CleanupStack::PopAndDestroy();//email
   212 			break;
   213 			}
   214 		case 2:
   215 			{
   216 			//dns name
   217 			CX509DNSNameSubtree* dns = CX509DNSNameSubtree::NewLC(aName.Data());
   218 			const RArray<TPtrC>& rep = dns->Rep();
   219 			TInt count = rep.Count();
   220 			for (TInt i = 0; i < count; i++)
   221 				{
   222 				iOut.writeString(rep[i]);
   223 				iOut.writeSpaces(1);
   224 				}
   225 			CleanupStack::PopAndDestroy();//dns
   226 			break;
   227 			}
   228 		case 4:
   229 			{
   230 			//DN
   231 			CX500DistinguishedName* dN = CX500DistinguishedName::NewLC(aName.Data());
   232 			ShowDN(*dN);
   233 			CleanupStack::PopAndDestroy();
   234 			break;
   235 			}
   236 		case 6:
   237 			{
   238 			//uri
   239 			CX509IPBasedURI* uri = CX509IPBasedURI::NewLC(aName.Data());
   240 			iOut.writeString(uri->Name());
   241 			iOut.writeNewLine();
   242 			CleanupStack::PopAndDestroy();//uri
   243 			break;
   244 			}
   245 		case 7:
   246 			{
   247 			//ip address//!!!!not done for writing to file yet!!!
   248 			CX509IPSubnetMask* ip = CX509IPSubnetMask::NewLC(aName.Data());
   249 			TPtrC8 pBA(ip->BaseAddress());
   250 			TInt counter;
   251 			counter = pBA.Length();
   252 			TPtrC8 pM(ip->Mask());
   253 			counter = pM.Length();
   254 			CleanupStack::PopAndDestroy();
   255 			break;
   256 			}
   257 		}
   258 	}
   259 
   260 
   261 void X509CertWriter::ShowFingerprint(const CX509Certificate& aCertificate)
   262 	{
   263 	iOut.writeOctetString(aCertificate.Fingerprint());
   264 	iOut.writeNewLine();
   265 	}
   266 
   267 void X509CertWriter::ShowValidityPeriod(const CX509Certificate& aCertificate)
   268 	{
   269 	const CValidityPeriod& vp = aCertificate.ValidityPeriod();
   270 	iOut.writeString(_L("Validity Period = "));
   271 	iOut.writeNewLine();
   272 	const TTime& start = vp.Start();
   273 	const TTime& finish = vp.Finish();
   274 	TBuf<30> dateString1;
   275 	start.FormatL(dateString1,(_L("%H%:1%T:%S %*E%*D %X%*N%Y %1 %2 %3")));
   276 
   277 	iOut.writeSpaces(4);
   278 	iOut.writeString(_L("Valid From = "));
   279 	iOut.writeString(dateString1);
   280 	iOut.writeNewLine();
   281 
   282 	TBuf<30> dateString2;
   283 	finish.FormatL(dateString2,(_L("%H%:1%T:%S %*E%*D %X%*N%Y %1 %2 %3")));
   284 
   285 	iOut.writeSpaces(4);
   286 	iOut.writeString(_L("Valid Until = "));
   287 
   288 	iOut.writeString(dateString2);
   289 	iOut.writeNewLine();
   290 	}
   291 
   292 //extensions
   293 void X509CertWriter::ShowExtensions(const CX509Certificate& aCertificate)
   294 	{
   295 	const CArrayPtrFlat<CX509CertExtension>& exts = aCertificate.Extensions();
   296 	TInt count = exts.Count();
   297 	for (TInt i = 0; i < count; i++)
   298 		{
   299 		const CX509CertExtension* ext = exts.At(i);
   300 		iOut.writeString(_L("extension"));
   301 		iOut.writeNum(i);
   302 		if (!(ext->Critical()))
   303 			{
   304 			iOut.writeString(_L(" not"));
   305 			}
   306 		iOut.writeString(_L(" critical"));
   307 		iOut.writeString(_L(" ID = "));
   308 		TPtrC id(ext->Id());
   309 		iOut.writeString(id);
   310 		iOut.writeNewLine();
   311 		if (id == KBasicConstraints)
   312 			{
   313 			ShowBC(*ext);
   314 			}
   315 		if (id == KSubjectAltName)
   316 			{
   317 			iOut.writeString(_L("SubjectAltName: \n"));
   318 			ShowAltName(*ext);
   319 			}
   320 		if (id == KIssuerAltName)
   321 			{
   322 			iOut.writeString(_L("IssuerAltName: \n"));
   323 			ShowAltName(*ext);
   324 			}
   325 		if (id == KKeyUsage)
   326 			{
   327 			ShowKU(*ext);
   328 			}
   329 		if (id == KNameConstraints)
   330 			{
   331 			ShowNC(*ext);
   332 			}
   333 		if (id == KPolicyConstraints)
   334 			{
   335 			ShowPC(*ext);
   336 			}
   337 		if (id == KCertPolicies)
   338 			{
   339 			ShowCP(*ext);
   340 			}
   341 		if (id == KPolicyMapping)
   342 			{
   343 			ShowPM(*ext);
   344 			}
   345 		if (id == KAuthorityKeyId)
   346 			{
   347 			ShowAKI(aCertificate);
   348 			}
   349 		if (id == KSubjectKeyId)
   350 			{
   351 			ShowSKI(aCertificate);
   352 			}
   353 		if (id == KExtendedKeyUsage)
   354 			{
   355 			ShowEKU(*ext);
   356 			}
   357 		}
   358 	}
   359 
   360 void X509CertWriter::ShowBC(const CX509CertExtension& aExt)
   361 	{
   362 	iOut.writeString(_L("Basic Constraints:"));
   363 	iOut.writeNewLine();
   364 	CX509BasicConstraintsExt* ext = CX509BasicConstraintsExt::NewLC(aExt.Data());
   365 	if (ext->IsCA())
   366 		{
   367 		iOut.writeSpaces(4);
   368 		iOut.writeString(_L("CA cert"));
   369 		iOut.writeNewLine();
   370 		if (ext->MaxChainLength() < KMaxTInt)
   371 			{
   372 			iOut.writeSpaces(4);
   373 			iOut.writeString(_L("Max Chain Length = "));
   374 			iOut.writeNum(ext->MaxChainLength());
   375 			iOut.writeNewLine();
   376 			}
   377 		}
   378 	else
   379 		{
   380 		iOut.writeSpaces(4);
   381 		iOut.writeString(_L("EE cert"));
   382 		iOut.writeNewLine();
   383 		}
   384 	CleanupStack::PopAndDestroy();
   385 	}
   386 
   387 void X509CertWriter::ShowAltName(const CX509CertExtension& aExt)
   388 	{
   389 	CX509AltNameExt* ext = CX509AltNameExt::NewLC(aExt.Data());
   390 	const CArrayPtrFlat<CX509GeneralName>& names = ext->AltName();
   391 	TInt count = names.Count();
   392 	for (TInt i = 0; i < count; i++)
   393 		{
   394 		ShowGN(*(names.At(i)));
   395 		}
   396 	CleanupStack::PopAndDestroy();
   397 	}
   398 
   399 
   400 _LIT(KDigSig, "digital signature");
   401 _LIT(KNonRep, "non-repudiation");
   402 _LIT(KKeyEnc, "key encipherment");
   403 _LIT(KDataEnc, "data encipherment");
   404 _LIT(KKeyAgree, "key agreement");
   405 _LIT(KCertSign, "key cert sign");
   406 _LIT(KCRLSign, "crl sign");
   407 _LIT(KEnciph, "encipher only");
   408 _LIT(KDeciph, "decipher only");
   409 
   410 void X509CertWriter::ShowKU(const CX509CertExtension& aExt)
   411 	{
   412 	iOut.writeString(_L("Key Usage:"));
   413 	iOut.writeNewLine();
   414 	CX509KeyUsageExt* ext = CX509KeyUsageExt::NewLC(aExt.Data());
   415 		if (ext->IsSet(EX509DigitalSignature))
   416 			{
   417 			iOut.writeSpaces(4);
   418 			iOut.writeString(KDigSig);
   419 			iOut.writeNewLine();
   420 			}
   421 		if (ext->IsSet(EX509NonRepudiation))
   422 			{
   423 			iOut.writeSpaces(4);
   424 			iOut.writeString(KNonRep);
   425 			iOut.writeNewLine();
   426 			}
   427 		if (ext->IsSet(EX509KeyEncipherment))
   428 			{
   429 			iOut.writeSpaces(4);
   430 			iOut.writeString(KKeyEnc);
   431 			iOut.writeNewLine();
   432 			}
   433 		if (ext->IsSet(EX509DataEncipherment))
   434 			{
   435 			iOut.writeSpaces(4);
   436 			iOut.writeString(KDataEnc);
   437 			iOut.writeNewLine();
   438 			}
   439 		if (ext->IsSet(EX509KeyAgreement))
   440 			{
   441 			iOut.writeSpaces(4);
   442 			iOut.writeString(KKeyAgree);
   443 			iOut.writeNewLine();
   444 			}
   445 		if (ext->IsSet(EX509KeyCertSign))
   446 			{
   447 			iOut.writeSpaces(4);
   448 			iOut.writeString(KCertSign);
   449 			iOut.writeNewLine();
   450 			}
   451 		if (ext->IsSet(EX509CRLSign))
   452 			{
   453 			iOut.writeSpaces(4);
   454 			iOut.writeString(KCRLSign);
   455 			iOut.writeNewLine();
   456 			}
   457 		if (ext->IsSet(EX509EncipherOnly))
   458 			{
   459 			iOut.writeSpaces(4);
   460 			iOut.writeString(KEnciph);
   461 			iOut.writeNewLine();
   462 			}
   463 		if (ext->IsSet(EX509DecipherOnly))
   464 			{
   465 			iOut.writeSpaces(4);
   466 			iOut.writeString(KDeciph);
   467 			iOut.writeNewLine();
   468 			}		
   469 	CleanupStack::PopAndDestroy();//ext
   470 	}
   471 
   472 void X509CertWriter::ShowSubtrees(const CArrayPtrFlat<CX509GeneralSubtree>& aSubtrees)
   473 	{
   474 	TInt count = aSubtrees.Count();
   475 	for (TInt i = 0; i < count; i++)
   476 		{
   477 		const CX509GeneralSubtree* subtree = aSubtrees.At(i);
   478 		ShowGN(subtree->Name());
   479 		///!!!!!don't write these outFile either!!
   480 		}
   481 	}
   482 
   483 void X509CertWriter::ShowNC(const CX509CertExtension& aExt)
   484 	{//!!!!don't write these outFile
   485 
   486 	CX509NameConstraintsExt* ext = CX509NameConstraintsExt::NewLC(aExt.Data());
   487 	ShowSubtrees(ext->ExcludedSubtrees());
   488 	ShowSubtrees(ext->PermittedSubtrees());
   489 	CleanupStack::PopAndDestroy();
   490 	}
   491 
   492 void X509CertWriter::ShowPC(const CX509CertExtension& /*aExt*/)
   493 	{//!!!!don't write these outFile
   494 	//CX509PolicyConstraintsExt* ext = CX509PolicyConstraintsExt::NewLC(aExt.Data());
   495 	//TX509PolicyConstraint required = ext->ExplicitPolicyRequired();
   496 	//TX509PolicyConstraint mapping = ext->InhibitPolicyMapping();
   497 	//CleanupStack::PopAndDestroy();
   498 	}
   499 
   500 void X509CertWriter::ShowCP(const CX509CertExtension& aExt)
   501 	{
   502 	iOut.writeString(_L("Cert Policies = "));
   503 	iOut.writeNewLine();
   504 
   505 	CX509CertPoliciesExt* ext = CX509CertPoliciesExt::NewLC(aExt.Data());
   506 	const CArrayPtrFlat<CX509CertPolicyInfo>& policies = ext->Policies();
   507 	TInt count = policies.Count();
   508 	for (TInt i = 0; i < count; i++)
   509 		{
   510 		const CX509CertPolicyInfo* policy = policies.At(i);
   511 		
   512 		iOut.writeSpaces(4);
   513 		iOut.writeString(_L("Policy ID = "));
   514 		iOut.writeString(policy->Id());
   515 		iOut.writeNewLine();
   516 		const CArrayPtrFlat<CX509PolicyQualifierInfo>& qualifiers = policy->Qualifiers();
   517 		TInt qCount = qualifiers.Count();
   518 
   519 		if (qCount > 0)
   520 			{
   521 
   522 			iOut.writeSpaces(4);
   523 			iOut.writeString(_L("Qualified by: "));
   524 			iOut.writeNewLine();
   525 			}
   526 
   527 		for (TInt i = 0; i < qCount; i++)
   528 			{
   529 			CX509PolicyQualifierInfo* qualifier = qualifiers.At(i);
   530 
   531 			iOut.writeSpaces(8);
   532 			iOut.writeString(_L("Qualifier ID = "));
   533 			iOut.writeString(qualifier->Id());
   534 			iOut.writeNewLine();
   535 			}
   536 		}
   537 	CleanupStack::PopAndDestroy();//ext
   538 	}
   539 
   540 void X509CertWriter::ShowPM(const CX509CertExtension& aExt)
   541 	{//!!!!we don't write this one outFile either 
   542 	CX509PolicyMappingExt* ext = CX509PolicyMappingExt::NewLC(aExt.Data());
   543 	const CArrayPtrFlat<CX509PolicyMapping>& mappings = ext->Mappings();
   544 	TInt count = mappings.Count();
   545 	for (TInt i = 0; i < count; i++)
   546 		{
   547 		//const CX509PolicyMapping* mapping = mappings.At(i);
   548 		}
   549 	CleanupStack::PopAndDestroy();
   550 	}
   551 
   552 
   553 void X509CertWriter::ShowEKU(const CX509CertExtension& aExt)
   554 	{
   555 	iOut.writeString(_L("Extended Key Usage = "));
   556 	iOut.writeNewLine();
   557 
   558 	CX509ExtendedKeyUsageExt* ext = CX509ExtendedKeyUsageExt::NewLC(aExt.Data());
   559 	const CArrayPtrFlat<HBufC>& usages = ext->KeyUsages();
   560 	TInt count = usages.Count();
   561 	for (TInt i = 0; i < count; i++)
   562 		{
   563 		iOut.writeSpaces(4);
   564 		iOut.writeString(usages.At(i)->Des());
   565 		iOut.writeNewLine();
   566 		}
   567 	CleanupStack::PopAndDestroy();
   568 	}
   569 
   570 void X509CertWriter::ShowSignature(const CX509Certificate& /*aCert*/)
   571 	{
   572 /*	HBufC8* sig = aCert.SignatureL();
   573 	CleanupStack::PushL(sig);
   574 	User::LeaveIfError(outFile.Write(sig->Des()));
   575 	User::LeaveIfError(outFile.Flush()); // Commit data
   576 	CleanupStack::PopAndDestroy();*/
   577 	}
   578 
   579 void X509CertWriter::WriteEncodings(const CX509Certificate& aCertificate)
   580 	{
   581 	iOut.writeString(_L("Version:"));
   582 	iOut.writeNewLine();
   583 	WriteEncoding(aCertificate, CX509Certificate::EVersionNumber);
   584 	iOut.writeNewLine();
   585 
   586 	iOut.writeString(_L("Serial Number:"));
   587 	iOut.writeNewLine();
   588 	WriteEncoding(aCertificate, CX509Certificate::ESerialNumber);
   589 	iOut.writeNewLine();
   590 
   591 	iOut.writeString(_L("Algorithm:"));
   592 	iOut.writeNewLine();
   593 	WriteEncoding(aCertificate, CX509Certificate::EAlgorithmId);
   594 	iOut.writeNewLine();
   595 
   596 	iOut.writeString(_L("Issuer:"));
   597 	iOut.writeNewLine();
   598 	WriteEncoding(aCertificate, CX509Certificate::EIssuerName);
   599 	iOut.writeNewLine();
   600 
   601 	iOut.writeString(_L("Validity:"));
   602 	iOut.writeNewLine();
   603 	WriteEncoding(aCertificate, CX509Certificate::EValidityPeriod);
   604 	iOut.writeNewLine();
   605 
   606 	iOut.writeString(_L("Subject:"));
   607 	iOut.writeNewLine();
   608 	WriteEncoding(aCertificate, CX509Certificate::ESubjectName);
   609 	iOut.writeNewLine();
   610 
   611 	iOut.writeString(_L("Public Key:"));
   612 	iOut.writeNewLine();
   613 	WriteEncoding(aCertificate, CX509Certificate::ESubjectPublicKeyInfo);
   614 	iOut.writeNewLine();
   615 
   616 	iOut.writeString(_L("Issuer ID:"));
   617 	iOut.writeNewLine();
   618 	WriteEncoding(aCertificate, CX509Certificate::EIssuerUID);
   619 	iOut.writeNewLine();
   620 	
   621 	iOut.writeString(_L("Subject ID:"));
   622 	iOut.writeNewLine();
   623 	WriteEncoding(aCertificate, CX509Certificate::ESubjectUID);
   624 	iOut.writeNewLine();
   625 
   626 	iOut.writeString(_L("Extensions:"));
   627 	iOut.writeNewLine();
   628 	WriteEncoding(aCertificate, CX509Certificate::EExtensionList);
   629 	iOut.writeNewLine();
   630 	}
   631 
   632 void X509CertWriter::WriteEncoding(const CX509Certificate& aCertificate, const TUint aIndex)
   633 	{
   634 	if (aCertificate.DataElementEncoding(aIndex))
   635 		{
   636 		iOut.writeOctetString(*(aCertificate.DataElementEncoding(aIndex)));
   637 		}
   638 	}
   639 
   640 #endif // SHOW_EXTENDED
   641 
   642 /**********************************************************/
   643 
   644 WTLSCertWriter::WTLSCertWriter(Output& aOut)
   645 	:iOut(aOut)
   646 	{
   647 	}
   648 
   649 void WTLSCertWriter::WriteCert(const CWTLSCertificate& aCertificate)
   650 	{
   651 	iOut.writeString(_L("\t\tIssuer Name = "));
   652 	HBufC* issuer = aCertificate.IssuerL();
   653 	iOut.writeString(*issuer);
   654 	delete issuer;
   655 	iOut.writeNewLine();
   656 	iOut.writeString(_L("\t\tSubject Name = "));
   657 	HBufC* subject = aCertificate.SubjectL();
   658 	iOut.writeString(*subject);
   659 	delete subject;
   660 	iOut.writeNewLine();
   661 	}
   662 
   663 void WTLSCertWriter::ShowName(const CWTLSName& /*aName*/)
   664 	{
   665 //	iOut.writeString(aName.Name());
   666 	}
   667 
   668