本文以英飞凌 XC2365B 这款单片机为例详细讲述了XC2000系列 Flash 的加解密方法,例程代码可在“汽车软件杂谈”公众号回复 “FLASH加密”获取。

概述

XC2365 Flash 共 320KByte,分为两个模块:Flash0-256K,Flash1-64K,下文所提及的全局指包含全部的 Flash 模块。

读写加密策略可以概括为以下四条,下文再详细展开:

  • 读加密指不能对 Flash 中的内容进行读取,写加密指不能对 Flash 进行擦除和写入操作。读加密使能的时候,可以分别控制指令和数据的读取,后文详述。

  • 读加密总是针对全局的,且使能的同时自动使能全局写加密,以防止向 Flash 中恶意写入一段例程后通过外部总线将 Flash 中的内容读取出来。

  • 当不使能读加密时,可以对逻辑扇区分别进行写加密。

  • 程序运行过程中,可以分别对读写加密进行临时解锁和上锁,临时解锁在复位后自动重新上锁。

逻辑扇区

先来了解一下逻辑扇区的概念,如下图所示,一个 256KB 的Flash模块被划分为12个逻辑扇区,是加密的最小操作单位。64KB 的 Flash 模块逻辑扇区划分相同,只是没有逻辑扇区 7~12。

相关寄存器

Flash 读取、写入以及加解密都由 IMB 内核控制,有以下几个寄存器尤为重要,本文只说重点,详细内容可查询用户手册。

1. IMB_IMBCTRL & IMB_IMBCTRH

这两个控制寄存器要结合起来看,其中重要的四个标志:WPA、RPA、DCF、DDF 就是决定 Flash 加密状态的四个位,具体作用参见下图:

总的来说:

  • 读加密总是作用于全局,取指令和读数据可以被分别控制。

  • 读加密使能的时候,全局写加密同时使能;读加密不使能的时候,可以根据寄存器 IMB_PROCONx(见下文)的值对各逻辑扇区分别进行写加密。

这四个标志位在上电的时候会由 IMB 内核进行置位,置位规则我们一会儿再看,此处需要了解的是我们可以通过这四个标志位知道当前 Flash 加密状态,但程序中几乎不需要对这四个标志位进行操作,对加密状态的设定和更改另有途径。

2. IMB_PROCONx (x=0-1)

刚刚我们提到了不使能读加密的时候,可以根据寄存器 IMB_PROCONx 的值对各逻辑扇区分别进行写加密,就是这个寄存器,末尾的 x 代表 Flash 模块,如 Flash0 即为 IMB_PROCON0;S0U-S12U 对应12个逻辑扇区。注意:置 1 的时候是不加密。同样,该寄存器也是在上电的时候由 IMB 内核进行置位。

3. IMB_FSR_PROT

这个寄存器是状态指示寄存器,一些保护状态和错误状态可以在这个寄存器体现,我们重点关注以下几个标志:

  1. PROIN:当保护安装成功后,IMB 内核会在复位时将此标志位置位。

  2. RPRODIS & WPRODIS:我们上面提过,Flash 加密后,程序运行过程中可以临时解密,这两个标志位就是临时解密状态标志。

  3. RPRO:标志读加密是否激活,同样由IMB 内核在复位时置位。

SecurityPage——加解密配置存储区

我们前文提到了一些寄存器的值是由 IMB 内核进行配置,那么 IMB 内核配置这些寄存器的依据是什么呢?其实这也是整个加密策略中最关键的地方,下面我们就来详细研究一下。

事实上,在单片机的内部隐藏着两个加密配置存储区(SecP0/1),在单片机上电的时候,IMB 内核会根据这两个存储区的内容对 Flash 安装加密,并将必要的内容拷贝到相应寄存器中。

两个存储区的分布如下图所示:

SecurityPage0 中包含了:

  1. PW0-3:加解密用到的密码,4个双字节数。

  2. PROCONx:就是上文中 IMB_PROCONx 对应的值,每个 Flash 模块占用一个双字节,IMB 会在上电的时候将值拷贝到 IMB_PROCONx 寄存器中。

  3. RPRO:是否激活读加密的标志,2位,定义同上文寄存器中的RPRO。IMB 根据这两位的值来决定是否对 Flash 进行读加密,并将值拷贝到 IMB_FSR_PROT 的 RPRO 中。我们上文提到过WPA、RPA、DCF、DDF 四个标志位,就会在这里进行判断:

  • 如果存储区中 RPRO 的值为 01b(Active),那么 IMB 就会对 Flash 进行全局读写加密,并将 WPA 和 RPA 置为有效,同时再判断程序启动模式:

    • 如果是从内部 Flash 启动,则将 DDF 和 DCF 置为无效,即可以从 Flash 获取指令和数据;

    • 如果是其它启动方式,则将 DDF 和 DCF 置为有效,即不能从Flash 获取指令和数据,从而避免数据泄露。

  • 如果存储区中 RPRO 的值为10b(Inactive),那么 IMB 不会进行读加密,只将 WPA 置为有效,并继续判断 PROCONx 的值,如果有要加密的逻辑扇区就会对其进行加密。DDF 和 DCF 会同样根据启动方式进行置位,但因为此时 RPA 无效,所以他们的值不论为何都是无效的。

SecurityPage1 中仅包含了两个双字节控制字,这两个控制字却很重要,它是个总开关,当都为 AA55H的时候,IMB 才会在复位时安装加密,SecurityPage0 中的内容才有效,为其它值的时候不会安装加密

知道了这两个加密配置存储区的作用之后,我们还得知道怎样把数据写进去。

这两个区域有各自的地址:

SecP0: address C0’0000H.

SecP1: address C0’0080H.

我们可以看到这两个地址与 Flash 的地址(C0’0000H~C4’FFFFH)是重合的,正常情况下我们可以通过 "Enter Page Mode"、"Program Page"、"Erase Page"等指令对 Flash进行擦除和写入,对于加密配置存储区来说,也有两个相对应的指令:"Enter Security Page Mode"和"Erase Security Page"对其进行操作,写入数据时同样使用"Program Page"指令。

需要注意两点:

  1. 操作加密数据存储区的时候要确保 Flash 处于解密状态才能操作成功。

  2. 存储区中已使用的 Block 中未使用的位应保持擦除状态(填充0),即SecurityPage0中的 Block0 和 Block1 以及 SecurityPage1 中的 Block0;存储区中未使用的 Block 应填充1(0xFF)。

所以,总结一下:

  1. 当 Flash 处于出厂状态、未加密时,两个加密配置存储区都处于被擦除的状态,SecurityPage1中没有正确的“Lock code”(AA55AA55H),SecurityPage0中的数据在启动时也不会被检测,DDF 和 DCF 会根据启动方式置位,但也是无效的。

  2. 当我们首次对 Flash 上锁的时候,我们要先对两个SecurityPage写入想要的配置数据,然后重启,即可上锁。

  3. 当我们想更改密码或配置的时候,我们首先要对读写临时解锁,然后擦除两个SecurityPage,再写入更新后的加密配置数据,重启后即可更新加密配置。

  4. 当我们想取消加密的时候,可以更改配置,或直接将SecurityPage1中的“Lock code”擦除,重启即可

例程代码简要说明

我自己做的例程适用于 XC2365B-40F,基于Keil,用的英飞凌官方提供的 Flash 模拟 EEPROM 的驱动进行修改和拓展,官方驱动中有 Flash 读写相关的内容,但没有加解密相关代码,基于Tasking。这个官方驱动大家也可以在公众号回复“EEPROM模拟”获取。

例程中使用了 CAN 报文输出了一些寄存器值等调试信息,加解密相关代码在 eeprom.c 文件的最后部分,包括了擦除和写入加密配置存储区、临时读写解密、重新使能加密、按页读写 Flash等内容。指令相关内容可参考用户手册 Flash 操作指令部分。

以上!欢迎大家交流探讨~

英飞凌XC2000系列单片机FLASH加解密策略相关推荐

  1. 英飞凌 AURIX 系列单片机的HSM详解(1)——何为HSM

    本系列的其它几篇文章: <英飞凌 AURIX 系列单片机的HSM详解(2)--与HSM相关的UCB和寄存器> <英飞凌 AURIX 系列单片机的HSM详解(3)--开发方法> ...

  2. 英飞凌 AURIX 系列单片机的HSM详解(2)——与HSM相关的UCB和寄存器

    本系列的其它几篇文章: <英飞凌 AURIX 系列单片机的HSM详解(1)--何为HSM> <英飞凌 AURIX 系列单片机的HSM详解(2)--与HSM相关的UCB和寄存器> ...

  3. 英飞凌 AURIX 系列单片机的HSM详解(5)——HSM硬件加速模块的使用

    本系列的其它几篇文章: <英飞凌 AURIX 系列单片机的HSM详解(1)--何为HSM> <英飞凌 AURIX 系列单片机的HSM详解(2)--与HSM相关的UCB和寄存器> ...

  4. 英飞凌 AURIX 系列单片机的HSM详解(4)——Tricore核与HSM核之间的通信方法

    本系列的其它几篇文章: <英飞凌 AURIX 系列单片机的HSM详解(1)--何为HSM> <英飞凌 AURIX 系列单片机的HSM详解(2)--与HSM相关的UCB和寄存器> ...

  5. 浅谈英飞凌XMC1xxx系列单片机的BMI功能

    文章目录 前言 一.BMI是什么? 二.BMI的作用? 1. 为什么要有BMI这个东西? 2. BMI可以选择哪些启动模式? 三.BMI怎么用? 1. 每种启动模式对应的BMI值 2. BMI值的修改 ...

  6. LKT系列加密芯片DES加解密以及OpenSSL DES接口实现加解密

    1.测试目标 使用已经预置DES密钥的LKT4201N系列加密芯片完成运算 2.测试环境 本示例运行环境为windows系统.测试软件LCS KIT.LKT-K100开发板. 3.测试步骤 注意:&q ...

  7. 英飞凌XMC系列单片机教程 第一章,开发环境的搭建

    文章目录 1.xmc4500单片机简介 2.xmc4500开发环境 2.2,硬件开发环境 2.3 DAVE开发环境的使用 3.总结 1.xmc4500单片机简介 XMC4500 系列属于工业微控制器 ...

  8. freescale飞思卡尔 HC9S12 系列单片机 Flash擦写详解(三)之Flash控制器指令执行

    前面我们介绍了Flash主要的几个寄存器,如果还有其他的疑问可以再返回去看看或者直接查阅S12系列单片机的手册中相关的内容.这一节我将介绍Flash控制器指令执行的过程,并举出相关的例子,希望能够起到 ...

  9. freescale飞思卡尔 HC9S12 系列单片机 Flash擦写详解(一)之时钟设置

    Flash擦写的内容,个人做HC9S12系列单片机时觉得应该是各模块内容中最难而且是最麻烦的一步了.只有能够对Flash进行擦写以后,所做的Bootloader才有真正手段将串口或者其他通讯手段接收到 ...

  10. 【Java加解密系列】- SM2加解密

    上一篇博客介绍了SM2算法生成密钥的过程,详见-SM2生成密钥.这篇博客接着介绍SM2算法如何用上篇博客生成的密钥进行加解密操作. 因为密钥都是byte数组,在进行加解密前,我们需要将密钥转换成BC库 ...

最新文章

  1. mysql金库模式_Python vault-anyconfig包_程序模块 - PyPI - Python中文网
  2. 前端之图形学-2 着色器
  3. sql基础语句大杂烩
  4. 【Linux】FrameBuffer操作入门
  5. MYSQL为用户指定权限有哪些
  6. Helm 3 发布 | 云原生生态周报 Vol. 27
  7. Windows下的ssh姐妹花 Xshell 和 Xftp
  8. graph slam tutorial : 从推导到应用1
  9. HTC Vive 叠影器无法创建设备
  10. vs 移除项目代码管理
  11. 数字版权管理 (DRM) 续
  12. 断电oracle 01033,电脑非法关机 导致ORA-01033:解决方法
  13. 六级考研单词之路-三十八
  14. 深入理解JVM的内存结构及GC机制
  15. C++中的同名二义性和路径二义性
  16. 如何制作系统启动盘(U盘)
  17. 嘻哈说:设计模式之单一职责原则
  18. 每周教育关注 | 紧箍咒?《研究生导师指导行为准则》发布
  19. py实战项目进度甘特图绘制
  20. matlab中坐标轴的量程,origin中如何改变坐标量程

热门文章

  1. 数字视频编解码基础知识大全
  2. Android apk安装报错:应用未安装 软件包似乎已损坏
  3. 分治回溯--Nqueen
  4. 第一章 命题逻辑 1.4 析取范式与合取范式
  5. con和com开头单词规律_日语单词靠死记硬背?那你需要看看这篇文章了
  6. Python爬取豆瓣高分电影Top250
  7. 神经网络的起源和发展,神经网络的网络结构
  8. dategurd oracle_Oracle Data Guard
  9. 冰点还原标准版-中文版(全面支持Windows 7)7.0.020.3172(最新版)下载与注册
  10. 调用聚合数据新闻头条API