我目前正在研究低内存嵌入式系统的固件更新机制。
系统的一部分需要在发送文件之前对二进制文件进行哈希处理(使用 SHA-256)(添加了其他安全功能,但不会影响此问题)。设备必须在验证该哈希值之前对其进行验证,但内存非常低。它将接收小块的数据,我想知道是否可以“即时”计算部分哈希,以避免在完全传输后再次加载整个二进制文件。
举个例子,假设要散列的数据是“part1part2part3”。完整数据的哈希为“hash”,“part1”的哈希为“hash1”,“part2”的哈希为“hash2”,“part3”的哈希为“hash3”。
我可以执行任何数学运算将部分哈希值转换为完整哈希值吗?就像是
hashReceived = hash
tempHash = operation(hash1,hash2)
tempHash = operation(tempHash, hash3)
if(hashReceived == tempHash)
... continue
else
... fail
Run Code Online (Sandbox Code Playgroud)
我正在寻找 SHA-256 的数学属性(类似于分配属性),它可以允许这种行为而不破坏任何 SHA-256 属性。
我正在尝试将嵌入式目标的一些遗留 C 代码迁移到 C++ 以解决兼容性问题,并且我在 C++ 中遇到了一些联合问题。
在我们的项目中,我们采用以下联合样式来减少 RAM 使用量:
typedef union unionTest
{
struct
{ uint32_t nField1:5
; uint32_t nField2:4
; uint32_t nField3:23
;}
; uint32_t nRaw ///< Raw data
;} unionTest;
// A global variable for configuration
unionTest myCUnion = {.nField1 = 1, .nField2 = 2, .nField3 = 3 };
Run Code Online (Sandbox Code Playgroud)
这很有效,易于使用,并且编译器在编译时以正确的值初始化位字段
然后在转换为 C++ 时
typedef union unionTest
{
struct
{ uint32_t nField1:5
; uint32_t nField2:4
; uint32_t nField3:23
;}
; uint32_t nRaw ///< Raw data
;} unionTest;
// …Run Code Online (Sandbox Code Playgroud)