]> git.saurik.com Git - apple/security.git/blobdiff - SecurityTests/cspxutils/macTest/macTest.c
Security-57031.1.35.tar.gz
[apple/security.git] / SecurityTests / cspxutils / macTest / macTest.c
diff --git a/SecurityTests/cspxutils/macTest/macTest.c b/SecurityTests/cspxutils/macTest/macTest.c
new file mode 100644 (file)
index 0000000..3755fa2
--- /dev/null
@@ -0,0 +1,175 @@
+/*
+ * 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;
+}