stm32_750
中断耗时 29264
算法 | 数据量 | 耗时 | 数据量 | 耗时 |
---|---|---|---|---|
aes-cbc-128 | 40k | 199368 | 64k | (342000+291048)/2-29264=287260 |
aes-cbc-192 | 40k | 178104 | 64k | (323104+291408)/2-29264=277992 |
aes-cbc-256 | 40k | 161520 | 64k | (294192+271480)/2-29264=253572 |
sha2-224 | 40k | 190392-28120+5904 = 168176 | 64k | 287528-28120+5904 = 265312 |
sha2-256 | 40k | 189904-28102+5776 = 167578 | 64k | 286184-28102+5776 = 263858 |
crc32 (0x04C11DB7) | 40k | 140136 | 64k | 223754 |
crc16-ccitt | 40k | 142600 | 64k | 223853 |
crc8-ccitt | 40k | 139858 | 64k | 223461 |
TRNG | 40k | 1130608 | 64k | 1793120 |
sha2-256 4k 43504+21264-28120=
36648
1 | c "1/(480*1000*1000) * 36648" = 0.00007 s //for hash-256 4k |
1M 数据时间
1 | c "1/(480*1000*1000)*(199368)/40*1024" = 0.01s //aes-128 750 |
1 | c "64*1024*8/1793120" = 0.3 bit/cycle //trng |
CIP_1901
算法 | 数据量 | 耗时 | 数据量 | 耗时 | ||
---|---|---|---|---|---|---|
aes-cbc-128 | 40k | 462550 | 64k | 740032 | ||
aes-cbc-256 | 40k | 626550 | 64k | 1002480 | ||
sha2-256 | 40k | 174700 | 64k | 279268 | 512k | 2237620 |
sha2-384 | 40k | 113784 | 64k | 181788 | 512k | 1518852 |
crc32 (0x04C11DB7) | 40k | 128204 | 64k | 204158 | ||
crc16-ccitt | 40k | 129834 | 64k | 205702 | ||
crc8-ccitt | 40k | 128184 | 64k | 204164 | ||
ecc-192-sign | 16 | 609418 | ||||
ECC-224-sign | 16 | 745262 | ||||
ECC-256-sign | 16 | 870176 | ||||
ECC-384-sign | 16 | 1571708 | ||||
ECC-192-verify | 16 | 6753310 | ||||
ECC-224-verify | 16 | 8529408 | ||||
ECC-256-verify | 16 | 11227626 | ||||
ECC-384-verify | 16 | 25775968 | ||||
ECC-256-sign | 32 | 870134 | ||||
ECC-384-sign | 32 | 1571634 | ||||
ECC-256-verify | 32 | 11489984 | ||||
ECC-384-verify | 32 | 26295924 | ||||
Ecc-384-sign | 48 | 1571480 | ||||
ECC-384-verify | 48 | 25897978 |
1 | c "1/(400*1000*1000)*25897978" = 0.0647s |
security-boot
分区 | 大小 | 校验方式 | 硬件时间 |
---|---|---|---|
spl | 1M | aes256 + hash256 + ecc256 | 0.01 + 0.009 + 0.028 = 0.047 |
bootloader | 2M | aes256 + hash256 + ecc256 | (0.01 + 0.009 )*2 + 0.028 = 0.066 |
tz | 4M | aes256 + hash256 + ecc256 | (0.01 + 0.009)*4 + 0.028 = 0.104 |
dtbo | 16M | aes256 + hash256 + ecc256 | (0.01 + 0.009)*16 + 0.028 = 0.332 |
boot | 32M | aes256 + hash256 + ecc256 | (0.01 + 0.009)*32+ 0.028 = 0.636 |
system | 40G | ecc256 + dm-verity | 0.028 + … |
校验链:
bootrom -> spl -> tz -> bootloader -> dtbo -> boot-> … system
dm-verity hash-tree
根据 hashtree 的生成方式,以 40G 的镜像为例:
1)按照 4K 大小划分,将40G 大小的镜像依顺序划分可得到 10485760 个 4k 大小的块
2)对这 10485760 块数据块进行第一层(Level 0) hash 计算,由于 SHA256(具体的hash算法可配置,此例以SHA256为参考) 计算出来的hash值占 256 个字节,一个 4K 的块可以存储 128 个hash值,所以存储这 10485760 块数据块的hash值需要花费 81920 块
3)对第一层存储 hash 值的数据块进行第二层(Level 1) 的 hash 计算,同理,计算这 81920 块hash数据块需要花费 640 块
- 对第二层存储 hash 值的数据块进行第二层(Level 2) 的 hash 计算,同理,计算这 640 块hash数据块需要花费 5 块
5)对第三层存储 hash 值的数据块进行第三层(Level 3) 的 hash 计算,由于第二层的hash数据块小于128块,所以第三层是最后一层,直接计算得到 root hash 数据块(不够4K大小补齐0)。
校验:
- 假设目前正需要读取第 200000 块的数据块,通过前面哈希树的构造,可以比较快速的计算出在 Level 0 层,也就是直接对应这个数据块的hash值存储位置,通过对 128 相除以及求余的方式就可以分别计算出该 hash 值存储在具体某一块(块A)以及这一块上的偏移(偏移A)。
- 确定了 Level 0 层的具体块A后,利用相同的方式可以得到 Level 0 块A在 Level 1 层存储其 hash 值的块B位置以及块B上的偏移(偏移B)
- 同上可以定位到 Level 1 层块 B 在 Level 2 上的数据块上偏移(偏移C)
- 最终定位level2 层 在 level 3 数据块上的偏移 (偏移 D)
计算:
- 计算level3 块(只有一块)的hash 256值, 即 root hash, root hash与verity table的hash 比较, 如果不一致则说明被非法修改了
- 计算level2 层 (偏移C) 所在块的 hash, 与level3 层偏移D处的 32bytes 的hash 比较, 如不一致则说明 level2 层偏移 C 所在块被非法修改了
- 计算level1 层(偏移B) 所在块的 hash , 与level2 层偏移 C 处的 32bytes的hash值比较, 如不一致则说明level 1 层偏移 B 所在块被非法修改了
- 计算 level 0 层(偏移A) 所在块的 hash, 与 level 1层偏移 B 处的 32bytes的hash值比较, 如不一致则说明 level 0 层的偏移 A 处的所在块被非法修改了
- 计算 raw data 层(被访问的原始数据) 所在块的 hash , 与level 0 层偏移 A 处的 32 bytes 的hash 值比较, 如不一致则说明 raw data层现在正在访问的数据被非法修改了
因此 read 40G分区上的一个4k 块额外需要 hash256(4k) 5次 (0.00007s *5) 时间.