X-Git-Url: https://git.openssl.org/gitweb/?p=openssl.git;a=blobdiff_plain;f=apps%2Fgenrsa.c;h=ac0b709e7af97725a8661c0a7bd511c53e9534b5;hp=00a556599c3505798fe9bebddb18d8f087c33980;hb=ef63568e941bc1fc0e27249dfcc3c5e94a9882e8;hpb=752d706aaf651ce87368bc826a3035a6a4f31190 diff --git a/apps/genrsa.c b/apps/genrsa.c index 00a556599c..ac0b709e7a 100644 --- a/apps/genrsa.c +++ b/apps/genrsa.c @@ -75,6 +75,9 @@ #define PROG genrsa_main static void MS_CALLBACK genrsa_cb(int p, int n, void *arg); + +int MAIN(int, char **); + int MAIN(int argc, char **argv) { int ret=1; @@ -84,6 +87,7 @@ int MAIN(int argc, char **argv) EVP_CIPHER *enc=NULL; unsigned long f4=RSA_F4; char *outfile=NULL; + char *passargout = NULL, *passout = NULL; char *inrand=NULL; BIO *out=NULL; @@ -94,7 +98,7 @@ int MAIN(int argc, char **argv) BIO_set_fp(bio_err,stderr,BIO_NOCLOSE|BIO_FP_TEXT); if ((out=BIO_new(BIO_s_file())) == NULL) { - BIO_printf(bio_err,"unable to creat BIO for output\n"); + BIO_printf(bio_err,"unable to create BIO for output\n"); goto err; } @@ -110,7 +114,7 @@ int MAIN(int argc, char **argv) } else if (strcmp(*argv,"-3") == 0) f4=3; - else if (strcmp(*argv,"-F4") == 0) + else if (strcmp(*argv,"-F4") == 0 || strcmp(*argv,"-f4") == 0) f4=RSA_F4; else if (strcmp(*argv,"-rand") == 0) { @@ -127,6 +131,11 @@ int MAIN(int argc, char **argv) else if (strcmp(*argv,"-idea") == 0) enc=EVP_idea_cbc(); #endif + else if (strcmp(*argv,"-passout") == 0) + { + if (--argc < 1) goto bad; + passargout= *(++argv); + } else break; argv++; @@ -136,23 +145,38 @@ int MAIN(int argc, char **argv) { bad: BIO_printf(bio_err,"usage: genrsa [args] [numbits]\n"); - BIO_printf(bio_err," -des - encrypt the generated key with DES in cbc mode\n"); - BIO_printf(bio_err," -des3 - encrypt the generated key with DES in ede cbc mode (168 bit key)\n"); + BIO_printf(bio_err," -des encrypt the generated key with DES in cbc mode\n"); + BIO_printf(bio_err," -des3 encrypt the generated key with DES in ede cbc mode (168 bit key)\n"); #ifndef NO_IDEA - BIO_printf(bio_err," -idea - encrypt the generated key with IDEA in cbc mode\n"); + BIO_printf(bio_err," -idea encrypt the generated key with IDEA in cbc mode\n"); #endif - BIO_printf(bio_err," -out file - output the key to 'file\n"); - BIO_printf(bio_err," -f4 - use F4 (0x10001) for the E value\n"); - BIO_printf(bio_err," -3 - use 3 for the E value\n"); - BIO_printf(bio_err," -rand file:file:...\n"); - BIO_printf(bio_err," - load the file (or the files in the directory) into\n"); - BIO_printf(bio_err," the random number generator\n"); + BIO_printf(bio_err," -out file output the key to 'file\n"); + BIO_printf(bio_err," -passout arg output file pass phrase source\n"); + BIO_printf(bio_err," -f4 use F4 (0x10001) for the E value\n"); + BIO_printf(bio_err," -3 use 3 for the E value\n"); + BIO_printf(bio_err," -rand file%cfile%c...\n", LIST_SEPARATOR_CHAR, LIST_SEPARATOR_CHAR); + BIO_printf(bio_err," load the file (or the files in the directory) into\n"); + BIO_printf(bio_err," the random number generator\n"); goto err; } ERR_load_crypto_strings(); + + if(!app_passwd(bio_err, NULL, passargout, NULL, &passout)) { + BIO_printf(bio_err, "Error getting password\n"); + goto err; + } + if (outfile == NULL) + { BIO_set_fp(out,stdout,BIO_NOCLOSE); +#ifdef VMS + { + BIO *tmpbio = BIO_new(BIO_f_linebuffer()); + out = BIO_push(tmpbio, out); + } +#endif + } else { if (BIO_write_filename(out,outfile) <= 0) @@ -178,7 +202,7 @@ bad: if (rsa == NULL) goto err; - /* We need to do the folloing for when the base number size is < + /* We need to do the following for when the base number size is < * long, esp windows 3.1 :-(. */ l=0L; for (i=0; ie->top; i++) @@ -190,13 +214,14 @@ bad: l+=rsa->e->d[i]; } BIO_printf(bio_err,"e is %ld (0x%lX)\n",l,l); - if (!PEM_write_bio_RSAPrivateKey(out,rsa,enc,NULL,0,NULL,NULL)) + if (!PEM_write_bio_RSAPrivateKey(out,rsa,enc,NULL,0,NULL, passout)) goto err; ret=0; err: if (rsa != NULL) RSA_free(rsa); - if (out != NULL) BIO_free(out); + if (out != NULL) BIO_free_all(out); + if(passout) OPENSSL_free(passout); if (ret != 0) ERR_print_errors(bio_err); EXIT(ret);