Efuse与Security Engine

1、eFUSE

所有支持 Secure Boot 的 CPU 都会有一块很小的一次性编程储存模块,我们称之为 FUSE 或者 eFUSE,因为它的工作原理跟现实中的保险丝类似:CPU 在出厂后,这块 eFUSE 空间内所有的比特都是 1,如果向一个比特烧写 0,就会彻底烧死这个比特,再也无法改变它的值,也就是再也回不去 1 了。

一般 eFUSE 的大小在 1KB 左右,OEM 从 CPU 厂家购买了芯片,组装了产品后,一般都要焼写 eFUSE 的内容,包括产品的运行模式:测试、开发、生产等。面向终端消费者的产品都会被焼写为生产模式。这个模式下 bootROM 会禁用很多权限,更大面积地限制用户的能力。

另外一个很重要的焼写内容就是根密钥了,一般有两种根密钥:一个是加密解密用的对称密钥 Secure Boot Key,一般是 AES 128 的,每台设备都是随机生成不一样的;另一个是一个 Secure Boot Signing Key 公钥,一般用的 RSA 或 ECC,这个是每个 OEM 自己生成的,每台设备用的都一样,有些芯片会存公钥的 Hash 来减少 eFUSE 的空间使用。

只有 Secure World才能访问 eFUSE 的寄存器。除了读写 eFUSE 的基础寄存器之外,还有一些控制寄存器可以禁止别的程序访问 eFUSE,来保护其中的密钥。因此 eFUSE 中的根密钥以及 bootROM 将作为 Secure Boot 的根信任。

2、Security Engine

有些 CPU 中还会有一个专门负责加密解密的模块,我们称为 Security Engine。这个模块也是只有在 Secure World 中才能访问。这个模块通常会有若干个密钥槽(Keyslots),可以通过寄存器将密钥加载到任意一个 Keyslot 当中,Keyslot 的加载操作将复盖之前加载过的密钥。通过寄存器操作 DMA 读写,可以使用 Keyslot 中的密钥对数据进行加密、解密、签名、HMAC、随机数生成等操作,但是没有办法从一个 Keyslot 中读取已经加载的密钥值。

### eFuse 在 IT 领域中的作用实现方式 #### 1. eFuse 的基本概念 eFuse 是一种基于一次性可编程 (OTP) 技术的非易失性存储器 (NVM),广泛应用于嵌入式系统中用于数据的安全存储和配置管理。它通过模拟熔丝的工作机制,在硬件层面提供了一种不可逆的数据写入能力[^3]。 #### 2. eFuse 的工作模式 eFuse 模块支持三种主要的操作模式,分别是编程模式、读取模式以及非活动模式。这些模式的选择依赖于编程使能信号 (PGMEN) 和读取使能信号 (RDEN) 的逻辑状态组合: - **编程模式(Program Mode)**: 此模式下,特定位置的熔丝被永久烧断以记录数据。该过程通常是不可逆的,因此需要严格控制以防止误操作。在此模式下,地址输入允许有效,但一旦启动则不得更改直至完成。 - **读取模式(Read Mode)**: 用户可以通过此模式访问已编程的数据位。此时 RDEN 被激活而 PGMEN 处于低电平状态,确保不会触发任何写入动作。 - **非活动模式(Inactive Mode)**: 当既无读也无写的请求时进入此默认状态。所有控制线均保持在安全级别上以防意外触碰其他两种敏感功能之一。 #### 3. 实现细节及注意事项 为了保障可靠性和安全性,在实际应用过程中需遵循若干重要准则: - 编程使能(PGMEN)读取使能(RDEN)不应同时置高以免引发冲突; - 地址启用(AEN)仅限于处于合法操作期间方可设为高电平之外其余时间都应维持低位; - 不得尝试跨越不同阶段之间直接跳转比如从READ立即转入PROGRAM反之亦然因为这可能导致不确定行为甚至损坏设备结构本身; #### 4. 应用场景 由于其独特属性——即单次写多频度查特性加上物理级防篡改优势使得EFUSE非常适合用来保存那些一经设定便不宜再轻易变动的关键参数诸如加密密钥序列号或者版权保护标志等等尤其对于注重信息安全性的现代计算环境而言更是不可或缺的一部分[^1][^3]。 ```python # 示例代码展示如何简单模拟 EFUSE 控制逻辑 class EfuseController: def __init__(self): self._pgmen = False self._rden = False self._aen = False @property def pgmen(self): return self._pgmen @pgmen.setter def pgmen(self,value): if value and self.rden: raise ValueError("Cannot set both PGMEN and RDEN high.") self._pgmen=value @property def rden(self):return self._rden @rden.setter def rden(self,value): if value and self.pgmen :raise ValueError("Cannot set both PGMEN and RDEN high.") self._rden=value controller=EfuseController() try: controller.pgmen=True except Exception as ex: print(f"Error:{ex}") finally: pass ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值