[英]Why AND a uint32 value with 0xFFFFFFFF?
我的一個朋友在處理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
,它不應該做任何事情。 在二進制中,這是與所有1
的AND,它應該產生相同的值。 在我看來,這兩行是相同的:
ctx->total[0] &= 0xFFFFFFFF;
ctx->total[0] = ctx->total[0];
如果我是對的,為什么這條線呢? 一些安全原因? 如果我錯了,怎么和為什么?
其次,我們不明白時if
將永遠是真實的,假設及沒有做任何事情。 如果AND什么都不做,則if
基本上是:
if (ctx->total[0] < ctx->total[0])
這永遠不應該是真的。 我們缺少什么?
如果你想看到頭文件來說服自己ctx->total[0]
是uint32_t
類型,或者出於其他原因,你可以在這里找到它。
另外,我的第一個猜測是,當我們將ilen
從size_t
為uint32_t
,會發生一些偷偷摸摸的事情,但我仍然感到困惑和困惑。
第一個問題:
你是對的,32位不需要這個,我的猜測是 - 他們試圖阻止ctx->total[0]
不是32bit的情況(所以即使有人會改變它,平台也會有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]++;
if
基本上是這樣做的:
if (ctx->total[0] + (uint32_t) ilen < (uint32_t) ilen)
ctx->total[1]++;
即如果將ilen
添加到ctx->total[0]
將導致溢出,則碰撞ctx->total[1]
。 換句話說,它正在執行添加的進位 。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.