]> git.saurik.com Git - apple/security.git/blobdiff - SecurityTests/clxutils/p12/p12.cpp
Security-57031.1.35.tar.gz
[apple/security.git] / SecurityTests / clxutils / p12 / p12.cpp
diff --git a/SecurityTests/clxutils/p12/p12.cpp b/SecurityTests/clxutils/p12/p12.cpp
new file mode 100644 (file)
index 0000000..b877251
--- /dev/null
@@ -0,0 +1,153 @@
+/*
+ * multipurpose pkcs12 tool. 
+ */
+#include <security_cdsa_utils/cuFileIo.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include <CoreFoundation/CoreFoundation.h>
+#include "p12.h"
+#include <security_cdsa_utils/cuCdsaUtils.h>
+
+static void usage(char **argv)
+{
+       printf("Usage:\n");
+       printf("  %s p infile [options]    parse\n", argv[0]);
+       printf("  %s d infile [options]    decode\n", argv[0]);
+       printf("  %s e infile [options]    decode-->encode\n", argv[0]);
+       printf("  %s i infile keychain     import to keychain\n", argv[0]);
+       printf("  %s x outfile keychain    export from keychain\n", argv[0]);
+       
+       printf("Options:\n");
+       printf("   p=password\n");
+       printf("   z=keychainPassword\n");
+       printf("   P (use secure passphrase)\n");
+       printf("   k=keychain\n");
+       printf("   l=loops\n");
+       printf("   n(o prompt; export only)\n");
+       printf("   v(erbose)\n");
+       /* others here */
+       exit(1);
+}
+
+typedef enum {
+       PR_Parse,
+       PR_Decode,
+       PR_Reencode,
+       PR_Import,
+       PR_Export
+} P12op;
+
+int main(int argc, char **argv)
+{      
+       char *inFile;
+       P12op op;
+       int minArgs = 1;
+       CFStringRef pwd = NULL;
+       bool verbose = false;
+       unsigned loops = 1;
+       char *kcName = NULL;
+       bool noPrompt = false;
+       char *kcPwd = NULL;
+       bool usePassKey = false;
+       
+       if(argc < 2) {
+               usage(argv);
+       }
+       switch(argv[1][0]) {
+               case 'p':
+                       op = PR_Parse;
+                       minArgs = 3;
+                       break;
+               case 'd':
+                       op = PR_Decode;
+                       minArgs = 3;
+                       break;
+               case 'e':
+                       op = PR_Reencode;
+                       minArgs = 3;
+                       break;
+               case 'i':
+                       op = PR_Import;
+                       minArgs = 4;
+                       break;
+               case 'x':
+                       op = PR_Export;
+                       minArgs = 4;
+                       break;
+               default:
+                       usage(argv);
+       }
+       if(argc < minArgs) {
+               usage(argv);
+       }
+       for(int arg=minArgs; arg<argc; arg++) {
+               char *argp = argv[arg];
+               switch(argp[0]) {
+                       case 'p':
+                               pwd = CFStringCreateWithCString(NULL, &argp[2],
+                                       kCFStringEncodingASCII);
+                               break;
+                       case 'k':
+                               kcName = &argp[2];
+                               break;
+                       case 'P':
+                               usePassKey = true;
+                               break;
+                       case 'v':
+                               verbose = true;
+                               break;
+                       case 'n':
+                               noPrompt = true;
+                               break;
+                       case 'l':
+                               loops = atoi(&argp[2]);
+                               break;
+                       case 'z':
+                               kcPwd = &argp[2];
+                               break;
+                       default:
+                               usage(argv);
+
+               }
+       }
+       
+       /* import/export - ready to go right now */
+       switch(op) {
+               case PR_Import:
+                       return p12Import(argv[2], argv[3], pwd, usePassKey, kcPwd);
+               case PR_Export:
+                       return p12Export(argv[2], argv[3], pwd, usePassKey, kcPwd, noPrompt);
+               default:
+                       break;
+       }
+       
+       /* all other ops: read infile */
+       inFile = argv[2];       
+       CSSM_DATA rawBlob;
+       unsigned len;
+       if(readFile(inFile, &rawBlob.Data, &len)) {
+               printf("***Error reading %s. Aborting.\n", inFile);
+               exit(1);
+       }
+       rawBlob.Length = len;
+       
+       CSSM_CSP_HANDLE cspHand = cuCspStartup(CSSM_TRUE);
+       int rtn = 0;
+       switch(op) {
+               case PR_Decode:
+                       rtn = p12Decode(rawBlob, cspHand, pwd, usePassKey, verbose, loops);
+                       break;
+               case PR_Reencode:
+                       rtn = p12Reencode(rawBlob, cspHand, pwd, verbose, loops);
+                       break;
+               case PR_Parse:
+                       rtn = p12ParseTop(rawBlob, cspHand, pwd, verbose);
+                       break;
+               default:
+                       /* NOT REACHED */
+                       printf("GAK!\n");
+                       rtn = -1;
+                       break;
+       }
+       return rtn;
+}