#ifndef _SECURITY_IDENTITYCURSOR_H_
#define _SECURITY_IDENTITYCURSOR_H_
#include <Security/SecCertificate.h>
#include <Security/SecIdentity.h>
#include <Security/SecIdentitySearch.h>
#include <security_cdsa_client/securestorage.h>
#include <security_keychain/KCCursor.h>
#include <CoreFoundation/CFArray.h>
namespace Security
{
namespace KeychainCore
{
class Identity;
class KeyItem;
class IdentityCursor : public SecCFObject
{
NOCOPY(IdentityCursor)
public:
SECCFFUNCTIONS(IdentityCursor, SecIdentitySearchRef, errSecInvalidSearchRef, gTypes().IdentityCursor)
IdentityCursor(const StorageManager::KeychainList &searchList, CSSM_KEYUSE keyUsage);
virtual ~IdentityCursor() throw();
virtual bool next(SecPointer<Identity> &identity);
CFDataRef pubKeyHashForSystemIdentity(CFStringRef domain);
protected:
StorageManager::KeychainList mSearchList;
private:
KCCursor mKeyCursor;
KCCursor mCertificateCursor;
SecPointer<KeyItem> mCurrentKey;
Mutex mMutex;
};
class IdentityCursorPolicyAndID : public IdentityCursor
{
public:
IdentityCursorPolicyAndID(const StorageManager::KeychainList &searchList, CSSM_KEYUSE keyUsage, CFStringRef idString, SecPolicyRef policy, bool returnOnlyValidIdentities);
virtual ~IdentityCursorPolicyAndID() throw();
virtual bool next(SecPointer<Identity> &identity);
virtual void findPreferredIdentity();
private:
SecPolicyRef mPolicy;
CFStringRef mIDString;
bool mReturnOnlyValidIdentities;
bool mPreferredIdentityChecked;
SecPointer<Identity> mPreferredIdentity;
};
}
}
#endif // !_SECURITY_IDENTITYCURSOR_H_