md5.c
上传用户:s81996212
上传日期:2007-01-04
资源大小:722k
文件大小:6k
源码类别:

WEB邮件程序

开发平台:

C/C++

  1. /*
  2. ** Copyright 1998 - 2000 Double Precision, Inc.
  3. ** See COPYING for distribution information.
  4. */
  5. #define MD5_INTERNAL
  6. #include "md5.h"
  7. #include <string.h>
  8. #define MD5_BYTE unsigned char
  9. #define MD5_ROL(w,n)
  10. ( (w) << (n) | ( (w) >> (32-(n)) ) )
  11. static MD5_WORD T[64]={
  12. 0xd76aa478, 0xe8c7b756, 0x242070db, 0xc1bdceee,
  13. 0xf57c0faf, 0x4787c62a, 0xa8304613, 0xfd469501,
  14. 0x698098d8, 0x8b44f7af, 0xffff5bb1, 0x895cd7be,
  15. 0x6b901122, 0xfd987193, 0xa679438e, 0x49b40821,
  16. 0xf61e2562, 0xc040b340, 0x265e5a51, 0xe9b6c7aa,
  17. 0xd62f105d, 0x2441453, 0xd8a1e681, 0xe7d3fbc8,
  18. 0x21e1cde6, 0xc33707d6, 0xf4d50d87, 0x455a14ed,
  19. 0xa9e3e905, 0xfcefa3f8, 0x676f02d9, 0x8d2a4c8a,
  20. 0xfffa3942, 0x8771f681, 0x6d9d6122, 0xfde5380c,
  21. 0xa4beea44, 0x4bdecfa9, 0xf6bb4b60, 0xbebfbc70,
  22. 0x289b7ec6, 0xeaa127fa, 0xd4ef3085, 0x4881d05,
  23. 0xd9d4d039, 0xe6db99e5, 0x1fa27cf8, 0xc4ac5665,
  24. 0xf4292244, 0x432aff97, 0xab9423a7, 0xfc93a039,
  25. 0x655b59c3, 0x8f0ccc92, 0xffeff47d, 0x85845dd1,
  26. 0x6fa87e4f, 0xfe2ce6e0, 0xa3014314, 0x4e0811a1,
  27. 0xf7537e82, 0xbd3af235, 0x2ad7d2bb, 0xeb86d391};
  28. void md5_context_init(struct MD5_CONTEXT *c)
  29. {
  30. if (sizeof(MD5_WORD) != 4) abort();
  31. c->A=0x67452301;
  32. c->B=0xefcdab89;
  33. c->C=0x98badcfe;
  34. c->D=0x10325476;
  35. c->blk_ptr=0;
  36. }
  37. void md5_context_hash(struct MD5_CONTEXT *c,
  38. const unsigned char blk[MD5_BLOCK_SIZE])
  39. {
  40. MD5_WORD x[16];
  41. unsigned i, j;
  42. MD5_WORD A, B, C, D;
  43. MD5_WORD zz;
  44. for (i=j=0; i<16; i++)
  45. {
  46. MD5_WORD w=(MD5_WORD)blk[j++];
  47. w |= (MD5_WORD)blk[j++] << 8;
  48. w |= (MD5_WORD)blk[j++] << 16;
  49. w |= (MD5_WORD)blk[j++] << 24;
  50. x[i]= w;
  51. }
  52. #define F(X,Y,Z) ( ((X) & (Y)) | ( (~(X)) & (Z)))
  53. #define G(X,Y,Z) ( ((X) & (Z)) | ( (Y) & (~(Z))))
  54. #define H(X,Y,Z) ( (X) ^ (Y) ^ (Z) )
  55. #define I(X,Y,Z) ( (Y) ^ ( (X) | (~(Z))))
  56. A=c->A;
  57. B=c->B;
  58. C=c->C;
  59. D=c->D;
  60. #define ROUND1(a,b,c,d,k,s,i)
  61. { zz=(a + F(b,c,d) + x[k] + T[i]); a=b+MD5_ROL(zz,s); }
  62. ROUND1(A,B,C,D,0,7,0);
  63. ROUND1(D,A,B,C,1,12,1);
  64. ROUND1(C,D,A,B,2,17,2);
  65. ROUND1(B,C,D,A,3,22,3);
  66. ROUND1(A,B,C,D,4,7,4);
  67. ROUND1(D,A,B,C,5,12,5);
  68. ROUND1(C,D,A,B,6,17,6);
  69. ROUND1(B,C,D,A,7,22,7);
  70. ROUND1(A,B,C,D,8,7,8);
  71. ROUND1(D,A,B,C,9,12,9);
  72. ROUND1(C,D,A,B,10,17,10);
  73. ROUND1(B,C,D,A,11,22,11);
  74. ROUND1(A,B,C,D,12,7,12);
  75. ROUND1(D,A,B,C,13,12,13);
  76. ROUND1(C,D,A,B,14,17,14);
  77. ROUND1(B,C,D,A,15,22,15);
  78. #define ROUND2(a,b,c,d,k,s,i)
  79. { zz=(a + G(b,c,d) + x[k] + T[i]); a = b + MD5_ROL(zz,s); }
  80. ROUND2(A,B,C,D,1,5,16);
  81. ROUND2(D,A,B,C,6,9,17);
  82. ROUND2(C,D,A,B,11,14,18);
  83. ROUND2(B,C,D,A,0,20,19);
  84. ROUND2(A,B,C,D,5,5,20);
  85. ROUND2(D,A,B,C,10,9,21);
  86. ROUND2(C,D,A,B,15,14,22);
  87. ROUND2(B,C,D,A,4,20,23);
  88. ROUND2(A,B,C,D,9,5,24);
  89. ROUND2(D,A,B,C,14,9,25);
  90. ROUND2(C,D,A,B,3,14,26);
  91. ROUND2(B,C,D,A,8,20,27);
  92. ROUND2(A,B,C,D,13,5,28);
  93. ROUND2(D,A,B,C,2,9,29);
  94. ROUND2(C,D,A,B,7,14,30);
  95. ROUND2(B,C,D,A,12,20,31);
  96. #define ROUND3(a,b,c,d,k,s,i)
  97. { zz=(a + H(b,c,d) + x[k] + T[i]); a = b + MD5_ROL(zz,s); }
  98. ROUND3(A,B,C,D,5,4,32);
  99. ROUND3(D,A,B,C,8,11,33);
  100. ROUND3(C,D,A,B,11,16,34);
  101. ROUND3(B,C,D,A,14,23,35);
  102. ROUND3(A,B,C,D,1,4,36);
  103. ROUND3(D,A,B,C,4,11,37);
  104. ROUND3(C,D,A,B,7,16,38);
  105. ROUND3(B,C,D,A,10,23,39);
  106. ROUND3(A,B,C,D,13,4,40);
  107. ROUND3(D,A,B,C,0,11,41);
  108. ROUND3(C,D,A,B,3,16,42);
  109. ROUND3(B,C,D,A,6,23,43);
  110. ROUND3(A,B,C,D,9,4,44);
  111. ROUND3(D,A,B,C,12,11,45);
  112. ROUND3(C,D,A,B,15,16,46);
  113. ROUND3(B,C,D,A,2,23,47);
  114. #define ROUND4(a,b,c,d,k,s,i)
  115. { zz=(a + I(b,c,d) + x[k] + T[i]); a = b + MD5_ROL(zz,s); }
  116. ROUND4(A,B,C,D,0,6,48);
  117. ROUND4(D,A,B,C,7,10,49);
  118. ROUND4(C,D,A,B,14,15,50);
  119. ROUND4(B,C,D,A,5,21,51);
  120. ROUND4(A,B,C,D,12,6,52);
  121. ROUND4(D,A,B,C,3,10,53);
  122. ROUND4(C,D,A,B,10,15,54);
  123. ROUND4(B,C,D,A,1,21,55);
  124. ROUND4(A,B,C,D,8,6,56);
  125. ROUND4(D,A,B,C,15,10,57);
  126. ROUND4(C,D,A,B,6,15,58);
  127. ROUND4(B,C,D,A,13,21,59);
  128. ROUND4(A,B,C,D,4,6,60);
  129. ROUND4(D,A,B,C,11,10,61);
  130. ROUND4(C,D,A,B,2,15,62);
  131. ROUND4(B,C,D,A,9,21,63);
  132. c->A += A;
  133. c->B += B;
  134. c->C += C;
  135. c->D += D;
  136. }
  137. void md5_context_hashstream(struct MD5_CONTEXT *c, const void *p, unsigned l)
  138. {
  139. const unsigned char *cp=(const unsigned char *)p;
  140. unsigned ll;
  141. while (l)
  142. {
  143. if (c->blk_ptr == 0 && l >= MD5_BLOCK_SIZE)
  144. {
  145. md5_context_hash(c, cp);
  146. cp += MD5_BLOCK_SIZE;
  147. l -= MD5_BLOCK_SIZE;
  148. continue;
  149. }
  150. ll=l;
  151. if (ll > MD5_BLOCK_SIZE - c->blk_ptr)
  152. ll=MD5_BLOCK_SIZE - c->blk_ptr;
  153. memcpy(c->blk + c->blk_ptr, cp, ll);
  154. c->blk_ptr += ll;
  155. cp += ll;
  156. l -= ll;
  157. if (c->blk_ptr >= MD5_BLOCK_SIZE)
  158. {
  159. md5_context_hash(c, c->blk);
  160. c->blk_ptr=0;
  161. }
  162. }
  163. }
  164. void md5_context_endstream(struct MD5_CONTEXT *c, unsigned long ll)
  165. {
  166. unsigned char buf[8];
  167. static unsigned char zero[MD5_BLOCK_SIZE-8];
  168. MD5_WORD l;
  169. buf[0]=0x80;
  170. md5_context_hashstream(c, buf, 1);
  171. while (c->blk_ptr != MD5_BLOCK_SIZE - 8)
  172. {
  173. if (c->blk_ptr > MD5_BLOCK_SIZE - 8)
  174. {
  175. md5_context_hashstream(c, zero,
  176. MD5_BLOCK_SIZE - c->blk_ptr);
  177. continue;
  178. }
  179. md5_context_hashstream(c, zero,
  180. MD5_BLOCK_SIZE - 8 - c->blk_ptr);
  181. }
  182. l= ll;
  183. l <<= 3;
  184. buf[0]=l;
  185. l >>= 8;
  186. buf[1]=l;
  187. l >>= 8;
  188. buf[2]=l;
  189. l >>= 8;
  190. buf[3]=l;
  191. l= ll;
  192. l >>= 29;
  193. buf[4]=l;
  194. l >>= 8;
  195. buf[5]=l;
  196. l >>= 8;
  197. buf[6]=l;
  198. l >>= 8;
  199. buf[7]=l;
  200. md5_context_hashstream(c, buf, 8);
  201. }
  202. void md5_context_digest(struct MD5_CONTEXT *c, MD5_DIGEST d)
  203. {
  204. unsigned char *dp=d;
  205. MD5_WORD w;
  206. #define PUT(c) (w=(c), *dp++ = w, w >>= 8, *dp++ = w, w >>= 8, *dp++ = w, w >>= 8, *dp++ = w)
  207. PUT(c->A);
  208. PUT(c->B);
  209. PUT(c->C);
  210. PUT(c->D);
  211. #undef PUT
  212. }
  213. void md5_context_restore(struct MD5_CONTEXT *c, const MD5_DIGEST d)
  214. {
  215. const unsigned char *dp=(unsigned char *)d+MD5_DIGEST_SIZE;
  216. MD5_WORD w;
  217. #define GET
  218. w=*--dp; w=(w << 8) | *--dp; w=(w << 8) | *--dp; w=(w << 8) | *--dp;
  219. GET
  220. c->D=w;
  221. GET
  222. c->C=w;
  223. GET
  224. c->B=w;
  225. GET
  226. c->A=w;
  227. c->blk_ptr=0;
  228. }
  229. void md5_digest(const void *msg, unsigned int len, MD5_DIGEST d)
  230. {
  231. struct MD5_CONTEXT c;
  232. md5_context_init(&c);
  233. md5_context_hashstream(&c, msg, len);
  234. md5_context_endstream(&c, len);
  235. md5_context_digest(&c, d);
  236. }