sick

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

commit 80b802dd8d9344594c3bfdeb703abb2509de8d35
parent 94ec40e42c2f1515fd496fd9ee10ec60c4a0cd63
Author: z3bra <willyatmailoodotorg>
Date:   Tue May 10 21:01:28 2016

Add a function to bufferize input stream

Diffstat:
 sick.c | 54 +++++++++++++++++++++++++++++++++++++++++++-----------
 1 file changed, 43 insertions(+), 11 deletions(-)

diff --git a/sick.c b/sick.c @@ -18,6 +18,7 @@ enum { }; static void usage(); +static size_t bufferize(unsigned char **buf, FILE *fp); static int createkeypair(const char *); static int sign(FILE *fp, FILE *key); @@ -30,6 +31,29 @@ usage() exit(EXIT_FAILURE); } +/* + * read chunks of data from a stream into a buffer, and return the size of the buffer + */ +static size_t +bufferize(unsigned char **buf, FILE *fp) +{ + size_t n, len = 0; + char chunk[MAX_INPUT], *tmp; + + while ((n = fread(chunk, 1, MAX_INPUT, fp)) > 0) { + if ((tmp = realloc(*buf, len + n)) == NULL) { + free(*buf); + *buf = NULL; + return 0; + } + + *buf = (unsigned char *)tmp; + memcpy((*buf) + len, chunk, n); + len += n; + } + + return len; +} /* * Creates a set of ed25519 key pairs on disk. @@ -85,23 +109,31 @@ createkeypair(const char *alias) int sign(FILE *fp, FILE *key) { - size_t len, siz = 0; - char tmp[64], *base64; + size_t len; + char *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); - } + if (!fread(priv, 1, 64, key)) + return -1; + + len = bufferize(&msg, fp); + if (len == 0) + return -1; - fread(priv, 1, 64, key); - ed25519_sign(sig, msg, siz, priv); + ed25519_sign(sig, msg, len, priv); - len = base64_encode(&base64, sig, 64); - fwrite(msg, 1, siz, stdout); + /* write buffer to stdout .. */ + fwrite(msg, 1, len, stdout); + free(msg); + + /* .. followed by the signature delimiter .. */ fwrite(SIGBEGIN, 1, sizeof(SIGBEGIN), stdout); + + /* .. then the base64 encoded signature .. */ + len = base64_encode(&base64, sig, 64); base64_fold(stdout, base64, len, 0); + + /* .. and the final signature delimiter! */ fwrite(SIGEND, 1, sizeof(SIGEND), stdout); return 0;