--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/cryptoservices/certificateandkeymgmt/twtlscert/CertWriter.cpp Wed Jul 08 11:25:26 2009 +0100
@@ -0,0 +1,406 @@
+/*
+* 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;
+ }