TCertStatus PkiUtil::GetValidCaCertSubjectNameListL(RPKIServiceAPI& aPkiService, const CArrayFixFlat<TCertInfo*>& aIkeCAList, CDesC8ArrayFlat& aCaCertNameList) { TCertStatus status = ECertValid; RPointerArray<CX509Certificate> certificateList; TRAPD(err, certificateList = PkiUtil::GetCaCertListL(aPkiService, aIkeCAList)); switch(err) { case KErrNone: for (TInt i = 0; i < certificateList.Count(); ++i) { const CX509Certificate* cert = certificateList[i]; status = CertStatusL(*cert, -1); if (status == ECertValid) { const CX500DistinguishedName& subjectName = cert->SubjectName(); HBufC* subjectNameString = PkiUtil::CertDnL(subjectName); CleanupStack::PushL(subjectNameString); // Reserve enough space for UTF-8 TInt len = 3*( subjectNameString->Length() ); HBufC8* subjectNameString8Bit = HBufC8::NewLC(len); TPtr8 subjectNameString8BitPtr = subjectNameString8Bit->Des(); if (CnvUtfConverter::ConvertFromUnicodeToUtf8(subjectNameString8BitPtr, *subjectNameString) != 0) { User::Leave(KErrCorrupt); } TRAPD(err, aCaCertNameList.InsertIsqL(*subjectNameString8Bit)); CleanupStack::PopAndDestroy(subjectNameString8Bit); CleanupStack::PopAndDestroy(subjectNameString); err = (err == KErrAlreadyExists) ? KErrNone : err; User::LeaveIfError(err); } else { aCaCertNameList.Reset(); break; } } break; case KErrNotFound: // Flow through case KErrArgument: // CA cert is not found if policys CA DATA is invalid status = ECertNotFound; break; default: certificateList.ResetAndDestroy(); certificateList.Close(); User::Leave(err); } certificateList.ResetAndDestroy(); certificateList.Close(); return status; }