Please note the following legal notice. This function is derived from the RSA Data Security, Inc. MD5 Message-Digest Algorithm Perform MD5 translation

Return TypeFunction nameArguments
void_xlate_md5(unsigned char*,uint32_t,unsigned char*,_md5_unit&,)

Declared and defined in file: hzCodec.cpp

Function Logic:

0:START 1:md5Unit pWork len i done 2:unknown 3:done 4:unknown 5:56 6:i 7:120 8:i 9:unknown 10:items pWork 11:len items items items 12:unknown 13:a b c d items 14:unknown 15:i>>4

Function body:

void _xlate_md5 (unsigned char* workBuf)uint32_t len, unsigned char* digest, _md5_unit& md5Unit, 
{
   //  Category: Codec
   //  
   //  Please note the following legal notice. This function is derived from the RSA Data Security, Inc. MD5 Message-Digest Algorithm
   //  
   //  Perform MD5 translation
   //  
   //  Arguments: 1) p  Pointer
   //     2) len  Length of
   //     3) digest Pointer to the
   //     4) s  Pointer to MD5 unit
   //  
   //  Returns: Pointer to an MD5 unit
   _hzfunc(__func__) ;
   uint32_t    a ;         //  Part a of 32-bit interim value
   uint32_t    b ;         //  Part b of 32-bit interim value
   uint32_t    c ;         //  Part c of 32-bit interim value
   uint32_t    d ;         //  Part d of 32-bit interim value
   uint32_t    tmp ;       //  For variable rotation
   uint32_t    i ;         //  Remainder
   uint32_t    done ;      //  Process complete
   uchar*      pWork ;     //  Pointer into working buffer
   uchar*      end ;       //  Work limit
   uint32_t    x[16];
   md5Unit.len += len ;
   pWork = workBuf ;
   i = len & 0x3f;
   done = 0;
   if (i || len == 0)
   {
       done = 1;
       //  Pad the input
       if (i < 56)
           i = 56-i ;
       else
           i = 120-i;
       if (i > 0)
       {
           memset(pWork + len, 0,i) ;
           pWork[len] = 0x80;
       }
       len += i ;
       //  Append the count
       x[0]= md5Unit.len<<3;
       x[1]= md5Unit.len>>29;
       _md5_encode(pWork + len, x, 4);
   }
   //  Do the process
   for (end = pWork + len ; pWork < end ; pWork += 64)
   {
       a = md5Unit.state[0];
       b = md5Unit.state[1];
       c = md5Unit.state[2];
       d = md5Unit.state[3];
       _md5_decode(x, pWork, 64);
       for(i = 0; i < 64;i++)
       {
           switch(i>>4)
           {
           case 0: a += (b & c) | (~b & d) ;   break ;
           case 1: a += (b & d) | (c & ~d) ;   break ;
           case 2: a += b ^ c ^ d ;            break ;
           case 3: a += c ^ (b | ~d) ;         break ;
           }
           a += x[s_sin_oset[i]] + s_sin_vals[i] ;
           a = (a << s_sin_shft[i]) | (a >> (32-s_sin_shft[i])) ;
           a += b ;
           //  rotate variables
           tmp = d ;
           d = c ;
           c = b ;
           b = a ;
           a = tmp ;
       }
       md5Unit.state[0]+= a ;
       md5Unit.state[1]+= b ;
       md5Unit.state[2]+= c ;
       md5Unit.state[3]+= d ;
   }
   //  return result
   if (done && digest)
   {
       _md5_encode(workBuf, (uint32_t*) &(md5Unit.state), 4);
       memcpy(digest, workBuf, 16);
   }
   return ;
}