jack1 codebase
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

564 lines
16KB

  1. /*
  2. * Functions to compute MD5 message digest of files or memory blocks
  3. * according to the definition of MD5 in RFC 1321 from April 1992.
  4. * Copyright (C) 1995, 1996 Free Software Foundation, Inc. NOTE: The
  5. * canonical source of this file is maintained with the GNU C Library.
  6. * Bugs can be reported to bug-glibc@prep.ai.mit.edu.
  7. *
  8. * This program is free software; you can redistribute it and/or modify
  9. * it under the terms of the GNU General Public License as published
  10. * by the Free Software Foundation; either version 2, or (at your
  11. * option) any later version.
  12. *
  13. * This program is distributed in the hope that it will be useful, but
  14. * WITHOUT ANY WARRANTY; without even the implied warranty of
  15. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
  16. * General Public License for more details.
  17. *
  18. * You should have received a copy of the GNU General Public License
  19. * along with this program; if not, write to the Free Software
  20. * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
  21. * 02111-1307, USA.
  22. *
  23. * Written by Ulrich Drepper <drepper@gnu.ai.mit.edu>, 1995.
  24. * Modified by Gray Watson <http://256.com/gray/>, 1997.
  25. *
  26. * $Id$
  27. */
  28. /*
  29. * NOTE: during quick performance tests on a Sun Sparc Ultra 1 and an
  30. * Alpha 255 300, these functions performed upwards of 3mb/sec
  31. * including disk I/O time.
  32. */
  33. /*
  34. * MD5 Test Suite from RFC1321: http://ds.internic.net:/rfc/rfc1321.txt
  35. *
  36. * MD5 ("") = d41d8cd98f00b204e9800998ecf8427e
  37. * MD5 ("a") = 0cc175b9c0f1b6a831c399e269772661
  38. * MD5 ("abc") = 900150983cd24fb0d6963f7d28e17f72
  39. * MD5 ("message digest") = f96b697d7cb7938d525a2f31aaf161d0
  40. * MD5 ("abcdefghijklmnopqrstuvwxyz") = c3fcd3d76192e4007dfb496cca67e13b
  41. * MD5 ("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789") =
  42. * d174ab98d277d9f5a5611c2c9f419d9f
  43. * MD5 ("123456789012345678901234567890123456789012345678901234567890123456
  44. * 78901234567890") = 57edf4a22be3c955ac49da2e2107b67a
  45. */
  46. #include <stdlib.h>
  47. #include <string.h>
  48. #include <sys/types.h>
  49. #include "md5.h"
  50. #include "md5_loc.h"
  51. /* static char *rcs_id =
  52. "$Id$"; */
  53. /* version id for the library */
  54. /* static char *version_id = "$MD5Version: 1.0.0 November-19-1997 $"; */
  55. /****************************** local routines *******************************/
  56. /*
  57. * process_block
  58. *
  59. * DESCRIPTION:
  60. *
  61. * Process a block of bytes into a MD5 state structure.
  62. *
  63. * RETURNS:
  64. *
  65. * None.
  66. *
  67. * ARGUMENTS:
  68. *
  69. * md5_p - Pointer to MD5 structure from which we are getting the result.
  70. *
  71. * buffer - A buffer of bytes whose MD5 signature we are calculating.
  72. *
  73. * buf_len - The length of the buffer.
  74. */
  75. static void process_block(md5_t *md5_p, const void *buffer,
  76. const unsigned int buf_len)
  77. {
  78. md5_uint32 correct[16];
  79. const void *buf_p = buffer, *end_p;
  80. unsigned int words_n;
  81. md5_uint32 A, B, C, D;
  82. words_n = buf_len / sizeof(md5_uint32);
  83. end_p = (char *)buf_p + words_n * sizeof(md5_uint32);
  84. A = md5_p->md_A;
  85. B = md5_p->md_B;
  86. C = md5_p->md_C;
  87. D = md5_p->md_D;
  88. /*
  89. * First increment the byte count. RFC 1321 specifies the possible
  90. * length of the file up to 2^64 bits. Here we only compute the
  91. * number of bytes with a double word increment. Modified to do
  92. * this to better avoid overflows in the lower word -- Gray 10/97.
  93. */
  94. if (md5_p->md_total[0] > MAX_MD5_UINT32 - buf_len) {
  95. md5_p->md_total[1]++;
  96. md5_p->md_total[0] -= (MAX_MD5_UINT32 - buf_len);
  97. }
  98. else {
  99. md5_p->md_total[0] += buf_len;
  100. }
  101. /*
  102. * Process all bytes in the buffer with MD5_BLOCK bytes in each
  103. * round of the loop.
  104. */
  105. while (buf_p < end_p) {
  106. md5_uint32 A_save, B_save, C_save, D_save;
  107. md5_uint32 *corr_p = correct;
  108. A_save = A;
  109. B_save = B;
  110. C_save = C;
  111. D_save = D;
  112. /*
  113. * Before we start, one word to the strange constants. They are
  114. * defined in RFC 1321 as
  115. *
  116. * T[i] = (int) (4294967296.0 * fabs (sin (i))), i=1..MD5_BLOCK
  117. */
  118. /* Round 1. */
  119. OP1 (A, B, C, D, buf_p, corr_p, 7, 0xd76aa478);
  120. OP1 (D, A, B, C, buf_p, corr_p, 12, 0xe8c7b756);
  121. OP1 (C, D, A, B, buf_p, corr_p, 17, 0x242070db);
  122. OP1 (B, C, D, A, buf_p, corr_p, 22, 0xc1bdceee);
  123. OP1 (A, B, C, D, buf_p, corr_p, 7, 0xf57c0faf);
  124. OP1 (D, A, B, C, buf_p, corr_p, 12, 0x4787c62a);
  125. OP1 (C, D, A, B, buf_p, corr_p, 17, 0xa8304613);
  126. OP1 (B, C, D, A, buf_p, corr_p, 22, 0xfd469501);
  127. OP1 (A, B, C, D, buf_p, corr_p, 7, 0x698098d8);
  128. OP1 (D, A, B, C, buf_p, corr_p, 12, 0x8b44f7af);
  129. OP1 (C, D, A, B, buf_p, corr_p, 17, 0xffff5bb1);
  130. OP1 (B, C, D, A, buf_p, corr_p, 22, 0x895cd7be);
  131. OP1 (A, B, C, D, buf_p, corr_p, 7, 0x6b901122);
  132. OP1 (D, A, B, C, buf_p, corr_p, 12, 0xfd987193);
  133. OP1 (C, D, A, B, buf_p, corr_p, 17, 0xa679438e);
  134. OP1 (B, C, D, A, buf_p, corr_p, 22, 0x49b40821);
  135. /* Round 2. */
  136. OP234 (FG, A, B, C, D, correct[ 1], 5, 0xf61e2562);
  137. OP234 (FG, D, A, B, C, correct[ 6], 9, 0xc040b340);
  138. OP234 (FG, C, D, A, B, correct[ 11], 14, 0x265e5a51);
  139. OP234 (FG, B, C, D, A, correct[ 0], 20, 0xe9b6c7aa);
  140. OP234 (FG, A, B, C, D, correct[ 5], 5, 0xd62f105d);
  141. OP234 (FG, D, A, B, C, correct[ 10], 9, 0x02441453);
  142. OP234 (FG, C, D, A, B, correct[ 15], 14, 0xd8a1e681);
  143. OP234 (FG, B, C, D, A, correct[ 4], 20, 0xe7d3fbc8);
  144. OP234 (FG, A, B, C, D, correct[ 9], 5, 0x21e1cde6);
  145. OP234 (FG, D, A, B, C, correct[ 14], 9, 0xc33707d6);
  146. OP234 (FG, C, D, A, B, correct[ 3], 14, 0xf4d50d87);
  147. OP234 (FG, B, C, D, A, correct[ 8], 20, 0x455a14ed);
  148. OP234 (FG, A, B, C, D, correct[ 13], 5, 0xa9e3e905);
  149. OP234 (FG, D, A, B, C, correct[ 2], 9, 0xfcefa3f8);
  150. OP234 (FG, C, D, A, B, correct[ 7], 14, 0x676f02d9);
  151. OP234 (FG, B, C, D, A, correct[ 12], 20, 0x8d2a4c8a);
  152. /* Round 3. */
  153. OP234 (FH, A, B, C, D, correct[ 5], 4, 0xfffa3942);
  154. OP234 (FH, D, A, B, C, correct[ 8], 11, 0x8771f681);
  155. OP234 (FH, C, D, A, B, correct[ 11], 16, 0x6d9d6122);
  156. OP234 (FH, B, C, D, A, correct[ 14], 23, 0xfde5380c);
  157. OP234 (FH, A, B, C, D, correct[ 1], 4, 0xa4beea44);
  158. OP234 (FH, D, A, B, C, correct[ 4], 11, 0x4bdecfa9);
  159. OP234 (FH, C, D, A, B, correct[ 7], 16, 0xf6bb4b60);
  160. OP234 (FH, B, C, D, A, correct[ 10], 23, 0xbebfbc70);
  161. OP234 (FH, A, B, C, D, correct[ 13], 4, 0x289b7ec6);
  162. OP234 (FH, D, A, B, C, correct[ 0], 11, 0xeaa127fa);
  163. OP234 (FH, C, D, A, B, correct[ 3], 16, 0xd4ef3085);
  164. OP234 (FH, B, C, D, A, correct[ 6], 23, 0x04881d05);
  165. OP234 (FH, A, B, C, D, correct[ 9], 4, 0xd9d4d039);
  166. OP234 (FH, D, A, B, C, correct[ 12], 11, 0xe6db99e5);
  167. OP234 (FH, C, D, A, B, correct[ 15], 16, 0x1fa27cf8);
  168. OP234 (FH, B, C, D, A, correct[ 2], 23, 0xc4ac5665);
  169. /* Round 4. */
  170. OP234 (FI, A, B, C, D, correct[ 0], 6, 0xf4292244);
  171. OP234 (FI, D, A, B, C, correct[ 7], 10, 0x432aff97);
  172. OP234 (FI, C, D, A, B, correct[ 14], 15, 0xab9423a7);
  173. OP234 (FI, B, C, D, A, correct[ 5], 21, 0xfc93a039);
  174. OP234 (FI, A, B, C, D, correct[ 12], 6, 0x655b59c3);
  175. OP234 (FI, D, A, B, C, correct[ 3], 10, 0x8f0ccc92);
  176. OP234 (FI, C, D, A, B, correct[ 10], 15, 0xffeff47d);
  177. OP234 (FI, B, C, D, A, correct[ 1], 21, 0x85845dd1);
  178. OP234 (FI, A, B, C, D, correct[ 8], 6, 0x6fa87e4f);
  179. OP234 (FI, D, A, B, C, correct[ 15], 10, 0xfe2ce6e0);
  180. OP234 (FI, C, D, A, B, correct[ 6], 15, 0xa3014314);
  181. OP234 (FI, B, C, D, A, correct[ 13], 21, 0x4e0811a1);
  182. OP234 (FI, A, B, C, D, correct[ 4], 6, 0xf7537e82);
  183. OP234 (FI, D, A, B, C, correct[ 11], 10, 0xbd3af235);
  184. OP234 (FI, C, D, A, B, correct[ 2], 15, 0x2ad7d2bb);
  185. OP234 (FI, B, C, D, A, correct[ 9], 21, 0xeb86d391);
  186. /* Add the starting values of the context. */
  187. A += A_save;
  188. B += B_save;
  189. C += C_save;
  190. D += D_save;
  191. }
  192. /* Put checksum in context given as argument. */
  193. md5_p->md_A = A;
  194. md5_p->md_B = B;
  195. md5_p->md_C = C;
  196. md5_p->md_D = D;
  197. }
  198. /*
  199. * md5_get_result
  200. *
  201. * DESCRIPTION:
  202. *
  203. * Copy the resulting MD5 signature from MD5_P into the first 16 bytes
  204. * (MD5_SIZE) of the result buffer.
  205. *
  206. * RETURNS:
  207. *
  208. * None.
  209. *
  210. * ARGUMENTS:
  211. *
  212. * md5_p - Pointer to MD5 structure from which we are getting the result.
  213. *
  214. * result - A 16 byte buffer that will contain the MD5 signature.
  215. */
  216. static void md5_get_result(const md5_t *md5_p, void *result)
  217. {
  218. md5_uint32 hold;
  219. void *res_p = result;
  220. hold = SWAP(md5_p->md_A);
  221. memcpy(res_p, &hold, sizeof(md5_uint32));
  222. res_p = (char *)res_p + sizeof(md5_uint32);
  223. hold = SWAP(md5_p->md_B);
  224. memcpy(res_p, &hold, sizeof(md5_uint32));
  225. res_p = (char *)res_p + sizeof(md5_uint32);
  226. hold = SWAP(md5_p->md_C);
  227. memcpy(res_p, &hold, sizeof(md5_uint32));
  228. res_p = (char *)res_p + sizeof(md5_uint32);
  229. hold = SWAP(md5_p->md_D);
  230. memcpy(res_p, &hold, sizeof(md5_uint32));
  231. }
  232. /***************************** exported routines *****************************/
  233. /*
  234. * md5_init
  235. *
  236. * DESCRIPTION:
  237. *
  238. * Initialize structure containing state of MD5 computation. (RFC 1321,
  239. * 3.3: Step 3). This is for progressive MD5 calculations only. If
  240. * you have the complete string available, md5_buffer should be used.
  241. * md5_process should be called for each bunch of bytes and after the
  242. * last process call, md5_finish should be called to get the
  243. * signature.
  244. *
  245. * RETURNS:
  246. *
  247. * None.
  248. *
  249. * ARGUMENTS:
  250. *
  251. * md5_p - Pointer to md5 structure that we are initializing.
  252. */
  253. void md5_init(md5_t *md5_p)
  254. {
  255. md5_p->md_A = 0x67452301;
  256. md5_p->md_B = 0xefcdab89;
  257. md5_p->md_C = 0x98badcfe;
  258. md5_p->md_D = 0x10325476;
  259. md5_p->md_total[0] = 0;
  260. md5_p->md_total[1] = 0;
  261. md5_p->md_buf_len = 0;
  262. }
  263. /*
  264. * md5_process
  265. *
  266. * DESCRIPTION:
  267. *
  268. * This function is used to progressively calculate a MD5 signature some
  269. * number of bytes at a time. If you have the complete string
  270. * available, md5_buffer should be used. The MD5 structure should
  271. * have been initialized with md5_init and after the last process
  272. * call, md5_finish should be called to get the results.
  273. *
  274. * RETURNS:
  275. *
  276. * None.
  277. *
  278. * ARGUMENTS:
  279. *
  280. * md5_p - Pointer to MD5 structure which we are progressively updating.
  281. *
  282. * buffer - A buffer of bytes whose MD5 signature we are calculating.
  283. *
  284. * buf_len - The length of the buffer.
  285. */
  286. void md5_process(md5_t *md5_p, const void *buffer,
  287. const unsigned int buf_len)
  288. {
  289. unsigned int len = buf_len;
  290. unsigned int in_block, add;
  291. /*
  292. * When we already have some bytes in our internal buffer, copy some
  293. * from the user to fill the block.
  294. */
  295. if (md5_p->md_buf_len > 0) {
  296. in_block = md5_p->md_buf_len;
  297. if (in_block + len > sizeof(md5_p->md_buffer)) {
  298. add = sizeof(md5_p->md_buffer) - in_block;
  299. }
  300. else {
  301. add = len;
  302. }
  303. memcpy (md5_p->md_buffer + in_block, buffer, add);
  304. md5_p->md_buf_len += add;
  305. in_block += add;
  306. if (in_block > MD5_BLOCK_SIZE) {
  307. process_block (md5_p, md5_p->md_buffer, in_block & ~BLOCK_SIZE_MASK);
  308. /* the regions in the following copy operation will not overlap. */
  309. memcpy (md5_p->md_buffer,
  310. md5_p->md_buffer + (in_block & ~BLOCK_SIZE_MASK),
  311. in_block & BLOCK_SIZE_MASK);
  312. md5_p->md_buf_len = in_block & BLOCK_SIZE_MASK;
  313. }
  314. buffer = (const char *)buffer + add;
  315. len -= add;
  316. }
  317. /* process available complete blocks right from the user buffer */
  318. if (len > MD5_BLOCK_SIZE) {
  319. process_block (md5_p, buffer, len & ~BLOCK_SIZE_MASK);
  320. buffer = (const char *) buffer + (len & ~BLOCK_SIZE_MASK);
  321. len &= BLOCK_SIZE_MASK;
  322. }
  323. /* copy remaining bytes into the internal buffer */
  324. if (len > 0) {
  325. memcpy (md5_p->md_buffer, buffer, len);
  326. md5_p->md_buf_len = len;
  327. }
  328. }
  329. /*
  330. * md5_finish
  331. *
  332. * DESCRIPTION:
  333. *
  334. * Finish a progressing MD5 calculation and copy the resulting MD5
  335. * signature into the result buffer which should be 16 bytes
  336. * (MD5_SIZE). After this call, the MD5 structure is invalid.
  337. *
  338. * RETURNS:
  339. *
  340. * None.
  341. *
  342. * ARGUMENTS:
  343. *
  344. * md5_p - Pointer to MD5 structure which we are finishing.
  345. *
  346. * signature - A 16 byte buffer that will contain the MD5 signature.
  347. */
  348. void md5_finish(md5_t *md5_p, void *signature)
  349. {
  350. md5_uint32 bytes, hold;
  351. int pad;
  352. /* take yet unprocessed bytes into account */
  353. bytes = md5_p->md_buf_len;
  354. /*
  355. * Count remaining bytes. Modified to do this to better avoid
  356. * overflows in the lower word -- Gray 10/97.
  357. */
  358. if (md5_p->md_total[0] > MAX_MD5_UINT32 - bytes) {
  359. md5_p->md_total[1]++;
  360. md5_p->md_total[0] -= (MAX_MD5_UINT32 - bytes);
  361. }
  362. else {
  363. md5_p->md_total[0] += bytes;
  364. }
  365. /*
  366. * Pad the buffer to the next MD5_BLOCK-byte boundary. (RFC 1321,
  367. * 3.1: Step 1). We need enough room for two size words and the
  368. * bytes left in the buffer. For some reason even if we are equal
  369. * to the block-size, we add an addition block of pad bytes.
  370. */
  371. pad = MD5_BLOCK_SIZE - (sizeof(md5_uint32) * 2) - bytes;
  372. if (pad <= 0) {
  373. pad += MD5_BLOCK_SIZE;
  374. }
  375. /*
  376. * Modified from a fixed array to this assignment and memset to be
  377. * more flexible with block-sizes -- Gray 10/97.
  378. */
  379. if (pad > 0) {
  380. /* some sort of padding start byte */
  381. md5_p->md_buffer[bytes] = (unsigned char)0x80;
  382. if (pad > 1) {
  383. memset (md5_p->md_buffer + bytes + 1, 0, pad - 1);
  384. }
  385. bytes += pad;
  386. }
  387. /* put the 64-bit file length in _bits_ (i.e. *8) at the end of the buffer */
  388. hold = SWAP(md5_p->md_total[0] << 3);
  389. memcpy(md5_p->md_buffer + bytes, &hold, sizeof(md5_uint32));
  390. bytes += sizeof(md5_uint32);
  391. /* shift the high word over by 3 and add in the top 3 bits from the low */
  392. hold = SWAP((md5_p->md_total[1] << 3) | (md5_p->md_total[0] >> 29));
  393. memcpy(md5_p->md_buffer + bytes, &hold, sizeof(md5_uint32));
  394. bytes += sizeof(md5_uint32);
  395. /* process last bytes, the padding chars, and size words */
  396. process_block(md5_p, md5_p->md_buffer, bytes);
  397. md5_get_result(md5_p, signature);
  398. }
  399. /*
  400. * md5_buffer
  401. *
  402. * DESCRIPTION:
  403. *
  404. * This function is used to calculate a MD5 signature for a buffer of
  405. * bytes. If you only have part of a buffer that you want to process
  406. * then md5_init, md5_process, and md5_finish should be used.
  407. *
  408. * RETURNS:
  409. *
  410. * None.
  411. *
  412. * ARGUMENTS:
  413. *
  414. * buffer - A buffer of bytes whose MD5 signature we are calculating.
  415. *
  416. * buf_len - The length of the buffer.
  417. *
  418. * signature - A 16 byte buffer that will contain the MD5 signature.
  419. */
  420. void md5_buffer(const char *buffer, const unsigned int buf_len,
  421. void *signature)
  422. {
  423. md5_t md5;
  424. /* initialize the computation context */
  425. md5_init(&md5);
  426. /* process whole buffer but last buf_len % MD5_BLOCK bytes */
  427. md5_process(&md5, buffer, buf_len);
  428. /* put result in desired memory area */
  429. md5_finish(&md5, signature);
  430. }
  431. /*
  432. * md5_sig_to_string
  433. *
  434. * DESCRIPTION:
  435. *
  436. * Convert a MD5 signature in a 16 byte buffer into a hexadecimal string
  437. * representation.
  438. *
  439. * RETURNS:
  440. *
  441. * None.
  442. *
  443. * ARGUMENTS:
  444. *
  445. * signature - a 16 byte buffer that contains the MD5 signature.
  446. *
  447. * str - a string of charactes which should be at least 33 bytes long (2
  448. * characters per MD5 byte and 1 for the \0).
  449. *
  450. * str_len - the length of the string.
  451. */
  452. void md5_sig_to_string(void *signature, char *str, const int str_len)
  453. {
  454. unsigned char *sig_p;
  455. char *str_p, *max_p;
  456. unsigned int high, low;
  457. str_p = str;
  458. max_p = str + str_len;
  459. for (sig_p = (unsigned char *)signature;
  460. sig_p < (unsigned char *)signature + MD5_SIZE;
  461. sig_p++) {
  462. high = *sig_p / 16;
  463. low = *sig_p % 16;
  464. /* account for 2 chars */
  465. if (str_p + 1 >= max_p) {
  466. break;
  467. }
  468. *str_p++ = HEX_STRING[high];
  469. *str_p++ = HEX_STRING[low];
  470. }
  471. /* account for 2 chars */
  472. if (str_p < max_p) {
  473. *str_p++ = '\0';
  474. }
  475. }
  476. /*
  477. * md5_sig_from_string
  478. *
  479. * DESCRIPTION:
  480. *
  481. * Convert a MD5 signature from a hexadecimal string representation into
  482. * a 16 byte buffer.
  483. *
  484. * RETURNS:
  485. *
  486. * None.
  487. *
  488. * ARGUMENTS:
  489. *
  490. * signature - A 16 byte buffer that will contain the MD5 signature.
  491. *
  492. * str - A string of charactes which _must_ be at least 32 bytes long (2
  493. * characters per MD5 byte).
  494. */
  495. void md5_sig_from_string(void *signature, const char *str)
  496. {
  497. unsigned char *sig_p;
  498. const char *str_p;
  499. char *hex;
  500. unsigned int high, low, val;
  501. hex = HEX_STRING;
  502. sig_p = signature;
  503. for (str_p = str; str_p < str + MD5_SIZE * 2; str_p += 2) {
  504. high = strchr(hex, *str_p) - hex;
  505. low = strchr(hex, *(str_p + 1)) - hex;
  506. val = high * 16 + low;
  507. *sig_p++ = val;
  508. }
  509. }