]> Savannah Git Hosting - gnulib.git/commitdiff
md4-buffer: New module.
authorBruno Haible <bruno@clisp.org>
Sat, 18 Sep 2021 23:32:01 +0000 (01:32 +0200)
committerBruno Haible <bruno@clisp.org>
Sat, 18 Sep 2021 23:32:37 +0000 (01:32 +0200)
* 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
lib/md4-stream.c [new file with mode: 0644]
lib/md4.c
lib/md4.h
modules/crypto/md4
modules/crypto/md4-buffer [new file with mode: 0644]

index 43f605b3adf681e643ecf60faf3208af543152f0..5ee0f7f1c1bbb9d6eb41d53731fb1896caead779 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,13 @@
+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.
diff --git a/lib/md4-stream.c b/lib/md4-stream.c
new file mode 100644 (file)
index 0000000..aba665a
--- /dev/null
@@ -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;
+}
index ae2c29b4b17e2dca8c71b90ac68382413b7a4317..464063194b179f44238b381fcca2119a566ea943 100644 (file)
--- a/lib/md4.c
+++ b/lib/md4.c
 
 #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)
 # 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
index 4ece10164e4584c819206b2fa47a0ce0ed1f522a..1f5e426c1cf374a0c69c499e00fe20654012bd2c 100644 (file)
--- 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
index f5a5f160ed88765716efab8d5c3bbd2e5ca40b3b..66c67dcf6c381e426adf6c839666aa971c7a3e23 100644 (file)
@@ -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 (file)
index 0000000..f5a5f16
--- /dev/null
@@ -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