diff options
author | Bruno Haible <bruno@clisp.org> | 2021-09-19 01:29:33 +0200 |
---|---|---|
committer | Bruno Haible <bruno@clisp.org> | 2021-09-19 01:29:33 +0200 |
commit | 1cae2a35d45acdfc2c094f64fd3344c01f815673 (patch) | |
tree | b9b0154f4d8444a236d507b1b3831aba31651adc | |
parent | 4bed390be8b146be3b4c73835b06f466871b931a (diff) | |
download | gnulib-1cae2a35d45acdfc2c094f64fd3344c01f815673.tar.gz |
md2-buffer: New module.
* lib/md2-stream.c: New file, extracted from lib/md2.c.
* lib/md2.c: Don't include stdlib.h, unlocked-io.h.
(BLOCKSIZE, md2_stream): Moved to md2-stream.c.
* lib/md2.h: Reorder declarations.
* modules/crypto/md2-buffer: New file, based on modules/crypto/md2.
* modules/crypto/md2: Rewritten.
-rw-r--r-- | ChangeLog | 10 | ||||
-rw-r--r-- | lib/md2-stream.c | 109 | ||||
-rw-r--r-- | lib/md2.c | 84 | ||||
-rw-r--r-- | lib/md2.h | 12 | ||||
-rw-r--r-- | modules/crypto/md2 | 8 | ||||
-rw-r--r-- | modules/crypto/md2-buffer | 24 |
6 files changed, 154 insertions, 93 deletions
@@ -1,5 +1,15 @@ 2021-09-18 Bruno Haible <bruno@clisp.org> + md2-buffer: New module. + * lib/md2-stream.c: New file, extracted from lib/md2.c. + * lib/md2.c: Don't include stdlib.h, unlocked-io.h. + (BLOCKSIZE, md2_stream): Moved to md2-stream.c. + * lib/md2.h: Reorder declarations. + * modules/crypto/md2-buffer: New file, based on modules/crypto/md2. + * modules/crypto/md2: Rewritten. + +2021-09-18 Bruno Haible <bruno@clisp.org> + string, wchar: Don't cause link errors for rpl_free (regr. 2021-09-07). * lib/string.in.h (free, rpl_free): Consider GNULIB_FREE_POSIX variable. * lib/wchar.in.h (free, rpl_free): Likewise. diff --git a/lib/md2-stream.c b/lib/md2-stream.c new file mode 100644 index 0000000000..83eb1d5974 --- /dev/null +++ b/lib/md2-stream.c @@ -0,0 +1,109 @@ +/* Functions to compute MD2 message digest of files or memory blocks. + according to the definition of MD2 in RFC 1319 from April 1992. + Copyright (C) 1995-1997, 1999-2003, 2005-2006, 2008-2021 Free Software + Foundation, Inc. + + This file is free software: you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as + published by the Free Software Foundation; either version 2.1 of the + License, or (at your option) any later version. + + This file is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this program. If not, see <https://www.gnu.org/licenses/>. */ + +/* Adapted by Simon Josefsson from public domain Libtomcrypt 1.06 by + Tom St Denis. */ + +#include <config.h> + +/* Specification. */ +#include "md2.h" + +#include <stdlib.h> + +#if USE_UNLOCKED_IO +# include "unlocked-io.h" +#endif + +#define BLOCKSIZE 32768 +#if BLOCKSIZE % 64 != 0 +# error "invalid BLOCKSIZE" +#endif + +/* Compute MD2 message digest for bytes read from STREAM. The + resulting message digest number will be written into the 16 bytes + beginning at RESBLOCK. */ +int +md2_stream (FILE *stream, void *resblock) +{ + struct md2_ctx ctx; + size_t sum; + + char *buffer = malloc (BLOCKSIZE + 72); + if (!buffer) + return 1; + + /* Initialize the computation context. */ + md2_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 % 64 == 0 + */ + md2_process_block (buffer, BLOCKSIZE, &ctx); + } + +process_partial_block:; + + /* Process any remaining bytes. */ + if (sum > 0) + md2_process_bytes (buffer, sum, &ctx); + + /* Construct result in desired memory. */ + md2_finish_ctx (&ctx, resblock); + free (buffer); + return 0; +} @@ -21,23 +21,14 @@ #include <config.h> +/* Specification. */ #include "md2.h" -#include <stdlib.h> #include <string.h> #include <sys/types.h> #include <minmax.h> -#if USE_UNLOCKED_IO -# include "unlocked-io.h" -#endif - -#define BLOCKSIZE 32768 -#if BLOCKSIZE % 64 != 0 -# error "invalid BLOCKSIZE" -#endif - static void md2_update_chksum (struct md2_ctx *md); static void md2_compress (struct md2_ctx *md); @@ -87,79 +78,6 @@ md2_finish_ctx (struct md2_ctx *ctx, void *resbuf) return md2_read_ctx (ctx, resbuf); } -/* Compute MD2 message digest for bytes read from STREAM. The - resulting message digest number will be written into the 16 bytes - beginning at RESBLOCK. */ -int -md2_stream (FILE *stream, void *resblock) -{ - struct md2_ctx ctx; - size_t sum; - - char *buffer = malloc (BLOCKSIZE + 72); - if (!buffer) - return 1; - - /* Initialize the computation context. */ - md2_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 % 64 == 0 - */ - md2_process_block (buffer, BLOCKSIZE, &ctx); - } - -process_partial_block:; - - /* Process any remaining bytes. */ - if (sum > 0) - md2_process_bytes (buffer, sum, &ctx); - - /* Construct result in desired memory. */ - md2_finish_ctx (&ctx, resblock); - free (buffer); - return 0; -} - /* Compute MD5 message digest for LEN bytes beginning at BUFFER. The result is always in little endian byte order, so that a byte-wise output yields to the wanted ASCII representation of the message @@ -66,11 +66,6 @@ extern void *md2_finish_ctx (struct md2_ctx *ctx, void *restrict resbuf); extern void *md2_read_ctx (const struct md2_ctx *ctx, void *restrict resbuf); -/* Compute MD2 message digest for bytes read from STREAM. The - resulting message digest number will be written into the 16 bytes - beginning at RESBLOCK. */ -extern int md2_stream (FILE *stream, void *resblock); - /* Compute MD2 message digest for LEN bytes beginning at BUFFER. The result is always in little endian byte order, so that a byte-wise output yields to the wanted ASCII representation of the message @@ -78,6 +73,13 @@ extern int md2_stream (FILE *stream, void *resblock); extern void *md2_buffer (const char *buffer, size_t len, void *restrict resblock); + +/* Compute MD2 message digest for bytes read from STREAM. The + resulting message digest number will be written into the 16 bytes + beginning at RESBLOCK. */ +extern int md2_stream (FILE *stream, void *resblock); + + # ifdef __cplusplus } # endif diff --git a/modules/crypto/md2 b/modules/crypto/md2 index d89eb9564c..da418bc3bc 100644 --- a/modules/crypto/md2 +++ b/modules/crypto/md2 @@ -2,17 +2,15 @@ Description: Compute MD2 checksum. Files: -lib/md2.h -lib/md2.c +lib/md2-stream.c Depends-on: -minmax +crypto/md2-buffer configure.ac: -AC_REQUIRE([AC_C_RESTRICT]) Makefile.am: -lib_SOURCES += md2.c +lib_SOURCES += md2-stream.c Include: "md2.h" diff --git a/modules/crypto/md2-buffer b/modules/crypto/md2-buffer new file mode 100644 index 0000000000..d89eb9564c --- /dev/null +++ b/modules/crypto/md2-buffer @@ -0,0 +1,24 @@ +Description: +Compute MD2 checksum. + +Files: +lib/md2.h +lib/md2.c + +Depends-on: +minmax + +configure.ac: +AC_REQUIRE([AC_C_RESTRICT]) + +Makefile.am: +lib_SOURCES += md2.c + +Include: +"md2.h" + +License: +LGPLv2+ + +Maintainer: +Simon Josefsson |