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