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 #include "md5.h"
00057
00058
00059
00060 #define S11 7
00061 #define S12 12
00062 #define S13 17
00063 #define S14 22
00064 #define S21 5
00065 #define S22 9
00066 #define S23 14
00067 #define S24 20
00068 #define S31 4
00069 #define S32 11
00070 #define S33 16
00071 #define S34 23
00072 #define S41 6
00073 #define S42 10
00074 #define S43 15
00075 #define S44 21
00076
00077 static void MD5Transform PROTO_LIST ((UINT4 [4], unsigned char [64]));
00078 static void Encode PROTO_LIST
00079 ((unsigned char *, UINT4 *, unsigned int));
00080 static void Decode PROTO_LIST
00081 ((UINT4 *, unsigned char *, unsigned int));
00082 static void MD5_memcpy PROTO_LIST ((POINTER, POINTER, unsigned int));
00083 static void MD5_memset PROTO_LIST ((POINTER, int, unsigned int));
00084
00085 static unsigned char PADDING[64] = {
00086 0x80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
00087 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
00088 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
00089 };
00090
00091
00092
00093 #define F(x, y, z) (((x) & (y)) | ((~x) & (z)))
00094 #define G(x, y, z) (((x) & (z)) | ((y) & (~z)))
00095 #define H(x, y, z) ((x) ^ (y) ^ (z))
00096 #define I(x, y, z) ((y) ^ ((x) | (~z)))
00097
00098
00099
00100 #define ROTATE_LEFT(x, n) (((x) << (n)) | ((x) >> (32-(n))))
00101
00102
00103
00104
00105 #define FF(a, b, c, d, x, s, ac) { \
00106 (a) += F ((b), (c), (d)) + (x) + (UINT4)(ac); \
00107 (a) = ROTATE_LEFT ((a), (s)); \
00108 (a) += (b); \
00109 }
00110 #define GG(a, b, c, d, x, s, ac) { \
00111 (a) += G ((b), (c), (d)) + (x) + (UINT4)(ac); \
00112 (a) = ROTATE_LEFT ((a), (s)); \
00113 (a) += (b); \
00114 }
00115 #define HH(a, b, c, d, x, s, ac) { \
00116 (a) += H ((b), (c), (d)) + (x) + (UINT4)(ac); \
00117 (a) = ROTATE_LEFT ((a), (s)); \
00118 (a) += (b); \
00119 }
00120 #define II(a, b, c, d, x, s, ac) { \
00121 (a) += I ((b), (c), (d)) + (x) + (UINT4)(ac); \
00122 (a) = ROTATE_LEFT ((a), (s)); \
00123 (a) += (b); \
00124 }
00125
00126
00127
00128 void MD5Init (context)
00129 MD5_CTX *context;
00130 {
00131 context->count[0] = context->count[1] = 0;
00132
00133
00134 context->state[0] = 0x67452301;
00135 context->state[1] = 0xefcdab89;
00136 context->state[2] = 0x98badcfe;
00137 context->state[3] = 0x10325476;
00138 }
00139
00140
00141
00142
00143
00144 void MD5Update (context, input, inputLen)
00145 MD5_CTX *context;
00146 unsigned char *input;
00147 unsigned int inputLen;
00148 {
00149 unsigned int i, index, partLen;
00150
00151
00152 index = (unsigned int)((context->count[0] >> 3) & 0x3F);
00153
00154
00155 if ((context->count[0] += ((UINT4)inputLen << 3))
00156 < ((UINT4)inputLen << 3))
00157 context->count[1]++;
00158 context->count[1] += ((UINT4)inputLen >> 29);
00159
00160 partLen = 64 - index;
00161
00162
00163
00164 if (inputLen >= partLen) {
00165 MD5_memcpy
00166 ((POINTER)&context->buffer[index], (POINTER)input, partLen);
00167 MD5Transform (context->state, context->buffer);
00168
00169 for (i = partLen; i + 63 < inputLen; i += 64)
00170 MD5Transform (context->state, &input[i]);
00171
00172 index = 0;
00173 }
00174 else
00175 i = 0;
00176
00177
00178 MD5_memcpy
00179 ((POINTER)&context->buffer[index], (POINTER)&input[i],
00180 inputLen-i);
00181 }
00182
00183
00184
00185
00186 void MD5Final (digest, context)
00187 unsigned char digest[16];
00188 MD5_CTX *context;
00189 {
00190 unsigned char bits[8];
00191 unsigned int index, padLen;
00192
00193
00194 Encode (bits, context->count, 8);
00195
00196
00197
00198 index = (unsigned int)((context->count[0] >> 3) & 0x3f);
00199 padLen = (index < 56) ? (56 - index) : (120 - index);
00200 MD5Update (context, PADDING, padLen);
00201
00202
00203 MD5Update (context, bits, 8);
00204
00205 Encode (digest, context->state, 16);
00206
00207
00208
00209 MD5_memset ((POINTER)context, 0, sizeof (*context));
00210 }
00211
00212
00213
00214 static void MD5Transform (state, block)
00215 UINT4 state[4];
00216 unsigned char block[64];
00217 {
00218 UINT4 a = state[0], b = state[1], c = state[2], d = state[3], x[16];
00219
00220 Decode (x, block, 64);
00221
00222
00223 FF (a, b, c, d, x[ 0], S11, 0xd76aa478);
00224 FF (d, a, b, c, x[ 1], S12, 0xe8c7b756);
00225 FF (c, d, a, b, x[ 2], S13, 0x242070db);
00226 FF (b, c, d, a, x[ 3], S14, 0xc1bdceee);
00227 FF (a, b, c, d, x[ 4], S11, 0xf57c0faf);
00228 FF (d, a, b, c, x[ 5], S12, 0x4787c62a);
00229 FF (c, d, a, b, x[ 6], S13, 0xa8304613);
00230 FF (b, c, d, a, x[ 7], S14, 0xfd469501);
00231 FF (a, b, c, d, x[ 8], S11, 0x698098d8);
00232 FF (d, a, b, c, x[ 9], S12, 0x8b44f7af);
00233 FF (c, d, a, b, x[10], S13, 0xffff5bb1);
00234 FF (b, c, d, a, x[11], S14, 0x895cd7be);
00235 FF (a, b, c, d, x[12], S11, 0x6b901122);
00236 FF (d, a, b, c, x[13], S12, 0xfd987193);
00237 FF (c, d, a, b, x[14], S13, 0xa679438e);
00238 FF (b, c, d, a, x[15], S14, 0x49b40821);
00239
00240
00241 GG (a, b, c, d, x[ 1], S21, 0xf61e2562);
00242 GG (d, a, b, c, x[ 6], S22, 0xc040b340);
00243 GG (c, d, a, b, x[11], S23, 0x265e5a51);
00244 GG (b, c, d, a, x[ 0], S24, 0xe9b6c7aa);
00245 GG (a, b, c, d, x[ 5], S21, 0xd62f105d);
00246 GG (d, a, b, c, x[10], S22, 0x2441453);
00247 GG (c, d, a, b, x[15], S23, 0xd8a1e681);
00248 GG (b, c, d, a, x[ 4], S24, 0xe7d3fbc8);
00249 GG (a, b, c, d, x[ 9], S21, 0x21e1cde6);
00250 GG (d, a, b, c, x[14], S22, 0xc33707d6);
00251 GG (c, d, a, b, x[ 3], S23, 0xf4d50d87);
00252 GG (b, c, d, a, x[ 8], S24, 0x455a14ed);
00253 GG (a, b, c, d, x[13], S21, 0xa9e3e905);
00254 GG (d, a, b, c, x[ 2], S22, 0xfcefa3f8);
00255 GG (c, d, a, b, x[ 7], S23, 0x676f02d9);
00256 GG (b, c, d, a, x[12], S24, 0x8d2a4c8a);
00257
00258
00259 HH (a, b, c, d, x[ 5], S31, 0xfffa3942);
00260 HH (d, a, b, c, x[ 8], S32, 0x8771f681);
00261 HH (c, d, a, b, x[11], S33, 0x6d9d6122);
00262 HH (b, c, d, a, x[14], S34, 0xfde5380c);
00263 HH (a, b, c, d, x[ 1], S31, 0xa4beea44);
00264 HH (d, a, b, c, x[ 4], S32, 0x4bdecfa9);
00265 HH (c, d, a, b, x[ 7], S33, 0xf6bb4b60);
00266 HH (b, c, d, a, x[10], S34, 0xbebfbc70);
00267 HH (a, b, c, d, x[13], S31, 0x289b7ec6);
00268 HH (d, a, b, c, x[ 0], S32, 0xeaa127fa);
00269 HH (c, d, a, b, x[ 3], S33, 0xd4ef3085);
00270 HH (b, c, d, a, x[ 6], S34, 0x4881d05);
00271 HH (a, b, c, d, x[ 9], S31, 0xd9d4d039);
00272 HH (d, a, b, c, x[12], S32, 0xe6db99e5);
00273 HH (c, d, a, b, x[15], S33, 0x1fa27cf8);
00274 HH (b, c, d, a, x[ 2], S34, 0xc4ac5665);
00275
00276
00277 II (a, b, c, d, x[ 0], S41, 0xf4292244);
00278 II (d, a, b, c, x[ 7], S42, 0x432aff97);
00279 II (c, d, a, b, x[14], S43, 0xab9423a7);
00280 II (b, c, d, a, x[ 5], S44, 0xfc93a039);
00281 II (a, b, c, d, x[12], S41, 0x655b59c3);
00282 II (d, a, b, c, x[ 3], S42, 0x8f0ccc92);
00283 II (c, d, a, b, x[10], S43, 0xffeff47d);
00284 II (b, c, d, a, x[ 1], S44, 0x85845dd1);
00285 II (a, b, c, d, x[ 8], S41, 0x6fa87e4f);
00286 II (d, a, b, c, x[15], S42, 0xfe2ce6e0);
00287 II (c, d, a, b, x[ 6], S43, 0xa3014314);
00288 II (b, c, d, a, x[13], S44, 0x4e0811a1);
00289 II (a, b, c, d, x[ 4], S41, 0xf7537e82);
00290 II (d, a, b, c, x[11], S42, 0xbd3af235);
00291 II (c, d, a, b, x[ 2], S43, 0x2ad7d2bb);
00292 II (b, c, d, a, x[ 9], S44, 0xeb86d391);
00293
00294 state[0] += a;
00295 state[1] += b;
00296 state[2] += c;
00297 state[3] += d;
00298
00299
00300
00301 MD5_memset ((POINTER)x, 0, sizeof (x));
00302 }
00303
00304
00305
00306
00307 static void Encode (output, input, len)
00308 unsigned char *output;
00309 UINT4 *input;
00310 unsigned int len;
00311 {
00312 unsigned int i, j;
00313
00314 for (i = 0, j = 0; j < len; i++, j += 4) {
00315 output[j] = (unsigned char)(input[i] & 0xff);
00316 output[j+1] = (unsigned char)((input[i] >> 8) & 0xff);
00317 output[j+2] = (unsigned char)((input[i] >> 16) & 0xff);
00318 output[j+3] = (unsigned char)((input[i] >> 24) & 0xff);
00319 }
00320 }
00321
00322
00323
00324
00325 static void Decode (output, input, len)
00326 UINT4 *output;
00327 unsigned char *input;
00328 unsigned int len;
00329 {
00330 unsigned int i, j;
00331
00332 for (i = 0, j = 0; j < len; i++, j += 4)
00333 output[i] = ((UINT4)input[j]) | (((UINT4)input[j+1]) << 8) |
00334 (((UINT4)input[j+2]) << 16) | (((UINT4)input[j+3]) << 24);
00335 }
00336
00337
00338
00339
00340 static void MD5_memcpy (output, input, len)
00341 POINTER output;
00342 POINTER input;
00343 unsigned int len;
00344 {
00345 unsigned int i;
00346
00347 for (i = 0; i < len; i++)
00348 output[i] = input[i];
00349 }
00350
00351
00352
00353 static void MD5_memset (output, value, len)
00354 POINTER output;
00355 int value;
00356 unsigned int len;
00357 {
00358 unsigned int i;
00359
00360 for (i = 0; i < len; i++)
00361 ((char *)output)[i] = (char)value;
00362 }