-/* $OpenBSD: pkeyparam.c,v 1.3 2014/08/28 14:25:48 jsing Exp $ */
+/* $OpenBSD: pkeyparam.c,v 1.4 2015/04/11 15:21:42 jsing Exp $ */
/* Written by Dr Stephen N Henson (steve@openssl.org) for the OpenSSL
* project 2006
*/
#include <openssl/evp.h>
#include <openssl/pem.h>
+struct {
+#ifndef OPENSSL_NO_ENGINE
+ char *engine;
+#endif
+ char *infile;
+ int noout;
+ char *outfile;
+ int text;
+} pkeyparam_config;
+
+struct option pkeyparam_options[] = {
+#ifndef OPENSSL_NO_ENGINE
+ {
+ .name = "engine",
+ .argname = "id",
+ .desc = "Use the engine specified by the given identifier",
+ .type = OPTION_ARG,
+ .opt.arg = &pkeyparam_config.engine,
+ },
+#endif
+ {
+ .name = "in",
+ .argname = "file",
+ .desc = "Input file (default stdin)",
+ .type = OPTION_ARG,
+ .opt.arg = &pkeyparam_config.infile,
+ },
+ {
+ .name = "noout",
+ .desc = "Do not print encoded version of the parameters",
+ .type = OPTION_FLAG,
+ .opt.flag = &pkeyparam_config.noout,
+ },
+ {
+ .name = "out",
+ .argname = "file",
+ .desc = "Output file (default stdout)",
+ .type = OPTION_ARG,
+ .opt.arg = &pkeyparam_config.outfile,
+ },
+ {
+ .name = "text",
+ .desc = "Print out the parameters in plain text",
+ .type = OPTION_FLAG,
+ .opt.flag = &pkeyparam_config.text,
+ },
+ { NULL },
+};
+
+static void
+pkeyparam_usage()
+{
+ fprintf(stderr,
+ "usage: pkeyparam [-engine id] [-in file] [-noout] [-out file] "
+ "[-text]\n");
+ options_usage(pkeyparam_options);
+}
+
int pkeyparam_main(int, char **);
int
pkeyparam_main(int argc, char **argv)
{
- char **args, *infile = NULL, *outfile = NULL;
BIO *in = NULL, *out = NULL;
- int text = 0, noout = 0;
EVP_PKEY *pkey = NULL;
- int badarg = 0;
-#ifndef OPENSSL_NO_ENGINE
- char *engine = NULL;
-#endif
int ret = 1;
- args = argv + 1;
- while (!badarg && *args && *args[0] == '-') {
- if (!strcmp(*args, "-in")) {
- if (args[1]) {
- args++;
- infile = *args;
- } else
- badarg = 1;
- } else if (!strcmp(*args, "-out")) {
- if (args[1]) {
- args++;
- outfile = *args;
- } else
- badarg = 1;
- }
-#ifndef OPENSSL_NO_ENGINE
- else if (strcmp(*args, "-engine") == 0) {
- if (!args[1])
- goto bad;
- engine = *(++args);
- }
-#endif
+ memset(&pkeyparam_config, 0, sizeof(pkeyparam_config));
- else if (strcmp(*args, "-text") == 0)
- text = 1;
- else if (strcmp(*args, "-noout") == 0)
- noout = 1;
- args++;
+ if (options_parse(argc, argv, pkeyparam_options, NULL, NULL) != 0) {
+ pkeyparam_usage();
+ return (1);
}
- if (badarg) {
-#ifndef OPENSSL_NO_ENGINE
-bad:
-#endif
- BIO_printf(bio_err, "Usage pkeyparam [options]\n");
- BIO_printf(bio_err, "where options are\n");
- BIO_printf(bio_err, "-in file input file\n");
- BIO_printf(bio_err, "-out file output file\n");
- BIO_printf(bio_err, "-text print parameters as text\n");
- BIO_printf(bio_err, "-noout don't output encoded parameters\n");
#ifndef OPENSSL_NO_ENGINE
- BIO_printf(bio_err, "-engine e use engine e, possibly a hardware device.\n");
-#endif
- return 1;
- }
-#ifndef OPENSSL_NO_ENGINE
- setup_engine(bio_err, engine, 0);
+ setup_engine(bio_err, pkeyparam_config.engine, 0);
#endif
- if (infile) {
- if (!(in = BIO_new_file(infile, "r"))) {
- BIO_printf(bio_err,
- "Can't open input file %s\n", infile);
- goto end;
+ if (pkeyparam_config.infile) {
+ if (!(in = BIO_new_file(pkeyparam_config.infile, "r"))) {
+ BIO_printf(bio_err, "Can't open input file %s\n",
+ pkeyparam_config.infile);
}
} else
in = BIO_new_fp(stdin, BIO_NOCLOSE);
- if (outfile) {
- if (!(out = BIO_new_file(outfile, "w"))) {
- BIO_printf(bio_err,
- "Can't open output file %s\n", outfile);
+ if (pkeyparam_config.outfile) {
+ if (!(out = BIO_new_file(pkeyparam_config.outfile, "w"))) {
+ BIO_printf(bio_err, "Can't open output file %s\n",
+ pkeyparam_config.outfile);
goto end;
}
} else {
ERR_print_errors(bio_err);
goto end;
}
- if (!noout)
+ if (!pkeyparam_config.noout)
PEM_write_bio_Parameters(out, pkey);
- if (text)
+ if (pkeyparam_config.text)
EVP_PKEY_print_params(out, pkey, 0, NULL);
ret = 0;