sl@0: /* sl@0: * Copyright (c) 2005-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: * tcertuils.cpp sl@0: * sl@0: */ sl@0: sl@0: sl@0: #include "tcertutils.h" sl@0: #include sl@0: #include sl@0: #include "t_input.h" sl@0: #include sl@0: #include sl@0: #include sl@0: sl@0: sl@0: EXPORT_C CCertUtils* CCertUtils::NewL(RFs& aFs) sl@0: { sl@0: CCertUtils* self = CCertUtils::NewLC(aFs); sl@0: CleanupStack::Pop(self); sl@0: return self; sl@0: } sl@0: sl@0: EXPORT_C CCertUtils* CCertUtils::NewLC(RFs& aFs) sl@0: { sl@0: CCertUtils* self = new(ELeave) CCertUtils(aFs); sl@0: CleanupStack::PushL(self); sl@0: self->ConstructL(); sl@0: return self; sl@0: } sl@0: sl@0: CCertUtils::CCertUtils(RFs& aFs) sl@0: : CActive(EPriorityNormal), iFs(aFs) sl@0: { sl@0: CActiveScheduler::Add(this); sl@0: } sl@0: sl@0: EXPORT_C CCertUtils::~CCertUtils() sl@0: { sl@0: Cancel(); sl@0: sl@0: delete iCertificate; sl@0: delete iCreatedUnifiedCertStore; sl@0: sl@0: delete iCertData; sl@0: delete iLabelData; sl@0: delete iSecondCertUtils; sl@0: sl@0: delete iCAFilter; sl@0: delete iUserFilter; sl@0: sl@0: iCACertStoreEntries.Close(); // The entries are owned by us sl@0: iUserCertStoreEntries.Close(); // The entries are owned by us sl@0: iTrusters.Close(); sl@0: } sl@0: sl@0: /** sl@0: This function handles all the asynchronous calls. There is at least sl@0: one state for each of the functions of CCertUtils that requires sl@0: asynchronicity. sl@0: */ sl@0: void CCertUtils::RunL() sl@0: { sl@0: if (iStatus != KErrNone) sl@0: { sl@0: User::RequestComplete(iOriginalRequestStatus, iStatus.Int()); sl@0: return; sl@0: } sl@0: sl@0: switch (iState) sl@0: { sl@0: // Used for AddCACerts sl@0: case EAddCACerts: sl@0: HandleEAddCACertsL(); sl@0: break; sl@0: sl@0: // Used for AddCert sl@0: case EAddCert: sl@0: TRAPD(err, HandleEAddCACertL()); sl@0: if (err != KErrNone) sl@0: { sl@0: iDiagnosticState = EAddCert; sl@0: User::RequestComplete(iOriginalRequestStatus, err); sl@0: } sl@0: break; sl@0: case EAddCACertGetCAEntry: sl@0: HandleEAddCACertGetCAEntry(); sl@0: break; sl@0: case EAddCACertSetApplications: sl@0: HandleEAddCACertSetApplicationsL(); sl@0: break; sl@0: case EAddCACertSetTrust: sl@0: HandleEAddCACertSetTrust(); sl@0: break; sl@0: case EAddCACertFinished: sl@0: HandleEAddCACertFinishedL(); sl@0: delete iCreatedUnifiedCertStore; sl@0: iCreatedUnifiedCertStore = 0; sl@0: break; sl@0: sl@0: // Used for RemoveCerts sl@0: case ERemoveCertsGetCACerts: sl@0: HandleERemoveCertsGetCACerts(); sl@0: break; sl@0: case ERemoveCertsCACertsRetrieved: sl@0: HandleERemoveCertsCACertsRetrieved(); sl@0: break; sl@0: case ERemoveCertsRemoveCACerts: sl@0: HandleERemoveCertsRemoveCACerts(); sl@0: break; sl@0: case ERemoveCertsGetUserCerts: sl@0: HandleERemoveCertsGetUserCerts(); sl@0: break; sl@0: case ERemoveCertsUserCertsRetrieved: sl@0: HandleERemoveCertsUserCertsRetrieved(); sl@0: break; sl@0: case ERemoveCertsRemoveUserCerts: sl@0: HandleERemoveCertsRemoveUserCerts(); sl@0: break; sl@0: case ERemoveCertsFinished: sl@0: HandleERemoveCertsFinished(); sl@0: delete iCreatedUnifiedCertStore; sl@0: iCreatedUnifiedCertStore = 0; sl@0: break; sl@0: sl@0: default: sl@0: break; sl@0: } sl@0: } sl@0: sl@0: TInt CCertUtils::RunError(TInt aError) sl@0: { sl@0: User::RequestComplete(iOriginalRequestStatus, aError); sl@0: return KErrNone; sl@0: } sl@0: sl@0: void CCertUtils::DoCancel() sl@0: { sl@0: if (iSecondCertUtils) sl@0: iSecondCertUtils->Cancel(); sl@0: sl@0: if (iUnifiedCertStore) sl@0: { sl@0: iUnifiedCertStore->Cancel(); sl@0: if (iUnifiedCertStore->WritableCertStoreCount() != 0) sl@0: { sl@0: MCTWritableCertStore *store; sl@0: store = &iUnifiedCertStore->WritableCertStore(0); sl@0: store->CancelRemove(); sl@0: store->CancelSetApplicability(); sl@0: } sl@0: } sl@0: sl@0: if (iStore) sl@0: iStore->CancelAdd(); sl@0: } sl@0: sl@0: EXPORT_C CCertificate* CCertUtils::CertFromFileLC(const TDesC& aFilename, sl@0: const TDesC& aPathname, sl@0: RFs& aFs, sl@0: TCertificateFormat aFormat) sl@0: { sl@0: TFileName fullname; sl@0: fullname.Append(aPathname); sl@0: fullname.Append(aFilename); sl@0: HBufC8* certBuf = Input::ReadFileLC(fullname, aFs); sl@0: CCertificate* cert = 0; sl@0: if (aFormat == EX509Certificate) sl@0: { sl@0: cert = CX509Certificate::NewLC(*certBuf); sl@0: } sl@0: else if (aFormat == EWTLSCertificate) sl@0: { sl@0: cert = CWTLSCertificate::NewLC(*certBuf); sl@0: } sl@0: CleanupStack::Pop();//cert sl@0: CleanupStack::PopAndDestroy();//buf sl@0: CleanupStack::PushL(cert); sl@0: return cert; sl@0: } sl@0: sl@0: EXPORT_C CCertificate* CCertUtils::CertFromFileL(const TDesC& aFilename, sl@0: const TDesC& aPathname, sl@0: RFs& aFs, sl@0: TCertificateFormat aFormat) sl@0: { sl@0: CCertificate* cert = CertFromFileLC(aFilename, aPathname, aFs, aFormat); sl@0: CleanupStack::Pop(); sl@0: return cert; sl@0: } sl@0: sl@0: EXPORT_C void CCertUtils::AddCertL(const TDesC& aLabel, sl@0: TCertificateFormat aFormat, sl@0: TCertificateOwnerType aCertificateOwnerType, sl@0: TInt aTrustedUsage, sl@0: const TDesC& aCertificatePath, sl@0: const TDesC& aCertificateFileName, sl@0: TRequestStatus& aStatus) sl@0: { sl@0: iOriginalRequestStatus = &aStatus; sl@0: aStatus = KRequestPending; sl@0: sl@0: // We set up the member variable as required for this function sl@0: iCertificateFileName = &aCertificateFileName; sl@0: iLabel = &aLabel; sl@0: iFormat = aFormat; sl@0: iTrustedUsage = aTrustedUsage; sl@0: iPath = &aCertificatePath; sl@0: iCertificateOwnerType = aCertificateOwnerType; sl@0: sl@0: if (iCreatedUnifiedCertStore) sl@0: { sl@0: delete iCreatedUnifiedCertStore; sl@0: } sl@0: sl@0: iCreatedUnifiedCertStore = CUnifiedCertStore::NewL(iFs, ETrue); // We want to open it for sl@0: // writing sl@0: iUnifiedCertStore = iCreatedUnifiedCertStore; sl@0: iCreatedUnifiedCertStore->Initialize(iStatus); sl@0: iState = EAddCert; sl@0: SetActive(); sl@0: } sl@0: sl@0: EXPORT_C void CCertUtils::AddCert(const TDesC& aLabel, sl@0: TCertificateFormat aFormat, sl@0: TCertificateOwnerType aCertificateOwnerType, sl@0: TInt aTrustedUsage, sl@0: const TDesC& aCertificatePath, sl@0: const TDesC& aCertificateFileName, sl@0: CUnifiedCertStore& aUnifiedCertStore, sl@0: TRequestStatus& aStatus) sl@0: { sl@0: iOriginalRequestStatus = &aStatus; sl@0: aStatus = KRequestPending; sl@0: sl@0: // We set up the member variable as required for this function sl@0: iCertificateFileName = &aCertificateFileName; sl@0: iLabel = &aLabel; sl@0: iFormat = aFormat; sl@0: iTrustedUsage = aTrustedUsage; sl@0: iPath = &aCertificatePath; sl@0: iCertificateOwnerType = aCertificateOwnerType; sl@0: iUnifiedCertStore = &aUnifiedCertStore; sl@0: sl@0: iState = EAddCert; sl@0: SetActive(); sl@0: TRequestStatus* status = &iStatus; sl@0: User::RequestComplete(status, KErrNone); sl@0: } sl@0: sl@0: EXPORT_C void CCertUtils::AddCACertsL(const CDesCArray& aRoots, sl@0: const CDesCArray& aLabels, sl@0: TCertificateFormat aFormat, sl@0: TInt aTrustedUsage, sl@0: const TDesC& aPath, sl@0: TRequestStatus& aStatus) sl@0: { sl@0: iOriginalRequestStatus = &aStatus; sl@0: aStatus = KRequestPending; sl@0: sl@0: // We set up the member variable as required for this function sl@0: iRoots = &aRoots; sl@0: iFormat = aFormat; sl@0: iLabels = &aLabels; sl@0: iTrustedUsage = aTrustedUsage; sl@0: iPath = &aPath; sl@0: sl@0: iIndex = -1; // -1 because it will be incremented before its first use sl@0: if (!iSecondCertUtils) sl@0: { sl@0: iSecondCertUtils = CCertUtils::NewL(iFs); sl@0: } sl@0: sl@0: if (iCreatedUnifiedCertStore) sl@0: { sl@0: delete iCreatedUnifiedCertStore; sl@0: } sl@0: sl@0: iCreatedUnifiedCertStore = CUnifiedCertStore::NewL(iFs, ETrue); // We want to open it for sl@0: // writing sl@0: iUnifiedCertStore = iCreatedUnifiedCertStore; sl@0: iCreatedUnifiedCertStore->Initialize(iStatus); sl@0: sl@0: iState = EAddCACerts; sl@0: SetActive(); sl@0: } sl@0: sl@0: EXPORT_C void CCertUtils::AddCACertsL(const CDesCArray& aRoots, sl@0: const CDesCArray& aLabels, sl@0: TCertificateFormat aFormat, sl@0: TInt aTrustedUsage, sl@0: const TDesC& aPath, sl@0: CUnifiedCertStore& aUnifiedCertStore, sl@0: TRequestStatus& aStatus) sl@0: { sl@0: iOriginalRequestStatus = &aStatus; sl@0: aStatus = KRequestPending; sl@0: sl@0: // We set up the member variable as required for this function sl@0: iRoots = &aRoots; sl@0: iFormat = aFormat; sl@0: iLabels = &aLabels; sl@0: iTrustedUsage = aTrustedUsage; sl@0: iPath = &aPath; sl@0: iUnifiedCertStore = &aUnifiedCertStore; sl@0: sl@0: iIndex = -1; // -1 because it will be incremented before its first use sl@0: if (!iSecondCertUtils) sl@0: { sl@0: iSecondCertUtils = CCertUtils::NewL(iFs); sl@0: } sl@0: sl@0: iState = EAddCACerts; sl@0: SetActive(); sl@0: TRequestStatus* status = &iStatus; sl@0: User::RequestComplete(status, KErrNone); sl@0: } sl@0: sl@0: EXPORT_C void CCertUtils::RemoveCertsL(CUnifiedCertStore& aUnifiedCertStore, sl@0: TRequestStatus& aStatus) sl@0: { sl@0: iOriginalRequestStatus = &aStatus; sl@0: aStatus = KRequestPending; sl@0: iUnifiedCertStore = &aUnifiedCertStore; sl@0: sl@0: iState = ERemoveCertsGetCACerts; sl@0: TRequestStatus* status = &iStatus; sl@0: User::RequestComplete(status, KErrNone); sl@0: SetActive(); sl@0: } sl@0: sl@0: EXPORT_C void CCertUtils::RemoveCertsL(TRequestStatus& aStatus) sl@0: { sl@0: iOriginalRequestStatus = &aStatus; sl@0: aStatus = KRequestPending; sl@0: iState = ERemoveCertsGetCACerts; sl@0: sl@0: if (iCreatedUnifiedCertStore) sl@0: { sl@0: delete iCreatedUnifiedCertStore; sl@0: } sl@0: sl@0: iCreatedUnifiedCertStore = CUnifiedCertStore::NewL(iFs, ETrue); // We want to open it for sl@0: // writing sl@0: iUnifiedCertStore = iCreatedUnifiedCertStore; sl@0: iCreatedUnifiedCertStore->Initialize(iStatus); sl@0: SetActive(); sl@0: } sl@0: sl@0: EXPORT_C void CCertUtils::WriteError(TValidationError aError, Output& aOut) sl@0: { sl@0: aOut.writeString(CCertUtils::MapError(aError)); sl@0: } sl@0: sl@0: EXPORT_C TPtrC CCertUtils::MapError(TValidationError aError) sl@0: { sl@0: sl@0: switch(aError) sl@0: { sl@0: //errors sl@0: case EValidatedOK: sl@0: { sl@0: return (_L("Validated OK")); sl@0: } sl@0: case EChainHasNoRoot: sl@0: { sl@0: return(_L("Chain has no root")); sl@0: } sl@0: case ESignatureInvalid: sl@0: { sl@0: return(_L("Signature invalid")); sl@0: } sl@0: case EDateOutOfRange: sl@0: { sl@0: return(_L("Date out of range")); sl@0: } sl@0: case ENameIsExcluded: sl@0: { sl@0: return(_L("Name is excluded")); sl@0: } sl@0: case ENameNotPermitted: sl@0: { sl@0: return(_L("Name is not permitted")); sl@0: } sl@0: case ECertificateRevoked: sl@0: { sl@0: return(_L("Certificate revoked")); sl@0: } sl@0: case EUnrecognizedCriticalExtension: sl@0: { sl@0: return(_L("Unrecognized Critical Extension")); sl@0: } sl@0: case ENoBasicConstraintInCACert: sl@0: { sl@0: return(_L("CA cert with no Basic Constraint")); sl@0: } sl@0: case ENoAcceptablePolicy: sl@0: { sl@0: return(_L("No acceptable policy")); sl@0: } sl@0: case EPathTooLong: sl@0: { sl@0: return(_L("Path too long")); sl@0: } sl@0: case ENegativePathLengthSpecified: sl@0: { sl@0: return(_L("Negative path length specified")); sl@0: } sl@0: case ENamesDontChain: sl@0: { sl@0: return(_L("Names don't chain")); sl@0: } sl@0: case ERequiredPolicyNotFound: sl@0: { sl@0: return(_L("Required policy not found")); sl@0: } sl@0: case EBadKeyUsage: sl@0: { sl@0: return(_L("Bad key usage")); sl@0: } sl@0: case ENotCACert: sl@0: { sl@0: return(_L("Non-CA cert used as CA cert")); sl@0: } sl@0: //warnings sl@0: case ERootCertNotSelfSigned: sl@0: { sl@0: return(_L("Root cert not self-signed")); sl@0: } sl@0: case ECriticalExtendedKeyUsage: sl@0: { sl@0: return(_L("Critical extended key usage")); sl@0: } sl@0: case ECriticalCertPoliciesWithQualifiers: sl@0: { sl@0: return(_L("Critical cert policies with qualifiers")); sl@0: } sl@0: case ECriticalPolicyMapping: sl@0: { sl@0: return(_L("Critical policy mapping")); sl@0: } sl@0: case ECriticalDeviceId: sl@0: { sl@0: return(_L("Critical Device Id")); sl@0: } sl@0: case ECriticalSid: sl@0: { sl@0: return(_L("Critical Sid")); sl@0: } sl@0: case ECriticalVid: sl@0: { sl@0: return(_L("Critical Vid")); sl@0: } sl@0: case ECriticalCapabilities: sl@0: { sl@0: return(_L("Critical Capabilities")); sl@0: } sl@0: } sl@0: return (_L("Unknown Error")); sl@0: } sl@0: sl@0: sl@0: EXPORT_C HBufC* CCertUtils::DiagnosticLC() const sl@0: { sl@0: HBufC* result = HBufC::NewLC(600); sl@0: switch (iDiagnosticState) sl@0: { sl@0: case EAddCert: sl@0: result->Des().Append(_L("EAddCACert")); sl@0: result->Des().Append(_L(" : ")); sl@0: result->Des().Append(iDiagnosticMessage); sl@0: break; sl@0: sl@0: default: sl@0: break; sl@0: } sl@0: sl@0: return result; sl@0: } sl@0: sl@0: EXPORT_C void CCertUtils::AddApplicationL(const TDesC& aName, TUid aUid) const sl@0: { sl@0: CCertificateAppInfoManager* appManager = CCertificateAppInfoManager::NewL(iFs, ETrue); sl@0: CleanupStack::PushL(appManager); sl@0: sl@0: // Only add the application if it doesn't exist already sl@0: const RArray& apps = appManager->Applications(); sl@0: TInt i; sl@0: for (i = 0 ; i < apps.Count() ; ++i) sl@0: { sl@0: if (apps[i].Id() == aUid && apps[i].Name() == aName) sl@0: break; sl@0: } sl@0: sl@0: if (i == apps.Count()) sl@0: { sl@0: appManager->AddL(TCertificateAppInfo(aUid, aName)); sl@0: } sl@0: sl@0: CleanupStack::PopAndDestroy(appManager); sl@0: } sl@0: sl@0: EXPORT_C void CCertUtils::RemoveApplicationL(TUid aUid) const sl@0: { sl@0: CCertificateAppInfoManager* appManager = CCertificateAppInfoManager::NewL(iFs, ETrue); sl@0: CleanupStack::PushL(appManager); sl@0: appManager->RemoveL(aUid); sl@0: CleanupStack::PopAndDestroy(appManager); sl@0: } sl@0: sl@0: sl@0: void CCertUtils::ConstructL() sl@0: { sl@0: iCAFilter = CCertAttributeFilter::NewL(); sl@0: iCAFilter->SetOwnerType(ECACertificate); sl@0: iUserFilter = CCertAttributeFilter::NewL(); sl@0: iUserFilter->SetOwnerType(EUserCertificate); sl@0: } sl@0: sl@0: void CCertUtils::HandleEAddCACertsL() sl@0: { sl@0: iIndex++; sl@0: if (iIndex < iRoots->Count()) sl@0: { sl@0: // We still have some certificates to add sl@0: if (iCertData) sl@0: { sl@0: delete iCertData; sl@0: iCertData = 0; sl@0: } sl@0: iCertData = iRoots->MdcaPoint(iIndex).AllocL(); sl@0: if (iLabelData) sl@0: { sl@0: delete iLabelData; sl@0: iLabelData = 0; sl@0: } sl@0: iLabelData = iLabels->MdcaPoint(iIndex).AllocL(); sl@0: iSecondCertUtils->AddCert(*iLabelData, iFormat, ECACertificate, sl@0: iTrustedUsage, *iPath, *iCertData, *iUnifiedCertStore, iStatus); sl@0: SetActive(); sl@0: } sl@0: else sl@0: { sl@0: // We have finished adding all the certificates sl@0: delete iSecondCertUtils; sl@0: iSecondCertUtils = 0; sl@0: delete iCreatedUnifiedCertStore; sl@0: iCreatedUnifiedCertStore = 0; sl@0: User::RequestComplete(iOriginalRequestStatus, KErrNone); sl@0: } sl@0: } sl@0: sl@0: void CCertUtils::HandleEAddCACertL() sl@0: { sl@0: // At this stage we should always have an initialized iStoreManager sl@0: __ASSERT_DEBUG(iUnifiedCertStore, User::Panic(_L("TCertUtils"), 1)); sl@0: sl@0: // We use the first writable certstore sl@0: iStore = &iUnifiedCertStore->WritableCertStore(0); sl@0: sl@0: __ASSERT_DEBUG(!iCertificate, User::Panic(_L("TCertUtils"), 1)); sl@0: iCertificate = 0; sl@0: TRAPD(err, iCertificate = sl@0: CCertUtils::CertFromFileL(*iCertificateFileName, *iPath, iFs, iFormat)); sl@0: if (err != KErrNone) sl@0: { sl@0: if (err != KErrNoMemory) sl@0: { sl@0: iDiagnosticMessage.Zero(); sl@0: iDiagnosticMessage.Append(_L("CertFromFileL failed (")); sl@0: iDiagnosticMessage.Append(*iCertificateFileName); sl@0: iDiagnosticMessage.Append(_L(")")); sl@0: } sl@0: User::Leave(err); sl@0: } sl@0: iEncoding.Set(iCertificate->Encoding()); sl@0: iStore->Add(*iLabel, iFormat, iCertificateOwnerType, 0, 0, iEncoding, iStatus); sl@0: iState = EAddCACertGetCAEntry; sl@0: SetActive(); sl@0: } sl@0: sl@0: void CCertUtils::HandleEAddCACertGetCAEntry() sl@0: { sl@0: delete iCertificate; sl@0: iCertificate = 0; sl@0: iCACertStoreEntries.Close(); sl@0: iUnifiedCertStore->List(iCACertStoreEntries, *iCAFilter, iStatus); sl@0: iState = EAddCACertSetApplications; sl@0: SetActive(); sl@0: } sl@0: sl@0: void CCertUtils::HandleEAddCACertSetApplicationsL() sl@0: { sl@0: CCTCertInfo* entry = 0; sl@0: TInt iEnd = iCACertStoreEntries.Count(); sl@0: for (TInt i = 0; i < iEnd; i++) sl@0: { sl@0: if (iCACertStoreEntries[i]->Label() == *iLabel) sl@0: { sl@0: entry = iCACertStoreEntries[i]; sl@0: } sl@0: } sl@0: sl@0: __ASSERT_ALWAYS(entry, User::Panic(_L("TCertUtils"), 1)); sl@0: sl@0: iTrusters.Reset(); sl@0: TUid truster = { iTrustedUsage }; sl@0: User::LeaveIfError(iTrusters.Append(truster)); sl@0: sl@0: iUnifiedCertStore->SetApplicability(*entry, iTrusters, iStatus); sl@0: iState = EAddCACertSetTrust; sl@0: SetActive(); sl@0: } sl@0: sl@0: void CCertUtils::HandleEAddCACertSetTrust() sl@0: { sl@0: CCTCertInfo* entry = 0; sl@0: TInt iEnd = iCACertStoreEntries.Count(); sl@0: for (TInt i = 0; i < iEnd; i++) sl@0: { sl@0: if (iCACertStoreEntries[i]->Label() == *iLabel) sl@0: { sl@0: entry = iCACertStoreEntries[i]; sl@0: } sl@0: } sl@0: sl@0: __ASSERT_ALWAYS(entry, User::Panic(_L("TCertUtils"), 1)); sl@0: sl@0: iUnifiedCertStore->SetTrust(*entry, ETrue, iStatus); sl@0: iState = EAddCACertFinished; sl@0: SetActive(); sl@0: } sl@0: sl@0: void CCertUtils::HandleEAddCACertFinishedL() sl@0: { sl@0: User::RequestComplete(iOriginalRequestStatus, iStatus.Int()); sl@0: } sl@0: sl@0: void CCertUtils::HandleERemoveCertsGetCACerts() sl@0: { sl@0: // At this stage we should always have an initialized iStoreManager sl@0: __ASSERT_DEBUG(iUnifiedCertStore, User::Panic(_L("TCertUtils"), 1)); sl@0: sl@0: iCACertStoreEntries.Close(); sl@0: iUnifiedCertStore->List(iCACertStoreEntries, *iCAFilter, iStatus); sl@0: sl@0: iState = ERemoveCertsCACertsRetrieved; sl@0: SetActive(); sl@0: } sl@0: sl@0: void CCertUtils::HandleERemoveCertsCACertsRetrieved() sl@0: { sl@0: // This index will be used to keep track of the current entry sl@0: iIndex = -1; sl@0: sl@0: iState = ERemoveCertsRemoveCACerts; sl@0: TRequestStatus* status = &iStatus; sl@0: SetActive(); sl@0: User::RequestComplete(status, KErrNone); sl@0: } sl@0: sl@0: void CCertUtils::HandleERemoveCertsRemoveCACerts() sl@0: { sl@0: iIndex++; sl@0: if (iIndex < iCACertStoreEntries.Count()) sl@0: { sl@0: // Remove this certificate if it can be deleted. sl@0: sl@0: CCTCertInfo& cert = *iCACertStoreEntries[iIndex]; sl@0: sl@0: // Unfortunately, certs in non-writable stores can still be sl@0: // marked as deletable, so need to check if cert is also in a sl@0: // writable store. sl@0: sl@0: TBool isDeletable = cert.IsDeletable(); sl@0: sl@0: TBool inWritableStore = EFalse; sl@0: sl@0: TCTTokenObjectHandle certHandle(cert.Handle()); sl@0: TInt writeStoreCount = iUnifiedCertStore->WritableCertStoreCount(); sl@0: for (TInt i = 0; i < writeStoreCount; ++i) sl@0: { sl@0: MCTWritableCertStore& wcs = iUnifiedCertStore->WritableCertStore(i); sl@0: if (wcs.Token().Handle() == certHandle.iTokenHandle) sl@0: { sl@0: inWritableStore = ETrue; sl@0: break; sl@0: } sl@0: } sl@0: sl@0: if (isDeletable && inWritableStore) sl@0: { sl@0: iUnifiedCertStore->Remove(cert, iStatus); sl@0: SetActive(); sl@0: } sl@0: else sl@0: { sl@0: TRequestStatus* status = &iStatus; sl@0: SetActive(); sl@0: User::RequestComplete(status, KErrNone); sl@0: } sl@0: } sl@0: else sl@0: { sl@0: iState = ERemoveCertsGetUserCerts; sl@0: TRequestStatus* status = &iStatus; sl@0: SetActive(); sl@0: User::RequestComplete(status, KErrNone); sl@0: } sl@0: } sl@0: sl@0: void CCertUtils::HandleERemoveCertsGetUserCerts() sl@0: { sl@0: // At this stage we should always have an initialized iStoreManager sl@0: __ASSERT_DEBUG(iUnifiedCertStore, User::Panic(_L("TCertUtils"), 1)); sl@0: sl@0: iUserCertStoreEntries.Close(); sl@0: iUnifiedCertStore->List(iUserCertStoreEntries, *iUserFilter, iStatus); sl@0: sl@0: iState = ERemoveCertsUserCertsRetrieved; sl@0: SetActive(); sl@0: } sl@0: sl@0: void CCertUtils::HandleERemoveCertsUserCertsRetrieved() sl@0: { sl@0: iIndex = -1; sl@0: sl@0: iState = ERemoveCertsRemoveUserCerts; sl@0: TRequestStatus* status = &iStatus; sl@0: SetActive(); sl@0: User::RequestComplete(status, KErrNone); sl@0: } sl@0: sl@0: void CCertUtils::HandleERemoveCertsRemoveUserCerts() sl@0: { sl@0: // At this stage we should always have an initialized iStoreManager sl@0: __ASSERT_DEBUG(iUnifiedCertStore, User::Panic(_L("TCertUtils"), 1)); sl@0: sl@0: iIndex++; sl@0: if (iIndex < iUserCertStoreEntries.Count()) sl@0: { sl@0: iUnifiedCertStore->Remove(*iUserCertStoreEntries[iIndex], iStatus); sl@0: SetActive(); sl@0: } sl@0: else sl@0: { sl@0: iState = ERemoveCertsFinished; sl@0: TRequestStatus* status = &iStatus; sl@0: SetActive(); sl@0: User::RequestComplete(status, KErrNone); sl@0: } sl@0: } sl@0: sl@0: void CCertUtils::HandleERemoveCertsFinished() sl@0: { sl@0: User::RequestComplete(iOriginalRequestStatus, KErrNone); sl@0: } sl@0: