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 Software Foundation, Inc.
5 This program is free software; you can redistribute it and/or modify
6 it under the terms of the GNU General Public License as published by
7 the Free Software Foundation; either version 2, or (at your option)
10 This program is distributed in the hope that it will be useful,
11 but WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 GNU General Public License for more details.
15 You should have received a copy of the GNU General Public License
16 along with this program; if not, write to the Free Software
17 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
19 /* Written by Ulrich Drepper <drepper@gnu.ai.mit.edu>. */
25 #include <sys/types.h>
32 #ifdef WORDS_BIGENDIAN
34 (((n) << 24) | (((n) & 0xff00) << 8) | (((n) >> 8) & 0xff00) | ((n) >> 24))
40 /* This array contains the bytes used to pad the buffer to the next
41 64-byte boundary. (RFC 1321, 3.1: Step 1) */
42 static const unsigned char fillbuf
[64] = { 0x80, 0 /* , 0, 0, ... */ };
45 /* Initialize structure containing state of computation.
46 (RFC 1321, 3.3: Step 3) */
57 /* Put result from CTX in first 16 bytes following RESBUF. The result must
58 be in little endian byte order. */
60 md5_read_ctx (ctx
, resbuf
)
61 const struct md5_ctx
*ctx
;
64 ((md5_uint32
*) resbuf
)[0] = SWAP (ctx
->A
);
65 ((md5_uint32
*) resbuf
)[1] = SWAP (ctx
->B
);
66 ((md5_uint32
*) resbuf
)[2] = SWAP (ctx
->C
);
67 ((md5_uint32
*) resbuf
)[3] = SWAP (ctx
->D
);
72 /* Compute MD5 message digest for bytes read from STREAM. The
73 resulting message digest number will be written into the 16 bytes
74 beginning at RESBLOCK. */
76 md5_stream (stream
, resblock
)
80 /* Important: BLOCKSIZE must be a multiple of 64. */
81 #define BLOCKSIZE 4096
84 char buffer
[BLOCKSIZE
+ 72];
87 /* Initialize the computation context. */
93 /* Iterate over full file contents. */
96 /* We read the file in blocks of BLOCKSIZE bytes. One call of the
97 computation function processes the whole buffer so that with the
98 next round of the loop another block can be read. */
102 /* Read block. Take care for partial reads. */
105 n
= fread (buffer
, 1, BLOCKSIZE
- sum
, stream
);
109 while (sum
< BLOCKSIZE
&& n
!= 0);
110 if (n
== 0 && ferror (stream
))
113 /* RFC 1321 specifies the possible length of the file up to 2^64 bits.
114 Here we only compute the number of bytes. Do a double word
120 /* If end of file is reached, end the loop. */
124 /* Process buffer with BLOCKSIZE bytes. Note that
127 md5_process_block (buffer
, BLOCKSIZE
, &ctx
);
130 /* We can copy 64 byte because the buffer is always big enough. FILLBUF
131 contains the needed bits. */
132 memcpy (&buffer
[sum
], fillbuf
, 64);
134 /* Compute amount of padding bytes needed. Alignment is done to
136 There is always at least one byte padded. I.e. even the alignment
137 is correctly aligned 64 padding bytes are added. */
139 pad
= pad
>= 56 ? 64 + 56 - pad
: 56 - pad
;
141 /* Put the 64-bit file length in *bits* at the end of the buffer. */
142 *(md5_uint32
*) &buffer
[sum
+ pad
] = SWAP (len
[0] << 3);
143 *(md5_uint32
*) &buffer
[sum
+ pad
+ 4] = SWAP ((len
[1] << 3)
146 /* Process last bytes. */
147 md5_process_block (buffer
, sum
+ pad
+ 8, &ctx
);
149 /* Construct result in desired memory. */
150 md5_read_ctx (&ctx
, resblock
);
154 /* Compute MD5 message digest for LEN bytes beginning at BUFFER. The
155 result is always in little endian byte order, so that a byte-wise
156 output yields to the wanted ASCII representation of the message
159 md5_buffer (buffer
, len
, resblock
)
165 char restbuf
[64 + 72];
166 size_t blocks
= len
& ~63;
169 /* Initialize the computation context. */
172 /* Process whole buffer but last len % 64 bytes. */
173 md5_process_block (buffer
, blocks
, &ctx
);
175 /* REST bytes are not processed yet. */
177 /* Copy to own buffer. */
178 memcpy (restbuf
, &buffer
[blocks
], rest
);
179 /* Append needed fill bytes at end of buffer. We can copy 64 byte
180 because the buffer is always big enough. */
181 memcpy (&restbuf
[rest
], fillbuf
, 64);
183 /* PAD bytes are used for padding to correct alignment. Note that
184 always at least one byte is padded. */
185 pad
= rest
>= 56 ? 64 + 56 - rest
: 56 - rest
;
187 /* Put length of buffer in *bits* in last eight bytes. */
188 *(md5_uint32
*) &restbuf
[rest
+ pad
] = (md5_uint32
) SWAP (len
<< 3);
189 *(md5_uint32
*) &restbuf
[rest
+ pad
+ 4] = (md5_uint32
) SWAP (len
>> 29);
191 /* Process last bytes. */
192 md5_process_block (restbuf
, rest
+ pad
+ 8, &ctx
);
194 /* Put result in desired memory area. */
195 return md5_read_ctx (&ctx
, resblock
);
199 /* These are the four functions used in the four steps of the MD5 algorithm
200 and defined in the RFC 1321. The first function is a little bit optimized
201 (as found in Colin Plumbs public domain implementation). */
202 /* #define FF(b, c, d) ((b & c) | (~b & d)) */
203 #define FF(b, c, d) (d ^ (b & (c ^ d)))
204 #define FG(b, c, d) FF (d, b, c)
205 #define FH(b, c, d) (b ^ c ^ d)
206 #define FI(b, c, d) (c ^ (b | ~d))
208 /* Process LEN bytes of BUFFER, accumulating context into CTX.
209 It is assumed that LEN % 64 == 0. */
212 md5_process_block (buffer
, len
, ctx
)
217 md5_uint32 correct_words
[16];
218 const md5_uint32
*words
= buffer
;
219 size_t nwords
= len
/ sizeof (md5_uint32
);
220 const md5_uint32
*endp
= words
+ nwords
;
221 md5_uint32 A
= ctx
->A
;
222 md5_uint32 B
= ctx
->B
;
223 md5_uint32 C
= ctx
->C
;
224 md5_uint32 D
= ctx
->D
;
226 /* Process all bytes in the buffer with 64 bytes in each round of
230 md5_uint32
*cwp
= correct_words
;
231 md5_uint32 A_save
= A
;
232 md5_uint32 B_save
= B
;
233 md5_uint32 C_save
= C
;
234 md5_uint32 D_save
= D
;
236 /* First round: using the given function, the context and a constant
237 the next context is computed. Because the algorithms processing
238 unit is a 32-bit word and it is determined to work on words in
239 little endian byte order we perhaps have to change the byte order
240 before the computation. To reduce the work for the next steps
241 we store the swapped words in the array CORRECT_WORDS. */
243 #define OP(a, b, c, d, s, T) \
246 a += FF (b, c, d) + (*cwp++ = SWAP (*words)) + T; \
253 /* It is unfortunate that C does not provide an operator for
254 cyclic rotation. Hope the C compiler is smart enough. */
255 #define CYCLIC(w, s) (w = (w << s) | (w >> (32 - s)))
257 /* Before we start, one word to the strange constants.
258 They are defined in RFC 1321 as
260 T[i] = (int) (4294967296.0 * fabs (sin (i))), i=1..64
264 OP (A
, B
, C
, D
, 7, 0xd76aa478);
265 OP (D
, A
, B
, C
, 12, 0xe8c7b756);
266 OP (C
, D
, A
, B
, 17, 0x242070db);
267 OP (B
, C
, D
, A
, 22, 0xc1bdceee);
268 OP (A
, B
, C
, D
, 7, 0xf57c0faf);
269 OP (D
, A
, B
, C
, 12, 0x4787c62a);
270 OP (C
, D
, A
, B
, 17, 0xa8304613);
271 OP (B
, C
, D
, A
, 22, 0xfd469501);
272 OP (A
, B
, C
, D
, 7, 0x698098d8);
273 OP (D
, A
, B
, C
, 12, 0x8b44f7af);
274 OP (C
, D
, A
, B
, 17, 0xffff5bb1);
275 OP (B
, C
, D
, A
, 22, 0x895cd7be);
276 OP (A
, B
, C
, D
, 7, 0x6b901122);
277 OP (D
, A
, B
, C
, 12, 0xfd987193);
278 OP (C
, D
, A
, B
, 17, 0xa679438e);
279 OP (B
, C
, D
, A
, 22, 0x49b40821);
281 /* For the second to fourth round we have the possibly swapped words
282 in CORRECT_WORDS. Redefine the macro to take an additional first
283 argument specifying the function to use. */
285 #define OP(f, a, b, c, d, k, s, T) \
288 a += f (b, c, d) + correct_words[k] + T; \
295 OP (FG
, A
, B
, C
, D
, 1, 5, 0xf61e2562);
296 OP (FG
, D
, A
, B
, C
, 6, 9, 0xc040b340);
297 OP (FG
, C
, D
, A
, B
, 11, 14, 0x265e5a51);
298 OP (FG
, B
, C
, D
, A
, 0, 20, 0xe9b6c7aa);
299 OP (FG
, A
, B
, C
, D
, 5, 5, 0xd62f105d);
300 OP (FG
, D
, A
, B
, C
, 10, 9, 0x02441453);
301 OP (FG
, C
, D
, A
, B
, 15, 14, 0xd8a1e681);
302 OP (FG
, B
, C
, D
, A
, 4, 20, 0xe7d3fbc8);
303 OP (FG
, A
, B
, C
, D
, 9, 5, 0x21e1cde6);
304 OP (FG
, D
, A
, B
, C
, 14, 9, 0xc33707d6);
305 OP (FG
, C
, D
, A
, B
, 3, 14, 0xf4d50d87);
306 OP (FG
, B
, C
, D
, A
, 8, 20, 0x455a14ed);
307 OP (FG
, A
, B
, C
, D
, 13, 5, 0xa9e3e905);
308 OP (FG
, D
, A
, B
, C
, 2, 9, 0xfcefa3f8);
309 OP (FG
, C
, D
, A
, B
, 7, 14, 0x676f02d9);
310 OP (FG
, B
, C
, D
, A
, 12, 20, 0x8d2a4c8a);
313 OP (FH
, A
, B
, C
, D
, 5, 4, 0xfffa3942);
314 OP (FH
, D
, A
, B
, C
, 8, 11, 0x8771f681);
315 OP (FH
, C
, D
, A
, B
, 11, 16, 0x6d9d6122);
316 OP (FH
, B
, C
, D
, A
, 14, 23, 0xfde5380c);
317 OP (FH
, A
, B
, C
, D
, 1, 4, 0xa4beea44);
318 OP (FH
, D
, A
, B
, C
, 4, 11, 0x4bdecfa9);
319 OP (FH
, C
, D
, A
, B
, 7, 16, 0xf6bb4b60);
320 OP (FH
, B
, C
, D
, A
, 10, 23, 0xbebfbc70);
321 OP (FH
, A
, B
, C
, D
, 13, 4, 0x289b7ec6);
322 OP (FH
, D
, A
, B
, C
, 0, 11, 0xeaa127fa);
323 OP (FH
, C
, D
, A
, B
, 3, 16, 0xd4ef3085);
324 OP (FH
, B
, C
, D
, A
, 6, 23, 0x04881d05);
325 OP (FH
, A
, B
, C
, D
, 9, 4, 0xd9d4d039);
326 OP (FH
, D
, A
, B
, C
, 12, 11, 0xe6db99e5);
327 OP (FH
, C
, D
, A
, B
, 15, 16, 0x1fa27cf8);
328 OP (FH
, B
, C
, D
, A
, 2, 23, 0xc4ac5665);
331 OP (FI
, A
, B
, C
, D
, 0, 6, 0xf4292244);
332 OP (FI
, D
, A
, B
, C
, 7, 10, 0x432aff97);
333 OP (FI
, C
, D
, A
, B
, 14, 15, 0xab9423a7);
334 OP (FI
, B
, C
, D
, A
, 5, 21, 0xfc93a039);
335 OP (FI
, A
, B
, C
, D
, 12, 6, 0x655b59c3);
336 OP (FI
, D
, A
, B
, C
, 3, 10, 0x8f0ccc92);
337 OP (FI
, C
, D
, A
, B
, 10, 15, 0xffeff47d);
338 OP (FI
, B
, C
, D
, A
, 1, 21, 0x85845dd1);
339 OP (FI
, A
, B
, C
, D
, 8, 6, 0x6fa87e4f);
340 OP (FI
, D
, A
, B
, C
, 15, 10, 0xfe2ce6e0);
341 OP (FI
, C
, D
, A
, B
, 6, 15, 0xa3014314);
342 OP (FI
, B
, C
, D
, A
, 13, 21, 0x4e0811a1);
343 OP (FI
, A
, B
, C
, D
, 4, 6, 0xf7537e82);
344 OP (FI
, D
, A
, B
, C
, 11, 10, 0xbd3af235);
345 OP (FI
, C
, D
, A
, B
, 2, 15, 0x2ad7d2bb);
346 OP (FI
, B
, C
, D
, A
, 9, 21, 0xeb86d391);
348 /* Add the starting values of the context. */
355 /* Put checksum in context given as argument. */