sick

sign and check files using ed25519
git clone git://z3bra.org/sick
Log | Files | Refs | Submodules | README | LICENSE

commit a6d6dd7c102aeed81bed2c7806880a5169072103
parent 2d6981d14b013ef2b573a349dc2bd41a560af285
Author: z3bra <willyatmailoodotorg>
Date:   Mon May  9 13:43:11 2016

Implement signing in base64 format

The whole stream will be stored in a buffer and used for the signature.
Signature will be appended at the end of the stream in base64 format,
between two lines:

    -----BEGIN ED25519 SIGNATURE-----
    -----END ED25519 SIGNATURE-----

The base64 encoded lines are wrapped at char 76, as defined by posix.

Diffstat:
 mkfile |  2 +-
 sick.c | 56 +++++++++++++++++++++++++++++++++++++++++++++++++++++++-
 2 files changed, 56 insertions(+), 2 deletions(-)

diff --git a/mkfile b/mkfile @@ -2,7 +2,7 @@ ED25519_SRC = `{find ed25519/src -name '*.c'} -SRC = sick.c ${ED25519_SRC} +SRC = sick.c base64.c ${ED25519_SRC} OBJ = ${SRC:%.c=%.o} sick: $OBJ diff --git a/sick.c b/sick.c @@ -5,8 +5,18 @@ #include <string.h> #include "arg.h" +#include "base64.h" #include "ed25519.h" +#define SIGBEGIN "-----BEGIN ED25519 SIGNATURE-----\n" +#define SIGEND "-----END ED25519 SIGNATURE-----\n" + +enum { + ACT_NONE, + ACT_SIGN, + ACT_CHCK +}; + static void usage(); static int createkeypair(const char *); @@ -15,7 +25,7 @@ char *argv0; static void usage() { - fprintf(stderr, "usage: %s [-g ALIAS]\n", argv0); + fprintf(stderr, "usage: %s [-g ALIAS] [-f KEY] [-s [FILE..]]\n", argv0); exit(EXIT_FAILURE); } @@ -41,6 +51,7 @@ createkeypair(const char *alias) ed25519_create_keypair(pub, priv, seed); /* write private key to "<alias>.key" */ + memset(fn, 0, PATH_MAX); memcpy(fn, alias, len); memcpy(fn+len, ".key", 4); if ((fp = fopen(fn, "w")) == NULL) { @@ -71,15 +82,58 @@ createkeypair(const char *alias) } int +sign(FILE *fp, FILE *key) +{ + size_t len, siz = 0; + char tmp[64], *base64; + unsigned char sig[64], priv[64], *msg = NULL; + + while((len = fread(tmp, 1, 64, fp)) > 0) { + siz += len; + msg = realloc(msg, siz); + memcpy(msg + siz - len, tmp, len); + } + + fread(priv, 1, 64, key); + ed25519_sign(sig, msg, siz, priv); + + len = base64_encode(&base64, sig, 64); + fwrite(msg, 1, siz, stdout); + fwrite(SIGBEGIN, 1, sizeof(SIGBEGIN), stdout); + base64_fold(stdout, base64, len, 0); + fwrite(SIGEND, 1, sizeof(SIGEND), stdout); + + return 0; +} + +int main(int argc, char *argv[]) { + FILE *key = NULL, *fp = NULL; + int action = ACT_NONE; + ARGBEGIN{ + case 'f': + key = fopen(EARGF(usage()), "r"); + break; case 'g': createkeypair(EARGF(usage())); break; + case 's': + action = ACT_SIGN; + break; default: usage(); }ARGEND; + if (!argc) { + fp = stdin; + switch (action) { + case ACT_SIGN: + sign(fp, key); + break; + } + } + return 0; }