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要断开,否则可能导致程序运行中断。