getCachedFields.cpp [plain text]
#include "testParams.h"
#include <Security/cssm.h>
#include <utilLib/common.h>
#include <utilLib/cspwrap.h>
#include <clAppUtils/clutils.h>
#include <clAppUtils/tpUtils.h>
#include <security_cdsa_utils/cuFileIo.h>
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <string.h>
#include <Security/oidscert.h>
#include <Security/x509defs.h>
#include <Security/oidsattr.h>
#define DO_PAUSE 0
static const char *CERT_FILE = "mypage.apple_v3.100.cer";
#define NUM_INNER_LOOPS 10
static unsigned char *certData = NULL;
static unsigned certLength = 0;
static const CSSM_OID *fieldOids[] =
{
&CSSMOID_X509V1Version,
&CSSMOID_X509V1SubjectName,
&CSSMOID_X509V1IssuerName,
&CSSMOID_X509V1SerialNumber,
&CSSMOID_X509V1ValidityNotBefore,
&CSSMOID_X509V1ValidityNotAfter,
&CSSMOID_X509V1Signature
};
#define NUM_FIELD_OIDS (sizeof(fieldOids) / sizeof(CSSM_OID *))
int getCachedFieldsInit(TestParams *testParams)
{
if(certData != NULL) {
return 0;
}
if(testParams->verbose) {
printf("getFields thread %d: reading cert file %s...\n",
testParams->threadNum, CERT_FILE);
}
if(readFile(CERT_FILE, &certData, &certLength)) {
printf("Error reading %s; aborting\n", CERT_FILE);
printf("***This test must be run from the clxutils/threadTest directory.\n");
return 1;
}
return 0;
}
static int compareFields(
const CSSM_OID *oid,
const CSSM_DATA *val1,
const CSSM_DATA *val2)
{
if(val1->Length != val2->Length) {
printf("***FieldValue.Length miscompare\n");
return 1;
}
if(appCompareCssmData(oid, &CSSMOID_X509V1Version)) {
if(!appCompareCssmData(val1, val2)) {
printf("***CSSMOID_X509V1Version mismatch\n");
return 1;
}
}
else if(appCompareCssmData(oid, &CSSMOID_X509V1SerialNumber)) {
if(!appCompareCssmData(val1, val2)) {
printf("***CSSMOID_X509V1SerialNumber mismatch\n");
return 1;
}
}
else if(appCompareCssmData(oid, &CSSMOID_X509V1ValidityNotBefore)) {
CSSM_X509_TIME *cssmTime1 = (CSSM_X509_TIME *)val1->Data;
CSSM_X509_TIME *cssmTime2 = (CSSM_X509_TIME *)val2->Data;
if(!appCompareCssmData(&cssmTime1->time, &cssmTime2->time)) {
printf("***CSSMOID_X509V1ValidityNotBefore mismatch\n");
return 1;
}
}
else if(appCompareCssmData(oid, &CSSMOID_X509V1ValidityNotAfter)) {
CSSM_X509_TIME *cssmTime1 = (CSSM_X509_TIME *)val1->Data;
CSSM_X509_TIME *cssmTime2 = (CSSM_X509_TIME *)val2->Data;
if(!appCompareCssmData(&cssmTime1->time, &cssmTime2->time)) {
printf("***CSSMOID_X509V1ValidityNotAfter mismatch\n");
return 1;
}
}
else if(appCompareCssmData(oid, &CSSMOID_X509V1CertificateIssuerUniqueId)) {
if(!appCompareCssmData(val1, val2)) {
printf("***CSSMOID_X509V1CertificateIssuerUniqueId mismatch\n");
return 1;
}
}
else if(appCompareCssmData(oid, &CSSMOID_X509V1CertificateSubjectUniqueId)) {
if(!appCompareCssmData(val1, val2)) {
printf("***CSSMOID_X509V1CertificateSubjectUniqueId mismatch\n");
return 1;
}
}
else if(appCompareCssmData(oid, &CSSMOID_X509V1Signature)) {
if(!appCompareCssmData(val1, val2)) {
printf("***CSSMOID_X509V1Signature mismatch\n");
return 1;
}
}
return 0;
}
static int checkOneField(
CSSM_CL_HANDLE clHand,
CSSM_HANDLE cacheHand1,
CSSM_HANDLE cacheHand2,
const CSSM_OID *fieldOid)
{
CSSM_DATA_PTR fieldData1 = NULL;
CSSM_DATA_PTR fieldData2 = NULL;
CSSM_RETURN crtn;
CSSM_HANDLE resultHand1 = 0;
CSSM_HANDLE resultHand2 = 0;
uint32 numFields = 0;
int rtn;
crtn = CSSM_CL_CertGetFirstCachedFieldValue(
clHand,
cacheHand1,
fieldOid,
&resultHand1,
&numFields,
&fieldData1);
if(crtn) {
return crtn;
}
if(numFields != 1) {
printf("Fiedl not present; try another cert\n");
return 1;
}
crtn = CSSM_CL_CertGetFirstCachedFieldValue(
clHand,
cacheHand2,
fieldOid,
&resultHand2,
&numFields,
&fieldData2);
if(crtn) {
return crtn;
}
rtn = compareFields(fieldOid, fieldData1, fieldData2);
CSSM_CL_CertAbortQuery(clHand, resultHand1);
CSSM_CL_CertAbortQuery(clHand, resultHand2);
CSSM_CL_FreeFieldValue(clHand, fieldOid, fieldData1);
CSSM_CL_FreeFieldValue(clHand, fieldOid, fieldData2);
return rtn;
}
int getCachedFields(TestParams *testParams)
{
CSSM_RETURN crtn;
CSSM_HANDLE cacheHand1;
CSSM_HANDLE cacheHand2;
unsigned fieldNum;
unsigned loopNum;
CSSM_DATA cert;
for(loopNum=0; loopNum<testParams->numLoops; loopNum++) {
if(testParams->verbose) {
printf("getCachedFields loop %d\n", loopNum);
}
else if(!testParams->quiet) {
printChar(testParams->progressChar);
}
cert.Data = certData;
cert.Length = certLength;
crtn = CSSM_CL_CertCache(testParams->clHand, &cert, &cacheHand1);
if(crtn) {
printError("CSSM_CL_CertCache(1)", crtn);
return 1;
}
crtn = CSSM_CL_CertCache(testParams->clHand, &cert, &cacheHand2);
if(crtn) {
printError("CSSM_CL_CertCache(2)", crtn);
return 1;
}
for(fieldNum=0; fieldNum<NUM_FIELD_OIDS; fieldNum++) {
int rtn = checkOneField(testParams->clHand,
cacheHand1,
cacheHand2,
fieldOids[fieldNum]);
if(rtn) {
return 1;
}
}
CSSM_CL_CertAbortCache(testParams->clHand, cacheHand1);
CSSM_CL_CertAbortCache(testParams->clHand, cacheHand2);
#if DO_PAUSE
fpurge(stdin);
printf("Hit CR to continue: ");
getchar();
#endif
}
return 0;
}