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 #include "addon/md5.hpp"
00045
00046 #include <assert.h>
00047 #include <stdexcept>
00048
00049 MD5::MD5() :
00050 finalized()
00051 {
00052 init();
00053 }
00054
00055 void MD5::update (uint8_t* input, uint32_t input_length) {
00056
00057 uint32_t input_index, buffer_index;
00058 uint32_t buffer_space;
00059
00060 if (finalized) throw std::runtime_error("MD5::update: Can't update a finalized digest!");
00061
00062
00063 buffer_index = (unsigned int)((count[0] >> 3) & 0x3F);
00064
00065
00066 if ( (count[0] += ((uint32_t) input_length << 3))<((uint32_t) input_length << 3) ) count[1]++;
00067
00068 count[1] += ((uint32_t)input_length >> 29);
00069
00070 buffer_space = 64 - buffer_index;
00071
00072
00073 if (input_length >= buffer_space) {
00074
00075 memcpy (buffer + buffer_index, input, buffer_space);
00076 transform (buffer);
00077
00078
00079 for (input_index = buffer_space; input_index + 63 < input_length;
00080 input_index += 64)
00081 transform (input+input_index);
00082
00083 buffer_index = 0;
00084 } else
00085 input_index=0;
00086
00087
00088 memcpy(buffer+buffer_index, input+input_index, input_length-input_index);
00089 }
00090
00091 void MD5::update(FILE *file) {
00092 uint8_t buffer[1024];
00093 int len;
00094
00095 while ((len=fread(buffer, 1, 1024, file))) update(buffer, len);
00096
00097 fclose (file);
00098 }
00099
00100 void MD5::update(std::istream& stream) {
00101 uint8_t buffer[1024];
00102 int len;
00103
00104 while (stream.good()) {
00105 stream.read((char*)buffer, 1024);
00106 len=stream.gcount();
00107 update(buffer, len);
00108 }
00109 }
00110
00111 void MD5::update(std::ifstream& stream) {
00112 uint8_t buffer[1024];
00113 int len;
00114
00115 while (stream.good()) {
00116 stream.read((char*)buffer, 1024);
00117 len=stream.gcount();
00118 update(buffer, len);
00119 }
00120 }
00121
00122 MD5::MD5(FILE *file) :
00123 finalized()
00124 {
00125 init();
00126 update(file);
00127 finalize ();
00128 }
00129
00130 MD5::MD5(std::istream& stream) :
00131 finalized()
00132 {
00133 init();
00134 update (stream);
00135 finalize();
00136 }
00137
00138 MD5::MD5(std::ifstream& stream) :
00139 finalized()
00140 {
00141 init();
00142 update (stream);
00143 finalize();
00144 }
00145
00146 uint8_t* MD5::raw_digest() {
00147 uint8_t* s = new uint8_t[16];
00148
00149 finalize();
00150
00151 memcpy(s, digest, 16);
00152 return s;
00153 }
00154
00155 std::string MD5::hex_digest() {
00156 int i;
00157 char* s= new char[33];
00158
00159 finalize();
00160
00161 for (i=0; i<16; i++) sprintf(s+i*2, "%02x", digest[i]);
00162
00163 s[32]='\0';
00164
00165 return s;
00166 }
00167
00168 std::ostream& operator<<(std::ostream &stream, MD5 context) {
00169 stream << context.hex_digest();
00170 return stream;
00171 }
00172
00173
00174
00175 void MD5::init() {
00176 finalized=false;
00177
00178
00179 count[0] = 0;
00180 count[1] = 0;
00181
00182
00183 state[0] = 0x67452301;
00184 state[1] = 0xefcdab89;
00185 state[2] = 0x98badcfe;
00186 state[3] = 0x10325476;
00187 }
00188
00189 void MD5::finalize() {
00190 if (finalized) return;
00191
00192 uint8_t bits[8];
00193 unsigned int index, padLen;
00194 static uint8_t PADDING[64]={
00195 0x80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
00196 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
00197 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
00198 };
00199
00200
00201 encode (bits, count, 8);
00202
00203
00204 index = (uint32_t) ((count[0] >> 3) & 0x3f);
00205 padLen = (index < 56) ? (56 - index) : (120 - index);
00206 update (PADDING, padLen);
00207
00208
00209 update (bits, 8);
00210
00211
00212 encode (digest, state, 16);
00213
00214
00215 memset (buffer, 0, sizeof(*buffer));
00216
00217 finalized=true;
00218 }
00219
00220
00221
00222
00223
00224 #define S11 7
00225 #define S12 12
00226 #define S13 17
00227 #define S14 22
00228 #define S21 5
00229 #define S22 9
00230 #define S23 14
00231 #define S24 20
00232 #define S31 4
00233 #define S32 11
00234 #define S33 16
00235 #define S34 23
00236 #define S41 6
00237 #define S42 10
00238 #define S43 15
00239 #define S44 21
00240
00241 void MD5::transform (uint8_t block[64]) {
00242 uint32_t a = state[0], b = state[1], c = state[2], d = state[3], x[16];
00243
00244 decode (x, block, 64);
00245
00246 assert(!finalized);
00247
00248
00249 FF (a, b, c, d, x[ 0], S11, 0xd76aa478);
00250 FF (d, a, b, c, x[ 1], S12, 0xe8c7b756);
00251 FF (c, d, a, b, x[ 2], S13, 0x242070db);
00252 FF (b, c, d, a, x[ 3], S14, 0xc1bdceee);
00253 FF (a, b, c, d, x[ 4], S11, 0xf57c0faf);
00254 FF (d, a, b, c, x[ 5], S12, 0x4787c62a);
00255 FF (c, d, a, b, x[ 6], S13, 0xa8304613);
00256 FF (b, c, d, a, x[ 7], S14, 0xfd469501);
00257 FF (a, b, c, d, x[ 8], S11, 0x698098d8);
00258 FF (d, a, b, c, x[ 9], S12, 0x8b44f7af);
00259 FF (c, d, a, b, x[10], S13, 0xffff5bb1);
00260 FF (b, c, d, a, x[11], S14, 0x895cd7be);
00261 FF (a, b, c, d, x[12], S11, 0x6b901122);
00262 FF (d, a, b, c, x[13], S12, 0xfd987193);
00263 FF (c, d, a, b, x[14], S13, 0xa679438e);
00264 FF (b, c, d, a, x[15], S14, 0x49b40821);
00265
00266
00267 GG (a, b, c, d, x[ 1], S21, 0xf61e2562);
00268 GG (d, a, b, c, x[ 6], S22, 0xc040b340);
00269 GG (c, d, a, b, x[11], S23, 0x265e5a51);
00270 GG (b, c, d, a, x[ 0], S24, 0xe9b6c7aa);
00271 GG (a, b, c, d, x[ 5], S21, 0xd62f105d);
00272 GG (d, a, b, c, x[10], S22, 0x02441453);
00273 GG (c, d, a, b, x[15], S23, 0xd8a1e681);
00274 GG (b, c, d, a, x[ 4], S24, 0xe7d3fbc8);
00275 GG (a, b, c, d, x[ 9], S21, 0x21e1cde6);
00276 GG (d, a, b, c, x[14], S22, 0xc33707d6);
00277 GG (c, d, a, b, x[ 3], S23, 0xf4d50d87);
00278 GG (b, c, d, a, x[ 8], S24, 0x455a14ed);
00279 GG (a, b, c, d, x[13], S21, 0xa9e3e905);
00280 GG (d, a, b, c, x[ 2], S22, 0xfcefa3f8);
00281 GG (c, d, a, b, x[ 7], S23, 0x676f02d9);
00282 GG (b, c, d, a, x[12], S24, 0x8d2a4c8a);
00283
00284
00285 HH (a, b, c, d, x[ 5], S31, 0xfffa3942);
00286 HH (d, a, b, c, x[ 8], S32, 0x8771f681);
00287 HH (c, d, a, b, x[11], S33, 0x6d9d6122);
00288 HH (b, c, d, a, x[14], S34, 0xfde5380c);
00289 HH (a, b, c, d, x[ 1], S31, 0xa4beea44);
00290 HH (d, a, b, c, x[ 4], S32, 0x4bdecfa9);
00291 HH (c, d, a, b, x[ 7], S33, 0xf6bb4b60);
00292 HH (b, c, d, a, x[10], S34, 0xbebfbc70);
00293 HH (a, b, c, d, x[13], S31, 0x289b7ec6);
00294 HH (d, a, b, c, x[ 0], S32, 0xeaa127fa);
00295 HH (c, d, a, b, x[ 3], S33, 0xd4ef3085);
00296 HH (b, c, d, a, x[ 6], S34, 0x04881d05);
00297 HH (a, b, c, d, x[ 9], S31, 0xd9d4d039);
00298 HH (d, a, b, c, x[12], S32, 0xe6db99e5);
00299 HH (c, d, a, b, x[15], S33, 0x1fa27cf8);
00300 HH (b, c, d, a, x[ 2], S34, 0xc4ac5665);
00301
00302
00303 II (a, b, c, d, x[ 0], S41, 0xf4292244);
00304 II (d, a, b, c, x[ 7], S42, 0x432aff97);
00305 II (c, d, a, b, x[14], S43, 0xab9423a7);
00306 II (b, c, d, a, x[ 5], S44, 0xfc93a039);
00307 II (a, b, c, d, x[12], S41, 0x655b59c3);
00308 II (d, a, b, c, x[ 3], S42, 0x8f0ccc92);
00309 II (c, d, a, b, x[10], S43, 0xffeff47d);
00310 II (b, c, d, a, x[ 1], S44, 0x85845dd1);
00311 II (a, b, c, d, x[ 8], S41, 0x6fa87e4f);
00312 II (d, a, b, c, x[15], S42, 0xfe2ce6e0);
00313 II (c, d, a, b, x[ 6], S43, 0xa3014314);
00314 II (b, c, d, a, x[13], S44, 0x4e0811a1);
00315 II (a, b, c, d, x[ 4], S41, 0xf7537e82);
00316 II (d, a, b, c, x[11], S42, 0xbd3af235);
00317 II (c, d, a, b, x[ 2], S43, 0x2ad7d2bb);
00318 II (b, c, d, a, x[ 9], S44, 0xeb86d391);
00319
00320 state[0] += a;
00321 state[1] += b;
00322 state[2] += c;
00323 state[3] += d;
00324
00325
00326 memset ( (uint8_t* ) x, 0, sizeof(x));
00327 }
00328
00329 void MD5::encode (uint8_t* output, uint32_t* input, uint32_t len) {
00330 unsigned int i, j;
00331
00332 for (i = 0, j = 0; j < len; i++, j += 4) {
00333 output[j] = (uint8_t) (input[i] & 0xff);
00334 output[j+1] = (uint8_t) ((input[i] >> 8) & 0xff);
00335 output[j+2] = (uint8_t) ((input[i] >> 16) & 0xff);
00336 output[j+3] = (uint8_t) ((input[i] >> 24) & 0xff);
00337 }
00338 }
00339
00340 void MD5::decode (uint32_t* output, uint8_t* input, uint32_t len) {
00341 unsigned int i, j;
00342
00343 for (i = 0, j = 0; j < len; i++, j += 4) {
00344 output[i] = ((uint32_t)input[j]) | (((uint32_t)input[j+1]) << 8) | (((uint32_t)input[j+2]) << 16) | (((uint32_t)input[j+3]) << 24);
00345 }
00346 }
00347
00348
00349 void MD5::memcpy (uint8_t* output, uint8_t* input, uint32_t len) {
00350 unsigned int i;
00351
00352 for (i = 0; i < len; i++) output[i] = input[i];
00353 }
00354
00355
00356 void MD5::memset (uint8_t* output, uint8_t value, uint32_t len) {
00357 unsigned int i;
00358
00359 for (i = 0; i < len; i++) output[i] = value;
00360 }
00361
00362 inline unsigned int MD5::rotate_left(uint32_t x, uint32_t n) {
00363 return (x << n) | (x >> (32-n));
00364 }
00365
00366 inline unsigned int MD5::F(uint32_t x, uint32_t y, uint32_t z) {
00367 return (x & y) | (~x & z);
00368 }
00369
00370 inline unsigned int MD5::G(uint32_t x, uint32_t y, uint32_t z) {
00371 return (x & z) | (y & ~z);
00372 }
00373
00374 inline unsigned int MD5::H(uint32_t x, uint32_t y, uint32_t z) {
00375 return x ^ y ^ z;
00376 }
00377
00378 inline unsigned int MD5::I(uint32_t x, uint32_t y, uint32_t z) {
00379 return y ^ (x | ~z);
00380 }
00381
00382 inline void MD5::FF(uint32_t& a, uint32_t b, uint32_t c, uint32_t d, uint32_t x, uint32_t s, uint32_t ac) {
00383 a += F(b, c, d) + x + ac;
00384 a = rotate_left (a, s) +b;
00385 }
00386
00387 inline void MD5::GG(uint32_t& a, uint32_t b, uint32_t c, uint32_t d, uint32_t x, uint32_t s, uint32_t ac) {
00388 a += G(b, c, d) + x + ac;
00389 a = rotate_left (a, s) +b;
00390 }
00391
00392 inline void MD5::HH(uint32_t& a, uint32_t b, uint32_t c, uint32_t d, uint32_t x, uint32_t s, uint32_t ac) {
00393 a += H(b, c, d) + x + ac;
00394 a = rotate_left (a, s) +b;
00395 }
00396
00397 inline void MD5::II(uint32_t& a, uint32_t b, uint32_t c, uint32_t d, uint32_t x, uint32_t s, uint32_t ac) {
00398 a += I(b, c, d) + x + ac;
00399 a = rotate_left (a, s) +b;
00400 }
00401
00402