【嵌入式经验系列】S32K-CSEc硬件加密模块深度解析

2023-11-05 07:59

本文主要是介绍【嵌入式经验系列】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模块自动添加,下面分别介绍这两种方式。

  1. 手动添加:
    a. 使用要保护的代码对代码flash进行编程;
    b. 将BOOT_MAC_KEY编程为安全闪存(此时也可以编程其他用户密钥);
    c. 使用CMD_BOOT_DEFINE命令定义安全启动模式和BOOT_SIZE;
    d. 使用BOOT_MAC_KEY计算要保护的代码的初始BOOT_SIZE部分的二进制记录的MAC,它可以离线完成或使用CSEc的
    RAM_KEY功能。
  2. 自动添加:(出厂设备没有存储在安全闪存中的用户密钥,如果遵循以下顺序,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硬件加密模块深度解析的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/348468

相关文章

使用Java将DOCX文档解析为Markdown文档的代码实现

《使用Java将DOCX文档解析为Markdown文档的代码实现》在现代文档处理中,Markdown(MD)因其简洁的语法和良好的可读性,逐渐成为开发者、技术写作者和内容创作者的首选格式,然而,许多文... 目录引言1. 工具和库介绍2. 安装依赖库3. 使用Apache POI解析DOCX文档4. 将解析

Java字符串处理全解析(String、StringBuilder与StringBuffer)

《Java字符串处理全解析(String、StringBuilder与StringBuffer)》:本文主要介绍Java字符串处理全解析(String、StringBuilder与StringBu... 目录Java字符串处理全解析:String、StringBuilder与StringBuffer一、St

Spring Boot循环依赖原理、解决方案与最佳实践(全解析)

《SpringBoot循环依赖原理、解决方案与最佳实践(全解析)》循环依赖指两个或多个Bean相互直接或间接引用,形成闭环依赖关系,:本文主要介绍SpringBoot循环依赖原理、解决方案与最... 目录一、循环依赖的本质与危害1.1 什么是循环依赖?1.2 核心危害二、Spring的三级缓存机制2.1 三

C#中async await异步关键字用法和异步的底层原理全解析

《C#中asyncawait异步关键字用法和异步的底层原理全解析》:本文主要介绍C#中asyncawait异步关键字用法和异步的底层原理全解析,本文给大家介绍的非常详细,对大家的学习或工作具有一... 目录C#异步编程一、异步编程基础二、异步方法的工作原理三、代码示例四、编译后的底层实现五、总结C#异步编程

python logging模块详解及其日志定时清理方式

《pythonlogging模块详解及其日志定时清理方式》:本文主要介绍pythonlogging模块详解及其日志定时清理方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地... 目录python logging模块及日志定时清理1.创建logger对象2.logging.basicCo

Qt spdlog日志模块的使用详解

《Qtspdlog日志模块的使用详解》在Qt应用程序开发中,良好的日志系统至关重要,本文将介绍如何使用spdlog1.5.0创建满足以下要求的日志系统,感兴趣的朋友一起看看吧... 目录版本摘要例子logmanager.cpp文件main.cpp文件版本spdlog版本:1.5.0采用1.5.0版本主要

Java中使用Hutool进行AES加密解密的方法举例

《Java中使用Hutool进行AES加密解密的方法举例》AES是一种对称加密,所谓对称加密就是加密与解密使用的秘钥是一个,下面:本文主要介绍Java中使用Hutool进行AES加密解密的相关资料... 目录前言一、Hutool简介与引入1.1 Hutool简介1.2 引入Hutool二、AES加密解密基础

MySQL中FIND_IN_SET函数与INSTR函数用法解析

《MySQL中FIND_IN_SET函数与INSTR函数用法解析》:本文主要介绍MySQL中FIND_IN_SET函数与INSTR函数用法解析,本文通过实例代码给大家介绍的非常详细,感兴趣的朋友一... 目录一、功能定义与语法1、FIND_IN_SET函数2、INSTR函数二、本质区别对比三、实际场景案例分

Java图片压缩三种高效压缩方案详细解析

《Java图片压缩三种高效压缩方案详细解析》图片压缩通常涉及减少图片的尺寸缩放、调整图片的质量(针对JPEG、PNG等)、使用特定的算法来减少图片的数据量等,:本文主要介绍Java图片压缩三种高效... 目录一、基于OpenCV的智能尺寸压缩技术亮点:适用场景:二、JPEG质量参数压缩关键技术:压缩效果对比

关于WebSocket协议状态码解析

《关于WebSocket协议状态码解析》:本文主要介绍关于WebSocket协议状态码的使用方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录WebSocket协议状态码解析1. 引言2. WebSocket协议状态码概述3. WebSocket协议状态码详解3