文章目录
- 前言
- 一、术语
- 二、前言
- 三、算法
- (一)、加密/解密
- (二)、MAC生成/验证
- (三)、压缩函数
- (四)、密钥派生KDF
- 四、数据存储
- (一)、 存储槽的安全标志
- 1、存储槽写保护
- 2、启动失败时禁用密钥
- 3、调试器激活时禁用密钥
- 4、禁用通配符更新密钥
- 5、密钥用途判定
- 6、明文密钥标志
- (二)、 非易失性存储槽
- 1、MASTER_ECU_KEY
- 2、BOOT_MAC_KEY
- 3、BOOT_MAC
- 4、KEY_< n >
- 5、PRNG_SEED
- (三)、 易失性存储槽
- 1、RAM_KEY
- 2、PRNG_KEY
- 3、PRNG_STATE
- (四)、 只读存储槽
- 1、SECRET_KEY
- 2、唯一标识符 UID
- (五)、 存储槽标识
- 五、随机数生成
- (一)、 种子生成
- 1、基于伪随机数发生器(PRNG)生成种子
- 2、基于真随机数发生器(TRNG)生成种子
- (二)、随机数生成
- (三)、种子扩展
- 六、状态寄存器
- 七、用户可访问的函数
- 八、错误码
- 九、存储器更新协议
- (一)、存储器更新协议说明
- (二)、更新后验证消息生成说明
- 十、安全启动
- 十一、SHE 失效分析与复位
- 十二、SHE 内部使用的常量
- 十三、例子
- 十四、概览表
- 十五、参考资料
- 总结
前言
本文介绍CP AUTOSAR里的安全硬件扩展(SecureHardwareExtensions)技术规范,该规范定义车载MCU片上安全硬件模块的功能、接口、密钥管理与安全机制,用于抵御软件攻击、保障车载系统安全。
SHE(Secure Hardware Extension),被应用在车端ECU中负责安全存储与安全计算。是由HIS(由Audi、BMW、Porsche、Volkswagen组成)制定的标准,中文意思“安全硬件扩展”, 是对任何给定微控制器的片上扩展。它旨在对加密密钥的控制从软件域移到硬件域,从而保护这些密钥免受软件攻击。
一、术语
HIS(Hersteller Initiative Software)
德国汽车厂商软件联盟,SHE最初由HIS制定。
SHE(Security Hardware Extension)
安全硬件扩展,车载MCU轻量级安全模块。
AES(Advanced Encryption Standard)
高级加密标准,SHE核心算法(固定AES-128)。
TPM(Trusted Platform Module)
可信平台模块,高等级安全芯片,SHE为低成本替代方案。
CBC(Cipher Block Chaining)
密码分组链接模式,AES常用加密模式。
ECB(Electronic Code Book)
电子密码本模式,AES基础分组加密模式。
MAC(Message Authentication Code)
消息认证码,验证数据完整性与真实性。
CMAC(Cipher-based Message Authentication Code)
基于密码的消息认证码,SHE指定MAC算法。
IV(Initialization Vector)
初始化向量,用于CBC等模式加解密。
UID(Unique IDentification item)
芯片唯一标识符,SHE用于身份与密钥绑定。
TRNG(True Random Number Generator)
真随机数发生器,物理熵源生成随机数。
PRNG(Pseudo Random Number Generator)
伪随机数发生器,算法生成随机数。
二、前言
安全硬件扩展(SHE)是任意微控制器的片上扩展模块。其设计目的是将密码密钥的控制权从软件域转移到硬件域,从而保护这些密钥免受软件攻击。但本规范并不要求SHE替代高安全等级方案(如TPM芯片或智能卡),即不要求具备物理防篡改能力。
本设计的主要目标如下:
保护密码密钥免受软件攻击,
提供可信的软件运行环境,
使安全性仅依赖于底层算法强度与密钥的保密性,
支持分布式密钥所有权,
保持高灵活性并降低成本。
SHE基本由三个组件构成:用于保存密码密钥及相关附加信息的存储区域、分组密码算法(AES)实现,以及连接上述模块与微控制器CPU的控制逻辑。简化的逻辑框图见下图。SHE可通过多种方式实现,例如有限状态机或专用小型CPU内核。
需要注意的是仅将SHE集成到微控制器中,并不能解决所有安全漏洞,必须配合应用软件与安全流程使用。
在ECU中,有一块单独的 Secure Zone。Secure Zone里是SHE模块。SHE包括Control Logic、AES、Memory、PRNG,并仅与CPU通讯。同时,SHE必须被实现为微控制器的片上外围设备。 除了上图中明确指定的连接之外,SHE不能有任何其他连接。如果必须包括额外的资源以确保芯片制造过程中的正常功能,则所有端口都要求在物理上停用(如可以通过外部引脚访问)。 SHE可以通过多种方式连接到CPU,如:通过专用接口或内部外围总线,互连必须以其他外设或外部实体不能修改CPU和SHE之间传输数据的方式实现。SHE不需要在特殊工艺中制造以提高安全性, 也不需要采取任何措施来增强系统抵御物理攻击,如:蚀刻芯片外壳打开、差分功率分析、错误注入攻击等。
当用于软件和硬件调试的内部或外部调试器被接入并激活时,SHE必须通过状态信号收到通知。典型调试器包括JTAG、BDM等。
三、算法
SHE的所有密码操作均由AES‑128执行。单块数据加解密(含密钥编排)的AES延迟必须<2μs。
同时,AES性能必须足够高,以支持微控制器安全启动:至少校验32KB、最大128KB(或Flash容量的5%)的代码,耗时<10ms。
若Flash速度达不到要求,则必须由Flash作为性能瓶颈,并在数据手册中明确说明该限制。
(一)、加密/解密
SHE必须支持:
ECB模式:处理单块数据。
CBC模式:处理大量数据。
两种模式的延迟均不得超过2μs。
SHE仅能处理AES块长度的整数倍数据,所有必要的填充由应用层完成。输入、输出、密钥以及任何中间结果,CPU均不可直接访问;必须由SHE控制逻辑根据策略授权访问。
(二)、MAC生成/验证
MAC生成与验证必须采用基于AES‑128的CMAC实现,遵循相关标准规定。
(三)、压缩函数
SHE 内部使用以 AES 为分组密码的 Miyaguchi‑Preneel 结构作为压缩函数。消息在送入压缩算法前必须预处理:填充并切分为 128 位块。
填充规则:在比特长度为 l 的消息 M 后追加 1 个比特‘1’,再追加 k 个比特‘0’,其中 k 是满足 l+1+k ≡ 88 mod 128 的最小非负整数。最后追加一个 40 位块,其值等于消息长度 l 的无符号二进制表示。
填充后的消息被切分为 n 个 128 位块 x₁、x₂、…、xₙ。初始向量 IV 记为 OUT₀。
(四)、密钥派生KDF
密钥派生基于上述 Miyaguchi‑Preneel 压缩算法实现。派生密钥通过对密钥 K + 常量 C’ 做正确预处理后压缩得到:
四、数据存储
SHE 需要存储器来保存密钥和消息认证码(MAC)。
必须配备非易失性存储器,用于存储微控制器掉电与复位后仍需保持的信息。
必须配备易失性存储器,用于存储临时信息,易失性存储器复位或掉电时内容会丢失。
SHE 的存储器只能由 SHE 控制逻辑访问。CPU 或任何其他外设(包括调试和测试设备),只要不打开芯片封装,均不应能够访问该存储器。
如果来自和存入 SHE 非易失性存储器的数据需要通过与其他外设共用的总线进行传输,并且无法保证这些数据不会被其他任何实例读取或修改,那么就必须采取以下措施,以确保这些措施不会影响 SHE 的任何功能:
1、SHE 内部必须额外存储一个独立密钥,该密钥需满足相关要求。
2、所有数据在送上总线前,必须使用该密钥以 AES-ECB 模式加密,读取时相应解密。
即密钥不能被明文读取。
3、只有 SHE 能对存储器执行写操作,在 SHE 读写期间,必须禁止其他外设对 SHE 与存储器之间的连接执行写操作。
CPU只能从SHE中读取RAM_KEY,而且是M1M2M3格式,不是明文数据,不能读取NV块的密钥。
在 CPU 访问微控制器的其他公用 / 非公用存储块时,SHE 必须能够独立对该存储器进行读写,也就是说,存储接口支持分时复用,但不允许 SHE 在完整操作期间阻塞 CPU。
SHE 的持久性存储器被划分为称为存储槽(memory slot)的逻辑块。每个槽位宽度为128 位,另加最多 5 个安全位,以及一个最大 2²⁸状态的饱和无符号计数器。这些分段必须可独立擦写,即修改某一存储槽时,不得影响其他槽位。
注:每个槽位包含三部分:实际的密钥、保护位、计数器,计数器用于在更新时抵御重放攻击。
若写入操作因断电等中断而失败,必须采取措施保留非易失性存储槽的当前值。写入操作必须按原子操作处理:无论如何,存储器中只保留旧值或新值,但不能有损害区域。写入操作本身也不可被中断。
所有非易失性存储槽的初始值必须在数据手册中明确给出,接下来称其为空状态。
注意:SHE 的功能依赖于对空内存单元的检测。如果底层技术无法区分已擦除单元和写入相同逻辑值的单元,那么该实现就必须为每个存储单元引入另一个状态位,以便进行检测。这个额外的状态位必须以透明的方式处理给用户使用。
注意:内存插槽的初始值必须与内存更新协议章节描述的结合使用,以初始化 SHE。
每个非易失性存储器插槽的计数值在生产完成后必须为零。
必须保证对非易失性存储器进行至少 100 次成功的写入操作。
根据具体的实现方式,每个内存插槽所能支持的写入循环次数都会有所不同。
下图对SHE中实现的所有密钥进行了概述。
(一)、 存储槽的安全标志
协议中传输标志位时:
0:表示未置位。
1:表示已置位。
各密钥由哪些安全位进行保护见下表:
1、存储槽写保护
WRITE_PROTECTION。
非易失性密钥可被写保护:一旦保护生效,即使知道对应密钥,也无法再修改该密钥。
写保护不可逆。
写保护标志存储在仅 SHE 可访问的非易失性存储器中,由 SHE 状态机在写操作时校验。
若某标志对当前密钥不适用,在协议中传输时必须填 0,SHE 忽略该位。
出厂时所有密钥的该标志均未置位。
2、启动失败时禁用密钥
BOOT_PROTECTION。
当安全启动机制检测到软件被篡改,或启动流程被其他启动方式绕过(如通过外部接口引导)时,可单独禁用对应非易失性密钥。
仅在下一次成功启动后,该存储槽才能重新激活。
密钥禁用后,SHE 拒绝在任何操作中使用该存储槽(明确允许的除外)。
保护状态存于仅 SHE 可访问的非易失性区域,由 SHE 状态机在读写时校验。
出厂时所有密钥的该标志均未置位。
3、调试器激活时禁用密钥
DEBUG_PROTECTION。
当调试器(如 JTAG、BDM)接入,或在安全启动已激活的情况下通过外部接口引导而未让 SHE 做启动校验时,可单独禁用对应非易失性密钥。
仅在复位后才能重新激活该存储槽。
密钥禁用后,SHE 拒绝在任何操作中使用该存储槽(明确允许的除外)。
保护状态存于仅 SHE 可访问的非易失性区域,由 SHE 状态机在读写时校验。
出厂时所有密钥的该标志均未置位。
4、禁用通配符更新密钥
WILDCARD。
该标志决定是否允许不提供有效 UID、而使用特殊通配符来更新密钥。
标志置位时不允许使用通配符。
出厂时所有密钥的该标志均未置位。
5、密钥用途判定
KEY_USAGE。
该标志用于指定密钥用于加解密还是 MAC 生成 / 验证。
标志置位时:密钥用于 MAC 生成 / 验证。
该标志仅需为 KEY_< n > 实现。
对不适用的密钥,协议传输时填 0,SHE 忽略。
6、明文密钥标志
该标志仅需为 RAM_KEY 实现。
当以明文方式加载密钥到 KEYRAM_KEY 时,由 SHE 置位该标志。
导出 KEYRAM_KEY 前会校验该标志。
当通过安全协议加载密钥时,该标志清零。
(二)、 非易失性存储槽
密钥及对应策略在下文详细说明。
非易失性存储槽必须具备空槽检测机制:即能识别擦除后或出厂后未写入密钥的槽位。
空存储槽不可用于任何功能,仅可通过密钥更新协议写入密钥。
1、MASTER_ECU_KEY
用途:仅用于更新 SHE 内部其他存储槽。
更新条件:需持有当前 MASTER_ECU_KEY。
受保护:写保护、启动失败禁用、调试器激活禁用、通配符禁用。
出厂状态:空。
2、BOOT_MAC_KEY
用途:安全启动机制中验证软件的真实性;也可用于验证 MAC。
更新条件:需持有 MASTER_ECU_KEY 或当前 BOOT_MAC_KEY。
受保护:写保护、调试器激活禁用、通配符禁用。
出厂状态:空。
3、BOOT_MAC
用途:存储安全启动所需的 Bootloader MAC,仅对 SHE 启动机制可见。
非机密信息,但按密钥统一管理以简化使用。
更新条件:需持有 MASTER_ECU_KEY 或 BOOT_MAC_KEY。
受保护:写保护、调试器激活禁用、通配符禁用。
出厂状态:空。
4、KEY_< n >
用途:用于应用层的通用批量数据处理。
数量:n=3~10,SHE 至少实现 3 个、最多 10 个。
用途配置:编程时通过密钥用途标志设定为加解密或 MAC 操作。
更新条件:需持有 MASTER_ECU_KEY 或当前 KEY_。
受保护:写保护、启动失败禁用、调试器激活禁用、通配符禁用、密钥用途标记。
出厂状态:空。
5、PRNG_SEED
用途:存储伪随机数发生器种子。若采用 TRNG 方案则该槽非必需。
访问限制:仅可通过 CMD_INIT_RNG 访问。
出厂要求:芯片制造时由认证过的物理随机数发生器(如 HSM)初始化,至少满足 BSI P2 级要求。
说明:掉电 / 复位后通常需要重新计算种子。
(三)、 易失性存储槽
复位或上电时自动清零。
不受锁定机制保护。
1、RAM_KEY
用途:通用临时密钥。
加载方式:可通过 KEY_< n > 安全加载,或直接明文加载。
导出限制:仅明文加载的 RAM_KEY 可导出(CMD_EXPORT_RAM_KEY),安全协议加载的不可导出。
说明:由于加载到 RAM_KEY 中的密钥是外部存储的,所以 SHE 不完全控制它们,存在重放、拒绝服务等攻击风险,需在应用设计中考虑。
2、PRNG_KEY
用途:伪随机数发生器内部使用,用户不可直接访问。
可选:可放在非易失性存储器,此时需按 SECRET_KEY 同等方式生成、写入与保护。
3、PRNG_STATE
用途:保存伪随机数发生器状态,用户不可直接访问。
(四)、 只读存储槽
在控制器的整个生命周期内,定义了两个只读内存插槽。所谓“只读”意味着它们至少受到控制器逻辑的保护,即在生产过程中可以进行写入操作,但在离开制造环节之后则不能再进行写入。
1、SECRET_KEY
SHE 必须包含一个唯一密钥 SECRET_KEY,不可仅从序列号等公开信息推导而来。
由芯片厂商在制造阶段写入,不得在 SHE 外部保存。
安全等级:至少满足 BSI P2 级,由认证物理随机数发生器生成。
用途:仅用于密钥导入 / 导出。
2、唯一标识符 UID
SHE / 微控制器必须包含唯一标识(序列号),长度最多 120 位。直接由 SHE 控制逻辑访问。
长度不足 120 位时,在高位补 0。
出厂要求:芯片制造时写入,不可为全 0,全 0 保留为通配符 UID。
格式:无强制格式,可复用已有序列号,同厂商芯片唯一即可。
可导出给片上其他组件使用,但不得影响 SHE 运行与状态。
(五)、 存储槽标识
所有用户可访问的存储槽用四位数的值寻址,内部物理寻址可不同。密钥地址见下表:
五、随机数生成
SHE 必须包含伪随机数发生器(PRNG)。种子可通过本章描述的两种方式之一生成(实现其中一种即可)。
随机数不得直接由真随机数发生器(TRNG)直接输出。
注意:出于密码学安全考虑,P1 中等强度的真随机数发生器(TRNG)不可直接用于 SHE。即使是具备高质量物理随机源的智能卡或高端安全方案,通常也至少需要对 TRNG 输出做压缩处理。
注意:本伪随机数发生器设计用于以恒定质量生成认证挑战随机数,速率仅受底层算法(AES)性能限制。
(一)、 种子生成
1、基于伪随机数发生器(PRNG)生成种子
种子是一个 128 位非易失性值,用作随机数发生器的输入。
通过调用命令 CMD_INIT_RNG 更新种子。
更新种子的过程:
会使用从 SECRET_KEY中获取的 PRNG_SEED_KEY_C来生成一个派生密钥,
用派生密钥加密 PRNG_SEED,结果先写入 PRNG_SEED,写入完成后再传入 PRNG_STATE。
PRNG_SEED_KEY = KDF(SECRET_KEY, PRNG_SEED_KEY_C)
PRNG_SEEDi = ENC_ECB, PRNG_SEED_KEY(PRNG_SEEDi-1)
若 PRNG_KEY 采用易失性存储槽实现,则运行PRNG所需的密钥必须由 SECRET KEY和PRNG KEYC生成。
PRNG_KEY = KDF(SECRET_KEY, PRNG_KEY_C)
2、基于真随机数发生器(TRNG)生成种子
TRNG 必须在芯片额定的所有工作条件下,至少满足 P1 中等等级要求。
种子是 128 位值,用作随机数发生器输入,生成后存入 PRNG_STATE。
通过调用命令 CMD_INIT_RNG 生成种子。
种子熵值至少 80 位:若 TRNG 输出熵值不足,需收集足够熵并进行压缩。芯片厂商需在手册中或按要求提供熵值达标证明。
压缩函数至少调用一次。可使用 Miyaguchi-Preneel 压缩算法将 TRNG 输出压缩为种子。
若 PRNG_KEY 为易失性存储槽,那么就需要按照上章的规定来获取用于运行 PRNG 的密钥。
(二)、随机数生成
在种子按上述方式完成初始化之前,随机数发生器不得输出任何随机值。
按照 AIS 31 要求生成新随机值:
需使用 PRNG KEY对 PRNG STATE的内容进行加密以生成新的随机值。加密后的输出将作为下一次随机生成(加密)的输入,即它会替换PRNG STATE,并
同时输出给用户。见下图:
PRNG_STATEi = ENC_ECB, PRNG_KEY(PRNG_STATEi-1)
RND = PRNG_STATEi
PRNG 实现必须满足 AIS 31 高等级机制强度要求。
(三)、种子扩展
用户可通过调用 CMD_EXTEND_SEED 并输入 128 位熵数据,扩展种子与当前 PRNG 状态。
扩展方法:将原有种子 / 状态与输入熵拼接,用 Miyaguchi-Preneel 压缩函数压缩生成新值。输入需进行预处理。因是固定 2×128 位 = 256 位运算,填充使用常量 PRNG_EXTENSION_C。
PRNG_STATE = AES-MP(PRNG_STATE | ENTROPY)
PRNG_SEED = AES-MP(PRNG_SEED | ENTROPY)
六、状态寄存器
CPU 可读取状态寄存器,以查询 SHE 的内部工作状态。状态寄存器总宽度为 8 位。
位被置位:值为 1
位被清零:值为 0
BUSY:SHE 正在处理命令时,该位置 1。
SECURE_BOOT:安全启动功能已激活时,该位置 1。
BOOT_INIT:安全启动在启动流程中已完成个性化配置时,该位置 1。
BOOT_FINISHED:已通过 CMD_BOOT_FAILURE 或 CMD_BOOT_OK 结束安全启动,或安全启动验证失败时,该位置 1。
BOOT_OK:安全启动(CMD_SECURE_BOOT)验证成功时置 1;调用 CMD_BOOT_FAILURE 则清零。
RND_INIT:随机数发生器已完成初始化时,该位置 1。
EXT_DEBUGGER:外部调试器(如 JTAG、BDM)已连接时,该位置 1。
INT_DEBUGGER:SHE 内部调试机制已激活时,该位置 1。
七、用户可访问的函数
SHE 向 CPU 提供多项函数。同一时间仅能执行一项函数。只有 CMD_GET_STATUS 和 CMD_CANCEL 可以在其他功能运行时被调用。
所有功能接口必须是异步的:对 CPU 非阻塞,调用后立即返回。
每项功能都必须返回错误码,用于向调用应用告知执行状态。
如果功能返回错误码,输出数据必须置为 0。
(一)、加密:CMD_ENC_ECB
功能:用指定密钥加密单块明文,输出密文。
参数:
KEY_ID(输入,4 位)。
PLAINTEXT(输入,128 位)。
CIPHERTEXT(输出,128 位)。
(二)、加密:CMD_ENC_CBC
功能:CBC 模式加密,支持多块数据。
参数:
KEY_ID(输入,4 位)。
IV(输入,128 位)。
PLAINTEXT(输入,n×128 位)。
CIPHERTEXT(输出,n×128 位)。
(三)、解密:CMD_DEC_ECB
功能:ECB 模式解密单块数据。
参数:
KEY_ID(输入,4 位)。
CIPHERTEXT(输入,128 位)。
PLAINTEXT(输出,128 位)。
(四)、解密:CMD_DEC_CBC
功能:CBC 模式解密,支持多块数据。
参数:
KEY_ID(输入,4 位)。
IV(输入,128 位)。
CIPHERTEXT(输入,n×128 位)。
PLAINTEXT(输出,n×128 位)。
(五)、MAC 生成:CMD_GENERATE_MAC
功能:用指定密钥生成消息的 CMAC。
参数:
KEY_ID(输入,4 位)。
MESSAGE_LENGTH(输入,64 位)。
MESSAGE(输入,n×128 位)。
MAC(输出,128 位)。
(六)、MAC 验证:CMD_VERIFY_MAC
功能:验证消息的 CMAC。
参数:
KEY_ID(输入,4 位)。
MESSAGE_LENGTH(输入,64 位)。
MESSAGE(输入,n×128 位)。
MAC(输入,128 位)。
MAC_LENGTH(输入,7 位)。
VERIFICATION_STATUS(输出,1 位)。
(七)、安全密钥更新:CMD_LOAD_KEY
功能:按安全协议更新内部密钥。
参数:M1 (128)、M2 (256)、M3 (128) 输入;M4 (256)、M5 (128) 输出
若加载到 RAM_KEY,会清除明文密钥标志。
(八)、明文密钥更新:CMD_LOAD_PLAIN_KEY
功能:以明文方式直接加载密钥,仅可加载到 RAM_KEY。
参数:KEY(输入,128 位)。
会置位 RAM_KEY 的明文标志。
(九)、导出密钥:CMD_EXPORT_RAM_KEY
功能:将 RAM_KEY 以 SECRET_KEY 保护的格式导出。
限制:仅明文加载的 RAM_KEY 可导出。
输出:M1~M5。
(十)、初始化随机数发生器:CMD_INIT_RNG
功能:初始化 PRNG 种子并派生密钥。
要求:每次上电 / 复位后,使用 CMD_RND 前必须先调用。
无输入参数。
(十一)、扩展 PRNG 种子:CMD_EXTEND_SEED
功能:用外部熵扩展种子与状态。
参数:ENTROPY(输入,128 位)。
要求:必须先执行 CMD_INIT_RNG。
(十二)、生成随机数:CMD_RND
功能:输出 128 位随机数。
输出:RND(128 位)。
要求:必须先初始化 RNG。
(十三)、引导加载程序验证(安全启动):CMD_SECURE_BOOT
功能:启动安全启动流程,验证 Bootloader 的 MAC。
参数:SIZE (32)、DATA (SIZE×)。
限制:每次上电 / 复位只能调用一次。
(十四)、启动无效时执行制裁:CMD_BOOT_FAILURE
功能:标记启动验证失败,触发安全制裁。
无输入参数。
(十五)、完成启动验证:CMD_BOOT_OK
功能:标记启动验证成功,锁定失败命令。
无输入参数。
(十六)、读取 SHE 状态:CMD_GET_STATUS
功能:返回 8 位状态寄存器 SREG。
输出:SREG(8 位)。
(十七)、获取标识:CMD_GET_ID
功能:返回 UID、状态寄存器及带 MAC 的防护信息。
参数:CHALLENGE(输入,128 位)。
输出:ID (120)、SREG (8)、MAC (128)。
(十八)、取消功能:CMD_CANCEL
功能:中断当前操作,丢弃计算结果。
若在启动验证期间取消,按启动失败处理。
无输入参数。
(十九)、调试器激活:CMD_DEBUG
功能:激活 SHE 内部调试功能。
行为:认证成功后删除所有密钥(保留 SECRET_KEY、UID、PRNG_SEED)。
限制:无任何密钥写保护时才可执行。
也可用于将 SHE 恢复出厂默认状态。
八、错误码
SHE 协处理器在调用命令后会返回错误码。以下定义了所有错误码,调用应用应进行正确处理。
(一)、ERC_NO_ERROR
无错误命令执行正常,未发生任何错误。
(二)、ERC_SEQUENCE_ERROR
序列错误当命令或子命令的调用顺序不符合规范时返回。例如:在一个功能仍在运行时调用另一个功能。
(三)、ERC_KEY_NOT_AVAILABLE
密钥不可用密钥因启动校验失败或调试器已激活而被锁定时返回。
(四)、ERC_KEY_INVALID
密钥无效使用某个密钥执行其不被允许的操作时返回。
(五)、ERC_KEY_EMPTY
密钥为空应用试图使用尚未初始化的密钥时返回。
(六)、ERC_NO_SECURE_BOOT
无安全启动在以下情况由 CMD_SECURE_BOOT 返回:
不满足安全启动条件,启动流程必须取消。
在未激活安全启动或启动流程已结束时,调用修改启动状态的功能。
(七)、ERC_KEY_WRITE_PROTECTED
当试图在已设置为写保护状态的存储槽上进行密钥更新,或者在密钥处于写保护状态的情况下启动调试器时,就会出现此错误。
(八)、ERC_KEY_UPDATE_ERROR
密钥更新错误密钥更新因消息验证失败而未成功时返回。
(九)、ERC_RNG_SEED
随机数种子未初始化在未初始化种子的情况下调用 CMD_RND 或 CMD_DEBUG 时返回。
(十)、ERC_NO_DEBUGGING
无法调试通过挑战–应答协议的鉴权未成功,导致内部调试无法开启时返回。
(十一)、ERC_BUSY
每当调用 SHE的某个函数时,如果另一个函数仍在处理中(即状态位 SREG_BUSY = 1)就会返回该错误。例外:CMD_CANCEL 和 CMD_GET_STATUS 即使在忙时也可调用,不会返回此错误。
(十二)、ERC_MEMORY_FAILURE
内存故障底层存储在读写时检测到物理错误(如位翻转等),用于通知应用。
(十三)、ERC_GENERAL_ERROR
通用错误SHE 内部出现上述错误码未覆盖的异常时返回。
九、存储器更新协议
SHE 提供多个存储槽用于保存密钥和其他必要信息,并支持在需要时修改内容。存储槽根据使用场景受不同策略保护,但更新存储槽时必须知道授权密钥。所有存储槽共用同一套更新协议,一次协议只能更新一个存储槽。
该协议包含两部分:
存储器更新本身:将机密、可信的密钥安全传送到 SHE。
更新验证消息:向后台(后端)证明更新已成功完成。
协议通过包含 SHE 内部的计数器值来防止重放攻击,同时提供机密性、完整性和真实性保障。通过将消息回传给外部设备,可证明存储位置已成功更新。
单个存储槽的更新次数仅受计数器位宽与存储器物理擦写寿命限制。更新非易失性存储槽或 RAM_KEY 必须使用本协议,配合命令 CMD_LOAD_KEY。
导出 RAM_KEY 时(CMD_EXPORT_RAM_KEY)也必须按本节规则生成 M1~M5。
更新策略可以描述如下:
(一)、存储器更新协议说明
外部设备(如后端)必须持有有效的授权密钥(一般为MASTER_ECU_KEY),才能更新存储槽。具体用哪个授权密钥更新哪个存储槽,见下图,其中 ’ 指的是新的意思。
后端必须从 KEY_AuthID 中,分别使用常量 KEY_UPDATE_ENC_C 和 KEY_UPDATE_MAC_C 派生出两把密钥 K1 和 K2。
生成 3 个消息 M1、M2、M3:
M1用于身份绑定:芯片 UID + 密钥槽 ID + 授权 ID,防篡改、防重放、防复制到其他芯片。
ID即要更新的密钥地址:
AuthID即MASTER_ECU_KEY。
真正密钥被 AES 加密在 M2 里。
该公式含义为:以 K1 为密钥,初始向量为 0,用 AES CBC 模式对数据 CID’ | FID’ | ”0…0“95 | KID’ 进行加密,其结果赋值给 M2,其中的 ’ 在这里指代的分别是需要更新的 CID、FID 和 KEY。
CID:用于防止重放攻击的 Counter。
FID:用于使能与不使能所对应 ID 的 KEY 的更新。
FID是密钥的属性:
”0…0“95:95 个 bit 长度的 0。
KID:是我们需要更新的目标 KEY 的值。
以 K2 为密钥,以 AES 算法的 CBC 模式,计算出 M1 和 M2 串联后的消息消息认证码。
将 M1、M2、M3 发送给 SHE。
SHE执行CMD_LOAD_KEY,CMD_LOAD_KEY 是 SHE 接口函数。用于在更新时传递 M1, M2, M3。在读取时传出 M4, M5 的值。
SHE 先检查存储槽 ID 的写保护,未置位才继续执行。
若 AuthID 对应的密钥为空,则仅当 AuthID = ID 时更新才能成功,否则返回 ERC_KEY_EMPTY。
若目标 ID 是 RAM_KEY,SHE 必须检查调试保护与安全启动保护;任一保护处于激活状态则返回 ERC_KEY_NOT_AVAILABLE。其他 ID 与所有 AuthID 均跳过此项检查。
若发生内存故障,必须至少能读出 AuthID、CID、FID 和 UID(非通配符模式下)才能执行更新,否则返回 ERC_MEMORY_FAILURE。
注:即使安全启动校验失败或调试器激活导致安全位禁止访问,非易失性密钥仍可执行更新,因为更新流程本身具备认证性与机密性。
接下来,SHE 同样派生 K2 并验证 M3。
基于从ECU内部读取的密钥 KEYAuthID,以及从外部传递的 M1, M2,再以 KDF 压缩算法算出的结果作为内部的 K2。
到 K2 后,以 M1 | M2 作为明文,得到内部的 M3*,这里的 * 指的是内部计算的结果。
对比外部传过来的 CMAC 值 M3 和内部计算的 M3*,其目的是为了判断 M1(涵盖了 UID 等信息)和 M2(涵盖了需要被更新的密钥)在传输的过程中有没有被篡改过。如果不相等,停止更新,并返回ERC_KEY_UPDATE_ERROR。
验证通过后:
检查输入的 UID’ 是否为 0(直接从输入的 M1 中提取)。
如果不为 0,从 Storage 相应的 ID 中读取 UID。并进行对比,若不相等,返回 ERC_KEY_UPDATE_ERROR。若相等读取 AuthID 所对应的 KEYAuthID。
如果等于 0,需要对目标 ID 所对应的 WILDCARD 的标志位是否为 0。如果是 0,读取 AuthID 所对应的 KEYAuthID。如果不是 0,说明通配符不被允许,即不允许 UID’ 为 0 作为输入进行密钥的更新。
以 KDF 算法将 KEYAuthID, KEY_UPDATE_ENC_C 进行压缩,得到 K1(这里的算出来的 K1 应该与外部用的 K1 是一致的,因为在 KEYAuthID 外部也是已知的,且与内部相同)。
以 AES CBC 的模式,算出的 K1 为密钥,初始向量为 0,对外部给到的 M2 进行解密,得到外部给到的 CID’, FID’, KID’,对比外部 CID’ 与本地 CID 的大小,如果外部的计数器没有大于本地的计数器,说明该消息是重放的,应返回 ERC_KEY_UPDATE_ERROR,如果是大于本地的计数器,则将最新的计数器、密钥、和标志位存储进相应的位置。
注:仅当新值与当前值不同时,才应执行物理写入操作。
所有中间值(如 Kx、解密结果)不得流出 SHE。更新某一存储槽不得影响其他密钥槽。
协议流程见下图。数据成功保存后,SHE 生成验证报文。若协议用于加载 RAM_KEY,标志位与计数器必须设为 0,且 SHE 必须忽略这两个值。
(二)、更新后验证消息生成说明
在完成一个存储槽的更新后,SHE 必须生成一条验证报文,并回传给后端,用以证明更新成功。生成流程见下图。
1、SHE 首先从已更新的存储槽 ID与常量KEY_UPDATE_ENC_C派生出密钥K3,并以ECB 模式加密已存储的计数器值CID。
计数器值需按规则填充:在LSB 端追加 1 个比特1,后跟若干比特0。
2、接着生成报文M4:将UID、已更新存储槽的ID、本次使用的认证密钥AuthID,以及加密后的计数器值M4*进行拼接。
3、最后,SHE 从已更新存储槽 ID与常量KEY_UPDATE_MAC_C派生出密钥K4,并用 K4 对 M4 计算CMAC,得到M5。
报文M4 与 M5会一并回传给后端,后端会和本地保存的M4M5进行比较,如果一致则作为密钥更新成功的证据,并记录CID+1作为下次更新的CID。
十、安全启动
SHE 可用于保障启动流程安全,即在每个启动周期中校验软件的真实性。
实现方式:在 CPU 复位后、控制权交给应用程序之前,运行一个安全校验任务。该任务可作为微控制器 ROM 代码的一小部分实现,类似于可信计算组(TCG)定义的核心信任根(CRTM)。
安全启动流程会校验一段内存区域,并与 SHE 内部数据比对,若校验失败,会锁定 SHE 的部分功能。
被校验的这段代码是微控制器初始化后执行的第一条用户指令,下文称为SHE 引导程序(Bootloader)。
SHE Bootloader 可以是独立的 Bootloader、已有的 Bootloader,或是需要保护的数据段。若为数据段,则其起始位置必须包含跳转到真实应用的跳转指令。
引导程序位于地址 SHE_BL_START,大小为 SHE_BL_SIZE。
这两个值不影响安全,因此不存放在 SHE 内部。
SHE 引导程序不属于内部 ROM,而是用户可访问的存储器。
Bootloader 大小 SHE_BL_SIZE 必须由应用工程师配置,芯片厂商不得固定。
若微控制器架构支持从不同地址启动,SHE_BL_START 也必须可由应用工程师配置。
这些参数的实际存储位置由芯片厂商决定,不同 MCU 可能不同。但只有启动安全启动的任务会使用这些参数,且该任务必须始终尝试启动安全启动,并通过 SHE 返回的错误码判断是否已配置安全启动。
安全启动不应干扰 CPU 正常功能:未显式激活时,CPU 运行效果应与无 SHE 一致。
激活安全启动的方式:向 BOOT_MAC_KEY 槽写入密钥。
CPU 下一次复位时,SHE 会自动完成安全启动的初始化。
注:安全启动不直接保护应用程序,但可阻止恶意程序使用受保护的密钥。
若要同时保护软件,需建立软件与密钥的绑定关系,例如加密部分软件代码。
注:安全启动通过校验启动镜像的完整性与真实性,实现对密钥使用的授权控制。
(一)、应用启动前完成校验
完整的安全启动必须在 CPU 交给应用控制权之前完成。若使用 DMA 实现,CPU 必须等待操作结束才能启动应用。若 DMA 传输被取消或中断,SHE 必须收到通知,并将安全启动标记为失败。
实现示例:
启动代码(boot code) 指微控制器的内部 ROM 代码,在复位后立即执行,用于初始化 CPU 与外设,之后再启动用户应用程序。
微控制器的内部启动代码必须扩展一段小程序,用于启动对SHE Bootloader的校验。
这段启动代码扩展必须按以下顺序完成任务:
1、获取 SHE Bootloader 的大小 SHE_BL_SIZE。
2、从地址 SHE_BL_START 到 SHE_BL_START + SHE_BL_SIZE 读取 Bootloader 数据,并通过 CMD_SECURE_BOOT 发送给 SHE。
3、从 SHE_BL_START 开始执行 SHE Bootloader。
启动代码扩展必须保证:执行的代码与之前校验的代码完全一致,即必须从 SHE_BL_START 开始执行。
下图展示了启动代码扩展的工作方式。示例中使用的变量如下:
1、SHE_BL_SIZE:Bootloader 的字节长度,以 32 位无符号数形式存于 CPU 内部或外部存储器。
2、SHE_BL_START:Bootloader 首字节地址,部分 CPU 架构中可为固定地址,也可存于内部 / 外部存储器.
3、BOOT_POSITION:常规复位后第一条指令的地址,可与 SHE_BL_START 相同。
注:CMD_SECURE_BOOT 被拆分为三个子命令:INIT、UPDATE、FINALIZE。
INIT:启动功能并传入必要参数,同时检查条件以判断是否执行安全启动。
UPDATE:将大量数据从 CPU 传送到 SHE。
FINALIZE:告知 SHE 整个流程已完成。
(二)、应用启动期间并行校验
该方案仅需在支持直接内存访问(DMA)的微控制器上实现。
在这种模式下,安全启动流程仅在控制权交给应用程序之前完成初始化与启动,即完成 DMA 参数配置并启动 DMA。
代码完整性校验的实际操作与应用程序启动并行执行。
所有配置了安全启动保护标志的密钥,在复位时必须禁用,且仅当 CMD_SECURE_BOOT 成功完成后才会被激活。
注意:
由于 SHE 同一时间仅能处理一项操作,在安全启动完成前,应用程序无法访问 SHE。
但应用程序可以无延迟地启动,并有可能中断安全启动流程。
如果数据传输被应用取消或篡改,SHE 必须终止安全启动并按启动失败处理。
在安全启动期间,禁止对被校验的内存区域执行任何写操作。若该区域被写入,SHE 必须停止安全启动并按失败处理。在安全启动期间禁用写权限属于等效合规措施。
(三)、安全启动自主配置(自主学习 MAC)
如有需要,可实现安全启动所需专属 MAC 值的自动 / 自主学习功能。
该机制无需预先计算并写入 MAC 值,只需写入对应的BOOT_MAC_KEY即可。
在向 BOOT_MAC_KEY 槽写入密钥后的首次复位时,自动学习流程会被触发。
在密钥写入后的首次复位期间,安全启动的引导配置会按以下机制自主完成:当 SHE 检测到已配置启动密钥(BOOT_MAC_KEY)但未存储 MAC 值时,CPU 会执行与安全启动相同的操作:读取 Flash 程序并传送给 SHE,但 SHE不校验 MAC,而是直接将计算出的 MAC 存入内部存储器。
在下一次复位时,系统便会进入 SHE 安全启动保护状态。
注:Bootloader 的起始地址(SHE_BL_START)与大小(SHE_BL_SIZE)必须已正确配置。
(四)、启动校验失败的制裁措施
如果 SHE 在启动过程中检测到失败(例如:计算出的 MAC 与存储的 MAC 不匹配、启动流程被干扰、或因内存故障(ERC_MEMORY_FAILURE)、调试保护导致密钥不可用(ERC_KEY_NOT_AVAILABLE)),则必须执行以下制裁措施:
1、将状态寄存器中相应位置位,向应用程序标记启动失败:
SREG_BOOT_FINISHED = 1
SREG_BOOT_OK = 0
2、命令 CMD_BOOT_FAILURE 与 CMD_BOOT_OK 必须被锁定,无法再调用。
3、所有配置了启动失败保护标志的密钥必须被锁定,不可使用。
(五)、可选:强制认证软件(更高安全)
注:此启动模式对于 SHE 1.0 合规性不是强制性的。
注:在该配置模式下,CPU 拒绝启动任何未通过认证的应用程序。
安全启动操作在应用程序启动之前执行,若安全启动失败,则必须重新执行启动校验。
启动模式的配置必须存储在一次性可编程(OTP)区域。如果该可选启动模式被配置启用,CPU 必须禁止除安全启动以外的所有其他启动方式:例如,不允许重新配置启动存储器,也不允许通过通信接口使用引导启动(bootstrap)模式。
若启动校验失败,配置了安全启动标志的密钥必须被锁定,即便系统会立即重新执行启动校验也不例外。
注:为让该启动选项有效,判断是否需要重新执行启动校验的逻辑,应具备抵御特定硬件攻击的能力(例如毛刺攻击(glitching attacks))。
但由于该启动模式为可选功能,规范未对物理防篡改能力提出强制要求。
(六)、可选:流程图
上图提供了无 DMA 情况下的安全启动流程图,逻辑如下:
上电复位 → 初始化 CPU,
获取引导程序大小,
检查 BOOT_MAC_KEY 是否为空,
为空 → 不启动安全启动,
不为空 → 读取引导程序并计算 MAC,
检查 BOOT_MAC 是否为空,
为空 → 自主学习,存储当前 MAC,
不为空 → 比对计算值与存储值,
比对成功 → 正常启动;失败 → 限制密钥访问。
十一、SHE 失效分析与复位
注:SHE 的内部模块仅在被 SHE 显式激活后,才可被失效分析系统访问。
在激活分析功能前,分析系统必须通过MASTER_ECU_KEY完成身份认证,且 SHE 的内部存储器必须被清空。
本章中,失效分析系统特指芯片厂商用于分析芯片故障的底层设备,不包含软件开发用的调试器。
SHE 必须能够控制内部失效分析功能的启用。
开发者使用的常规调试器(如 JTAG)仅能访问 SHE 的外部接口。
激活内部失效分析功能,必须执行以下步骤:
1、检查是否存在写保护位,无任何密钥被写保护时方可继续.
2、使用挑战 - 应答协议解锁 SHE 内部失效分析功能;调试协议使用的密钥由MASTER_ECU_KEY与DEBUG_KEY_C派生。
3、认证成功后,清空 SHE 所有内部存储器,仅保留 SECRET_KEY、UID、PRNG_SEED。
4、将状态位SREG_RND_INIT置 0。
5、解锁调试接口。
挑战 - 应答协议流程如下(执行 CMD_DEBUG 前必须先初始化随机数发生器):
1、SHE 生成随机数CHALLENGE。
2、SHE 用 MASTER_ECU_KEY 与 DEBUG_KEY_C 派生密钥K_DEBUG。
3、SHE 将 CHALLENGE 发送给请求调试访问的设备 A。
4、设备 A 同样派生 K_DEBUG。
5、设备 A 对 CHALLENGE 与 UID 计算 CMAC,得到授权值:
AUTHORIZATION = CMAC_KDEBUG (CHALLENGE | UID)。
6、设备 A 将 AUTHORIZATION 发送给 SHE。
7、SHE 验证授权值;验证成功后,先清空内部存储器,再开放调试访问
调试激活仅在本次复位前有效,每次复位后必须重新激活。即使 MASTER_ECU_KEY 已设置调试保护或安全启动保护标志,该激活流程仍可正常执行。
调试激活仅在本次复位前有效,每次复位后必须重新激活。
即使 MASTER_ECU_KEY 已设置调试保护或安全启动保护标志,该激活流程仍可正常执行。
十二、SHE 内部使用的常量
这些常量为预定义固定值,用于保证不同 SHE 实现之间的兼容性。
十三、例子
为验证 SHE 实现的正确性,本章给出所有密码算法与协议的示例与测试向量。其中 AES、CMAC 等参考算法的测试向量直接取自引用的标准文档。
十四、概览表
十五、参考资料
AUTOSAR_FO_TR_SecureHardwareExtensions
总结
本文文字描述多点,更像是本人的使用笔记,仅供参考,如有不对地方欢迎指教。