#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/Security.h>
#define HOLD_SEARCH_LIST 0
#define DO_PAUSE 0
static const char *CERT_FILE = "cduniverse_v3.100.cer";
static unsigned char *certData = NULL;
static unsigned certLength = 0;
int secTrustEvalInit(TestParams *testParams)
{
if(certData != NULL) {
return 0;
}
if(testParams->verbose) {
printf("secTrusEval 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;
}
int secTrustEval(TestParams *testParams)
{
unsigned loopNum;
SecCertificateRef certRef;
const CSSM_DATA cdata = {certLength, (uint8 *)certData};
OSStatus ortn = SecCertificateCreateFromData(&cdata,
CSSM_CERT_X_509v3,
CSSM_CERT_ENCODING_DER,
&certRef);
if(ortn) {
cssmPerror("SecCertificateCreateFromData", ortn);
return (int)ortn;
}
#if HOLD_SEARCH_LIST
CFArrayRef sl;
ortn = SecKeychainCopySearchList(&sl);
if(ortn) {
cssmPerror("SecPolicySearchCreate", ortn);
return (int)ortn;
}
#endif
for(loopNum=0; loopNum<testParams->numLoops; loopNum++) {
if(testParams->verbose) {
printf("secTrustEval loop %d\n", loopNum);
}
else if(!testParams->quiet) {
printChar(testParams->progressChar);
}
CFMutableArrayRef certs;
certs = CFArrayCreateMutable(NULL, 1, &kCFTypeArrayCallBacks);
CFArrayInsertValueAtIndex(certs, 0, certRef);
SecPolicyRef policy = NULL;
SecPolicySearchRef policySearch = NULL;
OSStatus ortn = SecPolicySearchCreate(CSSM_CERT_X_509v3,
&CSSMOID_APPLE_TP_SSL,
NULL, &policySearch);
if(ortn) {
cssmPerror("SecPolicySearchCreate", ortn);
return (int)ortn;
}
ortn = SecPolicySearchCopyNext(policySearch, &policy);
if(ortn) {
cssmPerror("SecPolicySearchCopyNext", ortn);
return (int)ortn;
}
CFRelease(policySearch);
SecTrustRef secTrust;
ortn = SecTrustCreateWithCertificates(certs, policy, &secTrust);
if(ortn) {
cssmPerror("SecTrustCreateWithCertificates", ortn);
return (int)ortn;
}
SecTrustResultType secTrustResult;
ortn = SecTrustEvaluate(secTrust, &secTrustResult);
if(ortn) {
cssmPerror("SecTrustEvaluate", ortn);
return (int)ortn;
}
CFRelease(certs);
CFRelease(secTrust);
CFRelease(policy);
#if DO_PAUSE
fpurge(stdin);
printf("Hit CR to continue: ");
getchar();
#endif
}
#if HOLD_SEARCH_LIST
CFRelease(sl);
#endif
return 0;
}