本文主要是介绍【嵌入式经验系列】S32K-CSEc硬件加密模块深度解析,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
【嵌入式经验系列】S32K-CSEc硬件加密模块深度解析
- 一、序言
- 二、CSEc模块特性
- 三、CSEc功能详细介绍
- 3.1 启动CSEc功能
- 3.2 加密和解密
- 3.2.1 密钥加载
- 3.2.2 更新密钥
- 3.2.3 授权密钥
- 3.3 CMAC生成与验证
- 3.4 安全启动
- 3.4.1 安全启动模式
- 3.4.2 使能安全启动
- 3.4.3 添加BOOT_MAC
一、序言
本文档主要着重去介绍硬件加密模块CSEc的功能以及特性,CSEc安全模块已经在恩智浦S32K1xx系列设备中实现。该模块完全兼容HIS-SHE和GM-SHE+标准的功能规范。
二、CSEc模块特性
CSEc安全加密模块的功能特性如下所示:
- 符合HIS-SHE和GM-SHE+安全规范的要求;
- 更安全的加密密钥存储(范围从3到17个用户密钥);
- AES-128加密和解密;
- AES-128 CMAC验证码的生成和验证;
- ECB(电子Cypher Book)模式-加密和解密;
- CBC(密码块链接)模式-加密和解密;
- 真和伪随机数生成;
- Miyaguchi-Preneel压缩功能;
- 安全引导模式(用户可配置)。
三、CSEc功能详细介绍
3.1 启动CSEc功能
CSEc的主要功能都是在闪存模块(FTFC)的核心中实现的,实现方式如下所示。
要启动CSEc功能,必须将器件配置为模拟EEPROM操作。Flash的分区命令(PRGPART)用于启用CSEc,同时还提供了密钥大小的机制。根据密钥的大小,EEERAM的最后128/256/512字节将从仿真EEPROM中减少并变为不可寻址。该存储区域被保护并用于存储加秘密钥,此外,系统中的任何其他主设备都无法访问此存储区域。安全存储区域如图1.1中的灰色部分所示。
一旦用户为FTFC模块配置CSEc功能并加载用户密钥以进行安全操作,设备就可以进行任何与安全相关的操作。
CSEc PRAM接口用于为安全操作提供数据和命令头。该过程涉及将系统存储器内容块传送到CSEc PRAM空间以进行加密操作,并且一旦操作完成,然后将结果传送回系统存储器。所有数据块大小均为128位,如果块大小小于128位,则需要由应用程序填充。
写入CSEc命令头后,命令执行开始,CCOB接口,EEERAM和CSEc PRAM被锁定。此外,在完成正在进行的命令之前,不能启动其他命令。
CSEc相关操作的状态在Flash状态寄存器(FSTAT)和CSEc状态寄存器(FCSESTAT)中报告。使用此状态信息,还可以在完成CSEc命令时生成中断。此外,CSEc命令执行期间发生的任何错误都会报告在CSEc PRAM的错误位位置。
分区启用CSEc功能后的Flash结构如下所示。
3.2 加密和解密
加密解密这一节主要介绍的是关于密钥加载、更新密钥以及授权密钥的概念。
3.2.1 密钥加载
要加载密钥,必须使用HIS-SHE规范中定义的协议,这可以保证密钥的机密性、完整性、真实性并且防止重放攻击。HIS-SHE要求为了更新包括密钥的内存,必须通过一定的算法计算M1M2M3的值并且将其传递给CSEc模块。
这些值通常在脱机计算机上派生,并在头文件中创建为数组。也可以使用目标部分(S32K1xx)和CSEc导出值。CSEc PRAM第1页至第4页装有M1,M2和M3。然后,应写入(第1页)CSE_LOAD_KEY命令头以启动命令执行。执行完成后,CSEc PRAM页面5到7将返回M4和M5。
可以根据预先计算的离线值验证这些值,以便完美地添加密钥。
3.2.2 更新密钥
如果密钥设置了WRITE_PROT属性,则无法再更新该密钥。将设备的密钥编程到安全闪存中并且设备不再处于出厂状态后,可能需要更新一个或多个密钥。HIS-SHE描述了执行此操作的机制,这已通过CMD_LOAD_KEY命令在CSEc模块中实现。
3.2.3 授权密钥
为了保证密钥的安全,HIS-SHE要求在尝试更新特定密钥之前要知道授权密钥。通常,需要知道特定密钥以更新该特定密钥。MASTER_ECU_KEY是具有特殊含义的密钥,可用于在不知道这些密钥的情况下授权更新所有密钥(BOOT_MAC_KEY,BOOT_MAC和所有KEY_1到KEY_17)。
3.3 CMAC生成与验证
CSEc使用AES-128 CMAC算法进行消息验证。从一个存储器插槽中选择CMAC操作的密钥。必须启用密钥才能进行身份验证(KEY_USAGE = 1)。
对于未存储在非易失性存储器插槽中的密钥,可以使用CMD_LOAD_PLAIN_KEY命令将纯文本密钥加载到RAM_KEY插槽中。但是,由于此方法意味着潜在的安全风险,因此这可能仅对开发调试有用。
CMD_VERIFY_MAC命令支持将计算的MAC值与输入MAC值进行比较。
3.4 安全启动
CSEc有一种机制,允许用户在flash中验证启动代码。可以配置MCU,以便在每次启动时,对一段代码进行认证,并将生成的MAC与先前存储在安全存储器插槽中的值进行比较。
3.4.1 安全启动模式
S32K1xx设备支持如下3种安全启动模式。
- 顺序启动模式:在此模式下,在RESET之后,闪存系统退出RESET,内核保持在RESET状态,或者可以从ROM代码执行。安全启动过程验证应用程序固件块。如果安全启动成功,则密钥将可用于安全任务,否则将阻止标记为启动保护的密钥用于所有任务。最后,核心开始执行应用程序固件。
- 严格的顺序启动模式:在此模式下,在RESET之后,闪存系统退出RESET,内核保持在RESET状态,或者可以从ROM代码执行。安全启动过程验证应用程序固件块。如果安全启动成功,则密钥将可用于安全任务。否则,如果CMAC比较失败,则主核心保持在RESET状态(因此不执行应用程序固件)或者可以执行ROM代码。(这种启动模式是不可逆转的;这意味着一旦设置,启动模式就无法更改为其他启动模式。)
- 并行启动模式:在此模式下,在RESET之后,闪存系统和主内核从RESET出来,主内核开始执行应用程序固件。与主核心执行并行,CSEc使用安全启动过程验证应用程序固件块。如果安全启动成功,则密钥将可用于安全任务,否则将阻止标记为启动保护的密钥用于所有任务。主核仍然可以执行固件。
3.4.2 使能安全启动
CMD_BOOT_DEFINE命令配置需要进行身份验证的引导模式(flavor)和引导代码大小。下图和下面的描述说明了S32K1xx器件中的安全引导流程。
用于验证引导代码的密钥是BOOT_MAC_KEY。假设已经编程了BOOT_MAC_KEY,如果不是,则设备中止安全启动过程并清除FCSESTAT[SB]位。
一旦配置了安全启动,在每次复位时,自动安全启动在程序闪存块上运行,从地址“0”开始,以BOOT_SIZE位数结束。在此过程中,MAC在代码的这一部分上计算,并与存储在安全闪存中的BOOT_MAC进行比较。如果BOOT_MAC插槽为空,则CSEc自动存储计算的BOOT_MAC并中止安全启动过程,设置FCSESTAT [BIN](== 1)位。
如果计算的MAC值与BOOT_MAC_KEY的比较成功,则设置FCSESTAT [BOK]位(== 1)。安全启动过程结束后,应用程序执行CMD_BOOT_OK命令。这将设置FCSESTAT [BFN](== 1)位以标记安全引导过程的结束。
如果安全引导过程成功并且执行了CMD_BOOT_OK,则应用程序代码可以使用标记为Boot Protected(BOOT_PROT)的键。否则启动保护密钥将保持锁定。
3.4.3 添加BOOT_MAC
添加BOOT_MAC的方式有两种,一种是手动添加,一种是CSEc模块自动添加,下面分别介绍这两种方式。
- 手动添加:
a. 使用要保护的代码对代码flash进行编程;
b. 将BOOT_MAC_KEY编程为安全闪存(此时也可以编程其他用户密钥);
c. 使用CMD_BOOT_DEFINE命令定义安全启动模式和BOOT_SIZE;
d. 使用BOOT_MAC_KEY计算要保护的代码的初始BOOT_SIZE部分的二进制记录的MAC,它可以离线完成或使用CSEc的
RAM_KEY功能。 - 自动添加:(出厂设备没有存储在安全闪存中的用户密钥,如果遵循以下顺序,CSEc将计算并将BOOT_MAC存储在安全闪存中)
a. 使用要保护的代码对代码flash进行编程;
b. 将BOOT_MAC_KEY编程为安全闪存(此时也可以编程其他用户密钥)
c. 使用CMD_BOOT_DEFINE命令定义安全引导风格和BOOT_SIZE;
d. 重置设备。CSEc计算BOOT_MAC并将其存储在安全存储器插槽中;
e. 再次重置设备; CSEc确认先前计算的BOOT_MAC并设置FCSESTAT [BOK] = 1(安全启动OK位);
这篇关于【嵌入式经验系列】S32K-CSEc硬件加密模块深度解析的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!