#include "manager.h"
#include "module.h"
#include <Security/globalizer.h>
static ModuleNexus<CssmManager> gManager;
CSSM_RETURN CSSMAPI
CSSM_Init (const CSSM_VERSION *Version,
CSSM_PRIVILEGE_SCOPE Scope,
const CSSM_GUID *CallerGuid,
CSSM_KEY_HIERARCHY KeyHierarchy,
CSSM_PVC_MODE *PvcPolicy,
const void *)
{
BEGIN_API
gManager().initialize(Required(Version),
Scope,
Guid::required(CallerGuid),
KeyHierarchy,
Required(PvcPolicy));
END_API(CSSM)
}
CSSM_RETURN CSSMAPI
CSSM_Terminate (void)
{
BEGIN_API
gManager().terminate();
END_API(CSSM)
}
CSSM_RETURN CSSMAPI
CSSM_ModuleLoad (const CSSM_GUID *ModuleGuid,
CSSM_KEY_HIERARCHY KeyHierarchy,
CSSM_API_ModuleEventHandler AppNotifyCallback,
void *AppNotifyCallbackCtx)
{
BEGIN_API
gManager().loadModule(Guid::required(ModuleGuid),
KeyHierarchy,
ModuleCallback(AppNotifyCallback, AppNotifyCallbackCtx));
END_API(CSSM)
}
CSSM_RETURN CSSMAPI
CSSM_ModuleUnload (const CSSM_GUID *ModuleGuid,
CSSM_API_ModuleEventHandler AppNotifyCallback,
void *AppNotifyCallbackCtx)
{
BEGIN_API
gManager().unloadModule(Guid::required(ModuleGuid),
ModuleCallback(AppNotifyCallback, AppNotifyCallbackCtx));
END_API(CSSM)
}
CSSM_RETURN CSSMAPI
CSSM_Introduce (const CSSM_GUID *ModuleID,
CSSM_KEY_HIERARCHY KeyHierarchy)
{
BEGIN_API
gManager().introduce(Guid::required(ModuleID), KeyHierarchy);
END_API(CSSM)
}
CSSM_RETURN CSSMAPI
CSSM_Unintroduce (const CSSM_GUID *ModuleID)
{
BEGIN_API
gManager().unIntroduce(Guid::required(ModuleID));
END_API(CSSM)
}
CSSM_RETURN CSSMAPI
CSSM_ModuleAttach (const CSSM_GUID *ModuleGuid,
const CSSM_VERSION *Version,
const CSSM_API_MEMORY_FUNCS *MemoryFuncs,
uint32 SubserviceID,
CSSM_SERVICE_TYPE SubServiceType,
CSSM_ATTACH_FLAGS AttachFlags,
CSSM_KEY_HIERARCHY KeyHierarchy,
CSSM_FUNC_NAME_ADDR *FunctionTable,
uint32 NumFunctionTable,
const void *,
CSSM_MODULE_HANDLE_PTR NewModuleHandle)
{
BEGIN_API
Required(NewModuleHandle) = gManager().getModule(Guid::required(ModuleGuid))->attach(
Required(Version),
SubserviceID, SubServiceType,
Required(MemoryFuncs),
AttachFlags,
KeyHierarchy,
FunctionTable, NumFunctionTable
);
END_API(CSSM)
}
CSSM_RETURN CSSMAPI
CSSM_ModuleDetach (CSSM_MODULE_HANDLE ModuleHandle)
{
BEGIN_API
Attachment *attachment = &killHandle<Attachment>(ModuleHandle);
attachment->detach(true); delete attachment;
END_API(CSSM)
}
CSSM_RETURN CSSMAPI
CSSM_SetPrivilege (CSSM_PRIVILEGE Privilege)
{
BEGIN_API
gManager().setPrivilege(Privilege);
END_API(CSSM)
}
CSSM_RETURN CSSMAPI
CSSM_GetPrivilege (CSSM_PRIVILEGE *Privilege)
{
BEGIN_API
Required(Privilege) = gManager().getPrivilege();
END_API(CSSM)
}
CSSM_RETURN CSSMAPI
CSSM_GetModuleGUIDFromHandle (CSSM_MODULE_HANDLE ModuleHandle,
CSSM_GUID_PTR ModuleGUID)
{
BEGIN_API
Attachment &attachment = findHandleAndLock<Attachment>(ModuleHandle);
StLock<Mutex> _(attachment, true);
Required(ModuleGUID) = attachment.module.myGuid();
END_API(CSSM)
}
CSSM_RETURN CSSMAPI
CSSM_GetSubserviceUIDFromHandle (CSSM_MODULE_HANDLE ModuleHandle,
CSSM_SUBSERVICE_UID_PTR SubserviceUID)
{
BEGIN_API
Attachment &attachment = findHandleAndLock<Attachment>(ModuleHandle);
StLock<Mutex> _(attachment, true);
CSSM_SUBSERVICE_UID &result = Required(SubserviceUID);
result.Guid = attachment.module.myGuid();
result.Version = attachment.pluginVersion();
result.SubserviceId = attachment.subserviceId();
result.SubserviceType = attachment.subserviceType();
END_API(CSSM)
}
CSSM_RETURN CSSMAPI
CSSM_ListAttachedModuleManagers (uint32 *NumberOfModuleManagers,
CSSM_GUID_PTR)
{
BEGIN_API
*NumberOfModuleManagers = 0; END_API(CSSM)
}
CSSM_RETURN CSSMAPI
CSSM_GetAPIMemoryFunctions (CSSM_MODULE_HANDLE AddInHandle,
CSSM_API_MEMORY_FUNCS_PTR AppMemoryFuncs)
{
BEGIN_API
Attachment &attachment = findHandleAndLock<Attachment>(AddInHandle);
StLock<Mutex> _(attachment, true);
Required(AppMemoryFuncs) = attachment;
END_API(CSSM)
}