cryptoservices/certificateandkeymgmt/twtlscert/CertWriter.cpp
changeset 8 35751d3474b7
parent 0 2c201484c85f
--- a/cryptoservices/certificateandkeymgmt/twtlscert/CertWriter.cpp	Tue Jul 21 01:04:32 2009 +0100
+++ b/cryptoservices/certificateandkeymgmt/twtlscert/CertWriter.cpp	Thu Sep 10 14:01:51 2009 +0300
@@ -1,406 +1,407 @@
-/*
-* Copyright (c) 1998-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: 
-* TWTLSOUT.CPP
-*
-*/
-
-
-#include "CertWriter.h"
-
-WTLSCertWriter::WTLSCertWriter(Output* aOut)
-	:iOut(aOut)
-	{
-	}
-
-void WTLSCertWriter::SetOut(Output* aOut)
-	{
-	iOut = aOut;
-	}
-
-void WTLSCertWriter::WriteCert(const CWTLSCertificate& aCertificate)
-	{
-	CWTLSCertificate* cert = CWTLSCertificate::NewL(aCertificate);
-	CleanupStack::PushL(cert);
-	WriteEncodings(*cert);
-	iOut->writeNewLine();
-	iOut->writeString(_L("Version = "));
-	iOut->writeNum(cert->Version());	
-	iOut->writeNewLine();	
-	ShowValidityPeriod(*cert);
-	iOut->writeString(_L("Issuer Name = "));
-	iOut->writeNewLine();	
-	ShowName(cert->IssuerName());	
-	iOut->writeNewLine();	
-	iOut->writeString(_L("Subject Name = "));
-	iOut->writeNewLine();	
-	ShowName(cert->SubjectName());
-	iOut->writeNewLine();	
-	ShowSigningAlgorithm(cert->SigningAlgorithm());
-	ShowPublicKey(aCertificate);
-
-	iOut->writeString(_L("Short Issuer Name = "));
-	HBufC* issuer = cert->IssuerL();
-	iOut->writeString(*issuer);
-	iOut->writeNewLine();
-	delete issuer;
-
-	iOut->writeString(_L("Short Subject Name = "));
-	HBufC* subject = cert->SubjectL();
-	iOut->writeString(*subject);
-	iOut->writeNewLine();
-	delete subject;
-
-	iOut->writeString(_L("Full structured issuer & subject names"));
-	iOut->writeNewLine();
-	CWTLSStructuredText* sIssuer = NULL;
-	TRAPD(err, sIssuer = CWTLSStructuredText::NewL(cert->IssuerName().NameData()));
-	if (err != KErrNone)
-		{
-		if (err == KErrNoMemory)
-			{
-			User::Leave(err);
-			}
-		}
-	else
-		{
-		const TWTLSStructuredTextField* field = sIssuer->FieldByName(KWTLSCountryName);
-		if (field)
-			{
-			iOut->writeString(field->Type());
-			iOut->writeString(_L(" = "));
-			iOut->writeString(field->Value());
-			iOut->writeNewLine();
-			__ASSERT_ALWAYS((field->Value() == sIssuer->Country()),User::Panic(_L("CERT"),0));
-			}
-
-		field = sIssuer->FieldByName(KWTLSOrganizationName);
-		if (field)
-			{
-			iOut->writeString(field->Type());
-			iOut->writeString(_L(" = "));
-			iOut->writeString(field->Value());
-			iOut->writeNewLine();
-			__ASSERT_ALWAYS((field->Value() == sIssuer->Organization()),User::Panic(_L("CERT"),0));
-			}
-		field = sIssuer->FieldByName(KWTLSServiceName);
-		if (field)
-			{
-			iOut->writeString(field->Type());
-			iOut->writeString(_L(" = "));
-			iOut->writeString(field->Value());
-			iOut->writeNewLine();
-			__ASSERT_ALWAYS((field->Value() == sIssuer->ServiceName()),User::Panic(_L("CERT"),0));
-			}
-		field = sIssuer->FieldByName(KWTLSTitle);
-		if (field)
-			{
-			iOut->writeString(field->Type());
-			iOut->writeString(_L(" = "));
-			iOut->writeString(field->Value());
-			iOut->writeNewLine();
-			}
-		field = sIssuer->FieldByName(KWTLSCommonName);
-		if (field)
-			{
-			iOut->writeString(field->Type());
-			iOut->writeString(_L(" = "));
-			iOut->writeString(field->Value());
-			iOut->writeNewLine();
-			}
-		delete sIssuer;
-		}
-
-	CWTLSStructuredText* sSubject = NULL;
-	TRAP(err, sSubject = CWTLSStructuredText::NewL(cert->SubjectName().NameData()));
-	if (err != KErrNone)
-		{
-		if (err == KErrNoMemory)
-			{
-			User::Leave(err);
-			}
-		}
-	else
-		{
-		TInt count = sSubject->Count();
-		for (TInt i = 0; i < count; i++)
-			{
-			const TWTLSStructuredTextField& field = sSubject->FieldByIndex(i);
-			iOut->writeString(field.Type());
-			iOut->writeString(_L(" = "));
-			iOut->writeString(field.Value());
-			iOut->writeNewLine();
-			}
-		delete sSubject;
-		}
-
-	if (cert->IsSelfSignedL())
-		{
-		const CWTLSName& subject = cert->SubjectName();
-		const CWTLSName& issuer = cert->IssuerName();
-		if ((subject.NameType() == EWTLSText) && (issuer.NameType() == EWTLSText))
-			{
-			CWTLSText* sText = CWTLSText::NewLC(subject.NameData());
-			CWTLSText* iText = CWTLSText::NewLC(issuer.NameData());
-			__ASSERT_ALWAYS((sText->ExactMatchL(*iText)),User::Panic(_L("CERT"),0));
-			CleanupStack::PopAndDestroy(2);
-			}
-
-		}
-
-
-	CleanupStack::PopAndDestroy();
-	}
-
-void WTLSCertWriter::ShowName(const CWTLSName& aName)
-	{
-	if (aName.NameType() == EWTLSText)
-		{
-		CWTLSText* text = CWTLSText::NewL(aName.NameData());
-		CleanupStack::PushL(text);
-		iOut->writeString(_L("Char set = "));
-		iOut->writeNum(text->CharacterSet());
-		iOut->writeNewLine();
-		iOut->writeString(_L("Text = "));
-		iOut->writeString(text->Name());
-		iOut->writeNewLine();	
-		CleanupStack::PopAndDestroy();
-		}
-//	iOut->writeString(aName.Name());
-//	iOut->writeNewLine();
-	iOut->writeOctetStringL(aName.NameData());
-	}
-
-void WTLSCertWriter::ShowPublicKey(const CWTLSCertificate& aCertificate)
-	{
-	const CSubjectPublicKeyInfo& spki = aCertificate.PublicKey();
-	switch(spki.AlgorithmId())
-		{
-		case ERSA:
-			{
-			ShowRSAKey(spki);
-			break;
-			}
-		default:
-			//ignore any other algorithm
-			break;
-		}
-	}
-
-void WTLSCertWriter::ShowRSAKey(const CSubjectPublicKeyInfo& aSpki)
-	{
-	CRSAPublicKey* key = CWTLSRSAPublicKey::NewLC(aSpki.KeyData());
-	iOut->writeString(_L("RSA Key:"));
-	iOut->writeNewLine();
-	iOut->writeSpaces(4);
-	iOut->writeString(_L("Modulus = "));
-	iOut->writeNewLine();
-	const TInteger& mod = key->N();
-	HBufC8* mBuf = mod.BufferLC();
-	iOut->writeOctetStringL(mBuf->Des());
-	iOut->writeNewLine();	
-
-	iOut->writeSpaces(4);
-	iOut->writeString(_L("Exponent = "));
-	iOut->writeNewLine();
-	const TInteger& exp = key->E();
-	HBufC8* eBuf = exp.BufferLC();
-	iOut->writeOctetString(eBuf->Des());
-	iOut->writeNewLine();	
-	CleanupStack::PopAndDestroy(3);
-	}
-
-void WTLSCertWriter::ShowSigningAlgorithm(const CSigningAlgorithmIdentifier& aSigningAlgorithm)
-	{
-	iOut->writeString(_L("Signed using: "));
-	iOut->writeNewLine();
-	iOut->writeSpaces(4);
-	iOut->writeString(_L("Asymmetric algorithm = "));
-	const CAlgorithmIdentifier& algId = aSigningAlgorithm.AsymmetricAlgorithm();
-	switch(algId.Algorithm())
-	{
-	case ERSA:
-		{
-		iOut->writeString(_L("RSA"));
-		break;
-		}
-	case EDSA:
-		{
-		iOut->writeString(_L("DSA"));
-		break;
-		}
-	case EDH:
-		{
-		iOut->writeString(_L("DH"));
-		break;
-		}
-	default:
-		{
-		iOut->writeString(_L("Unknown"));
-		break;
-		}
-	}
-	iOut->writeNewLine();
-	iOut->writeSpaces(4);
-	iOut->writeString(_L("Digest algorithm = "));
-	const CAlgorithmIdentifier& digestId = aSigningAlgorithm.DigestAlgorithm();
-	switch(digestId.Algorithm())
-	{
-	case EMD2:
-		{
-		iOut->writeString(_L("MD2"));
-		break;
-		}
-	case EMD5:
-		{
-		iOut->writeString(_L("MD5"));
-		break;
-		}
-	case ESHA1:
-		{
-		iOut->writeString(_L("SHA1"));
-		break;
-		}
-	default:
-		{
-		iOut->writeString(_L("Unknown"));
-		break;
-		}
-	}
-	iOut->writeNewLine();
-	}
-
-void WTLSCertWriter::ShowSerialNumber(const TPtrC8& aSerialNumber)
-	{
-	iOut->writeString(_L("Serial Number = "));
-	iOut->writeOctetString(aSerialNumber);
-	iOut->writeNewLine();
-	}
-
-void WTLSCertWriter::ShowFingerprint(const CWTLSCertificate& aCertificate)
-	{
-	iOut->writeOctetString(aCertificate.Fingerprint());
-	iOut->writeNewLine();
-	}
-
-void WTLSCertWriter::ShowValidityPeriod(const CWTLSCertificate& aCertificate)
-	{
-	const CValidityPeriod& vp = aCertificate.ValidityPeriod();
-	iOut->writeString(_L("Validity Period = "));
-	iOut->writeNewLine();
-	const TTime& start = vp.Start();
-	const TTime& finish = vp.Finish();
-	TBuf<30> dateString1;
-	start.FormatL(dateString1,(_L("%H%:1%T:%S %*E%*D %X%*N%Y %1 %2 %3")));
-
-	iOut->writeSpaces(4);
-	iOut->writeString(_L("Valid From = "));
-	iOut->writeString(dateString1);
-	iOut->writeNewLine();
-
-	TBuf<30> dateString2;
-	finish.FormatL(dateString2,(_L("%H%:1%T:%S %*E%*D %X%*N%Y %1 %2 %3")));
-
-	iOut->writeSpaces(4);
-	iOut->writeString(_L("Valid Until = "));
-
-	iOut->writeString(dateString2);
-	iOut->writeNewLine();
-	}
-
-void WTLSCertWriter::WriteEncodings(const CWTLSCertificate& aCertificate)
-	{
-	iOut->writeString(_L("Version:"));
-	iOut->writeNewLine();
-	const TPtrC8* encoding = Encoding(aCertificate, CWTLSCertificate::EVersionNumber);
-	if (encoding)
-		{
-		iOut->writeOctetString(*encoding);
-		}
-	iOut->writeNewLine();
-
-	iOut->writeString(_L("Algorithm:"));
-	iOut->writeNewLine();
-	encoding = Encoding(aCertificate, CWTLSCertificate::EAlgorithmId);
-	if (encoding)
-		{
-		CWTLSSigningAlgorithmIdentifier* algId = CWTLSSigningAlgorithmIdentifier::NewL(*encoding);
-		CleanupStack::PushL(algId);
-		__ASSERT_ALWAYS((*algId==aCertificate.SigningAlgorithm()),User::Panic(_L("CERT"),0));
-		iOut->writeOctetString(*encoding);
-		CleanupStack::PopAndDestroy();
-		}
-	iOut->writeNewLine();
-
-	iOut->writeString(_L("Issuer:"));
-	iOut->writeNewLine();
-	encoding = Encoding(aCertificate, CWTLSCertificate::EIssuerName);
-	if (encoding)
-		{
-		CWTLSName* name = CWTLSName::NewL(*encoding);
-		CleanupStack::PushL(name);
-		__ASSERT_ALWAYS(	(name->ExactMatchL(aCertificate.IssuerName())	),User::Panic(_L("CERT"),0));
-		iOut->writeOctetStringL(*encoding);
-		CleanupStack::PopAndDestroy();
-		}
-	iOut->writeNewLine();
-
-	iOut->writeString(_L("Validity:"));
-	iOut->writeNewLine();
-	encoding = Encoding(aCertificate, CWTLSCertificate::EValidityPeriod);
-	if (encoding)
-		{
-		CValidityPeriod* val  = CWTLSValidityPeriod::NewL(*encoding);
-		CleanupStack::PushL(val);
-		__ASSERT_ALWAYS(((val->Start() == aCertificate.ValidityPeriod().Start()) && (val->Finish() == aCertificate.ValidityPeriod().Finish())),User::Panic(_L("CERT"),0));
-		iOut->writeOctetString(*encoding);
-		CleanupStack::PopAndDestroy();
-		}
-	iOut->writeNewLine();
-
-	iOut->writeString(_L("Subject:"));
-	iOut->writeNewLine();
-	encoding = Encoding(aCertificate, CWTLSCertificate::ESubjectName);
-	if (encoding)
-		{
-		CWTLSName* name = CWTLSName::NewL(*encoding);
-		CleanupStack::PushL(name);
-		__ASSERT_ALWAYS(	(name->ExactMatchL(aCertificate.SubjectName())	),User::Panic(_L("CERT"),0));
-		iOut->writeOctetStringL(*encoding);
-		CleanupStack::PopAndDestroy();
-		}
-	iOut->writeNewLine();
-
-	iOut->writeString(_L("Public Key:"));
-	iOut->writeNewLine();
-	encoding = Encoding(aCertificate, CWTLSCertificate::ESubjectPublicKeyInfo);
-	if (encoding)
-		{
-		CSubjectPublicKeyInfo* info  = CWTLSSubjectPublicKeyInfo::NewL(*encoding);
-		CleanupStack::PushL(info);
-		__ASSERT_ALWAYS((info->KeyData() == aCertificate.PublicKey().KeyData()),User::Panic(_L("CERT"),0));
-		iOut->writeOctetStringL(*encoding);
-		CleanupStack::PopAndDestroy();
-		}
-	iOut->writeNewLine();
-	}
-
-const TPtrC8* WTLSCertWriter::Encoding(const CWTLSCertificate& aCertificate, const TUint aIndex)
-	{
-	if (aCertificate.DataElementEncoding(aIndex))
-		{
-		return aCertificate.DataElementEncoding(aIndex);
-		}
-	return NULL;
-	}
+/*
+* Copyright (c) 1998-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: 
+* TWTLSOUT.CPP
+*
+*/
+
+
+#include "CertWriter.h"
+
+WTLSCertWriter::WTLSCertWriter(Output* aOut)
+	:iOut(aOut)
+	{
+	}
+
+void WTLSCertWriter::SetOut(Output* aOut)
+	{
+	iOut = aOut;
+	}
+
+void WTLSCertWriter::WriteCert(const CWTLSCertificate& aCertificate)
+	{
+	CWTLSCertificate* cert = CWTLSCertificate::NewL(aCertificate);
+	CleanupStack::PushL(cert);
+	WriteEncodings(*cert);
+	iOut->writeNewLine();
+	iOut->writeString(_L("Version = "));
+	iOut->writeNum(cert->Version());	
+	iOut->writeNewLine();	
+	ShowValidityPeriod(*cert);
+	iOut->writeString(_L("Issuer Name = "));
+	iOut->writeNewLine();	
+	ShowName(cert->IssuerName());	
+	iOut->writeNewLine();	
+	iOut->writeString(_L("Subject Name = "));
+	iOut->writeNewLine();	
+	ShowName(cert->SubjectName());
+	iOut->writeNewLine();	
+	ShowSigningAlgorithm(cert->SigningAlgorithm());
+	ShowPublicKey(aCertificate);
+
+	iOut->writeString(_L("Short Issuer Name = "));
+	HBufC* issuer = cert->IssuerL();
+	iOut->writeString(*issuer);
+	iOut->writeNewLine();
+	delete issuer;
+
+	iOut->writeString(_L("Short Subject Name = "));
+	HBufC* subject = cert->SubjectL();
+	iOut->writeString(*subject);
+	iOut->writeNewLine();
+	delete subject;
+
+	iOut->writeString(_L("Full structured issuer & subject names"));
+	iOut->writeNewLine();
+	CWTLSStructuredText* sIssuer = NULL;
+	TRAPD(err, sIssuer = CWTLSStructuredText::NewL(cert->IssuerName().NameData()));
+	if (err != KErrNone)
+		{
+		if (err == KErrNoMemory)
+			{
+			User::Leave(err);
+			}
+		}
+	else
+		{
+		const TWTLSStructuredTextField* field = sIssuer->FieldByName(KWTLSCountryName);
+		if (field)
+			{
+			iOut->writeString(field->Type());
+			iOut->writeString(_L(" = "));
+			iOut->writeString(field->Value());
+			iOut->writeNewLine();
+			__ASSERT_ALWAYS((field->Value() == sIssuer->Country()),User::Panic(_L("CERT"),0));
+			}
+
+		field = sIssuer->FieldByName(KWTLSOrganizationName);
+		if (field)
+			{
+			iOut->writeString(field->Type());
+			iOut->writeString(_L(" = "));
+			iOut->writeString(field->Value());
+			iOut->writeNewLine();
+			__ASSERT_ALWAYS((field->Value() == sIssuer->Organization()),User::Panic(_L("CERT"),0));
+			}
+		field = sIssuer->FieldByName(KWTLSServiceName);
+		if (field)
+			{
+			iOut->writeString(field->Type());
+			iOut->writeString(_L(" = "));
+			iOut->writeString(field->Value());
+			iOut->writeNewLine();
+			__ASSERT_ALWAYS((field->Value() == sIssuer->ServiceName()),User::Panic(_L("CERT"),0));
+			}
+		field = sIssuer->FieldByName(KWTLSTitle);
+		if (field)
+			{
+			iOut->writeString(field->Type());
+			iOut->writeString(_L(" = "));
+			iOut->writeString(field->Value());
+			iOut->writeNewLine();
+			}
+		field = sIssuer->FieldByName(KWTLSCommonName);
+		if (field)
+			{
+			iOut->writeString(field->Type());
+			iOut->writeString(_L(" = "));
+			iOut->writeString(field->Value());
+			iOut->writeNewLine();
+			}
+		delete sIssuer;
+		}
+
+	CWTLSStructuredText* sSubject = NULL;
+	TRAP(err, sSubject = CWTLSStructuredText::NewL(cert->SubjectName().NameData()));
+	if (err != KErrNone)
+		{
+		if (err == KErrNoMemory)
+			{
+			User::Leave(err);
+			}
+		}
+	else
+		{
+		TInt count = sSubject->Count();
+		for (TInt i = 0; i < count; i++)
+			{
+			const TWTLSStructuredTextField& field = sSubject->FieldByIndex(i);
+			iOut->writeString(field.Type());
+			iOut->writeString(_L(" = "));
+			iOut->writeString(field.Value());
+			iOut->writeNewLine();
+			}
+		delete sSubject;
+		}
+
+	if (cert->IsSelfSignedL())
+		{
+		const CWTLSName& subject = cert->SubjectName();
+		const CWTLSName& issuer = cert->IssuerName();
+		if ((subject.NameType() == EWTLSText) && (issuer.NameType() == EWTLSText))
+			{
+			CWTLSText* sText = CWTLSText::NewLC(subject.NameData());
+			CWTLSText* iText = CWTLSText::NewLC(issuer.NameData());
+			__ASSERT_ALWAYS((sText->ExactMatchL(*iText)),User::Panic(_L("CERT"),0));
+			CleanupStack::PopAndDestroy(2);
+			}
+
+		}
+
+
+	CleanupStack::PopAndDestroy();
+	}
+
+void WTLSCertWriter::ShowName(const CWTLSName& aName)
+	{
+	if (aName.NameType() == EWTLSText)
+		{
+		CWTLSText* text = CWTLSText::NewL(aName.NameData());
+		CleanupStack::PushL(text);
+		iOut->writeString(_L("Char set = "));
+		iOut->writeNum(text->CharacterSet());
+		iOut->writeNewLine();
+		iOut->writeString(_L("Text = "));
+		iOut->writeString(text->Name());
+		iOut->writeNewLine();	
+		CleanupStack::PopAndDestroy();
+		}
+//	iOut->writeString(aName.Name());
+//	iOut->writeNewLine();
+	iOut->writeOctetStringL(aName.NameData());
+	}
+
+void WTLSCertWriter::ShowPublicKey(const CWTLSCertificate& aCertificate)
+	{
+	const CSubjectPublicKeyInfo& spki = aCertificate.PublicKey();
+	switch(spki.AlgorithmId())
+		{
+		case ERSA:
+			{
+			ShowRSAKey(spki);
+			break;
+			}
+		default:
+			//ignore any other algorithm
+			break;
+		}
+	}
+
+void WTLSCertWriter::ShowRSAKey(const CSubjectPublicKeyInfo& aSpki)
+	{
+	CRSAPublicKey* key = CWTLSRSAPublicKey::NewLC(aSpki.KeyData());
+	iOut->writeString(_L("RSA Key:"));
+	iOut->writeNewLine();
+	iOut->writeSpaces(4);
+	iOut->writeString(_L("Modulus = "));
+	iOut->writeNewLine();
+	const TInteger& mod = key->N();
+	HBufC8* mBuf = mod.BufferLC();
+	iOut->writeOctetStringL(mBuf->Des());
+	iOut->writeNewLine();	
+
+	iOut->writeSpaces(4);
+	iOut->writeString(_L("Exponent = "));
+	iOut->writeNewLine();
+	const TInteger& exp = key->E();
+	HBufC8* eBuf = exp.BufferLC();
+	iOut->writeOctetString(eBuf->Des());
+	iOut->writeNewLine();	
+	CleanupStack::PopAndDestroy(3);
+	}
+
+void WTLSCertWriter::ShowSigningAlgorithm(const CSigningAlgorithmIdentifier& aSigningAlgorithm)
+	{
+	iOut->writeString(_L("Signed using: "));
+	iOut->writeNewLine();
+	iOut->writeSpaces(4);
+	iOut->writeString(_L("Asymmetric algorithm = "));
+	const CAlgorithmIdentifier& algId = aSigningAlgorithm.AsymmetricAlgorithm();
+	switch(algId.Algorithm())
+	{
+	case ERSA:
+		{
+		iOut->writeString(_L("RSA"));
+		break;
+		}
+	case EDSA:
+		{
+		iOut->writeString(_L("DSA"));
+		break;
+		}
+	case EDH:
+		{
+		iOut->writeString(_L("DH"));
+		break;
+		}
+	default:
+		{
+		iOut->writeString(_L("Unknown"));
+		break;
+		}
+	}
+	iOut->writeNewLine();
+	iOut->writeSpaces(4);
+	iOut->writeString(_L("Digest algorithm = "));
+	const CAlgorithmIdentifier& digestId = aSigningAlgorithm.DigestAlgorithm();
+	switch(digestId.Algorithm())
+	{
+	case EMD2:
+		{
+		iOut->writeString(_L("MD2"));
+		break;
+		}
+	case EMD5:
+		{
+		iOut->writeString(_L("MD5"));
+		break;
+		}
+	case ESHA1:
+		{
+		iOut->writeString(_L("SHA1"));
+		break;
+		}
+	default:
+		{
+		iOut->writeString(_L("Unknown"));
+		break;
+		}
+	}
+	iOut->writeNewLine();
+	}
+
+void WTLSCertWriter::ShowSerialNumber(const TPtrC8& aSerialNumber)
+	{
+	iOut->writeString(_L("Serial Number = "));
+	iOut->writeOctetString(aSerialNumber);
+	iOut->writeNewLine();
+	}
+
+void WTLSCertWriter::ShowFingerprint(const CWTLSCertificate& aCertificate)
+	{
+	iOut->writeOctetString(aCertificate.Fingerprint());
+	iOut->writeNewLine();
+	}
+
+void WTLSCertWriter::ShowValidityPeriod(const CWTLSCertificate& aCertificate)
+	{
+	const CValidityPeriod& vp = aCertificate.ValidityPeriod();
+	iOut->writeString(_L("Validity Period = "));
+	iOut->writeNewLine();
+	const TTime& start = vp.Start();
+	const TTime& finish = vp.Finish();
+	TBuf<30> dateString1;
+	start.FormatL(dateString1,(_L("%H%:1%T:%S %*E%*D %X%*N%Y %1 %2 %3")));
+
+	iOut->writeSpaces(4);
+	iOut->writeString(_L("Valid From = "));
+	iOut->writeString(dateString1);
+	iOut->writeNewLine();
+
+	TBuf<30> dateString2;
+	finish.FormatL(dateString2,(_L("%H%:1%T:%S %*E%*D %X%*N%Y %1 %2 %3")));
+
+	iOut->writeSpaces(4);
+	iOut->writeString(_L("Valid Until = "));
+
+	iOut->writeString(dateString2);
+	iOut->writeNewLine();
+	}
+
+void WTLSCertWriter::WriteEncodings(const CWTLSCertificate& aCertificate)
+	{
+	iOut->writeString(_L("Version:"));
+	iOut->writeNewLine();
+	const TPtrC8* encoding = Encoding(aCertificate, CWTLSCertificate::EVersionNumber);
+	if (encoding)
+		{
+		iOut->writeOctetString(*encoding);
+		}
+	iOut->writeNewLine();
+
+	iOut->writeString(_L("Algorithm:"));
+	iOut->writeNewLine();
+	encoding = Encoding(aCertificate, CWTLSCertificate::EAlgorithmId);
+	if (encoding)
+		{
+		CWTLSSigningAlgorithmIdentifier* algId = CWTLSSigningAlgorithmIdentifier::NewL(*encoding);
+		CleanupStack::PushL(algId);
+		__ASSERT_ALWAYS((*algId==aCertificate.SigningAlgorithm()),User::Panic(_L("CERT"),0));
+		iOut->writeOctetString(*encoding);
+		CleanupStack::PopAndDestroy();
+		}
+	iOut->writeNewLine();
+
+	iOut->writeString(_L("Issuer:"));
+	iOut->writeNewLine();
+	encoding = Encoding(aCertificate, CWTLSCertificate::EIssuerName);
+	if (encoding)
+		{
+		CWTLSName* name = CWTLSName::NewL(*encoding);
+		CleanupStack::PushL(name);
+		__ASSERT_ALWAYS(	(name->ExactMatchL(aCertificate.IssuerName())	),User::Panic(_L("CERT"),0));
+		iOut->writeOctetStringL(*encoding);
+		CleanupStack::PopAndDestroy();
+		}
+	iOut->writeNewLine();
+
+	iOut->writeString(_L("Validity:"));
+	iOut->writeNewLine();
+	encoding = Encoding(aCertificate, CWTLSCertificate::EValidityPeriod);
+	if (encoding)
+		{
+		CValidityPeriod* val  = CWTLSValidityPeriod::NewL(*encoding);
+		CleanupStack::PushL(val);
+		__ASSERT_ALWAYS(((val->Start() == aCertificate.ValidityPeriod().Start()) && (val->Finish() == aCertificate.ValidityPeriod().Finish())),User::Panic(_L("CERT"),0));
+		iOut->writeOctetString(*encoding);
+		CleanupStack::PopAndDestroy();
+		}
+	iOut->writeNewLine();
+
+	iOut->writeString(_L("Subject:"));
+	iOut->writeNewLine();
+	encoding = Encoding(aCertificate, CWTLSCertificate::ESubjectName);
+	if (encoding)
+		{
+		CWTLSName* name = CWTLSName::NewL(*encoding);
+		CleanupStack::PushL(name);
+		__ASSERT_ALWAYS(	(name->ExactMatchL(aCertificate.SubjectName())	),User::Panic(_L("CERT"),0));
+		iOut->writeOctetStringL(*encoding);
+		CleanupStack::PopAndDestroy();
+		}
+	iOut->writeNewLine();
+
+	iOut->writeString(_L("Public Key:"));
+	iOut->writeNewLine();
+	encoding = Encoding(aCertificate, CWTLSCertificate::ESubjectPublicKeyInfo);
+	if (encoding)
+		{
+		CSubjectPublicKeyInfo* info  = CWTLSSubjectPublicKeyInfo::NewL(*encoding);
+		CleanupStack::PushL(info);
+		__ASSERT_ALWAYS((info->KeyData() == aCertificate.PublicKey().KeyData()),User::Panic(_L("CERT"),0));
+		iOut->writeOctetStringL(*encoding);
+		CleanupStack::PopAndDestroy();
+		}
+	iOut->writeNewLine();
+	}
+
+const TPtrC8* WTLSCertWriter::Encoding(const CWTLSCertificate& aCertificate, const TUint aIndex)
+	{
+	if (aCertificate.DataElementEncoding(aIndex))
+		{
+		return aCertificate.DataElementEncoding(aIndex);
+		}
+	return NULL;
+	}
+