安全配置
通用安全配置
安全启动配置主要用于配置 BL1 与 BL2 安全启动相关信息:
secureboot_en
- 可选项,表示安全启动是否使能,默认不使能。
flash_aes_en
- 可选项,表示 FLASH AES 加密是否使能,默认不使能。
flash_aes_key
- 可选项,表示 FLASH AES 加密密钥,当flash_aes_en
使能时,必须配置。
root_key_type
- 可选项。默认使用 ec256。配置 BL1/BL2 签名的公钥类型,可选值为 ec256,rsa2048。
root_pubkey
- 可选项,量产版本必须配置。BL1/BL2 公钥文件。
root_privkey
- 可选项,量产版本必须配置。BL1/BL2 私钥文件。构建工具会使用私钥对 BL2 进行签名。
debug_key_type
- 可选项。默认使用 ec256。配置安全调试签名的公钥类型,可选值为 ec256,rsa2048。
debug_pubkey
- 可选项,量产版本必须配置。安全调试公钥文件。
debug_privkey
- 可选项,量产版本必须配置。安全调试私钥文件。
备注
为简化配置,BL1/BL2 使用同一公钥进行签名。
安全外设配置
安全外设通过 ppc.csv 与 gpio_dev.csv 进行配置。
ppc.csv
ppc.csv 用于配置外设安全属性,配置示例如下:
Device |
Secure |
Privilege |
---|---|---|
UART0 |
FALSE |
TRUE |
UART1 |
TRUE |
TRUE |
GPIO0 |
FALSE |
TRUE |
GPIO1 |
TRUE |
TRUE |
配置表固定三列:
Device
- 必选项。表示设备名字,设备名一般为大写的设备简写,如,UART1 等。
Secure
- 可选项。表示外设是否为安全外设。可选配置值为:
TRUE - 表示设备是否属于安全外设。
FALSE - 安全外设仅能在安全世界访问。
NA - 表示该外设未被用到。
不配置 - 同 NA。
Privilege
- 可选项,表示设备是否属于特权外设。可选配置值为:
TRUE - 表示设备为特权外设,仅在处理器特权状态下能访问
FALSE - 表示非特权外设。
NA - 表示该外设未被用到。
不配置 - 同 NA。
备注
如果可配置设备不在 ppc.csv 中,表示该外设未被用到。
gpio_dev.csv
gpio_dev.csv 用于配置外设与 GPIO 映射关系,配置示例如下:
GPIO |
Device |
---|---|
GPIO0 |
UART1 |
GPIO1 |
UART1 |
配置表固定两列:
GPIO
- 必选项。GPIOx 表示 GPIO x。
Device
- 必选项。表示该 GPIO 被哪个外设用到。
gpio_dev.csv 的目的是用于确保外设安全属性与其关联的 GPIO 属性一致。Armino 构建系统会 便利 ppc.csv 配置表,对于那些会被应用到系统中的外设,从 gpio_dev.csv 中查找所有的 GPIO, 如果这些 GPIO 属性与外设安全属性不匹配,则会给出提示信息,同时自动更正 GPIO 的安全属性。
以上述示例中的 UART1 为例,由 gpio_dev.csv 可知 UART1 会用到 GPIO0/GPIO1,因此 UART1 的安 全属性与 GPIO0/1 必须一致。由 ppc.csv 配置可知,UART1 配置成安全,GPIO0/1 分别配置成非安全/安全。 其中,GPIO0 的安全属性与 UART1 不同,因此,构建系统会自动将 GPIO0 的安全属性调整为安全。
备注
如果外设不会在系统中使用,那么该外设所使用的 GPIO 均不会依据 gpio_dev.csv 进行调整。
代码生成
对于 ppc.csv 中一行,在 security.h 中会生成两个宏用于标识设备安全属性。
Device |
Secure |
Privilege |
---|---|---|
uart0 |
FALSE |
FALSE |
以上表 uart0 配置为例,会生成下述代码:
#define GEN_SECURITY_DEV_UART0_IS_SECURE 0
#define GEN_SECURITY_DEV_UART0_IS_PRIVILEGE 0
另外,还会生成四个对外接口:
#define DEV_IS_PRIVILEGE(dev) GEN_SECURITY_DEV_##dev##_IS_PRIVILEGE
#define DEV_ID_IS_PRIVILEGE(dev, id) GEN_SECURITY_DEV_##dev##id##_IS_PRIVILEGE
#define DEV_IS_SECURE(dev) GEN_SECURITY_DEV_##dev##_IS_SECURE
#define DEV_ID_IS_SECURE(dev, id) GEN_SECURITY_DEV_##dev##id##_IS_SECURE
在 Armino 中,可通过调用上述四个对外接口就可以访问外设安全属性。
安全块外设配置
块外设通过 mpc.csv 进行配置,配置示例如下:
Device |
Offset |
Size |
Secure |
---|---|---|---|
MEM0 |
16k |
TRUE |
|
MEM0 |
32k |
FALSE |
|
MEM0 |
16k |
TRUE |
|
MEM1 |
0x10000 |
64k |
TRUE |
FLASH_CODE |
0x20000 |
64k |
FALSE |
FLASH_DATA |
0x30000 |
64k |
TRUE |
配置表固定四列:
Device
- 必选项。设备名字。
Offset
- 可选项。设备内部偏移。
未配置,如果为该设备首个配置块,请 Offset 为 0,否则表示上一块结束地址。
Offset + Size 大小不能超过设备存储总大小。
Offset 同一设备上一块地址不能重叠。
Size
- 必选项。配置块大小。必须按设备块大小对齐。
Secure
- 可选项。配置块安全属性,未配置时值为 False。
关于可配置设备,设备存储空间大小,设备块大小,请参考 块内存安全访问。
备注
设备块未配置时,默认为非安全。
FLASH 安全属性配置
在 mpc.csv 配置表中,FLASH 配置较为特殊,因为它包含指令口与数据口的配置。FLASH 指令口/数据口配置分别使用 FLASH_CODE/FLASH_DATA 表示设备名,配置时一律使用物理地址。关于 FLASH 地址请参考 FLASH 安全。
重要
FLASH 指令口配置时,物理地址必须 68K 对齐,这样转换到的虚拟地址就是 64K 对齐。