00001 #include <string.h>
00002 #include <stdio.h>
00003 #include <malloc.h>
00004 #include "md5.h"
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016 const int md5len = 16;
00017
00018 MD5::MD5()
00019 {
00020 sum = NULL;
00021 md5_init((md5_state_t*)&state);
00022 }
00023
00024 MD5::~MD5()
00025 {
00026 if(sum)
00027 free(sum);
00028 }
00029
00030 void MD5::Append(const char* buf, int len)
00031 {
00032 md5_append((md5_state_t*)&state, (const md5_byte_t*)buf, len);
00033 }
00034
00035 std::string MD5::Get()
00036 {
00037 if(sum == NULL)
00038 {
00039 sum = (unsigned char*)malloc(md5len);
00040 md5_finish((md5_state_t*)&state, (md5_byte_t*)sum);
00041 }
00042
00043
00044 char md5[33];
00045 for(int i = 0; i < 16; i++)
00046 snprintf(&md5[i * 2], 3, "%02x", sum[i]);
00047 md5[32] = '\0';
00048 return std::string(md5);
00049 }
00050
00051 std::string MD5::Md5(const std::string str)
00052 {
00053 MD5 digest;
00054 digest.Append(str.c_str(), str.size());
00055 return digest.Get();
00056 }
00057
00058
00059
00060
00061
00062
00063
00064
00065
00066
00067
00068
00069
00070
00071
00072
00073
00074
00075
00076
00077
00078
00079
00080
00081
00082
00083
00084
00085
00086
00087
00088
00089
00090
00091
00092
00093
00094
00095
00096
00097
00098
00099
00100
00101
00102
00103
00104
00105
00106
00107
00108
00109
00110
00111 #undef BYTE_ORDER
00112 #ifdef ARCH_IS_BIG_ENDIAN
00113 # define BYTE_ORDER (ARCH_IS_BIG_ENDIAN ? 1 : -1)
00114 #else
00115 # define BYTE_ORDER 0
00116 #endif
00117
00118 #define T_MASK ((md5_word_t)~0)
00119 #define T1 (T_MASK ^ 0x28955b87)
00120 #define T2 (T_MASK ^ 0x173848a9)
00121 #define T3 0x242070db
00122 #define T4 (T_MASK ^ 0x3e423111)
00123 #define T5 (T_MASK ^ 0x0a83f050)
00124 #define T6 0x4787c62a
00125 #define T7 (T_MASK ^ 0x57cfb9ec)
00126 #define T8 (T_MASK ^ 0x02b96afe)
00127 #define T9 0x698098d8
00128 #define T10 (T_MASK ^ 0x74bb0850)
00129 #define T11 (T_MASK ^ 0x0000a44e)
00130 #define T12 (T_MASK ^ 0x76a32841)
00131 #define T13 0x6b901122
00132 #define T14 (T_MASK ^ 0x02678e6c)
00133 #define T15 (T_MASK ^ 0x5986bc71)
00134 #define T16 0x49b40821
00135 #define T17 (T_MASK ^ 0x09e1da9d)
00136 #define T18 (T_MASK ^ 0x3fbf4cbf)
00137 #define T19 0x265e5a51
00138 #define T20 (T_MASK ^ 0x16493855)
00139 #define T21 (T_MASK ^ 0x29d0efa2)
00140 #define T22 0x02441453
00141 #define T23 (T_MASK ^ 0x275e197e)
00142 #define T24 (T_MASK ^ 0x182c0437)
00143 #define T25 0x21e1cde6
00144 #define T26 (T_MASK ^ 0x3cc8f829)
00145 #define T27 (T_MASK ^ 0x0b2af278)
00146 #define T28 0x455a14ed
00147 #define T29 (T_MASK ^ 0x561c16fa)
00148 #define T30 (T_MASK ^ 0x03105c07)
00149 #define T31 0x676f02d9
00150 #define T32 (T_MASK ^ 0x72d5b375)
00151 #define T33 (T_MASK ^ 0x0005c6bd)
00152 #define T34 (T_MASK ^ 0x788e097e)
00153 #define T35 0x6d9d6122
00154 #define T36 (T_MASK ^ 0x021ac7f3)
00155 #define T37 (T_MASK ^ 0x5b4115bb)
00156 #define T38 0x4bdecfa9
00157 #define T39 (T_MASK ^ 0x0944b49f)
00158 #define T40 (T_MASK ^ 0x4140438f)
00159 #define T41 0x289b7ec6
00160 #define T42 (T_MASK ^ 0x155ed805)
00161 #define T43 (T_MASK ^ 0x2b10cf7a)
00162 #define T44 0x04881d05
00163 #define T45 (T_MASK ^ 0x262b2fc6)
00164 #define T46 (T_MASK ^ 0x1924661a)
00165 #define T47 0x1fa27cf8
00166 #define T48 (T_MASK ^ 0x3b53a99a)
00167 #define T49 (T_MASK ^ 0x0bd6ddbb)
00168 #define T50 0x432aff97
00169 #define T51 (T_MASK ^ 0x546bdc58)
00170 #define T52 (T_MASK ^ 0x036c5fc6)
00171 #define T53 0x655b59c3
00172 #define T54 (T_MASK ^ 0x70f3336d)
00173 #define T55 (T_MASK ^ 0x00100b82)
00174 #define T56 (T_MASK ^ 0x7a7ba22e)
00175 #define T57 0x6fa87e4f
00176 #define T58 (T_MASK ^ 0x01d3191f)
00177 #define T59 (T_MASK ^ 0x5cfebceb)
00178 #define T60 0x4e0811a1
00179 #define T61 (T_MASK ^ 0x08ac817d)
00180 #define T62 (T_MASK ^ 0x42c50dca)
00181 #define T63 0x2ad7d2bb
00182 #define T64 (T_MASK ^ 0x14792c6e)
00183
00184
00185 void
00186 MD5::md5_process(md5_state_t *pms, const md5_byte_t *data )
00187 {
00188 md5_word_t
00189 a = pms->abcd[0], b = pms->abcd[1],
00190 c = pms->abcd[2], d = pms->abcd[3];
00191 md5_word_t t;
00192 #if BYTE_ORDER > 0
00193
00194 md5_word_t X[16];
00195 #else
00196
00197 md5_word_t xbuf[16];
00198 const md5_word_t *X;
00199 #endif
00200
00201 {
00202 #if BYTE_ORDER == 0
00203
00204
00205
00206
00207
00208 static const int w = 1;
00209
00210 if (*((const md5_byte_t *)&w))
00211 #endif
00212 #if BYTE_ORDER <= 0
00213 {
00214
00215
00216
00217
00218 if (!((data - (const md5_byte_t *)0) & 3)) {
00219
00220 X = (const md5_word_t *)data;
00221 } else {
00222
00223 memcpy(xbuf, data, 64);
00224 X = xbuf;
00225 }
00226 }
00227 #endif
00228 #if BYTE_ORDER == 0
00229 else
00230 #endif
00231 #if BYTE_ORDER >= 0
00232 {
00233
00234
00235
00236
00237 const md5_byte_t *xp = data;
00238 int i;
00239
00240 # if BYTE_ORDER == 0
00241 X = xbuf;
00242 # else
00243 # define xbuf X
00244 # endif
00245 for (i = 0; i < 16; ++i, xp += 4)
00246 xbuf[i] = xp[0] + (xp[1] << 8) + (xp[2] << 16) + (xp[3] << 24);
00247 }
00248 #endif
00249 }
00250
00251 #define ROTATE_LEFT(x, n) (((x) << (n)) | ((x) >> (32 - (n))))
00252
00253
00254
00255
00256 #define F(x, y, z) (((x) & (y)) | (~(x) & (z)))
00257 #define SET(a, b, c, d, k, s, Ti)\
00258 t = a + F(b,c,d) + X[k] + Ti;\
00259 a = ROTATE_LEFT(t, s) + b
00260
00261 SET(a, b, c, d, 0, 7, T1);
00262 SET(d, a, b, c, 1, 12, T2);
00263 SET(c, d, a, b, 2, 17, T3);
00264 SET(b, c, d, a, 3, 22, T4);
00265 SET(a, b, c, d, 4, 7, T5);
00266 SET(d, a, b, c, 5, 12, T6);
00267 SET(c, d, a, b, 6, 17, T7);
00268 SET(b, c, d, a, 7, 22, T8);
00269 SET(a, b, c, d, 8, 7, T9);
00270 SET(d, a, b, c, 9, 12, T10);
00271 SET(c, d, a, b, 10, 17, T11);
00272 SET(b, c, d, a, 11, 22, T12);
00273 SET(a, b, c, d, 12, 7, T13);
00274 SET(d, a, b, c, 13, 12, T14);
00275 SET(c, d, a, b, 14, 17, T15);
00276 SET(b, c, d, a, 15, 22, T16);
00277 #undef SET
00278
00279
00280
00281
00282 #define G(x, y, z) (((x) & (z)) | ((y) & ~(z)))
00283 #define SET(a, b, c, d, k, s, Ti)\
00284 t = a + G(b,c,d) + X[k] + Ti;\
00285 a = ROTATE_LEFT(t, s) + b
00286
00287 SET(a, b, c, d, 1, 5, T17);
00288 SET(d, a, b, c, 6, 9, T18);
00289 SET(c, d, a, b, 11, 14, T19);
00290 SET(b, c, d, a, 0, 20, T20);
00291 SET(a, b, c, d, 5, 5, T21);
00292 SET(d, a, b, c, 10, 9, T22);
00293 SET(c, d, a, b, 15, 14, T23);
00294 SET(b, c, d, a, 4, 20, T24);
00295 SET(a, b, c, d, 9, 5, T25);
00296 SET(d, a, b, c, 14, 9, T26);
00297 SET(c, d, a, b, 3, 14, T27);
00298 SET(b, c, d, a, 8, 20, T28);
00299 SET(a, b, c, d, 13, 5, T29);
00300 SET(d, a, b, c, 2, 9, T30);
00301 SET(c, d, a, b, 7, 14, T31);
00302 SET(b, c, d, a, 12, 20, T32);
00303 #undef SET
00304
00305
00306
00307
00308 #define H(x, y, z) ((x) ^ (y) ^ (z))
00309 #define SET(a, b, c, d, k, s, Ti)\
00310 t = a + H(b,c,d) + X[k] + Ti;\
00311 a = ROTATE_LEFT(t, s) + b
00312
00313 SET(a, b, c, d, 5, 4, T33);
00314 SET(d, a, b, c, 8, 11, T34);
00315 SET(c, d, a, b, 11, 16, T35);
00316 SET(b, c, d, a, 14, 23, T36);
00317 SET(a, b, c, d, 1, 4, T37);
00318 SET(d, a, b, c, 4, 11, T38);
00319 SET(c, d, a, b, 7, 16, T39);
00320 SET(b, c, d, a, 10, 23, T40);
00321 SET(a, b, c, d, 13, 4, T41);
00322 SET(d, a, b, c, 0, 11, T42);
00323 SET(c, d, a, b, 3, 16, T43);
00324 SET(b, c, d, a, 6, 23, T44);
00325 SET(a, b, c, d, 9, 4, T45);
00326 SET(d, a, b, c, 12, 11, T46);
00327 SET(c, d, a, b, 15, 16, T47);
00328 SET(b, c, d, a, 2, 23, T48);
00329 #undef SET
00330
00331
00332
00333
00334 #define I(x, y, z) ((y) ^ ((x) | ~(z)))
00335 #define SET(a, b, c, d, k, s, Ti)\
00336 t = a + I(b,c,d) + X[k] + Ti;\
00337 a = ROTATE_LEFT(t, s) + b
00338
00339 SET(a, b, c, d, 0, 6, T49);
00340 SET(d, a, b, c, 7, 10, T50);
00341 SET(c, d, a, b, 14, 15, T51);
00342 SET(b, c, d, a, 5, 21, T52);
00343 SET(a, b, c, d, 12, 6, T53);
00344 SET(d, a, b, c, 3, 10, T54);
00345 SET(c, d, a, b, 10, 15, T55);
00346 SET(b, c, d, a, 1, 21, T56);
00347 SET(a, b, c, d, 8, 6, T57);
00348 SET(d, a, b, c, 15, 10, T58);
00349 SET(c, d, a, b, 6, 15, T59);
00350 SET(b, c, d, a, 13, 21, T60);
00351 SET(a, b, c, d, 4, 6, T61);
00352 SET(d, a, b, c, 11, 10, T62);
00353 SET(c, d, a, b, 2, 15, T63);
00354 SET(b, c, d, a, 9, 21, T64);
00355 #undef SET
00356
00357
00358
00359
00360 pms->abcd[0] += a;
00361 pms->abcd[1] += b;
00362 pms->abcd[2] += c;
00363 pms->abcd[3] += d;
00364 }
00365
00366 void
00367 MD5::md5_init(md5_state_t *pms)
00368 {
00369 pms->count[0] = pms->count[1] = 0;
00370 pms->abcd[0] = 0x67452301;
00371 pms->abcd[1] = T_MASK ^ 0x10325476;
00372 pms->abcd[2] = T_MASK ^ 0x67452301;
00373 pms->abcd[3] = 0x10325476;
00374 }
00375
00376 void
00377 MD5::md5_append(md5_state_t *pms, const md5_byte_t *data, int nbytes)
00378 {
00379 const md5_byte_t *p = data;
00380 int left = nbytes;
00381 int offset = (pms->count[0] >> 3) & 63;
00382 md5_word_t nbits = (md5_word_t)(nbytes << 3);
00383
00384 if (nbytes <= 0)
00385 return;
00386
00387
00388 pms->count[1] += nbytes >> 29;
00389 pms->count[0] += nbits;
00390 if (pms->count[0] < nbits)
00391 pms->count[1]++;
00392
00393
00394 if (offset) {
00395 int copy = (offset + nbytes > 64 ? 64 - offset : nbytes);
00396
00397 memcpy(pms->buf + offset, p, copy);
00398 if (offset + copy < 64)
00399 return;
00400 p += copy;
00401 left -= copy;
00402 md5_process(pms, pms->buf);
00403 }
00404
00405
00406 for (; left >= 64; p += 64, left -= 64)
00407 md5_process(pms, p);
00408
00409
00410 if (left)
00411 memcpy(pms->buf, p, left);
00412 }
00413
00414 void
00415 MD5::md5_finish(md5_state_t *pms, md5_byte_t digest[16])
00416 {
00417 static const md5_byte_t pad[64] = {
00418 0x80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
00419 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
00420 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
00421 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
00422 };
00423 md5_byte_t data[8];
00424 int i;
00425
00426
00427 for (i = 0; i < 8; ++i)
00428 data[i] = (md5_byte_t)(pms->count[i >> 2] >> ((i & 3) << 3));
00429
00430 md5_append(pms, pad, ((55 - (pms->count[0] >> 3)) & 63) + 1);
00431
00432 md5_append(pms, data, 8);
00433 for (i = 0; i < 16; ++i)
00434 digest[i] = (md5_byte_t)(pms->abcd[i >> 2] >> ((i & 3) << 3));
00435 }