From 1cae2a35d45acdfc2c094f64fd3344c01f815673 Mon Sep 17 00:00:00 2001 From: Bruno Haible Date: Sun, 19 Sep 2021 01:29:33 +0200 Subject: 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. --- ChangeLog | 10 +++++ lib/md2-stream.c | 109 ++++++++++++++++++++++++++++++++++++++++++++++ lib/md2.c | 84 +---------------------------------- lib/md2.h | 12 ++--- modules/crypto/md2 | 8 ++-- modules/crypto/md2-buffer | 24 ++++++++++ 6 files changed, 154 insertions(+), 93 deletions(-) create mode 100644 lib/md2-stream.c create mode 100644 modules/crypto/md2-buffer diff --git a/ChangeLog b/ChangeLog index 61a7e58e04..ed35ce693b 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,13 @@ +2021-09-18 Bruno Haible + + 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 string, wchar: Don't cause link errors for rpl_free (regr. 2021-09-07). 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 . */ + +/* Adapted by Simon Josefsson from public domain Libtomcrypt 1.06 by + Tom St Denis. */ + +#include + +/* Specification. */ +#include "md2.h" + +#include + +#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; +} diff --git a/lib/md2.c b/lib/md2.c index 85b4d20291..5dc8119779 100644 --- a/lib/md2.c +++ b/lib/md2.c @@ -21,23 +21,14 @@ #include +/* Specification. */ #include "md2.h" -#include #include #include #include -#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 diff --git a/lib/md2.h b/lib/md2.h index 078756a007..f85799590a 100644 --- a/lib/md2.h +++ b/lib/md2.h @@ -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 -- cgit v1.2.1