#include "md5.h"#include <string.h>#include <stdio.h>#include "MALLOC.h"Include dependency graph for md5.c:

Go to the source code of this file.
Defines | |
| #define | BYTE_ORDER 0 |
| #define | T_MASK ((md5_word_t)~0) |
| #define | T1 /* 0xd76aa478 */ (T_MASK ^ 0x28955b87) |
| #define | T2 /* 0xe8c7b756 */ (T_MASK ^ 0x173848a9) |
| #define | T3 0x242070db |
| #define | T4 /* 0xc1bdceee */ (T_MASK ^ 0x3e423111) |
| #define | T5 /* 0xf57c0faf */ (T_MASK ^ 0x0a83f050) |
| #define | T6 0x4787c62a |
| #define | T7 /* 0xa8304613 */ (T_MASK ^ 0x57cfb9ec) |
| #define | T8 /* 0xfd469501 */ (T_MASK ^ 0x02b96afe) |
| #define | T9 0x698098d8 |
| #define | T10 /* 0x8b44f7af */ (T_MASK ^ 0x74bb0850) |
| #define | T11 /* 0xffff5bb1 */ (T_MASK ^ 0x0000a44e) |
| #define | T12 /* 0x895cd7be */ (T_MASK ^ 0x76a32841) |
| #define | T13 0x6b901122 |
| #define | T14 /* 0xfd987193 */ (T_MASK ^ 0x02678e6c) |
| #define | T15 /* 0xa679438e */ (T_MASK ^ 0x5986bc71) |
| #define | T16 0x49b40821 |
| #define | T17 /* 0xf61e2562 */ (T_MASK ^ 0x09e1da9d) |
| #define | T18 /* 0xc040b340 */ (T_MASK ^ 0x3fbf4cbf) |
| #define | T19 0x265e5a51 |
| #define | T20 /* 0xe9b6c7aa */ (T_MASK ^ 0x16493855) |
| #define | T21 /* 0xd62f105d */ (T_MASK ^ 0x29d0efa2) |
| #define | T22 0x02441453 |
| #define | T23 /* 0xd8a1e681 */ (T_MASK ^ 0x275e197e) |
| #define | T24 /* 0xe7d3fbc8 */ (T_MASK ^ 0x182c0437) |
| #define | T25 0x21e1cde6 |
| #define | T26 /* 0xc33707d6 */ (T_MASK ^ 0x3cc8f829) |
| #define | T27 /* 0xf4d50d87 */ (T_MASK ^ 0x0b2af278) |
| #define | T28 0x455a14ed |
| #define | T29 /* 0xa9e3e905 */ (T_MASK ^ 0x561c16fa) |
| #define | T30 /* 0xfcefa3f8 */ (T_MASK ^ 0x03105c07) |
| #define | T31 0x676f02d9 |
| #define | T32 /* 0x8d2a4c8a */ (T_MASK ^ 0x72d5b375) |
| #define | T33 /* 0xfffa3942 */ (T_MASK ^ 0x0005c6bd) |
| #define | T34 /* 0x8771f681 */ (T_MASK ^ 0x788e097e) |
| #define | T35 0x6d9d6122 |
| #define | T36 /* 0xfde5380c */ (T_MASK ^ 0x021ac7f3) |
| #define | T37 /* 0xa4beea44 */ (T_MASK ^ 0x5b4115bb) |
| #define | T38 0x4bdecfa9 |
| #define | T39 /* 0xf6bb4b60 */ (T_MASK ^ 0x0944b49f) |
| #define | T40 /* 0xbebfbc70 */ (T_MASK ^ 0x4140438f) |
| #define | T41 0x289b7ec6 |
| #define | T42 /* 0xeaa127fa */ (T_MASK ^ 0x155ed805) |
| #define | T43 /* 0xd4ef3085 */ (T_MASK ^ 0x2b10cf7a) |
| #define | T44 0x04881d05 |
| #define | T45 /* 0xd9d4d039 */ (T_MASK ^ 0x262b2fc6) |
| #define | T46 /* 0xe6db99e5 */ (T_MASK ^ 0x1924661a) |
| #define | T47 0x1fa27cf8 |
| #define | T48 /* 0xc4ac5665 */ (T_MASK ^ 0x3b53a99a) |
| #define | T49 /* 0xf4292244 */ (T_MASK ^ 0x0bd6ddbb) |
| #define | T50 0x432aff97 |
| #define | T51 /* 0xab9423a7 */ (T_MASK ^ 0x546bdc58) |
| #define | T52 /* 0xfc93a039 */ (T_MASK ^ 0x036c5fc6) |
| #define | T53 0x655b59c3 |
| #define | T54 /* 0x8f0ccc92 */ (T_MASK ^ 0x70f3336d) |
| #define | T55 /* 0xffeff47d */ (T_MASK ^ 0x00100b82) |
| #define | T56 /* 0x85845dd1 */ (T_MASK ^ 0x7a7ba22e) |
| #define | T57 0x6fa87e4f |
| #define | T58 /* 0xfe2ce6e0 */ (T_MASK ^ 0x01d3191f) |
| #define | T59 /* 0xa3014314 */ (T_MASK ^ 0x5cfebceb) |
| #define | T60 0x4e0811a1 |
| #define | T61 /* 0xf7537e82 */ (T_MASK ^ 0x08ac817d) |
| #define | T62 /* 0xbd3af235 */ (T_MASK ^ 0x42c50dca) |
| #define | T63 0x2ad7d2bb |
| #define | T64 /* 0xeb86d391 */ (T_MASK ^ 0x14792c6e) |
| #define | ROTATE_LEFT(x, n) (((x) << (n)) | ((x) >> (32 - (n)))) |
| #define | F(x, y, z) (((x) & (y)) | (~(x) & (z))) |
| #define | SET(a, b, c, d, k, s, Ti) |
| #define | G(x, y, z) (((x) & (z)) | ((y) & ~(z))) |
| #define | SET(a, b, c, d, k, s, Ti) |
| #define | H(x, y, z) ((x) ^ (y) ^ (z)) |
| #define | SET(a, b, c, d, k, s, Ti) |
| #define | I(x, y, z) ((y) ^ ((x) | ~(z))) |
| #define | SET(a, b, c, d, k, s, Ti) |
Functions | |
| char * | md5_str (char *p) |
| char * | md5_file (FILE *fp) |
| static void | md5_process (md5_state_t *pms, const md5_byte_t *data) |
| void | md5_init (md5_state_t *pms) |
| void | md5_append (md5_state_t *pms, const md5_byte_t *data, int nbytes) |
| void | md5_finish (md5_state_t *pms, md5_byte_t digest[16]) |
| #define T1 /* 0xd76aa478 */ (T_MASK ^ 0x28955b87) |
| #define T10 /* 0x8b44f7af */ (T_MASK ^ 0x74bb0850) |
| #define T11 /* 0xffff5bb1 */ (T_MASK ^ 0x0000a44e) |
| #define T12 /* 0x895cd7be */ (T_MASK ^ 0x76a32841) |
| #define T13 0x6b901122 |
| #define T14 /* 0xfd987193 */ (T_MASK ^ 0x02678e6c) |
| #define T15 /* 0xa679438e */ (T_MASK ^ 0x5986bc71) |
| #define T16 0x49b40821 |
| #define T17 /* 0xf61e2562 */ (T_MASK ^ 0x09e1da9d) |
| #define T18 /* 0xc040b340 */ (T_MASK ^ 0x3fbf4cbf) |
| #define T19 0x265e5a51 |
| #define T2 /* 0xe8c7b756 */ (T_MASK ^ 0x173848a9) |
| #define T20 /* 0xe9b6c7aa */ (T_MASK ^ 0x16493855) |
| #define T21 /* 0xd62f105d */ (T_MASK ^ 0x29d0efa2) |
| #define T22 0x02441453 |
| #define T23 /* 0xd8a1e681 */ (T_MASK ^ 0x275e197e) |
| #define T24 /* 0xe7d3fbc8 */ (T_MASK ^ 0x182c0437) |
| #define T25 0x21e1cde6 |
| #define T26 /* 0xc33707d6 */ (T_MASK ^ 0x3cc8f829) |
| #define T27 /* 0xf4d50d87 */ (T_MASK ^ 0x0b2af278) |
| #define T28 0x455a14ed |
| #define T29 /* 0xa9e3e905 */ (T_MASK ^ 0x561c16fa) |
| #define T3 0x242070db |
| #define T30 /* 0xfcefa3f8 */ (T_MASK ^ 0x03105c07) |
| #define T31 0x676f02d9 |
| #define T32 /* 0x8d2a4c8a */ (T_MASK ^ 0x72d5b375) |
| #define T33 /* 0xfffa3942 */ (T_MASK ^ 0x0005c6bd) |
| #define T34 /* 0x8771f681 */ (T_MASK ^ 0x788e097e) |
| #define T35 0x6d9d6122 |
| #define T36 /* 0xfde5380c */ (T_MASK ^ 0x021ac7f3) |
| #define T37 /* 0xa4beea44 */ (T_MASK ^ 0x5b4115bb) |
| #define T38 0x4bdecfa9 |
| #define T39 /* 0xf6bb4b60 */ (T_MASK ^ 0x0944b49f) |
| #define T4 /* 0xc1bdceee */ (T_MASK ^ 0x3e423111) |
| #define T40 /* 0xbebfbc70 */ (T_MASK ^ 0x4140438f) |
| #define T41 0x289b7ec6 |
| #define T42 /* 0xeaa127fa */ (T_MASK ^ 0x155ed805) |
| #define T43 /* 0xd4ef3085 */ (T_MASK ^ 0x2b10cf7a) |
| #define T44 0x04881d05 |
| #define T45 /* 0xd9d4d039 */ (T_MASK ^ 0x262b2fc6) |
| #define T46 /* 0xe6db99e5 */ (T_MASK ^ 0x1924661a) |
| #define T47 0x1fa27cf8 |
| #define T48 /* 0xc4ac5665 */ (T_MASK ^ 0x3b53a99a) |
| #define T49 /* 0xf4292244 */ (T_MASK ^ 0x0bd6ddbb) |
| #define T5 /* 0xf57c0faf */ (T_MASK ^ 0x0a83f050) |
| #define T50 0x432aff97 |
| #define T51 /* 0xab9423a7 */ (T_MASK ^ 0x546bdc58) |
| #define T52 /* 0xfc93a039 */ (T_MASK ^ 0x036c5fc6) |
| #define T53 0x655b59c3 |
| #define T54 /* 0x8f0ccc92 */ (T_MASK ^ 0x70f3336d) |
| #define T55 /* 0xffeff47d */ (T_MASK ^ 0x00100b82) |
| #define T56 /* 0x85845dd1 */ (T_MASK ^ 0x7a7ba22e) |
| #define T57 0x6fa87e4f |
| #define T58 /* 0xfe2ce6e0 */ (T_MASK ^ 0x01d3191f) |
| #define T59 /* 0xa3014314 */ (T_MASK ^ 0x5cfebceb) |
| #define T6 0x4787c62a |
| #define T60 0x4e0811a1 |
| #define T61 /* 0xf7537e82 */ (T_MASK ^ 0x08ac817d) |
| #define T62 /* 0xbd3af235 */ (T_MASK ^ 0x42c50dca) |
| #define T63 0x2ad7d2bb |
| #define T64 /* 0xeb86d391 */ (T_MASK ^ 0x14792c6e) |
| #define T7 /* 0xa8304613 */ (T_MASK ^ 0x57cfb9ec) |
| #define T8 /* 0xfd469501 */ (T_MASK ^ 0x02b96afe) |
| #define T9 0x698098d8 |
| #define T_MASK ((md5_word_t)~0) |
| void md5_append | ( | md5_state_t * | pms, | |
| const md5_byte_t * | data, | |||
| int | nbytes | |||
| ) |
Definition at line 324 of file md5.c.
References md5_state_s::buf, md5_state_s::count, left, md5_process(), memcpy(), offset, and p.
Referenced by md5_file(), md5_finish(), and md5_str().
00325 { 00326 const md5_byte_t *p = data; 00327 int left = nbytes; 00328 int offset = (pms->count[0] >> 3) & 63; 00329 md5_word_t nbits = (md5_word_t)(nbytes << 3); 00330 00331 if (nbytes <= 0) 00332 return; 00333 00334 /* Update the message length. */ 00335 pms->count[1] += nbytes >> 29; 00336 pms->count[0] += nbits; 00337 if (pms->count[0] < nbits) 00338 pms->count[1]++; 00339 00340 /* Process an initial partial block. */ 00341 if (offset) { 00342 int copy = (offset + nbytes > 64 ? 64 - offset : nbytes); 00343 00344 memcpy(pms->buf + offset, p, copy); 00345 if (offset + copy < 64) 00346 return; 00347 p += copy; 00348 left -= copy; 00349 md5_process(pms, pms->buf); 00350 } 00351 00352 /* Process full blocks. */ 00353 for (; left >= 64; p += 64, left -= 64) 00354 md5_process(pms, p); 00355 00356 /* Process a final partial block. */ 00357 if (left) 00358 memcpy(pms->buf, p, left); 00359 }
Here is the call graph for this function:

Here is the caller graph for this function:

| char* md5_file | ( | FILE * | fp | ) |
| void md5_finish | ( | md5_state_t * | pms, | |
| md5_byte_t | digest[16] | |||
| ) |
Definition at line 361 of file md5.c.
References md5_state_s::abcd, md5_state_s::count, data, i, and md5_append().
Referenced by md5_file(), and md5_str().
00362 { 00363 static const md5_byte_t pad[64] = { 00364 0x80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 00365 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 00366 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 00367 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 00368 }; 00369 md5_byte_t data[8]; 00370 int i; 00371 00372 /* Save the length before padding. */ 00373 for (i = 0; i < 8; ++i) 00374 data[i] = (md5_byte_t)(pms->count[i >> 2] >> ((i & 3) << 3)); 00375 /* Pad to 56 bytes mod 64. */ 00376 md5_append(pms, pad, ((55 - (pms->count[0] >> 3)) & 63) + 1); 00377 /* Append the length. */ 00378 md5_append(pms, data, 8); 00379 for (i = 0; i < 16; ++i) 00380 digest[i] = (md5_byte_t)(pms->abcd[i >> 2] >> ((i & 3) << 3)); 00381 }
Here is the call graph for this function:

Here is the caller graph for this function:

| void md5_init | ( | md5_state_t * | pms | ) |
Definition at line 315 of file md5.c.
References md5_state_s::abcd, md5_state_s::count, and T_MASK.
Referenced by md5_file(), and md5_str().
00316 { 00317 pms->count[0] = pms->count[1] = 0; 00318 pms->abcd[0] = 0x67452301; 00319 pms->abcd[1] = /*0xefcdab89*/ T_MASK ^ 0x10325476; 00320 pms->abcd[2] = /*0x98badcfe*/ T_MASK ^ 0x67452301; 00321 pms->abcd[3] = 0x10325476; 00322 }
Here is the caller graph for this function:

| static void md5_process | ( | md5_state_t * | pms, | |
| const md5_byte_t * | data | |||
| ) | [static] |
Definition at line 136 of file md5.c.
References a, md5_state_s::abcd, b, i, memcpy(), SET, t, T1, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T2, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T3, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T4, T40, T41, T42, T43, T44, T45, T46, T47, T48, T49, T5, T50, T51, T52, T53, T54, T55, T56, T57, T58, T59, T6, T60, T61, T62, T63, T64, T7, T8, T9, w, and X.
Referenced by md5_append().
00137 { 00138 md5_word_t 00139 a = pms->abcd[0], b = pms->abcd[1], 00140 c = pms->abcd[2], d = pms->abcd[3]; 00141 md5_word_t t; 00142 #if BYTE_ORDER > 0 00143 /* Define storage only for big-endian CPUs. */ 00144 md5_word_t X[16]; 00145 #else 00146 /* Define storage for little-endian or both types of CPUs. */ 00147 md5_word_t xbuf[16]; 00148 const md5_word_t *X; 00149 #endif 00150 { 00151 #if BYTE_ORDER == 0 00152 /* 00153 * Determine dynamically whether this is a big-endian or 00154 * little-endian machine, since we can use a more efficient 00155 * algorithm on the latter. 00156 */ 00157 static const int w = 1; 00158 00159 if (*((const md5_byte_t *)&w)) /* dynamic little-endian */ 00160 #endif 00161 #if BYTE_ORDER <= 0 /* little-endian */ 00162 { 00163 /* 00164 * On little-endian machines, we can process properly aligned 00165 * data without copying it. 00166 */ 00167 if (!((data - (const md5_byte_t *)0) & 3)) { 00168 /* data are properly aligned */ 00169 X = (const md5_word_t *)data; 00170 } else { 00171 /* not aligned */ 00172 memcpy(xbuf, data, 64); 00173 X = xbuf; 00174 } 00175 } 00176 #endif 00177 #if BYTE_ORDER == 0 00178 else /* dynamic big-endian */ 00179 #endif 00180 #if BYTE_ORDER >= 0 /* big-endian */ 00181 { 00182 /* 00183 * On big-endian machines, we must arrange the bytes in the 00184 * right order. 00185 */ 00186 const md5_byte_t *xp = data; 00187 int i; 00188 00189 # if BYTE_ORDER == 0 00190 X = xbuf; /* (dynamic only) */ 00191 # else 00192 # define xbuf X /* (static only) */ 00193 # endif 00194 for (i = 0; i < 16; ++i, xp += 4) 00195 xbuf[i] = xp[0] + (xp[1] << 8) + (xp[2] << 16) + (xp[3] << 24); 00196 } 00197 #endif 00198 } 00199 00200 #define ROTATE_LEFT(x, n) (((x) << (n)) | ((x) >> (32 - (n)))) 00201 00202 /* Round 1. */ 00203 /* Let [abcd k s i] denote the operation 00204 a = b + ((a + F(b,c,d) + X[k] + T[i]) <<< s). */ 00205 #define F(x, y, z) (((x) & (y)) | (~(x) & (z))) 00206 #define SET(a, b, c, d, k, s, Ti)\ 00207 t = a + F(b,c,d) + X[k] + Ti;\ 00208 a = ROTATE_LEFT(t, s) + b 00209 /* Do the following 16 operations. */ 00210 SET(a, b, c, d, 0, 7, T1); 00211 SET(d, a, b, c, 1, 12, T2); 00212 SET(c, d, a, b, 2, 17, T3); 00213 SET(b, c, d, a, 3, 22, T4); 00214 SET(a, b, c, d, 4, 7, T5); 00215 SET(d, a, b, c, 5, 12, T6); 00216 SET(c, d, a, b, 6, 17, T7); 00217 SET(b, c, d, a, 7, 22, T8); 00218 SET(a, b, c, d, 8, 7, T9); 00219 SET(d, a, b, c, 9, 12, T10); 00220 SET(c, d, a, b, 10, 17, T11); 00221 SET(b, c, d, a, 11, 22, T12); 00222 SET(a, b, c, d, 12, 7, T13); 00223 SET(d, a, b, c, 13, 12, T14); 00224 SET(c, d, a, b, 14, 17, T15); 00225 SET(b, c, d, a, 15, 22, T16); 00226 #undef SET 00227 00228 /* Round 2. */ 00229 /* Let [abcd k s i] denote the operation 00230 a = b + ((a + G(b,c,d) + X[k] + T[i]) <<< s). */ 00231 #define G(x, y, z) (((x) & (z)) | ((y) & ~(z))) 00232 #define SET(a, b, c, d, k, s, Ti)\ 00233 t = a + G(b,c,d) + X[k] + Ti;\ 00234 a = ROTATE_LEFT(t, s) + b 00235 /* Do the following 16 operations. */ 00236 SET(a, b, c, d, 1, 5, T17); 00237 SET(d, a, b, c, 6, 9, T18); 00238 SET(c, d, a, b, 11, 14, T19); 00239 SET(b, c, d, a, 0, 20, T20); 00240 SET(a, b, c, d, 5, 5, T21); 00241 SET(d, a, b, c, 10, 9, T22); 00242 SET(c, d, a, b, 15, 14, T23); 00243 SET(b, c, d, a, 4, 20, T24); 00244 SET(a, b, c, d, 9, 5, T25); 00245 SET(d, a, b, c, 14, 9, T26); 00246 SET(c, d, a, b, 3, 14, T27); 00247 SET(b, c, d, a, 8, 20, T28); 00248 SET(a, b, c, d, 13, 5, T29); 00249 SET(d, a, b, c, 2, 9, T30); 00250 SET(c, d, a, b, 7, 14, T31); 00251 SET(b, c, d, a, 12, 20, T32); 00252 #undef SET 00253 00254 /* Round 3. */ 00255 /* Let [abcd k s t] denote the operation 00256 a = b + ((a + H(b,c,d) + X[k] + T[i]) <<< s). */ 00257 #define H(x, y, z) ((x) ^ (y) ^ (z)) 00258 #define SET(a, b, c, d, k, s, Ti)\ 00259 t = a + H(b,c,d) + X[k] + Ti;\ 00260 a = ROTATE_LEFT(t, s) + b 00261 /* Do the following 16 operations. */ 00262 SET(a, b, c, d, 5, 4, T33); 00263 SET(d, a, b, c, 8, 11, T34); 00264 SET(c, d, a, b, 11, 16, T35); 00265 SET(b, c, d, a, 14, 23, T36); 00266 SET(a, b, c, d, 1, 4, T37); 00267 SET(d, a, b, c, 4, 11, T38); 00268 SET(c, d, a, b, 7, 16, T39); 00269 SET(b, c, d, a, 10, 23, T40); 00270 SET(a, b, c, d, 13, 4, T41); 00271 SET(d, a, b, c, 0, 11, T42); 00272 SET(c, d, a, b, 3, 16, T43); 00273 SET(b, c, d, a, 6, 23, T44); 00274 SET(a, b, c, d, 9, 4, T45); 00275 SET(d, a, b, c, 12, 11, T46); 00276 SET(c, d, a, b, 15, 16, T47); 00277 SET(b, c, d, a, 2, 23, T48); 00278 #undef SET 00279 00280 /* Round 4. */ 00281 /* Let [abcd k s t] denote the operation 00282 a = b + ((a + I(b,c,d) + X[k] + T[i]) <<< s). */ 00283 #define I(x, y, z) ((y) ^ ((x) | ~(z))) 00284 #define SET(a, b, c, d, k, s, Ti)\ 00285 t = a + I(b,c,d) + X[k] + Ti;\ 00286 a = ROTATE_LEFT(t, s) + b 00287 /* Do the following 16 operations. */ 00288 SET(a, b, c, d, 0, 6, T49); 00289 SET(d, a, b, c, 7, 10, T50); 00290 SET(c, d, a, b, 14, 15, T51); 00291 SET(b, c, d, a, 5, 21, T52); 00292 SET(a, b, c, d, 12, 6, T53); 00293 SET(d, a, b, c, 3, 10, T54); 00294 SET(c, d, a, b, 10, 15, T55); 00295 SET(b, c, d, a, 1, 21, T56); 00296 SET(a, b, c, d, 8, 6, T57); 00297 SET(d, a, b, c, 15, 10, T58); 00298 SET(c, d, a, b, 6, 15, T59); 00299 SET(b, c, d, a, 13, 21, T60); 00300 SET(a, b, c, d, 4, 6, T61); 00301 SET(d, a, b, c, 11, 10, T62); 00302 SET(c, d, a, b, 2, 15, T63); 00303 SET(b, c, d, a, 9, 21, T64); 00304 #undef SET 00305 00306 /* Then perform the following additions. (That is increment each 00307 of the four registers by the value it had before this block 00308 was started.) */ 00309 pms->abcd[0] += a; 00310 pms->abcd[1] += b; 00311 pms->abcd[2] += c; 00312 pms->abcd[3] += d; 00313 }
Here is the call graph for this function:

Here is the caller graph for this function:

| char* md5_str | ( | char * | p | ) |
1.5.1