First public contribution.
2 * Copyright (c) 1998-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.
20 #include "t_certstoreout.h"
22 X509CertWriter::X509CertWriter(Output& aOut)
27 void X509CertWriter::WriteCert(const CX509Certificate& aCertificate)
30 ShowSerialNumber(aCertificate.SerialNumber());
31 ShowValidityPeriod(aCertificate);
32 iOut.writeString(_L("Issuer Name = "));
34 ShowDN(aCertificate.IssuerName());
35 iOut.writeString(_L("Subject Name = "));
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);
48 iOut.writeString(_L("\t\tShort Subject Name = "));
49 HBufC* subject = aCertificate.SubjectL();
50 iOut.writeString(*subject);
55 // The rest of these are only compiled of SHOW_EXTENDED defined - this
56 // eliminates warnings from WINS/UREL build
58 void X509CertWriter::ShowSigningAlgorithm(const CSigningAlgorithmIdentifier& aSigningAlgorithm)
60 iOut.writeString(_L("Signed using: "));
63 iOut.writeString(_L("Asymmetric algorithm = "));
64 const CAlgorithmIdentifier& algId = aSigningAlgorithm.AsymmetricAlgorithm();
65 switch(algId.Algorithm())
69 iOut.writeString(_L("RSA"));
74 iOut.writeString(_L("DSA"));
79 iOut.writeString(_L("DH"));
83 iOut.writeString(_L("Unknown"));
88 iOut.writeString(_L("Digest algorithm = "));
89 const CAlgorithmIdentifier& digestId = aSigningAlgorithm.DigestAlgorithm();
90 switch(digestId.Algorithm())
94 iOut.writeString(_L("MD2"));
99 iOut.writeString(_L("MD5"));
104 iOut.writeString(_L("SHA1"));
108 iOut.writeString(_L("Unknown"));
113 void X509CertWriter::ShowSerialNumber(const TPtrC8& aSerialNumber)
115 iOut.writeString(_L("Serial Number = "));
116 iOut.writeOctetString(aSerialNumber);
121 void X509CertWriter::ShowAVA(const CX520AttributeTypeAndValue& aAva)
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();
131 void X509CertWriter::ShowDN(const CX500DistinguishedName& aName)
133 TInt count = aName.Count();
134 for (TInt i = 0; i < count; i++)
136 const CX520AttributeTypeAndValue& ava = aName.Element(i);
143 void X509CertWriter::ShowAKI(const CX509Certificate& aCert)
145 const CX509CertExtension* akiExt = aCert.Extension(KAuthorityKeyId);
148 iOut.writeString(_L("Authority Key ID = "));
150 const CX509AuthorityKeyIdExt* ext = CX509AuthorityKeyIdExt::NewLC(akiExt->Data());
151 const CArrayPtrFlat<CX509GeneralName>& authorityName = ext->AuthorityName();
152 TInt count = authorityName.Count();
156 iOut.writeString(_L("Authority name = "));
158 for (TInt i = 0; i < count; i++)
160 ShowGN(*(authorityName.At(i)));
163 if (ext->AuthorityCertSerialNumber().Length() > 0)
166 iOut.writeString(_L("Authority cert serial no = "));
167 iOut.writeOctetString(ext->AuthorityCertSerialNumber());
171 iOut.writeString(_L("Key Id = "));
172 iOut.writeOctetString(ext->KeyId());
174 CleanupStack::PopAndDestroy();
178 void X509CertWriter::ShowSKI(const CX509Certificate& aCert)
180 const CX509CertExtension* skiExt = aCert.Extension(KSubjectKeyId);
183 iOut.writeString(_L("Subject Key ID = "));
185 const CX509SubjectKeyIdExt* ext = CX509SubjectKeyIdExt::NewLC(skiExt->Data());
187 iOut.writeString(_L("Key Id = "));
188 iOut.writeOctetString(ext->KeyId());
190 CleanupStack::PopAndDestroy();
194 void X509CertWriter::ShowGN(const CX509GeneralName& aName)
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++)
207 iOut.writeString(rep[i]);
211 CleanupStack::PopAndDestroy();//email
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++)
222 iOut.writeString(rep[i]);
225 CleanupStack::PopAndDestroy();//dns
231 CX500DistinguishedName* dN = CX500DistinguishedName::NewLC(aName.Data());
233 CleanupStack::PopAndDestroy();
239 CX509IPBasedURI* uri = CX509IPBasedURI::NewLC(aName.Data());
240 iOut.writeString(uri->Name());
242 CleanupStack::PopAndDestroy();//uri
247 //ip address//!!!!not done for writing to file yet!!!
248 CX509IPSubnetMask* ip = CX509IPSubnetMask::NewLC(aName.Data());
249 TPtrC8 pBA(ip->BaseAddress());
251 counter = pBA.Length();
252 TPtrC8 pM(ip->Mask());
253 counter = pM.Length();
254 CleanupStack::PopAndDestroy();
261 void X509CertWriter::ShowFingerprint(const CX509Certificate& aCertificate)
263 iOut.writeOctetString(aCertificate.Fingerprint());
267 void X509CertWriter::ShowValidityPeriod(const CX509Certificate& aCertificate)
269 const CValidityPeriod& vp = aCertificate.ValidityPeriod();
270 iOut.writeString(_L("Validity Period = "));
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")));
278 iOut.writeString(_L("Valid From = "));
279 iOut.writeString(dateString1);
282 TBuf<30> dateString2;
283 finish.FormatL(dateString2,(_L("%H%:1%T:%S %*E%*D %X%*N%Y %1 %2 %3")));
286 iOut.writeString(_L("Valid Until = "));
288 iOut.writeString(dateString2);
293 void X509CertWriter::ShowExtensions(const CX509Certificate& aCertificate)
295 const CArrayPtrFlat<CX509CertExtension>& exts = aCertificate.Extensions();
296 TInt count = exts.Count();
297 for (TInt i = 0; i < count; i++)
299 const CX509CertExtension* ext = exts.At(i);
300 iOut.writeString(_L("extension"));
302 if (!(ext->Critical()))
304 iOut.writeString(_L(" not"));
306 iOut.writeString(_L(" critical"));
307 iOut.writeString(_L(" ID = "));
309 iOut.writeString(id);
311 if (id == KBasicConstraints)
315 if (id == KSubjectAltName)
317 iOut.writeString(_L("SubjectAltName: \n"));
320 if (id == KIssuerAltName)
322 iOut.writeString(_L("IssuerAltName: \n"));
329 if (id == KNameConstraints)
333 if (id == KPolicyConstraints)
337 if (id == KCertPolicies)
341 if (id == KPolicyMapping)
345 if (id == KAuthorityKeyId)
347 ShowAKI(aCertificate);
349 if (id == KSubjectKeyId)
351 ShowSKI(aCertificate);
353 if (id == KExtendedKeyUsage)
360 void X509CertWriter::ShowBC(const CX509CertExtension& aExt)
362 iOut.writeString(_L("Basic Constraints:"));
364 CX509BasicConstraintsExt* ext = CX509BasicConstraintsExt::NewLC(aExt.Data());
368 iOut.writeString(_L("CA cert"));
370 if (ext->MaxChainLength() < KMaxTInt)
373 iOut.writeString(_L("Max Chain Length = "));
374 iOut.writeNum(ext->MaxChainLength());
381 iOut.writeString(_L("EE cert"));
384 CleanupStack::PopAndDestroy();
387 void X509CertWriter::ShowAltName(const CX509CertExtension& aExt)
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++)
394 ShowGN(*(names.At(i)));
396 CleanupStack::PopAndDestroy();
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");
410 void X509CertWriter::ShowKU(const CX509CertExtension& aExt)
412 iOut.writeString(_L("Key Usage:"));
414 CX509KeyUsageExt* ext = CX509KeyUsageExt::NewLC(aExt.Data());
415 if (ext->IsSet(EX509DigitalSignature))
418 iOut.writeString(KDigSig);
421 if (ext->IsSet(EX509NonRepudiation))
424 iOut.writeString(KNonRep);
427 if (ext->IsSet(EX509KeyEncipherment))
430 iOut.writeString(KKeyEnc);
433 if (ext->IsSet(EX509DataEncipherment))
436 iOut.writeString(KDataEnc);
439 if (ext->IsSet(EX509KeyAgreement))
442 iOut.writeString(KKeyAgree);
445 if (ext->IsSet(EX509KeyCertSign))
448 iOut.writeString(KCertSign);
451 if (ext->IsSet(EX509CRLSign))
454 iOut.writeString(KCRLSign);
457 if (ext->IsSet(EX509EncipherOnly))
460 iOut.writeString(KEnciph);
463 if (ext->IsSet(EX509DecipherOnly))
466 iOut.writeString(KDeciph);
469 CleanupStack::PopAndDestroy();//ext
472 void X509CertWriter::ShowSubtrees(const CArrayPtrFlat<CX509GeneralSubtree>& aSubtrees)
474 TInt count = aSubtrees.Count();
475 for (TInt i = 0; i < count; i++)
477 const CX509GeneralSubtree* subtree = aSubtrees.At(i);
478 ShowGN(subtree->Name());
479 ///!!!!!don't write these outFile either!!
483 void X509CertWriter::ShowNC(const CX509CertExtension& aExt)
484 {//!!!!don't write these outFile
486 CX509NameConstraintsExt* ext = CX509NameConstraintsExt::NewLC(aExt.Data());
487 ShowSubtrees(ext->ExcludedSubtrees());
488 ShowSubtrees(ext->PermittedSubtrees());
489 CleanupStack::PopAndDestroy();
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();
500 void X509CertWriter::ShowCP(const CX509CertExtension& aExt)
502 iOut.writeString(_L("Cert Policies = "));
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++)
510 const CX509CertPolicyInfo* policy = policies.At(i);
513 iOut.writeString(_L("Policy ID = "));
514 iOut.writeString(policy->Id());
516 const CArrayPtrFlat<CX509PolicyQualifierInfo>& qualifiers = policy->Qualifiers();
517 TInt qCount = qualifiers.Count();
523 iOut.writeString(_L("Qualified by: "));
527 for (TInt i = 0; i < qCount; i++)
529 CX509PolicyQualifierInfo* qualifier = qualifiers.At(i);
532 iOut.writeString(_L("Qualifier ID = "));
533 iOut.writeString(qualifier->Id());
537 CleanupStack::PopAndDestroy();//ext
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++)
547 //const CX509PolicyMapping* mapping = mappings.At(i);
549 CleanupStack::PopAndDestroy();
553 void X509CertWriter::ShowEKU(const CX509CertExtension& aExt)
555 iOut.writeString(_L("Extended Key Usage = "));
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++)
564 iOut.writeString(usages.At(i)->Des());
567 CleanupStack::PopAndDestroy();
570 void X509CertWriter::ShowSignature(const CX509Certificate& /*aCert*/)
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();*/
579 void X509CertWriter::WriteEncodings(const CX509Certificate& aCertificate)
581 iOut.writeString(_L("Version:"));
583 WriteEncoding(aCertificate, CX509Certificate::EVersionNumber);
586 iOut.writeString(_L("Serial Number:"));
588 WriteEncoding(aCertificate, CX509Certificate::ESerialNumber);
591 iOut.writeString(_L("Algorithm:"));
593 WriteEncoding(aCertificate, CX509Certificate::EAlgorithmId);
596 iOut.writeString(_L("Issuer:"));
598 WriteEncoding(aCertificate, CX509Certificate::EIssuerName);
601 iOut.writeString(_L("Validity:"));
603 WriteEncoding(aCertificate, CX509Certificate::EValidityPeriod);
606 iOut.writeString(_L("Subject:"));
608 WriteEncoding(aCertificate, CX509Certificate::ESubjectName);
611 iOut.writeString(_L("Public Key:"));
613 WriteEncoding(aCertificate, CX509Certificate::ESubjectPublicKeyInfo);
616 iOut.writeString(_L("Issuer ID:"));
618 WriteEncoding(aCertificate, CX509Certificate::EIssuerUID);
621 iOut.writeString(_L("Subject ID:"));
623 WriteEncoding(aCertificate, CX509Certificate::ESubjectUID);
626 iOut.writeString(_L("Extensions:"));
628 WriteEncoding(aCertificate, CX509Certificate::EExtensionList);
632 void X509CertWriter::WriteEncoding(const CX509Certificate& aCertificate, const TUint aIndex)
634 if (aCertificate.DataElementEncoding(aIndex))
636 iOut.writeOctetString(*(aCertificate.DataElementEncoding(aIndex)));
640 #endif // SHOW_EXTENDED
642 /**********************************************************/
644 WTLSCertWriter::WTLSCertWriter(Output& aOut)
649 void WTLSCertWriter::WriteCert(const CWTLSCertificate& aCertificate)
651 iOut.writeString(_L("\t\tIssuer Name = "));
652 HBufC* issuer = aCertificate.IssuerL();
653 iOut.writeString(*issuer);
656 iOut.writeString(_L("\t\tSubject Name = "));
657 HBufC* subject = aCertificate.SubjectL();
658 iOut.writeString(*subject);
663 void WTLSCertWriter::ShowName(const CWTLSName& /*aName*/)
665 // iOut.writeString(aName.Name());