#include <stdlib.h>
#include <stdio.h>
#include <Security/cssm.h>
#include "clutils.h"
#include <Security/cssmapple.h>
#include <utilLib/common.h>
static CSSM_API_MEMORY_FUNCS memFuncs = {
appMalloc,
appFree,
appRealloc,
appCalloc,
NULL
};
static CSSM_VERSION vers = {2, 0};
CSSM_CL_HANDLE clStartup()
{
CSSM_CL_HANDLE clHand;
CSSM_RETURN crtn;
if(cssmStartup() == CSSM_FALSE) {
return 0;
}
crtn = CSSM_ModuleLoad(&gGuidAppleX509CL,
CSSM_KEY_HIERARCHY_NONE,
NULL, NULL); if(crtn) {
printError("CSSM_ModuleLoad(AppleCL)", crtn);
return 0;
}
crtn = CSSM_ModuleAttach (&gGuidAppleX509CL,
&vers,
&memFuncs, 0, CSSM_SERVICE_CL, 0, CSSM_KEY_HIERARCHY_NONE,
NULL, 0, NULL, &clHand);
if(crtn) {
printError("CSSM_ModuleAttach(AppleCL)", crtn);
return 0;
}
else {
return clHand;
}
}
void clShutdown(
CSSM_CL_HANDLE clHand)
{
CSSM_RETURN crtn;
crtn = CSSM_ModuleDetach(clHand);
if(crtn) {
printf("Error detaching from AppleCL\n");
printError("CSSM_ModuleDetach", crtn);
return;
}
crtn = CSSM_ModuleUnload(&gGuidAppleX509CL, NULL, NULL);
if(crtn) {
printf("Error unloading AppleCL\n");
printError("CSSM_ModuleUnload", crtn);
}
}
CSSM_TP_HANDLE tpStartup()
{
CSSM_TP_HANDLE tpHand;
CSSM_RETURN crtn;
if(cssmStartup() == CSSM_FALSE) {
return 0;
}
crtn = CSSM_ModuleLoad(&gGuidAppleX509TP,
CSSM_KEY_HIERARCHY_NONE,
NULL, NULL); if(crtn) {
printError("CSSM_ModuleLoad(AppleTP)", crtn);
return 0;
}
crtn = CSSM_ModuleAttach (&gGuidAppleX509TP,
&vers,
&memFuncs, 0, CSSM_SERVICE_TP, 0, CSSM_KEY_HIERARCHY_NONE,
NULL, 0, NULL, &tpHand);
if(crtn) {
printError("CSSM_ModuleAttach(AppleTP)", crtn);
return 0;
}
else {
return tpHand;
}
}
void tpShutdown(
CSSM_TP_HANDLE tpHand)
{
CSSM_RETURN crtn;
crtn = CSSM_ModuleDetach(tpHand);
if(crtn) {
printf("Error detaching from AppleTP\n");
printError("CSSM_ModuleDetach", crtn);
return;
}
crtn = CSSM_ModuleUnload(&gGuidAppleX509TP, NULL, NULL);
if(crtn) {
printf("Error unloading AppleTP\n");
printError("CSSM_ModuleUnload", crtn);
}
}
CSSM_DATA_PTR intToDER(unsigned theInt)
{
CSSM_DATA_PTR DER_Data = (CSSM_DATA_PTR)CSSM_MALLOC(sizeof(CSSM_DATA));
if(theInt < 0x100) {
DER_Data->Length = 1;
DER_Data->Data = (uint8 *)CSSM_MALLOC(1);
DER_Data->Data[0] = (unsigned char)(theInt);
}
else if(theInt < 0x10000) {
DER_Data->Length = 2;
DER_Data->Data = (uint8 *)CSSM_MALLOC(2);
DER_Data->Data[0] = (unsigned char)(theInt >> 8);
DER_Data->Data[1] = (unsigned char)(theInt);
}
else if(theInt < 0x1000000) {
DER_Data->Length = 3;
DER_Data->Data = (uint8 *)CSSM_MALLOC(3);
DER_Data->Data[0] = (unsigned char)(theInt >> 16);
DER_Data->Data[1] = (unsigned char)(theInt >> 8);
DER_Data->Data[2] = (unsigned char)(theInt);
}
else {
DER_Data->Length = 4;
DER_Data->Data = (uint8 *)CSSM_MALLOC(4);
DER_Data->Data[0] = (unsigned char)(theInt >> 24);
DER_Data->Data[1] = (unsigned char)(theInt >> 16);
DER_Data->Data[2] = (unsigned char)(theInt >> 8);
DER_Data->Data[3] = (unsigned char)(theInt);
}
return DER_Data;
}
uint32 DER_ToInt(const CSSM_DATA *DER_Data)
{
uint32 rtn = 0;
unsigned i = 0;
while(i < DER_Data->Length) {
rtn |= DER_Data->Data[i];
if(++i == DER_Data->Length) {
break;
}
rtn <<= 8;
}
return rtn;
}