#include "CSPAttacher.h"
#include "cldebugging.h"
#include <security_utilities/globalizer.h>
#include <security_utilities/threading.h>
#include <security_utilities/alloc.h>
#include <security_cdsa_utilities/cssmerrors.h>
#include <Security/cssmapple.h>
#include <Security/cssmtype.h>
#include <Security/cssmapi.h>
class CSPAttacher
{
public:
CSPAttacher() :
mCspHand(CSSM_INVALID_HANDLE),
mCspDlHand(CSSM_INVALID_HANDLE)
{ }
~CSPAttacher();
CSSM_CSP_HANDLE getCspHand(bool bareCsp);
private:
CSSM_HANDLE mCspHand;
CSSM_HANDLE mCspDlHand;
Mutex mLock;
};
static ModuleNexus<CSPAttacher> cspAttacher;
static void *CL_malloc(
CSSM_SIZE size,
void *allocref)
{
return Allocator::standard().malloc(size);
}
static void CL_free(
void *memblock,
void *allocref)
{
Allocator::standard().free(memblock);
}
static void *CL_realloc(
void *memblock,
CSSM_SIZE size,
void *allocref)
{
return Allocator::standard().realloc(memblock, size);
}
static void *CL_calloc(
uint32 num,
CSSM_SIZE size,
void *allocref)
{
return Allocator::standard().calloc(num, size);
}
static const CSSM_API_MEMORY_FUNCS CL_memFuncs = {
CL_malloc,
CL_free,
CL_realloc,
CL_calloc,
NULL
};
CSPAttacher::~CSPAttacher()
{
StLock<Mutex> _(mLock);
if(mCspHand != CSSM_INVALID_HANDLE) {
CSSM_ModuleDetach(mCspHand);
CSSM_ModuleUnload(&gGuidAppleCSP, NULL, NULL);
}
if(mCspDlHand != CSSM_INVALID_HANDLE) {
CSSM_ModuleDetach(mCspDlHand);
CSSM_ModuleUnload(&gGuidAppleCSPDL, NULL, NULL);
}
}
CSSM_CSP_HANDLE CSPAttacher::getCspHand(bool bareCsp)
{
const char *modName;
CSSM_RETURN crtn;
const CSSM_GUID *guid;
CSSM_VERSION vers = {2, 0};
StLock<Mutex> _(mLock);
CSSM_CSP_HANDLE cspHand;
if(bareCsp) {
if(mCspHand != CSSM_INVALID_HANDLE) {
return mCspHand;
}
guid = &gGuidAppleCSP;
modName = "AppleCSP";
}
else {
if(mCspDlHand != CSSM_INVALID_HANDLE) {
return mCspDlHand;
}
guid = &gGuidAppleCSPDL;
modName = "AppleCSPDL";
}
crtn = CSSM_ModuleLoad(guid,
CSSM_KEY_HIERARCHY_NONE,
NULL, NULL); if(crtn) {
clErrorLog("AppleX509CLSession::cspAttach: error (%d) loading %s",
(int)crtn, modName);
CssmError::throwMe(crtn);
}
crtn = CSSM_ModuleAttach (guid,
&vers,
&CL_memFuncs, 0, CSSM_SERVICE_CSP, 0, CSSM_KEY_HIERARCHY_NONE,
NULL, 0, NULL, &cspHand);
if(crtn) {
clErrorLog("AppleX509CLSession::cspAttach: error (%d) attaching to %s",
(int)crtn, modName);
CssmError::throwMe(crtn);
}
if(bareCsp) {
mCspHand = cspHand;
}
else {
mCspDlHand = cspHand;
}
return cspHand;
}
CSSM_CSP_HANDLE getGlobalCspHand(bool bareCsp)
{
return cspAttacher().getCspHand(bareCsp);
}