安全配置

[English]

通用安全配置

安全启动配置主要用于配置 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 对齐。