小猫爪:i.MX RT1050学习笔记20-安全启动4-实现HAB签名和HAB加密

  • 1 前言
  • 2 准备工作
    • 2.1 下载Flashloader
    • 2.2 下载CST
    • 2.3 安装OpenSSL
  • 3 实战操作
    • 3.1 生成公钥和公钥摘要
    • 3.2 生成公钥sb文件
    • 3.3 生成具有HAB签名的Flashloader镜像
    • 3.4 生成签名和加密的APP镜像sb文件
    • 3.5 烧写sb文件
  • 番外
  • END

1 前言

前面我们已经实现了HAB的签名,接下我们来实现HAB签名和HAB加密。

2 准备工作

2.1 下载Flashloader

下载网址:<<Flashloader_i.MX RT1050>>

下载下来解压后,如下图:

并在Tools文件夹下新建一个文件夹cst备用,如下图:

2.2 下载CST

下载网址:<<i.MX High Assurance Boot Reference Code Signing Tool>>

下载后,将其解压后,然后将解压的文件全部放入之前的新建文件夹cst中,如下图:
下载完还不行,之后还需要开启cst的加密功能,大家可以参照文章:《痞子衡嵌入式:开启NXP-MCUBootUtility工具的HAB加密功能 - CST(中英双语)》开启cst的加密功能,该文章中已经附上了开启加密功能后的cst文件,可以直接将下载后的cst.exe拷贝覆盖在官网上下的cst.exe(文件夹mingw32中)。

2.3 安装OpenSSL

在网站https://slproweb.com/products/Win32OpenSSL.html下载openssl的windows安装包,这里我选择是Win64 OpenSSL v1.1.1h Light,如下图:

下载后,点击安装,然后记住安装路径,接下来将OpenSSL的路径添加至windows环境变量路径,首先右击我的电脑,选择属性,选择改变设置,选择高级,选择环境变量,选择Path,选择编辑,选择新建,添加OpenSSL的安装路径下的bin,比如我添加的路径就是:C:\Program Files\OpenSSL-Win64\bin;最后点击确定。具体示范如下图:

3 实战操作

准备工作准备完毕,接下来,进行实战操作。

3.1 生成公钥和公钥摘要

进入文件夹*****\Flashloader_i.MXRT1050_GA\Flashloader_RT1050_1.1\Tools\cst\keys中,新建一个serial.txt,并且内容为8位数字,如下图:

再新建一个key_pass.txt,内容为2行,每行至少4个字符,如下图:

之后keys文件内容如下:

双击hab4_pki_tree.bat,出现命令提示行,然后根据相关提示进行操作,如下图:

完成最后操作后,你会发现在keys文件夹和crts文件中生成可很多文件,那就是证书相关数据。之后再启动一个cmd窗口,使用cd命令进入到****\Flashloader_i.MXRT1050_GA\Flashloader_RT1050_1.1\Tools\cst\mingw32\bin文件夹中(每个人的文件夹都不同,我这里就不贴具体命令了),进入该文件夹后再输入以下命令:

srktool -h 4 -t ../../keys/SRK_1_2_3_4_table.bin -e ../../keys/SRK_1_2_3_4_fuse.bin -d sha256 -c ../../crts/SRK1_sha256_2048_65537_v3_ca_crt.pem, ../../crts/SRK2_sha256_2048_65537_v3_ca_crt.pem, ../../crts/SRK3_sha256_2048_65537_v3_ca_crt.pem, ../../crts/SRK4_sha256_2048_65537_v3_ca_crt.pem -f 1

我的命令效果如下:

经过以上操作后,就会在cst/keys文件夹下生成两个文件,如下图:

SRK_1_2_3_4_table.bin里的数据就是原始公钥,SRK_1_2_3_4_fuse.bin里的数据就是公钥的HASH摘要值,之后我们需要将摘要值烧写进eFUSE。我们先打开看一下内容:

注意:crts文件中生成的数据包含私钥数据,不要轻易删除,那么新的image将无法被正确签名从而导致HAB认证失败无法被启动执行,因为公钥摘要已经烧写至eFUSE不容更改了。)

至此第一步生成公钥和公钥摘要已经完成了。

然后再进行以下操作:
①将\Flashloader_i.MXRT1050_GA\Flashloader_RT1050_1.1\Tools\cst文件夹下的crts和keys两个文件夹拷贝至\Flashloader_i.MXRT1050_GA\Flashloader_RT1050_1.1\Tools\elftosb\win下。

②再将\Flashloader_i.MXRT1050_GA\Flashloader_RT1050_1.1\Tools\cst\mingw32\bin文件夹下的cst.exe拷贝至\Flashloader_i.MXRT1050_GA\Flashloader_RT1050_1.1\Tools\elftosb\win下。

③在\Flashloader_i.MXRT1050_GA\Flashloader_RT1050_1.1\Tools\elftosb\win下新建文件夹flashloader,app,fuse,bd_file。

以上步骤完成后如下:

3.2 生成公钥sb文件

这一步的作用就是生成烧写文件,将该文件烧写进eFUSE,用来改变eFUSE值,内容有两个:①烧写公钥摘要值②使能安全启动。

在文件夹\Flashloader_i.MXRT1050_GA\Flashloader_RT1050_1.1\Tools\bd_file\imx10xx中找到文件enable_hab.bd,然后将其复制到在前面创建的fuse文件夹中,打开编辑它,将在上一步生成的SRK_1_2_3_4_fuse.bin中的公钥摘要值填入保存,具体操作如下图:

接下来开启cmd命令窗口,使用cd命令切换路径至***\Flashloader_i.MXRT1050_GA\Flashloader_RT1050_1.1\Tools\elftosb\win中,然后输入以下命令:

elftosb -f kinetis -V -c fuse/enable_hab.bd -o fuse/enable_hab.sb

我的操作结果如下:

之后就会在\Flashloader_i.MXRT1050_GA\Flashloader_RT1050_1.1\Tools\elftosb\win\fuse文件夹中生成enable_hab.sb文件,该文件就是将要被烧写到eFUSE中的文件,先保存后面待用。

3.3 生成具有HAB签名的Flashloader镜像

这一步的作用就是生成带有HAB签名的Flashloader镜像,让Flashloader可以在eFUSE烧写后也就是安全启动使能后也可以正常运行。

找到Flashloader_i.MXRT1050_GA\Flashloader_RT1050_1.2\Tools\bd_file\imx10xx\imx-dtcm-signed.bd文件,将其复制至之前创建的bd_file文件夹,并修改其中entryPointAddress的参数,大家可以打开Flashloader的镜像文件(Flashloader_i.MXRT1050_GA\Flashloader_RT1050_1.1\Flashloader)看一下:
根据图中的信息修改entryPointAddress = 20014B91:

options {flags = 0x08;startAddress = 0x20000000;ivtOffset = 0x400;initialLoadSize = 0x2000;entryPointAddress = 0x20014B91;//DCDFilePath = "dcd.bin";# Note: This is required if the cst and elftsb are not in the same folder // cstFolderPath = "/Users/nxf38031/Desktop/CSTFolder";# Note: This is required if the default entrypoint is not the Reset_Handler #       Please set the entryPointAddress to Reset_Handler address // entryPointAddress = 0x60002411;
}

接下来开启cmd命令窗口,使用cd命令切换路径至***\Flashloader_i.MXRT1050_GA\Flashloader_RT1050_1.1\Tools\elftosb\win中,然后输入以下命令:

elftosb -f imx -V -c bd_file/imx-dtcm-signed.bd -o flashloader/ivt_flashloader_signed.bin ../../../Flashloader/flashloader.srec

我的操作结果如下:

之后就会在\Flashloader_i.MXRT1050_GA\Flashloader_RT1050_1.1\Tools\elftosb\win\flashloader文件夹中生成以下文件:

至此带有HAB签名的Flashloader镜像文件就生成好了,留着备用。

3.4 生成签名和加密的APP镜像sb文件

这一步则是给APP镜像增加CSF部分,也就是增加签名。注意在这里待加密的镜像一定得是non-XIP的镜像,也就是说其链接地址必须是在RAM中,我这里拿了一个NXP官方的debug工程,并且修改了链接文件将APP代码的链接位置从ox0000变成0xa000如下:

(注意:为什么要把链接地址改成0xa000呢,因为启动设备时nor,需要在前面留出放置FCB,IVT,Boot Data等数据,当然也可以不是0xa000,也可以是其他地址。)

编译生成可执行镜像文件后,将待签名的APP镜像拷贝至app文件夹中(\Flashloader_i.MXRT1050_GA\Flashloader_RT1050_1.1\Tools\elftosb\win\app)如下图:

找到Flashloader_i.MXRT1050_GA\Flashloader_RT1050_1.2\Tools\bd_file\imx10xx\imx-itcm-encrypted.bd文件,将其复制至之前创建的bd_file文件夹,并修改其中的参数(因为我的APP链接地址在ITCM中,所以我使用的是imx10xx\imx-itcm-encrypted.bd文件,大家因根据实际情况修改bd文件,具体操作可参考文章:《小猫爪:i.MX RT1050学习笔记18-安全启动2-elftosb和MfgTool的使用》)。

修改后的bd文件如下:

options {flags = 0x0c;startAddress = 0x8000;ivtOffset = 0x1000;initialLoadSize = 0x2000;entryPointAddress = 0xa415;
}
.........
.........

开启cmd命令窗口,切换路径至***\Flashloader_i.MXRT1050_GA\Flashloader_RT1050_1.1\Tools\elftosb\win中,然后输入以下命令:

elftosb -f imx -V -c bd_file/imx-itcm-encrypted.bd -o app/ivt_led_blinky_encrypted.bin app/iled_blinky.s19


记住上图红框中的偏移地址:0x7000,这个地址我们会在后面会用到。

这样就会在app文件夹下生成带有签名和加密后的且还有头信息的镜像文件还有其他等文件,我们将所有生成的文件全部复制到app文件夹下(我复制是便于介绍,大家可以省略这一步)。如下图:

①ivt_led_blinky_encrypted.bin: 此文件包含填充为0的FCB, IVT, BD, DCD, APP HAB加密 映像文件数据, CSF数据
②ivt_led_blinky_encrypted_nopadding.bin :与ivt_led_blinky_encrypted.bin比较,此文件没有填充。
③csf.bi:镜像中的CSF数据,这部分数据可以在ivt_led_blinky_encrypted.bin找到。
④dek.bin,DEK数据是 AES 128位密钥,不是由客户定义的,它是由 HAB加密工具自动随机生成的,每一次加密都会改变,Flashloader会使用OTPMK加密dek生成key blob。
⑤input.csf:输入文件描述
⑥rawbytes.bin,这是应用映像文件的纯数据,不包含其他所有的附加信息。
⑦temp.bin,它是 一个临时文件,与ivt_led_blinky_encrypted.bin比较, 它不包含csf数据。

可以使用普通bd文件生成未加密的镜像文件对比一下:
可以看到APP数据部分已经完全不一样了,说明已经加密成功了。

接下来拷贝Flashloader_i.MXRT1050_GA\Flashloader_RT1050_1.1_2_encrypted\Tools\bd_file\imx10xx\program_flexspinor_image_hyperflash.bd至签名创建的bd_file文件夹,并改名program_flexspinor_image_hyperflash_encrypted.bd(便于区分),然后在文件的第4行以及倒数第二行插入添加信息,添加后如下:

# The source block assign file name to identifiers
sources {myBinFile = extern (0);dekFile = extern (1);
}
#..................
#..................#5. Program imageload myBinFile > kAbsAddr_Ivt;#6. Generate KeyBlob and program it to flexspinor load dekFile > 0x10100;load 0xb0300000 > 0x10200; load 0x00010100 > 0x10204; load 0x0000a000 > 0x10208;enable flexspinor 0x10200;load 0xb1000000 > 0x10300; enable flexspinor 0x10300;

然后修改其中一行:load 0x0000a000 > 0x10208; 之前上面需要记住的信息红框中的偏移地址,我的偏移地址是0x7000,所以我修改后如下:

 #6. Generate KeyBlob and program it to flexspinor load dekFile > 0x10100;load 0xb0300000 > 0x10200; load 0x00010100 > 0x10204; load 0x00007000 > 0x10208;enable flexspinor 0x10200;load 0xb1000000 > 0x10300; enable flexspinor 0x10300;

接下来输入以下命令生成sb文件(因为我使用的板子上的flash是hyperflash,所以我选择的bd文件是program_flexspinor_image_hyperflash.bd,大家需根据实际情况自己选择):

elftosb -f kinetis -V -c bd_file/program_flexspinor_image_hyperflash_encrypted.bd -o app/boot_image.sb app/ivt_led_blinky_encrypted_nopadding.bin dek.bin

操作结果如下图:

在app文件夹下生成的boot_image.sb就是我们需要烧写的启动文件,里面包含了启动配置以及镜像,留着备用。

3.5 烧写sb文件

注意:FUSE一旦烧写,将无法改变,烧写一定要慎重,烧写完私钥文件一定要保存好。)
①将之前生成的具有签名的flashloader镜像,公钥摘要的sb文件以及具有签名的镜像sb文件拷贝至文件夹***\Flashloader_i.MXRT1050_GA\Flashloader_RT1050_1.1\Tools\mfgtools-rel\Profiles\MXRT105X\OS Firmware中,如下图:

②编辑文件Flashloader_i.MXRT1050_GA\Flashloader_RT1050_1.1\Tools\mfgtools-rel\cfg.ini,修改其中的name值,如下:

.........
.........[LIST]name = MXRT105X-SecureBoot

③使BOOT_CFG=0x01,进入Serial Download模式,然后连接PC与芯片。

④进入文件夹***\Flashloader_i.MXRT1050_GA\Flashloader_RT1050_1.1\Tools\mfgtools-rel下,双击打开MfgTool2.exe。

点击Start下载。

点击Stop按钮,这样程序就下载完成了,切换RT1050使其从FLASH启动。

番外

在这里,我们使用MCUBootUtility工具查 看 RT芯片的加密,映像文件和熔丝数据。
(1) 将配置好的cst文件夹复制到以下文件夹:NXP MCUBootUtility\tools,删除原始的cst文件夹。
(2) 将 SRK_1_2_3_4_fuse.bin和 SRK_1_2_3_4_table.bin复制到以下文件夹:NXP MCUBootUtility\gen\hab_cert,现在,就可以使用新的MCUBootutility连接已经完成 HAB签名的RT1050了。

使用MCUBootUtility连接开发板,再读取FUSE的数据和之前的做比较,可以发现用来存储公钥摘要的SRK0~SRK7已经变成了SRK_1_2_3_4_fuse.bin里的数据,cfg1[1]也从0表成了1。

没有加密前的FUSE:
加密后的FUSE:

推荐大家使用NXP MCUBootUtility这个软件,可以一键实现上面所有的步骤,不要太爽哦。下载链接为:https://github.com/JayHeng/NXP-MCUBootUtility

END

小猫爪:i.MX RT1050学习笔记20-安全启动4-实现HAB签名和HAB加密相关推荐

  1. 小猫爪:i.MX RT1050学习笔记19-安全启动3-实现HAB签名

    小猫爪:i.MX RT1050学习笔记19-安全启动3-HAB签名 1 前言 2 准备工作 2.1 下载Flashloader 2.2 下载CST 2.3 安装OpenSSL 3 实战操作 3.1 生 ...

  2. 小猫爪:i.MX RT1050学习笔记2-下载

    小猫爪:i.MX RT1050学习笔记2-下载 1 前言 2 Flashloader和FLASH算法 2.1 FLASH算法 2.2 Flashloader 3 下载方式 END 1 前言 在前面介绍 ...

  3. 小猫爪:i.MX RT1050学习笔记6-Low Power

    小猫爪:i.MX RT1050学习笔记6-Low Power 1 前言 2 RT1050的电源管理 2.1 PMU(Power Management Unit) 2.2 GPC(General Pow ...

  4. 小猫爪:i.MX RT1050学习笔记3-CCM

    小猫爪:i.MX RT1050学习笔记3-CCM 1 前言 2 RT时钟的管理 3 CCM的结构 4 CCM的时钟树 5 时钟模块的具体功能 5.1 生成时钟 5.1.1 时钟源 5.1.2 7个PL ...

  5. 小猫爪:i.MX RT1050学习笔记7-Power Supply

    小猫爪:i.MX RT1050学习笔记7-Power Supply电源设计 1 前言 2 与电源相关的引脚 3 上电和掉电序列 4 关于片内DCDC模块 5 特殊引脚的处理 6 RT系列芯片由于电源波 ...

  6. 小猫爪:i.MX RT1050学习笔记4-IO系统

    小猫爪:i.MX RT1050学习笔记4-IO系统 1 前言 2 PAD 2.1 IORING 2.2 IOMUX 2.3 IOMUXC 3 GPIO 4 应用实例 1 前言 在介绍GPIO之前,不得 ...

  7. 小猫爪:i.MX RT1050学习笔记5-中断NVIC

    小猫爪:i.MX RT1050学习笔记5-中断NVIC 1 前言 2 中断号 3 中断优先级分组和中断优先级 4 相关操作函数 5 应用实例 5.1 RT1050 GPIO中断 5.2 中断配置过程 ...

  8. 小猫爪:i.MX RT1050学习笔记15-FlexSPI-FLASH使用3-KEIL FLASH算法中的使用

    小猫爪:i.MX RT1050学习笔记15-FlexSPI-FLASH使用3-KEIL FLASH算法中的使用 1 前言 2 FLASH算法解析 2.1 初始化Init 2.2 写操作 END 1 前 ...

  9. 小猫爪:i.MX RT1050学习笔记23-FreeRTOS移植之宇宙最详细

    小猫爪:i.MX RT1050学习笔记23-FreeRTOS移植之宇宙最详细 1 前言 2 准备 2.1 下载FreeRTOS源代码 2.2 准备一个RT1050的普通工程 3 移植 3.1 添加文件 ...

最新文章

  1. Spring Boot 实现通用 Auth 认证的 4 种方式
  2. 聊聊Cassandra的FailureDetector
  3. iis下 ActiveSync插件无法访问(下)
  4. python if语句多个条件-Python 条件语句(if..elif..else)
  5. postman中 form-data、x-www-form-urlencoded、raw、binary的区别--转
  6. 手动创建Github pull request
  7. 在 C++Builder 工程里调用 DLL 函数
  8. [Micropython]TPYBoard开发板点亮心形8*8点阵
  9. 《大数据技术原理与应用》—— 提纲
  10. Proteus的基本使用方法
  11. signature=946b61359fb7b919b57e636da83bf538,X-ray tube.
  12. 安森美推出ecoSpin系列,重新定义无刷直流电机控制
  13. 第二十九章 管理许可(二)
  14. 下一代通信的野心:超奈奎斯特!超香农?
  15. 最全的解酒方法-----让你千杯不...
  16. css中字母数字自动换行
  17. 乐山市计算机学校的董事长是,乐山市计算机学校庆祝建校25周年
  18. python一键替换_python 实现批量替换文本中的某部分内容
  19. 第一代计算机外星人,安蒂基西拉机器:疑是外星人留下的最早的计算机(4)
  20. tf好朋友之matplotlib的使用——secondary axis次坐标轴的使用

热门文章

  1. 匈牙利命名法(指导)
  2. ESP8266 发送数据和接收数据(万能模板)
  3. cb32a_c++_STL_算法_查找算法_(5)adjacent_find
  4. --Redis入坑--RedisPipelineException:Pipeline contained one or more invalid commands;WRONGTYPE ...
  5. (三)java流程控制语句
  6. 外网访问8080以及80端口失败问题解决
  7. python截取视频_python+ffmpeg截取视频段
  8. 一周热图|“惊鸿仙子”俞飞鸿代言日本高端美容仪品牌雅萌;“姐圈顶流”刘敏涛携手良品铺子总裁直播带货...
  9. rabbitmq系列(三)消息幂等性处理
  10. 机器学习2 分类与逻辑回归