37 #if !defined(md5_INCLUDED)
50 typedef unsigned char md5_byte_t;
51 typedef unsigned int md5_word_t;
54 typedef struct md5_state_s {
60 #if defined(__cplusplus)
65 MD5_STATIC
void md5_init(md5_state_t *pms);
69 md5_append(md5_state_t *pms,
const md5_byte_t *data,
size_t nbytes);
72 MD5_STATIC
void md5_finish(md5_state_t *pms, md5_byte_t digest[16]);
74 #if defined(__cplusplus)
133 #if !defined(MD5_STATIC)
138 #if defined(ARCH_IS_BIG_ENDIAN)
139 #define BYTE_ORDER (ARCH_IS_BIG_ENDIAN ? 1 : -1)
141 #define BYTE_ORDER (0)
144 #define T_MASK ((md5_word_t)~0)
145 #define T1 (T_MASK ^ 0x28955b87)
146 #define T2 (T_MASK ^ 0x173848a9)
147 #define T3 (0x242070db)
148 #define T4 (T_MASK ^ 0x3e423111)
149 #define T5 (T_MASK ^ 0x0a83f050)
150 #define T6 (0x4787c62a)
151 #define T7 (T_MASK ^ 0x57cfb9ec)
152 #define T8 (T_MASK ^ 0x02b96afe)
153 #define T9 (0x698098d8)
154 #define T10 (T_MASK ^ 0x74bb0850)
155 #define T11 (T_MASK ^ 0x0000a44e)
156 #define T12 (T_MASK ^ 0x76a32841)
157 #define T13 (0x6b901122)
158 #define T14 (T_MASK ^ 0x02678e6c)
159 #define T15 (T_MASK ^ 0x5986bc71)
160 #define T16 (0x49b40821)
161 #define T17 (T_MASK ^ 0x09e1da9d)
162 #define T18 (T_MASK ^ 0x3fbf4cbf)
163 #define T19 (0x265e5a51)
164 #define T20 (T_MASK ^ 0x16493855)
165 #define T21 (T_MASK ^ 0x29d0efa2)
166 #define T22 (0x02441453)
167 #define T23 (T_MASK ^ 0x275e197e)
168 #define T24 (T_MASK ^ 0x182c0437)
169 #define T25 (0x21e1cde6)
170 #define T26 (T_MASK ^ 0x3cc8f829)
171 #define T27 (T_MASK ^ 0x0b2af278)
172 #define T28 (0x455a14ed)
173 #define T29 (T_MASK ^ 0x561c16fa)
174 #define T30 (T_MASK ^ 0x03105c07)
175 #define T31 (0x676f02d9)
176 #define T32 (T_MASK ^ 0x72d5b375)
177 #define T33 (T_MASK ^ 0x0005c6bd)
178 #define T34 (T_MASK ^ 0x788e097e)
179 #define T35 (0x6d9d6122)
180 #define T36 (T_MASK ^ 0x021ac7f3)
181 #define T37 (T_MASK ^ 0x5b4115bb)
182 #define T38 (0x4bdecfa9)
183 #define T39 (T_MASK ^ 0x0944b49f)
184 #define T40 (T_MASK ^ 0x4140438f)
185 #define T41 (0x289b7ec6)
186 #define T42 (T_MASK ^ 0x155ed805)
187 #define T43 (T_MASK ^ 0x2b10cf7a)
188 #define T44 (0x04881d05)
189 #define T45 (T_MASK ^ 0x262b2fc6)
190 #define T46 (T_MASK ^ 0x1924661a)
191 #define T47 (0x1fa27cf8)
192 #define T48 (T_MASK ^ 0x3b53a99a)
193 #define T49 (T_MASK ^ 0x0bd6ddbb)
194 #define T50 (0x432aff97)
195 #define T51 (T_MASK ^ 0x546bdc58)
196 #define T52 (T_MASK ^ 0x036c5fc6)
197 #define T53 (0x655b59c3)
198 #define T54 (T_MASK ^ 0x70f3336d)
199 #define T55 (T_MASK ^ 0x00100b82)
200 #define T56 (T_MASK ^ 0x7a7ba22e)
201 #define T57 (0x6fa87e4f)
202 #define T58 (T_MASK ^ 0x01d3191f)
203 #define T59 (T_MASK ^ 0x5cfebceb)
204 #define T60 (0x4e0811a1)
205 #define T61 (T_MASK ^ 0x08ac817d)
206 #define T62 (T_MASK ^ 0x42c50dca)
207 #define T63 (0x2ad7d2bb)
208 #define T64 (T_MASK ^ 0x14792c6e)
211 md5_process(md5_state_t *pms,
const md5_byte_t *data )
213 md5_word_t a = pms->abcd[0], b = pms->abcd[1], c = pms->abcd[2],
232 static const int w = 1;
234 if (*((
const md5_byte_t *)&w))
242 if (!((data - (
const md5_byte_t *)0) & 3)) {
248 X = (
const md5_word_t *)(
const void *)data;
251 memcpy(xbuf, data, 64);
265 const md5_byte_t *xp = data;
273 for (i = 0; i < 16; ++i, xp += 4)
274 xbuf[i] = (md5_word_t)(xp[0]) + (md5_word_t)(xp[1] << 8)
275 + (md5_word_t)(xp[2] << 16)
276 + (md5_word_t)(xp[3] << 24);
281 #define ROTATE_LEFT(x, n) (((x) << (n)) | ((x) >> (32 - (n))))
286 #define F(x, y, z) (((x) & (y)) | (~(x) & (z)))
287 #define SET(a, b, c, d, k, s, Ti) \
288 t = a + F(b, c, d) + X[k] + Ti; \
289 a = ROTATE_LEFT(t, s) + b
292 SET(a, b, c, d, 0, 7, T1);
293 SET(d, a, b, c, 1, 12, T2);
294 SET(c, d, a, b, 2, 17, T3);
295 SET(b, c, d, a, 3, 22, T4);
296 SET(a, b, c, d, 4, 7, T5);
297 SET(d, a, b, c, 5, 12, T6);
298 SET(c, d, a, b, 6, 17, T7);
299 SET(b, c, d, a, 7, 22, T8);
300 SET(a, b, c, d, 8, 7, T9);
301 SET(d, a, b, c, 9, 12, T10);
302 SET(c, d, a, b, 10, 17, T11);
303 SET(b, c, d, a, 11, 22, T12);
304 SET(a, b, c, d, 12, 7, T13);
305 SET(d, a, b, c, 13, 12, T14);
306 SET(c, d, a, b, 14, 17, T15);
307 SET(b, c, d, a, 15, 22, T16);
313 #define G(x, y, z) (((x) & (z)) | ((y) & ~(z)))
314 #define SET(a, b, c, d, k, s, Ti) \
315 t = a + G(b, c, d) + X[k] + Ti; \
316 a = ROTATE_LEFT(t, s) + b
319 SET(a, b, c, d, 1, 5, T17);
320 SET(d, a, b, c, 6, 9, T18);
321 SET(c, d, a, b, 11, 14, T19);
322 SET(b, c, d, a, 0, 20, T20);
323 SET(a, b, c, d, 5, 5, T21);
324 SET(d, a, b, c, 10, 9, T22);
325 SET(c, d, a, b, 15, 14, T23);
326 SET(b, c, d, a, 4, 20, T24);
327 SET(a, b, c, d, 9, 5, T25);
328 SET(d, a, b, c, 14, 9, T26);
329 SET(c, d, a, b, 3, 14, T27);
330 SET(b, c, d, a, 8, 20, T28);
331 SET(a, b, c, d, 13, 5, T29);
332 SET(d, a, b, c, 2, 9, T30);
333 SET(c, d, a, b, 7, 14, T31);
334 SET(b, c, d, a, 12, 20, T32);
340 #define H(x, y, z) ((x) ^ (y) ^ (z))
341 #define SET(a, b, c, d, k, s, Ti) \
342 t = a + H(b, c, d) + X[k] + Ti; \
343 a = ROTATE_LEFT(t, s) + b
346 SET(a, b, c, d, 5, 4, T33);
347 SET(d, a, b, c, 8, 11, T34);
348 SET(c, d, a, b, 11, 16, T35);
349 SET(b, c, d, a, 14, 23, T36);
350 SET(a, b, c, d, 1, 4, T37);
351 SET(d, a, b, c, 4, 11, T38);
352 SET(c, d, a, b, 7, 16, T39);
353 SET(b, c, d, a, 10, 23, T40);
354 SET(a, b, c, d, 13, 4, T41);
355 SET(d, a, b, c, 0, 11, T42);
356 SET(c, d, a, b, 3, 16, T43);
357 SET(b, c, d, a, 6, 23, T44);
358 SET(a, b, c, d, 9, 4, T45);
359 SET(d, a, b, c, 12, 11, T46);
360 SET(c, d, a, b, 15, 16, T47);
361 SET(b, c, d, a, 2, 23, T48);
367 #define I(x, y, z) ((y) ^ ((x) | ~(z)))
368 #define SET(a, b, c, d, k, s, Ti) \
369 t = a + I(b, c, d) + X[k] + Ti; \
370 a = ROTATE_LEFT(t, s) + b
373 SET(a, b, c, d, 0, 6, T49);
374 SET(d, a, b, c, 7, 10, T50);
375 SET(c, d, a, b, 14, 15, T51);
376 SET(b, c, d, a, 5, 21, T52);
377 SET(a, b, c, d, 12, 6, T53);
378 SET(d, a, b, c, 3, 10, T54);
379 SET(c, d, a, b, 10, 15, T55);
380 SET(b, c, d, a, 1, 21, T56);
381 SET(a, b, c, d, 8, 6, T57);
382 SET(d, a, b, c, 15, 10, T58);
383 SET(c, d, a, b, 6, 15, T59);
384 SET(b, c, d, a, 13, 21, T60);
385 SET(a, b, c, d, 4, 6, T61);
386 SET(d, a, b, c, 11, 10, T62);
387 SET(c, d, a, b, 2, 15, T63);
388 SET(b, c, d, a, 9, 21, T64);
401 md5_init(md5_state_t *pms)
403 pms->count[0] = pms->count[1] = 0;
404 pms->abcd[0] = 0x67452301;
405 pms->abcd[1] = T_MASK ^ 0x10325476;
406 pms->abcd[2] = T_MASK ^ 0x67452301;
407 pms->abcd[3] = 0x10325476;
411 md5_append(md5_state_t *pms,
const md5_byte_t *data,
size_t nbytes)
413 const md5_byte_t *p = data;
414 size_t left = nbytes;
415 size_t offset = (pms->count[0] >> 3) & 63;
416 md5_word_t nbits = (md5_word_t)(nbytes << 3);
422 pms->count[1] += (md5_word_t)(nbytes >> 29);
423 pms->count[0] += nbits;
424 if (pms->count[0] < nbits)
429 size_t copy = (offset + nbytes > 64 ? 64 - offset : nbytes);
431 memcpy(pms->buf + offset, p, copy);
432 if (offset + copy < 64)
436 md5_process(pms, pms->buf);
440 for (; left >= 64; p += 64, left -= 64)
445 memcpy(pms->buf, p, left);
449 md5_finish(md5_state_t *pms, md5_byte_t digest[16])
451 static const md5_byte_t pad[64] = {0x80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
452 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
453 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
454 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
455 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
460 for (i = 0; i < 8; ++i)
461 data[i] = (md5_byte_t)(pms->count[i >> 2] >> ((i & 3) << 3));
463 md5_append(pms, pad, ((55 - (pms->count[0] >> 3)) & 63) + 1);
465 md5_append(pms, data, 8);
466 for (i = 0; i < 16; ++i)
467 digest[i] = (md5_byte_t)(pms->abcd[i >> 2] >> ((i & 3) << 3));