我的一个朋友正在查看
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]++;
我们无法弄清楚这个代码的两个方面.首先,ANDs ctx-> total [0](类型为uint32_t)和0xFFFFFFFF,它不应该做任何事情.在二进制中,这是与所有1的AND,它应该产生相同的值.在我看来,这两行是相同的:
ctx->total[0] &= 0xFFFFFFFF; ctx->total[0] = ctx->total[0];
如果我是对的,为什么这条线呢?一些安全原因?如果我错了,怎么和为什么?
其次,假设AND没有做任何事情,我们不明白何时会出现这种情况.如果AND什么都不做,则if基本上是:
if (ctx->total[0] < ctx->total[0])
这永远不应该是真的.我们缺少什么?
如果你想看到头文件说服自己ctx-> total [0]是uint32_t类型,或者由于其他原因,你可以找到here.
另外,我的第一个猜测是,当我们将ilen从size_t转换为uint32_t时,会发生一些偷偷摸摸的事情,但我仍然感到困惑和困惑.
解决方法
第一个问题:
你是对的,32位不需要这个& ing,我的猜测是 – 他们试图阻止ctx-> total [0]不是32bit的情况(所以即使有人会改变它或平台会有64位甚至uint32_t类型),所以使用这段代码,他们100%肯定,没有99.99999%:)
第二个问题很简单:
检查此代码如何适用于值ctx-> total [0] == 0xFFFFFFFF和ilen == 1
ctx-> total [0] =(uint32_t)ilen; //这会溢出,总[0]现在为0
if( ctx->total[0] < (uint32_t) ilen ) // 0<1 true ctx->total[1]++;