(root)/
gcc-13.2.0/
libiberty/
md5.c
       1  /* md5.c - Functions to compute MD5 message digest of files or memory blocks
       2     according to the definition of MD5 in RFC 1321 from April 1992.
       3     Copyright (C) 1995-2023 Free Software Foundation, Inc.
       4  
       5     NOTE: This source is derived from an old version taken from the GNU C
       6     Library (glibc).
       7  
       8     This program is free software; you can redistribute it and/or modify it
       9     under the terms of the GNU General Public License as published by the
      10     Free Software Foundation; either version 2, or (at your option) any
      11     later version.
      12  
      13     This program is distributed in the hope that it will be useful,
      14     but WITHOUT ANY WARRANTY; without even the implied warranty of
      15     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
      16     GNU General Public License for more details.
      17  
      18     You should have received a copy of the GNU General Public License
      19     along with this program; if not, write to the Free Software Foundation,
      20     Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA.  */
      21  
      22  /* Written by Ulrich Drepper <drepper@gnu.ai.mit.edu>, 1995.  */
      23  
      24  #ifdef HAVE_CONFIG_H
      25  # include <config.h>
      26  #endif
      27  
      28  #include <sys/types.h>
      29  
      30  #if STDC_HEADERS || defined _LIBC
      31  # include <stdlib.h>
      32  # include <string.h>
      33  #else
      34  # ifndef HAVE_MEMCPY
      35  #  define memcpy(d, s, n) bcopy ((s), (d), (n))
      36  # endif
      37  #endif
      38  
      39  #include "ansidecl.h"
      40  #include "md5.h"
      41  
      42  #ifdef _LIBC
      43  # include <endian.h>
      44  # if __BYTE_ORDER == __BIG_ENDIAN
      45  #  define WORDS_BIGENDIAN 1
      46  # endif
      47  #endif
      48  
      49  #ifdef WORDS_BIGENDIAN
      50  # define SWAP(n)							\
      51      (((n) << 24) | (((n) & 0xff00) << 8) | (((n) >> 8) & 0xff00) | ((n) >> 24))
      52  #else
      53  # define SWAP(n) (n)
      54  #endif
      55  
      56  
      57  /* This array contains the bytes used to pad the buffer to the next
      58     64-byte boundary.  (RFC 1321, 3.1: Step 1)  */
      59  static const unsigned char fillbuf[64] = { 0x80, 0 /* , 0, 0, ...  */ };
      60  
      61  
      62  /* Initialize structure containing state of computation.
      63     (RFC 1321, 3.3: Step 3)  */
      64  void
      65  md5_init_ctx (struct md5_ctx *ctx)
      66  {
      67    ctx->A = (md5_uint32) 0x67452301;
      68    ctx->B = (md5_uint32) 0xefcdab89;
      69    ctx->C = (md5_uint32) 0x98badcfe;
      70    ctx->D = (md5_uint32) 0x10325476;
      71  
      72    ctx->total[0] = ctx->total[1] = 0;
      73    ctx->buflen = 0;
      74  }
      75  
      76  /* Put result from CTX in first 16 bytes following RESBUF.  The result
      77     must be in little endian byte order.
      78  
      79     IMPORTANT: RESBUF may not be aligned as strongly as MD5_UNIT32 so we
      80     put things in a local (aligned) buffer first, then memcpy into RESBUF.  */
      81  void *
      82  md5_read_ctx (const struct md5_ctx *ctx, void *resbuf)
      83  {
      84    md5_uint32 buffer[4];
      85  
      86    buffer[0] = SWAP (ctx->A);
      87    buffer[1] = SWAP (ctx->B);
      88    buffer[2] = SWAP (ctx->C);
      89    buffer[3] = SWAP (ctx->D);
      90  
      91    memcpy (resbuf, buffer, 16);
      92  
      93    return resbuf;
      94  }
      95  
      96  /* Process the remaining bytes in the internal buffer and the usual
      97     prolog according to the standard and write the result to RESBUF.
      98  
      99     IMPORTANT: On some systems it is required that RESBUF is correctly
     100     aligned for a 32 bits value.  */
     101  void *
     102  md5_finish_ctx (struct md5_ctx *ctx, void *resbuf)
     103  {
     104    /* Take yet unprocessed bytes into account.  */
     105    md5_uint32 bytes = ctx->buflen;
     106    md5_uint32 swap_bytes;
     107    size_t pad;
     108  
     109    /* Now count remaining bytes.  */
     110    ctx->total[0] += bytes;
     111    if (ctx->total[0] < bytes)
     112      ++ctx->total[1];
     113  
     114    pad = bytes >= 56 ? 64 + 56 - bytes : 56 - bytes;
     115    memcpy (&ctx->buffer[bytes], fillbuf, pad);
     116  
     117    /* Put the 64-bit file length in *bits* at the end of the buffer.
     118       Use memcpy to avoid aliasing problems.  On most systems, this
     119       will be optimized away to the same code.  */
     120    swap_bytes = SWAP (ctx->total[0] << 3);
     121    memcpy (&ctx->buffer[bytes + pad], &swap_bytes, sizeof (swap_bytes));
     122    swap_bytes = SWAP ((ctx->total[1] << 3) | (ctx->total[0] >> 29));
     123    memcpy (&ctx->buffer[bytes + pad + 4], &swap_bytes, sizeof (swap_bytes));
     124  
     125    /* Process last bytes.  */
     126    md5_process_block (ctx->buffer, bytes + pad + 8, ctx);
     127  
     128    return md5_read_ctx (ctx, resbuf);
     129  }
     130  
     131  /* Compute MD5 message digest for bytes read from STREAM.  The
     132     resulting message digest number will be written into the 16 bytes
     133     beginning at RESBLOCK.  */
     134  int
     135  md5_stream (FILE *stream, void *resblock)
     136  {
     137    /* Important: BLOCKSIZE must be a multiple of 64.  */
     138  #define BLOCKSIZE 4096
     139    struct md5_ctx ctx;
     140    char buffer[BLOCKSIZE + 72];
     141    size_t sum;
     142  
     143    /* Initialize the computation context.  */
     144    md5_init_ctx (&ctx);
     145  
     146    /* Iterate over full file contents.  */
     147    while (1)
     148      {
     149        /* We read the file in blocks of BLOCKSIZE bytes.  One call of the
     150  	 computation function processes the whole buffer so that with the
     151  	 next round of the loop another block can be read.  */
     152        size_t n;
     153        sum = 0;
     154  
     155        /* Read block.  Take care for partial reads.  */
     156        do
     157  	{
     158  	  n = fread (buffer + sum, 1, BLOCKSIZE - sum, stream);
     159  
     160  	  sum += n;
     161  	}
     162        while (sum < BLOCKSIZE && n != 0);
     163        if (n == 0 && ferror (stream))
     164          return 1;
     165  
     166        /* If end of file is reached, end the loop.  */
     167        if (n == 0)
     168  	break;
     169  
     170        /* Process buffer with BLOCKSIZE bytes.  Note that
     171  			BLOCKSIZE % 64 == 0
     172         */
     173        md5_process_block (buffer, BLOCKSIZE, &ctx);
     174      }
     175  
     176    /* Add the last bytes if necessary.  */
     177    if (sum > 0)
     178      md5_process_bytes (buffer, sum, &ctx);
     179  
     180    /* Construct result in desired memory.  */
     181    md5_finish_ctx (&ctx, resblock);
     182    return 0;
     183  }
     184  
     185  /* Compute MD5 message digest for LEN bytes beginning at BUFFER.  The
     186     result is always in little endian byte order, so that a byte-wise
     187     output yields to the wanted ASCII representation of the message
     188     digest.  */
     189  void *
     190  md5_buffer (const char *buffer, size_t len, void *resblock)
     191  {
     192    struct md5_ctx ctx;
     193  
     194    /* Initialize the computation context.  */
     195    md5_init_ctx (&ctx);
     196  
     197    /* Process whole buffer but last len % 64 bytes.  */
     198    md5_process_bytes (buffer, len, &ctx);
     199  
     200    /* Put result in desired memory area.  */
     201    return md5_finish_ctx (&ctx, resblock);
     202  }
     203  
     204  
     205  void
     206  md5_process_bytes (const void *buffer, size_t len, struct md5_ctx *ctx)
     207  {
     208    /* When we already have some bits in our internal buffer concatenate
     209       both inputs first.  */
     210    if (ctx->buflen != 0)
     211      {
     212        size_t left_over = ctx->buflen;
     213        size_t add = 128 - left_over > len ? len : 128 - left_over;
     214  
     215        memcpy (&ctx->buffer[left_over], buffer, add);
     216        ctx->buflen += add;
     217  
     218        if (left_over + add > 64)
     219  	{
     220  	  md5_process_block (ctx->buffer, (left_over + add) & ~63, ctx);
     221  	  /* The regions in the following copy operation cannot overlap.  */
     222  	  memcpy (ctx->buffer, &ctx->buffer[(left_over + add) & ~63],
     223  		  (left_over + add) & 63);
     224  	  ctx->buflen = (left_over + add) & 63;
     225  	}
     226  
     227        buffer = (const void *) ((const char *) buffer + add);
     228        len -= add;
     229      }
     230  
     231    /* Process available complete blocks.  */
     232    if (len > 64)
     233      {
     234  #if !_STRING_ARCH_unaligned || defined UBSAN_BOOTSTRAP
     235  /* To check alignment gcc has an appropriate operator.  Other
     236     compilers don't.  */
     237  # if __GNUC__ >= 2
     238  #  define UNALIGNED_P(p) (((md5_uintptr) p) % __alignof__ (md5_uint32) != 0)
     239  # else
     240  #  define UNALIGNED_P(p) (((md5_uintptr) p) % sizeof (md5_uint32) != 0)
     241  # endif
     242        if (UNALIGNED_P (buffer))
     243          while (len > 64)
     244            {
     245  	    memcpy (ctx->buffer, buffer, 64);
     246              md5_process_block (ctx->buffer, 64, ctx);
     247              buffer = (const char *) buffer + 64;
     248              len -= 64;
     249            }
     250        else
     251  #endif
     252  	{
     253  	  md5_process_block (buffer, len & ~63, ctx);
     254  	  buffer = (const void *) ((const char *) buffer + (len & ~63));
     255  	  len &= 63;
     256  	}
     257      }
     258  
     259    /* Move remaining bytes in internal buffer.  */
     260    if (len > 0)
     261      {
     262        memcpy (ctx->buffer, buffer, len);
     263        ctx->buflen = len;
     264      }
     265  }
     266  
     267  
     268  /* These are the four functions used in the four steps of the MD5 algorithm
     269     and defined in the RFC 1321.  The first function is a little bit optimized
     270     (as found in Colin Plumbs public domain implementation).  */
     271  /* #define FF(b, c, d) ((b & c) | (~b & d)) */
     272  #define FF(b, c, d) (d ^ (b & (c ^ d)))
     273  #define FG(b, c, d) FF (d, b, c)
     274  #define FH(b, c, d) (b ^ c ^ d)
     275  #define FI(b, c, d) (c ^ (b | ~d))
     276  
     277  /* Process LEN bytes of BUFFER, accumulating context into CTX.
     278     It is assumed that LEN % 64 == 0.  */
     279  
     280  void
     281  md5_process_block (const void *buffer, size_t len, struct md5_ctx *ctx)
     282  {
     283    md5_uint32 correct_words[16];
     284    const md5_uint32 *words = (const md5_uint32 *) buffer;
     285    size_t nwords = len / sizeof (md5_uint32);
     286    const md5_uint32 *endp = words + nwords;
     287    md5_uint32 A = ctx->A;
     288    md5_uint32 B = ctx->B;
     289    md5_uint32 C = ctx->C;
     290    md5_uint32 D = ctx->D;
     291  
     292    /* First increment the byte count.  RFC 1321 specifies the possible
     293       length of the file up to 2^64 bits.  Here we only compute the
     294       number of bytes.  Do a double word increment.  */
     295    ctx->total[0] += len;
     296    ctx->total[1] += ((len >> 31) >> 1) + (ctx->total[0] < len);
     297  
     298    /* Process all bytes in the buffer with 64 bytes in each round of
     299       the loop.  */
     300    while (words < endp)
     301      {
     302        md5_uint32 *cwp = correct_words;
     303        md5_uint32 A_save = A;
     304        md5_uint32 B_save = B;
     305        md5_uint32 C_save = C;
     306        md5_uint32 D_save = D;
     307  
     308        /* First round: using the given function, the context and a constant
     309  	 the next context is computed.  Because the algorithms processing
     310  	 unit is a 32-bit word and it is determined to work on words in
     311  	 little endian byte order we perhaps have to change the byte order
     312  	 before the computation.  To reduce the work for the next steps
     313  	 we store the swapped words in the array CORRECT_WORDS.  */
     314  
     315  #define OP(a, b, c, d, s, T)						\
     316        do								\
     317          {								\
     318  	  a += FF (b, c, d) + (*cwp++ = SWAP (*words)) + T;		\
     319  	  ++words;							\
     320  	  CYCLIC (a, s);						\
     321  	  a += b;							\
     322          }								\
     323        while (0)
     324  
     325        /* It is unfortunate that C does not provide an operator for
     326  	 cyclic rotation.  Hope the C compiler is smart enough.  */
     327  #define CYCLIC(w, s) (w = (w << s) | (w >> (32 - s)))
     328  
     329        /* Before we start, one word to the strange constants.
     330  	 They are defined in RFC 1321 as
     331  
     332  	 T[i] = (int) (4294967296.0 * fabs (sin (i))), i=1..64
     333         */
     334  
     335        /* Round 1.  */
     336        OP (A, B, C, D,  7, (md5_uint32) 0xd76aa478);
     337        OP (D, A, B, C, 12, (md5_uint32) 0xe8c7b756);
     338        OP (C, D, A, B, 17, (md5_uint32) 0x242070db);
     339        OP (B, C, D, A, 22, (md5_uint32) 0xc1bdceee);
     340        OP (A, B, C, D,  7, (md5_uint32) 0xf57c0faf);
     341        OP (D, A, B, C, 12, (md5_uint32) 0x4787c62a);
     342        OP (C, D, A, B, 17, (md5_uint32) 0xa8304613);
     343        OP (B, C, D, A, 22, (md5_uint32) 0xfd469501);
     344        OP (A, B, C, D,  7, (md5_uint32) 0x698098d8);
     345        OP (D, A, B, C, 12, (md5_uint32) 0x8b44f7af);
     346        OP (C, D, A, B, 17, (md5_uint32) 0xffff5bb1);
     347        OP (B, C, D, A, 22, (md5_uint32) 0x895cd7be);
     348        OP (A, B, C, D,  7, (md5_uint32) 0x6b901122);
     349        OP (D, A, B, C, 12, (md5_uint32) 0xfd987193);
     350        OP (C, D, A, B, 17, (md5_uint32) 0xa679438e);
     351        OP (B, C, D, A, 22, (md5_uint32) 0x49b40821);
     352  
     353        /* For the second to fourth round we have the possibly swapped words
     354  	 in CORRECT_WORDS.  Redefine the macro to take an additional first
     355  	 argument specifying the function to use.  */
     356  #undef OP
     357  #define OP(a, b, c, d, k, s, T)						\
     358        do 								\
     359  	{								\
     360  	  a += FX (b, c, d) + correct_words[k] + T;			\
     361  	  CYCLIC (a, s);						\
     362  	  a += b;							\
     363  	}								\
     364        while (0)
     365  
     366  #define FX(b, c, d) FG (b, c, d)
     367  
     368        /* Round 2.  */
     369        OP (A, B, C, D,  1,  5, (md5_uint32) 0xf61e2562);
     370        OP (D, A, B, C,  6,  9, (md5_uint32) 0xc040b340);
     371        OP (C, D, A, B, 11, 14, (md5_uint32) 0x265e5a51);
     372        OP (B, C, D, A,  0, 20, (md5_uint32) 0xe9b6c7aa);
     373        OP (A, B, C, D,  5,  5, (md5_uint32) 0xd62f105d);
     374        OP (D, A, B, C, 10,  9, (md5_uint32) 0x02441453);
     375        OP (C, D, A, B, 15, 14, (md5_uint32) 0xd8a1e681);
     376        OP (B, C, D, A,  4, 20, (md5_uint32) 0xe7d3fbc8);
     377        OP (A, B, C, D,  9,  5, (md5_uint32) 0x21e1cde6);
     378        OP (D, A, B, C, 14,  9, (md5_uint32) 0xc33707d6);
     379        OP (C, D, A, B,  3, 14, (md5_uint32) 0xf4d50d87);
     380        OP (B, C, D, A,  8, 20, (md5_uint32) 0x455a14ed);
     381        OP (A, B, C, D, 13,  5, (md5_uint32) 0xa9e3e905);
     382        OP (D, A, B, C,  2,  9, (md5_uint32) 0xfcefa3f8);
     383        OP (C, D, A, B,  7, 14, (md5_uint32) 0x676f02d9);
     384        OP (B, C, D, A, 12, 20, (md5_uint32) 0x8d2a4c8a);
     385  
     386  #undef FX
     387  #define FX(b, c, d) FH (b, c, d)
     388  
     389        /* Round 3.  */
     390        OP (A, B, C, D,  5,  4, (md5_uint32) 0xfffa3942);
     391        OP (D, A, B, C,  8, 11, (md5_uint32) 0x8771f681);
     392        OP (C, D, A, B, 11, 16, (md5_uint32) 0x6d9d6122);
     393        OP (B, C, D, A, 14, 23, (md5_uint32) 0xfde5380c);
     394        OP (A, B, C, D,  1,  4, (md5_uint32) 0xa4beea44);
     395        OP (D, A, B, C,  4, 11, (md5_uint32) 0x4bdecfa9);
     396        OP (C, D, A, B,  7, 16, (md5_uint32) 0xf6bb4b60);
     397        OP (B, C, D, A, 10, 23, (md5_uint32) 0xbebfbc70);
     398        OP (A, B, C, D, 13,  4, (md5_uint32) 0x289b7ec6);
     399        OP (D, A, B, C,  0, 11, (md5_uint32) 0xeaa127fa);
     400        OP (C, D, A, B,  3, 16, (md5_uint32) 0xd4ef3085);
     401        OP (B, C, D, A,  6, 23, (md5_uint32) 0x04881d05);
     402        OP (A, B, C, D,  9,  4, (md5_uint32) 0xd9d4d039);
     403        OP (D, A, B, C, 12, 11, (md5_uint32) 0xe6db99e5);
     404        OP (C, D, A, B, 15, 16, (md5_uint32) 0x1fa27cf8);
     405        OP (B, C, D, A,  2, 23, (md5_uint32) 0xc4ac5665);
     406  
     407  #undef FX
     408  #define FX(b, c, d) FI (b, c, d)
     409  
     410        /* Round 4.  */
     411        OP (A, B, C, D,  0,  6, (md5_uint32) 0xf4292244);
     412        OP (D, A, B, C,  7, 10, (md5_uint32) 0x432aff97);
     413        OP (C, D, A, B, 14, 15, (md5_uint32) 0xab9423a7);
     414        OP (B, C, D, A,  5, 21, (md5_uint32) 0xfc93a039);
     415        OP (A, B, C, D, 12,  6, (md5_uint32) 0x655b59c3);
     416        OP (D, A, B, C,  3, 10, (md5_uint32) 0x8f0ccc92);
     417        OP (C, D, A, B, 10, 15, (md5_uint32) 0xffeff47d);
     418        OP (B, C, D, A,  1, 21, (md5_uint32) 0x85845dd1);
     419        OP (A, B, C, D,  8,  6, (md5_uint32) 0x6fa87e4f);
     420        OP (D, A, B, C, 15, 10, (md5_uint32) 0xfe2ce6e0);
     421        OP (C, D, A, B,  6, 15, (md5_uint32) 0xa3014314);
     422        OP (B, C, D, A, 13, 21, (md5_uint32) 0x4e0811a1);
     423        OP (A, B, C, D,  4,  6, (md5_uint32) 0xf7537e82);
     424        OP (D, A, B, C, 11, 10, (md5_uint32) 0xbd3af235);
     425        OP (C, D, A, B,  2, 15, (md5_uint32) 0x2ad7d2bb);
     426        OP (B, C, D, A,  9, 21, (md5_uint32) 0xeb86d391);
     427  
     428        /* Add the starting values of the context.  */
     429        A += A_save;
     430        B += B_save;
     431        C += C_save;
     432        D += D_save;
     433      }
     434  
     435    /* Put checksum in context given as argument.  */
     436    ctx->A = A;
     437    ctx->B = B;
     438    ctx->C = C;
     439    ctx->D = D;
     440  }