OTP/EFUSE 配置

[English]

OTP

概述

OTP模块共有三组接口,分别为系统端的AHB和APB,加密端的APB。其中系统端连接总线,而加密端通过shanhai安全引擎访问。AHB的基地址为0x4B010000,APB的基地址为0x4B100000。

OTP主要有三块区域,分别为OTP,OTP2,PUF区域。

  • OTP有256*32bit共8Kb存储空间,系统端权限为读写/只读/无法访问,加密端权限为读写。

  • OTP2有768*32共24Kb存储空间,系统端权限为读写/只读/无法访问,加密端没有连接OTP2的通路。

  • PUF有64*32共2Kb存储空间。前1K用于存放UID,后1K用于存放生成随机数的熵池。系统端对于UID的权限为只读或无法访问,对熵池的权限为只读/无法访问。加密端对UID的权限为只读/无法访问。PUF需要注册后才能生效。

OTP对区域的操作有四种:安全范围划分,权限管理、屏蔽和清零。

  • 安全范围划分可以将区域划分为安全与非安全,系统端的非安全访问安全区域会得到被屏蔽后的全F数据。加密端不受影响。安全范围可以多次划分,但是不能划分OTP2区域。

  • 权限管理可以配置每个otp8bit的权限,将访问权限从只读变为不可访问。权限管理的配置是一次性的。

  • 屏蔽也可以将区域的只读权限变为不可访问,但是重新上电复位可以将屏蔽恢复。屏蔽操作也有一个锁来控制,如果置锁,则连同锁一起,将不能再更改屏蔽,但重新上电后会恢复。

  • 清零操作可以将OTP和PUF区域进行清零,可以读取指示来得知某区域是否被清零,并且可以限制非安全清零操作。清零操作只可以操作OTP和PUF区域。

OTP 布局

8

AHB Side

0x000~0x2FF OTP2:存储区2 可读可编程的OTP2区域,被分为767个小分区。每个分区都可以通过改变LOCK OTP2 CELL来更改权限:读写->只读->不可访问。

APB Side

0x000~0x100 PIF:配置PUF和OTP权限的区域 0x200~0x240 PTR:Test Row 0x240~0x280 PTC:Test Column 0x2A0~0x2A4 RNG:随机数生成区域 0x2B0~0x2B4 INT 0x2B4~0x2C0 PMK:Mask区域 0x2C0~0x2F4 PTM:状态表征区域 0x300~0x400 PUF:随机数注册区域 0x400~0x7FC OTP:主存储区

三组接口可访问的区域如上图所示,其中系统端的权限可以被NA,但是shanhai加密端不能被NA。另外,shanhai需要使用OTP部分的信息作为自己的配置。但是shanhai不支持偏移地址,而OTP的存储区是有0x0400的偏移地址的。所以在设计上shanhai访问OTP的地址进行了相应的偏移,偏移量为0x500。

OTP 硬件区

1.0x400~0x45F: 存放memcheck结果 2.0x460~0x47F: 存放flash_key 3.0x480~0x47F: 预留给硬件使用

OTP 软件区

8

BL1 OTP 项

需要使能efuse的第0bit和第3bit,从而进行安全启动(该操作不可回退!一旦启用安全启动就不能关闭,请谨慎。)

BL2 OTP 项

TODO

FLASH AES KEY

用于AES加密的密钥,地址范围为0x4B100460~0x4B100480,共32Bytes。当前使用的AES KEY为:(high) 73c7bf39|7f2ad6bf|4e7403a7|b965dc5c|e0645df0|39c2d69c|814ffb40|3183fb18 (low) 所以向OTP写入时,要注意低地址在前先写入,按照word来进行倒转,得到(low)3183fb18|814ffb40|39c2d69c|e0645df0|b965dc5c|4e7403a7|7f2ad6bf|73c7bf39(high)

其他 OTP 项

EFUSE

EFUSE 共有 4x8 共 32 Bits, 其中每个 Bit 的含义不同。可以通过总 BKFIL 配置。

index

name

0

security boot enable

0: 不使能安全启动。1: 使能安全启动。

1

security boot debug mode

0: 使能安全启动调试信息。1: 关闭安全启动调试信息。

2

fast boot disable

0: 使能快速启动;1: 关闭快速使能。

3

boot mode

0:传统下载模式;1: 安全启动模式。

4

security boot clock select

0: 安全启动使用 XTAL 时钟;1: 安全启动使能 PLL。

5

random delay enable

0: 关闭了随机延时;1: 使能随机延迟。

6

direct jump enable

0: 关闭安全启动直接跳转;1: 使能安全启动直接跳转。

7

security boot critical error

0: 不关闭安全启动中严重错误打印;1: 关闭安全启动中严重错误打印。

8~19

reserved

保留位

20

attack_nmi_enable

0: 检测到注入攻击时不产生 NMI;1: 检测到注入攻击时产生 NMI。

21

spi_to_ahb_disable

0:SPI 到 AHB 通路不关闭;1: SPI 到 AHB 通路关闭。

22

auto_reset_enable[0]

温度电压异常复位

23

auto_reset_enable[1]

温度电压异常复位

24~28

reserved

保留位

29

flash aes enable

0: FLASH AES 加密未使能;1: FLASH AES 加密使能。

30

spi_dld_disable

0: SPI 下载使能;1: SPI 下载关闭。

31

reserved

保留位

BIT(0) - security boot enable

EFUSE 中有两位与安全启动使能相关:

  • BIT(3) - boot mode 用于设置启动模式。0 表示传统下载模式,此时可通过 UART 下载版本;1 表示安全启动模式,设置成安全启动模式之后还需要通过 BIT(3) 使能安全启动。

  • BIT(0) - 使能安全启动。仅在 BIT(3) 设置成 1(安全启动模式)时有效,表示是否使能安全启动。

当 BIT(0) 置 0 时,表示安全启动未使能,此时 BL1 认为 IMAGE 中的公钥合法,即不会使用 IMAGE 中的公钥与 OTP 中的公钥 HASH 做比对,仅做 IMAGE 完整性验证。因此,这时 OTP 中即使不配置公钥 HASH 系统依然能启动。

当 BIT(0) 置 1 时,表示安全启动使能,要求 OTP 中必须配置公钥 HASH,否则启动失败。

BIT(1) - security boot debug mode

BL1 定义了两级调试信息来供用户定位问题,分别由 EFUSE BIT(1)/BIT(7) 来控制,其中 BIT(1) 控制普通调试信息,BIT(7) 控制严重错误。

普通调试信息除了错误之外,还包括一些流程性的日志打印。

严重错误通常是指会导致 BL1 启动失败的错误,当前 BL1 支持下述严重错误:

错误码

含义

0x1

读 EFUSE 出错 1

0x2

读 EFUSE 出错 2

0x3

读 FLASH 出错 1

0x11

CPU 异常 NMI

0x12

CPU 异常 MemMange

0x13

CPU 异常 HardFault

0x14

CPU 异常 BusFault

0x15

CPU 异常 UserFault

0x16

CPU 异常 SecurityFault

0x21

OTP 为空

0x22

公钥为空

0x23

跳转 BIN 校验失败

0x1xxx

OTP 读失败

0x8yyyyyyy

验签失败

其中 xxx 指 OTP 的 OFFSET,yyyyyyy 指具体的验签失败点。

严重错误在打印时仅打出错误码,如 “E16” 表示CPU 异常 SecurityFault。

备注

当严重错误使能时,BL1 安全启动时并不会初始化 UART,仅当产生了不可回复的严重错误时才会初始化 UART,进行打印。 因此,严重错误并不会影响正常启动功能,也不会带来安全问题。

重要

一般在开发阶段,尤其是尚未在任何板子上成功配置过安全启动之前,建议开启普通日志,这样,可以看到更多调试信息; 在熟悉了安全启动配置之后,或者在量产阶段,应该关闭普通日志。严重错误则建议在量产版本中也不要关闭。

BIT(2) - fast boot disable

BIT(2) 用于关闭 Fast Boot 启动。0 表示 Fast Boot 使能,1 表示关闭。

Fast Boot 用于控制系统从 Deep Sleep 醒来的流程,当 Fast Boot 使能时,Deep Sleep 醒来后跳过安全启动,直接跳转到应用程序中; 当 Fast Boot 关闭时,则与上电重启类似,会做完整的安全启动。

重要

Fast Boot 使能时,启动速度更快,但不够安全;Fast Boot 关闭时,启动速度较慢,但安全可靠。 应用应该依据实际需求决定是否开关 Fast Boot。

BIT(3) - boot mode

请参考 BIT0

BIT(4) - sb clock select

BIT(4) 用于使能安全启动高频模式。0 表示 CPU 与 FLASH 使用 XTAL 作为时钟,通常为 26Mhz,1 表示使能 PLL,CPU 与 FLASH 配置 在高频模式。在高频模式下,安全启动速度更快,对启动性能有要求的应用一般建议使能高频模式。

BIT(5) - random delay enable

BIT(5) 用于使能随机延时,0 表示随机延时关闭,1 表示开启。当随机延时开启时,BL1 在调用关键函数前,都会做一个随机 delay, 通过这种机制减缓故障注入攻击带来的影响。

备注

随机延时使能会增加安全启动时间,除非对注入攻击防范特别高的应用,通常不建议打开随机延迟功能。

BIT(6) - Direct Jump

BIT(6) 用于配置 BL1 验签完之后的跳转方法,0 表示间接跳转,1 表示直接跳转。

使用间接跳转时,BL1 在验签完之后不是直接跳转到被验的 IMAGE,而是先跳转到一个中间 BIN,然后由中间 BIN 再跳转到目标 IMAGE。 使用直接跳转时,BL1 在验签完成之后直接跳转到被验的 IMAGE。

备注

当使用间接跳转时,中间 BIN 也会包含在 IMAGE 中一起验签,因此是安全的。

BIT(7) - security boot critical error

请参考 BIT1

BIT(20) - attack NMI

BIT(20) 用于配置在检测到故障注入攻击之后是否产生 NMI 异常。为 0 时 BL1 不会进行硬件层面的故障注入攻击检测, 为 1 时 BL1 会进行硬件层面的故障注入攻击检测,当检测到攻击时产生 NMI 异常。

备注

对故障注入攻击特别关注的应用,建议打开这个开关。

BIT(29) - flash aes enable

BIT(29) 用于使能 FLASH AES 加密,0 表示 FLASH AES 加密不使能,1 表示 FLASH AES 加密使能。

BIT(30) - spi download disable

关闭 SPI 下载功能。为 0 时支持 SPI 下载;为 1 时关闭 SPI 下载。

重要

为避免带来安全隐患,量产版本中应该禁用 SPI 下载。但在尚未成功部署安全启动之前,可先不要禁用 SPI 下载, 这样,当安全启动部署失败时,依然可通过 SPI 下载将版本下载到 FLASH。否则,一旦安全启动部署失败,就再 也无法下载版本,板子变砖。

OTP/EFUSE 配置

使用BKFIL

使用BKFIL工具将配置表文件内容配置OTP和EFUSE,在BKFIL命令行使用–safe-json选项可按照配置表.json文件配置OTP和EFUSE。 或者使用BKFIL界面来进行配置,如图所示

8

配置文件的格式如下:

数据格式:

"name":              "otp_ns_user_space", #名称,仅用于区分含义,无其他功能
"mode":              "write",             #读或写操作,write/read
"permission"         "NA",                #配置该OTP区域权限,仅在写模式生效
"start_addr":        "0x4B100590",        #操作的起始地址
"last_valid_addr":   "0x4B100600",        #当前区域可以最大合法操作的位置
"byte_len":          "0x8",               #操作的数据的长度
"data":              "123456789ABCDEF",   #操作的数据的内容,读时为空,写为空时不写入
"data_type":         "hex",               #操作的数据的类型,有hex/ascii两种
"status":            "false"              #该操作是否生效,true时执行,false为不执行

区域开关:控制四个区域的开关,分别为用户可操作区域,efuse区域,安全控制区域,安全数据区域。其中efuse区域和安全控制区域用于配置efuse相关bit,而用户操作区域和安全数据区域用于配置otp相关bit。开关设置为“true”生效,为”false”时失效。

用户可操作区域:当User_Operate_Status设置为true时该配置区域生效,可以根据用户自己的需求配置相关区域。用户可配置的区域为0x4B100600~0x4B100700,对应的OTP location为128~192。

efuse区域:对efuse进行读写操作,由于efuse按bit生效,整体操作容易出错,一般在安全控制区域用单个bit进行写,一般在efuse区域进行读操作。

安全控制区域:用于单个bit写入efuse,数据格式如下:

"enable_security_boot":         "0,0,1",
"disable_fast_boot":            "0,2,0",
"enable_flash_aes":             "3,5,1"

前面的为名称,后面的三个数据分别代表第几个字节,第几bit,写1还是0。示例分别向第0字节的第0和2bit写入1和0,向第3字节的第5个Bit写1。

安全数据区域:对otp区域进行读写操作。如读取AES加密用密钥。

"name":              "flash_aes_key",
"mode":              "read",
"start_addr":        "0x4B100460",
"last_valid_addr":   "0x4B100480",
"byte_len":          "0x20",
"data":              "",
"data_type":         "hex",
"status":            "true"

通过CPU读写寄存器

通过CPU读写寄存器可以实现前述的四种操作,将OTP,Efuse作为一般外设来进行操作。 需要进入Armino的Cli窗口。在otp driver初始化之后,输入otp write/read location data命令,如 otp write 156 0x1234,即可在location 156的otp区域写入数据0x1234。 如需更改权限等操作,可以参考cli端的help。

配置 BL1 公钥 HASH

Public key hash地址为 0x4B100528~0x4B100548,内容为(low)2af1f2236872981bdf2f17975fb3029fad171de61741a383ef2c621fd5f5cf62(high) 如下图所示在config的security data区域中添加相应字段。

8

配置 BL2 公钥 HASH

配置 FLASH AES KEY

如下图所示在config的security data区域中添加相应字段。

8

配置示例

如图所示,在User_operate区域添加一个字段,写入6个字节BK7258,以ascii码的方式解析,

8