summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBruno Haible <bruno@clisp.org>2021-09-19 01:32:01 +0200
committerBruno Haible <bruno@clisp.org>2021-09-19 01:32:37 +0200
commitfc0ce037c0a3787319b606f414494c1d62c0accd (patch)
treef9bb44f94972999cd1aa525ac29587877a62a188
parent341e0c26819ce4c1a26b95b3c780bed88036d211 (diff)
downloadgnulib-fc0ce037c0a3787319b606f414494c1d62c0accd.tar.gz
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.
-rw-r--r--ChangeLog10
-rw-r--r--lib/md4-stream.c109
-rw-r--r--lib/md4.c84
-rw-r--r--lib/md4.h12
-rw-r--r--modules/crypto/md412
-rw-r--r--modules/crypto/md4-buffer28
6 files changed, 158 insertions, 97 deletions
diff --git a/ChangeLog b/ChangeLog
index 43f605b3ad..5ee0f7f1c1 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,15 @@
2021-09-18 Bruno Haible <bruno@clisp.org>
+ 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 <bruno@clisp.org>
+
md2-buffer tests: New module.
* tests/test-md2-buffer.c: Renamed from tests/test-md2.c.
* modules/crypto/md2-buffer-tests: Renamed from
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 <https://www.gnu.org/licenses/>. */
+
+/* Adapted by Simon Josefsson from gnulib md5.? and Libgcrypt
+ cipher/md4.c . */
+
+#include <config.h>
+
+/* Specification. */
+#include "md4.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 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 <config.h>
+/* Specification. */
#include "md4.h"
#include <stdalign.h>
#include <stdint.h>
-#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
-#if USE_UNLOCKED_IO
-# include "unlocked-io.h"
-#endif
-
#include <byteswap.h>
#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