前言

产品版本

与本文档相对应的产品版本如下。

产品名称

产品版本

SS928

V100

SS626

V100

SS927

V100

读者对象

本文档(本指南)主要适用于以下工程师:

  • 技术支持工程师

  • 软件开发工程师

符号约定

在本文中可能出现下列标志,它们所代表的含义如下。

符号

说明

表示如不避免则将会导致死亡或严重伤害的具有高等级风险的危害。

表示如不避免则可能导致死亡或严重伤害的具有中等级风险的危害。

表示如不避免则可能导致轻微或中度伤害的具有低等级风险的危害。

用于传递设备或环境安全警示信息。如不避免则可能会导致设备损坏、数据丢失、设备性能降低或其它不可预知的结果。

“须知”不涉及人身伤害。

对正文中重点信息的补充说明。

“说明”不是安全警示信息,不涉及人身、设备及环境伤害信息。

修改记录

文档版本

发布日期

修改说明

00B01

2025-09-15

第1次临时版本发布。

概述

SSxxxx SoC提供丰富的安全特性,包括一系列硬件、固件和软件,以支持客户构建安全可信的设备。主要的安全特性如下:

  • One Time Programmable(OTP),用于存储包括设备安全启动验签的RSA 公钥哈希、多组对称根密钥、SoC安全相关的各种控制信息,以及用户自定义数据等。

  • 芯片支持基于OTP对称根密钥的三级密钥派生。支持对烧录到OTP的根密钥的加扰保护;密钥派生过程中所有的明文密钥软件不可见。

  • 硬件真随机数。

  • 非对称密码算法RSA模块。

  • 支持多种通用Hash算法和对称密码算法的SPACC模块。

  • 基于硬件可信根的安全启动:支持安全镜像逐级校验;支持镜像加密可选择;支持TEE/REE信任链分离;安全启动镜像和非安全启动镜像格式统一,即安全启动没有使能的情况下,非加密的安全启动镜像也可以正常启动。

  • 支持ARM TrustZone,支持安全、非安全内存地址隔离。客户可构建TEE安全方案。

  • 支持安全JTAG。

OTP

简介

OTP是一种非易失性存储器,其主要特性是对应存储空间的内容由0写为1之后,或者写入后锁定,就不能再次更改。SSxxxx OTP 包含如下几大区域:

  1. 存放SoC各种密钥的区域:包括存放安全启动的根公钥哈希值(受限可读),存放保护多个对称密码算法根密钥。密钥区域一旦发起写入操作,自行锁定不可再更改。

    芯片可存放各组根公钥哈希值,用于安全启动校验。包括:芯片厂商根公钥哈希(已预置),OEM根公钥哈希和第三方双签名根公钥哈希。客户可根据产品实际需要,选择合适的根公钥(通过OTP选择)。

    加解密根密钥:芯片预留4个OEM可烧写的对称密码根密钥OTP空间,oem_root_symc_key0~ oem_root_symc_key3,OEM可以利用这里面的一个或者多个根密钥,分别派生出不同的密钥保护密钥和工作密钥。这些密钥区域可以通过对应的OTP烧写接口烧写,一旦写入,硬件自行锁定,不可更改。写入的内容也不能通过软件方式或JTAG接口读取得到。

    芯片预置一个芯片厂商TEE对称密码算法加解密的根密钥,用户可根据实际需要选择使用(通过OTP选择)。

  2. SoC重要特性/功能开关控制区域(含单bit控制区域和多bit控制区域):SoC大多数重要的特性,都可以通过OTP来控制,以提高产品应用的灵活性。比如:安全启动使能,安全启动镜像是否加密,安全启动是否启动冗余备份,是否使能TEE,JTAG工作模式选择等等。特性/功能开关控制区域,在烧写好目标值之后,都可以选择将其锁定,避免后续非法篡改。

    强烈建议客户在最终产品发布前,将所有的特性/功能开关位对应的值设置好,并且强制锁定!即使默认值满足要求,也要求锁定

  3. 用户自定义区域:芯片集成了约25Kbit的用户自定义OTP区域,用以存放用户数据。

    用户自定义区域还包含了一个128bit的版本控制区域:版本控制区域用于存放重要版本标识,防止版本回滚攻击。即防止攻击者利用有安全漏洞的老的合法镜像重新升级,实现重放攻击。版本控制区域不能锁定,每一个控制位都只能由0写到1,一旦写入1后,便不可再更改(one way 模式)。

    在SSxxxx SDK包中,提供了OTP相关的读写接口。详细请参考本文“SSxxxx OTP字段定义 ”以及文档《OTP API 参考》。

    须知: 所有的OTP控制位,无论默认值是否满足实际应用,请全部重新烧写锁定,保证设备安全。

SSxxxx OTP字段定义

OTP位域属性说明

LOCK属性说明

  • Oneway属性:具有此属性的位域未烧写为1的bit都可以在下一次继续烧写,直到所有bit都烧为1;lock使能位不会锁定此属性的位域;

  • lockable属性:lockable属性的相关位域在锁定前与oneway属性一致,烧写对应的lock位后,即使没烧写过的bit也不能再次烧写;建议lockable属性的位域,烧写值后对对应的位域进行锁定,防止被修改。

  • wrlock属性:只要执行过写操作,相应的位域即锁定,不能再做更改。

Load shadow属性说明

  • 芯片上电硬复位后OTP的值会自动加载到对应的寄存器(shadow寄存器);每次烧写OTP后,必须重新上下电才能从shadow寄存器读到刷新后的值;

  • OTP位域无对应的shadow寄存器。

密钥区域

字段名称

位宽

load shadow属性

Lock属性

说明

oem_root_public_key_sha256

256

N

wrlock

OEM根公钥sha256哈希值。用于安全启动信任链校验

tp_root_public_key_sha256

256

N

wrlock

第三方根公钥sha256哈希值(用于安全启动双签名)

oem_root_symc_key0

128

N

wrlock

对称算法(AES)根密钥KEY0。软件不可读取

oem_root_symc_key1

128

N

wrlock

对称算法(AES)根密钥KEY1。软件不可读取

oem_root_symc_key2

128

N

wrlock

对称算法(AES)根密钥KEY2。软件不可读取

oem_root_symc_key3

128

N

wrlock

对称算法(AES)根密钥KEY3。软件不可读取

密钥区域可以通过下面OTP API接口访问:

td_s32 ot_mpi_otp_burn_product_pv(const ot_otp_burn_pv_item *pv, td_u32 num);  td_s32 ot_mpi_otp_read_product_pv(ot_otp_burn_pv_item *pv, td_u32 num);

详细请参考《OTP API参考》

密钥区域的内容不可读取,因此ot_mpi_otp_read_product_pv接口只是返回对应区域的锁定状态(已经锁定的区域,不可再写),无法获取该区域的内容。

单比特控制区域

字段名称

位宽

load shadow属性

Lock属性

说明

tee_owner_sel

1

Y

lockable

在TEE使能时用于选择root public key、对称密钥、TEE侧调试的功能jtag key的owner(芯片厂商/OEM);TEE不使能时此位域无效。

0:OEM (oem_root_public_key_sha256 + oem_root_symc_key0/1/2/3)

1:芯片厂商

oem_rk_deob_en

1

Y

lockable

芯片支持对OTP对称根密钥进行混淆保护,此位域用于使能OEM_ROOTKEY的解混淆。

0:关闭;

1:使能。

jtag_key_sel0

1

Y

lockable

功能JTAG password模式下的根密钥选择控制。

[jtag_key_sel1,jtag_key_sel0]:

0x0:选择oem_root_symc_key0作为JTAG root key;

0x1:选择oem_root_symc_key1作为JTAG root key;

0x2: 选择oem_root_symc_key2作为JTAG root key;

0x3:选择oem_root_symc_key3作为JTAG root key。

jtag_key_sel1

1

Y

lockable

sec_ds_enable

1

Y

lockable

sec_subsys的dsensor使能控制,使能后可增强芯片时钟、电压、电磁的防攻击能力,建议TEE使能的话同时使能该功能。

0:关闭sec_subsys的dsensor;

1:使能sec_subsys的dsensor。

acpu_ds_enable

1

Y

lockable

acpu subsys的dsensor使能控制,使能后可增强芯片时钟、电压、电磁的防攻击能力,建议TEE使能的话同时使能该功能。

0:关闭acpu subsys的dsensor;

1:使能acpu subsys的dsensor。

uboot_redundance

1

Y

lockable

uboot冗余备份启动使能模式标志。

0:关闭;

1:使能。

otp_pcie_disable

1

Y

lockable

PCIE disable控制信号,用来开关PCIE模块。

0:使能PCIE;

1:关闭PCIE。

otp_pcie_ep_boot_disable

1

Y

lockable

PCIE 从启动disable控制信号。

0:使能PCIE从启动模式;

1:关闭PCIE从启动模式。

bload_dec_en

1

Y

lockable

安全启动的bootloader镜像是否解密。

0: 是否解密bootloader取决于镜像中的Boot_Enc_Flag标志;

1: 解密bootloader。

reserved_flag

17

Y

lockable

保留标记位,预留自定义用。

单比特控制的区域可以通过下面OTP API接口访问:

td_s32 ot_mpi_otp_burn_product_pv(const ot_otp_burn_pv_item *pv, td_u32 num);  td_s32 ot_mpi_otp_read_product_pv(ot_otp_burn_pv_item *pv, td_u32 num);

详细请参考《OTP API参考》

单比特控制的区域,OTP对应的值,会在其对应的shadow寄存器中体现出来。通过ot_mpi_otp_read_product_pv接口只能返回该控制位的锁定状态(已经锁定的位置,不可再写),不能直接获得该控制位的值。

多比特控制区域

字段名称

位宽

load shadow属性

Lock属性

说明

update_from_uart_disable

1

Y

oneway

标志是否可以从UART升级。

0:可以从UART升级;

1:禁止从UART升级。

update_from_sdio_disable

1

Y

oneway

标志是否可以从SDIO升级。

0:可以从SDIO升级;

1:禁止从SDIO升级。

update_from_usbdev_disable

1

Y

oneway

标志是否可以从USB Device升级。

0:可以从USB Device升级;

1:禁止从USB Device升级。

scs_dbg_disable

1

Y

oneway

安全启动失败时是否打印debug信息。

0:使能打印;

1:关闭打印。

reserveda0_0

4

Y

oneway

保留

oem_cw_crc_rd_disable

8

Y

oneway

是否使能RKP、KLAD计算结果的CRC。版本已提供驱动,保持默认值即可。

0x42: 使能,计算CRC且CRC结果可回读;

其他: 关闭,不计算CRC。

func_jtag_prt_mode

8

Y

oneway

功能JTAG(用于调试CPU)模式控制。

0x42: 打开;

0x63: 密码保护;

其他: 关闭。

soc_jtag_prt_mode

8

Y

oneway

DFT JTAG模式控制。

0x42: 打开;

0x63: 密码保护;

其他: 关闭。

uart0_disable

1

Y

oneway

UART0端口关闭控制位。

0:打开;

1:关闭。

uart1_disable

1

Y

oneway

UART1端口关闭控制位。

0:打开;

1:关闭。

uart2_disable

1

Y

oneway

UART2端口关闭控制位。

0:打开;

1:关闭。

uart3_disable

1

Y

oneway

UART3端口关闭控制位。

0:打开;

1:关闭。

uart4_disable

1

Y

oneway

UART4端口关闭控制位。

0:打开;

1:关闭。

uart5_disable

1

Y

oneway

UART5端口关闭控制位。

0:打开;

1:关闭。

reserveda1_0

26

Y

oneway

保留

oem_version

32

Y

oneway

建议用作OEM版本号,实现版本防回滚功能。

third_party_version

32

Y

oneway

建议用作第三方版本号,实现版本防回滚功能。

reserved

384

N

oneway

保留

soc_tee_enable

8

Y

lockable

用于表示是否使能TEE。

0x42: 关闭 TEE;此时CPU默认为安全状态,不区分TEE和REE。

其他: 使能 TEE。TEE环境下CPU为安全状态, REE环境下CPU为非安全状态。

reservedlk0

24

Y

lockable

保留

oem_root_symc_key0_flag

32

Y

lockable

oem_root_symc_key0 flag.

bit[7:0]: 保留,必须配置为0x00;

bit[8]: deob_key_sel 根密钥加扰静态值选择,固定写0;

bit[9] root_key_disable 当前根密钥slot禁用;

bit[31:10]: 保留。

oem_root_symc_key1_flag

32

Y

lockable

oem_root_symc_key1 flag.

bit[7:0]: 保留,必须配置为0x00;

bit[8]: deob_key_sel 根密钥加扰静态值选择,固定写0;

bit[9] root_key_disable 当前根密钥slot禁用;

bit[31:10]: 保留。

oem_root_symc_key2_flag

32

Y

lockable

oem_root_symc_key2 flag.

bit[7:0]: 保留,必须配置为0x00;

bit[8]: deob_key_sel 根密钥加扰静态值选择,固定写0;

bit[9] root_key_disable 当前根密钥slot禁用;

bit[31:10]: 保留。

oem_root_symc_key3_flag

32

Y

lockable

oem_root_symc_key3 flag.

bit[7:0]: 保留,必须配置为0x00;

bit[8]: deob_key_sel 根密钥加扰静态值选择,固定写0;

bit[9] root_key_disable 当前根密钥slot禁用;

bit[31:10]: 保留。

secure_boot_en

8

Y

lockable

安全启动使能控制。

0x42:非安全启动;

其他:安全启动。

reservedlk5

24

Y

lockable

保留

double_sign_en

4

Y

lockable

安全启动双签名使能控制。

0xA: 不使能;

其他:使能双签名。

reservedlk6

28

Y

lockable

保留

reservedlk7

28

Y

lockable

保留

gsl_dec_en

4

Y

lockable

控制是否解密GSL。

0xA:是否解密GSL取决于镜像中的GSL_Code_Enc_Flag标志;

其他:解密GSL。

reservedlk8

28

Y

lockable

保留

quick_boot

4

Y

lockable

是否使用快速启动方案。

0x5: 使用快速启动;

其他: 不使用快速启动。

reservedlk9

28

Y

lockable

保留

oem_msid

32

Y

lockable

客户细分市场标识(ID):便于客户对不同细分市场的差异化控制。ID内容由客户自己管理,需保证客户镜像中MSID的值和OTP烧制的值一致。

third_party_msid

32

Y

lockable

第三方细分市场标识(ID):便于其对不同细分市场的差异化控制。ID内容由第三方管理,需保证镜像中对应MSID的值和OTP烧制的值一致。

tee_msid

32

Y

lockable

TEE侧镜像细分市场标识(ID):便于其对不同细分市场的差异化控制。ID内容由TEE owner自己管理,需保证镜像中对应MSID的值和OTP烧制的值一致。

reserved

608

N

lockable

保留

多比特控制区域可通过如下OTP API访问:

td_s32 ot_mpi_otp_burn_product_pv(const ot_otp_burn_pv_item *pv, td_u32 num);  td_s32 ot_mpi_otp_read_product_pv(ot_otp_burn_pv_item *pv, td_u32 num)

多比特控制区域可读可写。其中oneway属性的区域,不可锁定,通过API获得的锁定状态无意义。

用户自定义区域

字段名称

位宽

load shadow属性

Lock属性

说明

ree_user_data

16384

N

lockable

TEE、REE都可以访问。

tee_sec_version

128

N

oneway

TEE的版本区预留128bit,TEE的版本区REE可以读,不能烧写。

tee_user_data

9088

N

lockable

用户自定义数据。

  • 该区域当soc_tee_enable使能时,只有TEE和SOC_JTAG可写;
  • REE不能访问该区域。

用户自定义区域可通过如下OTP API访问:

td_s32 ot_mpi_otp_set_user_data(const td_char *field_name, td_u32 offset, const td_u8 *value, td_u32 value_len);  td_s32 ot_mpi_otp_get_user_data(const td_char *field_name, td_u32 offset, td_u8 *value, td_u32 value_len);  td_s32 ot_mpi_otp_set_user_data_lock(const td_char *field_name, td_u32 offset, td_u32 value_len);  td_s32 ot_mpi_otp_get_user_data_lock(const td_char *field_name, td_u32 offset, td_u32 value_len, ot_otp_lock_status *lock);

用户自定义区域可写可读,其中oneway属性的区域,不可锁定,通过API获得的锁定状态无意义。

须知: 配置JTAG安全模式时,请注意以下事项:

  • jtag_prt_mode字段为oneway属性(为0的bit可以烧写为1,直到所有bit都为1),其他字段位只要写过一次即锁定;

  • jtag_prt_mode可以向更高密级配置:JTAG OPEN →JTAG PASSWORD → JTAG CLOSE。

shadow寄存器

shadow寄存器概览如表1所示。

表 1 shadow寄存器概览(基址是0x1012_0000)

偏移地址

名称

描述

0x2050

OTP_USER_ONEWAY0

OTP用户接口寄存器20

0x2054

OTP_USER_ONEWAY1

OTP用户接口寄存器21

0x2058

OTP_USER_LOCKABLE0

OTP用户接口寄存器22

0x205C

OTP_USER_LOCKABLE1

OTP用户接口寄存器23

0x2060

OTP_USER_LOCKABLE2

OTP用户接口寄存器24

0x2064

OTP_USER_LOCKABLE3

OTP用户接口寄存器25

0x2068

OTP_USER_LOCKABLE4

OTP用户接口寄存器26

0x206C

OTP_USER_LOCKABLE5

OTP用户接口寄存器27

0x2070

OTP_USER_LOCKABLE6

OTP用户接口寄存器28

0x2078

OTP_USER_LOCKABLE8

OTP用户接口寄存器30

0x207C

OTP_USER_LOCKABLE9

OTP用户接口寄存器31

0x2080

OTP_USER_LOCKABLE10

OTP用户接口寄存器32

0x2084

OTP_USER_LOCKABLE11

OTP用户接口寄存器33

0x208c

OTP_USER_LOCKABLE13

OTP用户接口寄存器35

0x2090

OTP_USER_LOCKABLE14

OTP用户接口寄存器36

0x2094

OTP_USER_LOCKABLE15

OTP用户接口寄存器37

0x2098

OTP_USER_LOCKABLE16

OTP用户接口寄存器38

0x209c

OTP_USER_LOCKABLE17

OTP用户接口寄存器39

OTP_USER_ONEWAY0

OTP_USER_ONEWAY0为OTP用户接口寄存器20。

Offset Address: 0x2050 Total Reset Value: 0x0000_0000

Bits

Access

Name

Description

Reset

[31:24]

RO

soc_jtag_prt_mode

DFT JTAG模式控制。

0x42: 打开;

0x63: 密码保护;

其他: 关闭。

0x00

[23:16]

RO

func_jtag_prt_mode

功能JTAG(用于调试CPU)模式控制。

0x42: 打开;

0x63: 密码保护;

其他: 关闭。

0x00

[15:8]

RO

oem_cw_crc_rd_disable

是否使能RKP、KLAD计算结果的CRC。版本已提供驱动,保持默认值即可。

0x42: 使能,计算CRC且CRC结果可回读;

其他: 关闭,不计算CRC。

0x00

[7:4]

-

reserveda0_0

保留

0x0

[3]

RO

scs_dbg_disable

安全启动失败时是否打印debug信息。

0: 使能打印;

1: 关闭打印。

0x0

[2]

RO

update_from_usbdev_disable

标志是否可以从USB Device升级。

0:可以从USB Device升级;

1:禁止从USB Device升级。

0x0

[1]

RO

update_from_sdio_disable

标志是否可以从SDIO升级。

0:可以从SDIO升级;

1:禁止从SDIO升级。

0x0

[0]

RO

update_from_uart_disable

标志是否可以从UART升级。

0:可以从UART升级;

1:禁止从UART升级。

0x0

OTP_USER_ONEWAY1

OTP_USER_ONEWAY1为OTP用户接口寄存器21。

Offset Address: 0x2054 Total Reset Value: 0x0000_0000

Bits

Access

Name

Description

Reset

[31:6]

-

reserveda1_0

保留

0x0000000

[5]

RO

uart5_disable

标志是否关闭UART5。

0:UART5可用;

1:UART5关闭。

0x0

[4]

RO

uart4_disable

标志是否关闭UART4。

0:UART4可用;

1:UART4关闭。

0x0

[3]

RO

uart3_disable

标志是否关闭UART3。

0:UART3可用;

1:UART3关闭。

0x0

[2]

RO

uart2_disable

标志是否关闭UART2。

0:UART2可用;

1:UART2关闭。

0x0

[1]

RO

uart1_disable

标志是否关闭UART1。

0:UART1可用;

1:UART1关闭。

0x0

[0]

RO

uart0_disable

标志是否关闭UART0。

0:UART0可用;

1:UART0关闭。

0x0

OTP_USER_LOCKABLE0

OTP_USER_LOCKABLE0为OTP用户接口寄存器22。

Offset Address: 0x2058 Total Reset Value: 0x0000_0000

Bits

Access

Name

Description

Reset

[31:8]

-

reservedlk0

保留

0x000000

[7:0]

RO

soc_tee_enable

用于表示是否使能TEE。

0x42: 关闭 TEE;

其他: 使能 TEE。

0x00

OTP_USER_LOCKABLE1

OTP_USER_LOCKABLE1为OTP用户接口寄存器23。

Offset Address: 0x205C Total Reset Value: 0x0000_0000

Bits

Access

Name

Description

Reset

[31:0]

RO

oem_root_symc_key0_flag

oem_root_symc_key0 flag。

bit[7:0]: 保留;

bit[8]: deob_key_sel 根密钥加扰静态值选择,固定写0;

bit[9]: root_key_disable 当前根密钥slot禁用;

bit[31:10]: 保留。

0x00000000

OTP_USER_LOCKABLE2

OTP_USER_LOCKABLE2为OTP用户接口寄存器24。

Offset Address: 0x2060 Total Reset Value: 0x0000_0000

Bits

Access

Name

Description

Reset

[31:0]

RO

oem_root_symc_key1_flag

oem_root_symc_key1 flag。

bit[7:0]: 保留;

bit[8]: deob_key_sel 根密钥加扰静态值选择,固定写0;

bit[9] root_key_disable 当前根密钥slot禁用;

bit[31:10]: 保留。

0x00000000

OTP_USER_LOCKABLE3

OTP_USER_LOCKABLE3为OTP用户接口寄存器25。

Offset Address: 0x2064 Total Reset Value: 0x0000_0000

Bits

Access

Name

Description

Reset

[31:0]

RO

oem_root_symc_key2_flag

oem_root_symc_key2 flag。

bit[7:0]: 保留;

bit[8]: deob_key_sel 根密钥加扰静态值选择,固定写0;

bit[9]: root_key_disable 当前根密钥slot禁用;

bit[31:10]: 保留。

0x00000000

OTP_USER_LOCKABLE4

OTP_USER_LOCKABLE4为OTP用户接口寄存器26。

Offset Address: 0x2068 Total Reset Value: 0x0000_0000

Bits

Access

Name

Description

Reset

[31:0]

RO

oem_root_symc_key3_flag

oem_root_symc_key3 flag.

bit[7:0]: 保留;

bit[8]: deob_key_sel 根密钥加扰静态值选择,固定写0;

bit[9] root_key_disable 当前根密钥slot禁用;

bit[31:10]: 保留。

0x00000000

OTP_USER_LOCKABLE5

OTP_USER_LOCKABLE5为OTP用户接口寄存器27。

Offset Address: 0x206C Total Reset Value: 0x0000_0000

Bits

Access

Name

Description

Reset

[31:15]

-

reserved_flag

保留。

0x00000

[14]

RO

bload_dec_en

安全启动的bootloader镜像是否解密。

0: 是否解密bootloader取决于镜像中的Boot_Enc_Flag标志;

1: 解密bootloader。

0x0

[13]

RO

otp_pcie_ep_boot_disable

PCIE 从启动disable控制信号。

0:PCIE从启动模式开启;

1:PCIE从启动模式关闭。

0x0

[12]

RO

otp_pcie_disable

PCIE disable控制信号。

0:PCIE使能;

1:PCIE不使能。

0x0

[11]

RO

uboot_redundance

uboot冗余备份启动使能模式标志。

0:关闭;

1:使能。

0x0

[10]

-

reserved

保留。

0x0

[9]

RO

acpu_ds_enable

acpu subsys的dsensor使能控制,使能后可增强芯片时钟、电压、电磁的防攻击能力,建议TEE使能的话同时使能该功能。

0:关闭acpu subsys的dsensor;

1:使能acpu subsys的dsensor。

0x0

[8]

RO

sec_ds_enable

sec_subsys的dsensor使能控制,使能后可增强芯片时钟、电压、电磁的防攻击能力,建议TEE使能的话同时使能该功能。

0:关闭sec_subsys的dsensor;

1:使能sec_subsys的dsensor。

0x0

[7:6]

RO

jtag_key_sel

选择哪个OEM_ROOT_KEY作为JTAG KEY。

0x0: oem_root_symc_key0;

0x1: oem_root_symc_key1;

0x2: oem_root_symc_key2;

0x3: oem_root_symc_key3。

0x0

[5]

RO

oem_rk_deob_en

芯片支持对OTP对称根密钥进行混淆保护,此位域用于使能OEM_ROOTKEY的解混淆。

0:关闭;

1:使能。

0x0

[4]

RO

tee_owner_sel

在TEE使能时用于选择root public key、对称密钥、TEE侧调试的功能jtag key的owner(芯片厂商/OEM);TEE不使能时此位域无效。

0:OEM (oem_root_public_key_sha256 + oem_root_symc_key0/1/2/3);

1:芯片厂商。

0x0

[3:0]

-

reserved

保留。

0x0

OTP_USER_LOCKABLE6

OTP_USER_LOCKABLE6为OTP用户接口寄存器28。

Offset Address: 0x2070 Total Reset Value: 0x0000_0056

Bits

Access

Name

Description

Reset

[31:8]

-

reserved

保留。

0x000000

[7:0]

RO

otp_init_rdy

OTPC 初始化完成标志。

0xA9: 完成;

其他: 未完成。

0x56

OTP_USER_LOCKABLE8

OTP_USER_LOCKABLE8为OTP用户接口寄存器30。

Offset Address: 0x2078 Total Reset Value: 0x0000_0000

Bits

Access

Name

Description

Reset

[31:8]

-

reservedlk5

保留。

0x000000

[7:0]

RO

secure_boot_en

安全启动使能控制。

0x42:非安全启动;

其他:安全启动。

0x00

OTP_USER_LOCKABLE9

OTP_USER_LOCKABLE9为OTP用户接口寄存器31。

Offset Address: 0x207C Total Reset Value: 0x0000_0000

Bits

Access

Name

Description

Reset

[31:4]

-

reservedlk6

保留。

0x0000000

[3:0]

RO

double_sign_en

双签名使能控制。

0xA:不使能;

其他:使能。

0x0

OTP_USER_LOCKABLE10

OTP_USER_LOCKABLE10为OTP用户接口寄存器32。

Offset Address: 0x2080 Total Reset Value: 0x0000_0000

Bits

Access

Name

Description

Reset

[31:0]

RO

oem_version

建议用作OEM版本号,实现版本防回滚功能。

0x00000000

OTP_USER_LOCKABLE11

OTP_USER_LOCKABLE11为OTP用户接口寄存器33。

Offset Address: 0x2084 Total Reset Value: 0x0000_0000

Bits

Access

Name

Description

Reset

[31:0]

RO

third_party_version

建议用作第三方版本号,实现版本防回滚功能。

0x00000000

OTP_USER_LOCKABLE13

OTP_USER_LOCKABLE13为OTP用户接口寄存器35。

Offset Address: 0x208c Total Reset Value: 0x0000_0000

Bits

Access

Name

Description

Reset

[31:4]

-

reservedlk8

保留。

0x0000000

[3:0]

RO

gsl_dec_en

控制是否解密GSL。

0xA:是否解密GSL取决于镜像中的GSL_Code_Enc_Flag标志;其他:解密GSL。

0x0

OTP_USER_LOCKABLE14

OTP_USER_LOCKABLE14为OTP用户接口寄存器36。

Offset Address: 0x2090 Total Reset Value: 0x0000_0000

Bits

Access

Name

Description

Reset

[31:4]

-

reservedlk9

保留。

0x0000000

[3:0]

RO

quick_boot

是否支持快速启动功能(兼容传统用法)。

0x5: 使用快速启动;

其他: 不使用快速启动。

0x0

OTP_USER_LOCKABLE15

OTP_USER_LOCKABLE15为OTP用户接口寄存器37。

Offset Address: 0x2094 Total Reset Value: 0x0000_0000

Bits

Access

Name

Description

Reset

[31:0]

RO

oem_msid

客户细分市场标识(ID):便于客户对不同细分市场的差异化控制。ID内容由客户自己管理,需保证客户镜像中MSID的值和OTP烧制的值一致。

0x00000000

OTP_USER_LOCKABLE16

OTP_USER_LOCKABLE16为OTP用户接口寄存器38。

Offset Address: 0x2098 Total Reset Value: 0x0000_0000

Bits

Access

Name

Description

Reset

[31:0]

RO

third_party_msid

第三方细分市场标识(ID):便于其对不同细分市场的差异化控制。ID内容由第三方管理,需保证镜像中对应MSID的值和OTP烧写的值一致。

0x00000000

OTP_USER_LOCKABLE17

OTP_USER_LOCKABLE17为OTP用户接口寄存器39。

Offset Address: 0x209c Total Reset Value: 0x0000_0000

Bits

Access

Name

Description

Reset

[31:0]

RO

tee_msid

TEE侧镜像细分市场标识(ID):便于其对不同细分市场的差异化控制。ID内容由TEE owner自己管理,需保证镜像中对应MSID的值和OTP烧写的值一致。

0x00000000

硬件真随机数

TRNG

TRNG模块能够生成真随机数。产生的真随机数符合FIPS140-1的随机测试标准。

TRNG具体应用方法,请参考文档《CIPHER API 参考》

密钥管理

密钥管理分为三级,分别为RKP、一级KLAD、二级KLAD,增强了密钥安全强度。密钥经三级密钥管理后,生成明文的工作密钥,并送给加解密引擎(SPACC),实现对最终的数据加解密运算。明文的工作密钥不会出现在内存中,确保不会被泄露。

RKP

RKP模块从OTP中获取对称根密钥,根据OTP配置判断是否解混淆对称根密钥,根据用户输入的派生材料派生ROOT KEY,并将ROOT KEY传递给一级KLAD。ROOT KEY存储在硬件中,不会泄露。RKP的具体规格:

  • 支持AES 128 ECB算法。

  • 支持从OTP中获取对称根密钥。

  • 支持对称根密钥解混淆。

  • 支持派生232个密钥。

一级KLAD

一级KLAD从RKP模块中获取ROOT KEY,并将受保护的一级密钥解密,传递给二级KLAD。解密后的一级密钥存储在硬件中,不会泄露。一级KLAD的具体规格:

  • 支持AES 128 ECB算法。

  • 支持受保护的一级密钥长度为128bits。

二级KLAD

二级KLAD从一级KLAD获取解密后的密钥,并将受保护的二级密钥解密(明文的工作密钥),传递给加解密引擎(SPACC)。明文的工作密钥存储在硬件中,不会泄露。二级KLAD的具体规格:

  • 支持AES 128 ECB算法。

  • 支持受保护的二级密钥长度为128/256bits。

为详细了解密钥管理中RKP、一级KLAD、二级KLAD与OTP、SPACC之间的关系,请参考图1

图 1 密钥管理原理图

SPACC具体应用方法,请参考文档《CIPHER API 参考》

硬件非对称密码算法

RSA

RSA是一种非对称密码算法,通过模幂计算实现加解密,常用于对数据进行数字签名和签名验证。SSXXXX RSA模块支持RSA2048/3072/4096,算法实现符合PKCS#1 V1.5/2.1标准。具体规格:

  • 支持2048bit、3072bit和4096bit的密钥位宽。

  • 2048密钥位宽公钥加解密性能最低为10 bps。

  • 支持RSA内部密钥RAM、报文RAM和结果RAM清零。

RSA具体应用方法,请参考文档《CIPHER API 参考》。

Hash算法和对称密码算法AES

SPACC

SSxxxx SPACC模块实现了对称密码算法AES和HASH算法。

AES算法的实现符合FIPS 197 标准;AES 的工作模式符合NIST special800-38a 标准。

SHA算法实现符合FIPS180-2标准,HMAC_SHA算法实现符合RFC2104标准。

具体规格:

  • 支持AES ECB/CBC/OFB/CFB/CTR/CCM/GCM。

  • 支持AES128、AES192和AES256。

  • 支持SHA256、HMAC-SHA256、SHA384、HMAC-SHA384、SHA512、HMAC-SHA512。

  • 支持15个DMA通道。

  • 支持CPU配置输入数据和DMA方式读取输入数据。

  • 多块加密通道支持字节地址。

  • AES算法支持基于硬件根密钥派生工作密钥进行加解密(如图1)

安全启动

SSxxxx 支持基于芯片硬件可信根的安全启动。芯片OTP中可存储一个RSA2048(或者RSA4096)public key的hash256值,作为安全启动签名校验的起点。安全启动的信任传递为:

  • 硬件可信根(OTP hash值)验证Flash中的RSA public key,这部分由BootRom完成;

  • RSA public key 验证U-boot;

  • U-boot再验证启动后续的镜像(uImage、rootfs,和其它分区)。

强烈建议在产品开发中使用安全启动。安全启动需要通过OTP中的secure_boot_en 控制位来使能。在使能安全启动之前,版本提供的未加密的安全启动镜像(特指安全U-boot),可以正常启动。

SSxxxx 安全启动方案支持镜像加密功能。安全启动的根密钥来自于OTP中的AES key0(软件不可读),由根密钥派生出实际的镜像解密密钥。

OTP中的可信根,以及数据加解密根密钥AES key0 完全由客户自行管理并烧录。

安全启动更详细的信息,请参考文档《SSxxxVxxx 安全启动使用指南》。

支持安全、非安全内存地址隔离

TZASC

SSxxxx 提供TZASC模块,支持对内存地址空间进行隔离控制,使CPU和其他SoC组件在处于安全模式和非安全模式等不同特权模式下,对内存的访问权限进行硬件级别的控制。这是实现基于ARM TrustZone 下的TEE、REE隔离的基础。

TZASC全称是TrustZone Address Space Controller,它是Advanced Microcontroller Bus Architecture(AMBA)兼容的SoC外围组件,可对接AMBA AXI和AMBA APB接口。

SSxxxx的 TZASC模块提供了16个可配置的区域(region0~region15)。其中region0固定使能,无法配置访问属性,大小覆盖除了region1~region15区域以外的所有内存区域。任何组件(无论是安全还是非安全)都无法访问region0覆盖的内存。

其余内存区域的访问属性,可以根据需要,选择下面四个属性单元的组合:

  • 安全可读属性

  • 安全可写属性

  • 非安全可读属性

  • 非安全可写属性

TZASC模块的bypass属性控制着模块是否使能:

  • 默认bypass属性使能,TZASC模块处于失能状态,内存访问不受限制;

  • 设置bypass属性失能,TZASC模块将会使能,各内存区域的访问属性生效。

TZASC控制的参考代码,请参考发布包GSL源代码根目录下drivers/tzasc/tzasc.c,该代码在boot/checkup.c中调用。

须知:

  • bypass属性失能后,在系统复位前无法再次使能。

  • TZASC的配置,建议客户在系统启动之后,只做一次配置,不要多次动态调整,以避免处理不当导致其他异常。

安全Debug

JTAG

SSxxxx 的JTAG调试接口可以通过OTP进行打开模式、密码模式、永久关闭模式的切换,默认为打开模式。OTP烧写的具体操作方法,请参照本文“SSxxxx OTP字段定义”和文档《OTP API 参考》。

通过JTAG调试接口对SoC进行调试,需要配套的调试板和PC对应的软件工具。

JTAG的安全由OTP中如下四个控制属性控制:

  • jtag_ca_en:

    • 不使能,则JTAG永远打开,JTAG调试无需任何权鉴;

    • 使能,JTAG安全由jtag_prt_mode控制。

  • jtag_prt_mode:在jtag_ca_en为1(使能)的情况下有效。jtag_prt_mode由2bit控制不同工作模式。

    • 直通模式,即无需任何权鉴即可联通;

    • 密码模式,需要输入用户名和密码(参见jtag_pw_id和jtag_pw字段);

    • 其它模式,jtag关闭,即不可用。

    详细配置,请参考本文“SSxxxx OTP字段定义”。

  • jtag_pw_id:JTAG的用户名。如有需要,需在设备出厂前烧录;可以通过PC端调试工具读取。

  • jtag_pw:JTAG用户密码。如有需要,需在设备出厂前烧录。该字段不可读取。

密码模式下,如果调试者输入的用户名、密码和OTP中的jtag_pw_id、jtag_pw一致,则可以打开JTAG,否则不能接通JTAG。芯片重启后需要重新输入密码。

JTAG的权限由DBC模块控制,密钥模式下要打开JTAG,需要配置DBC寄存器。

通过SOC JTAG读写DBC寄存器的方法:

  • 读 chipid

    chipid为64bit,储存在2个寄存器中,需要读2次完全获取。

    • 配置chipid[31:0]的寄存器地址0x13000到JTAG_ADDR;配置0x01到JTAG_ENABLE开始读操作:

    • 读JTAG_STATUS直到req_cnt以及ack_cnt计数都已经加1。

    • 读JTAG_RDATA获得chipid[31:0]。

    • 配置0x0到JTAG_ENABLE清除读使能。

    chipid[63:32]同样的操作,仅需修改ADDR为0x13004.

  • 输入密钥

    jtag密钥128bit,需要写4次寄存器输入。

    • 配置COM_PSWD_0的寄存器地址0x13010到JTAG_ADDR;配置密钥的低32bit数据到JTAG_WDATA,配置0x1到JTAG_WRITE和JTAG_ENABLE开始写操作:

    • 读JTAG_STATUS 直到req_cnt以及ack_cnt计数都已经加1。

    • 配置0x0到JTAG_WRITE和JTAG_ENABLE清除写使能。

    其余96bit同样的操作输入,对应密钥寄存器地址为0x130014~0x13001c.

表 1 SOC_JTAG接口命令

Instruction

Data Register

Length

接口信号名

RESERVED

RESERVED

20

soc_jtag_op[127:108]

soc_jtag_op_data

JTAG_WDATA_1

32

soc_jtag_op[107:76]

JTAG_ADDR_1

20

soc_jtag_op[75:56]

JTAG_WDATA_0

32

soc_jtag_op[55:24]

JTAG_ADDR_0

20

soc_jtag_op[23:4]

soc_jtag_op_com

JTAG_WRITE_1

1

soc_jtag_op[3]

JTAG_WRITE_0

1

soc_jtag_op[2]

JTAG_ENABLE_1

1

soc_jtag_op[1]

JTAG_ENABLE_0

1

soc_jtag_op[0]

soc_jtag_op_rdata

JTAG_RDATA_1

32

soc_jtag_op_rdata[63:32]

JTAG_RDATA_0

32

soc_jtag_op_rdata[31:0]

soc_jtag_op_stat

JTAG_ACK_CNT

16

soc_jtag_op_stat[31:16]

JTAG_REQ_CNT

16

soc_jtag_op_stat[15:0]

说明:

  • SOC JTAG支持一次配置1个命令,也支持一次配置2个命令。soc_jtag_op有128bit,当前为了提升指令效率,reserved的高20bit未使用,其他108bit根据数据和使能拆分为2个指令;

  • 当SOC JTAG一次配置1个命令时,支持通过JTAG_ENABLE_0或者JTAG_ENABLE_1发起;

  • 当SOC JTAG一次配置2个命令时,逻辑优先执行JTAG_ENABLE_0,再执行JTAG_ENABLE_1命令;

  • JTAG_REQ_CNT是SOC JTAG命令请求次数统计,JTAG_ACK_CNT是逻辑命令完成次数统计;

  • 无论是否启用安全JTAG功能,建议客户根据实际情况烧写锁定JTAG状态。

缩略语

缩略语

说明

OTP

One Time Programmable

KLAD

Key Ladder

SPACC

Security Protocol Accelerator

AES

Advanced Encryption Standard

TZASC

Trust Zone Address Space Controller

TEE

Trusted Executed Environment

REE

Rich Executed Environment