#include "ssl.h"
#if USE_CDSA_CRYPTO
#include "ModuleAttacher.h"
#include "sslDebug.h"
#include "appleCdsa.h"
#include <Security/cssmapple.h>
#include <Security/cssmtype.h>
#include <Security/cssmapi.h>
#include <pthread.h>
static pthread_mutex_t gAttachLock = PTHREAD_MUTEX_INITIALIZER;
static CSSM_CSP_HANDLE gCSPHandle = CSSM_INVALID_HANDLE;
static CSSM_CL_HANDLE gCLHandle = CSSM_INVALID_HANDLE;
static CSSM_TP_HANDLE gTPHandle = CSSM_INVALID_HANDLE;
static const CSSM_API_MEMORY_FUNCS CA_memFuncs = {
stAppMalloc,
stAppFree,
stAppRealloc,
stAppCalloc,
NULL
};
static const CSSM_VERSION cssmVers = {2, 0};
static const CSSM_GUID testGuid = { 0xFADE, 0, 0, { 1,2,3,4,5,6,7,0 }};
static CSSM_HANDLE loadModule(
CSSM_SERVICE_TYPE svcType, const CSSM_GUID *guid,
const char *modName)
{
CSSM_RETURN crtn;
CSSM_HANDLE hand;
crtn = CSSM_ModuleLoad(guid,
CSSM_KEY_HIERARCHY_NONE,
NULL, NULL); if(crtn) {
#ifndef NDEBUG
sslErrorLog("loadModule: error (%lu) loading %s\n",
(unsigned long)crtn, modName);
#endif
return CSSM_INVALID_HANDLE;
}
crtn = CSSM_ModuleAttach (guid,
&cssmVers,
&CA_memFuncs, 0, svcType, 0, CSSM_KEY_HIERARCHY_NONE,
NULL, 0, NULL, &hand);
if(crtn) {
#ifndef NDEBUG
sslErrorLog("loadModule: error (%lu) attaching to %s\n",
(unsigned long)crtn, modName);
#endif
return CSSM_INVALID_HANDLE;
}
return hand;
}
static CSSM_RETURN doAttachToModules(void)
{
CSSM_RETURN crtn;
CSSM_PVC_MODE pvcPolicy = CSSM_PVC_NONE;
CSSM_HANDLE cspHandle, clHandle, tpHandle;
if (gCSPHandle)
return CSSM_OK;
crtn = CSSM_Init (&cssmVers,
CSSM_PRIVILEGE_SCOPE_NONE,
&testGuid,
CSSM_KEY_HIERARCHY_NONE,
&pvcPolicy,
NULL );
if(crtn != CSSM_OK) {
#ifndef NDEBUG
sslErrorLog("CSSM_Init returned %lu", (unsigned long)crtn);
#endif
return crtn;
}
cspHandle = loadModule(CSSM_SERVICE_CSP, &gGuidAppleCSP, "AppleCSP");
if (cspHandle == CSSM_INVALID_HANDLE)
return CSSMERR_CSSM_ADDIN_LOAD_FAILED;
clHandle = loadModule(CSSM_SERVICE_CL, &gGuidAppleX509CL, "AppleCL");
if (clHandle == CSSM_INVALID_HANDLE)
return CSSMERR_CSSM_ADDIN_LOAD_FAILED;
tpHandle = loadModule(CSSM_SERVICE_TP, &gGuidAppleX509TP, "AppleTP");
if (tpHandle == CSSM_INVALID_HANDLE)
return CSSMERR_CSSM_ADDIN_LOAD_FAILED;
gCSPHandle = cspHandle;
gCLHandle = clHandle;
gTPHandle = tpHandle;
return CSSM_OK;
}
CSSM_RETURN attachToModules(
CSSM_CSP_HANDLE *cspHand,
CSSM_CL_HANDLE *clHand,
CSSM_TP_HANDLE *tpHand)
{
CSSM_RETURN result;
if (gCSPHandle && gCLHandle && gTPHandle)
result = CSSM_OK;
else
{
pthread_mutex_lock(&gAttachLock);
result = doAttachToModules();
pthread_mutex_unlock(&gAttachLock);
}
*cspHand = gCSPHandle;
*clHand = gCLHandle;
*tpHand = gTPHandle;
return result;
}
#endif