Please note the following legal notice. This function is derived from the RSA Data Security, Inc. MD5 Message-Digest Algorithm Perform MD5 translation
| Return Type | Function name | Arguments |
|---|---|---|
| void | _xlate_md5 | (unsigned char*,uint32_t,unsigned char*,_md5_unit&,) |
Declared and defined in file: hzCodec.cpp
Function Logic:
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 ;
}