55static uint8_t PADDING[64] = {
 
   56  0x80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
 
   57  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
 
   58  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
 
   62#define F(x, y, z) (((x) & (y)) | ((~x) & (z))) 
   63#define G(x, y, z) (((x) & (z)) | ((y) & (~z))) 
   64#define H(x, y, z) ((x) ^ (y) ^ (z)) 
   65#define I(x, y, z) ((y) ^ ((x) | (~z))) 
   68#define ROTATE_LEFT(x, n) (((x) << (n)) | ((x) >> (32-(n)))) 
   75#define FF(a, b, c, d, x, s, ac) { \ 
   76 (a) += F ((b), (c), (d)) + (x) + (uint32_t)(ac); \ 
   77 (a) = ROTATE_LEFT ((a), (s)); \ 
   81#define GG(a, b, c, d, x, s, ac) { \ 
   82 (a) += G ((b), (c), (d)) + (x) + (uint32_t)(ac); \ 
   83 (a) = ROTATE_LEFT ((a), (s)); \ 
   86#define HH(a, b, c, d, x, s, ac) { \ 
   87 (a) += H ((b), (c), (d)) + (x) + (uint32_t)(ac); \ 
   88 (a) = ROTATE_LEFT ((a), (s)); \ 
   91#define II(a, b, c, d, x, s, ac) { \ 
   92 (a) += I ((b), (c), (d)) + (x) + (uint32_t)(ac); \ 
   93 (a) = ROTATE_LEFT ((a), (s)); \ 
   98void MD5::MD5Init(
MD5_CTX *context) {
 
   99  context->count[0] = context->count[1] = 0;
 
  100  context->state[0] = 0x67452301;
 
  101  context->state[1] = 0xefcdab89;
 
  102  context->state[2] = 0x98badcfe;
 
  103  context->state[3] = 0x10325476;
 
  111void MD5::MD5Update(
MD5_CTX *context, uint8_t *input, uint32_t inputLen) {
 
  112  uint32_t i, index, partLen;
 
  115  index = (uint32_t)((context->count[0] >> 3) & 0x3F);
 
  118  if((context->count[0] += ((uint32_t)inputLen << 3))
 
  119      < ((uint32_t)inputLen << 3))
 
  122  context->count[1] += ((uint32_t)inputLen >> 29);
 
  123  partLen = 64 - index;
 
  128  if(inputLen >= partLen) {
 
  129    MD5_memcpy((POINTER)&context->buffer[index], (POINTER)input, partLen);
 
  130    MD5Transform(context->state, context->buffer);
 
  132    for(i = partLen; i + 63 < inputLen; i += 64)
 
  133      MD5Transform(context->state, &input[i]);
 
  141  MD5_memcpy((POINTER)&context->buffer[index],
 
  150void MD5::MD5Final(uint8_t digest[16], 
MD5_CTX *context) {
 
  152  uint32_t index, padLen;
 
  155  Encode(bits, context->count, 8);
 
  160  index = (uint32_t)((context->count[0] >> 3) & 0x3f);
 
  161  padLen = (index < 56) ? (56 - index) : (120 - index);
 
  162  MD5Update(context, PADDING, padLen);
 
  165  MD5Update(context, bits, 8);
 
  168  Encode(digest, context->state, 16);
 
  173  MD5_memset((POINTER)context, 0, 
sizeof(*context));
 
  179void MD5::MD5Transform(uint32_t state[4], uint8_t block[64]) {
 
  180  uint32_t a = state[0], b = state[1], c = state[2], d = state[3], x[16];
 
  182  Decode(x, block, 64);
 
  185  FF(a, b, c, d, x[ 0], S11, 0xd76aa478);  
 
  186  FF(d, a, b, c, x[ 1], S12, 0xe8c7b756);  
 
  187  FF(c, d, a, b, x[ 2], S13, 0x242070db);  
 
  188  FF(b, c, d, a, x[ 3], S14, 0xc1bdceee);  
 
  189  FF(a, b, c, d, x[ 4], S11, 0xf57c0faf);  
 
  190  FF(d, a, b, c, x[ 5], S12, 0x4787c62a);  
 
  191  FF(c, d, a, b, x[ 6], S13, 0xa8304613);  
 
  192  FF(b, c, d, a, x[ 7], S14, 0xfd469501);  
 
  193  FF(a, b, c, d, x[ 8], S11, 0x698098d8);  
 
  194  FF(d, a, b, c, x[ 9], S12, 0x8b44f7af);  
 
  195  FF(c, d, a, b, x[10], S13, 0xffff5bb1);  
 
  196  FF(b, c, d, a, x[11], S14, 0x895cd7be);  
 
  197  FF(a, b, c, d, x[12], S11, 0x6b901122);  
 
  198  FF(d, a, b, c, x[13], S12, 0xfd987193);  
 
  199  FF(c, d, a, b, x[14], S13, 0xa679438e);  
 
  200  FF(b, c, d, a, x[15], S14, 0x49b40821);  
 
  203  GG(a, b, c, d, x[ 1], S21, 0xf61e2562);  
 
  204  GG(d, a, b, c, x[ 6], S22, 0xc040b340);  
 
  205  GG(c, d, a, b, x[11], S23, 0x265e5a51);  
 
  206  GG(b, c, d, a, x[ 0], S24, 0xe9b6c7aa);  
 
  207  GG(a, b, c, d, x[ 5], S21, 0xd62f105d);  
 
  208  GG(d, a, b, c, x[10], S22,  0x2441453);  
 
  209  GG(c, d, a, b, x[15], S23, 0xd8a1e681);  
 
  210  GG(b, c, d, a, x[ 4], S24, 0xe7d3fbc8);  
 
  211  GG(a, b, c, d, x[ 9], S21, 0x21e1cde6);  
 
  212  GG(d, a, b, c, x[14], S22, 0xc33707d6);  
 
  213  GG(c, d, a, b, x[ 3], S23, 0xf4d50d87);  
 
  215  GG(b, c, d, a, x[ 8], S24, 0x455a14ed);  
 
  216  GG(a, b, c, d, x[13], S21, 0xa9e3e905);  
 
  217  GG(d, a, b, c, x[ 2], S22, 0xfcefa3f8);  
 
  218  GG(c, d, a, b, x[ 7], S23, 0x676f02d9);  
 
  219  GG(b, c, d, a, x[12], S24, 0x8d2a4c8a);  
 
  222  HH(a, b, c, d, x[ 5], S31, 0xfffa3942);  
 
  223  HH(d, a, b, c, x[ 8], S32, 0x8771f681);  
 
  224  HH(c, d, a, b, x[11], S33, 0x6d9d6122);  
 
  225  HH(b, c, d, a, x[14], S34, 0xfde5380c);  
 
  226  HH(a, b, c, d, x[ 1], S31, 0xa4beea44);  
 
  227  HH(d, a, b, c, x[ 4], S32, 0x4bdecfa9);  
 
  228  HH(c, d, a, b, x[ 7], S33, 0xf6bb4b60);  
 
  229  HH(b, c, d, a, x[10], S34, 0xbebfbc70);  
 
  230  HH(a, b, c, d, x[13], S31, 0x289b7ec6);  
 
  231  HH(d, a, b, c, x[ 0], S32, 0xeaa127fa);  
 
  232  HH(c, d, a, b, x[ 3], S33, 0xd4ef3085);  
 
  233  HH(b, c, d, a, x[ 6], S34,  0x4881d05);  
 
  234  HH(a, b, c, d, x[ 9], S31, 0xd9d4d039);  
 
  235  HH(d, a, b, c, x[12], S32, 0xe6db99e5);  
 
  236  HH(c, d, a, b, x[15], S33, 0x1fa27cf8);  
 
  237  HH(b, c, d, a, x[ 2], S34, 0xc4ac5665);  
 
  240  II(a, b, c, d, x[ 0], S41, 0xf4292244);  
 
  241  II(d, a, b, c, x[ 7], S42, 0x432aff97);  
 
  242  II(c, d, a, b, x[14], S43, 0xab9423a7);  
 
  243  II(b, c, d, a, x[ 5], S44, 0xfc93a039);  
 
  244  II(a, b, c, d, x[12], S41, 0x655b59c3);  
 
  245  II(d, a, b, c, x[ 3], S42, 0x8f0ccc92);  
 
  246  II(c, d, a, b, x[10], S43, 0xffeff47d);  
 
  247  II(b, c, d, a, x[ 1], S44, 0x85845dd1);  
 
  248  II(a, b, c, d, x[ 8], S41, 0x6fa87e4f);  
 
  249  II(d, a, b, c, x[15], S42, 0xfe2ce6e0);  
 
  250  II(c, d, a, b, x[ 6], S43, 0xa3014314);  
 
  251  II(b, c, d, a, x[13], S44, 0x4e0811a1);  
 
  252  II(a, b, c, d, x[ 4], S41, 0xf7537e82);  
 
  253  II(d, a, b, c, x[11], S42, 0xbd3af235);  
 
  254  II(c, d, a, b, x[ 2], S43, 0x2ad7d2bb);  
 
  255  II(b, c, d, a, x[ 9], S44, 0xeb86d391);  
 
  265  MD5_memset((POINTER)x, 0, 
sizeof(x));
 
  272void MD5::Encode(uint8_t *output, uint32_t *input, uint32_t len) {
 
  275  for(i = 0, j = 0; j < len; i++, j += 4) {
 
  276    output[j] = (uint8_t)(input[i] & 0xff);
 
  277    output[j+1] = (uint8_t)((input[i] >> 8) & 0xff);
 
  278    output[j+2] = (uint8_t)((input[i] >> 16) & 0xff);
 
  279    output[j+3] = (uint8_t)((input[i] >> 24) & 0xff);
 
  287void MD5::Decode(uint32_t *output, uint8_t *input, uint32_t len) {
 
  290  for(i = 0, j = 0; j < len; i++, j += 4)
 
  291    output[i] = ((uint32_t)input[j]) |
 
  292                (((uint32_t)input[j+1]) << 8) |
 
  293                (((uint32_t)input[j+2]) << 16) |
 
  294                (((uint32_t)input[j+3]) << 24);
 
  300void MD5::MD5_memcpy(POINTER output, POINTER input, uint32_t len) {
 
  303  for(i = 0; i < len; i++)
 
  304    output[i] = input[i];
 
  310void MD5::MD5_memset(POINTER output, int32_t value, uint32_t len) {
 
  312  for(i = 0; i < len; i++)
 
  313    ((int8_t *)output)[i] = (int8_t)value;