X-Git-Url: https://git.distorted.org.uk/u/mdw/catacomb/blobdiff_plain/78ec50faca2fd89e24cb0ac654fcb3d99c6462ab..a1e745ad3b306d1e5173588e39d71b132466365e:/cc.h diff --git a/cc.h b/cc.h index 45e7eff..b7a2b27 100644 --- a/cc.h +++ b/cc.h @@ -36,8 +36,13 @@ /*----- Header files ------------------------------------------------------*/ +#if _FILE_OFFSET_BITS != 64 +# error "Must set _FILE_OFFSET_BITS to 64." +#endif + #include #include +#include #include @@ -46,7 +51,7 @@ #include "ghash.h" #include "gmac.h" -/*----- Data structures ---------------------------------------------------*/ +/*----- Cryptographic object tables ---------------------------------------*/ /* --- Key encapsulation --- */ @@ -76,58 +81,6 @@ struct kemtab { extern const struct kemtab kemtab[]; -/* --- Signing --- */ - -typedef struct sig { - const struct sigops *ops; - key_packdef *kp; - void *kd; - const gchash *ch; - ghash *h; -} sig; - -typedef struct sigops { - const key_fetchdef *kf; /* Key fetching structure */ - size_t kdsz; /* Size of the key-data structure */ - sig *(*init)(key */*k*/, void */*kd*/, const gchash */*hc*/); - int (*doit)(sig */*s*/, dstr */*d*/); - const char *(*check)(sig */*s*/); - 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 struct encops *ops; - FILE *fp; -} enc; - -typedef struct encops { - const char *name; - const char *rmode, *wmode; - enc *(*initenc)(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*/); - int (*decdone)(enc */*e*/); - void (*destroy)(enc */*e*/); -} encops; - -extern const encops enctab[]; - -/*----- Functions provided ------------------------------------------------*/ - /* --- @getkem@ --- * * * Arguments: @key *k@ = the key to load @@ -168,6 +121,34 @@ extern int setupkem(kem */*k*/, dstr */*d*/, extern void freekem(kem */*k*/); +/* --- Signing --- */ + +typedef struct sig { + const struct sigops *ops; + key_packdef *kp; + void *kd; + const gchash *ch; + ghash *h; +} sig; + +typedef struct sigops { + const key_fetchdef *kf; /* Key fetching structure */ + size_t kdsz; /* Size of the key-data structure */ + sig *(*init)(key */*k*/, void */*kd*/, const gchash */*hc*/); + int (*doit)(sig */*s*/, dstr */*d*/); + const char *(*check)(sig */*s*/); + void (*destroy)(sig */*s*/); +} sigops; + +struct sigtab { + const char *name; + const sigops *signops; + const sigops *verifyops; + const gchash *ch; +}; + +extern const struct sigtab sigtab[]; + /* --- @getsig@ --- * * * Arguments: @key *k@ = the key to load @@ -192,6 +173,31 @@ extern sig *getsig(key */*k*/, const char */*app*/, int /*wantpriv*/); extern void freesig(sig */*s*/); +/*----- File encodings ----------------------------------------------------*/ + +/* --- Data encoding --- */ + +typedef struct enc { + const struct encops *ops; + FILE *fp; +} enc; + +typedef struct encops { + const char *name; + const char *rmode, *wmode; + int nraw, ncook; + enc *(*initenc)(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*/); + int (*decdone)(enc */*e*/); + void (*destroy)(enc */*e*/); +} encops; + +extern const encops enctab[]; + /* --- @getenc@ --- * * * Arguments: @const char *enc@ = name of wanted encoding @@ -258,29 +264,33 @@ extern void freeenc(enc */*e*/); #define CMD_ENCODE { \ "encode", cmd_encode, \ - "encode [-f FORMAT] [-b LABEL] [-o OUTPUT] [FILE]", \ + "encode [-p] [-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\ +-p, --progress Show progress on large files.\n\ " } #define CMD_DECODE { \ "decode", cmd_decode, \ - "decode [-f FORMAT] [-b LABEL] [-o OUTPUT] [FILE]", \ + "decode [-p] [-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\ +-p, --progress Show progress on large files.\n\ " } extern int cmd_encode(int /*argc*/, char */*argv*/[]); extern int cmd_decode(int /*argc*/, char */*argv*/[]); +/*----- Lists of things ---------------------------------------------------*/ + /* --- @LIST(STRING, FP, END-TEST, NAME-EXPR)@ --- * * * Produce list of things. Requires @i@ and @w@ variables in scope. @@ -348,6 +358,65 @@ struct listent { extern int displaylists(const struct listent */*listtab*/, char *const /*argv*/[]); +/*----- Progress indicators -----------------------------------------------*/ + +typedef struct fprogress { + const char *bp; + off_t o, sz, olast; + time_t start, last; + char name[24]; +} fprogress; + +/* --- @fprogress_init@ --- * + * + * Arguments: @fprogress *f@ = progress context to be initialized + * @const char *name@ = file name string to show + * @FILE *fp@ = file we're reading from + * + * Returns: Zero on success, nonzero if the file's state is now broken. + * + * Use: Initializes a progress context. Nothing is actually + * displayed yet. + */ + +extern int fprogress_init(fprogress */*f*/, + const char */*name*/, FILE */*fp*/); + +/* --- @fprogress_update@ --- * + * + * Arguments: @fprogress *f@ = progress context + * @size_t n@ = how much progress has been made + * + * Returns: --- + * + * Use: Maybe updates the display to show that some progress has been + * made. + */ + +extern void fprogress_update(fprogress */*f*/, size_t /*n*/); + +/* --- @fprogress_clear@ --- * + * + * Arguments: @fprogress *f@ = progress context + * + * Returns: --- + * + * Use: Clears the progress display from the screen. + */ + +extern void fprogress_clear(fprogress */*f*/); + +/* --- @fprogress_done@ --- * + * + * Arguments: @fprogress *f@ = progress context + * + * Returns: --- + * + * Use: Clear up the progress context and removes any display. + */ + +extern void fprogress_done(fprogress */*f*/); + /*----- Subcommand dispatch -----------------------------------------------*/ typedef struct cmd {