X-Git-Url: https://git.distorted.org.uk/u/mdw/catacomb/blobdiff_plain/5032daf4a16aebc784968e8d052dbe4233f88bfe..c65df27983057ec76ed0e72bb370f9a5ae7dad28:/keyutil.c diff --git a/keyutil.c b/keyutil.c index 13b8784..0b54df2 100644 --- a/keyutil.c +++ b/keyutil.c @@ -1,6 +1,6 @@ /* -*-c-*- * - * $Id: keyutil.c,v 1.25 2004/04/21 00:38:22 mdw Exp $ + * $Id$ * * Simple key manager program * @@ -64,6 +64,7 @@ #include "ptab.h" #include "rsa.h" +#include "cc.h" #include "sha-mgf.h" #include "sha256-mgf.h" #include "sha224-mgf.h" @@ -571,10 +572,8 @@ static void alg_dhparam(keyopts *k) qd_parse qd; if (strcmp(k->curve, "list") == 0) { - const pentry *pe; - printf("Built-in prime groups:\n"); - for (pe = ptab; pe->name; pe++) - printf(" %s\n", pe->name); + unsigned i, w; + LIST("Built-in prime groups", stdout, ptab[i].name, ptab[i].name); exit(0); } qd.p = k->curve; @@ -711,10 +710,9 @@ static void alg_ecparam(keyopts *k) if (!k->bits) k->bits = 256; if (k->curve && strcmp(k->curve, "list") == 0) { - const ecentry *ee; - printf("Built-in elliptic curves:\n"); - for (ee = ectab; ee->name; ee++) - printf(" %s\n", ee->name); + unsigned i, w; + LIST("Built-in elliptic curves", stdout, + ectab[i].name, ectab[i].name); exit(0); } if (!k->curve) { @@ -1022,7 +1020,7 @@ static int cmd_add(int argc, char *argv[]) if ((k.f & f_bogus) || optind + 1 > argc) { die(EXIT_FAILURE, - "Usage: add [options] type [attr...]"); + "Usage: add [OPTIONS] TYPE [ATTR...]"); } if (key_chkident(argv[optind])) die(EXIT_FAILURE, "bad key type `%s'", argv[optind]); @@ -1389,7 +1387,7 @@ static int cmd_list(int argc, char *argv[]) } if (o.f & f_bogus) - die(EXIT_FAILURE, "Usage: list [-uqv] [-f filter] [tag...]"); + die(EXIT_FAILURE, "Usage: list [-uqv] [-f FILTER] [TAG...]"); /* --- Open the key file --- */ @@ -1447,7 +1445,7 @@ static int cmd_expire(int argc, char *argv[]) int rc = 0; if (argc < 2) - die(EXIT_FAILURE, "Usage: expire tag..."); + die(EXIT_FAILURE, "Usage: expire TAG..."); doopen(&f, KOPEN_WRITE); for (i = 1; i < argc; i++) { if ((k = key_bytag(&f, argv[i])) != 0) @@ -1471,7 +1469,7 @@ static int cmd_delete(int argc, char *argv[]) int rc = 0; if (argc < 2) - die(EXIT_FAILURE, "Usage: delete tag..."); + die(EXIT_FAILURE, "Usage: delete TAG..."); doopen(&f, KOPEN_WRITE); for (i = 1; i < argc; i++) { if ((k = key_bytag(&f, argv[i])) != 0) @@ -1493,7 +1491,7 @@ static int cmd_setattr(int argc, char *argv[]) key *k; if (argc < 3) - die(EXIT_FAILURE, "Usage: setattr tag attr..."); + die(EXIT_FAILURE, "Usage: setattr TAG ATTR..."); doopen(&f, KOPEN_WRITE); if ((k = key_bytag(&f, argv[1])) == 0) die(EXIT_FAILURE, "key `%s' not found", argv[1]); @@ -1561,7 +1559,7 @@ static int cmd_finger(int argc, char *argv[]) argv += optind; argc -= optind; if (rc) - die(EXIT_FAILURE, "Usage: fingerprint [-f filter] [tag...]"); + die(EXIT_FAILURE, "Usage: fingerprint [-f FILTER] [TAG...]"); doopen(&f, KOPEN_READ); @@ -1594,7 +1592,7 @@ static int cmd_comment(int argc, char *argv[]) int err; if (argc < 2 || argc > 3) - die(EXIT_FAILURE, "Usage: comment tag [comment]"); + die(EXIT_FAILURE, "Usage: comment TAG [COMMENT]"); doopen(&f, KOPEN_WRITE); if ((k = key_bytag(&f, argv[1])) == 0) die(EXIT_FAILURE, "key `%s' not found", argv[1]); @@ -1634,7 +1632,7 @@ static int cmd_tag(int argc, char *argv[]) argv += optind; argc -= optind; if (argc < 1 || argc > 2 || rc) - die(EXIT_FAILURE, "Usage: tag [-r] tag [new-tag]"); + die(EXIT_FAILURE, "Usage: tag [-r] TAG [NEW-TAG]"); doopen(&f, KOPEN_WRITE); if (flags & f_retag) { if ((k = key_bytag(&f, argv[1])) != 0 && strcmp(k->tag, argv[1]) == 0) @@ -1658,7 +1656,7 @@ static int cmd_lock(int argc, char *argv[]) dstr d = DSTR_INIT; if (argc != 2) - die(EXIT_FAILURE, "Usage: lock qtag"); + die(EXIT_FAILURE, "Usage: lock QTAG"); doopen(&f, KOPEN_WRITE); if (key_qtag(&f, argv[1], &d, &k, &kd)) die(EXIT_FAILURE, "key `%s' not found", argv[1]); @@ -1681,7 +1679,7 @@ static int cmd_unlock(int argc, char *argv[]) dstr d = DSTR_INIT; if (argc != 2) - die(EXIT_FAILURE, "Usage: unlock qtag"); + die(EXIT_FAILURE, "Usage: unlock QTAG"); doopen(&f, KOPEN_WRITE); if (key_qtag(&f, argv[1], &d, &k, &kd)) die(EXIT_FAILURE, "key `%s' not found", argv[1]); @@ -1728,7 +1726,7 @@ static int cmd_extract(int argc, char *argv[]) argv += optind; argc -= optind; if (rc || argc < 1) - die(EXIT_FAILURE, "Usage: extract [-f filter] file [tag...]"); + die(EXIT_FAILURE, "Usage: extract [-f FILTER] FILE [TAG...]"); if (strcmp(*argv, "-") == 0) fp = stdout; else if (!(fp = fopen(*argv, "w"))) { @@ -1764,7 +1762,7 @@ static int cmd_tidy(int argc, char *argv[]) { key_file f; if (argc != 1) - die(EXIT_FAILURE, "usage: tidy"); + die(EXIT_FAILURE, "Usage: tidy"); doopen(&f, KOPEN_WRITE); f.f |= KF_MODIFIED; /* Nasty hack */ doclose(&f); @@ -1779,7 +1777,7 @@ static int cmd_merge(int argc, char *argv[]) FILE *fp; if (argc != 2) - die(EXIT_FAILURE, "Usage: merge file"); + die(EXIT_FAILURE, "Usage: merge FILE"); if (strcmp(argv[1], "-") == 0) fp = stdin; else if (!(fp = fopen(argv[1], "r"))) { @@ -1793,25 +1791,86 @@ static int cmd_merge(int argc, char *argv[]) return (0); } +/* --- @cmd_show@ --- */ + +#define LISTS(LI) \ + LI("Lists", list, \ + listtab[i].name, listtab[i].name) \ + LI("Hash functions", hash, \ + ghashtab[i], ghashtab[i]->name) \ + LI("Elliptic curves", ec, \ + ectab[i].name, ectab[i].name) \ + LI("Diffie-Hellman groups", dh, \ + ptab[i].name, ptab[i].name) \ + LI("Key-generation algorithms", keygen, \ + algtab[i].name, algtab[i].name) \ + LI("Random seeding algorithms", seed, \ + seedtab[i].p, seedtab[i].p) + +MAKELISTTAB(listtab, LISTS) + +static int cmd_show(int argc, char *argv[]) +{ + return (displaylists(listtab, argv + 1)); +} + /*----- Main command table ------------------------------------------------*/ -static struct cmd { - const char *name; - int (*cmd)(int /*argc*/, char */*argv*/[]); - const char *usage; - const char *help; -} cmds[] = { +static int cmd_help(int argc, char *argv[]); + +static cmd cmds[] = { + { "help", cmd_help, "help [COMMAND...]" }, + { "show", cmd_show, "show [ITEM...]" }, + { "list", cmd_list, "list [-uqv] [-f FILTER] [TAG...]", "\ +Options:\n\ +\n\ +-u, --utc Display expiry times etc. in UTC, not local time.\n\ +-q, --quiet Show less information.\n\ +-v, --verbose Show more information.\n\ +" }, + { "fingerprint", cmd_finger, "fingerprint [-f FILTER] [TAG...]", "\ +Options:\n\ +\n\ +-f, --filter=FILT Only hash key components matching FILT.\n\ +-a, --algorithm=HASH Use the named HASH algorithm.\n\ + ($ show hash for list.)\n\ +" }, + { "extract", cmd_extract, "extract [-f FILTER] FILE [TAG...]", "\ +Options:\n\ +\n\ +-f, --filter=FILT Only extract key components matching FILT.\n\ +" }, + { "merge", cmd_merge, "merge FILE" }, + { "expire", cmd_expire, "expire TAG..." }, + { "delete", cmd_delete, "delete TAG..." }, + { "setattr", cmd_setattr, "setattr TAG ATTR..." }, + { "comment", cmd_comment, "comment TAG [COMMENT]" }, + { "lock", cmd_lock, "lock QTAG" }, + { "unlock", cmd_unlock, "unlock QTAG" }, + { "tag", cmd_tag, "tag [-r] TAG [NEW-TAG]", "\ +Options:\n\ +\n\ +-r, --retag Untag any key currently called new-tag.\n\ +" }, + { "tidy", cmd_tidy, "tidy" }, { "add", cmd_add, - "add [options] type [attr...]\n\ - Options: [-lqrLS] [-a alg] [-bB bits] [-p param] [-R tag]\n\ - [-e expire] [-t tag] [-c comment]", "\ + "add [-OPTIONS] TYPE [ATTR...]\n\ + Options: [-lqrLS] [-a ALG] [-bB BITS] [-p PARAM] [-R TAG]\n\ + [-A SEEDALG] [-s SEED] [-n BITS]\n\ + [-e EXPIRE] [-t TAG] [-c COMMENT]", "\ Options:\n\ \n\ -a, --algorithm=ALG Generate keys suitable for ALG.\n\ + ($ show keygen for list.)\n\ -b, --bits=N Generate an N-bit key.\n\ -B, --qbits=N Use an N-bit subgroup or factors.\n\ -p, --parameters=TAG Get group parameters from TAG.\n\ --C, --curve=CURVE Use elliptic curve CURVE.\n\ +-C, --curve=NAME Use elliptic curve or DH group NAME.\n\ + ($ show ec or $ show dh for list.)\n\ +-A, --seedalg=ALG Use pseudorandom generator ALG to generate key.\n\ + ($ show seed for list.)\n\ +-s, --seed=BASE64 Use Base64-encoded string BASE64 as seed.\n\ +-n, --newseed=COUNT Generate new COUNT-bit seed.\n\ -e, --expire=TIME Make the key expire after TIME.\n\ -c, --comment=STRING Attach the command STRING to the key.\n\ -t, --tag=TAG Tag the key with the name TAG.\n\ @@ -1822,80 +1881,22 @@ Options:\n\ -L, --lim-lee Generate Lim-Lee primes for Diffie-Hellman groups.\n\ -S, --subgroup Use a prime-order subgroup for Diffie-Hellman.\n\ " }, - { "expire", cmd_expire, "expire tag..." }, - { "delete", cmd_delete, "delete tag..." }, - { "tag", cmd_tag, "tag [-r] tag [new-tag]", "\ -Options:\n\ -\n\ --r, --retag Untag any key currently called new-tag.\n\ -" }, - { "setattr", cmd_setattr, "setattr tag attr..." }, - { "comment", cmd_comment, "comment tag [comment]" }, - { "lock", cmd_lock, "lock qtag" }, - { "unlock", cmd_unlock, "unlock qtag" }, - { "list", cmd_list, "list [-uqv] [-f filter] [tag...]", "\ -Options:\n\ -\n\ --u, --utc Display expiry times etc. in UTC, not local time.\n\ --q, --quiet Show less information.\n\ --v, --verbose Show more information.\n\ -" }, - { "fingerprint", cmd_finger, "fingerprint [-f filter] [tag...]", "\ -Options:\n\ -\n\ --f, --filter=FILT Only hash key components matching FILT.\n\ --a, --algorithm=HASH Use the named HASH algorithm.\n\ -" }, - { "tidy", cmd_tidy, "tidy" }, - { "extract", cmd_extract, "extract [-f filter] file [tag...]", "\ -Options:\n\ -\n\ --f, --filter=FILT Only extract key components matching FILT.\n\ -" }, - { "merge", cmd_merge, "merge file" }, { 0, 0, 0 } }; -typedef struct cmd cmd; - -/*----- Main code ---------------------------------------------------------*/ - -/* --- @findcmd@ --- * - * - * Arguments: @const char *name@ = a command name - * - * Returns: Pointer to the command structure. - * - * Use: Looks up a command by name. If the command isn't found, an - * error is reported and the program is terminated. - */ - -static cmd *findcmd(const char *name) +static int cmd_help(int argc, char *argv[]) { - cmd *c, *chosen = 0; - size_t sz = strlen(name); - - for (c = cmds; c->name; c++) { - if (strncmp(name, c->name, sz) == 0) { - if (c->name[sz] == 0) { - chosen = c; - break; - } else if (chosen) - die(EXIT_FAILURE, "ambiguous command name `%s'", name); - else - chosen = c; - } - } - if (!chosen) - die(EXIT_FAILURE, "unknown command name `%s'", name); - return (chosen); + sc_help(cmds, stdout, argv + 1); + return (0); } +/*----- Main code ---------------------------------------------------------*/ + /* --- Helpful GNUy functions --- */ -void usage(FILE *fp) +static void usage(FILE *fp) { - pquis(fp, "Usage: $ [-k keyring] command [args]\n"); + pquis(fp, "Usage: $ [-k KEYRING] COMMAND [ARGS]\n"); } void version(FILE *fp) @@ -1903,38 +1904,20 @@ void version(FILE *fp) pquis(fp, "$, Catacomb version " VERSION "\n"); } -void help(FILE *fp, char **argv) +void help_global(FILE *fp) { - cmd *c; - - version(fp); - fputc('\n', fp); - if (*argv) { - c = findcmd(*argv); - fprintf(fp, "Usage: %s [-k keyring] %s\n", QUIS, c->usage); - if (c->help) { - fputc('\n', fp); - fputs(c->help, fp); - } - } else { - usage(fp); - fputs("\n\ -Performs various simple key management operations. Command line options\n\ -recognized are:\n\ + usage(fp); + fputs("\n\ +Performs various simple key management operations.\n\ +\n\ +Global command line options:\n\ \n\ --h, --help [COMMAND] Display this help text (or help for COMMAND).\n\ +-h, --help [COMMAND...] Display this help text (or help for COMMANDs).\n\ -v, --version Display version number.\n\ -u, --usage Display short usage summary.\n\ \n\ --k, --keyring=FILE Read and write keys in FILE.\n\ --i, --id=TAG Use key TAG for random number generator.\n\ --t, --type=TYPE Use key TYPE for random number generator.\n\ -\n\ -The following commands are understood:\n\n", - fp); - for (c = cmds; c->name; c++) - fprintf(fp, "%s\n", c->usage); - } +-k, --keyring=FILE Read and write keys in FILE.\n", + fp); } /* --- @main@ --- * @@ -1986,7 +1969,7 @@ int main(int argc, char *argv[]) /* --- GNU help options --- */ case 'h': - help(stdout, argv + optind); + sc_help(cmds, stdout, argv + optind); exit(0); case 'v': version(stdout); @@ -2026,7 +2009,7 @@ int main(int argc, char *argv[]) argc -= optind; argv += optind; optind = 0; - return (findcmd(argv[0])->cmd(argc, argv)); + return (findcmd(cmds, argv[0])->cmd(argc, argv)); } /*----- That's all, folks -------------------------------------------------*/