/* Transform as many times as possible.*/
if(inputLen >= partLen)
{
R_memcpy((TUint8*)&context->buffer[index], (TUint8*)input, partLen);
MD5Transform(context->state, context->buffer);
for(i = partLen; i + 63 < inputLen; i += 64)/*把i+63<inputlen改为i+64<=inputlen更容易理解*/
MD5Transform(context->state, &input[i]);
index = 0;
}
else
i = 0;
R_memcpy((TUint8*)&context->buffer[index], (TUint8*)&input[i], inputLen-i);
}
/* MD5 finalization. Ends an MD5 message-digest operation, writing the
the message digest and zeroizing the context. */
void CDTMd5::MD5Final (TUint8 digest[16],MD5_CTX *context)
{
TUint8 bits[8];
TUint index, padLen;
/* Save number of bits */
Encode(bits, context->count, 8);
/* Pad out to 56 mod 64. */
index = (TUint)((context->count[0] >> 3) & 0x3f);
padLen = (index < 56) ? (56 - index) : (120 - index);
MD5Update(context, PADDING, padLen);
/* MD5 basic transformation. Transforms state based on block. */
void CDTMd5::MD5Transform (TUint32 state[4], TUint8 block[64])
{
TUint32 a = state[0], b = state[1], c = state[2], d = state[3], x[16];
/* Encodes input (TUint32) into output (TUint8). Assumes len is
a multiple of 4. */
void CDTMd5::Encode(TUint8 *output, TUint32 *input,TUint len)
{
TUint i, j;