Update .travis.yml
[appimagekit/gsi.git] / md5.c
blobbe64d5ae18db03f3deced23dcb3607f463e1ebf7
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)
8 any later version.
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>. */
21 #ifdef HAVE_CONFIG_H
22 # include <config.h>
23 #endif
25 #include <sys/types.h>
27 # include <stdlib.h>
28 # include <string.h>
30 #include "md5.h"
32 #ifdef WORDS_BIGENDIAN
33 # define SWAP(n) \
34 (((n) << 24) | (((n) & 0xff00) << 8) | (((n) >> 8) & 0xff00) | ((n) >> 24))
35 #else
36 # define SWAP(n) (n)
37 #endif
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) */
47 void
48 md5_init_ctx (ctx)
49 struct md5_ctx *ctx;
51 ctx->A = 0x67452301;
52 ctx->B = 0xefcdab89;
53 ctx->C = 0x98badcfe;
54 ctx->D = 0x10325476;
57 /* Put result from CTX in first 16 bytes following RESBUF. The result must
58 be in little endian byte order. */
59 void *
60 md5_read_ctx (ctx, resbuf)
61 const struct md5_ctx *ctx;
62 void *resbuf;
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);
69 return resbuf;
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. */
75 int
76 md5_stream (stream, resblock)
77 FILE *stream;
78 void *resblock;
80 /* Important: BLOCKSIZE must be a multiple of 64. */
81 #define BLOCKSIZE 4096
82 struct md5_ctx ctx;
83 md5_uint32 len[2];
84 char buffer[BLOCKSIZE + 72];
85 size_t pad, sum;
87 /* Initialize the computation context. */
88 md5_init_ctx (&ctx);
90 len[0] = 0;
91 len[1] = 0;
93 /* Iterate over full file contents. */
94 while (1)
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. */
99 size_t n;
100 sum = 0;
102 /* Read block. Take care for partial reads. */
105 n = fread (buffer, 1, BLOCKSIZE - sum, stream);
107 sum += n;
109 while (sum < BLOCKSIZE && n != 0);
110 if (n == 0 && ferror (stream))
111 return 1;
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
115 increment. */
116 len[0] += sum;
117 if (len[0] < sum)
118 ++len[1];
120 /* If end of file is reached, end the loop. */
121 if (n == 0)
122 break;
124 /* Process buffer with BLOCKSIZE bytes. Note that
125 BLOCKSIZE % 64 == 0
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
135 (N + PAD) % 64 == 56
136 There is always at least one byte padded. I.e. even the alignment
137 is correctly aligned 64 padding bytes are added. */
138 pad = sum & 63;
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)
144 | (len[0] >> 29));
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);
151 return 0;
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
157 digest. */
158 void *
159 md5_buffer (buffer, len, resblock)
160 const char *buffer;
161 size_t len;
162 void *resblock;
164 struct md5_ctx ctx;
165 char restbuf[64 + 72];
166 size_t blocks = len & ~63;
167 size_t pad, rest;
169 /* Initialize the computation context. */
170 md5_init_ctx (&ctx);
172 /* Process whole buffer but last len % 64 bytes. */
173 md5_process_block (buffer, blocks, &ctx);
175 /* REST bytes are not processed yet. */
176 rest = len - blocks;
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. */
211 void
212 md5_process_block (buffer, len, ctx)
213 const void *buffer;
214 size_t len;
215 struct md5_ctx *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
227 the loop. */
228 while (words < endp)
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) \
244 do \
246 a += FF (b, c, d) + (*cwp++ = SWAP (*words)) + T; \
247 ++words; \
248 CYCLIC (a, s); \
249 a += b; \
251 while (0)
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
263 /* Round 1. */
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. */
284 #undef OP
285 #define OP(f, a, b, c, d, k, s, T) \
286 do \
288 a += f (b, c, d) + correct_words[k] + T; \
289 CYCLIC (a, s); \
290 a += b; \
292 while (0)
294 /* Round 2. */
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);
312 /* Round 3. */
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);
330 /* Round 4. */
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. */
349 A += A_save;
350 B += B_save;
351 C += C_save;
352 D += D_save;
355 /* Put checksum in context given as argument. */
356 ctx->A = A;
357 ctx->B = B;
358 ctx->C = C;
359 ctx->D = D;