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 #include "our_md5.h"
00028 #include <string.h>
00029
00030
00031
00032
00033 #define S11 7
00034 #define S12 12
00035 #define S13 17
00036 #define S14 22
00037 #define S21 5
00038 #define S22 9
00039 #define S23 14
00040 #define S24 20
00041 #define S31 4
00042 #define S32 11
00043 #define S33 16
00044 #define S34 23
00045 #define S41 6
00046 #define S42 10
00047 #define S43 15
00048 #define S44 21
00049
00050 static unsigned char PADDING[64] = {
00051 0x80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
00052 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
00053 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
00054 };
00055
00056
00057
00058
00059 #define F(x, y, z) (((x) & (y)) | ((~x) & (z)))
00060 #define G(x, y, z) (((x) & (z)) | ((y) & (~z)))
00061 #define H(x, y, z) ((x) ^ (y) ^ (z))
00062 #define I(x, y, z) ((y) ^ ((x) | (~z)))
00063
00064
00065
00066
00067 #define ROTATE_LEFT(x, n) (((x) << (n)) | ((x) >> (32-(n))))
00068
00069
00070
00071
00072
00073 #define FF(a, b, c, d, x, s, ac) { \
00074 (a) += F ((b), (c), (d)) + (x) + (UNSIGNED32)(ac); \
00075 (a) = ROTATE_LEFT ((a), (s)); \
00076 (a) += (b); \
00077 }
00078 #define GG(a, b, c, d, x, s, ac) { \
00079 (a) += G ((b), (c), (d)) + (x) + (UNSIGNED32)(ac); \
00080 (a) = ROTATE_LEFT ((a), (s)); \
00081 (a) += (b); \
00082 }
00083 #define HH(a, b, c, d, x, s, ac) { \
00084 (a) += H ((b), (c), (d)) + (x) + (UNSIGNED32)(ac); \
00085 (a) = ROTATE_LEFT ((a), (s)); \
00086 (a) += (b); \
00087 }
00088 #define II(a, b, c, d, x, s, ac) { \
00089 (a) += I ((b), (c), (d)) + (x) + (UNSIGNED32)(ac); \
00090 (a) = ROTATE_LEFT ((a), (s)); \
00091 (a) += (b); \
00092 }
00093
00094
00095
00096
00097
00098 static void
00099 Encode(unsigned char *output, UNSIGNED32 * input, unsigned int len)
00100 {
00101 unsigned int i, j;
00102
00103 #if 0
00104 assert((len % 4) == 0);
00105 #endif
00106
00107 for (i = 0, j = 0; j < len; i++, j += 4) {
00108 output[j] = (unsigned char) (input[i] & 0xff);
00109 output[j + 1] = (unsigned char) ((input[i] >> 8) & 0xff);
00110 output[j + 2] = (unsigned char) ((input[i] >> 16) & 0xff);
00111 output[j + 3] = (unsigned char) ((input[i] >> 24) & 0xff);
00112 }
00113 }
00114
00115
00116
00117
00118
00119 static void
00120 Decode(UNSIGNED32 * output, unsigned char const *input, unsigned int len)
00121 {
00122 unsigned int i, j;
00123
00124 for (i = 0, j = 0; j < len; i++, j += 4)
00125 output[i] = ((UNSIGNED32) input[j]) | (((UNSIGNED32) input[j + 1]) << 8) |
00126 (((UNSIGNED32) input[j + 2]) << 16) | (((UNSIGNED32) input[j + 3]) << 24);
00127 }
00128
00129
00130
00131
00132 static void
00133 MD5Transform(UNSIGNED32 state[4], const unsigned char block[64])
00134 {
00135 UNSIGNED32 a = state[0], b = state[1], c = state[2], d = state[3], x[16];
00136
00137 Decode(x, block, 64);
00138
00139
00140 FF(a, b, c, d, x[0], S11, 0xd76aa478);
00141 FF(d, a, b, c, x[1], S12, 0xe8c7b756);
00142 FF(c, d, a, b, x[2], S13, 0x242070db);
00143 FF(b, c, d, a, x[3], S14, 0xc1bdceee);
00144 FF(a, b, c, d, x[4], S11, 0xf57c0faf);
00145 FF(d, a, b, c, x[5], S12, 0x4787c62a);
00146 FF(c, d, a, b, x[6], S13, 0xa8304613);
00147 FF(b, c, d, a, x[7], S14, 0xfd469501);
00148 FF(a, b, c, d, x[8], S11, 0x698098d8);
00149 FF(d, a, b, c, x[9], S12, 0x8b44f7af);
00150 FF(c, d, a, b, x[10], S13, 0xffff5bb1);
00151 FF(b, c, d, a, x[11], S14, 0x895cd7be);
00152 FF(a, b, c, d, x[12], S11, 0x6b901122);
00153 FF(d, a, b, c, x[13], S12, 0xfd987193);
00154 FF(c, d, a, b, x[14], S13, 0xa679438e);
00155 FF(b, c, d, a, x[15], S14, 0x49b40821);
00156
00157
00158 GG(a, b, c, d, x[1], S21, 0xf61e2562);
00159 GG(d, a, b, c, x[6], S22, 0xc040b340);
00160 GG(c, d, a, b, x[11], S23, 0x265e5a51);
00161 GG(b, c, d, a, x[0], S24, 0xe9b6c7aa);
00162 GG(a, b, c, d, x[5], S21, 0xd62f105d);
00163 GG(d, a, b, c, x[10], S22, 0x2441453);
00164 GG(c, d, a, b, x[15], S23, 0xd8a1e681);
00165 GG(b, c, d, a, x[4], S24, 0xe7d3fbc8);
00166 GG(a, b, c, d, x[9], S21, 0x21e1cde6);
00167 GG(d, a, b, c, x[14], S22, 0xc33707d6);
00168 GG(c, d, a, b, x[3], S23, 0xf4d50d87);
00169 GG(b, c, d, a, x[8], S24, 0x455a14ed);
00170 GG(a, b, c, d, x[13], S21, 0xa9e3e905);
00171 GG(d, a, b, c, x[2], S22, 0xfcefa3f8);
00172 GG(c, d, a, b, x[7], S23, 0x676f02d9);
00173 GG(b, c, d, a, x[12], S24, 0x8d2a4c8a);
00174
00175
00176 HH(a, b, c, d, x[5], S31, 0xfffa3942);
00177 HH(d, a, b, c, x[8], S32, 0x8771f681);
00178 HH(c, d, a, b, x[11], S33, 0x6d9d6122);
00179 HH(b, c, d, a, x[14], S34, 0xfde5380c);
00180 HH(a, b, c, d, x[1], S31, 0xa4beea44);
00181 HH(d, a, b, c, x[4], S32, 0x4bdecfa9);
00182 HH(c, d, a, b, x[7], S33, 0xf6bb4b60);
00183 HH(b, c, d, a, x[10], S34, 0xbebfbc70);
00184 HH(a, b, c, d, x[13], S31, 0x289b7ec6);
00185 HH(d, a, b, c, x[0], S32, 0xeaa127fa);
00186 HH(c, d, a, b, x[3], S33, 0xd4ef3085);
00187 HH(b, c, d, a, x[6], S34, 0x4881d05);
00188 HH(a, b, c, d, x[9], S31, 0xd9d4d039);
00189 HH(d, a, b, c, x[12], S32, 0xe6db99e5);
00190 HH(c, d, a, b, x[15], S33, 0x1fa27cf8);
00191 HH(b, c, d, a, x[2], S34, 0xc4ac5665);
00192
00193
00194 II(a, b, c, d, x[0], S41, 0xf4292244);
00195 II(d, a, b, c, x[7], S42, 0x432aff97);
00196 II(c, d, a, b, x[14], S43, 0xab9423a7);
00197 II(b, c, d, a, x[5], S44, 0xfc93a039);
00198 II(a, b, c, d, x[12], S41, 0x655b59c3);
00199 II(d, a, b, c, x[3], S42, 0x8f0ccc92);
00200 II(c, d, a, b, x[10], S43, 0xffeff47d);
00201 II(b, c, d, a, x[1], S44, 0x85845dd1);
00202 II(a, b, c, d, x[8], S41, 0x6fa87e4f);
00203 II(d, a, b, c, x[15], S42, 0xfe2ce6e0);
00204 II(c, d, a, b, x[6], S43, 0xa3014314);
00205 II(b, c, d, a, x[13], S44, 0x4e0811a1);
00206 II(a, b, c, d, x[4], S41, 0xf7537e82);
00207 II(d, a, b, c, x[11], S42, 0xbd3af235);
00208 II(c, d, a, b, x[2], S43, 0x2ad7d2bb);
00209 II(b, c, d, a, x[9], S44, 0xeb86d391);
00210
00211 state[0] += a;
00212 state[1] += b;
00213 state[2] += c;
00214 state[3] += d;
00215
00216
00217
00218
00219 memset((unsigned char *) x, 0, sizeof(x));
00220 }
00221
00228 void
00229 our_MD5Init(MD5_CTX * context)
00230 {
00231 context->count[0] = context->count[1] = 0;
00232
00233 context->state[0] = 0x67452301;
00234 context->state[1] = 0xefcdab89;
00235 context->state[2] = 0x98badcfe;
00236 context->state[3] = 0x10325476;
00237 }
00238
00249 void
00250 ourMD5Update(MD5_CTX * context, const unsigned char *input, unsigned int inputLen)
00251 {
00252 unsigned int i, index, partLen;
00253
00254
00255 index = (unsigned int) ((context->count[0] >> 3) & 0x3F);
00256
00257
00258 if ((context->count[0] += ((UNSIGNED32) inputLen << 3)) < ((UNSIGNED32) inputLen << 3)) {
00259 context->count[1]++;
00260 }
00261 context->count[1] += ((UNSIGNED32) inputLen >> 29);
00262
00263 partLen = 64 - index;
00264
00265
00266 if (inputLen >= partLen) {
00267 memcpy((unsigned char *) & context->buffer[index], (unsigned char *) input, partLen);
00268 MD5Transform(context->state, context->buffer);
00269
00270 for (i = partLen; i + 63 < inputLen; i += 64) {
00271 MD5Transform(context->state, &input[i]);
00272 }
00273 index = 0;
00274 } else {
00275 i = 0;
00276 }
00277
00278 if ((inputLen - i) != 0) {
00279 memcpy((unsigned char *) & context->buffer[index], (unsigned char *) & input[i], inputLen - i);
00280 }
00281 }
00282
00293 void
00294 our_MD5Final(unsigned char digest[16], MD5_CTX * context)
00295 {
00296 unsigned char bits[8];
00297 unsigned int index, padLen;
00298
00299
00300 Encode(bits, context->count, 8);
00301
00302
00303
00304
00305 index = (unsigned int) ((context->count[0] >> 3) & 0x3f);
00306 padLen = (index < 56) ? (56 - index) : (120 - index);
00307 ourMD5Update(context, PADDING, padLen);
00308
00309
00310 ourMD5Update(context, bits, 8);
00311
00312 Encode(digest, context->state, 16);
00313
00314
00315
00316
00317 memset((unsigned char *) context, 0, sizeof(*context));
00318 }
00319