#include "testParams.h"
#include <Security/cssm.h>
#include <stdlib.h>
#include <stdio.h>
#include <time.h>
#include <utilLib/common.h>
#include <utilLib/cspwrap.h>
#include <strings.h>
#define DO_PAUSE 0
#define SIG_ALG CSSM_ALGID_SHA1WithRSA
#define KEY_GEN_ALG CSSM_ALGID_RSA
#define KEY_SIZE CSP_RSA_KEY_SIZE_DEFAULT
#define PTEXT_SIZE 1024
#define USAGE_DEF "noUsage"
typedef struct {
CSSM_KEY privKey;
CSSM_KEY pubKey;
CSSM_DATA ptext;
} TT_SignVfyParams;
int signVerifyInit(TestParams *testParams)
{
CSSM_BOOL pubIsRef;
CSSM_BOOL privIsRef;
CSSM_RETURN crtn;
TT_SignVfyParams *svParams;
if(testParams->threadNum & 1) {
pubIsRef = CSSM_TRUE;
privIsRef = CSSM_FALSE;
}
else {
pubIsRef = CSSM_FALSE;
privIsRef = CSSM_TRUE;
}
svParams = (TT_SignVfyParams *)CSSM_MALLOC(sizeof(TT_SignVfyParams));
crtn = cspGenKeyPair(testParams->cspHand,
KEY_GEN_ALG,
USAGE_DEF,
strlen(USAGE_DEF),
KEY_SIZE,
&svParams->pubKey,
pubIsRef,
CSSM_KEYUSE_VERIFY,
CSSM_KEYBLOB_RAW_FORMAT_NONE,
&svParams->privKey,
privIsRef,
CSSM_KEYUSE_SIGN,
CSSM_KEYBLOB_RAW_FORMAT_NONE,
CSSM_FALSE);
if(crtn) {
printf("***Error generating key pair; aborting\n");
return 1;
}
svParams->ptext.Data = (uint8 *)CSSM_MALLOC(PTEXT_SIZE);
svParams->ptext.Length = PTEXT_SIZE;
testParams->perThread = svParams;
return 0;
}
int signVerify(TestParams *testParams)
{
TT_SignVfyParams *svParams = (TT_SignVfyParams *)testParams->perThread;
unsigned loop;
CSSM_RETURN crtn;
CSSM_DATA sig;
for(loop=0; loop<testParams->numLoops; loop++) {
if(testParams->verbose) {
printf("signVerify thread %d: loop %d\n",
testParams->threadNum, loop);
}
else if(!testParams->quiet) {
printChar(testParams->progressChar);
}
crtn = threadGetRandData(testParams, &svParams->ptext, PTEXT_SIZE);
if(crtn) {
return 1;
}
sig.Data = NULL;
sig.Length = 0;
crtn = cspSign(testParams->cspHand,
SIG_ALG,
&svParams->privKey,
&svParams->ptext,
&sig);
if(crtn) {
return 1;
}
crtn = cspSigVerify(testParams->cspHand,
SIG_ALG,
&svParams->pubKey,
&svParams->ptext,
&sig,
CSSM_OK);
if(crtn) {
return 1;
}
appFree(sig.Data, NULL);
#if DO_PAUSE
fpurge(stdin);
printf("Hit CR to proceed: ");
getchar();
#endif
}
return 0;
}