#include "ocspdUtils.h"
#include <CoreFoundation/CoreFoundation.h>
CSSM_BOOL ocspdCompareCssmData(
const CSSM_DATA *data1,
const CSSM_DATA *data2)
{
if((data1 == NULL) || (data1->Data == NULL) ||
(data2 == NULL) || (data2->Data == NULL) ||
(data1->Length != data2->Length)) {
return CSSM_FALSE;
}
if(data1->Length != data2->Length) {
return CSSM_FALSE;
}
if(memcmp(data1->Data, data2->Data, data1->Length) == 0) {
return CSSM_TRUE;
}
else {
return CSSM_FALSE;
}
}
static CFAbsoluteTime parseGenTime(
const uint8 *str,
uint32 len)
{
if((str == NULL) || (len == 0)) {
return NULL_TIME;
}
if(str[len - 1] == '\0') {
len--;
}
if(len < 4) {
return NULL_TIME;
}
char szTemp[5];
CFGregorianDate greg;
memset(&greg, 0, sizeof(greg));
const uint8 *cp = str;
szTemp[0] = *cp++;
szTemp[1] = *cp++;
szTemp[2] = *cp++;
szTemp[3] = *cp++;
szTemp[4] = '\0';
len -= 4;
greg.year = atoi(szTemp);
if(len < 2) {
return NULL_TIME;
}
szTemp[0] = *cp++;
szTemp[1] = *cp++;
szTemp[2] = '\0';
len -= 2;
greg.month = atoi( szTemp );
if(len < 2) {
return NULL_TIME;
}
szTemp[0] = *cp++;
szTemp[1] = *cp++;
szTemp[2] = '\0';
greg.day = atoi( szTemp );
len -= 2;
if(len >= 2) {
szTemp[0] = *cp++;
szTemp[1] = *cp++;
szTemp[2] = '\0';
greg.hour = atoi( szTemp );
len -= 2;
}
if(len >= 2) {
szTemp[0] = *cp++;
szTemp[1] = *cp++;
szTemp[2] = '\0';
greg.minute = atoi( szTemp );
len -= 2;
}
if(len >= 2) {
szTemp[0] = *cp++;
szTemp[1] = *cp++;
szTemp[2] = '\0';
greg.second = atoi( szTemp );
len -= 2;
}
return CFGregorianDateGetAbsoluteTime(greg, NULL);
}
CFAbsoluteTime genTimeToCFAbsTime(
const CSSM_DATA *strData)
{
if((strData == NULL) || (strData->Data == NULL) || (strData->Length == 0)) {
return NULL_TIME;
}
uint8 *timeStr = strData->Data;
size_t timeStrLen = strData->Length;
if(timeStr[timeStrLen - 1] == '\0') {
timeStrLen--;
}
uint8 *str = (uint8 *)malloc(timeStrLen);
uint32 strLen = 0;
const uint8 *inCp = timeStr;
uint8 *outCp = str;
int foundDecimal = 0;
int minutesOffset = 0;
int hoursOffset = 0;
bool minusOffset = false;
bool isGMT = false;
size_t toGo = timeStrLen;
do {
if(*inCp == '.') {
if(foundDecimal) {
{
free(str);
return NULL_TIME;
}
}
foundDecimal++;
inCp++;
toGo--;
if(toGo == 0) {
break;
}
while(isdigit(*inCp) && (toGo != 0)) {
inCp++;
toGo--;
}
}
else if((*inCp == '+') || (*inCp == '-')) {
if((toGo != 2) & (toGo != 4)) {
free(str);
return NULL_TIME;
}
if(*inCp == '-') {
minusOffset = true;
}
inCp++;
hoursOffset = (10 * (inCp[0] - '0')) + (inCp[1] - '0');
toGo -= 2;
if(toGo) {
minutesOffset = (10 * (inCp[0] - '0')) + (inCp[1] - '0');
toGo -= 2;
}
}
else {
*outCp++ = *inCp++;
strLen++;
toGo--;
}
} while(toGo != 0);
if(str[strLen - 1] == 'Z') {
isGMT = true;
strLen--;
}
CFAbsoluteTime absTime;
absTime = parseGenTime(str, strLen);
free(str);
if(absTime == NULL_TIME) {
return NULL_TIME;
}
if(isGMT) {
return absTime;
}
if((minutesOffset != 0) || (hoursOffset != 0)) {
if(minusOffset) {
absTime -= (minutesOffset * 60);
absTime -= (hoursOffset * 3600);
}
else {
absTime += (minutesOffset * 60);
absTime += (hoursOffset * 3600);
}
}
else {
CFTimeInterval tzDelta;
CFTimeZoneRef localZone = CFTimeZoneCopySystem();
tzDelta = CFTimeZoneGetSecondsFromGMT (localZone, CFAbsoluteTimeGetCurrent());
CFRelease(localZone);
absTime += tzDelta;
}
return absTime;
}
void cfAbsTimeToGgenTime(
CFAbsoluteTime absTime,
char *genTime)
{
CFTimeZoneRef tz = CFTimeZoneCreateWithTimeIntervalFromGMT(NULL, 0.0);
CFGregorianDate greg = CFAbsoluteTimeGetGregorianDate(absTime, tz);
int seconds = (int)greg.second;
sprintf(genTime, "%04d%02d%02d%02d%02d%02dZ",
(int)greg.year, greg.month, greg.day, greg.hour,
greg.minute, seconds);
}
void ocspdSha1(
const void *data,
CC_LONG len,
unsigned char *md) {
CC_SHA1_CTX ctx;
CC_SHA1_Init(&ctx);
CC_SHA1_Update(&ctx, data, len);
CC_SHA1_Final(md, &ctx);
}
void ocspdMD5(
const void *data,
CC_LONG len,
unsigned char *md) {
CC_MD5_CTX ctx;
CC_MD5_Init(&ctx);
CC_MD5_Update(&ctx, data, len);
CC_MD5_Final(md, &ctx);
}
void ocspdMD4(
const void *data,
CC_LONG len,
unsigned char *md) {
CC_MD4_CTX ctx;
CC_MD4_Init(&ctx);
CC_MD4_Update(&ctx, data, len);
CC_MD4_Final(md, &ctx);
}
void ocspdSHA256(
const void *data,
CC_LONG len,
unsigned char *md) {
CC_SHA256_CTX ctx;
CC_SHA256_Init(&ctx);
CC_SHA256_Update(&ctx, data, len);
CC_SHA256_Final(md, &ctx);
}
unsigned ocspdArraySize(
const void **array)
{
unsigned count = 0;
if (array) {
while (*array++) {
count++;
}
}
return count;
}