--- /dev/null
+/*
+ * 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;
+}
+