signVerify.cpp   [plain text]


/*
 * Simple sign/verify test
 */
#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>

/* for memory leak debug only, with only one thread running */
#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"

/* per-thread info */
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;
	
	/* flip coin for ref/blob key forms */
	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;
}