Zynq FPGA固件加密,安全启动
安全启动主要为了防止以下事件发生
- 防止外人读取NVM 固件进行逆向。
- 防止固件内容进行篡改。
1.Zynq 加密简介
1.1 公钥和私钥
- 加密的密钥与解密的密钥不相同
- 使用私钥加密的内容,只能通过公钥来解密
- 使用公钥加密的内容,只能通过私钥来解密
- 公钥,可以对外给任何人的加密和解密密码,公开的,可以任何人访问
- 私钥,私钥是一定要严格保护的,通过私钥可以生成公钥,但是从公钥可以认为是永远无法推导出私钥的。
1.2 Zynq 相关密钥
-
AES 256-bit key
AES(Advanced Encryption Standard) Key 用于 bbram,efuse 的硬件加密,在启动阶段判断固件与硬件是否匹配(AES key 存放在FPGA, 与固件当中)。
-
HMAC key
HMAC(Hashed Message Authentication Code )key 用于加密固件(bit/bin),并存放bit文件中,用于校验当前分区文件的正确性(HMAC key 存放在固件当中)
-
PSK
PSK RSA Primary Secret Key,主私钥, 产生 主公钥PPK,开发者保留
-
PPK
RSA Primary Public Key 主公钥, 认证次公钥SPK,存放在BootHeader
-
SSK
RSA Secondary Secret Key, 次私钥,用于产生 次公钥SPK,开发者保留
-
SPK
RSA Secondary Public Key (SPK) 次公钥, 用于认证分区数据(bin,elf等), 存放在BootHeader
小结:
- AES / HMAC 成对使用。Bootgen 会自动生成.nky文件(如果不存在*.nky)
- RSA 用于校验整套固件的正确性(多个文件之中的一个可能会被更改)
- 主钥(PPK, PSK)验证次钥,次钥(SPK, SSK)验证分区固件。
- Debug 模式用户只需要提供私钥(PSK, SSK)
1.3 Zynq 安全启动相关模块
模块名 | 描述 |
---|---|
eFUSE SHA256(PPK) | PS eFuse,hash PPK存放位置用于RSA加密, 一次性编程 |
BootRom | 启动代码存放rom,arm启动首先从Bootrom 启动 |
NVM Controllers | 非易失性存储控制器 |
AES Decryptor | AES 解密器, 解密 PS, PL AES Key |
HMAC | Hashed Message Authentication Code 用于固件数据加密 |
eFuse Array | PL eFuse, AES key 码存放位置,用 |