【发布时间】:2022-01-08 11:13:45
【问题描述】:
我今天在学习SHA2,到了我看不懂的代码的地方。
RFC 4634(其中定义了 SHA2)在 sha.h 文件中定义了两个变量 Length_Low 和 Length_High:
uint32_t Length_Low; /* Message length in bits */
uint32_t Length_High; /* Message length in bits */
例如,在sha224-256.c 文件中,变量Length_Low 在两个地方被主动更改。这里:
/*
* add "length" to the length
*/
static uint32_t addTemp;
#define SHA1AddLength(context, length) \
(addTemp = (context)->Length_Low, \
(context)->Corrupted = \
(((context)->Length_Low += (length)) < addTemp) && \
(++(context)->Length_High == 0) ? 1 : 0)
这里:
/*
* Store the message length as the last 8 octets
*/
context->Message_Block[56] = (uint8_t) (context->Length_High >> 24);
context->Message_Block[57] = (uint8_t) (context->Length_High >> 16);
context->Message_Block[58] = (uint8_t) (context->Length_High >> 8);
context->Message_Block[59] = (uint8_t) (context->Length_High);
context->Message_Block[60] = (uint8_t) (context->Length_Low >> 24);
context->Message_Block[61] = (uint8_t) (context->Length_Low >> 16);
context->Message_Block[62] = (uint8_t) (context->Length_Low >> 8);
context->Message_Block[63] = (uint8_t) (context->Length_Low);
我了解 RFC 4634 和 SHA2 的原理。但是,作为 C 语言的初学者,我只能理解论文中 99% 的代码。我附上的代码片段就属于这剩下的1%。
您能否解释一下,Length_Low 和 Length_High 变量在 SHA2 的实现中起什么作用?它们在代码层面的意义是什么?
其次,代码片段中发生了什么?我可以识别复合运算符和移位,但我对代码的难度感到不知所措——尤其是在第二个片段中,取消引用、递增、定义等发生在同一行代码中。
【问题讨论】:
-
只是一个猜测,但我认为这两个变量是 64 位长度指示器的低 32 位和高 32 位。