Edit online

烧录 eFuse

Read time: 3 minute(s)

使用 SPIENC 加密功能,需要将一个 128 位的 AES 密钥烧录到芯片 eFuse 中。制作加密镜像时也需要使用上述值。因此,使用过程中,确保上述值保持不变且已妥善管理,以免泄露。

本节描述了生成 eFuse 烧录程序的详细流程。在示例方案中,提供了设置 AES 密钥的输入 txt 文件和一个用于生成及更新密钥的脚本:

开发板示例:
  • SDK/target/d12x/demo68-nor/pack/keys/set_aes_key.txt:设置加密密钥

  • SDK/target/d12x/demo68-nor/pack/keys/gen_spienc_key.bat:Windows 上执行编译时,使用该脚本

  • SDK/target/d12x/demo68-nor/pack/keys/gen_spienc_key.sh:Linux 上执行编译时,使用该脚本

生成密钥

根据运行环境执行对应命令,运行生成密钥的脚本:
  • Linux 环境下:
    1. 确保已经安装 OpenSSL。如未安装,可执行以下命令进行安装:

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

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

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

      例如:

      cd SDK/target/d12x/demo68-nor/pack/keys/
    4. 使用下列命令运行脚本生成所需的密钥文件和头文件:
      ./gen_spienc_key.sh
      生成的文件如下所示:
      • AES 密钥 spi_aes.key

      • AES 对应的 C 语言头文件 spi_aes_key.h

    5. 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/d12x/demo68-nor/pack/keys/

      重要: 生成的密钥务必妥善保管,以免丢失或者泄露。
  • Windows 环境 下:

    1. 准备初始密钥文件 set_aes_key.txtset_nonce.txt

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

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

      例如:

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

      重要: 生成的密钥请妥善保管,以免丢失或者泄露。
    4. 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,并生成烧录固件。

  1. 进入 SDK 根目录,并应用 BootLoader 的配置:
    cd <SDK_ROOT>

    例如,应用下列 BootLoader 配置:

    scons --apply-def=d12x_demo68-nor_baremetal_bootloader_defconfig
  2. 打开 BootLoader 的 menuconfig 菜单:
    scons --menuconfig
  3. 分别勾选或者确认已勾选下列参数:
    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
  4. 修改代码调用命令烧写 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() 相关的调用注释掉。

  5. 编译程序 BootLoader:
    scons       # build BootLoader
  6. 编译程序 APP 并且生成烧录固件:
    scons --apply-def=d12x_demo68-nor_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