X-Git-Url: https://git.openssl.org/gitweb/?p=openssl.git;a=blobdiff_plain;f=apps%2Fgenpkey.c;h=6dfda08b9e09f2d7ca3e4bea10f3ce27e8ffebeb;hp=34432874e8c1dd59de569520820d6254261e10c7;hb=5219d3dd350cc74498dd49daef5e6ee8c34d9857;hpb=2fbe371f53451ef165331b10006d61e7d77a09c7 diff --git a/apps/genpkey.c b/apps/genpkey.c index 34432874e8..6dfda08b9e 100644 --- a/apps/genpkey.c +++ b/apps/genpkey.c @@ -1,5 +1,5 @@ /* apps/genpkey.c */ -/* Written by Dr Stephen N Henson (shenson@bigfoot.com) for the OpenSSL +/* Written by Dr Stephen N Henson (steve@openssl.org) for the OpenSSL * project 2006 */ /* ==================================================================== @@ -61,11 +61,12 @@ #include #include #include +#ifndef OPENSSL_NO_ENGINE +#include +#endif static int init_keygen_file(BIO *err, EVP_PKEY_CTX **pctx, const char *file, ENGINE *e); -static int init_gen_str(BIO *err, EVP_PKEY_CTX **pctx, - const char *algname, ENGINE *e, int do_param); static int genpkey_cb(EVP_PKEY_CTX *ctx); #define PROG genpkey_main @@ -85,9 +86,9 @@ int MAIN(int argc, char **argv) EVP_PKEY_CTX *ctx = NULL; char *pass = NULL; int badarg = 0; - int ret = 1; + int ret = 1, rv; - int do_param = -1; + int do_param = 0; if (bio_err == NULL) bio_err = BIO_new_fp (stderr, BIO_NOCLOSE); @@ -147,12 +148,10 @@ int MAIN(int argc, char **argv) { if (!args[1]) goto bad; - if (do_param == -1) - do_param = 0; if (!init_gen_str(bio_err, &ctx, *(++args),e, do_param)) goto end; } - else if (strcmp(*args,"-param") == 0) + else if (strcmp(*args,"-pkeyopt") == 0) { if (!args[1]) goto bad; @@ -197,16 +196,23 @@ int MAIN(int argc, char **argv) if (badarg) { bad: - BIO_printf(bio_err, "Usage genpkey [options]\n"); - BIO_printf(bio_err, "where options are\n"); - BIO_printf(bio_err, "-paramfile file parameter file\n"); - BIO_printf(bio_err, "-pass arg output file pass phrase source\n"); - BIO_printf(bio_err, "-outform X output format (DER or PEM)\n"); - BIO_printf(bio_err, "-out file output file\n"); + BIO_printf(bio_err, "Usage: genpkey [options]\n"); + BIO_printf(bio_err, "where options may be\n"); + BIO_printf(bio_err, "-out file output file\n"); + BIO_printf(bio_err, "-outform X output format (DER or PEM)\n"); + BIO_printf(bio_err, "-pass arg output file pass phrase source\n"); + BIO_printf(bio_err, "- use cipher to encrypt the key\n"); #ifndef OPENSSL_NO_ENGINE - BIO_printf(bio_err, "-engine e use engine e, possibly a hardware device.\n"); + BIO_printf(bio_err, "-engine e use engine e, possibly a hardware device.\n"); #endif - return 1; + BIO_printf(bio_err, "-paramfile file parameters file\n"); + BIO_printf(bio_err, "-algorithm alg the public key algorithm\n"); + BIO_printf(bio_err, "-pkeyopt opt:value set the public key algorithm option \n" + " to value \n"); + BIO_printf(bio_err, "-genparam generate parameters, not key\n"); + BIO_printf(bio_err, "-text print the in text\n"); + BIO_printf(bio_err, "NB: options order may be important! See the manual page.\n"); + goto end; } if (!app_passwd(bio_err, passarg, NULL, &pass, NULL)) @@ -258,25 +264,36 @@ int MAIN(int argc, char **argv) } if (do_param) - PEM_write_bio_Parameters(out, pkey); + rv = PEM_write_bio_Parameters(out, pkey); else if (outformat == FORMAT_PEM) - PEM_write_bio_PrivateKey(out, pkey, cipher, NULL, 0, + rv = PEM_write_bio_PrivateKey(out, pkey, cipher, NULL, 0, NULL, pass); else if (outformat == FORMAT_ASN1) - i2d_PrivateKey_bio(out, pkey); + rv = i2d_PrivateKey_bio(out, pkey); else { BIO_printf(bio_err, "Bad format specified for key\n"); goto end; } + if (rv <= 0) + { + BIO_puts(bio_err, "Error writing key\n"); + ERR_print_errors(bio_err); + } if (text) { if (do_param) - EVP_PKEY_print_params(out, pkey, 0, NULL); + rv = EVP_PKEY_print_params(out, pkey, 0, NULL); else - EVP_PKEY_print_private(out, pkey, 0, NULL); + rv = EVP_PKEY_print_private(out, pkey, 0, NULL); + + if (rv <= 0) + { + BIO_puts(bio_err, "Error printing key\n"); + ERR_print_errors(bio_err); + } } ret = 0; @@ -343,26 +360,40 @@ static int init_keygen_file(BIO *err, EVP_PKEY_CTX **pctx, } -static int init_gen_str(BIO *err, EVP_PKEY_CTX **pctx, - const char *algname, ENGINE *e, int do_param) +int init_gen_str(BIO *err, EVP_PKEY_CTX **pctx, + const char *algname, ENGINE *e, int do_param) { EVP_PKEY_CTX *ctx = NULL; const EVP_PKEY_ASN1_METHOD *ameth; + ENGINE *tmpeng = NULL; int pkey_id; + if (*pctx) { BIO_puts(err, "Algorithm already set!\n"); return 0; } - ameth = EVP_PKEY_asn1_find_str(algname, -1); + ameth = EVP_PKEY_asn1_find_str(&tmpeng, algname, -1); + +#ifndef OPENSSL_NO_ENGINE + if (!ameth && e) + ameth = ENGINE_get_pkey_asn1_meth_str(e, algname, -1); +#endif + if (!ameth) { BIO_printf(bio_err, "Algorithm %s not found\n", algname); return 0; } + ERR_clear_error(); + EVP_PKEY_asn1_get0_info(&pkey_id, NULL, NULL, NULL, NULL, ameth); +#ifndef OPENSSL_NO_ENGINE + if (tmpeng) + ENGINE_finish(tmpeng); +#endif ctx = EVP_PKEY_CTX_new_id(pkey_id, e); if (!ctx)