From fc0ce037c0a3787319b606f414494c1d62c0accd Mon Sep 17 00:00:00 2001 From: Bruno Haible Date: Sun, 19 Sep 2021 01:32:01 +0200 Subject: md4-buffer: New module. * lib/md4-stream.c: New file, extracted from lib/md4.c. * lib/md4.c: Don't include stdlib.h, unlocked-io.h. (BLOCKSIZE, md4_stream): Moved to md4-stream.c. * lib/md4.h: Reorder declarations. * modules/crypto/md4-buffer: New file, based on modules/crypto/md4. * modules/crypto/md4: Rewritten. --- ChangeLog | 10 +++++ lib/md4-stream.c | 109 ++++++++++++++++++++++++++++++++++++++++++++++ lib/md4.c | 84 +---------------------------------- lib/md4.h | 12 ++--- modules/crypto/md4 | 12 ++--- modules/crypto/md4-buffer | 28 ++++++++++++ 6 files changed, 158 insertions(+), 97 deletions(-) create mode 100644 lib/md4-stream.c create mode 100644 modules/crypto/md4-buffer diff --git a/ChangeLog b/ChangeLog index 43f605b3ad..5ee0f7f1c1 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,13 @@ +2021-09-18 Bruno Haible + + md4-buffer: New module. + * lib/md4-stream.c: New file, extracted from lib/md4.c. + * lib/md4.c: Don't include stdlib.h, unlocked-io.h. + (BLOCKSIZE, md4_stream): Moved to md4-stream.c. + * lib/md4.h: Reorder declarations. + * modules/crypto/md4-buffer: New file, based on modules/crypto/md4. + * modules/crypto/md4: Rewritten. + 2021-09-18 Bruno Haible md2-buffer tests: New module. diff --git a/lib/md4-stream.c b/lib/md4-stream.c new file mode 100644 index 0000000000..aba665aad2 --- /dev/null +++ b/lib/md4-stream.c @@ -0,0 +1,109 @@ +/* Functions to compute MD4 message digest of files or memory blocks. + according to the definition of MD4 in RFC 1320 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 . */ + +/* Adapted by Simon Josefsson from gnulib md5.? and Libgcrypt + cipher/md4.c . */ + +#include + +/* Specification. */ +#include "md4.h" + +#include + +#if USE_UNLOCKED_IO +# include "unlocked-io.h" +#endif + +#define BLOCKSIZE 32768 +#if BLOCKSIZE % 64 != 0 +# error "invalid BLOCKSIZE" +#endif + +/* Compute MD4 message digest for bytes read from STREAM. The + resulting message digest number will be written into the 16 bytes + beginning at RESBLOCK. */ +int +md4_stream (FILE * stream, void *resblock) +{ + struct md4_ctx ctx; + size_t sum; + + char *buffer = malloc (BLOCKSIZE + 72); + if (!buffer) + return 1; + + /* Initialize the computation context. */ + md4_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 + */ + md4_process_block (buffer, BLOCKSIZE, &ctx); + } + +process_partial_block:; + + /* Process any remaining bytes. */ + if (sum > 0) + md4_process_bytes (buffer, sum, &ctx); + + /* Construct result in desired memory. */ + md4_finish_ctx (&ctx, resblock); + free (buffer); + return 0; +} diff --git a/lib/md4.c b/lib/md4.c index ae2c29b4b1..464063194b 100644 --- a/lib/md4.c +++ b/lib/md4.c @@ -21,18 +21,14 @@ #include +/* Specification. */ #include "md4.h" #include #include -#include #include #include -#if USE_UNLOCKED_IO -# include "unlocked-io.h" -#endif - #include #ifdef WORDS_BIGENDIAN # define SWAP(n) bswap_32 (n) @@ -40,11 +36,6 @@ # define SWAP(n) (n) #endif -#define BLOCKSIZE 32768 -#if BLOCKSIZE % 64 != 0 -# error "invalid BLOCKSIZE" -#endif - /* This array contains the bytes used to pad the buffer to the next 64-byte boundary. (RFC 1320, 3.1: Step 1) */ static const unsigned char fillbuf[64] = { 0x80, 0 /* , 0, 0, ... */ }; @@ -115,79 +106,6 @@ md4_finish_ctx (struct md4_ctx *ctx, void *resbuf) return md4_read_ctx (ctx, resbuf); } -/* Compute MD4 message digest for bytes read from STREAM. The - resulting message digest number will be written into the 16 bytes - beginning at RESBLOCK. */ -int -md4_stream (FILE * stream, void *resblock) -{ - struct md4_ctx ctx; - size_t sum; - - char *buffer = malloc (BLOCKSIZE + 72); - if (!buffer) - return 1; - - /* Initialize the computation context. */ - md4_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 - */ - md4_process_block (buffer, BLOCKSIZE, &ctx); - } - -process_partial_block:; - - /* Process any remaining bytes. */ - if (sum > 0) - md4_process_bytes (buffer, sum, &ctx); - - /* Construct result in desired memory. */ - md4_finish_ctx (&ctx, resblock); - free (buffer); - return 0; -} - /* Compute MD4 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 diff --git a/lib/md4.h b/lib/md4.h index 4ece10164e..1f5e426c1c 100644 --- a/lib/md4.h +++ b/lib/md4.h @@ -72,11 +72,6 @@ extern void *md4_finish_ctx (struct md4_ctx *ctx, void *restrict resbuf); extern void *md4_read_ctx (const struct md4_ctx *ctx, void *restrict resbuf); -/* Compute MD4 message digest for bytes read from STREAM. The - resulting message digest number will be written into the 16 bytes - beginning at RESBLOCK. */ -extern int md4_stream (FILE * stream, void *resblock); - /* Compute MD4 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 @@ -84,6 +79,13 @@ extern int md4_stream (FILE * stream, void *resblock); extern void *md4_buffer (const char *buffer, size_t len, void *restrict resblock); + +/* Compute MD4 message digest for bytes read from STREAM. The + resulting message digest number will be written into the 16 bytes + beginning at RESBLOCK. */ +extern int md4_stream (FILE * stream, void *resblock); + + # ifdef __cplusplus } # endif diff --git a/modules/crypto/md4 b/modules/crypto/md4 index f5a5f160ed..66c67dcf6c 100644 --- a/modules/crypto/md4 +++ b/modules/crypto/md4 @@ -2,21 +2,15 @@ Description: Compute MD4 checksum. Files: -lib/md4.h -lib/md4.c -m4/md4.m4 +lib/md4-stream.c Depends-on: -byteswap -stdalign -stdint +crypto/md4-buffer configure.ac: -AC_REQUIRE([AC_C_RESTRICT]) -gl_MD4 Makefile.am: -lib_SOURCES += md4.c +lib_SOURCES += md4-stream.c Include: "md4.h" diff --git a/modules/crypto/md4-buffer b/modules/crypto/md4-buffer new file mode 100644 index 0000000000..f5a5f160ed --- /dev/null +++ b/modules/crypto/md4-buffer @@ -0,0 +1,28 @@ +Description: +Compute MD4 checksum. + +Files: +lib/md4.h +lib/md4.c +m4/md4.m4 + +Depends-on: +byteswap +stdalign +stdint + +configure.ac: +AC_REQUIRE([AC_C_RESTRICT]) +gl_MD4 + +Makefile.am: +lib_SOURCES += md4.c + +Include: +"md4.h" + +License: +LGPLv2+ + +Maintainer: +Simon Josefsson -- cgit v1.2.1