sl@0: /* sl@0: * Copyright (c) 1998-2009 Nokia Corporation and/or its subsidiary(-ies). sl@0: * All rights reserved. sl@0: * This component and the accompanying materials are made available sl@0: * under the terms of the License "Eclipse Public License v1.0" sl@0: * which accompanies this distribution, and is available sl@0: * at the URL "http://www.eclipse.org/legal/epl-v10.html". sl@0: * sl@0: * Initial Contributors: sl@0: * Nokia Corporation - initial contribution. sl@0: * sl@0: * Contributors: sl@0: * sl@0: * Description: sl@0: * sl@0: */ sl@0: sl@0: sl@0: #include "tcertwriter.h" sl@0: #include sl@0: #include sl@0: sl@0: EXPORT_C CertWriter::CertWriter(Output* aOut) sl@0: :iOut(aOut) sl@0: { sl@0: } sl@0: sl@0: EXPORT_C void CertWriter::SetOut(Output* aOut) sl@0: { sl@0: iOut = aOut; sl@0: } sl@0: sl@0: EXPORT_C void CertWriter::WriteCert(const CX509Certificate& aCertificate) sl@0: { sl@0: sl@0: CX509Certificate* cert = CX509Certificate::NewLC(aCertificate); sl@0: // iOut->writeString(_L("\n Certificate Version = ")): sl@0: // iOut->writeNum(cert->Version()); sl@0: // iOut.writeNewLine(); sl@0: WriteEncodings(*cert); sl@0: iOut->writeNewLine(); sl@0: ShowSerialNumber(cert->SerialNumber()); sl@0: ShowValidityPeriod(*cert); sl@0: iOut->writeString(_L("Issuer Name = ")); sl@0: iOut->writeNewLine(); sl@0: ShowDN(cert->IssuerName()); sl@0: iOut->writeString(_L("Subject Name = ")); sl@0: iOut->writeNewLine(); sl@0: ShowDN(cert->SubjectName()); sl@0: ShowSigningAlgorithm(cert->SigningAlgorithm()); sl@0: ShowExtensions(*cert); sl@0: ShowPublicKey(*cert); sl@0: iOut->writeNewLine(); sl@0: ShowFingerprint(*cert); sl@0: ShowSignature(*cert); sl@0: sl@0: /* CalculateSignature(*cert); sl@0: if (IsSelfSigned(*cert)) sl@0: { sl@0: iOut->writeString(_L("\nSelf-signed\n")); sl@0: } sl@0: else sl@0: { sl@0: iOut->writeString(_L("\nNot self-signed\n")); sl@0: } sl@0: */ sl@0: sl@0: iOut->writeString(_L("Short Issuer Name = ")); sl@0: HBufC* issuer = cert->IssuerL(); sl@0: iOut->writeString(*issuer); sl@0: iOut->writeNewLine(); sl@0: delete issuer; sl@0: sl@0: iOut->writeString(_L("Short Subject Name = ")); sl@0: HBufC* subject = cert->SubjectL(); sl@0: iOut->writeString(*subject); sl@0: iOut->writeNewLine(); sl@0: delete subject; sl@0: sl@0: iOut->writeNewLine(); sl@0: CleanupStack::PopAndDestroy();//cert sl@0: } sl@0: sl@0: EXPORT_C void CertWriter::ShowPublicKey(const CX509Certificate& aCertificate) sl@0: { sl@0: const CSubjectPublicKeyInfo& spki = aCertificate.PublicKey(); sl@0: switch(spki.AlgorithmId()) sl@0: { sl@0: case ERSA: sl@0: ShowRSAKey(spki); sl@0: break; sl@0: sl@0: case EDSA: sl@0: ShowDSAKey(spki); sl@0: break; sl@0: sl@0: case EDH: sl@0: ShowDHKey(spki); sl@0: break; sl@0: sl@0: default: sl@0: User::Panic(_L("CertWriter"), 1); sl@0: break; sl@0: } sl@0: } sl@0: sl@0: sl@0: void CertWriter::ShowRSAKey(const CSubjectPublicKeyInfo& aSpki) sl@0: { sl@0: CX509RSAPublicKey* key = CX509RSAPublicKey::NewLC(aSpki.KeyData()); sl@0: iOut->writeString(_L("RSA Key:")); sl@0: iOut->writeNewLine(); sl@0: iOut->writeSpaces(4); sl@0: iOut->writeString(_L("Modulus = ")); sl@0: iOut->writeNewLine(); sl@0: const TInteger& mod = key->N(); sl@0: HBufC8* mBuf = mod.BufferLC(); sl@0: iOut->writeOctetStringL(mBuf->Des()); sl@0: iOut->writeNewLine(); sl@0: sl@0: iOut->writeSpaces(4); sl@0: iOut->writeString(_L("Exponent = ")); sl@0: iOut->writeNewLine(); sl@0: const TInteger& exp = key->E(); sl@0: HBufC8* eBuf = exp.BufferLC(); sl@0: iOut->writeOctetStringL(eBuf->Des()); sl@0: iOut->writeNewLine(); sl@0: CleanupStack::PopAndDestroy(eBuf); sl@0: CleanupStack::PopAndDestroy(mBuf); sl@0: CleanupStack::PopAndDestroy(key); sl@0: } sl@0: sl@0: void CertWriter::ShowDSAKey(const CSubjectPublicKeyInfo& aSpki) sl@0: { sl@0: const TDesC8& encParams = aSpki.EncodedParams(); sl@0: if (encParams.Length() != 0) sl@0: { sl@0: CDSAPublicKey* key = CX509DSAPublicKey::NewLC(encParams, aSpki.KeyData()); sl@0: iOut->writeString(_L("DSA Key:")); sl@0: iOut->writeNewLine(); sl@0: iOut->writeSpaces(4); sl@0: iOut->writeString(_L("Y = ")); sl@0: iOut->writeNewLine(); sl@0: const TInteger& y = key->Y(); sl@0: HBufC8* yBuf = y.BufferLC(); sl@0: iOut->writeOctetStringL(yBuf->Des()); sl@0: iOut->writeNewLine(); sl@0: sl@0: iOut->writeSpaces(4); sl@0: iOut->writeString(_L("Params = ")); sl@0: iOut->writeNewLine(); sl@0: sl@0: iOut->writeSpaces(8); sl@0: iOut->writeString(_L("P = ")); sl@0: iOut->writeNewLine(); sl@0: const TInteger& p = key->P(); sl@0: HBufC8* pBuf = p.BufferLC(); sl@0: iOut->writeOctetStringL(pBuf->Des()); sl@0: iOut->writeNewLine(); sl@0: sl@0: iOut->writeSpaces(8); sl@0: iOut->writeString(_L("Q = ")); sl@0: iOut->writeNewLine(); sl@0: const TInteger& q = key->Q(); sl@0: HBufC8* qBuf = q.BufferLC(); sl@0: iOut->writeOctetStringL(qBuf->Des()); sl@0: iOut->writeNewLine(); sl@0: sl@0: iOut->writeSpaces(8); sl@0: iOut->writeString(_L("G = ")); sl@0: iOut->writeNewLine(); sl@0: const TInteger& g = key->G(); sl@0: HBufC8* gBuf = g.BufferLC(); sl@0: iOut->writeOctetStringL(gBuf->Des()); sl@0: iOut->writeNewLine(); sl@0: sl@0: CleanupStack::PopAndDestroy(5); sl@0: } sl@0: } sl@0: sl@0: void CertWriter::ShowDHKey(const CSubjectPublicKeyInfo& aSpki) sl@0: { sl@0: TASN1DecInteger encInt; sl@0: TInt pos = 0; sl@0: RInteger keyVal = encInt.DecodeDERLongL(aSpki.KeyData(), pos); sl@0: CleanupStack::PushL(keyVal); sl@0: HBufC8* keyValBuf = keyVal.BufferLC(); sl@0: iOut->writeString(_L("Y = ")); sl@0: iOut->writeNewLine(); sl@0: iOut->writeOctetStringL(keyValBuf->Des()); sl@0: CleanupStack::PopAndDestroy(2, &keyVal); sl@0: sl@0: CX509DHDomainParams* params = CX509DHDomainParams::NewLC(aSpki.EncodedParams()); sl@0: const TInteger& p = params->P(); sl@0: const TInteger& g = params->G(); sl@0: const TInteger& q = params->Q(); sl@0: const TInteger& j = params->J(); sl@0: const CX509DHValidationParams* valParams = params->ValidationParams(); sl@0: sl@0: iOut->writeNewLine(); sl@0: iOut->writeString(_L("Params = ")); sl@0: iOut->writeNewLine(); sl@0: sl@0: iOut->writeString(_L("P = ")); sl@0: iOut->writeNewLine(); sl@0: HBufC8* pBuf = p.BufferLC(); sl@0: iOut->writeOctetStringL(pBuf->Des()); sl@0: iOut->writeNewLine(); sl@0: CleanupStack::PopAndDestroy(); sl@0: sl@0: iOut->writeString(_L("G = ")); sl@0: iOut->writeNewLine(); sl@0: HBufC8* gBuf = g.BufferLC(); sl@0: iOut->writeOctetStringL(gBuf->Des()); sl@0: iOut->writeNewLine(); sl@0: CleanupStack::PopAndDestroy(); sl@0: sl@0: iOut->writeString(_L("Q = ")); sl@0: iOut->writeNewLine(); sl@0: HBufC8* qBuf = q.BufferLC(); sl@0: iOut->writeOctetStringL(qBuf->Des()); sl@0: iOut->writeNewLine(); sl@0: CleanupStack::PopAndDestroy(); sl@0: sl@0: iOut->writeString(_L("J = ")); sl@0: iOut->writeNewLine(); sl@0: HBufC8* jBuf = j.BufferLC(); sl@0: iOut->writeOctetStringL(jBuf->Des()); sl@0: iOut->writeNewLine(); sl@0: CleanupStack::PopAndDestroy(); sl@0: sl@0: if (valParams) sl@0: { sl@0: iOut->writeString(_L("Seed = ")); sl@0: iOut->writeNewLine(); sl@0: iOut->writeOctetStringL(valParams->Seed()); sl@0: iOut->writeNewLine(); sl@0: const TInteger& pGC = valParams->PGenCounter(); sl@0: HBufC8* pgBuf = pGC.BufferLC(); sl@0: iOut->writeString(_L("pGenCounter = ")); sl@0: iOut->writeNewLine(); sl@0: iOut->writeOctetStringL(pgBuf->Des()); sl@0: iOut->writeNewLine(); sl@0: CleanupStack::PopAndDestroy(); sl@0: } sl@0: CleanupStack::PopAndDestroy(); sl@0: } sl@0: sl@0: sl@0: EXPORT_C void CertWriter::ShowSigningAlgorithm(const CSigningAlgorithmIdentifier& aSigningAlgorithm) sl@0: { sl@0: iOut->writeString(_L("Signed using: ")); sl@0: iOut->writeNewLine(); sl@0: iOut->writeSpaces(4); sl@0: iOut->writeString(_L("Asymmetric algorithm = ")); sl@0: const CAlgorithmIdentifier& algId = aSigningAlgorithm.AsymmetricAlgorithm(); sl@0: switch(algId.Algorithm()) sl@0: { sl@0: case ERSA: sl@0: iOut->writeString(_L("RSA")); sl@0: break; sl@0: sl@0: case EDSA: sl@0: iOut->writeString(_L("DSA")); sl@0: break; sl@0: sl@0: case EDH: sl@0: iOut->writeString(_L("DH")); sl@0: break; sl@0: sl@0: default: sl@0: User::Panic(_L("CertWriter"), 1); sl@0: break; sl@0: } sl@0: iOut->writeNewLine(); sl@0: iOut->writeSpaces(4); sl@0: iOut->writeString(_L("Digest algorithm = ")); sl@0: const CAlgorithmIdentifier& digestId = aSigningAlgorithm.DigestAlgorithm(); sl@0: switch(digestId.Algorithm()) sl@0: { sl@0: case EMD2: sl@0: iOut->writeString(_L("MD2")); sl@0: break; sl@0: sl@0: case EMD5: sl@0: iOut->writeString(_L("MD5")); sl@0: break; sl@0: sl@0: case ESHA1: sl@0: iOut->writeString(_L("SHA1")); sl@0: break; sl@0: sl@0: default: sl@0: User::Panic(_L("CertWriter"), 1); sl@0: break; sl@0: } sl@0: iOut->writeNewLine(); sl@0: } sl@0: sl@0: EXPORT_C void CertWriter::ShowSerialNumber(const TPtrC8& aSerialNumber) sl@0: { sl@0: iOut->writeString(_L("Serial Number = ")); sl@0: iOut->writeOctetStringL(aSerialNumber); sl@0: iOut->writeNewLine(); sl@0: } sl@0: sl@0: //dn display code sl@0: EXPORT_C void CertWriter::ShowAVA(const CX520AttributeTypeAndValue& aAva) sl@0: { sl@0: iOut->writeString(aAva.Type()); sl@0: HBufC* val = aAva.ValueL(); sl@0: CleanupStack::PushL(val); sl@0: iOut->writeString(_L(" = ")); sl@0: iOut->writeString(val->Des()); sl@0: CleanupStack::PopAndDestroy(); sl@0: } sl@0: sl@0: EXPORT_C void CertWriter::ShowDN(const CX500DistinguishedName& aName) sl@0: { sl@0: iOut->writeNewLine(); sl@0: TInt count = aName.Count(); sl@0: for (TInt i = 0; i < count; i++) sl@0: { sl@0: const CX520AttributeTypeAndValue& ava = aName.Element(i); sl@0: iOut->writeSpaces(4); sl@0: ShowAVA(ava); sl@0: iOut->writeNewLine(); sl@0: } sl@0: } sl@0: sl@0: EXPORT_C void CertWriter::ShowAKI(const CX509Certificate& aCert) sl@0: { sl@0: const CX509CertExtension* akiExt = aCert.Extension(KAuthorityKeyId); sl@0: if (akiExt) sl@0: { sl@0: iOut->writeString(_L("Authority Key ID = ")); sl@0: iOut->writeNewLine(); sl@0: const CX509AuthorityKeyIdExt* ext = CX509AuthorityKeyIdExt::NewLC(akiExt->Data()); sl@0: const CArrayPtrFlat& authorityName = ext->AuthorityName(); sl@0: TInt count = authorityName.Count(); sl@0: if (count > 0) sl@0: { sl@0: iOut->writeSpaces(4); sl@0: iOut->writeString(_L("Authority name = ")); sl@0: iOut->writeNewLine(); sl@0: for (TInt i = 0; i < count; i++) sl@0: { sl@0: ShowGN(*(authorityName.At(i))); sl@0: } sl@0: } sl@0: if (ext->AuthorityCertSerialNumber().Length() > 0) sl@0: { sl@0: iOut->writeSpaces(4); sl@0: iOut->writeString(_L("Authority cert serial no = ")); sl@0: iOut->writeOctetStringL(ext->AuthorityCertSerialNumber()); sl@0: iOut->writeNewLine(); sl@0: } sl@0: iOut->writeSpaces(4); sl@0: iOut->writeString(_L("Key Id = ")); sl@0: iOut->writeOctetStringL(ext->KeyId()); sl@0: iOut->writeNewLine(); sl@0: CleanupStack::PopAndDestroy(); sl@0: } sl@0: } sl@0: sl@0: EXPORT_C void CertWriter::ShowSKI(const CX509Certificate& aCert) sl@0: { sl@0: const CX509CertExtension* skiExt = aCert.Extension(KSubjectKeyId); sl@0: if (skiExt) sl@0: { sl@0: iOut->writeString(_L("Subject Key ID = ")); sl@0: iOut->writeNewLine(); sl@0: const CX509SubjectKeyIdExt* ext = CX509SubjectKeyIdExt::NewLC(skiExt->Data()); sl@0: iOut->writeSpaces(4); sl@0: iOut->writeString(_L("Key Id = ")); sl@0: iOut->writeOctetStringL(ext->KeyId()); sl@0: iOut->writeNewLine(); sl@0: CleanupStack::PopAndDestroy(); sl@0: } sl@0: } sl@0: sl@0: EXPORT_C void CertWriter::ShowGN(const CX509GeneralName& aName) sl@0: { sl@0: iOut->writeSpaces(4); sl@0: switch(aName.Tag()) sl@0: { sl@0: case 1: sl@0: { sl@0: //rfc822 sl@0: CX509RFC822NameSubtree* email = CX509RFC822NameSubtree::NewLC(aName.Data()); sl@0: iOut->writeString(email->Name()); sl@0: iOut->writeNewLine(); sl@0: CleanupStack::PopAndDestroy();//email sl@0: break; sl@0: } sl@0: case 2: sl@0: { sl@0: //dns name sl@0: CX509DNSNameSubtree* dns = CX509DNSNameSubtree::NewLC(aName.Data()); sl@0: iOut->writeString(dns->Name()); sl@0: CleanupStack::PopAndDestroy();//dns sl@0: break; sl@0: } sl@0: case 4: sl@0: { sl@0: //DN sl@0: CX500DistinguishedName* dN = CX500DistinguishedName::NewLC(aName.Data()); sl@0: ShowDN(*dN); sl@0: CleanupStack::PopAndDestroy(); sl@0: break; sl@0: } sl@0: case 6: sl@0: { sl@0: //uri sl@0: CX509IPBasedURI* uri = CX509IPBasedURI::NewLC(aName.Data()); sl@0: iOut->writeString(uri->Name()); sl@0: iOut->writeNewLine(); sl@0: iOut->writeString(_L("Host=")); sl@0: iOut->writeString(uri->Host().Name()); sl@0: iOut->writeNewLine(); sl@0: CleanupStack::PopAndDestroy();//uri sl@0: break; sl@0: } sl@0: case 7: sl@0: { sl@0: CX509IPAddress* ip = CX509IPAddress::NewLC(aName.Data()); sl@0: TPtrC8 addressStr(ip->Address()); sl@0: // IPv6 output not implemented yet sl@0: iOut->write(_L("IP=%d.%d.%d.%d"), addressStr[0], addressStr[1], addressStr[2], addressStr[3]); sl@0: iOut->writeNewLine(); sl@0: CleanupStack::PopAndDestroy(); sl@0: break; sl@0: } sl@0: } sl@0: } sl@0: sl@0: sl@0: EXPORT_C void CertWriter::ShowFingerprint(const CX509Certificate& aCertificate) sl@0: { sl@0: iOut->writeString(_L("Fingerprint:")); sl@0: iOut->writeNewLine(); sl@0: iOut->writeOctetString(aCertificate.Fingerprint()); sl@0: iOut->writeNewLine(); sl@0: } sl@0: sl@0: EXPORT_C void CertWriter::ShowValidityPeriod(const CX509Certificate& aCertificate) sl@0: { sl@0: const CValidityPeriod& vp = aCertificate.ValidityPeriod(); sl@0: iOut->writeString(_L("Validity Period = ")); sl@0: iOut->writeNewLine(); sl@0: const TTime& start = vp.Start(); sl@0: const TTime& finish = vp.Finish(); sl@0: TBuf<30> dateString1; sl@0: start.FormatL(dateString1,(_L("%H%:1%T:%S %*E%*D %X%*N%Y %1 %2 %3"))); sl@0: sl@0: iOut->writeSpaces(4); sl@0: iOut->writeString(_L("Valid From = ")); sl@0: iOut->writeString(dateString1); sl@0: iOut->writeNewLine(); sl@0: sl@0: TBuf<30> dateString2; sl@0: finish.FormatL(dateString2,(_L("%H%:1%T:%S %*E%*D %X%*N%Y %1 %2 %3"))); sl@0: sl@0: iOut->writeSpaces(4); sl@0: iOut->writeString(_L("Valid Until = ")); sl@0: sl@0: iOut->writeString(dateString2); sl@0: iOut->writeNewLine(); sl@0: } sl@0: sl@0: //extensions sl@0: EXPORT_C void CertWriter::ShowExtensions(const CX509Certificate& aCertificate) sl@0: { sl@0: const CArrayPtrFlat& exts = aCertificate.Extensions(); sl@0: TInt count = exts.Count(); sl@0: for (TInt i = 0; i < count; i++) sl@0: { sl@0: const CX509CertExtension* ext = exts.At(i); sl@0: iOut->writeString(_L("extension")); sl@0: iOut->writeNum(i); sl@0: if (!(ext->Critical())) sl@0: { sl@0: iOut->writeString(_L(" not")); sl@0: } sl@0: iOut->writeString(_L(" critical")); sl@0: iOut->writeString(_L(" ID = ")); sl@0: TPtrC id(ext->Id()); sl@0: iOut->writeString(id); sl@0: iOut->writeNewLine(); sl@0: if (id == KBasicConstraints) sl@0: { sl@0: ShowBC(*ext); sl@0: } sl@0: if (id == KSubjectAltName) sl@0: { sl@0: iOut->writeString(_L("SubjectAltName: ")); sl@0: iOut->writeNewLine(); sl@0: ShowAltName(*ext); sl@0: } sl@0: if (id == KIssuerAltName) sl@0: { sl@0: iOut->writeString(_L("IssuerAltName: ")); sl@0: iOut->writeNewLine(); sl@0: ShowAltName(*ext); sl@0: } sl@0: if (id == KKeyUsage) sl@0: { sl@0: ShowKU(*ext); sl@0: } sl@0: if (id == KNameConstraints) sl@0: { sl@0: ShowNC(*ext); sl@0: } sl@0: if (id == KPolicyConstraints) sl@0: { sl@0: ShowPC(*ext); sl@0: } sl@0: if (id == KCertPolicies) sl@0: { sl@0: ShowCP(*ext); sl@0: } sl@0: if (id == KPolicyMapping) sl@0: { sl@0: ShowPM(*ext); sl@0: } sl@0: if (id == KAuthorityKeyId) sl@0: { sl@0: ShowAKI(aCertificate); sl@0: } sl@0: if (id == KSubjectKeyId) sl@0: { sl@0: ShowSKI(aCertificate); sl@0: } sl@0: if (id == KExtendedKeyUsage) sl@0: { sl@0: ShowEKU(*ext); sl@0: } sl@0: } sl@0: } sl@0: sl@0: EXPORT_C void CertWriter::ShowBC(const CX509CertExtension& aExt) sl@0: { sl@0: iOut->writeString(_L("Basic Constraints:")); sl@0: iOut->writeNewLine(); sl@0: CX509BasicConstraintsExt* ext = CX509BasicConstraintsExt::NewLC(aExt.Data()); sl@0: if (ext->IsCA()) sl@0: { sl@0: iOut->writeSpaces(4); sl@0: iOut->writeString(_L("CA cert")); sl@0: iOut->writeNewLine(); sl@0: if (ext->MaxChainLength() < KMaxTInt) sl@0: { sl@0: iOut->writeSpaces(4); sl@0: iOut->writeString(_L("Max Chain Length = ")); sl@0: iOut->writeNum(ext->MaxChainLength()); sl@0: iOut->writeNewLine(); sl@0: } sl@0: } sl@0: else sl@0: { sl@0: iOut->writeSpaces(4); sl@0: iOut->writeString(_L("EE cert")); sl@0: iOut->writeNewLine(); sl@0: } sl@0: CleanupStack::PopAndDestroy(); sl@0: } sl@0: sl@0: EXPORT_C void CertWriter::ShowAltName(const CX509CertExtension& aExt) sl@0: { sl@0: CX509AltNameExt* ext = CX509AltNameExt::NewLC(aExt.Data()); sl@0: const CArrayPtrFlat& names = ext->AltName(); sl@0: TInt count = names.Count(); sl@0: for (TInt i = 0; i < count; i++) sl@0: { sl@0: ShowGN(*(names.At(i))); sl@0: } sl@0: CleanupStack::PopAndDestroy(); sl@0: } sl@0: sl@0: sl@0: _LIT(KDigSig, "digital signature"); sl@0: _LIT(KNonRep, "non-repudiation"); sl@0: _LIT(KKeyEnc, "key encipherment"); sl@0: _LIT(KDataEnc, "data encipherment"); sl@0: _LIT(KKeyAgree, "key agreement"); sl@0: _LIT(KCertSign, "key cert sign"); sl@0: _LIT(KCRLSign, "crl sign"); sl@0: _LIT(KEnciph, "encipher only"); sl@0: _LIT(KDeciph, "decipher only"); sl@0: sl@0: EXPORT_C void CertWriter::ShowKU(const CX509CertExtension& aExt) sl@0: { sl@0: iOut->writeString(_L("Key Usage:")); sl@0: iOut->writeNewLine(); sl@0: CX509KeyUsageExt* ext = CX509KeyUsageExt::NewLC(aExt.Data()); sl@0: if (ext->IsSet(EX509DigitalSignature)) sl@0: { sl@0: iOut->writeSpaces(4); sl@0: iOut->writeString(KDigSig); sl@0: iOut->writeNewLine(); sl@0: } sl@0: if (ext->IsSet(EX509NonRepudiation)) sl@0: { sl@0: iOut->writeSpaces(4); sl@0: iOut->writeString(KNonRep); sl@0: iOut->writeNewLine(); sl@0: } sl@0: if (ext->IsSet(EX509KeyEncipherment)) sl@0: { sl@0: iOut->writeSpaces(4); sl@0: iOut->writeString(KKeyEnc); sl@0: iOut->writeNewLine(); sl@0: } sl@0: if (ext->IsSet(EX509DataEncipherment)) sl@0: { sl@0: iOut->writeSpaces(4); sl@0: iOut->writeString(KDataEnc); sl@0: iOut->writeNewLine(); sl@0: } sl@0: if (ext->IsSet(EX509KeyAgreement)) sl@0: { sl@0: iOut->writeSpaces(4); sl@0: iOut->writeString(KKeyAgree); sl@0: iOut->writeNewLine(); sl@0: } sl@0: if (ext->IsSet(EX509KeyCertSign)) sl@0: { sl@0: iOut->writeSpaces(4); sl@0: iOut->writeString(KCertSign); sl@0: iOut->writeNewLine(); sl@0: } sl@0: if (ext->IsSet(EX509CRLSign)) sl@0: { sl@0: iOut->writeSpaces(4); sl@0: iOut->writeString(KCRLSign); sl@0: iOut->writeNewLine(); sl@0: } sl@0: if (ext->IsSet(EX509EncipherOnly)) sl@0: { sl@0: iOut->writeSpaces(4); sl@0: iOut->writeString(KEnciph); sl@0: iOut->writeNewLine(); sl@0: } sl@0: if (ext->IsSet(EX509DecipherOnly)) sl@0: { sl@0: iOut->writeSpaces(4); sl@0: iOut->writeString(KDeciph); sl@0: iOut->writeNewLine(); sl@0: } sl@0: CleanupStack::PopAndDestroy();//ext sl@0: } sl@0: sl@0: EXPORT_C void CertWriter::ShowSubtrees(const CArrayPtrFlat& aSubtrees) sl@0: { sl@0: TInt count = aSubtrees.Count(); sl@0: for (TInt i = 0; i < count; i++) sl@0: { sl@0: const CX509GeneralSubtree* subtree = aSubtrees.At(i); sl@0: ShowGN(subtree->Name()); sl@0: ///!!!!!don't write these outFile either!! sl@0: } sl@0: } sl@0: sl@0: EXPORT_C void CertWriter::ShowNC(const CX509CertExtension& aExt) sl@0: {//!!!!don't write these outFile sl@0: sl@0: CX509NameConstraintsExt* ext = CX509NameConstraintsExt::NewLC(aExt.Data()); sl@0: ShowSubtrees(ext->ExcludedSubtrees()); sl@0: ShowSubtrees(ext->PermittedSubtrees()); sl@0: CleanupStack::PopAndDestroy(); sl@0: } sl@0: sl@0: EXPORT_C void CertWriter::ShowPC(const CX509CertExtension& /*aExt*/) sl@0: {//!!!!don't write these outFile sl@0: // CX509PolicyConstraintsExt* ext = CX509PolicyConstraintsExt::NewLC(aExt.Data()); sl@0: // TX509PolicyConstraint required = ext->ExplicitPolicyRequired(); sl@0: // TX509PolicyConstraint mapping = ext->InhibitPolicyMapping(); sl@0: // CleanupStack::PopAndDestroy(); sl@0: } sl@0: sl@0: EXPORT_C void CertWriter::ShowCP(const CX509CertExtension& aExt) sl@0: { sl@0: iOut->writeString(_L("Cert Policies = ")); sl@0: iOut->writeNewLine(); sl@0: sl@0: CX509CertPoliciesExt* ext = CX509CertPoliciesExt::NewLC(aExt.Data()); sl@0: const CArrayPtrFlat& policies = ext->Policies(); sl@0: TInt count = policies.Count(); sl@0: for (TInt i = 0; i < count; i++) sl@0: { sl@0: const CX509CertPolicyInfo* policy = policies.At(i); sl@0: sl@0: iOut->writeSpaces(4); sl@0: iOut->writeString(_L("Policy ID = ")); sl@0: iOut->writeString(policy->Id()); sl@0: iOut->writeNewLine(); sl@0: const CArrayPtrFlat& qualifiers = policy->Qualifiers(); sl@0: TInt qCount = qualifiers.Count(); sl@0: sl@0: if (qCount > 0) sl@0: { sl@0: sl@0: iOut->writeSpaces(4); sl@0: iOut->writeString(_L("Qualified by: ")); sl@0: iOut->writeNewLine(); sl@0: } sl@0: sl@0: for (TInt i = 0; i < qCount; i++) sl@0: { sl@0: iOut->writeSpaces(8); sl@0: iOut->writeString(_L("Qualifier ID = ")); sl@0: iOut->writeString(policy->Id()); sl@0: iOut->writeNewLine(); sl@0: } sl@0: } sl@0: CleanupStack::PopAndDestroy();//ext sl@0: } sl@0: sl@0: EXPORT_C void CertWriter::ShowPM(const CX509CertExtension& aExt) sl@0: { sl@0: iOut->writeString(_L("Policy Mappings = ")); sl@0: CX509PolicyMappingExt* ext = CX509PolicyMappingExt::NewLC(aExt.Data()); sl@0: const CArrayPtrFlat& mappings = ext->Mappings(); sl@0: TInt count = mappings.Count(); sl@0: for (TInt i = 0; i < count; i++) sl@0: { sl@0: const CX509PolicyMapping* mapping = mappings.At(i); sl@0: iOut->writeString(_L("Issuer Policy = ")); sl@0: iOut->writeString(mapping->IssuerPolicy()); sl@0: iOut->writeNewLine(); sl@0: iOut->writeString(_L("Subject Policy = ")); sl@0: iOut->writeString(mapping->SubjectPolicy()); sl@0: iOut->writeNewLine(); sl@0: } sl@0: iOut->writeNewLine(); sl@0: CleanupStack::PopAndDestroy(); sl@0: } sl@0: sl@0: sl@0: EXPORT_C void CertWriter::ShowEKU(const CX509CertExtension& aExt) sl@0: { sl@0: iOut->writeString(_L("Extended Key Usage = ")); sl@0: iOut->writeNewLine(); sl@0: sl@0: CX509ExtendedKeyUsageExt* ext = CX509ExtendedKeyUsageExt::NewLC(aExt.Data()); sl@0: const CArrayPtrFlat& usages = ext->KeyUsages(); sl@0: TInt count = usages.Count(); sl@0: for (TInt i = 0; i < count; i++) sl@0: { sl@0: iOut->writeSpaces(4); sl@0: iOut->writeString(usages.At(i)->Des()); sl@0: iOut->writeNewLine(); sl@0: } sl@0: CleanupStack::PopAndDestroy(); sl@0: } sl@0: sl@0: EXPORT_C void CertWriter::ShowSignature(const CX509Certificate& aCert) sl@0: { sl@0: iOut->writeString(_L("Signature:")); sl@0: iOut->writeNewLine(); sl@0: const TPtrC8 sig = aCert.Signature(); sl@0: iOut->writeOctetStringL(sig); sl@0: iOut->writeNewLine(); sl@0: } sl@0: sl@0: void CertWriter::CalculateSignature(const CX509Certificate& aCert) sl@0: { sl@0: TBool res = EFalse;; sl@0: TRAPD(err, res = aCert.VerifySignatureL(aCert.PublicKey().KeyData())); sl@0: if (err != KErrNone) sl@0: { sl@0: iOut->writeString(_L("\nsignature verification could not be performed\n")); sl@0: if (err != KErrArgument) sl@0: { sl@0: User::Leave(err); sl@0: } sl@0: } sl@0: else sl@0: { sl@0: if (res) sl@0: { sl@0: iOut->writeString(_L("\nself-signed\n")); sl@0: } sl@0: else sl@0: { sl@0: iOut->writeString(_L("\n not self-signed\n")); sl@0: } sl@0: } sl@0: } sl@0: sl@0: EXPORT_C TBool CertWriter::IsSelfSigned(const CX509Certificate& aCert) sl@0: { sl@0: TBool res = EFalse; sl@0: const CX500DistinguishedName& subject = aCert.SubjectName(); sl@0: if (subject.Count() > 0) sl@0: { sl@0: res = subject.ExactMatchL(aCert.IssuerName()); sl@0: } sl@0: else sl@0: { sl@0: const CX509CertExtension* subjectExt = aCert.Extension(KIssuerAltName); sl@0: const CX509CertExtension* issuerExt = aCert.Extension(KSubjectAltName); sl@0: if ((!subjectExt) || (!issuerExt)) sl@0: { sl@0: } sl@0: else sl@0: { sl@0: const CX509AltNameExt* issuerAltName = CX509AltNameExt::NewLC(subjectExt->Data()); sl@0: const CX509AltNameExt* subjectAltName = CX509AltNameExt::NewLC(issuerExt->Data()); sl@0: if (subjectAltName->Match(*issuerAltName)) sl@0: { sl@0: res = ETrue; sl@0: } sl@0: CleanupStack::PopAndDestroy(2);//subjectAltName, issuerAltName sl@0: } sl@0: } sl@0: return res; sl@0: } sl@0: /* EVersionNumber = 0, sl@0: ESerialNumber = 1, sl@0: EAlgorithmId = 2, sl@0: EIssuerName = 3, sl@0: EValidityPeriod = 4, sl@0: ESubjectName = 5, sl@0: ESubjectPublicKeyInfo = 6, sl@0: EIssuerUID = 7, sl@0: ESubjectUID = 8, sl@0: EExtensionList = 9 sl@0: */ sl@0: void CertWriter::WriteEncodings(const CX509Certificate& aCertificate) sl@0: { sl@0: iOut->writeString(_L("Version:")); sl@0: iOut->writeNewLine(); sl@0: WriteEncoding(aCertificate, CX509Certificate::EVersionNumber); sl@0: iOut->writeNewLine(); sl@0: sl@0: iOut->writeString(_L("Serial Number:")); sl@0: iOut->writeNewLine(); sl@0: WriteEncoding(aCertificate, CX509Certificate::ESerialNumber); sl@0: iOut->writeNewLine(); sl@0: sl@0: iOut->writeString(_L("Algorithm:")); sl@0: iOut->writeNewLine(); sl@0: WriteEncoding(aCertificate, CX509Certificate::EAlgorithmId); sl@0: iOut->writeNewLine(); sl@0: sl@0: iOut->writeString(_L("Issuer:")); sl@0: iOut->writeNewLine(); sl@0: WriteEncoding(aCertificate, CX509Certificate::EIssuerName); sl@0: iOut->writeNewLine(); sl@0: sl@0: iOut->writeString(_L("Validity:")); sl@0: iOut->writeNewLine(); sl@0: WriteEncoding(aCertificate, CX509Certificate::EValidityPeriod); sl@0: iOut->writeNewLine(); sl@0: sl@0: iOut->writeString(_L("Subject:")); sl@0: iOut->writeNewLine(); sl@0: WriteEncoding(aCertificate, CX509Certificate::ESubjectName); sl@0: iOut->writeNewLine(); sl@0: sl@0: iOut->writeString(_L("Public Key:")); sl@0: iOut->writeNewLine(); sl@0: WriteEncoding(aCertificate, CX509Certificate::ESubjectPublicKeyInfo); sl@0: iOut->writeNewLine(); sl@0: sl@0: iOut->writeString(_L("Issuer ID:")); sl@0: iOut->writeNewLine(); sl@0: WriteEncoding(aCertificate, CX509Certificate::EIssuerUID); sl@0: iOut->writeNewLine(); sl@0: sl@0: iOut->writeString(_L("Subject ID:")); sl@0: iOut->writeNewLine(); sl@0: WriteEncoding(aCertificate, CX509Certificate::ESubjectUID); sl@0: iOut->writeNewLine(); sl@0: sl@0: iOut->writeString(_L("Extensions:")); sl@0: iOut->writeNewLine(); sl@0: WriteEncoding(aCertificate, CX509Certificate::EExtensionList); sl@0: iOut->writeNewLine(); sl@0: } sl@0: sl@0: void CertWriter::WriteEncoding(const CX509Certificate& aCertificate, const TUint aIndex) sl@0: { sl@0: if (aCertificate.DataElementEncoding(aIndex)) sl@0: { sl@0: iOut->writeOctetStringL(*(aCertificate.DataElementEncoding(aIndex))); sl@0: } sl@0: }