【嵌入式经验系列】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

相关文章

PostgreSQL的扩展dict_int应用案例解析

《PostgreSQL的扩展dict_int应用案例解析》dict_int扩展为PostgreSQL提供了专业的整数文本处理能力,特别适合需要精确处理数字内容的搜索场景,本文给大家介绍PostgreS... 目录PostgreSQL的扩展dict_int一、扩展概述二、核心功能三、安装与启用四、字典配置方法

SpringBoot中SM2公钥加密、私钥解密的实现示例详解

《SpringBoot中SM2公钥加密、私钥解密的实现示例详解》本文介绍了如何在SpringBoot项目中实现SM2公钥加密和私钥解密的功能,通过使用Hutool库和BouncyCastle依赖,简化... 目录一、前言1、加密信息(示例)2、加密结果(示例)二、实现代码1、yml文件配置2、创建SM2工具

深度解析Java DTO(最新推荐)

《深度解析JavaDTO(最新推荐)》DTO(DataTransferObject)是一种用于在不同层(如Controller层、Service层)之间传输数据的对象设计模式,其核心目的是封装数据,... 目录一、什么是DTO?DTO的核心特点:二、为什么需要DTO?(对比Entity)三、实际应用场景解析

深度解析Java项目中包和包之间的联系

《深度解析Java项目中包和包之间的联系》文章浏览阅读850次,点赞13次,收藏8次。本文详细介绍了Java分层架构中的几个关键包:DTO、Controller、Service和Mapper。_jav... 目录前言一、各大包1.DTO1.1、DTO的核心用途1.2. DTO与实体类(Entity)的区别1

Java中的雪花算法Snowflake解析与实践技巧

《Java中的雪花算法Snowflake解析与实践技巧》本文解析了雪花算法的原理、Java实现及生产实践,涵盖ID结构、位运算技巧、时钟回拨处理、WorkerId分配等关键点,并探讨了百度UidGen... 目录一、雪花算法核心原理1.1 算法起源1.2 ID结构详解1.3 核心特性二、Java实现解析2.

Python中re模块结合正则表达式的实际应用案例

《Python中re模块结合正则表达式的实际应用案例》Python中的re模块是用于处理正则表达式的强大工具,正则表达式是一种用来匹配字符串的模式,它可以在文本中搜索和匹配特定的字符串模式,这篇文章主... 目录前言re模块常用函数一、查看文本中是否包含 A 或 B 字符串二、替换多个关键词为统一格式三、提

python实现对数据公钥加密与私钥解密

《python实现对数据公钥加密与私钥解密》这篇文章主要为大家详细介绍了如何使用python实现对数据公钥加密与私钥解密,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录公钥私钥的生成使用公钥加密使用私钥解密公钥私钥的生成这一部分,使用python生成公钥与私钥,然后保存在两个文

SQLite3 在嵌入式C环境中存储音频/视频文件的最优方案

《SQLite3在嵌入式C环境中存储音频/视频文件的最优方案》本文探讨了SQLite3在嵌入式C环境中存储音视频文件的优化方案,推荐采用文件路径存储结合元数据管理,兼顾效率与资源限制,小文件可使用B... 目录SQLite3 在嵌入式C环境中存储音频/视频文件的专业方案一、存储策略选择1. 直接存储 vs

嵌入式数据库SQLite 3配置使用讲解

《嵌入式数据库SQLite3配置使用讲解》本文强调嵌入式项目中SQLite3数据库的重要性,因其零配置、轻量级、跨平台及事务处理特性,可保障数据溯源与责任明确,详细讲解安装配置、基础语法及SQLit... 目录0、惨痛教训1、SQLite3环境配置(1)、下载安装SQLite库(2)、解压下载的文件(3)、

使用Python绘制3D堆叠条形图全解析

《使用Python绘制3D堆叠条形图全解析》在数据可视化的工具箱里,3D图表总能带来眼前一亮的效果,本文就来和大家聊聊如何使用Python实现绘制3D堆叠条形图,感兴趣的小伙伴可以了解下... 目录为什么选择 3D 堆叠条形图代码实现:从数据到 3D 世界的搭建核心代码逐行解析细节优化应用场景:3D 堆叠图