【嵌入式经验系列】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 OOM问题定位与解决方案超详细解析

《线上JavaOOM问题定位与解决方案超详细解析》OOM是JVM抛出的错误,表示内存分配失败,:本文主要介绍线上JavaOOM问题定位与解决方案的相关资料,文中通过代码介绍的非常详细,需要的朋... 目录一、OOM问题核心认知1.1 OOM定义与技术定位1.2 OOM常见类型及技术特征二、OOM问题定位工具

Python中logging模块用法示例总结

《Python中logging模块用法示例总结》在Python中logging模块是一个强大的日志记录工具,它允许用户将程序运行期间产生的日志信息输出到控制台或者写入到文件中,:本文主要介绍Pyt... 目录前言一. 基本使用1. 五种日志等级2.  设置报告等级3. 自定义格式4. C语言风格的格式化方法

使用docker搭建嵌入式Linux开发环境

《使用docker搭建嵌入式Linux开发环境》本文主要介绍了使用docker搭建嵌入式Linux开发环境,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面... 目录1、前言2、安装docker3、编写容器管理脚本4、创建容器1、前言在日常开发全志、rk等不同

深度解析Python中递归下降解析器的原理与实现

《深度解析Python中递归下降解析器的原理与实现》在编译器设计、配置文件处理和数据转换领域,递归下降解析器是最常用且最直观的解析技术,本文将详细介绍递归下降解析器的原理与实现,感兴趣的小伙伴可以跟随... 目录引言:解析器的核心价值一、递归下降解析器基础1.1 核心概念解析1.2 基本架构二、简单算术表达

深度解析Java @Serial 注解及常见错误案例

《深度解析Java@Serial注解及常见错误案例》Java14引入@Serial注解,用于编译时校验序列化成员,替代传统方式解决运行时错误,适用于Serializable类的方法/字段,需注意签... 目录Java @Serial 注解深度解析1. 注解本质2. 核心作用(1) 主要用途(2) 适用位置3

Java MCP 的鉴权深度解析

《JavaMCP的鉴权深度解析》文章介绍JavaMCP鉴权的实现方式,指出客户端可通过queryString、header或env传递鉴权信息,服务器端支持工具单独鉴权、过滤器集中鉴权及启动时鉴权... 目录一、MCP Client 侧(负责传递,比较简单)(1)常见的 mcpServers json 配置

从原理到实战解析Java Stream 的并行流性能优化

《从原理到实战解析JavaStream的并行流性能优化》本文给大家介绍JavaStream的并行流性能优化:从原理到实战的全攻略,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的... 目录一、并行流的核心原理与适用场景二、性能优化的核心策略1. 合理设置并行度:打破默认阈值2. 避免装箱

Maven中生命周期深度解析与实战指南

《Maven中生命周期深度解析与实战指南》这篇文章主要为大家详细介绍了Maven生命周期实战指南,包含核心概念、阶段详解、SpringBoot特化场景及企业级实践建议,希望对大家有一定的帮助... 目录一、Maven 生命周期哲学二、default生命周期核心阶段详解(高频使用)三、clean生命周期核心阶

Python 基于http.server模块实现简单http服务的代码举例

《Python基于http.server模块实现简单http服务的代码举例》Pythonhttp.server模块通过继承BaseHTTPRequestHandler处理HTTP请求,使用Threa... 目录测试环境代码实现相关介绍模块简介类及相关函数简介参考链接测试环境win11专业版python

深入解析C++ 中std::map内存管理

《深入解析C++中std::map内存管理》文章详解C++std::map内存管理,指出clear()仅删除元素可能不释放底层内存,建议用swap()与空map交换以彻底释放,针对指针类型需手动de... 目录1️、基本清空std::map2️、使用 swap 彻底释放内存3️、map 中存储指针类型的对象