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