Commit 98c82b89 authored by Dr. Stephen Henson's avatar Dr. Stephen Henson
Browse files

Gather keygen options in req and only use them after all other options have

been processed. This allows any ENGINE changing operations to be processed
first (for example a config file).
parent 6d3a1eac
Loading
Loading
Loading
Loading
+33 −19
Original line number Diff line number Diff line
@@ -169,7 +169,8 @@ int MAIN(int argc, char **argv)
	X509 *x509ss=NULL;
	X509_REQ *req=NULL;
	EVP_PKEY_CTX *genctx = NULL;
	const char *keyalgstr;
	const char *keyalg = NULL, *keyalgstr;
	STACK *pkeyopts = NULL;
	EVP_PKEY *pkey=NULL;
	int i=0,badops=0,newreq=0,verbose=0,pkey_type=EVP_PKEY_RSA;
	long newkey = -1;
@@ -290,34 +291,20 @@ int MAIN(int argc, char **argv)
			}
		else if (strcmp(*argv,"-newkey") == 0)
			{

			if (--argc < 1)
				goto bad;

			genctx = set_keygen_ctx(bio_err, *(++argv), &newkey,
							&keyalgstr, e);

			if (!genctx)
				goto bad;

			keyalg = *(++argv);
			newreq=1;
			}
		else if (strcmp(*argv,"-pkeyopt") == 0)
			{
			if (--argc < 1)
				goto bad;
			if (!genctx)
				{
				BIO_puts(bio_err, "No keytype specified\n");
			if (!pkeyopts)
				pkeyopts = sk_new_null();
			if (!pkeyopts || !sk_push(pkeyopts, *(++argv)))
				goto bad;
			}
			else if (pkey_ctrl_string(genctx, *(++argv)) <= 0)
				{
				BIO_puts(bio_err, "parameter setting error\n");
				ERR_print_errors(bio_err);
				goto end;
				}
			}
		else if (strcmp(*argv,"-batch") == 0)
			batch=1;
		else if (strcmp(*argv,"-newhdr") == 0)
@@ -644,6 +631,14 @@ bad:
		if (inrand)
			app_RAND_load_files(inrand);

		if (keyalg)
			{
			genctx = set_keygen_ctx(bio_err, keyalg, &newkey,
							&keyalgstr, e);
			if (!genctx)
				goto end;
			}
	
		if (newkey <= 0)
			{
			if (!NCONF_get_number(req_conf,SECTION,BITS, &newkey))
@@ -665,6 +660,23 @@ bad:
				goto end;
			}

		if (pkeyopts)
			{
			char *genopt;
			for (i = 0; i < sk_num(pkeyopts); i++)
				{
				genopt = sk_value(pkeyopts, i);
				if (pkey_ctrl_string(genctx, genopt) <= 0)
					{
					BIO_printf(bio_err,
						"parameter error \"%s\"\n",
						genopt);
					ERR_print_errors(bio_err);
					goto end;
					}
				}
			}

		BIO_printf(bio_err,"Generating a %ld bit %s private key\n",
				newkey, keyalgstr);

@@ -1066,6 +1078,8 @@ end:
	EVP_PKEY_free(pkey);
	if (genctx)
		EVP_PKEY_CTX_free(genctx);
	if (pkeyopts)
		sk_free(pkeyopts);
	X509_REQ_free(req);
	X509_free(x509ss);
	ASN1_INTEGER_free(serial);