当前文档版本为 v0.9.1,您可以访问当前页面的 开发中 版本以获取最近可能的更新。

Zephyr Encrypt 开发指南

1 概述

为了程序的安全性考虑,Zephyr提供了为程序加密的机制,来保护芯片固件的安全。

实现加密流程,需要开发人员提供一个加密配置文件encrypt_info_enc.bin,此配置文件需要通过PANLINK烧录到芯片。未烧录此配置文件的芯片不能运行加密过的程序。

2 配置文件介绍

配置源文件encrypt_info.yaml如下所示:

encrypt_info:
  secure_enable: true
  anti_injection_enable: true
  encrypt_flash_offset: 0x1 # The 2nd page of flash (or say absolute flash address 0x100)
  encrypt_key: '54723dc6d74562f5309583a676d9b68a' # AES-128 key in hexadecimal string format
image_info:
  expected_start_addr: 0x0 # For encrypt tool to validate input hex image file

其中:

  • secure_enable:使能安全加密;

  • anti_injection_enable:此项设置true即可;

  • encrypt_flash_offset:加密代码位于flash的地址偏移,以page为单位;

  • encrypt_key:加密密钥;

  • expected_start_addr:应用程序起始地址;

3 加密流程介绍

3.1 使能加密

使用加密模块需要先配置以下宏开关使能加密

# Enable Firmware Encryption Feature
CONFIG_FIRMWARE_ENCRYPTION=y
# Set the Encrypt Information File Name for Search
CONFIG_ENCRYPT_INFO_FILE_NAME="encrypt_info.yaml"
# Set the spetial flash area for encrypted code in
CONFIG_ENCRYPT_FLASH_OFFSET=0x1

其中:

  • CONFIG_FIRMWARE_ENCRYPTION:使能加密模块

  • CONFIG_ENCRYPT_INFO_FILE_NAME:加密配置文件的名称

  • CONFIG_ENCRYPT_FLASH_OFFSET:加密代码位于flash的位置,以page为单位,需要和配置文件中的encrypt_flash_offset项设置为相同值。

3.2 配置加密函数

加密的数据最大为256字节,故通常我们会选取一个重要且简短的函数作为加密函数段。对于加密的函数段需要用特殊的语法标记,标记方法如下:

#ifdef CONFIG_FIRMWARE_ENCRYPTION
__in_section_unique(encrypted_section)
#endif
static void ant_setup(void)
{
	ant_plus_key_set(channel_cfg.channel_num);

	ant_stack_init();
}

上述代码中,实现了将ant_setup函数作为加密函数段。

3.3 生成密文的加密配置文件以及固件

使能了加密后,编译工程代码,将自动在工程目录中生成一个encrypt_info_enc.bin的密文配置文件,此文件是将明文的配置文件进行了加密处理,以防密钥泄露。

警告

明文加密配置文件一定要妥善保管,不可随意外传,以防密钥泄露。

编译工程后,会生成一个zephyr_enc.bin文件,此文件即为生成的加密固件,烧录时需要选择此文件进行烧录。

3.4 烧录配置文件

启用加密流程后,烧录将必须使用PANLINK工具进行。将encrypt_info_enc.bin文件和zephyr_enc.bin固件一起用PANLINK烧录即可。具体烧录方法详见 PANLINK使用指南文档

注意事项

注:使用PANLINK烧录后,开发板和PANLINK要断开,否则可能导致程序运行中断。