61 inline MD5::uint4 MD5::F(uint4 x, uint4 y, uint4 z) {
 
   65 inline MD5::uint4 MD5::G(uint4 x, uint4 y, uint4 z) {
 
   69 inline MD5::uint4 MD5::H(uint4 x, uint4 y, uint4 z) {
 
   73 inline MD5::uint4 MD5::I(uint4 x, uint4 y, uint4 z) {
 
   78 inline MD5::uint4 MD5::rotate_left(uint4 x, 
int n) {
 
   79   return (x << n) | (x >> (32-n));
 
   84 inline void MD5::FF(uint4 &a, uint4 b, uint4 c, uint4 d, uint4 x, uint4 s, uint4 ac) {
 
   85   a = rotate_left(a+ F(b,c,d) + x + ac, s) + b;
 
   88 inline void MD5::GG(uint4 &a, uint4 b, uint4 c, uint4 d, uint4 x, uint4 s, uint4 ac) {
 
   89   a = rotate_left(a + G(b,c,d) + x + ac, s) + b;
 
   92 inline void MD5::HH(uint4 &a, uint4 b, uint4 c, uint4 d, uint4 x, uint4 s, uint4 ac) {
 
   93   a = rotate_left(a + H(b,c,d) + x + ac, s) + b;
 
   96 inline void MD5::II(uint4 &a, uint4 b, uint4 c, uint4 d, uint4 x, uint4 s, uint4 ac) {
 
   97   a = rotate_left(a + I(b,c,d) + x + ac, s) + b;
 
  114   update(text.c_str(), text.length());
 
  128   state[0] = 0x67452301;
 
  129   state[1] = 0xefcdab89;
 
  130   state[2] = 0x98badcfe;
 
  131   state[3] = 0x10325476;
 
  137 void MD5::decode(uint4 output[], 
const uint1 input[], size_type len)
 
  139   for (
unsigned int i = 0, j = 0; j < len; i++, j += 4)
 
  140     output[i] = ((uint4)input[j]) | (((uint4)input[j+1]) << 8) |
 
  141       (((uint4)input[j+2]) << 16) | (((uint4)input[j+3]) << 24);
 
  148 void MD5::encode(uint1 output[], 
const uint4 input[], size_type len)
 
  150   for (
size_type i = 0, j = 0; j < len; i++, j += 4) {
 
  151     output[j] = input[i] & 0xff;
 
  152     output[j+1] = (input[i] >> 8) & 0xff;
 
  153     output[j+2] = (input[i] >> 16) & 0xff;
 
  154     output[j+3] = (input[i] >> 24) & 0xff;
 
  161 void MD5::transform(
const uint1 block[blocksize])
 
  163   uint4 a = state[0], b = state[1], c = state[2], d = state[3], x[16];
 
  164   decode (x, block, blocksize);
 
  167   FF (a, b, c, d, x[ 0], 
S11, 0xd76aa478); 
 
  168   FF (d, a, b, c, x[ 1], 
S12, 0xe8c7b756); 
 
  169   FF (c, d, a, b, x[ 2], 
S13, 0x242070db); 
 
  170   FF (b, c, d, a, x[ 3], 
S14, 0xc1bdceee); 
 
  171   FF (a, b, c, d, x[ 4], 
S11, 0xf57c0faf); 
 
  172   FF (d, a, b, c, x[ 5], 
S12, 0x4787c62a); 
 
  173   FF (c, d, a, b, x[ 6], 
S13, 0xa8304613); 
 
  174   FF (b, c, d, a, x[ 7], 
S14, 0xfd469501); 
 
  175   FF (a, b, c, d, x[ 8], 
S11, 0x698098d8); 
 
  176   FF (d, a, b, c, x[ 9], 
S12, 0x8b44f7af); 
 
  177   FF (c, d, a, b, x[10], 
S13, 0xffff5bb1); 
 
  178   FF (b, c, d, a, x[11], 
S14, 0x895cd7be); 
 
  179   FF (a, b, c, d, x[12], 
S11, 0x6b901122); 
 
  180   FF (d, a, b, c, x[13], 
S12, 0xfd987193); 
 
  181   FF (c, d, a, b, x[14], 
S13, 0xa679438e); 
 
  182   FF (b, c, d, a, x[15], 
S14, 0x49b40821); 
 
  185   GG (a, b, c, d, x[ 1], 
S21, 0xf61e2562); 
 
  186   GG (d, a, b, c, x[ 6], 
S22, 0xc040b340); 
 
  187   GG (c, d, a, b, x[11], 
S23, 0x265e5a51); 
 
  188   GG (b, c, d, a, x[ 0], 
S24, 0xe9b6c7aa); 
 
  189   GG (a, b, c, d, x[ 5], 
S21, 0xd62f105d); 
 
  190   GG (d, a, b, c, x[10], 
S22,  0x2441453); 
 
  191   GG (c, d, a, b, x[15], 
S23, 0xd8a1e681); 
 
  192   GG (b, c, d, a, x[ 4], 
S24, 0xe7d3fbc8); 
 
  193   GG (a, b, c, d, x[ 9], 
S21, 0x21e1cde6); 
 
  194   GG (d, a, b, c, x[14], 
S22, 0xc33707d6); 
 
  195   GG (c, d, a, b, x[ 3], 
S23, 0xf4d50d87); 
 
  196   GG (b, c, d, a, x[ 8], 
S24, 0x455a14ed); 
 
  197   GG (a, b, c, d, x[13], 
S21, 0xa9e3e905); 
 
  198   GG (d, a, b, c, x[ 2], 
S22, 0xfcefa3f8); 
 
  199   GG (c, d, a, b, x[ 7], 
S23, 0x676f02d9); 
 
  200   GG (b, c, d, a, x[12], 
S24, 0x8d2a4c8a); 
 
  203   HH (a, b, c, d, x[ 5], 
S31, 0xfffa3942); 
 
  204   HH (d, a, b, c, x[ 8], 
S32, 0x8771f681); 
 
  205   HH (c, d, a, b, x[11], 
S33, 0x6d9d6122); 
 
  206   HH (b, c, d, a, x[14], 
S34, 0xfde5380c); 
 
  207   HH (a, b, c, d, x[ 1], 
S31, 0xa4beea44); 
 
  208   HH (d, a, b, c, x[ 4], 
S32, 0x4bdecfa9); 
 
  209   HH (c, d, a, b, x[ 7], 
S33, 0xf6bb4b60); 
 
  210   HH (b, c, d, a, x[10], 
S34, 0xbebfbc70); 
 
  211   HH (a, b, c, d, x[13], 
S31, 0x289b7ec6); 
 
  212   HH (d, a, b, c, x[ 0], 
S32, 0xeaa127fa); 
 
  213   HH (c, d, a, b, x[ 3], 
S33, 0xd4ef3085); 
 
  214   HH (b, c, d, a, x[ 6], 
S34,  0x4881d05); 
 
  215   HH (a, b, c, d, x[ 9], 
S31, 0xd9d4d039); 
 
  216   HH (d, a, b, c, x[12], 
S32, 0xe6db99e5); 
 
  217   HH (c, d, a, b, x[15], 
S33, 0x1fa27cf8); 
 
  218   HH (b, c, d, a, x[ 2], 
S34, 0xc4ac5665); 
 
  221   II (a, b, c, d, x[ 0], 
S41, 0xf4292244); 
 
  222   II (d, a, b, c, x[ 7], 
S42, 0x432aff97); 
 
  223   II (c, d, a, b, x[14], 
S43, 0xab9423a7); 
 
  224   II (b, c, d, a, x[ 5], 
S44, 0xfc93a039); 
 
  225   II (a, b, c, d, x[12], 
S41, 0x655b59c3); 
 
  226   II (d, a, b, c, x[ 3], 
S42, 0x8f0ccc92); 
 
  227   II (c, d, a, b, x[10], 
S43, 0xffeff47d); 
 
  228   II (b, c, d, a, x[ 1], 
S44, 0x85845dd1); 
 
  229   II (a, b, c, d, x[ 8], 
S41, 0x6fa87e4f); 
 
  230   II (d, a, b, c, x[15], 
S42, 0xfe2ce6e0); 
 
  231   II (c, d, a, b, x[ 6], 
S43, 0xa3014314); 
 
  232   II (b, c, d, a, x[13], 
S44, 0x4e0811a1); 
 
  233   II (a, b, c, d, x[ 4], 
S41, 0xf7537e82); 
 
  234   II (d, a, b, c, x[11], 
S42, 0xbd3af235); 
 
  235   II (c, d, a, b, x[ 2], 
S43, 0x2ad7d2bb); 
 
  236   II (b, c, d, a, x[ 9], 
S44, 0xeb86d391); 
 
  244   memset(x, 0, 
sizeof x);
 
  251 void MD5::update(
const unsigned char input[], size_type length)
 
  254   size_type index = count[0] / 8 % blocksize;
 
  257   if ((count[0] += (length << 3)) < (length << 3))
 
  259   count[1] += (length >> 29);
 
  267   if (length >= firstpart)
 
  270     memcpy(&buffer[index], input, firstpart);
 
  274     for (i = firstpart; i + blocksize <= length; i += blocksize)
 
  275       transform(&input[i]);
 
  283   memcpy(&buffer[index], &input[i], length-i);
 
  289 void MD5::update(
const char input[], size_type length)
 
  291   update((
const unsigned char*)input, length);
 
  300   static unsigned char padding[64] = {
 
  301     0x80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
 
  302     0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
 
  303     0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
 
  308     unsigned char bits[8];
 
  309     encode(bits, count, 8);
 
  313     size_type padLen = (index < 56) ? (56 - index) : (120 - index);
 
  320     encode(digest, state, 16);
 
  323     memset(buffer, 0, 
sizeof buffer);
 
  324     memset(count, 0, 
sizeof count);
 
  341   for (
int i=0; i<16; i++)
 
  342     sprintf(buf+i*2, 
"%02x", digest[i]);
 
  345   return std::string(buf);
 
  357 std::string 
md5(
const std::string str)
 
void update(const unsigned char *buf, size_type length)
std::ostream & operator<<(std::ostream &out, MD5 md5)
std::string md5(const std::string str)
std::string hexdigest() const