int main(int argc, char **argv) { int arg; char *argp; int rtn; opParams op; if(argc < 2) { usage(argv); } memset(&op, 0, sizeof(opParams)); op.keySizeInBits = DEFAULT_KEY_SIZE_BITS; op.alg = CSSM_ALGID_RSA; op.swapKeyClass = CSSM_FALSE; op.rawSign = CSSM_FALSE; op.noPad = CSSM_FALSE; for(arg=2; arg<argc; arg++) { argp = argv[arg]; switch(argp[0]) { case 'a': if(argp[1] != '=') { usage(argv); } switch(argp[2]) { case 'r': op.alg = CSSM_ALGID_RSA; break; case 'd': op.alg = CSSM_ALGID_DSA; break; case 'e': op.alg = CSSM_ALGID_ECDSA; break; default: usage(argv); } break; case 'z': op.keySizeInBits = atoi(&argp[2]); break; case 'k': op.keyFileName = &argp[2]; break; case 'K': op.outKeyFileName = &argp[2]; break; case 'p': op.plainFileName = &argp[2]; break; case 'c': op.cipherFileName = &argp[2]; break; case 's': op.sigFileName = &argp[2]; break; case 'w': op.swapKeyClass = CSSM_TRUE; break; case 'r': op.rawSign = CSSM_TRUE; break; case 'P': op.noPad = CSSM_TRUE; break; case 'm': op.dsaParamFileIn = &argp[2]; break; case 'M': op.dsaParamFileOut = &argp[2]; break; case 'q': op.quiet = CSSM_TRUE; break; case 'b': if(argp[1] != '=') { usage(argv); } op.pubKeyFormat = parsePubKeyFormat(argp[2], argv); break; case 'B': if(argp[1] != '=') { usage(argv); } op.outPubKeyFormat = parsePubKeyFormat(argp[2], argv); break; case 'v': if(argp[1] != '=') { usage(argv); } switch(argp[2]) { case '1': op.privKeyFormat = CSSM_KEYBLOB_RAW_FORMAT_PKCS1; break; case '8': op.privKeyFormat = CSSM_KEYBLOB_RAW_FORMAT_PKCS8; break; case 's': op.privKeyFormat = CSSM_KEYBLOB_RAW_FORMAT_OPENSSH; break; case 'b': op.pubKeyFormat = CSSM_KEYBLOB_RAW_FORMAT_FIPS186; break; #if OPENSSL_ENABLE case 'o': op.privKeyFormat = CSSM_KEYBLOB_RAW_FORMAT_OPENSSL; break; #endif default: usage(argv); } break; case 'd': if(argp[1] != '=') { usage(argv); } switch(argp[2]) { case 's': op.digestAlg = CSSM_ALGID_SHA1; break; case '5': op.digestAlg = CSSM_ALGID_MD5; break; default: usage(argv); } break; case 'h': default: usage(argv); } } op.cspHand = cspDlDbStartup(CSSM_TRUE, NULL); if(op.cspHand == 0) { exit(1); } /* specify blob formats if user didn't */ if(op.pubKeyFormat == CSSM_KEYBLOB_RAW_FORMAT_NONE) { switch(op.alg) { case CSSM_ALGID_RSA: op.pubKeyFormat = CSSM_KEYBLOB_RAW_FORMAT_PKCS1; break; case CSSM_ALGID_DSA: case CSSM_ALGID_ECDSA: op.pubKeyFormat = CSSM_KEYBLOB_RAW_FORMAT_X509; break; default: printf("BRRZAP!\n"); exit(1); } } if(op.privKeyFormat == CSSM_KEYBLOB_RAW_FORMAT_NONE) { switch(op.alg) { case CSSM_ALGID_RSA: op.privKeyFormat = CSSM_KEYBLOB_RAW_FORMAT_PKCS8; break; case CSSM_ALGID_DSA: op.privKeyFormat = CSSM_KEYBLOB_RAW_FORMAT_FIPS186; break; case CSSM_ALGID_ECDSA: op.privKeyFormat = CSSM_KEYBLOB_RAW_FORMAT_OPENSSL; break; default: printf("BRRZAP!\n"); exit(1); } } switch(argv[1][0]) { case 'g': rtn = rt_generate(&op); break; case 'e': rtn = rt_encrypt(&op); break; case 'd': rtn = rt_decrypt(&op); break; case 's': rtn = rt_sign(&op); break; case 'v': rtn = rt_verify(&op); break; case 'S': op.alg = CSSM_ALGID_SHA1; rtn = rt_digest(&op); break; case 'M': op.alg = CSSM_ALGID_MD5; rtn = rt_digest(&op); break; case 'C': rtn = rt_convertPubKey(&op); break; default: usage(argv); exit(1); // fool the compiler } CSSM_ModuleDetach(op.cspHand); return rtn; }
int main(int argc, char **argv) { int arg; char *argp; int rtn; opParams op; CSSM_RETURN crtn; CSSM_BOOL doStaged = CSSM_FALSE; if(argc < 2) { usage(argv); } memset(&op, 0, sizeof(opParams)); op.keySizeInBits = DEFAULT_KEY_SIZE_BITS; op.keyAlg = CSSM_ALGID_RSA; for(arg=2; arg<argc; arg++) { argp = argv[arg]; switch(argp[0]) { case 'a': if(argp[1] != '=') { usage(argv); } switch(argp[2]) { case 'r': op.keyAlg = CSSM_ALGID_RSA; break; case 'd': op.keyAlg = CSSM_ALGID_DSA; break; default: usage(argv); } break; case 'b': op.keySizeInBits = atoi(&argp[2]); break; case 'k': op.keyFileName = &argp[2]; break; case 'p': op.plainFileName = &argp[2]; break; case 'c': op.cipherFileName = &argp[2]; break; case 's': op.sigFileName = &argp[2]; break; case 'g': doStaged = CSSM_TRUE; break; case 'h': default: usage(argv); } } crtn = cdsaCspAttach(&op.cspHandle); if(crtn) { cssmPerror("Attach to CSP", crtn); exit(1); } switch(argv[1][0]) { case 'g': rtn = rt_generate(&op); break; case 'e': rtn = rt_encrypt(&op); break; case 'd': rtn = rt_decrypt(&op); break; case 's': if(doStaged) { rtn = rt_stagedSign(&op); } else { rtn = rt_sign(&op); } break; case 'v': if(doStaged) { rtn = rt_stagedVerify(&op); } else { rtn = rt_verify(&op); } break; default: usage(argv); exit(1); // fool the compiler } cdsaCspDetach(op.cspHandle); return 0; }