烧录 eFuse
使用 SPIENC 加密功能,需要将一个 128 位的 AES 密钥和一个 64 位的 Nonce 值烧录到芯片 eFuse 中。制作加密镜像时也需要使用上述值。因此,使用过程中,确保上述值保持不变且已妥善管理,以免泄露。
本节描述了生成 eFuse 烧录程序的详细流程。在示例方案中,提供了设置 AES/ NONCE 密钥的输入 txt 文件和一个用于生成及更新密钥的脚本:
-
SDK/target/d21x/demo88-nand/pack/keys/set_aes_key.txt:设置加密密钥
-
SDK/target/d21x/demo88-nand/pack/keys/set_nonce.txt:设置加密的 NONCE 参数
-
SDK/target/d21x/demo88-nand/pack/keys/gen_spienc_key.bat:Windows 上执行编译时,使用该脚本
-
SDK/target/d21x/demo88-nand/pack/keys/gen_spienc_key.sh: Linux 上执行编译时,使用该脚本
生成密钥
- 在 Linux 环境下:
-
确保已经安装 OpenSSL。如未安装,可执行以下命令进行安装:
sudo apt-get install openssl
-
准备初始密钥文件 set_aes_key.txt 和 set_nonce.txt。
set_aes_key.txt 和 set_nonce.txt 文件中有一个初始密钥,需要手动修改其中的
HEX
密钥内容。 - 进入开发板根目录:
cd SDK/target/<soc>/<board>/pack/keys/
例如:
cd SDK/target/d21x/demo88-nand/pack/keys/
-
使用下列命令运行脚本生成所需的密钥文件和头文件:
./gen_spienc_key.sh
生成的文件如下所示:-
AES 密钥 spi_aes.key
-
AES 对应的 C 语言头文件 spi_aes_key.h
-
spi_nonce.key
-
rotpk.bin
-
rsa_private_key.der
-
rsa_private_key.pem
-
rsa_public_key.der
-
rsa_public_key.pem
-
-
将 spi_aes_key.h 文件复制粘贴至 lite/bsp/examples_bare/test-efuse/ 目录中,供编译烧录 eFuse 的程序时使用。
spi_aes.key 和其它文件则保留在 SDK/target/<SoC>/<board>/pack/keys/,在使用 mk_image.py 生成加密固件时使用,例如SDK/target/d21x/demo88-nand/pack/keys/
重要: 生成的密钥务必妥善保管,以免丢失或者泄露。
-
-
在 Windows 环境 下:
-
准备初始密钥文件 set_aes_key.txt 和 set_nonce.txt。
set_aes_key.txt 和 set_nonce.txt 文件中有一个初始密钥,需要手动修改其中的
HEX
密钥内容。 - 进入开发板根目录:
cd SDK/target/<soc>/<board>/pack/keys/
例如:
cd SDK/target/d21x/demo88-nand/pack/keys/
cd SDK/target/d12x/demo68-nor/pack/keys/
-
使用下列命令运行脚本生成所需的密钥文件和头文件:
./gen_spienc_key.bat
生成的文件如下所示:-
AES 密钥 spi_aes.key
-
AES 对应的 C 语言头文件 spi_aes_key.h
-
spi_nonce.key
-
rotpk.bin
-
rsa_private_key.der
-
rsa_private_key.pem
-
rsa_public_key.der
-
rsa_public_key.pem
重要: 生成的密钥请妥善保管,以免丢失或者泄露。 -
-
将 spi_aes_key.h 文件复制粘贴至 lite/bsp/examples_bare/test-efuse/ 目录中,供编译烧录 eFuse 的程序时使用。
spi_aes.key 和其它文件则保留在 SDK/target/<SoC>/<board>/pack/keys/,在使用 mk_image.py 生成加密固件时使用,例如SDK/target/d21x/demo88-nand/pack/keys/SDK/target/d12x/demo68-nor/pack/keys/
重要: 生成的密钥务必妥善保管,以免丢失或者泄露。
-
编译程序
按照以下步骤配置和编译 BootLoader,并生成烧录固件。
-
进入 SDK 根目录,并应用 BootLoader 的配置:
cd <SDK_ROOT>
例如,应用下列 BootLoader 配置:
scons --apply-def=d21x_demo88-nand_baremetal_bootloader_defconfig
-
打开 BootLoader 的 menuconfig 菜单:
scons --menuconfig
-
分别勾选或者确认已勾选下列参数:
AIC_USING_SID EFUSE_WRITE_SUPPORT AIC_SID_BURN_SPIENC_KEY_TEST AIC_USING_SPIENC AICUPG_FIRMWARE_SECURITY
参数对应的界面配置具体如下:
Board options ---> [*] Using Spienc [*] Enc qspi0 (0) set qspi0 tweak [*] Using Efuse/SID SID Parameter ---> [*] support efuse write (64) set efuse max word Bootloader options ---> [*] Upgrading ---> [*] Secure transfer firmware and burn
Drivers options ---> Drivers examples ---> [*] Enable SID burn spienc key command
-
修改代码调用命令烧写 eFuse:
-
application/baremetal/bootloader/main.c:
在console_set_usrname
之后,添加上一个命令执行代码console_run_cmd(“efuse_spienc”);
,如下所示。int main(void) { console_init(); console_set_usrname("aic"); console_run_cmd("efuse_spienc"); // 加上此句 ... }
-
bsp/examples_bare/test-efuse/efuse_burn_spienc_key_cmd.c:
如果不需要关闭 JTAG,可以将 burn_jtag_lock_bit() 相关的调用注释掉。
-
-
编译程序 BootLoader:
scons # build BootLoader
-
编译程序 APP 并且生成烧录固件:
scons --apply-def=d21x_demo88-nand_rt-thread_helloworld_defconfig
scons
编译结果会保存至 SDK/output/<SoC name>_<board name_rt-thread_helloworld/images 目录。例如,SDK/output/d12x_demo68-nor_rt-thread_helloworld/images
AiBurn 烧录
使用 AiBurn 烧录生成的镜像。
SD 卡烧录
准备一张 SD 卡,确保该卡只有一个分区,并且格式化为 FAT32/ exFAT 文件系统。
将编译输出目录下的文件复制到 SD 卡的根目录:
-
bootcfg.txt
-
bootloader.aic
并且将 bootcfg.txt 中的内容修改为:
boot0=bootloader.aic
将该卡插到板卡中,上电运行,即可完成相关 eFuse 的烧录。
烧录日志
tinySPL [Built on Feb 27 2025 11:21:57] BROM SPIENC is ENABLED JTAG LOCK is ENABLED SPI ENC KEY: 0x406efde8 : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 //烧录后的 key 对 CPU 不可见,所以无法读出 SPI ENC Key is read DISABLED SPI ENC Key is write DISABLED