]> git.saurik.com Git - apple/security.git/blobdiff - Security/libsecurity_cryptkit/ckutils/blobtest/blobtest.c
Security-57031.1.35.tar.gz
[apple/security.git] / Security / libsecurity_cryptkit / ckutils / blobtest / blobtest.c
diff --git a/Security/libsecurity_cryptkit/ckutils/blobtest/blobtest.c b/Security/libsecurity_cryptkit/ckutils/blobtest/blobtest.c
new file mode 100644 (file)
index 0000000..0f678f8
--- /dev/null
@@ -0,0 +1,358 @@
+/*
+ * Copyright (c) 1998,2011,2014 Apple Inc. All Rights Reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * This file contains Original Code and/or Modifications of Original Code
+ * as defined in and that are subject to the Apple Public Source License
+ * Version 2.0 (the 'License'). You may not use this file except in
+ * compliance with the License. Please obtain a copy of the License at
+ * http://www.opensource.apple.com/apsl/ and read it before using this
+ * file.
+ * 
+ * The Original Code and all software distributed under the License are
+ * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT.
+ * Please see the License for the specific language governing rights and
+ * limitations under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+
+#include "Crypt.h"
+#include "falloc.h"
+#include <stdlib.h>
+#include <stdio.h>
+#include <time.h>
+#include "ckutilsPlatform.h"
+
+#define MIN_PASSWD_LENGTH      4
+#define MAX_PASSWD_LENGTH      20
+#define DEPTH_DEFAULT          FEE_DEPTH_DEFAULT
+
+#undef BOOL
+#undef YES
+#undef NO
+#define BOOL   int
+#define YES    1
+#define NO     0
+
+static unsigned char *passwdPool;
+
+static unsigned doBlobTest(unsigned minPasswdLen, 
+       unsigned maxPasswdLen, 
+       BOOL verbose,
+       unsigned depth);
+static void usage(char **argv);
+
+int main(int argc, char **argv)
+{
+       BOOL            seedSpec = NO;          // YES ==> user specified
+       unsigned        loopNum;
+       int             arg;
+       char            *argp;
+       
+       /*
+        * User-spec'd variables
+        */
+       unsigned        minPasswordLen = MIN_PASSWD_LENGTH;
+       unsigned        maxPasswordLen = MAX_PASSWD_LENGTH;
+       int             seed = 0;
+       unsigned        loops = 1;      
+       BOOL            quiet = NO;
+       BOOL            verbose = NO;
+       unsigned        depth = DEPTH_DEFAULT;
+       
+       #if     macintosh
+       argc = ccommand(&argv);
+       #endif
+       for(arg=1; arg<argc; arg++) {
+               argp = argv[arg];
+               switch(argp[0]) {
+                   case 'n':
+                       minPasswordLen = atoi(&argp[2]);
+                       break;
+                   case 'x':
+                       maxPasswordLen = atoi(&argp[2]);
+                       break;
+                   case 's':
+                       seed = atoi(&argp[2]);
+                       seedSpec = YES;
+                       break;
+                   case 'l':
+                       loops = atoi(&argp[2]);
+                       break;
+                   case 'D':
+                       depth = atoi(&argp[2]);
+                       break;
+                   case 'q':
+                       quiet = YES;
+                       break;
+                   case 'v':
+                       verbose = YES;
+                       break;
+                   case 'h':
+                   default:
+                       usage(argv);
+               }
+       }
+       if(seedSpec == NO) {
+               unsigned long   tim;
+               time(&tim);
+               seed = (unsigned)tim;
+       }
+       SRAND(seed);
+
+       passwdPool = fmalloc(maxPasswordLen + 4);
+       
+       printf("Starting %s: minPasswd %d maxPasswd %d seed %d depth %d\n",
+               argv[0],
+               minPasswordLen, maxPasswordLen, seed, depth);
+       
+       for(loopNum=1; ; loopNum++) {
+               if(!quiet) {
+                       printf("..loop %d\n", loopNum);
+               }
+               if(doBlobTest(minPasswordLen, maxPasswordLen, verbose, 
+                               depth)) {
+                       return 1;
+               }
+               if(loops && (loopNum == loops)) {
+                       break;
+               }
+       }
+       if(!quiet) {
+               printf("%s test complete\n", argv[0]);
+       }
+       return 0;
+}
+
+static void usage(char **argv)
+{
+       printf("usage: %s [options]\n", argv[0]);
+       printf("   Options:\n");
+       printf("   l=loops (0=forever)\n");
+       printf("   n=minPasswordLen\n");
+       printf("   x=maxPasswdLen\n");
+       printf("   s=seed\n");
+       printf("   D=depth (default=%d)\n", DEPTH_DEFAULT);
+       printf("   q(uiet)\n");
+       printf("   v(erbose)\n");
+       printf("   h(elp)\n");
+       exit(1);
+}
+
+static unsigned char *genPasswd(unsigned passwdLength) 
+{
+       unsigned *ip = (unsigned *)passwdPool;
+       unsigned intCount = (passwdLength + 3) / 4;
+       int i;
+       unsigned char *rtn;
+       
+       for (i=0; i<intCount; i++) {
+               *ip++ = RAND();
+       }
+       rtn = fmalloc(passwdLength);
+       bcopy(passwdPool, rtn, passwdLength);
+       return rtn;
+}
+
+static unsigned doBlobTest(unsigned minPasswdLen, 
+       unsigned maxPasswdLen,
+       BOOL verbose,
+       unsigned depth)
+{
+       unsigned char   *myPasswd = NULL;
+       unsigned        myPasswdLen;
+       feePubKey       myPrivate = NULL;
+       feePubKey       myPrivateCopy = NULL;   // from blob
+       feePubKey       myPublic = NULL;        // from blob from myPrivate
+       feePubKey       myPublicCopy = NULL;    // from blob from myPublic
+       unsigned        rtn = 0;
+       feeReturn       frtn;
+       unsigned char   *privBlob = NULL;
+       unsigned        privBlobLen;
+       unsigned char   *pubBlob = NULL;
+       unsigned        pubBlobLen;
+       
+       for(myPasswdLen=minPasswdLen; 
+           myPasswdLen<maxPasswdLen; 
+           myPasswdLen++) {
+               
+               if(verbose) {
+                   printf("....myPasswdLen %d\n", myPasswdLen);
+               }
+
+               /*
+                * my private password
+                */
+               myPasswd = genPasswd(myPasswdLen);
+               
+               /*
+                * Fully capable Public Key object
+                */
+               myPrivate = feePubKeyAlloc();
+               frtn = feePubKeyInitFromPrivDataDepth(myPrivate,
+                       myPasswd,
+                       myPasswdLen,
+                       depth,
+                       1);
+               if(frtn) {
+                       printf("feePubKeyInitFromPrivDataDepth: %s\n",
+                               feeReturnString(frtn));
+                       rtn = 1;
+                       goto out;
+               }
+               
+               /* private blob */
+               frtn = feePubKeyCreatePrivBlob(myPrivate,
+                       &privBlob,
+                       &privBlobLen);
+               if(frtn) {
+                       printf("feePubKeyCreatePrivBlob: %s\n",
+                               feeReturnString(frtn));
+                       rtn = 1;
+                       goto out;
+               }
+
+               /* private key from private blob */
+               myPrivateCopy = feePubKeyAlloc();
+               frtn = feePubKeyInitFromPrivBlob(myPrivateCopy,
+                       privBlob,
+                       privBlobLen);
+               if(frtn) {
+                       printf("feePubKeyInitFromKeyBlob (private): %s\n",
+                               feeReturnString(frtn));
+                       rtn = 1;
+                       goto out;
+               }
+               if(!feePubKeyIsPrivate(myPrivateCopy)) {
+                       printf("Unexpected !feePubKeyIsPrivate!\n");
+                       rtn = 1;
+                       goto out;
+               }
+
+               /* public blob from private key */
+               frtn = feePubKeyCreatePubBlob(myPrivate,
+                       &pubBlob,
+                       &pubBlobLen);
+               if(frtn) {
+                       printf("feePubKeyCreatePubBlob (1): %s\n",
+                               feeReturnString(frtn));
+                       rtn = 1;
+                       goto out;
+               }
+
+               /* public key from public blob */
+               myPublic = feePubKeyAlloc();
+               frtn = feePubKeyInitFromPubBlob(myPublic,
+                       pubBlob,
+                       pubBlobLen);
+               if(frtn) {
+                       printf("feePubKeyInitFromKeyBlob (pub 1): %s\n",
+                               feeReturnString(frtn));
+                       rtn = 1;
+                       goto out;
+               }
+               if(feePubKeyIsPrivate(myPublic)) {
+                       printf("Unexpected feePubKeyIsPrivate (1)!\n");
+                       rtn = 1;
+                       goto out;
+               }
+               ffree(pubBlob);
+               pubBlob = NULL;
+       
+               /* public blob from public key */
+               frtn = feePubKeyCreatePubBlob(myPublic,
+                       &pubBlob,
+                       &pubBlobLen);
+               if(frtn) {
+                       printf("feePubKeyCreatePubBlob (2): %s\n",
+                               feeReturnString(frtn));
+                       rtn = 1;
+                       goto out;
+               }
+
+               /* public key from public blob */
+               myPublicCopy = feePubKeyAlloc();
+               frtn = feePubKeyInitFromPubBlob(myPublicCopy,
+                       pubBlob,
+                       pubBlobLen);
+               if(frtn) {
+                       printf("feePubKeyInitFromKeyBlob (pub 2): %s\n",
+                               feeReturnString(frtn));
+                       rtn = 1;
+                       goto out;
+               }
+               if(feePubKeyIsPrivate(myPublicCopy)) {
+                       printf("Unexpected feePubKeyIsPrivate (2)!\n");
+                       rtn = 1;
+                       goto out;
+               }
+
+               /* private blob from pub key - should fail */
+               frtn = feePubKeyCreatePrivBlob(myPublic,
+                       &pubBlob,
+                       &pubBlobLen);
+               if(frtn == FR_Success) {
+                   printf("Unexpected feePubKeyCreatePrivBlob success\n");
+                   rtn = 1;
+                   goto out;
+               }
+               
+               /*
+                * OK, we have four keys; they should all be equal (in
+                * terms of their actual public data).
+                */
+               if(!feePubKeyIsEqual(myPrivate, myPrivateCopy)) {
+                       printf("myPrivate != myPrivateCopy\n");
+                       rtn = 1;
+                       goto out;
+               }
+               if(!feePubKeyIsEqual(myPrivate, myPublic)) {
+                       printf("myPrivate != myPublic\n");
+                       rtn = 1;
+                       goto out;
+               }
+               if(!feePubKeyIsEqual(myPrivate, myPublicCopy)) {
+                       printf("myPrivate != myPublicCopy\n");
+                       rtn = 1;
+                       goto out;
+               }
+               if(!feePubKeyIsEqual(myPublic, myPublicCopy)) {
+                       printf("myPublic != myPublicCopy\n");
+                       rtn = 1;
+                       goto out;
+               }
+           out:
+               if(myPasswd) {
+                       ffree(myPasswd);
+               }
+               if(myPrivate) {
+                       feePubKeyFree(myPrivate);
+               }
+               if(myPrivateCopy) {
+                       feePubKeyFree(myPrivateCopy);
+               }
+               if(myPublic) {
+                       feePubKeyFree(myPublic);
+               }
+               if(myPublic) {
+                       feePubKeyFree(myPublicCopy);
+               }
+               if(privBlob) {
+                       ffree(privBlob);
+               }
+               if(pubBlob) {
+                       ffree(pubBlob);
+               }
+               if(rtn) {
+                       break;
+               }
+       }
+       return rtn;
+}
+