OSDN Git Service

Fix update_version_svn so it actually is the correct version of this script
[pf3gnuchains/gcc-fork.git] / libiberty / md5.c
index 0c0507d..83e0beb 100644 (file)
@@ -1,8 +1,9 @@
 /* md5.c - 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 Free Software Foundation, Inc.
-   NOTE: The canonical source of this file is maintained with the GNU C
-   Library.  Bugs can be reported to bug-glibc@prep.ai.mit.edu.
+
+   NOTE: This source is derived from an old version taken from the GNU C
+   Library (glibc).
 
    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
@@ -16,7 +17,7 @@
 
    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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  */
+   Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA.  */
 
 /* Written by Ulrich Drepper <drepper@gnu.ai.mit.edu>, 1995.  */
 
@@ -61,13 +62,12 @@ static const unsigned char fillbuf[64] = { 0x80, 0 /* , 0, 0, ...  */ };
 /* Initialize structure containing state of computation.
    (RFC 1321, 3.3: Step 3)  */
 void
-md5_init_ctx (ctx)
-     struct md5_ctx *ctx;
+md5_init_ctx (struct md5_ctx *ctx)
 {
-  ctx->A = 0x67452301;
-  ctx->B = 0xefcdab89;
-  ctx->C = 0x98badcfe;
-  ctx->D = 0x10325476;
+  ctx->A = (md5_uint32) 0x67452301;
+  ctx->B = (md5_uint32) 0xefcdab89;
+  ctx->C = (md5_uint32) 0x98badcfe;
+  ctx->D = (md5_uint32) 0x10325476;
 
   ctx->total[0] = ctx->total[1] = 0;
   ctx->buflen = 0;
@@ -79,9 +79,7 @@ md5_init_ctx (ctx)
    IMPORTANT: On some systems it is required that RESBUF is correctly
    aligned for a 32 bits value.  */
 void *
-md5_read_ctx (ctx, resbuf)
-     const struct md5_ctx *ctx;
-     void *resbuf;
+md5_read_ctx (const struct md5_ctx *ctx, void *resbuf)
 {
   ((md5_uint32 *) resbuf)[0] = SWAP (ctx->A);
   ((md5_uint32 *) resbuf)[1] = SWAP (ctx->B);
@@ -97,9 +95,7 @@ md5_read_ctx (ctx, resbuf)
    IMPORTANT: On some systems it is required that RESBUF is correctly
    aligned for a 32 bits value.  */
 void *
-md5_finish_ctx (ctx, resbuf)
-     struct md5_ctx *ctx;
-     void *resbuf;
+md5_finish_ctx (struct md5_ctx *ctx, void *resbuf)
 {
   /* Take yet unprocessed bytes into account.  */
   md5_uint32 bytes = ctx->buflen;
@@ -128,9 +124,7 @@ md5_finish_ctx (ctx, resbuf)
    resulting message digest number will be written into the 16 bytes
    beginning at RESBLOCK.  */
 int
-md5_stream (stream, resblock)
-     FILE *stream;
-     void *resblock;
+md5_stream (FILE *stream, void *resblock)
 {
   /* Important: BLOCKSIZE must be a multiple of 64.  */
 #define BLOCKSIZE 4096
@@ -185,10 +179,7 @@ md5_stream (stream, resblock)
    output yields to the wanted ASCII representation of the message
    digest.  */
 void *
-md5_buffer (buffer, len, resblock)
-     const char *buffer;
-     size_t len;
-     void *resblock;
+md5_buffer (const char *buffer, size_t len, void *resblock)
 {
   struct md5_ctx ctx;
 
@@ -204,10 +195,7 @@ md5_buffer (buffer, len, resblock)
 
 
 void
-md5_process_bytes (buffer, len, ctx)
-     const void *buffer;
-     size_t len;
-     struct md5_ctx *ctx;
+md5_process_bytes (const void *buffer, size_t len, struct md5_ctx *ctx)
 {
   /* When we already have some bits in our internal buffer concatenate
      both inputs first.  */
@@ -228,15 +216,32 @@ md5_process_bytes (buffer, len, ctx)
          ctx->buflen = (left_over + add) & 63;
        }
 
-      buffer = (const char *) buffer + add;
+      buffer = (const void *) ((const char *) buffer + add);
       len -= add;
     }
 
   /* Process available complete blocks.  */
   if (len > 64)
     {
+#if !_STRING_ARCH_unaligned
+/* To check alignment gcc has an appropriate operator.  Other
+   compilers don't.  */
+# if __GNUC__ >= 2
+#  define UNALIGNED_P(p) (((md5_uintptr) p) % __alignof__ (md5_uint32) != 0)
+# else
+#  define UNALIGNED_P(p) (((md5_uintptr) p) % sizeof (md5_uint32) != 0)
+# endif
+      if (UNALIGNED_P (buffer))
+        while (len > 64)
+          {
+            md5_process_block (memcpy (ctx->buffer, buffer, 64), 64, ctx);
+            buffer = (const char *) buffer + 64;
+            len -= 64;
+          }
+      else
+#endif
       md5_process_block (buffer, len & ~63, ctx);
-      buffer = (const char *) buffer + (len & ~63);
+      buffer = (const void *) ((const char *) buffer + (len & ~63));
       len &= 63;
     }
 
@@ -262,13 +267,10 @@ md5_process_bytes (buffer, len, ctx)
    It is assumed that LEN % 64 == 0.  */
 
 void
-md5_process_block (buffer, len, ctx)
-     const void *buffer;
-     size_t len;
-     struct md5_ctx *ctx;
+md5_process_block (const void *buffer, size_t len, struct md5_ctx *ctx)
 {
   md5_uint32 correct_words[16];
-  const md5_uint32 *words = buffer;
+  const md5_uint32 *words = (const md5_uint32 *) buffer;
   size_t nwords = len / sizeof (md5_uint32);
   const md5_uint32 *endp = words + nwords;
   md5_uint32 A = ctx->A;
@@ -321,89 +323,97 @@ md5_process_block (buffer, len, ctx)
        */
 
       /* Round 1.  */
-      OP (A, B, C, D,  7, 0xd76aa478);
-      OP (D, A, B, C, 12, 0xe8c7b756);
-      OP (C, D, A, B, 17, 0x242070db);
-      OP (B, C, D, A, 22, 0xc1bdceee);
-      OP (A, B, C, D,  7, 0xf57c0faf);
-      OP (D, A, B, C, 12, 0x4787c62a);
-      OP (C, D, A, B, 17, 0xa8304613);
-      OP (B, C, D, A, 22, 0xfd469501);
-      OP (A, B, C, D,  7, 0x698098d8);
-      OP (D, A, B, C, 12, 0x8b44f7af);
-      OP (C, D, A, B, 17, 0xffff5bb1);
-      OP (B, C, D, A, 22, 0x895cd7be);
-      OP (A, B, C, D,  7, 0x6b901122);
-      OP (D, A, B, C, 12, 0xfd987193);
-      OP (C, D, A, B, 17, 0xa679438e);
-      OP (B, C, D, A, 22, 0x49b40821);
+      OP (A, B, C, D,  7, (md5_uint32) 0xd76aa478);
+      OP (D, A, B, C, 12, (md5_uint32) 0xe8c7b756);
+      OP (C, D, A, B, 17, (md5_uint32) 0x242070db);
+      OP (B, C, D, A, 22, (md5_uint32) 0xc1bdceee);
+      OP (A, B, C, D,  7, (md5_uint32) 0xf57c0faf);
+      OP (D, A, B, C, 12, (md5_uint32) 0x4787c62a);
+      OP (C, D, A, B, 17, (md5_uint32) 0xa8304613);
+      OP (B, C, D, A, 22, (md5_uint32) 0xfd469501);
+      OP (A, B, C, D,  7, (md5_uint32) 0x698098d8);
+      OP (D, A, B, C, 12, (md5_uint32) 0x8b44f7af);
+      OP (C, D, A, B, 17, (md5_uint32) 0xffff5bb1);
+      OP (B, C, D, A, 22, (md5_uint32) 0x895cd7be);
+      OP (A, B, C, D,  7, (md5_uint32) 0x6b901122);
+      OP (D, A, B, C, 12, (md5_uint32) 0xfd987193);
+      OP (C, D, A, B, 17, (md5_uint32) 0xa679438e);
+      OP (B, C, D, A, 22, (md5_uint32) 0x49b40821);
 
       /* For the second to fourth round we have the possibly swapped words
         in CORRECT_WORDS.  Redefine the macro to take an additional first
         argument specifying the function to use.  */
 #undef OP
-#define OP(f, a, b, c, d, k, s, T)                                     \
+#define OP(a, b, c, d, k, s, T)                                                \
       do                                                               \
        {                                                               \
-         a += f (b, c, d) + correct_words[k] + T;                      \
+         a += FX (b, c, d) + correct_words[k] + T;                     \
          CYCLIC (a, s);                                                \
          a += b;                                                       \
        }                                                               \
       while (0)
 
+#define FX(b, c, d) FG (b, c, d)
+
       /* Round 2.  */
-      OP (FG, A, B, C, D,  1,  5, 0xf61e2562);
-      OP (FG, D, A, B, C,  6,  9, 0xc040b340);
-      OP (FG, C, D, A, B, 11, 14, 0x265e5a51);
-      OP (FG, B, C, D, A,  0, 20, 0xe9b6c7aa);
-      OP (FG, A, B, C, D,  5,  5, 0xd62f105d);
-      OP (FG, D, A, B, C, 10,  9, 0x02441453);
-      OP (FG, C, D, A, B, 15, 14, 0xd8a1e681);
-      OP (FG, B, C, D, A,  4, 20, 0xe7d3fbc8);
-      OP (FG, A, B, C, D,  9,  5, 0x21e1cde6);
-      OP (FG, D, A, B, C, 14,  9, 0xc33707d6);
-      OP (FG, C, D, A, B,  3, 14, 0xf4d50d87);
-      OP (FG, B, C, D, A,  8, 20, 0x455a14ed);
-      OP (FG, A, B, C, D, 13,  5, 0xa9e3e905);
-      OP (FG, D, A, B, C,  2,  9, 0xfcefa3f8);
-      OP (FG, C, D, A, B,  7, 14, 0x676f02d9);
-      OP (FG, B, C, D, A, 12, 20, 0x8d2a4c8a);
+      OP (A, B, C, D,  1,  5, (md5_uint32) 0xf61e2562);
+      OP (D, A, B, C,  6,  9, (md5_uint32) 0xc040b340);
+      OP (C, D, A, B, 11, 14, (md5_uint32) 0x265e5a51);
+      OP (B, C, D, A,  0, 20, (md5_uint32) 0xe9b6c7aa);
+      OP (A, B, C, D,  5,  5, (md5_uint32) 0xd62f105d);
+      OP (D, A, B, C, 10,  9, (md5_uint32) 0x02441453);
+      OP (C, D, A, B, 15, 14, (md5_uint32) 0xd8a1e681);
+      OP (B, C, D, A,  4, 20, (md5_uint32) 0xe7d3fbc8);
+      OP (A, B, C, D,  9,  5, (md5_uint32) 0x21e1cde6);
+      OP (D, A, B, C, 14,  9, (md5_uint32) 0xc33707d6);
+      OP (C, D, A, B,  3, 14, (md5_uint32) 0xf4d50d87);
+      OP (B, C, D, A,  8, 20, (md5_uint32) 0x455a14ed);
+      OP (A, B, C, D, 13,  5, (md5_uint32) 0xa9e3e905);
+      OP (D, A, B, C,  2,  9, (md5_uint32) 0xfcefa3f8);
+      OP (C, D, A, B,  7, 14, (md5_uint32) 0x676f02d9);
+      OP (B, C, D, A, 12, 20, (md5_uint32) 0x8d2a4c8a);
+
+#undef FX
+#define FX(b, c, d) FH (b, c, d)
 
       /* Round 3.  */
-      OP (FH, A, B, C, D,  5,  4, 0xfffa3942);
-      OP (FH, D, A, B, C,  8, 11, 0x8771f681);
-      OP (FH, C, D, A, B, 11, 16, 0x6d9d6122);
-      OP (FH, B, C, D, A, 14, 23, 0xfde5380c);
-      OP (FH, A, B, C, D,  1,  4, 0xa4beea44);
-      OP (FH, D, A, B, C,  4, 11, 0x4bdecfa9);
-      OP (FH, C, D, A, B,  7, 16, 0xf6bb4b60);
-      OP (FH, B, C, D, A, 10, 23, 0xbebfbc70);
-      OP (FH, A, B, C, D, 13,  4, 0x289b7ec6);
-      OP (FH, D, A, B, C,  0, 11, 0xeaa127fa);
-      OP (FH, C, D, A, B,  3, 16, 0xd4ef3085);
-      OP (FH, B, C, D, A,  6, 23, 0x04881d05);
-      OP (FH, A, B, C, D,  9,  4, 0xd9d4d039);
-      OP (FH, D, A, B, C, 12, 11, 0xe6db99e5);
-      OP (FH, C, D, A, B, 15, 16, 0x1fa27cf8);
-      OP (FH, B, C, D, A,  2, 23, 0xc4ac5665);
+      OP (A, B, C, D,  5,  4, (md5_uint32) 0xfffa3942);
+      OP (D, A, B, C,  8, 11, (md5_uint32) 0x8771f681);
+      OP (C, D, A, B, 11, 16, (md5_uint32) 0x6d9d6122);
+      OP (B, C, D, A, 14, 23, (md5_uint32) 0xfde5380c);
+      OP (A, B, C, D,  1,  4, (md5_uint32) 0xa4beea44);
+      OP (D, A, B, C,  4, 11, (md5_uint32) 0x4bdecfa9);
+      OP (C, D, A, B,  7, 16, (md5_uint32) 0xf6bb4b60);
+      OP (B, C, D, A, 10, 23, (md5_uint32) 0xbebfbc70);
+      OP (A, B, C, D, 13,  4, (md5_uint32) 0x289b7ec6);
+      OP (D, A, B, C,  0, 11, (md5_uint32) 0xeaa127fa);
+      OP (C, D, A, B,  3, 16, (md5_uint32) 0xd4ef3085);
+      OP (B, C, D, A,  6, 23, (md5_uint32) 0x04881d05);
+      OP (A, B, C, D,  9,  4, (md5_uint32) 0xd9d4d039);
+      OP (D, A, B, C, 12, 11, (md5_uint32) 0xe6db99e5);
+      OP (C, D, A, B, 15, 16, (md5_uint32) 0x1fa27cf8);
+      OP (B, C, D, A,  2, 23, (md5_uint32) 0xc4ac5665);
+
+#undef FX
+#define FX(b, c, d) FI (b, c, d)
 
       /* Round 4.  */
-      OP (FI, A, B, C, D,  0,  6, 0xf4292244);
-      OP (FI, D, A, B, C,  7, 10, 0x432aff97);
-      OP (FI, C, D, A, B, 14, 15, 0xab9423a7);
-      OP (FI, B, C, D, A,  5, 21, 0xfc93a039);
-      OP (FI, A, B, C, D, 12,  6, 0x655b59c3);
-      OP (FI, D, A, B, C,  3, 10, 0x8f0ccc92);
-      OP (FI, C, D, A, B, 10, 15, 0xffeff47d);
-      OP (FI, B, C, D, A,  1, 21, 0x85845dd1);
-      OP (FI, A, B, C, D,  8,  6, 0x6fa87e4f);
-      OP (FI, D, A, B, C, 15, 10, 0xfe2ce6e0);
-      OP (FI, C, D, A, B,  6, 15, 0xa3014314);
-      OP (FI, B, C, D, A, 13, 21, 0x4e0811a1);
-      OP (FI, A, B, C, D,  4,  6, 0xf7537e82);
-      OP (FI, D, A, B, C, 11, 10, 0xbd3af235);
-      OP (FI, C, D, A, B,  2, 15, 0x2ad7d2bb);
-      OP (FI, B, C, D, A,  9, 21, 0xeb86d391);
+      OP (A, B, C, D,  0,  6, (md5_uint32) 0xf4292244);
+      OP (D, A, B, C,  7, 10, (md5_uint32) 0x432aff97);
+      OP (C, D, A, B, 14, 15, (md5_uint32) 0xab9423a7);
+      OP (B, C, D, A,  5, 21, (md5_uint32) 0xfc93a039);
+      OP (A, B, C, D, 12,  6, (md5_uint32) 0x655b59c3);
+      OP (D, A, B, C,  3, 10, (md5_uint32) 0x8f0ccc92);
+      OP (C, D, A, B, 10, 15, (md5_uint32) 0xffeff47d);
+      OP (B, C, D, A,  1, 21, (md5_uint32) 0x85845dd1);
+      OP (A, B, C, D,  8,  6, (md5_uint32) 0x6fa87e4f);
+      OP (D, A, B, C, 15, 10, (md5_uint32) 0xfe2ce6e0);
+      OP (C, D, A, B,  6, 15, (md5_uint32) 0xa3014314);
+      OP (B, C, D, A, 13, 21, (md5_uint32) 0x4e0811a1);
+      OP (A, B, C, D,  4,  6, (md5_uint32) 0xf7537e82);
+      OP (D, A, B, C, 11, 10, (md5_uint32) 0xbd3af235);
+      OP (C, D, A, B,  2, 15, (md5_uint32) 0x2ad7d2bb);
+      OP (B, C, D, A,  9, 21, (md5_uint32) 0xeb86d391);
 
       /* Add the starting values of the context.  */
       A += A_save;