yann@1: --- glibc-2.1.3/md5-crypt/md5-crypt.c 2000/03/04 00:47:30 1.1 yann@1: +++ glibc-2.1.3/md5-crypt/md5-crypt.c 2000/08/24 06:10:02 1.8 yann@1: @@ -1,5 +1,5 @@ yann@1: /* One way encryption based on MD5 sum. yann@1: - Copyright (C) 1996, 1997, 1999 Free Software Foundation, Inc. yann@1: + Copyright (C) 1996, 1997, 1999, 2000 Free Software Foundation, Inc. yann@1: This file is part of the GNU C Library. yann@1: Contributed by Ulrich Drepper , 1996. yann@1: yann@1: @@ -18,6 +18,7 @@ yann@1: write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, yann@1: Boston, MA 02111-1307, USA. */ yann@1: yann@1: +#include yann@1: #include yann@1: #include yann@1: #include yann@1: @@ -37,9 +38,9 @@ yann@1: yann@1: yann@1: /* Prototypes for local functions. */ yann@1: -extern char *__md5_crypt_r __P ((const char *key, const char *salt, yann@1: - char *buffer, int buflen)); yann@1: -extern char *__md5_crypt __P ((const char *key, const char *salt)); yann@1: +extern char *__md5_crypt_r (const char *key, const char *salt, yann@1: + char *buffer, int buflen); yann@1: +extern char *__md5_crypt (const char *key, const char *salt); yann@1: yann@1: yann@1: /* This entry point is equivalent to the `crypt' function in Unix yann@1: @@ -51,13 +52,16 @@ yann@1: char *buffer; yann@1: int buflen; yann@1: { yann@1: - unsigned char alt_result[16]; yann@1: + unsigned char alt_result[16] yann@1: + __attribute__ ((__aligned__ (__alignof__ (md5_uint32)))); yann@1: struct md5_ctx ctx; yann@1: struct md5_ctx alt_ctx; yann@1: size_t salt_len; yann@1: size_t key_len; yann@1: size_t cnt; yann@1: char *cp; yann@1: + char *copied_key = NULL; yann@1: + char *copied_salt = NULL; yann@1: yann@1: /* Find beginning of salt string. The prefix should normally always yann@1: be present. Just in case it is not. */ yann@1: @@ -68,6 +72,26 @@ yann@1: salt_len = MIN (strcspn (salt, "$"), 8); yann@1: key_len = strlen (key); yann@1: yann@1: + if ((key - (char *) 0) % __alignof__ (md5_uint32) != 0) yann@1: + { yann@1: + char *tmp = (char *) alloca (key_len + __alignof__ (md5_uint32)); yann@1: + key = copied_key = yann@1: + memcpy (tmp + __alignof__ (md5_uint32) yann@1: + - (tmp - (char *) 0) % __alignof__ (md5_uint32), yann@1: + key, key_len); yann@1: + assert ((key - (char *) 0) % __alignof__ (md5_uint32) == 0); yann@1: + } yann@1: + yann@1: + if ((salt - (char *) 0) % __alignof__ (md5_uint32) != 0) yann@1: + { yann@1: + char *tmp = (char *) alloca (salt_len + __alignof__ (md5_uint32)); yann@1: + salt = copied_salt = yann@1: + memcpy (tmp + __alignof__ (md5_uint32) yann@1: + - (tmp - (char *) 0) % __alignof__ (md5_uint32), yann@1: + salt, salt_len); yann@1: + assert ((salt - (char *) 0) % __alignof__ (md5_uint32) == 0); yann@1: + } yann@1: + yann@1: /* Prepare for the real work. */ yann@1: __md5_init_ctx (&ctx); yann@1: yann@1: @@ -195,21 +219,30 @@ yann@1: yann@1: /* Clear the buffer for the intermediate result so that people yann@1: attaching to processes or reading core dumps cannot get any yann@1: - information. */ yann@1: - memset (alt_result, '\0', sizeof (alt_result)); yann@1: + information. We do it in this way to clear correct_words[] yann@1: + inside the MD5 implementation as well. */ yann@1: + __md5_init_ctx (&ctx); yann@1: + __md5_finish_ctx (&ctx, alt_result); yann@1: + memset (&ctx, '\0', sizeof (ctx)); yann@1: + memset (&alt_ctx, '\0', sizeof (alt_ctx)); yann@1: + if (copied_key != NULL) yann@1: + memset (copied_key, '\0', key_len); yann@1: + if (copied_salt != NULL) yann@1: + memset (copied_salt, '\0', salt_len); yann@1: yann@1: return buffer; yann@1: } yann@1: yann@1: yann@1: +static char *buffer; yann@1: + yann@1: char * yann@1: __md5_crypt (const char *key, const char *salt) yann@1: { yann@1: /* We don't want to have an arbitrary limit in the size of the yann@1: password. We can compute the size of the result in advance and yann@1: so we can prepare the buffer we pass to `md5_crypt_r'. */ yann@1: - static char *buffer = NULL; yann@1: - static int buflen = 0; yann@1: + static int buflen; yann@1: int needed = 3 + strlen (salt) + 1 + 26 + 1; yann@1: yann@1: if (buflen < needed) yann@1: @@ -220,4 +253,12 @@ yann@1: } yann@1: yann@1: return __md5_crypt_r (key, salt, buffer, buflen); yann@1: +} yann@1: + yann@1: + yann@1: +static void yann@1: +__attribute__ ((__destructor__)) yann@1: +free_mem (void) yann@1: +{ yann@1: + free (buffer); yann@1: } yann@1: --- glibc-2.1.3/md5-crypt/md5.c 2000/03/04 00:47:30 1.1 yann@1: +++ glibc-2.1.3/md5-crypt/md5.c 2000/07/04 18:22:44 1.2 yann@1: @@ -1,6 +1,6 @@ yann@1: -/* md5.c - Functions to compute MD5 message digest of files or memory blocks yann@1: +/* Functions to compute MD5 message digest of files or memory blocks. yann@1: according to the definition of MD5 in RFC 1321 from April 1992. yann@1: - Copyright (C) 1995, 1996, 1997, 1999 Free Software Foundation, Inc. yann@1: + Copyright (C) 1995, 1996, 1997, 1999, 2000 Free Software Foundation, Inc. yann@1: This file is part of the GNU C Library. yann@1: yann@1: The GNU C Library is free software; you can redistribute it and/or yann@1: @@ -217,6 +217,8 @@ yann@1: size_t len; yann@1: struct md5_ctx *ctx; yann@1: { yann@1: + //const void aligned_buffer = buffer; yann@1: + yann@1: /* When we already have some bits in our internal buffer concatenate yann@1: both inputs first. */ yann@1: if (ctx->buflen != 0) yann@1: @@ -224,16 +226,20 @@ yann@1: size_t left_over = ctx->buflen; yann@1: size_t add = 128 - left_over > len ? len : 128 - left_over; yann@1: yann@1: + /* Only put full words in the buffer. */ yann@1: + add -= add % __alignof__ (md5_uint32); yann@1: + yann@1: memcpy (&ctx->buffer[left_over], buffer, add); yann@1: ctx->buflen += add; yann@1: yann@1: - if (left_over + add > 64) yann@1: + if (ctx->buflen > 64) yann@1: { yann@1: - md5_process_block (ctx->buffer, (left_over + add) & ~63, ctx); yann@1: + md5_process_block (ctx->buffer, ctx->buflen & ~63, ctx); yann@1: + yann@1: + ctx->buflen &= 63; yann@1: /* The regions in the following copy operation cannot overlap. */ yann@1: memcpy (ctx->buffer, &ctx->buffer[(left_over + add) & ~63], yann@1: - (left_over + add) & 63); yann@1: - ctx->buflen = (left_over + add) & 63; yann@1: + ctx->buflen); yann@1: } yann@1: yann@1: buffer = (const char *) buffer + add; yann@1: @@ -251,8 +257,17 @@ yann@1: /* Move remaining bytes in internal buffer. */ yann@1: if (len > 0) yann@1: { yann@1: - memcpy (ctx->buffer, buffer, len); yann@1: - ctx->buflen = len; yann@1: + size_t left_over = ctx->buflen; yann@1: + yann@1: + memcpy (&ctx->buffer[left_over], buffer, len); yann@1: + left_over += len; yann@1: + if (left_over >= 64) yann@1: + { yann@1: + md5_process_block (ctx->buffer, 64, ctx); yann@1: + left_over -= 64; yann@1: + memcpy (ctx->buffer, &ctx->buffer[64], left_over); yann@1: + } yann@1: + ctx->buflen = left_over; yann@1: } yann@1: } yann@1: yann@1: --- glibc-2.1.3/md5-crypt/md5.h 2000/03/04 00:47:30 1.1 yann@1: +++ glibc-2.1.3/md5-crypt/md5.h 2000/07/04 18:22:44 1.2 yann@1: @@ -1,6 +1,6 @@ yann@1: /* Declaration of functions and data types used for MD5 sum computing yann@1: library functions. yann@1: - Copyright (C) 1995, 1996, 1997, 1999 Free Software Foundation, Inc. yann@1: + Copyright (C) 1995, 1996, 1997, 1999, 2000 Free Software Foundation, Inc. yann@1: This file is part of the GNU C Library. yann@1: yann@1: The GNU C Library is free software; you can redistribute it and/or yann@1: @@ -87,7 +87,7 @@ yann@1: yann@1: md5_uint32 total[2]; yann@1: md5_uint32 buflen; yann@1: - char buffer[128]; yann@1: + char buffer[128] __attribute__ ((__aligned__ (__alignof__ (md5_uint32)))); yann@1: }; yann@1: yann@1: /*