Exemple #1
0
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;
}