X-Git-Url: http://erislabs.net/gitweb/?a=blobdiff_plain;f=lib%2Fmd2.c;h=e5d306f8fc27c452212ce244eeb38118a3892ba7;hb=23eecb48e39afd0d267d64d40ba6bf97aa865e13;hp=787b76693b8f8ed41d56ed3a0ad6f0339de86c4d;hpb=c5d8261e0e5c4675b6238af2f25cad968b94d8c8;p=gnulib.git diff --git a/lib/md2.c b/lib/md2.c index 787b76693..e5d306f8f 100644 --- a/lib/md2.c +++ b/lib/md2.c @@ -1,7 +1,7 @@ /* 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,1996,1997,1999,2000,2001,2002,2003,2005 - Free Software Foundation, Inc. + Copyright (C) 1995-1997, 1999-2003, 2005-2006, 2008-2013 Free Software + Foundation, Inc. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the @@ -14,18 +14,16 @@ GNU General Public License for more details. You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software Foundation, - Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ + along with this program; if not, see . */ /* Adapted by Simon Josefsson from public domain Libtomcrypt 1.06 by Tom St Denis. */ -#ifdef HAVE_CONFIG_H -# include -#endif +#include #include "md2.h" +#include #include #include @@ -35,7 +33,7 @@ # include "unlocked-io.h" #endif -#define BLOCKSIZE 4096 +#define BLOCKSIZE 32768 #if BLOCKSIZE % 64 != 0 # error "invalid BLOCKSIZE" #endif @@ -55,10 +53,7 @@ md2_init_ctx (struct md2_ctx *ctx) } /* Put result from CTX in first 16 bytes following RESBUF. The result - must be in little endian byte order. - - IMPORTANT: On some systems it is required that RESBUF is correctly - aligned for a 32 bits value. */ + must be in little endian byte order. */ void * md2_read_ctx (const struct md2_ctx *ctx, void *resbuf) { @@ -68,10 +63,7 @@ md2_read_ctx (const struct md2_ctx *ctx, void *resbuf) } /* Process the remaining bytes in the internal buffer and the usual - prolog according to the standard and write the result to RESBUF. - - IMPORTANT: On some systems it is required that RESBUF is correctly - aligned for a 32 bits value. */ + prolog according to the standard and write the result to RESBUF. */ void * md2_finish_ctx (struct md2_ctx *ctx, void *resbuf) { @@ -102,9 +94,12 @@ int md2_stream (FILE *stream, void *resblock) { struct md2_ctx ctx; - char buffer[BLOCKSIZE + 72]; size_t sum; + char *buffer = malloc (BLOCKSIZE + 72); + if (!buffer) + return 1; + /* Initialize the computation context. */ md2_init_ctx (&ctx); @@ -119,30 +114,33 @@ md2_stream (FILE *stream, void *resblock) /* 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)) - 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; - } + { + 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 @@ -158,6 +156,7 @@ process_partial_block:; /* Construct result in desired memory. */ md2_finish_ctx (&ctx, resblock); + free (buffer); return 0; } @@ -196,11 +195,11 @@ md2_process_bytes (const void *buffer, size_t len, struct md2_ctx *ctx) /* is 16 bytes full? */ if (ctx->curlen == 16) - { - md2_compress (ctx); - md2_update_chksum (ctx); - ctx->curlen = 0; - } + { + md2_compress (ctx); + md2_update_chksum (ctx); + ctx->curlen = 0; + } } } @@ -260,9 +259,9 @@ md2_compress (struct md2_ctx *ctx) for (j = 0; j < 18; j++) { for (k = 0; k < 48; k++) - { - t = (ctx->X[k] ^= PI_SUBST[(int) (t & 255)]); - } + { + t = (ctx->X[k] ^= PI_SUBST[(int) (t & 255)]); + } t = (t + (unsigned char) j) & 255; } }