系统安全基石IP-OTPC :OTPC的概述与工作原理
前言
OTP是为设备提供一次性编程功能的模块。
这种编程的结果是非易失性的,并且与闪存不同,无法逆转。OTP功能通过开源OTP控制器和专有OTP IP构建。
OTP控制器提供:
•一个开源抽象接口,软件可以使用它与下面的专有OTP块进行交互。
•一种开源抽象接口,硬件组件(例如生命周期控制器和密钥管理器)可以使用该接口与下面的专有OTP块进行交互。
•高级逻辑安全保护,如完整性检查和对敏感内容的加扰。
• OTP内容可读和可编程时的软件隔离。
专有OTP IP提供:
•可靠的非易失性存储。
•技术特定的冗余或纠错机制。
•物理防御特征,如SCA和FI抵抗。
OTP控制器和IP一起提供了在设备的整个生命周期(LC)中使用的安全一次性编程功能。
特征
•底层OTP IP的多个逻辑分区
•每个分区都可锁定并检查完整性
•完整性摘要存储在每个逻辑库旁边
•OTP值的定期/持续检查
•定期检查阴影内容与摘要
•定期检查OTP存储的内容和阴影内容
•持续检查即时错误
•独立的生命周期分区和与生命周期控制器的接口
•支持生命周期功能,但不能被完整性锁定
•使用全局网表常量对秘密OTP分区进行轻量级加扰
•用于RAM加扰机制的轻量级短暂密钥派生功能
•FLASH加扰机制的轻量级密钥推导功能
OTP控制器概述
OTP的功能分为开源和闭源两部分,两者之间有明确的边界,如下面简化的高级框图所示。
在这里插入图片描述
开源控制器的任务是为OTP用户提供一个通用的、非技术特定的接口,该接口具有通用寄存器接口和明确定义的硬件I/O接口。
开源控制器实现了OTP存储的逻辑隔离和分区,使用户可以将OTP的不同功能划分为具有不同属性的“分区”。
最后,
•开源控制器通过为每个分区提供完整性摘要,
•并在需要时对分区进行加扰,
•为特定分区提供了高级别的安全性。
另一方面,专有IP将通用访问接口转换为技术特定的OTP接口,用于功能访问和调试访问(例如对宏内部控制结构的寄存器访问)。
这种分离意味着每个专有的OTP IP都必须实现从标准化OpenTitan接口到底层模块的转换层。
这也意味着,无论OTP存储或文字大小在下面如何变化,开源控制器都必须提供一致和连贯的软件和硬件接口。
这个标准化接口将在下文中进一步定义,包装器利用OpenTitan其他部分中使用的相同技术原始机制来包装和抽象可能是闭源的技术特定宏(如存储器和时钟单元)。
工作原理
从概念上讲,OTP功能处于高级,分为“前端”和“后端”。
•“前端”包含逻辑分区,这些分区为系统的硬件和软件使用者接口提供信息。
•“后端”表示硬件和软件组件用来存储即将到来的值的编程接口。
下图说明了这种行为模型。
在这里插入图片描述
请注意,前端同时包含缓冲分区和非缓冲分区。
每个电源循环感应一次缓冲分区,并将其内容存储在寄存器中,而按需读取未缓冲分区。
前者通常是包含硬件配置位、关键材料和生命周期状态等数据的分区,这些数据需要始终可用于硬件,
而后者是很少访问的大型分区,例如软件配置。
通过编程接口(与读取验证相结合)编程到缓冲分区中的值只是“暂存”的,直到下一次电源循环才生效。
下面的部分描述了OTP控制器的各个部件的操作以及它如何支持所描述的功能。
Logical Partitions
OTP在逻辑上被划分为表示不同功能的分区。这意味着隔离是虚拟的,由OTP控制器而不是底层OTP IP来维护。
在每个逻辑分区中,都有特定的可执行属性:
•通过秘密分区进行保密
•这控制特定分区是否包含机密数据。
•如果分区是秘密的,那么一旦锁定,软件就无法读取分区,并在存储中进行加扰。
•读取锁定能力
•这控制特定分区是否禁用后期软件的软件可读性。
•一些分区可以静态锁定(通过在OTP中计算和存储相关摘要),其他分区可以在运行时通过CSR读取锁定。
•写入锁定能力
•这控制分区是否被锁定并阻止将来更新。
•锁定分区与摘要一起存储,以便稍后用于完整性验证。
•完整性验证
•一旦分区通过计算并向其写入非零摘要而被写锁定,它就可以进行周期性验证(时间范围可由软件配置)。这种验证有两种形式,分区完整性检查和存储一致性检查。
由于OTP本质上类似于存储器(每个地址位置只输出一定数量的位),一些逻辑分区被缓冲在寄存器中,用于硬件的即时和并行访问。
这是一个关键点,因为在通电之后,这些特定的OTP内容被存储在触发器中并来源于系统。
也就是说,缓冲分区不是直接来自OTP宏本身。因此,易失性存储器(OTP控制器)和非易失性存储(OTP IP)的安全性变得重要。
分区列表和描述
OpenTitan的OTP控制器包含如下所示的七个逻辑分区。
在这里插入图片描述
一般来说,设备的生产生命周期分为5个阶段“制造”->“校准和测试”->“供应”->“任务”->“RMA”。OTP值通常在“校准和测试”、“供应”和“RMA”阶段进行编程,
校准和测试-Calibration and Test
在此阶段,对设备进行功能测试和校准,以确保一致性。
校准可以集中在许多事情上,但通常以调整时钟、电压和定时源为中心,以消除工艺变化。
这些校准值被编程到CREATOR_SW_CFG分区中,因为它们是非机密值,旨在由软件读出并编程到相应的外围设备中。
在这个阶段的早期,各种tokens 也被编程到秘密分区中,并由芯片厂商创造者读出使用。
预配置-Provisioning
在此阶段,为设备提供最终固件和“唯一”种子或标识。
秘密分区填充有根秘密和密钥,这些密钥对建立设备标识至关重要。
作为注入最终固件的一部分,还对库存单元特定的硬件和软件配置进行了编程。
生命周期划分-Life Cycle Partition
生命周期分区在所有阶段都是活动的,因此它是唯一不能锁定的分区。
设备完成供应并投入生产后,必须保留在发生意外故障时转换回RMA的能力。
为了支持这种转换,生命周期状态和计数器必须始终是可更新的。
生命周期控制器是芯片互连总线上的外围设备模块,因此遵循可组装性规范。
生命周期实施是指包含所有生命周期功能的设计。这涉及以下模块的功能,这些模块未按特定顺序列出:
•The life cycle controller itself - A new peripheral
•The key manager
•The flash controller
•The OTP controller
•The reset / power controller
•The debug infrastructure, specifically TAP isolation
•Any other peripheral where life cycle information may alter its behavior
生命周期控制器提供以下功能:
•专用OTP接口,用于读取和更新冗余编码的设备生命周期状态。
• CSR和JTAG接口,用于启动生命周期转换。
•冗余生命周期状态的专用并行解码和冗余编码的生命周期资格信号的广播(例如,启用DFT功能或主处理器)。
•一种令牌哈希和匹配机制,用于保护重要的生命周期转换。
•警报子系统的升级接收器,它允许作为升级序列的一部分使生命周期状态无效(另请参阅警报处理程序子系统)。
Locking a Partition
当软件确定不再对某个分区进行任何更新时,对该分区的写入访问可以被永久锁定。
为了锁定,完整性常数与该分区的其他数据一起计算和编程。
完整性常数的大小取决于分区大小颗粒,是32位还是64位(另请参阅直接访问内存映射)。
一旦“完整性摘要”为非零,就不允许进行进一步的更新。如果分区是秘密的,软件将无法再读取其内容(请参阅秘密分区描述)。
但是,请注意,在所有分区中,摘要本身总是可读的。这使软件有机会确认锁定操作是否正确进行,如果没有,则立即报废零件。
完整性摘要的计算取决于分区是否需要定期的后台验证。
供应商测试分区
供应商测试分区旨在用于制造流程中的OTP编程冒烟检查。
芯片供应商可以在prim_otp包装器的专有版本中实现这些检查。
此分区的行为与任何其他SW分区类似,但ECC不可纠正的错误不会像在所有其他分区中那样导致致命错误/警报。
这是由于OTP编程烟雾检查的性质,这可能使某些OTP字处于与OTP读出时使用的ECC多项式不一致的状态。
Software Configuration Partitions
软件配置分区用作标志、配置和校准数据的非易失性存储器。
因此,作为代码执行的一部分,这个分区的内容通常被消耗一次,或者被移动到设计中的另一个存储隔间。
例如,时钟校准值和LDO校准值在启动时编程到模拟传感器顶部(AST)。
因此,没有必要在OTP源处定期检查。相反,软件可以简单地作为安全引导的一部分进行检查,并在将这些值编程到外围设备中时采取其他措施。
因此,对于该分区,软件有责任计算完整性摘要并将其编程到OTP中。在主内存中对该分区(部分)进行阴影处理也是合理的,并且OTP内容不会对硬件产生直接影响。
Hardware Configuration and Secret Partitions
硬件和秘密分区直接影响下游硬件。
内容必须经过定期的完整性检查,因此当软件提供锁定意图时,存储的摘要由硬件计算(而不是必须由软件计算摘要的软件分区)。
生命周期划分
生命周期分区无法锁定,因此不会包含存储的摘要。然而,请注意,只有生命周期控制器可以访问该分区,即,直接访问接口(DAI)不能从生命周期分区读取或写入。
Secret vs Non-Secret Partitions
非机密OTP分区保存可以公开的数据;或对安全性没有影响的数据。例如,锁定位的当前值或时钟校准值。这些值以明文形式存储在OTP中。
机密分区包含对安全至关重要的数据,例如FLASH加扰密钥、设备根机密和解锁令牌。这些值被加扰地存储在OTP中,并且在读取时被解扰。目前使用的密码是PRESENT,因为它很适合迭代分解,而且它是一种已被证明的轻量级分组密码(另请参阅PRESENT加扰原语。然而,分组密码的使用意味着秘密分区只能写入64位块。
此外,特定秘密分区的内容一旦被锁定就不能被软件读取(除了必须始终可读的摘要之外);而非秘密分区总是可读的,除非软件明确地去除读取可访问性。
不幸的是,机密分区必须使用全局网表密钥进行加扰操作,因为没有其他非易失性存储器来存储唯一密钥。
Partition Checks
Integrity
一旦锁定了适当的分区,硬件完整性检查器就采用两种完整性检查来验证易失性缓冲寄存器的内容:
•所有缓冲分区都有额外的ECC保护(每个64位块有8位ECC),同时进行监控。
•分区的摘要以半随机间隔重新计算,并与存储在分区旁边的摘要进行比较。
此检查的目的不是在存储触发器和OTP之间进行检查,而是检查缓冲寄存器内容是否与计算的摘要保持一致。此验证主要关注存储触发器是否经历过故障攻击。此检查仅适用于HW_CFG和SECRET*分区。
如果遇到故障,OTP控制器将发出致命检查错误警报-fatal_check_error,并将其所有硬件输出重置为默认值。
Storage Consistency
这种验证确保存储在缓冲寄存器中的值与OTP中的值保持一致。
该过程以半随机间隔重新读取OTP,并确认读取的值与存储的值相同。
注意,如果存在并行的完整性检查,则某些分区没有必要检查所有读取内容的一致性。
如果存在完整性摘要,则只需要读取该摘要;否则,必须读取所有值。
Secret Partition Integrity Checks-秘密分区完整性检查
由于秘密分区是加扰存储的,这也意味着完整性摘要是在加扰形式上计算的。
为了平衡所需的缓冲寄存器数量,缓冲寄存器中只保存秘密分区的解密形式。
硬件通过在通过摘要之前对数据进行重新加扰来计算摘要。
Power-up and Sense
重置释放时,OTP控制器分区存储必须输出指定的安全默认值(它不像空白OTP那样总是0)。此默认输出必须保持,直到OTP控制器完成所有检查。
OTP控制器读取OTP IP。如果读取通过OTP IP内部检查(例如ECC或冗余),则更新分区存储;然而,输出仍然经由输出mux保持在默认状态。
在所有读取完成后,OTP控制器对HW_CFG和SECRET*分区执行完整性检查。
如果分区在这一点上没有通过完整性检查,它将在状态CSR中发出初始化错误的信号,并中止进一步的初始化。
在所有完整性检查完成后,OTP控制器释放输出门控并将输出标记为有效。但是,任何标有“error”的分区都会继续将其输出保持在默认状态。
一旦完成上述步骤,缓冲寄存器中的分区存储就不会再次更新(通过生命周期接口更新生命周期分区除外)。也就是说,通过编程接口编程到OTP的值在下一次电源循环之后才会在缓冲寄存器中可见。
在这一点上,分区存储的输出预计不会改变,除非定期检查突然失败。发生此故障时,所有输出都将恢复到默认状态,并立即向警报处理程序触发警报。
出于定时目的,OTP输出可以被视为半静态,因为这种错误事件应该是罕见和特殊的。
Partition Defaults
分区默认值是特定于上下文的。例如,锁定特定访问的硬件配置项应默认为“无访问”。这确保了对OTP的故障攻击不能轻易地将设计恢复到不安全状态。
因此,这表明,当OTP都是0和1时,它应该尽可能在受影响项目的编码空间中反映无效或惰性状态。这也意味着使用代理的重置状态(例如密钥管理器和生命周期)也应默认为无效/惰性状态。
Program and Read Ports
如前所示,OTP分为前端和后端。后端接口主要用于更新OTP内容,并读取以进行调试和验证。尽管是与逻辑分区分离的功能访问端口,但程序和读取端口受到相同的访问控制。
当分区被写锁定时,编程访问被禁止。如果分区是秘密的,则后端接口的读取访问也被禁止(摘要必须始终可读)。软件还可以通过CSR设置禁用对软件配置分区的任何读取访问,以防止后期软件读取任何内容。
上述情况的例外是生命周期分区。生命周期控制器接口还充当“后端”接口,始终具有编程访问权限,以确保生命周期状态可以提前。
请注意,程序和读取端口可能与正在进行的后台存储检查冲突,OTP控制器在这两方之间进行仲裁。将始终完成正在进行的操作。之后,或者当两个请求同时到达时,优先级为生命周期>编程接口>通过CSR窗口的按需读取访问>背景检查。
Programming the OTP
OTP控制器有两条编程路径:
•通过软件的功能编程路径(程序端口),
•通过硬件的生命周期编程路径。
功能接口用于更新除生命周期之外的所有分区。如前所述,在下一次重新启动之前,当前电源周期中进行的任何更新都不会反映在缓冲分区中。
生命周期接口仅用于更新生命周期状态和转换计数器。命令是从生命周期控制器发出的,类似地,成功或失败的指示也被发送回生命周期控制器。与功能接口类似,生命周期控制器每个电源周期只允许一次更新,并且在请求的转换之后恢复到惰性状态,直到重新启动。
请注意,req/ack协议在OTP时钟上运行。扰频设备的任务是通过实例化prim_sync_repack.sv原语来同步握手协议,如下所示。
在这里插入图片描述
OTPC对接的信号
•EDN Interface(随机数熵,之前我们发过哦)
•Power Manager Interface
•Life Cycle Interfaces
•Interface to Key Manager(OTP里面存储了一些密钥,肯定要使用到Key Manager)
• Interface to Flash Scrambler 到FLASH加扰设备的接口是一个简单的req/ack接口,该接口为闪存控制器提供用于数据和地址加扰的两个128位密钥。用来加扰解扰内存
在这里插入图片描述
•Interfaces to SRAM and OTBN Scramblers
-
控制器
+关注
关注
112文章
16191浏览量
177360 -
编程
+关注
关注
88文章
3587浏览量
93585 -
OTP
+关注
关注
4文章
184浏览量
47098
原文标题:工作原理
文章出处:【微信号:IP与SoC设计,微信公众号:IP与SoC设计】欢迎添加关注!文章转载请注明出处。
发布评论请先 登录
相关推荐
评论