簡體   English   中英

為什么AND和uint32值為0xFFFFFFFF?

[英]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類型,或者出於其他原因,你可以在這里找到它。

另外,我的第一個猜測是,當我們將ilensize_tuint32_t ,會發生一些偷偷摸摸的事情,但我仍然感到困惑和困惑。

第一個問題:

你是對的,32位不需要這個,我的猜測是 - 他們試圖阻止ctx->total[0]不是32bit的情況(所以即使有人會改變它,平台也會有64位甚至是uint32_t類型),所以使用這段代碼,他們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]++;

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM