--- /dev/null
+/*
+ * Simple test:
+ *
+ * -- generate a key
+ * -- generate MAC
+ * -- verify MAC
+ */
+#include <stdlib.h>
+#include <stdio.h>
+#include <time.h>
+#include <Security/cssm.h>
+#include "cspwrap.h"
+#include "common.h"
+#define DATA_SIZE_DEF 100
+#define LOOPS_DEF 10
+
+#define KEY_ALG_DEF CSSM_ALGID_SHA1HMAC
+#define MAC_ALG_DEF CSSM_ALGID_SHA1HMAC
+
+static void usage(char **argv)
+{
+ printf("usage: %s [options]\n", argv[0]);
+ printf("Options:\n");
+ printf(" d=dataSize (default = %d)\n", DATA_SIZE_DEF);
+ printf(" l=loops (0=forever)\n");
+ printf(" p=pauseInterval (default=0, no pause)\n");
+ printf(" m (HMACMD5; default is HMACSHA1)\n");
+ printf(" D (CSP/DL; default = bare CSP)\n");
+ printf(" q(uiet)\n");
+ printf(" v(erbose))\n");
+ exit(1);
+}
+
+int main(int argc, char **argv)
+{
+ int arg;
+ char *argp;
+ CSSM_CSP_HANDLE cspHand;
+ CSSM_CC_HANDLE macHand;
+ CSSM_RETURN crtn;
+ CSSM_DATA randData;
+ CSSM_KEY_PTR symmKey;
+ CSSM_DATA macData = {0, NULL};
+ unsigned loop;
+ int i;
+ unsigned dataSize = DATA_SIZE_DEF;
+ unsigned pauseInterval = 0;
+ unsigned loops = LOOPS_DEF;
+ CSSM_BOOL quiet = CSSM_FALSE;
+ CSSM_BOOL verbose = CSSM_FALSE;
+ CSSM_BOOL bareCsp = CSSM_TRUE;
+ CSSM_ALGORITHMS macAlg = MAC_ALG_DEF;
+ CSSM_ALGORITHMS keyAlg = KEY_ALG_DEF;
+
+ for(arg=1; arg<argc; arg++) {
+ argp = argv[arg];
+ switch(argv[arg][0]) {
+ case 'd':
+ dataSize = atoi(&argv[arg][2]);
+ break;
+ case 'l':
+ loops = atoi(&argv[arg][2]);
+ break;
+ case 'p':
+ pauseInterval = atoi(&argv[arg][2]);
+ break;
+ case 'm':
+ keyAlg = macAlg = CSSM_ALGID_MD5HMAC;
+ break;
+ case 'D':
+ bareCsp = CSSM_FALSE;
+ break;
+ case 'q':
+ quiet = CSSM_TRUE;
+ break;
+ case 'v':
+ verbose = CSSM_TRUE;
+ break;
+ default:
+ usage(argv);
+ }
+ }
+ cspHand = cspDlDbStartup(bareCsp, NULL);
+ if(cspHand == 0) {
+ exit(1);
+ }
+ printf("Starting mactest; args: ");
+ for(i=1; i<argc; i++) {
+ printf("%s ", argv[i]);
+ }
+ printf("\n");
+ symmKey = cspGenSymKey(cspHand,
+ keyAlg,
+ "noLabel",
+ 7,
+ CSSM_KEYUSE_SIGN | CSSM_KEYUSE_VERIFY,
+ CSP_KEY_SIZE_DEFAULT,
+ CSSM_TRUE);
+ if(symmKey == 0) {
+ printf("Error generating symmetric key; aborting.\n");
+ exit(1);
+ }
+ randData.Data = (uint8 *)CSSM_MALLOC(dataSize);
+ randData.Length = dataSize;
+ simpleGenData(&randData, dataSize, dataSize);
+ for(loop=1; ; loop++) {
+ if(!quiet) {
+ printf("...Loop %d\n", loop);
+ }
+ crtn = CSSM_CSP_CreateMacContext(cspHand,
+ macAlg,
+ symmKey,
+ &macHand);
+ if(crtn) {
+ printError("CSSM_CSP_CreateMacContext (1)", crtn);
+ exit(1);
+ }
+ crtn = CSSM_GenerateMac(macHand,
+ &randData,
+ 1,
+ &macData);
+ if(crtn) {
+ printError("CSSM_GenerateMac error", crtn);
+ exit(1);
+ }
+ crtn = CSSM_DeleteContext(macHand);
+ if(crtn) {
+ printError("CSSM_DeleteContext", crtn);
+ exit(1);
+ }
+ crtn = CSSM_CSP_CreateMacContext(cspHand,
+ macAlg,
+ symmKey,
+ &macHand);
+ if(macHand == 0) {
+ printError("CSSM_CSP_CreateMacContext (2)", crtn);
+ exit(1);
+ }
+ crtn = CSSM_VerifyMac(macHand,
+ &randData,
+ 1,
+ &macData);
+ if(crtn) {
+ printError("CSSM_VerifyMac", crtn);
+ exit(1);
+ }
+ crtn = CSSM_DeleteContext(macHand);
+ if(crtn) {
+ printError("CSSM_DeleteContext", crtn);
+ exit(1);
+ }
+ if(loops && (loop == loops)) {
+ break;
+ }
+ if(pauseInterval && ((loop % pauseInterval) == 0)) {
+ char inch;
+ fpurge(stdin);
+ printf("Hit CR to proceed or q to quit: ");
+ inch = getchar();
+ if(inch == 'q') {
+ break;
+ }
+ }
+ }
+ CSSM_FREE(randData.Data);
+ crtn = CSSM_ModuleDetach(cspHand);
+ if(crtn) {
+ printError("CSSM_CSP_Detach", crtn);
+ exit(1);
+ }
+ if(!quiet) {
+ printf("OK\n");
+ }
+ return 0;
+}