diff options
author | Paul Eggert <eggert@cs.ucla.edu> | 2018-05-05 19:39:37 -0700 |
---|---|---|
committer | Paul Eggert <eggert@cs.ucla.edu> | 2018-05-05 19:40:03 -0700 |
commit | 7cdcfaad536a02b90be6c2104ac4a38bf620bbd1 (patch) | |
tree | feea4aed3e319c18463233a51da102e77da3ce71 /lib/sha512.c | |
parent | a80d295ef2b25462b36c1c401653a0fe33cb3a0d (diff) | |
download | gnulib-7cdcfaad536a02b90be6c2104ac4a38bf620bbd1.tar.gz |
crypto/{md5,sha1,sha256,sha512}: simplify
* lib/md5.c (md5_stream):
* lib/sha1.c (sha1_stream):
* lib/sha256.c (shaxxx_stream):
Simplify, partly by assuming C99.
* lib/sha256.c (shaxxx_stream):
New function, which implements both sha256 and sha224.
Simplify, partly by assuming C99.
(sha256_stream, sha224_stream):
Use it to avoid code duplication, removing a FIXME.
* lib/sha512.c (shaxxx_stream, sha512_stream, sha384_stream):
Likewise.
Diffstat (limited to 'lib/sha512.c')
-rw-r--r-- | lib/sha512.c | 122 |
1 files changed, 26 insertions, 96 deletions
diff --git a/lib/sha512.c b/lib/sha512.c index 7a0234828b..af0776c728 100644 --- a/lib/sha512.c +++ b/lib/sha512.c @@ -179,31 +179,28 @@ sha384_finish_ctx (struct sha512_ctx *ctx, void *resbuf) } #endif -/* Compute SHA512 message digest for bytes read from STREAM. The - resulting message digest number will be written into the 64 bytes - beginning at RESBLOCK. */ +/* Compute message digest for bytes read from STREAM using algorithm ALG. + Write the message digest into RESBLOCK, which contains HASHLEN bytes. + The initial and finishing operations are INIT_CTX and FINISH_CTX. + Return zero if and only if successful. */ int -sha512_stream (FILE *stream, void *resblock) +shaxxx_stream (FILE *stream, char const *alg, void *resblock, + ssize_t hashlen, void (*init_ctx) (struct sha512_ctx *), + void *(*finish_ctx) (struct sha512_ctx *, void *)) { - struct sha512_ctx ctx; - size_t sum; - char *buffer; - - { - int ret = afalg_stream (stream, "sha512", resblock, SHA512_DIGEST_SIZE); - if (!ret) - return 0; - - if (ret == -EIO) - return 1; - } + switch (afalg_stream (stream, alg, resblock, hashlen)) + { + case 0: return 0; + case -EIO: return 1; + } - buffer = malloc (BLOCKSIZE + 72); + char *buffer = malloc (BLOCKSIZE + 72); if (!buffer) return 1; - /* Initialize the computation context. */ - sha512_init_ctx (&ctx); + struct sha512_ctx ctx; + init_ctx (&ctx); + size_t sum; /* Iterate over full file contents. */ while (1) @@ -257,90 +254,23 @@ sha512_stream (FILE *stream, void *resblock) sha512_process_bytes (buffer, sum, &ctx); /* Construct result in desired memory. */ - sha512_finish_ctx (&ctx, resblock); + finish_ctx (&ctx, resblock); free (buffer); return 0; } -/* FIXME: Avoid code duplication */ int -sha384_stream (FILE *stream, void *resblock) +sha512_stream (FILE *stream, void *resblock) { - struct sha512_ctx ctx; - size_t sum; - char *buffer; - - { - int ret = afalg_stream(stream, "sha384", resblock, SHA384_DIGEST_SIZE); - if (!ret) - return 0; - - if (ret == -EIO) - return 1; - } - - buffer = malloc (BLOCKSIZE + 72); - if (!buffer) - return 1; - - /* Initialize the computation context. */ - sha384_init_ctx (&ctx); - - /* Iterate over full file contents. */ - while (1) - { - /* We read the file in blocks of BLOCKSIZE bytes. One call of the - computation function processes the whole buffer so that with the - next round of the loop another block can be read. */ - size_t n; - sum = 0; - - /* Read block. Take care for partial reads. */ - while (1) - { - n = fread (buffer + sum, 1, BLOCKSIZE - sum, stream); - - sum += n; - - if (sum == BLOCKSIZE) - break; - - if (n == 0) - { - /* Check for the error flag IFF N == 0, so that we don't - exit the loop after a partial read due to e.g., EAGAIN - or EWOULDBLOCK. */ - if (ferror (stream)) - { - free (buffer); - return 1; - } - goto process_partial_block; - } - - /* We've read at least one byte, so ignore errors. But always - check for EOF, since feof may be true even though N > 0. - Otherwise, we could end up calling fread after EOF. */ - if (feof (stream)) - goto process_partial_block; - } - - /* Process buffer with BLOCKSIZE bytes. Note that - BLOCKSIZE % 128 == 0 - */ - sha512_process_block (buffer, BLOCKSIZE, &ctx); - } - - process_partial_block:; - - /* Process any remaining bytes. */ - if (sum > 0) - sha512_process_bytes (buffer, sum, &ctx); + return shaxxx_stream (stream, "sha512", resblock, SHA512_DIGEST_SIZE, + sha512_init_ctx, sha512_finish_ctx); +} - /* Construct result in desired memory. */ - sha384_finish_ctx (&ctx, resblock); - free (buffer); - return 0; +int +sha384_stream (FILE *stream, void *resblock) +{ + return shaxxx_stream (stream, "sha384", resblock, SHA384_DIGEST_SIZE, + sha384_init_ctx, sha384_finish_ctx); } #if ! HAVE_OPENSSL_SHA512 |