一、Flash 加密概述
1、外置Flash的信息安全机制
存储在外部 Flash 的数据,存在通过硬件手段读取到数据的风险, E3 系列芯片提供自研的串行 Flash 控制 XSPI(支持1/2/4/8线,支持SDR/DDR)中,加入了如下安全机制,提高外部 Flash 数据的安全性。
- 内嵌运行时解密模块 - 支持在CPU在Flash取指令或数据时实时的进行解密,在保证安全的同时不影响性能
- 支持AES128对称密码 - 提供足够的加密等级,保证 Flash 内的内容无法破解。
- 加密密码烧写到芯片内部 eFuse 并可锁定。
2、RFD(64Byte)
用于控制 Flash 的加密区域,在加密启动时使用,RFD存储在 Flash 中。
3、Fuse 相关位
加密密码烧写到芯片内部 eFuse 并可锁定,锁定后用户和软件不可见。
MISC_CFG0:使能 XSPI1A falsh 加密
FDK/PVK0: PVK 模式密码
MISC_CFG1: 使能使用 PVK 模式
二、Flash 加密测试
1、步骤一:生成 RFD
1.1 加密信息
加密数据区域 1
开始地址:0x0
结束地址:0x20000(4kb 对齐)
加密数据区域 2
开始地址:0x400000
结束地址:0x600000(4kb 对齐)
1.2 生成 RFD
生成工具:.\SDToolBox_R2.23.1601\App\Misc\atb_sign\atb_signer
生成命令:
atb_signer xspi_wrap --rfd pvk0=112233445566778899aabbccddeeff00 iv=abcdef start=0x0 end=0x20000 --rfd pvk1=ffeeddccbbaa99887766554433221100 iv=abcdef start=0x400000 end=0x600000 of=./new.rfd
RFD 数据:
2、步骤二:数据加密
1.1 加密概述
加密数据区域 与数据区域 0,加密前加密后数据大小一致
1.2 加密数据
加密工具:.\SDToolBox_R2.23.1601\App\Misc\atb_sign\atb_signer
加密命令:
atb_signer xspi_enc pvk0=112233445566778899aabbccddeeff00 iv=abcdef if=normal.bin of=normal_pvk0_enc.bin
atb_signer xspi_enc pvk1=ffeeddccbbaa99887766554433221100 iv=abcdef if=normal.bin of=normal_pvk1_enc.bin
3、步骤三:USB 刷写数据
new.rfd 烧入RFD区域
readback_APP_PVK0_ENC.bin 烧入(0x0:0x20000)
readback_APP_PVK1_ENC.bin 烧入(0x40000:0x60000)
4、步骤四:XSPI EB 配置
开启 RFD 解密功能,需在 EB MCAL FLS 配置中开启 FlsRFDEnable,开启后 Fls 读取加密区域数据则为明文。
5、步骤五:测试代码
除了真烧 Fuse 以外,还可以通过写 Shadow 影子寄存器实现 Fuse 功能(影子寄存器功能与 Fuse 对应位一致)
/*Flash Decryption Key(fdk)*/
// pvk0 112233445566778899aabbccddeeff00
writel(0xDDEEFF00, APB_EFUSEC_BASE + 0x1120);
writel(0x99AABBCC, APB_EFUSEC_BASE + 0x1124);
writel(0x55667788, APB_EFUSEC_BASE + 0x1128);
writel(0x11223344, APB_EFUSEC_BASE + 0x112c);
// pvk1 ffeeddccbbaa99887766554433221100
writel(0x33221100, APB_EFUSEC_BASE + 0x1130);
writel(0x77665544, APB_EFUSEC_BASE + 0x1134);
writel(0xBBAA9988, APB_EFUSEC_BASE + 0x1138);
writel(0xFFEEDDCC, APB_EFUSEC_BASE + 0x113c);
// XSPI1A_SILE烧写为1,使能解密功能
writel(0x00008000, APB_EFUSEC_BASE + 0x12C0);
// XSPIA_REGION0_ECE、XSPIA_REGION1_ECE 分别烧写为1,使能 RFD0,RFD1
writel(0x00000433, APB_EFUSEC_BASE + 0x12C4);
6、步骤六:读取解密数据
Fls 驱动 XSPIA 读取 Flash 上数据是 HSM 模块会自动解密加密区域,从而实现无感加密功能。
读取 Bank A 0x0-0x20000 加密区域 Region0 RFD0 PVK0
读取 Bank B 0x400000-0x600000 加密区域 Region1 RFD1 PVK1
三、参考资料
《E3400_E3600_MCU_TRM_Rev01.00.pdf》
《SEMIDRIVE_eHSM_开发指南_Rev1.1.pdf》
《Semidrive_E3信息安全_Rev1.0.pdf》
[芯驰科技 SemiDrive] https://www.semidrive.com
评论