0%

stm32 crypto 性能数据

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
2
c "1/(480*1000*1000) * 36648" = 0.00007 s //for hash-256 4k
c "1/(480*1000*1000) * 167578 / 40 * 1024" = 0.009s

1M 数据时间

1
2
3
c "1/(480*1000*1000)*(199368)/40*1024" = 0.01s   //aes-128 750
c "1/(400*1000*1000)*(626550)/40*1024" = 0.04s // aes-256 cip
c "1/(400*1000*1000)*(1002480/64)*1024" = 0.04s // aes-256 cip
1
2
c "64*1024*8/1793120" = 0.3 bit/cycle    //trng
c "1/(480*1000*1000) * 167578" = 0.00035s //sha-256 40k

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
2
c "1/(400*1000*1000)*25897978" = 0.0647s
c "1/(400*1000*1000)*11489984" = 0.028 s //for ecc-256 verify

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

verity-40G

verity-40G

根据 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 块

  1. 对第二层存储 hash 值的数据块进行第二层(Level 2) 的 hash 计算,同理,计算这 640 块hash数据块需要花费 5 块

5)对第三层存储 hash 值的数据块进行第三层(Level 3) 的 hash 计算,由于第二层的hash数据块小于128块,所以第三层是最后一层,直接计算得到 root hash 数据块(不够4K大小补齐0)。

校验:

  1. 假设目前正需要读取第 200000 块的数据块,通过前面哈希树的构造,可以比较快速的计算出在 Level 0 层,也就是直接对应这个数据块的hash值存储位置,通过对 128 相除以及求余的方式就可以分别计算出该 hash 值存储在具体某一块(块A)以及这一块上的偏移(偏移A)。
  2. 确定了 Level 0 层的具体块A后,利用相同的方式可以得到 Level 0 块A在 Level 1 层存储其 hash 值的块B位置以及块B上的偏移(偏移B)
  3. 同上可以定位到 Level 1 层块 B 在 Level 2 上的数据块上偏移(偏移C)
  4. 最终定位level2 层 在 level 3 数据块上的偏移 (偏移 D)

计算:

  1. 计算level3 块(只有一块)的hash 256值, 即 root hash, root hash与verity table的hash 比较, 如果不一致则说明被非法修改了
  2. 计算level2 层 (偏移C) 所在块的 hash, 与level3 层偏移D处的 32bytes 的hash 比较, 如不一致则说明 level2 层偏移 C 所在块被非法修改了
  3. 计算level1 层(偏移B) 所在块的 hash , 与level2 层偏移 C 处的 32bytes的hash值比较, 如不一致则说明level 1 层偏移 B 所在块被非法修改了
  4. 计算 level 0 层(偏移A) 所在块的 hash, 与 level 1层偏移 B 处的 32bytes的hash值比较, 如不一致则说明 level 0 层的偏移 A 处的所在块被非法修改了
  5. 计算 raw data 层(被访问的原始数据) 所在块的 hash , 与level 0 层偏移 A 处的 32 bytes 的hash 值比较, 如不一致则说明 raw data层现在正在访问的数据被非法修改了

因此 read 40G分区上的一个4k 块额外需要 hash256(4k) 5次 (0.00007s *5) 时间.