Edit online

烧录 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.sh: Linux 上执行编译时,使用该脚本

Edit online

生成密钥

根据运行环境执行对应命令,运行生成密钥的脚本:

Linux 环境下:
  1. 确保已经安装 OpenSSL。如未安装,可执行以下命令进行安装:

    sudo apt-get install openssl
  2. 准备初始密钥文件 set_aes_key.txtset_nonce.txt

    set_aes_key.txt set_nonce.txt 文件中有一个初始密钥,需要手动修改其中的 HEX 密钥内容。

  3. 进入开发板根目录:
    cd SDK/target/<soc>/<board>/pack/keys/

    例如:

    cd SDK/target/d21x/demo88-nand/pack/keys/
  4. 使用下列命令运行脚本生成所需的密钥文件和头文件:
    ./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

  5. spi_aes_key.h 文件复制粘贴至下列目录中,供编译烧录 eFuse 的程序时使用:

    SDK/source/uboot-2021.10/board/artinchip/d211/

    spi_aes.key 和其它文件则保留在 SDK/target/<SoC>/<board>/pack/keys/,用于 mk_image.py 生成加密固件时使用,例如 SDK/target/d211/demo88-nand/keys/

    重要:
    生成的密钥务必妥善保管,以免丢失或者泄露。
Edit online

编译程序

按照以下步骤配置和编译 U-Boot,并生成烧录固件。

  1. 进入 SDK 根目录:
    cd <SDK_ROOT>
  2. 应用一个项目配置,例如:
    make d211_demo88_nand_defconfig
  3. 执行下列命令打开 menuconfig 菜单:
    make uboot-menuconfig
  4. 分别勾选或者确认已勾选下列参数:
    ARTINCHIP_SID
    ARTINCHIP_SID_BURN_SPIENC_KEY_CMD
    
    ARTINCHIP_SPIENC
    AICUPG_FIRMWARE_SECURITY
    SPL_DRIVERS_MISC

    参数对应的界面配置具体如下:

    SPL / TPL  --->
        [*] Support misc drivers
    Device Drivers  --->
        [*]   Secure transfer firmware and burn
        Multifunction device drivers  --->
            [*] ArtInChip SPI Memory Encryption support
            [*] ArtInChip SID(eFuse) support
            [*]   Enable SID(eFuse) burn spienc key command
  5. 勾选下列选项,打开 U-Boot 的 eFuse 模拟烧录功能:
    ARTINCHIP_SID_BURN_SIMULATED

    对应的界面配置选项如下:

    Device Drivers  --->
        Multifunction device drivers  --->
            [*] ArtInChip SID(eFuse) support
            [*]     Enable SID(eFuse) simulated burning
    模拟烧录仅供调试使用,以便在烧录过程中将密钥通过串口直接打印出来,不会写入 eFuse 中,用于校对密钥是否正确,量产时需关闭。
    重要:
    在调试时可以打开该配置进行 eFuse 模拟烧录,确认密钥都正确后,再关闭该配置进行 eFuse 的量产烧录。
  6. 修改代码调用命令烧写 eFuse:
    1. source/uboot-2021.10/arch/riscv/mach-artinchip/upg_detect.c 文件中找到 do_upgrade_detect 函数。
    2. do_upgrade_detect 函数中,添加上一个命令执行代码 run_command(“efuse_spienc”, 0);,如下所示:
      static int do_upgrade_detect(struct cmd_tbl *cmdtp, int flag, int argc, char *const argv[])
      {
          int ret = 0;
      
      #if CONFIG_ARTINCHIP_SID_BURN_SPIENC_KEY_CMD
          run_command("efuse_spienc", 0); // 加上此句
      #endif
          ...
      }
      注:
      默认情况下,仅需选择 ARTINCHIP_SID_BURN_SPIENC_KEY_CMD 宏即可,不需要手动修改。
    3. 如果不需要关闭 JTAG,可以注释掉 source/uboot-2021.10/board/artinchip/aic1602/efuse_burn_spienc_key_cmd.c 文件中的 burn_jtag_lock_bit() 的相关调用。

  7. 在板级的配置文件 board.dts 中使能 SPIENC 模块。

    若要在 SPL 中使用 SPI_ENC,需设置标记 u-boot,dm-pre-reloc

    &spienc {
         aic,spienc-tweak = <0>;
         status = "okay";
         u-boot,dm-pre-reloc;
     };
    DTS 中的 aic,spienc-tweak 参数可以影响 COUNTER 的生成,进而改变加密的结果。修改该值,可以在不同产品的相同数据上获得不同的加密结果。此时,还需要配置下列参数,对具体的 SPI NAND / SPI NOR 设备使能加密:
    • aic,encrypt:标记该存储设备使能 SPI_ENC

    • aic,spi-id:设置当前存储设备所挂载的 SPI 控制器 ID

    board.dts 中的配置示例如下:
    &spi0 {
         pinctrl-names = "default";
         pinctrl-0 = <&spi0_pins_a>;
         status = "okay";
         u-boot,dm-pre-reloc;
         spi-flash@0 {
             #address-cells = <1>;
             #size-cells = <1>;
             compatible = "spi-nand";
             spi-max-frequency = <24000000>;
             spi-tx-bus-width = <1>;
             spi-rx-bus-width = <1>;
             reg = <0>;
             aic,encrypt;            // 标记该存储设备使能 SPI_ENC
             aic,spi-id = <0>;       // 设置当前存储设备所挂载的 SPI 控制器 ID
             status = "okay";
             u-boot,dm-pre-reloc;
         };
     };
  8. 使用下列命令编译程序并生成烧录固件:
    make

    编译结果保存在 SDK/output/d211_demo88-nand/images 目录中。

Edit online

AiBurn 烧录

使用 AiBurn 烧录生成的镜像,详情可查看 AiBurn 使用指南。

Edit online

SD 卡烧录

  1. 准备一张 SD 卡,确保该卡只有一个分区,并且格式化为 FAT32/ exFAT 文件系统。
  2. 将编译输出目录下的文件复制到 SD 卡的根目录:
    • bootcfg.txt

    • d211_demo88_nand_page_2k_block_128k_v1.0.0.img
  3. 将该卡插到板卡中,上电运行,即可完成相关 eFuse 的烧录。

Edit online

烧录日志

U-Boot SPL 2021.10-dirty (Aug 06 2025 - 11:38:36 +0800)
[SPL]: Boot device = 7(BD_USB)
Trying to boot from RAM
Run U-Boot: upgrading mode
Jumping to U-Boot via RISC-V OpenSBI


U-Boot 2021.10-dirty (Aug 06 2025 - 11:38:36 +0800)aic1602

DRAM:  64 MiB
Relocation Offset is: 0x03639000
Relocating to 0x4363d000, new gd at 0x42638dd0, sp at 0x4262a9a0
WDT:   Not starting
MMC:   sdmc@10450000: 0
Loading Environment from RAM... OK
In:    serial
Out:   serial
Err:   serial

BROM SPIENC is ENABLED
JTAG LOCK   is ENABLED
SPI ENC KEY:
0x4262a0f0 : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
SPI ENC NONCE:
0x4262a0f0 : 00 00 00 00 00 00 00 00
ROTPK:
0x4262a0f0 : bb e1 6e 64 04 92 22 7d 06 2b a9 8c 59 41 58 a8
SPI ENC Key is NOT read disabled
SPI ENC ROTPK is NOT write disabled
SPI ENC Key is NOT write disabled

Write SPI ENC eFuse done.