c-MD5实现中的大约一行

  • 本文关键字:一行 实现 c-MD5 c md5
  • 更新时间 :
  • 英文 :


我被MD5、实现中的一行代码弄糊涂了

void MD5_Update(MD5_CTX *ctx, const void *data, unsigned long size)
{
MD5_u32plus saved_lo;
unsigned long used, available;
saved_lo = ctx->lo;
if ((ctx->lo = (saved_lo + size) & 0x1fffffff) < saved_lo)
ctx->hi++;
ctx->hi += size >> 29;
used = saved_lo & 0x3f;
if (used)
{
available = 64 - used;
if (size < available)
{
memcpy(&ctx->buffer[used], data, size);
return;
}
memcpy(&ctx->buffer[used], data, available);
data = (const unsigned char *)data + available;
size -= available;
body(ctx, ctx->buffer, 64);
}
if (size >= 64)
{
data = body(ctx, data, size & ~(unsigned long)0x3f);
size &= 0x3f;
}
memcpy(ctx->buffer, data, size);
}

问题行是if ((ctx->lo = (saved_lo + size) & 0x1fffffff) < saved_lo),似乎"大小"计算字节,但"ctx->lo’和saved_lo’计数位。为什么要把它们加在一起?Github中也有一些类似的代码,也有一些项目使用这些代码。所以有人可以解释一下吗?

关于"位计数器";可能会产生误导——ctx->hictx->lo计数字节,就像size一样。

您正确地注意到,您只是将size(字节(添加到ctx->lo(然后检查溢出/向ctx->hi传播溢出(。溢出检查非常简单——lo用作29位整数,如果添加/屏蔽后的结果小于原始值,则发生溢出。

used周围的检查也是ctx->loctx->hi是字节计数器的证据——body一次处理64字节的数据,lo计数器与0x3F进行"与"运算(即63(。

相关内容

最新更新