#ifndef _H_SSKEY_
#define _H_SSKEY_
#include <security_cdsa_plugin/CSPsession.h>
#include "SSDatabase.h"
#include <security_cdsa_client/dlclient.h>
#include <securityd_client/ssclient.h>
namespace Security
{
class CssmKey;
}
class SSCSPSession;
class SSCSPDLSession;
class SSDLSession;
class SSKey : public ReferencedKey
{
public:
SSKey(SSCSPSession &session, SecurityServer::KeyHandle keyHandle,
CssmKey &ioKey, SSDatabase &inSSDatabase, uint32 inKeyAttr,
const CssmData *inKeyLabel);
SSKey(SSDLSession &session, CssmKey &ioKey, SSDatabase &inSSDatabase,
const SSUniqueRecord &uniqueId, CSSM_DB_RECORDTYPE recordType,
CssmData &keyBlob);
virtual ~SSKey();
void free(const AccessCredentials *accessCred, CssmKey &ioKey,
CSSM_BOOL deleteKey);
SecurityServer::ClientSession &clientSession();
SecurityServer::KeyHandle optionalKeyHandle() const;
SecurityServer::KeyHandle keyHandle();
void getOwner(CSSM_ACL_OWNER_PROTOTYPE &owner, Allocator &allocator);
void changeOwner(const AccessCredentials &accessCred,
const AclOwnerPrototype &newOwner);
void getAcl(const char *selectionTag, uint32 &numberOfAclInfos,
AclEntryInfo *&aclInfos, Allocator &allocator);
void changeAcl(const AccessCredentials &accessCred,
const AclEdit &aclEdit);
void didChangeAcl();
private:
Allocator &mAllocator;
SecurityServer::KeyHandle mKeyHandle;
SSDatabase mSSDatabase;
SSUniqueRecord mUniqueId;
CSSM_DB_RECORDTYPE mRecordType;
SecurityServer::ClientSession &mClientSession;
mutable RecursiveMutex mMutex;
};
#endif // _H_SSKEY_