00001
00002
00003
00004
00005 #include <stdio.h>
00006 #include <stdlib.h>
00007 #include "MD5.h"
00008
00009 static unsigned char MD5_PADDING[64] = {
00010 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
00011 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
00012 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
00013 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
00014 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
00015 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
00016 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
00017 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
00018 };
00019
00020 #define MD5_F(x, y, z) (((x) & (y)) | ((~x) & (z)))
00021 #define MD5_G(x, y, z) (((x) & (z)) | ((y) & (~z)))
00022 #define MD5_H(x, y, z) ((x) ^ (y) ^ (z))
00023 #define MD5_I(x, y, z) ((y) ^ ((x) | (~z)))
00024
00025 #ifndef ROTATE_LEFT
00026 #define ROTATE_LEFT(x, n) (((x) << (n)) | ((x) >> (32-(n))))
00027 #endif
00028
00029 #define MD5_FF(a, b, c, d, x, s, ac) {(a) += MD5_F ((b), (c), (d)) + (x) + (UINT4)(ac); (a) = ROTATE_LEFT ((a), (s)); (a) += (b); }
00030 #define MD5_GG(a, b, c, d, x, s, ac) {(a) += MD5_G ((b), (c), (d)) + (x) + (UINT4)(ac); (a) = ROTATE_LEFT ((a), (s)); (a) += (b); }
00031 #define MD5_HH(a, b, c, d, x, s, ac) {(a) += MD5_H ((b), (c), (d)) + (x) + (UINT4)(ac); (a) = ROTATE_LEFT ((a), (s)); (a) += (b); }
00032 #define MD5_II(a, b, c, d, x, s, ac) {(a) += MD5_I ((b), (c), (d)) + (x) + (UINT4)(ac); (a) = ROTATE_LEFT ((a), (s)); (a) += (b); }
00033
00034 #define MD5_S11 7
00035 #define MD5_S12 12
00036 #define MD5_S13 17
00037 #define MD5_S14 22
00038 #define MD5_S21 5
00039 #define MD5_S22 9
00040 #define MD5_S23 14
00041 #define MD5_S24 20
00042 #define MD5_S31 4
00043 #define MD5_S32 11
00044 #define MD5_S33 16
00045 #define MD5_S34 23
00046 #define MD5_S41 6
00047 #define MD5_S42 10
00048 #define MD5_S43 15
00049 #define MD5_S44 21
00050
00051 static void MD5_Transform (UINT4 *buf, UINT4 *in)
00052 {
00053 UINT4 a = buf[0], b = buf[1], c = buf[2], d = buf[3];
00054
00055
00056 MD5_FF ( a, b, c, d, in[ 0], MD5_S11, (UINT4) 3614090360u);
00057 MD5_FF ( d, a, b, c, in[ 1], MD5_S12, (UINT4) 3905402710u);
00058 MD5_FF ( c, d, a, b, in[ 2], MD5_S13, (UINT4) 606105819u);
00059 MD5_FF ( b, c, d, a, in[ 3], MD5_S14, (UINT4) 3250441966u);
00060 MD5_FF ( a, b, c, d, in[ 4], MD5_S11, (UINT4) 4118548399u);
00061 MD5_FF ( d, a, b, c, in[ 5], MD5_S12, (UINT4) 1200080426u);
00062 MD5_FF ( c, d, a, b, in[ 6], MD5_S13, (UINT4) 2821735955u);
00063 MD5_FF ( b, c, d, a, in[ 7], MD5_S14, (UINT4) 4249261313u);
00064 MD5_FF ( a, b, c, d, in[ 8], MD5_S11, (UINT4) 1770035416u);
00065 MD5_FF ( d, a, b, c, in[ 9], MD5_S12, (UINT4) 2336552879u);
00066 MD5_FF ( c, d, a, b, in[10], MD5_S13, (UINT4) 4294925233u);
00067 MD5_FF ( b, c, d, a, in[11], MD5_S14, (UINT4) 2304563134u);
00068 MD5_FF ( a, b, c, d, in[12], MD5_S11, (UINT4) 1804603682u);
00069 MD5_FF ( d, a, b, c, in[13], MD5_S12, (UINT4) 4254626195u);
00070 MD5_FF ( c, d, a, b, in[14], MD5_S13, (UINT4) 2792965006u);
00071 MD5_FF ( b, c, d, a, in[15], MD5_S14, (UINT4) 1236535329u);
00072
00073
00074 MD5_GG ( a, b, c, d, in[ 1], MD5_S21, (UINT4) 4129170786u);
00075 MD5_GG ( d, a, b, c, in[ 6], MD5_S22, (UINT4) 3225465664u);
00076 MD5_GG ( c, d, a, b, in[11], MD5_S23, (UINT4) 643717713u);
00077 MD5_GG ( b, c, d, a, in[ 0], MD5_S24, (UINT4) 3921069994u);
00078 MD5_GG ( a, b, c, d, in[ 5], MD5_S21, (UINT4) 3593408605u);
00079 MD5_GG ( d, a, b, c, in[10], MD5_S22, (UINT4) 38016083u);
00080 MD5_GG ( c, d, a, b, in[15], MD5_S23, (UINT4) 3634488961u);
00081 MD5_GG ( b, c, d, a, in[ 4], MD5_S24, (UINT4) 3889429448u);
00082 MD5_GG ( a, b, c, d, in[ 9], MD5_S21, (UINT4) 568446438u);
00083 MD5_GG ( d, a, b, c, in[14], MD5_S22, (UINT4) 3275163606u);
00084 MD5_GG ( c, d, a, b, in[ 3], MD5_S23, (UINT4) 4107603335u);
00085 MD5_GG ( b, c, d, a, in[ 8], MD5_S24, (UINT4) 1163531501u);
00086 MD5_GG ( a, b, c, d, in[13], MD5_S21, (UINT4) 2850285829u);
00087 MD5_GG ( d, a, b, c, in[ 2], MD5_S22, (UINT4) 4243563512u);
00088 MD5_GG ( c, d, a, b, in[ 7], MD5_S23, (UINT4) 1735328473u);
00089 MD5_GG ( b, c, d, a, in[12], MD5_S24, (UINT4) 2368359562u);
00090
00091
00092 MD5_HH ( a, b, c, d, in[ 5], MD5_S31, (UINT4) 4294588738u);
00093 MD5_HH ( d, a, b, c, in[ 8], MD5_S32, (UINT4) 2272392833u);
00094 MD5_HH ( c, d, a, b, in[11], MD5_S33, (UINT4) 1839030562u);
00095 MD5_HH ( b, c, d, a, in[14], MD5_S34, (UINT4) 4259657740u);
00096 MD5_HH ( a, b, c, d, in[ 1], MD5_S31, (UINT4) 2763975236u);
00097 MD5_HH ( d, a, b, c, in[ 4], MD5_S32, (UINT4) 1272893353u);
00098 MD5_HH ( c, d, a, b, in[ 7], MD5_S33, (UINT4) 4139469664u);
00099 MD5_HH ( b, c, d, a, in[10], MD5_S34, (UINT4) 3200236656u);
00100 MD5_HH ( a, b, c, d, in[13], MD5_S31, (UINT4) 681279174u);
00101 MD5_HH ( d, a, b, c, in[ 0], MD5_S32, (UINT4) 3936430074u);
00102 MD5_HH ( c, d, a, b, in[ 3], MD5_S33, (UINT4) 3572445317u);
00103 MD5_HH ( b, c, d, a, in[ 6], MD5_S34, (UINT4) 76029189u);
00104 MD5_HH ( a, b, c, d, in[ 9], MD5_S31, (UINT4) 3654602809u);
00105 MD5_HH ( d, a, b, c, in[12], MD5_S32, (UINT4) 3873151461u);
00106 MD5_HH ( c, d, a, b, in[15], MD5_S33, (UINT4) 530742520u);
00107 MD5_HH ( b, c, d, a, in[ 2], MD5_S34, (UINT4) 3299628645u);
00108
00109
00110 MD5_II ( a, b, c, d, in[ 0], MD5_S41, (UINT4) 4096336452u);
00111 MD5_II ( d, a, b, c, in[ 7], MD5_S42, (UINT4) 1126891415u);
00112 MD5_II ( c, d, a, b, in[14], MD5_S43, (UINT4) 2878612391u);
00113 MD5_II ( b, c, d, a, in[ 5], MD5_S44, (UINT4) 4237533241u);
00114 MD5_II ( a, b, c, d, in[12], MD5_S41, (UINT4) 1700485571u);
00115 MD5_II ( d, a, b, c, in[ 3], MD5_S42, (UINT4) 2399980690u);
00116 MD5_II ( c, d, a, b, in[10], MD5_S43, (UINT4) 4293915773u);
00117 MD5_II ( b, c, d, a, in[ 1], MD5_S44, (UINT4) 2240044497u);
00118 MD5_II ( a, b, c, d, in[ 8], MD5_S41, (UINT4) 1873313359u);
00119 MD5_II ( d, a, b, c, in[15], MD5_S42, (UINT4) 4264355552u);
00120 MD5_II ( c, d, a, b, in[ 6], MD5_S43, (UINT4) 2734768916u);
00121 MD5_II ( b, c, d, a, in[13], MD5_S44, (UINT4) 1309151649u);
00122 MD5_II ( a, b, c, d, in[ 4], MD5_S41, (UINT4) 4149444226u);
00123 MD5_II ( d, a, b, c, in[11], MD5_S42, (UINT4) 3174756917u);
00124 MD5_II ( c, d, a, b, in[ 2], MD5_S43, (UINT4) 718787259u);
00125 MD5_II ( b, c, d, a, in[ 9], MD5_S44, (UINT4) 3951481745u);
00126
00127 buf[0] += a;
00128 buf[1] += b;
00129 buf[2] += c;
00130 buf[3] += d;
00131 }
00132
00133 void MD5Init (MD5_CTX *mdContext, unsigned long pseudoRandomNumber)
00134 {
00135 mdContext->i[0] = mdContext->i[1] = (UINT4)0;
00136
00137
00138 mdContext->buf[0] = (UINT4)0x67452301 + (pseudoRandomNumber * 11);
00139 mdContext->buf[1] = (UINT4)0xefcdab89 + (pseudoRandomNumber * 71);
00140 mdContext->buf[2] = (UINT4)0x98badcfe + (pseudoRandomNumber * 37);
00141 mdContext->buf[3] = (UINT4)0x10325476 + (pseudoRandomNumber * 97);
00142 }
00143
00144 void MD5Update (MD5_CTX *mdContext, unsigned char *inBuf, unsigned int inLen)
00145 {
00146 UINT4 in[16];
00147 int mdi = 0;
00148 unsigned int i = 0, ii = 0;
00149
00150
00151 mdi = (int)((mdContext->i[0] >> 3) & 0x3F);
00152
00153
00154 if ((mdContext->i[0] + ((UINT4)inLen << 3)) < mdContext->i[0])
00155 mdContext->i[1]++;
00156 mdContext->i[0] += ((UINT4)inLen << 3);
00157 mdContext->i[1] += ((UINT4)inLen >> 29);
00158
00159 while (inLen--)
00160 {
00161
00162 mdContext->in[mdi++] = *inBuf++;
00163
00164
00165 if (mdi == 0x40)
00166 {
00167 for (i = 0, ii = 0; i < 16; i++, ii += 4)
00168 in[i] = (((UINT4)mdContext->in[ii+3]) << 24) |
00169 (((UINT4)mdContext->in[ii+2]) << 16) |
00170 (((UINT4)mdContext->in[ii+1]) << 8) |
00171 ((UINT4)mdContext->in[ii]);
00172
00173 MD5_Transform (mdContext->buf, in);
00174 mdi = 0;
00175 }
00176 }
00177 }
00178
00179 void MD5Final (MD5_CTX *mdContext)
00180 {
00181 UINT4 in[16];
00182 int mdi = 0;
00183 unsigned int i = 0, ii = 0, padLen = 0;
00184
00185
00186 in[14] = mdContext->i[0];
00187 in[15] = mdContext->i[1];
00188
00189
00190 mdi = (int)((mdContext->i[0] >> 3) & 0x3F);
00191
00192
00193 padLen = (mdi < 56) ? (56 - mdi) : (120 - mdi);
00194 MD5Update (mdContext, MD5_PADDING, padLen);
00195
00196
00197 for (i = 0, ii = 0; i < 14; i++, ii += 4)
00198 in[i] = (((UINT4)mdContext->in[ii+3]) << 24) |
00199 (((UINT4)mdContext->in[ii+2]) << 16) |
00200 (((UINT4)mdContext->in[ii+1]) << 8) |
00201 ((UINT4)mdContext->in[ii]);
00202 MD5_Transform (mdContext->buf, in);
00203
00204
00205 for (i = 0, ii = 0; i < 4; i++, ii += 4)
00206 {
00207 mdContext->digest[ii] = (unsigned char)( mdContext->buf[i] & 0xFF);
00208 mdContext->digest[ii+1] = (unsigned char)((mdContext->buf[i] >> 8) & 0xFF);
00209 mdContext->digest[ii+2] = (unsigned char)((mdContext->buf[i] >> 16) & 0xFF);
00210 mdContext->digest[ii+3] = (unsigned char)((mdContext->buf[i] >> 24) & 0xFF);
00211 }
00212 }
00213
00214 int md5file ( char *fn , unsigned long seed , MD5_CTX *mdContext )
00215 {
00216
00217 unsigned long size = 0;
00218 FILE *f = fopen ( fn , "rb" ) ;
00219 if ( f == NULL ) return 0 ;
00220
00221 MD5Init ( mdContext , seed ) ;
00222
00223 char buf[2048] ;
00224 unsigned int trb = 0 ;
00225 for (;;) {
00226 int rb = fread ( buf , 1 , 2048 , f ) ;
00227 if ( size > 0 && rb + trb > size ) rb = size - trb ;
00228 trb += rb ;
00229 MD5Update ( mdContext , (unsigned char *) buf , rb ) ;
00230 if ( rb < 2048 || ( size > 0 && trb >= size ) ) break ;
00231 }
00232 fclose ( f ) ;
00233 MD5Final ( mdContext ) ;
00234
00235 return trb ;
00236 }