#ifndef _H_SSCSPSESSION
#define _H_SSCSPSESSION
#include "SSCSPDLSession.h"
#include <Security/SecurityServerClient.h>
class CSPDLPlugin;
class SSFactory;
class SSDatabase;
class SSKey;
class SSCSPSession : public CSPFullPluginSession
{
public:
SSCSPDLSession &mSSCSPDLSession;
SSFactory &mSSFactory;
CssmClient::CSP &mRawCsp;
SSCSPSession(CSSM_MODULE_HANDLE handle,
CSPDLPlugin &plug,
const CSSM_VERSION &version,
uint32 subserviceId,
CSSM_SERVICE_TYPE subserviceType,
CSSM_ATTACH_FLAGS attachFlags,
const CSSM_UPCALLS &upcalls,
SSCSPDLSession &ssCSPDLSession,
CssmClient::CSP &rawCsp);
SecurityServer::ClientSession &clientSession()
{ return mClientSession; }
CSPContext *contextCreate(CSSM_CC_HANDLE handle, const Context &context);
#if 0
void contextUpdate(CSSM_CC_HANDLE handle, const Context &context,
PluginContext *ctx);
void contextDelete(CSSM_CC_HANDLE handle, const Context &context,
PluginContext *ctx);
#endif
void setupContext(CSPContext * &ctx, const Context &context,
bool encoding);
SSDatabase getDatabase(CSSM_DL_DB_HANDLE *aDLDbHandle);
SSDatabase getDatabase(const Context &context);
void makeReferenceKey(SecurityServer::KeyHandle inKeyHandle,
CssmKey &outKey, SSDatabase &inSSDatabase,
uint32 inKeyAttr, const CssmData *inKeyLabel);
SSKey &lookupKey(const CssmKey &inKey);
void WrapKey(CSSM_CC_HANDLE CCHandle,
const Context &Context,
const AccessCredentials &AccessCred,
const CssmKey &Key,
const CssmData *DescriptiveData,
CssmKey &WrappedKey,
CSSM_PRIVILEGE Privilege);
void UnwrapKey(CSSM_CC_HANDLE CCHandle,
const Context &Context,
const CssmKey *PublicKey,
const CssmKey &WrappedKey,
uint32 KeyUsage,
uint32 KeyAttr,
const CssmData *KeyLabel,
const CSSM_RESOURCE_CONTROL_CONTEXT *CredAndAclEntry,
CssmKey &UnwrappedKey,
CssmData &DescriptiveData,
CSSM_PRIVILEGE Privilege);
void DeriveKey(CSSM_CC_HANDLE CCHandle,
const Context &Context,
CssmData &Param,
uint32 KeyUsage,
uint32 KeyAttr,
const CssmData *KeyLabel,
const CSSM_RESOURCE_CONTROL_CONTEXT *CredAndAclEntry,
CssmKey &DerivedKey);
void GenerateKey(CSSM_CC_HANDLE ccHandle,
const Context &context,
uint32 keyUsage,
uint32 keyAttr,
const CssmData *keyLabel,
const CSSM_RESOURCE_CONTROL_CONTEXT *credAndAclEntry,
CssmKey &key,
CSSM_PRIVILEGE privilege);
void GenerateKeyPair(CSSM_CC_HANDLE ccHandle,
const Context &context,
uint32 publicKeyUsage,
uint32 publicKeyAttr,
const CssmData *publicKeyLabel,
CssmKey &publicKey,
uint32 privateKeyUsage,
uint32 privateKeyAttr,
const CssmData *privateKeyLabel,
const CSSM_RESOURCE_CONTROL_CONTEXT *credAndAclEntry,
CssmKey &privateKey,
CSSM_PRIVILEGE privilege);
void ObtainPrivateKeyFromPublicKey(const CssmKey &PublicKey,
CssmKey &PrivateKey);
void QueryKeySizeInBits(CSSM_CC_HANDLE CCHandle,
const Context &Context,
const CssmKey &Key,
CSSM_KEY_SIZE &KeySize);
void FreeKey(const AccessCredentials *AccessCred,
CssmKey &key, CSSM_BOOL Delete);
void GenerateRandom(CSSM_CC_HANDLE ccHandle,
const Context &context,
CssmData &randomNumber);
void Login(const AccessCredentials &AccessCred,
const CssmData *LoginName,
const void *Reserved);
void Logout();
void VerifyDevice(const CssmData &DeviceCert);
void GetOperationalStatistics(CSPOperationalStatistics &statistics);
void RetrieveCounter(CssmData &Counter);
void RetrieveUniqueId(CssmData &UniqueID);
void GetTimeValue(CSSM_ALGORITHMS TimeAlgorithm, CssmData &TimeData);
void GetKeyOwner(const CssmKey &Key,
CSSM_ACL_OWNER_PROTOTYPE &Owner);
void ChangeKeyOwner(const AccessCredentials &AccessCred,
const CssmKey &Key,
const CSSM_ACL_OWNER_PROTOTYPE &NewOwner);
void GetKeyAcl(const CssmKey &Key,
const CSSM_STRING *SelectionTag,
uint32 &NumberOfAclInfos,
CSSM_ACL_ENTRY_INFO_PTR &AclInfos);
void ChangeKeyAcl(const AccessCredentials &AccessCred,
const CSSM_ACL_EDIT &AclEdit,
const CssmKey &Key);
void GetLoginOwner(CSSM_ACL_OWNER_PROTOTYPE &Owner);
void ChangeLoginOwner(const AccessCredentials &AccessCred,
const CSSM_ACL_OWNER_PROTOTYPE &NewOwner);
void GetLoginAcl(const CSSM_STRING *SelectionTag,
uint32 &NumberOfAclInfos,
CSSM_ACL_ENTRY_INFO_PTR &AclInfos);
void ChangeLoginAcl(const AccessCredentials &AccessCred,
const CSSM_ACL_EDIT &AclEdit);
void PassThrough(CSSM_CC_HANDLE CCHandle,
const Context &Context,
uint32 PassThroughId,
const void *InData,
void **OutData);
private:
void validateKeyAttr(uint32 reqKeyAttr);
SecurityServer::ClientSession mClientSession;
};
#endif // _H_SSCSPSESSION