7

我的一个朋友在处理 SHA 加密的函数中查看这个开源 SSL 代码,并注意到这个奇怪的片段:

ctx->total[0] += (uint32_t) ilen;         // ilen is of type size_t
ctx->total[0] &= 0xFFFFFFFF;              

if( ctx->total[0] < (uint32_t) ilen )
    ctx->total[1]++;

关于这段代码,我们无法弄清楚两件事。首先,它与ctx->total[0](类型uint32_t)与0xFFFFFFFF,它不应该做任何事情。在二进制中,这是与所有1s 的 ANDing,它应该产生相同的值。那么,在我看来,这两行是相同的:

ctx->total[0] &= 0xFFFFFFFF;
ctx->total[0] =  ctx->total[0];

如果我是对的,为什么这条线在那里?一些安全原因?如果我错了,如何以及为什么?

if其次,假设 AND 没有做任何事情,我们不知道什么时候会是真的。如果 AND 什么都不做,那么if本质上就是:

if (ctx->total[0] < ctx->total[0])

这不应该是真的。我们缺少什么?


如果您想查看头文件以说服自己ctx->total[0]是 type uint32_t,或者出于其他任何原因,您可以在此处找到。

另外,我的第一个疯狂猜测是,当我们ilensize_tto施法时,发生了一些鬼鬼祟祟的事情uint32_t,但我仍然感到困惑和困惑。

4

2 回答 2

9

第一个问题:

你是对的,32 位不需要这个 &ing,我的猜测是 - 他们试图防止ctx->total[0]不是 32 位的情况(所以即使有人会改变它或者平台即使对于 uint32_t 类型也会有 64 位),所以有了这个代码他们是 100% 确定的,没有 99.99999% :)

第二个问题很简单:

检查此代码如何用于值ctx->total[0] == 0xFFFFFFFFilen == 1

ctx->total[0] += (uint32_t) ilen; // this will overflow and total[0] now 0

if( ctx->total[0] < (uint32_t) ilen ) // 0<1 true
    ctx->total[1]++;
于 2013-10-21T17:27:17.627 回答
4

if基本上是在做:

if (ctx->total[0] + (uint32_t) ilen < (uint32_t) ilen)
    ctx->total[1]++;

即,如果添加ilentoctx->total[0]会导致溢出,那么就用 bump ctx->total[1]。换句话说,它正在执行加法的进位

于 2013-10-21T17:23:30.757 回答