Simon Josefsson <[EMAIL PROTECTED]> writes: > Jim Meyering <[EMAIL PROTECTED]> writes: > >> Simon Josefsson <[EMAIL PROTECTED]> wrote: >>> Let's not wait for glibc to install my patch... What do you think >>> about installing the following in gnulib now? It would sync gnulib >>> with my proposed libc-patch. It also fixes the sha1 module to be >>> standalone. >> >> I like it. Thanks for the clean-up. >> I suppose you've done at least a little portability testing? > > No. I'll do that next. I can't test the sha1 module easily right now > though.
I have tested the md5 module through GNU SASL on several platforms, and the sha1 module through gc-hmac-sha1 on Debian. >> A quick glance through the diffs showed only one nit: >> >>> - IMPORTANT: On some systems it is required that RESBUF be correctly >>> + IMPORTANT: On some systems it is required that RESBUF is correctly >>> aligned for a 32 bits value. */ >> >> Please don't make that change. >> Using `be' there is actually correct, but the sentence >> should be changed. How about this instead? >> >> IMPORTANT: On some systems, RESBUF must be aligned to a 32-bit boundary. > > I have fixed my local copy, and updated the glibc bug report. The glibc maintainers didn't accept this patch, see: http://sourceware.org/bugzilla/show_bug.cgi?id=1439 Ok to install the following? The glibc bug is linked in config/srclist.txt for future archeological expeditions. Thanks. Index: m4/ChangeLog =================================================================== RCS file: /cvsroot/gnulib/gnulib/m4/ChangeLog,v retrieving revision 1.743 diff -u -p -r1.743 ChangeLog --- m4/ChangeLog 15 Oct 2005 18:21:58 -0000 1.743 +++ m4/ChangeLog 17 Oct 2005 11:05:13 -0000 @@ -1,3 +1,7 @@ +2005-10-11 Simon Josefsson <[EMAIL PROTECTED]> + + * md5.m4: Remove call to uint32_t.m4. + 2005-10-15 Simon Josefsson <[EMAIL PROTECTED]> * rijndael.m4: New file. Index: m4/md5.m4 =================================================================== RCS file: /cvsroot/gnulib/gnulib/m4/md5.m4,v retrieving revision 1.6 diff -u -p -r1.6 md5.m4 --- m4/md5.m4 21 Mar 2005 22:06:27 -0000 1.6 +++ m4/md5.m4 17 Oct 2005 11:05:13 -0000 @@ -1,4 +1,4 @@ -# md5.m4 serial 7 +# md5.m4 serial 8 dnl Copyright (C) 2002, 2003, 2004, 2005 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, @@ -8,9 +8,6 @@ AC_DEFUN([gl_MD5], [ AC_LIBSOURCES([md5.c, md5.h]) AC_LIBOBJ([md5]) - - dnl Prerequisites of lib/md5.h. - AC_REQUIRE([gl_AC_TYPE_UINT32_T]) dnl Prerequisites of lib/md5.c. AC_REQUIRE([AC_C_BIGENDIAN]) Index: lib/ChangeLog =================================================================== RCS file: /cvsroot/gnulib/gnulib/lib/ChangeLog,v retrieving revision 1.1014 diff -u -p -r1.1014 ChangeLog --- lib/ChangeLog 15 Oct 2005 18:21:58 -0000 1.1014 +++ lib/ChangeLog 17 Oct 2005 11:05:14 -0000 @@ -1,3 +1,14 @@ +2005-10-17 Simon Josefsson <[EMAIL PROTECTED]> + + * sha1.c: Use uint32_t instead of md5_uint32.t + + * sha1.h: Use stdint.h and uint32_t instead of md5_uint32 from + md5.h. + + * md5.c: Use uin32_t. Fix non-gcc UNALIGNED_P macro. + + * md5.h: Use stdint.h and uint32_t. Doc fix. + 2005-10-15 Simon Josefsson <[EMAIL PROTECTED]> * rijndael-api-fst.h, rijndael-api-fst.c: New files. Index: lib/md5.c =================================================================== RCS file: /cvsroot/gnulib/gnulib/lib/md5.c,v retrieving revision 1.20 diff -u -p -r1.20 md5.c --- lib/md5.c 12 Sep 2005 22:05:16 -0000 1.20 +++ lib/md5.c 17 Oct 2005 11:05:14 -0000 @@ -1,8 +1,8 @@ -/* md5.c - Functions to compute MD5 message digest of files or memory blocks +/* Functions to compute MD5 message digest of files or memory blocks. according to the definition of MD5 in RFC 1321 from April 1992. - Copyright (C) 1995, 1996, 2001, 2003, 2004, 2005 Free Software Foundation, Inc. - NOTE: The canonical source of this file is maintained with the GNU C - Library. Bugs can be reported to [EMAIL PROTECTED] + Copyright (C) 1995,1996,1997,1999,2000,2001,2005 + Free Software Foundation, Inc. + This file is part of the GNU C Library. 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 @@ -27,7 +27,9 @@ #include "md5.h" #include <stddef.h> +#include <stdlib.h> #include <string.h> +#include <sys/types.h> #if USE_UNLOCKED_IO # include "unlocked-io.h" @@ -88,10 +90,10 @@ md5_init_ctx (struct md5_ctx *ctx) void * md5_read_ctx (const struct md5_ctx *ctx, void *resbuf) { - ((md5_uint32 *) resbuf)[0] = SWAP (ctx->A); - ((md5_uint32 *) resbuf)[1] = SWAP (ctx->B); - ((md5_uint32 *) resbuf)[2] = SWAP (ctx->C); - ((md5_uint32 *) resbuf)[3] = SWAP (ctx->D); + ((uint32_t *) resbuf)[0] = SWAP (ctx->A); + ((uint32_t *) resbuf)[1] = SWAP (ctx->B); + ((uint32_t *) resbuf)[2] = SWAP (ctx->C); + ((uint32_t *) resbuf)[3] = SWAP (ctx->D); return resbuf; } @@ -105,7 +107,7 @@ void * md5_finish_ctx (struct md5_ctx *ctx, void *resbuf) { /* Take yet unprocessed bytes into account. */ - md5_uint32 bytes = ctx->buflen; + uint32_t bytes = ctx->buflen; size_t pad; /* Now count remaining bytes. */ @@ -117,8 +119,8 @@ md5_finish_ctx (struct md5_ctx *ctx, voi memcpy (&ctx->buffer[bytes], fillbuf, pad); /* Put the 64-bit file length in *bits* at the end of the buffer. */ - *(md5_uint32 *) &ctx->buffer[bytes + pad] = SWAP (ctx->total[0] << 3); - *(md5_uint32 *) &ctx->buffer[bytes + pad + 4] = SWAP ((ctx->total[1] << 3) | + *(uint32_t *) &ctx->buffer[bytes + pad] = SWAP (ctx->total[0] << 3); + *(uint32_t *) &ctx->buffer[bytes + pad + 4] = SWAP ((ctx->total[1] << 3) | (ctx->total[0] >> 29)); /* Process last bytes. */ @@ -244,8 +246,14 @@ md5_process_bytes (const void *buffer, s if (len >= 64) { #if !_STRING_ARCH_unaligned -# define alignof(type) offsetof (struct { char c; type x; }, x) -# define UNALIGNED_P(p) (((size_t) p) % alignof (md5_uint32) != 0) +/* To check alignment gcc has an appropriate operator. Other + compilers don't. */ +# if __GNUC__ >= 2 +# define UNALIGNED_P(p) (((uintptr_t) p) % __alignof__ (uint32_t) != 0) +# else +# define alignof(type) offsetof (struct { char c; type x; }, x) +# define UNALIGNED_P(p) (((size_t) p) % alignof (uint32_t) != 0) +# endif if (UNALIGNED_P (buffer)) while (len > 64) { @@ -295,14 +303,14 @@ md5_process_bytes (const void *buffer, s void md5_process_block (const void *buffer, size_t len, struct md5_ctx *ctx) { - md5_uint32 correct_words[16]; - const md5_uint32 *words = buffer; - size_t nwords = len / sizeof (md5_uint32); - const md5_uint32 *endp = words + nwords; - md5_uint32 A = ctx->A; - md5_uint32 B = ctx->B; - md5_uint32 C = ctx->C; - md5_uint32 D = ctx->D; + uint32_t correct_words[16]; + const uint32_t *words = buffer; + size_t nwords = len / sizeof (uint32_t); + const uint32_t *endp = words + nwords; + uint32_t A = ctx->A; + uint32_t B = ctx->B; + uint32_t C = ctx->C; + uint32_t D = ctx->D; /* First increment the byte count. RFC 1321 specifies the possible length of the file up to 2^64 bits. Here we only compute the @@ -315,11 +323,11 @@ md5_process_block (const void *buffer, s the loop. */ while (words < endp) { - md5_uint32 *cwp = correct_words; - md5_uint32 A_save = A; - md5_uint32 B_save = B; - md5_uint32 C_save = C; - md5_uint32 D_save = D; + uint32_t *cwp = correct_words; + uint32_t A_save = A; + uint32_t B_save = B; + uint32_t C_save = C; + uint32_t D_save = D; /* First round: using the given function, the context and a constant the next context is computed. Because the algorithms processing @@ -375,7 +383,7 @@ md5_process_block (const void *buffer, s argument specifying the function to use. */ #undef OP #define OP(f, a, b, c, d, k, s, T) \ - do \ + do \ { \ a += f (b, c, d) + correct_words[k] + T; \ CYCLIC (a, s); \ Index: lib/md5.h =================================================================== RCS file: /cvsroot/gnulib/gnulib/lib/md5.h,v retrieving revision 1.18 diff -u -p -r1.18 md5.h --- lib/md5.h 5 Oct 2005 13:54:42 -0000 1.18 +++ lib/md5.h 17 Oct 2005 11:05:14 -0000 @@ -1,9 +1,8 @@ /* Declaration of functions and data types used for MD5 sum computing library functions. - Copyright (C) 1995-1997,1999-2005 Free Software Foundation, Inc. - - NOTE: The canonical source of this file is maintained with the GNU C - Library. Bugs can be reported to [EMAIL PROTECTED] + Copyright (C) 1995-1997,1999,2000,2001,2004,2005 + Free Software Foundation, Inc. + This file is part of the GNU C Library. 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 @@ -23,18 +22,15 @@ #define _MD5_H 1 #include <stdio.h> +#include <stdint.h> -#if HAVE_INTTYPES_H -# include <inttypes.h> -#endif -#if HAVE_STDINT_H || _LIBC -# include <stdint.h> -#endif +#define MD5_DIGEST_SIZE 16 +#define MD5_BLOCK_SIZE 64 #ifndef __GNUC_PREREQ # if defined __GNUC__ && defined __GNUC_MINOR__ -# define __GNUC_PREREQ(maj, min) \ - ((__GNUC__ << 16) + __GNUC_MINOR__ >= ((maj) << 16) + (min)) +# define __GNUC_PREREQ(maj, min) \ + ((__GNUC__ << 16) + __GNUC_MINOR__ >= ((maj) << 16) + (min)) # else # define __GNUC_PREREQ(maj, min) 0 # endif @@ -64,22 +60,17 @@ # define __md5_stream md5_stream #endif -#define MD5_DIGEST_SIZE 16 -#define MD5_BLOCK_SIZE 64 - -typedef uint32_t md5_uint32; - /* Structure to save state of computation between the single steps. */ struct md5_ctx { - md5_uint32 A; - md5_uint32 B; - md5_uint32 C; - md5_uint32 D; - - md5_uint32 total[2]; - md5_uint32 buflen; - char buffer[128] __attribute__ ((__aligned__ (__alignof__ (md5_uint32)))); + uint32_t A; + uint32_t B; + uint32_t C; + uint32_t D; + + uint32_t total[2]; + uint32_t buflen; + char buffer[128] __attribute__ ((__aligned__ (__alignof__ (uint32_t)))); }; /* @@ -110,8 +101,8 @@ extern void __md5_process_bytes (const v endian byte order, so that a byte-wise output yields to the wanted ASCII representation of the message digest. - IMPORTANT: On some systems it is required that RESBUF be correctly - aligned for a 32 bits value. */ + IMPORTANT: On some systems, RESBUF must be aligned to a 32-bit + boundary. */ extern void *__md5_finish_ctx (struct md5_ctx *ctx, void *resbuf) __THROW; @@ -119,8 +110,8 @@ extern void *__md5_finish_ctx (struct md always in little endian byte order, so that a byte-wise output yields to the wanted ASCII representation of the message digest. - IMPORTANT: On some systems it is required that RESBUF is correctly - aligned for a 32 bits value. */ + IMPORTANT: On some systems, RESBUF must be aligned to a 32-bit + boundary. */ extern void *__md5_read_ctx (const struct md5_ctx *ctx, void *resbuf) __THROW; Index: lib/sha1.c =================================================================== RCS file: /cvsroot/gnulib/gnulib/lib/sha1.c,v retrieving revision 1.4 diff -u -p -r1.4 sha1.c --- lib/sha1.c 12 Sep 2005 22:05:16 -0000 1.4 +++ lib/sha1.c 17 Oct 2005 11:05:14 -0000 @@ -81,11 +81,11 @@ sha1_init_ctx (struct sha1_ctx *ctx) void * sha1_read_ctx (const struct sha1_ctx *ctx, void *resbuf) { - ((md5_uint32 *) resbuf)[0] = SWAP (ctx->A); - ((md5_uint32 *) resbuf)[1] = SWAP (ctx->B); - ((md5_uint32 *) resbuf)[2] = SWAP (ctx->C); - ((md5_uint32 *) resbuf)[3] = SWAP (ctx->D); - ((md5_uint32 *) resbuf)[4] = SWAP (ctx->E); + ((uint32_t *) resbuf)[0] = SWAP (ctx->A); + ((uint32_t *) resbuf)[1] = SWAP (ctx->B); + ((uint32_t *) resbuf)[2] = SWAP (ctx->C); + ((uint32_t *) resbuf)[3] = SWAP (ctx->D); + ((uint32_t *) resbuf)[4] = SWAP (ctx->E); return resbuf; } @@ -99,7 +99,7 @@ void * sha1_finish_ctx (struct sha1_ctx *ctx, void *resbuf) { /* Take yet unprocessed bytes into account. */ - md5_uint32 bytes = ctx->buflen; + uint32_t bytes = ctx->buflen; size_t pad; /* Now count remaining bytes. */ @@ -111,8 +111,8 @@ sha1_finish_ctx (struct sha1_ctx *ctx, v memcpy (&ctx->buffer[bytes], fillbuf, pad); /* Put the 64-bit file length in *bits* at the end of the buffer. */ - *(md5_uint32 *) &ctx->buffer[bytes + pad + 4] = SWAP (ctx->total[0] << 3); - *(md5_uint32 *) &ctx->buffer[bytes + pad] = SWAP ((ctx->total[1] << 3) | + *(uint32_t *) &ctx->buffer[bytes + pad + 4] = SWAP (ctx->total[0] << 3); + *(uint32_t *) &ctx->buffer[bytes + pad] = SWAP ((ctx->total[1] << 3) | (ctx->total[0] >> 29)); /* Process last bytes. */ @@ -238,7 +238,7 @@ sha1_process_bytes (const void *buffer, { #if !_STRING_ARCH_unaligned # define alignof(type) offsetof (struct { char c; type x; }, x) -# define UNALIGNED_P(p) (((size_t) p) % alignof (md5_uint32) != 0) +# define UNALIGNED_P(p) (((size_t) p) % alignof (uint32_t) != 0) if (UNALIGNED_P (buffer)) while (len > 64) { @@ -293,15 +293,15 @@ sha1_process_bytes (const void *buffer, void sha1_process_block (const void *buffer, size_t len, struct sha1_ctx *ctx) { - const md5_uint32 *words = buffer; - size_t nwords = len / sizeof (md5_uint32); - const md5_uint32 *endp = words + nwords; - md5_uint32 x[16]; - md5_uint32 a = ctx->A; - md5_uint32 b = ctx->B; - md5_uint32 c = ctx->C; - md5_uint32 d = ctx->D; - md5_uint32 e = ctx->E; + const uint32_t *words = buffer; + size_t nwords = len / sizeof (uint32_t); + const uint32_t *endp = words + nwords; + uint32_t x[16]; + uint32_t a = ctx->A; + uint32_t b = ctx->B; + uint32_t c = ctx->C; + uint32_t d = ctx->D; + uint32_t e = ctx->E; /* First increment the byte count. RFC 1321 specifies the possible length of the file up to 2^64 bits. Here we only compute the @@ -325,7 +325,7 @@ sha1_process_block (const void *buffer, while (words < endp) { - md5_uint32 tm; + uint32_t tm; int t; for (t = 0; t < 16; t++) { Index: lib/sha1.h =================================================================== RCS file: /cvsroot/gnulib/gnulib/lib/sha1.h,v retrieving revision 1.3 diff -u -p -r1.3 sha1.h --- lib/sha1.h 12 Sep 2005 22:05:16 -0000 1.3 +++ lib/sha1.h 17 Oct 2005 11:05:14 -0000 @@ -20,20 +20,20 @@ # define SHA1_H 1 # include <stdio.h> -# include "md5.h" +# include <stdint.h> /* Structure to save state of computation between the single steps. */ struct sha1_ctx { - md5_uint32 A; - md5_uint32 B; - md5_uint32 C; - md5_uint32 D; - md5_uint32 E; + uint32_t A; + uint32_t B; + uint32_t C; + uint32_t D; + uint32_t E; - md5_uint32 total[2]; - md5_uint32 buflen; - char buffer[128] __attribute__ ((__aligned__ (__alignof__ (md5_uint32)))); + uint32_t total[2]; + uint32_t buflen; + char buffer[128] __attribute__ ((__aligned__ (__alignof__ (uint32_t)))); }; Index: ChangeLog =================================================================== RCS file: /cvsroot/gnulib/gnulib/ChangeLog,v retrieving revision 1.422 diff -u -p -r1.422 ChangeLog --- ChangeLog 17 Oct 2005 10:27:37 -0000 1.422 +++ ChangeLog 17 Oct 2005 11:05:14 -0000 @@ -1,3 +1,9 @@ +2005-10-17 Simon Josefsson <[EMAIL PROTECTED]> + + * modules/sha1: Depend on stdint instead of md5. + + * modules/md5: Depend on stdint, remove uint32_t. + 2005-10-16 Bruno Haible <[EMAIL PROTECTED]> * gnulib-tool (func_emit_tests_Makefile_am): Also define Index: modules/md5 =================================================================== RCS file: /cvsroot/gnulib/gnulib/modules/md5,v retrieving revision 1.8 diff -u -p -r1.8 md5 --- modules/md5 21 Mar 2005 22:07:25 -0000 1.8 +++ modules/md5 17 Oct 2005 11:05:14 -0000 @@ -5,9 +5,9 @@ Files: lib/md5.h lib/md5.c m4/md5.m4 -m4/uint32_t.m4 Depends-on: +stdint configure.ac: gl_MD5 Index: modules/sha1 =================================================================== RCS file: /cvsroot/gnulib/gnulib/modules/sha1,v retrieving revision 1.4 diff -u -p -r1.4 sha1 --- modules/sha1 21 Mar 2005 22:07:25 -0000 1.4 +++ modules/sha1 17 Oct 2005 11:05:14 -0000 @@ -7,7 +7,7 @@ lib/sha1.c m4/sha1.m4 Depends-on: -md5 +stdint configure.ac: gl_SHA1 _______________________________________________ bug-gnulib mailing list bug-gnulib@gnu.org http://lists.gnu.org/mailman/listinfo/bug-gnulib