/* -*-c-*-
*
- * $Id: cc.h,v 1.1 2004/04/17 09:58:37 mdw Exp $
+ * $Id$
*
* Catcrypt common stuff
*
/*----- Header files ------------------------------------------------------*/
#include <stdio.h>
+#include <string.h>
#include <mLib/dstr.h>
void (*destroy)(kem */*k*/);
} kemops;
+struct kemtab {
+ const char *name;
+ const kemops *encops;
+ const kemops *decops;
+};
+
+extern const struct kemtab kemtab[];
+
/* --- Signing --- */
typedef struct sig {
void (*destroy)(sig */*s*/);
} sigops;
+struct sigtab {
+ const char *name;
+ const sigops *signops;
+ const sigops *verifyops;
+ const gchash *ch;
+};
+
+extern const struct sigtab sigtab[];
+
/* --- Data encoding --- */
typedef struct enc {
const char *name;
const char *rmode, *wmode;
enc *(*initenc)(FILE */*fp*/, const char */*msg*/);
- enc *(*initdec)(FILE */*fp*/, const char */*msg*/);
+ enc *(*initdec)(FILE */*fp*/,
+ int (*/*func*/)(const char *, void *), void */*p*/);
int (*read)(enc */*e*/, void */*p*/, size_t /*sz*/);
int (*write)(enc */*e*/, const void */*p*/, size_t /*sz*/);
int (*encdone)(enc */*e*/);
void (*destroy)(enc */*e*/);
} encops;
+extern const encops enctab[];
+
/*----- Functions provided ------------------------------------------------*/
/* --- @getkem@ --- *
extern const encops *getenc(const char */*enc*/);
+/* --- @checkbdry@ --- *
+ *
+ * Arguments: @const char *b@ = boundary string found
+ * @void *p@ = boundary string wanted
+ *
+ * Returns: Nonzero if the boundary string is the one we wanted.
+ *
+ * Use: Pass as @func@ to @initdec@ if you just want a simple life.
+ */
+
+extern int checkbdry(const char */*b*/, void */*p*/);
+
/* --- @initenc@ --- *
*
* Arguments: @const encops *eo@ = operations (from @getenc@)
* @FILE *fp@ = file handle to attach
* @const char *msg@ = banner message
- * @int wantenc@ = nonzero if we want to encode
*
* Returns: The encoder object.
*
* Use: Initializes an encoder.
*/
-extern enc *initenc(const encops */*eo*/, FILE */*fp*/,
- const char */*msg*/, int /*wantenc*/);
+extern enc *initenc(const encops */*eo*/, FILE */*fp*/, const char */*msg*/);
+
+/* --- @initdec@ --- *
+ *
+ * Arguments: @const encops *eo@ = operations (from @getenc@)
+ * @FILE *fp@ = file handle to attach
+ * @int (*func)(const char *, void *)@ = banner check function
+ * @void *p@ = argument for @func@
+ *
+ * Returns: The encoder object.
+ *
+ * Use: Initializes an encoder.
+ */
+
+extern enc *initdec(const encops */*eo*/, FILE */*fp*/,
+ int (*/*func*/)(const char *, void *), void */*p*/);
/* --- @freeenc@ --- *
*
extern void freeenc(enc */*e*/);
+/* --- @cmd_encode@, @cmd_decode@ --- */
+
+#define CMD_ENCODE { \
+ "encode", cmd_encode, \
+ "encode [-f FORMAT] [-b LABEL] [-o OUTPUT] [FILE]", \
+ "\
+Options:\n\
+\n\
+-f, --format=FORMAT Encode to FORMAT.\n\
+-b, --boundary=LABEL PEM boundary is LABEL.\n\
+-o, --output=FILE Write output to FILE.\n\
+" }
+
+#define CMD_DECODE { \
+ "decode", cmd_decode, \
+ "decode [-f FORMAT] [-b LABEL] [-o OUTPUT] [FILE]", \
+ "\
+Options:\n\
+\n\
+-f, --format=FORMAT Decode from FORMAT.\n\
+-b, --boundary=LABEL PEM boundary is LABEL.\n\
+-o, --output=FILE Write output to FILE.\n\
+" }
+
+extern int cmd_encode(int /*argc*/, char */*argv*/[]);
+extern int cmd_decode(int /*argc*/, char */*argv*/[]);
+
+/* --- @LIST(STRING, FP, END-TEST, NAME-EXPR)@ --- *
+ *
+ * Produce list of things. Requires @i@ and @w@ variables in scope.
+ * END-TEST and NAME-EXPR are in terms of @i@.
+ */
+
+#define LIST(what, fp, end, name) do { \
+ fputs(what ":\n ", fp); \
+ w = 2; \
+ for (i = 0; end; i++) { \
+ if (w == 2) \
+ w += strlen(name); \
+ else { \
+ if (strlen(name) + w > 76) { \
+ fputs("\n ", fp); \
+ w = 2 + strlen(name); \
+ } else { \
+ fputc(' ', fp); \
+ w += strlen(name) + 1; \
+ } \
+ } \
+ fputs(name, fp); \
+ } \
+ fputc('\n', fp); \
+} while (0)
+
+#define STDLISTS(LI) \
+ LI("Hash functions", hash, \
+ ghashtab[i], ghashtab[i]->name) \
+ LI("Encryption schemes", enc, \
+ gciphertab[i], gciphertab[i]->name) \
+ LI("Message authentication schemes", mac, \
+ gmactab[i], gmactab[i]->name) \
+ LI("Elliptic curves", ec, \
+ ectab[i].name, ectab[i].name) \
+ LI("Diffie-Hellman groups", dh, \
+ ptab[i].name, ptab[i].name)
+
+#define LIDECL(text, tag, test, name) \
+ static void show_##tag(void);
+
+#define LIDEF(text, tag, test, name) \
+ static void show_##tag(void) \
+ { \
+ unsigned i, w; \
+ LIST(text, stdout, test, name); \
+ }
+
+#define LIENT(text, tag, test, name) \
+ { #tag, show_##tag },
+
+struct listent {
+ const char *name;
+ void (*list)(void);
+};
+
+#define MAKELISTTAB(listtab, LISTS) \
+ LISTS(LIDECL) \
+ static const struct listent listtab[] = { \
+ LISTS(LIENT) \
+ { 0, 0 } \
+ }; \
+ LISTS(LIDEF)
+
+extern int displaylists(const struct listent */*listtab*/,
+ char *const /*argv*/[]);
+
+/*----- Subcommand dispatch -----------------------------------------------*/
+
+typedef struct cmd {
+ const char *name;
+ int (*cmd)(int /*argc*/, char */*argv*/[]);
+ const char *usage;
+ const char *help;
+} cmd;
+
+extern void version(FILE */*fp*/);
+extern void help_global(FILE */*fp*/);
+
+/* --- @findcmd@ --- *
+ *
+ * Arguments: @const cmd *cmds@ = pointer to command table
+ * @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.
+ */
+
+const cmd *findcmd(const cmd */*cmds*/, const char */*name*/);
+
+/* --- @sc_help@ --- *
+ *
+ * Arguments: @const cmd *cmds@ = pointer to command table
+ * @FILE *fp@ = output file handle
+ * @char *const *argv@ = remaining arguments
+ *
+ * Returns: ---
+ *
+ * Use: Prints a help message, maybe with help about subcommands.
+ */
+
+extern void sc_help(const cmd */*cmds*/, FILE */*fp*/,
+ char *const */*argv*/);
+
/*----- That's all, folks -------------------------------------------------*/
#ifdef __cplusplus