我的一位朋友正在通过this open-source SSL code查看处理SHA加密的函数,并注意到这个奇怪的片段:
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
,它们不应做任何事情。在二进制文件中,这与所有1
s进行AND运算,它们应该产生相同的值。在我看来,这两行是相同的:
ctx->total[0] &= 0xFFFFFFFF;
ctx->total[0] = ctx->total[0];
如果我是对的,为什么这条线在那里?一些安全原因?如果我错了,怎么和为什么?
其次,假设AND没有做任何事情,我们不明白if
什么时候会成真。如果AND什么都不做,那么if
基本上是:
if (ctx->total[0] < ctx->total[0])
永远不应该是真的。我们缺少什么?
如果您希望查看标头文件以使自己确信ctx->total[0]
属于uint32_t
类型,或出于其他原因,您可以找到here。
此外,我的第一个猜测是,当我们ilen
从size_t
投射到uint32_t
时,会发生一些偷偷摸摸的事情,但我仍然感到困惑和困惑。
答案 0 :(得分:9)
第一个问题:
你是对的,32位不需要这个&amp; ing,我的猜测是 - 他们试图阻止ctx->total[0]
不是32位的情况(所以即使有人会改变它,平台也会有64位甚至uint32_t类型),所以使用这段代码,他们100%肯定,没有99.99999%:))
第二个问题很简单:
检查此代码对值ctx->total[0] == 0xFFFFFFFF
和ilen == 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]++;
答案 1 :(得分:4)
if
基本上是这样做的:
if (ctx->total[0] + (uint32_t) ilen < (uint32_t) ilen)
ctx->total[1]++;
即。如果将ilen
添加到ctx->total[0]
会导致溢出,请点击ctx->total[1]
。换句话说,它正在执行添加的进位。