查看: 9063|回复: 2

[原创] 【经验分享】RT1050 HAB加密烧录实例讲解

[复制链接]

该用户从未签到

712

主题

6371

帖子

0

超级版主

Rank: 8Rank: 8

积分
24866
最后登录
2025-7-18
发表于 2019-11-9 15:19:33 | 显示全部楼层 |阅读模式
本帖最后由 小恩GG 于 2019-11-9 15:26 编辑

【经验分享】RT1050 HAB加密烧录实例讲解

一,文档介绍

      恩智浦RT系列可以支持多种启动模式,有无签名明文模式、HAB签名模式、HAB加密模式、BEE加密模式。

    为了搞清楚HAB加密app的具体结构情况,本文生成非XIPapp文件,然后通过flashloaderi.MX-RT1050里面的elftosb.exe工具生成相关的烧录文件,并且使用MFGTOOL 进入serial download模式下载。

    本文将主要讲RT1050HAB加密的相关操作下载步骤,并且分析HAB加密的代码实例结构情况。

二,RT1050HAB 加密操作步骤

首先分析下MFGtool烧录的步骤,具体需要哪些文件,这样好给与具体的准备, 首先打开flashloader如下路径中的ucl2.xml文件:

Flashloader_i.MXRT1050_GA\Flashloader_RT1050_1.1\Tools\mfgtools-rel\Profiles\MXRT105X\OSFirmware

因为需要使用HAB加密烧录,所以会使用MXRT105X-SecureBoot,可以看到ucl2.xml文件中先关代码如下:
1.jpg



1 MXRT1050-SecureBoot结构

从上面可以看到,要实现RT1050 secure boot,需要准备三个文件,分别为:

  • ivt_flashlloader_signed.bin:签名的flashloader文件
  • enable_hab.sb:修改SRK和HAB模式的fuse烧录文件
  • boot_image.sb:  HAB加密的app烧录文件


     这里先给出一个整体HAB加密步骤的流程图,然后再详细分步讲解。


2.jpg
2 MXRT1050 HAB加密流程图





     本文所使用的appRAM app,和之前分享的RT105x烧录RAM APPqspi flash image实例分析文档使用同一个app image 具体生成参考那篇文章。这里直接使用evkbimxrt1050_led_softwarereset_0xa000.s19,功能是烧录MIMXRT1050-EVKB 板子,灯闪烁,按下WAKEUP按键,即SW8,代码会实现软件复位并打印信息。不加密测试打印如下:

BOARD RESET start.

Helloworld.

WAKEUP keypressed, will do software system reset.



BOARD RESET start.

Helloworld.



2.1 CST工具准备

    请查看相关的应用笔记,给出应用笔记链接, 按照应用比较中要求去配置。




配置完成, cst中的cst.exe, crts文件夹, key文件夹拷贝到elftosb所在文件夹:

Flashloader_i.MXRT1050_GA\Flashloader_RT1050_1.1\Tools\elftosb\win

SRK_1_2_3_4_fuse.binSRK_1_2_3_4_table.bin也拷贝过去备用。  

2.2flashloader 签名

  参考AN12079 3.3.1章节,把flashloader.elf在文件夹:

Flashloader_i.MXRT1050_GA\Flashloader_RT1050_1.1\Flashloader

以及imx-flexspinor-normal-signed.bd 在文件夹:

Flashloader_i.MXRT1050_GA\Flashloader_RT1050_1.1\Tools\bd_file\imx10xx

拷贝到:

Flashloader_i.MXRT1050_GA\Flashloader_RT1050_1.1\Tools\elftosb\win

打开elftosb 输入命令:

elftosb.exe-f imx -V -c imx-flexspinor-flashloader-signed.bd -o ivt_flashloader_signed.binflashloader.elf

3.jpg

3. flashloader 签名

   生成的ivt_flashlaoder_signed.bin后面需要放到MFGtoolOS firmware文件夹,供进入serial downloader下载使用。

2.3 SRK HAB 模式fuse烧录文件

参考AN12079 4.3章节,把enable_hab.bd从文件夹:

Flashloader_i.MXRT1050_GA\Flashloader_RT1050_1.1\Tools\bd_file\imx10xx

拷贝到文件夹:

Flashloader_i.MXRT1050_GA\Flashloader_RT1050_1.1\Tools\elftosb\win

根据2.1章节生成的SRK_1_2_3_4_fuse.bin数据,修改enable_hab.bd,具体如下:

4.jpg

4. enable_hab.bd SRK HAB模式 fuse修改

然后在elftosb中输入如下命令,生成enable_hab.sb烧录文件:

elftosb.exe-f kinetis -V -c enable_hab.bd -o enable_hab.sb

5.jpg

5. SRK HAB模式修改烧录文件生成

2.4 APP加密文件

      HAB加密需要appnone XIP,所以这里准备一个RAM appsrec文件。

因为是RAM app,所以需要使用对应的ram 加密bd文件,把imx-itcm-encrypted.bd从文件夹:

Flashloader_i.MXRT1050_GA\Flashloader_RT1050_1.1\Tools\bd_file\imx10xx

拷贝到:

Flashloader_i.MXRT1050_GA\Flashloader_RT1050_1.1\Tools\elftosb\win

打开imx-itcm-encrypted.bd,修改内容:

options {

   flags = 0x0c;

   # Note: This is an example address, it can be any non-zero address inITCM region

   startAddress = 0x8000;

   ivtOffset = 0x1000;

   initialLoadSize = 0x2000;

   # Note: This is required if the cst and elftsb are not in the samefolder

   # Note: This is required if the default entrypoint is not theReset_Handler

   #       Please set theentryPointAddress to Reset_Handler address

entryPointAddress = 0x0000a2dd;

}

这里需要注意两个点:

(1)    ivtOffset = 0x1000;

如果是外部flexspiflash,改为0X1000,如果是nandflash,需要是0X400.

(2)entryPointAddress = 0x0000a2dd;

这个最好指定为APPreset handler,也就是代码起始地址+4对应的数据:

6.jpg

6. App reset handler 地址

然后在elftosb中输入如下命令:

elftosb.exe-f imx -V -c imx-itcm-encrypted.bd -oivt_evkbimxrt1050_led_softwarereset_0xa000_encrypted.binevkbimxrt1050_led_softwarereset_0xa000.s19

7.jpg

7. App HAB加密文件生成

这里要记录下生成的Key blob的偏移地址为0xa000,后面要修改到烧录bd文件中去。这步生成了一共7个文件:

1ivt_evkbimxrt1050_led_softwarereset_0xa000_encrypted.bin,该文件包含了FDCB0区域,IVT, BD, DCD, APP HAB 加密imageCSF区域数据。

2ivt_evkbimxrt1050_led_softwarereset_0xa000_encrypted_nopadding.bin,相对ivt_evkbimxrt1050_led_softwarereset_0xa000_encrypted.bin少了IVT前面的填0区域。

3 csf.bin HAB data数据区域,可以发现该数据包含了CSF的数据,正式生成文件ivt_evkbimxrt1050_led_softwarereset_0xa000_encrypted.bin中从0X80000x8F80的数据:

8.jpg

8. Csf数据和加密app的关系

4 dek.bin

9.jpg

9. Dek 数据

DEK数据是128bitskey,是HAB加密工具自动随机生成的。

5input.csf

打开内容如下:

10.jpg

10. Dek 数据

6rawbytes.bin,  正是image的明文数据,不带有FDCB,IVT,BOOTDATA, DCD, csf等。

7temp.bin,是一个临时文件,相对ivt_evkbimxrt1050_led_softwarereset_0xa000_encrypted.bin少了CSF数据。





2.5 HAB加密QSPI烧录文件

     这里需要准备一个program_flexspinor_image_qspinor_keyblob.bd文件放到elftosb的文件夹下,用于生成HAB加密烧录文件.sb。因为flashloader文件夹中没有直接的给出,这里贴出需要用的整个文件内容,便于大家使用,附件也会添加。

#The source block assign file name to identifiers

sources{

myBinFile = extern (0);

dekFile = extern (1);

}

constants{

   kAbsAddr_Start= 0x60000000;

    kAbsAddr_Ivt = 0x60001000;

    kAbsAddr_App = 0x60002000;

}


#The section block specifies the sequence of boot commands to be written to theSB file

section(0) {


    #1. Prepare Flash option

    # 0xc0000006 is the tag for Serial NORparameter selection

    # bit [31:28] Tag fixed to 0x0C

    # bit [27:24] Option size fixed to 0

    # bit [23:20] Flash type option

    #             0 - QuadSPI SDR NOR

    #             1 - QUadSPI DDR NOR

    #             2 - HyperFLASH 1V8

    #             3 - HyperFLASH 3V

    #             4 - Macronix Octal DDR

    #             6 - Micron Octal DDR

    #             8 - Adesto EcoXIP DDR

    # bit [19:16] Query pads (Pads used forquery Flash Parameters)

    #             0 - 1

    #             2 - 4

    #             3 - 8

    # bit [15:12] CMD pads (Pads used for queryFlash Parameters)

    #             0 - 1

    #             2 - 4

    #             3 - 8

    # bit [11: 08] Quad Mode Entry Setting

    #             0 - Not Configured, apply todevices:

    #                 - With Quad Mode enabled bydefault or

    #                 - Compliant with JESD216A/B orlater revision

    #             1 - Set bit 6 in Status Register 1

    #            2 - Set bit 1 in StatusRegister 2

    #             3 - Set bit 7 in Status Register 2

    #             4 - Set bit 1 in Status Register 2by 0x31 command

    # bit [07: 04]  Misc. control field

    #             3 - Data Order swapped, used for MacronixOctaFLASH devcies only (except MX25UM51345G)

    #             4 - Second QSPI NOR Pinmux

    # bit [03: 00] Flash Frequency, devicespecific

    load 0xc0000006 > 0x2000;

    # Configure QSPI NOR FLASH using option aaddress 0x2000

    enable flexspinor 0x2000;

   

    #2 Erase flash as needed.

    erase 0x60000000..0x60020000;


    #3. Program config block

    # 0xf000000f is the tag to notifyFlashloader to program FlexSPI NOR config block to the start of device

    load 0xf000000f > 0x3000;

    # Notify Flashloader to response the optionat address 0x3000

    enable flexspinor 0x3000;

   

    #5. Program image

    load myBinFile > kAbsAddr_Ivt;

               

                #6. Generate KeyBlob and programit to flexspinor

    # Load DEK to RAM

    load dekFile > 0x10100;

    # Construct KeyBlob Option

   #---------------------------------------------------------------------------

    # bit [31:28] tag, fixed to 0x0b

    # bit [27:24] type, 0 - Update KeyBlobcontext, 1 Program Keyblob to flexspinor

    # bit [23:20] keyblob option block size,must equal to 3 if type =0,

    #             reserved if type = 1

    # bit [19:08] Reserved

    # bit [07:04] DEK size, 0-128bit 1-192bit2-256 bit, only applicable if type=0

    # bit [03:00] Firmware Index, onlyapplicable if type = 1

    # if type = 0, next words indicate theaddress that holds dek

    #              the 3rd word

   #----------------------------------------------------------------------------

    # tag = 0x0b, type=0, block size=3, DEKsize=128bit

    load 0xb0300000 > 0x10200;

    # dek address = 0x10100

    load 0x00010100 > 0x10204;

    # keyblob offset in boot image

    # Note: this is only an example bd file,the value must be replaced with actual

    #      value in users project

    load 0x0000a000 > 0x10208;

    enable flexspinor 0x10200;

   

    #7. Program KeyBlob to firmware0 region

    load 0xb1000000 > 0x10300;

    enable flexspinor 0x10300;

}


这里要注意的就是 上文中的keyblob的地址要填成图7 标出来的地址:

    load 0x0000a000 > 0x10208;

有了program_flexspinor_image_qspinor_keyblob.bd 结合上面生成的

ivt_evkbimxrt1050_led_softwarereset_0xa000_encrypted_nopadding.bin

以及dek.bin,使用如下命令生成最终烧录用的boot_image.sb.

elftosb.exe-f kinetis -V -c program_flexspinor_image_qspinor_keyblob.bd -o boot_image.sbivt_evkbimxrt1050_led_softwarereset_0xa000_encrypted_nopadding.bin dek.bin

11.jpg

11. App HAB加密烧录文件生成

到目前为止,可以看到,所需要的烧录文件已经准备好。

2.6 MFG Tool烧录加密文件到RT1050 EVKB

       烧录之前,需要elftosb文件夹目录下的三个文件:

ivt_flashloader_signed.bin

enable_hab.sb

boot_image.sb

拷贝到:Flashloader_i.MXRT1050_GA\Flashloader_RT1050_1.1\Tools\mfgtools-rel\Profiles\MXRT105X\OSFirmware

修改 cfg.ini,路径为:

Flashloader_i.MXRT1050_GA\Flashloader_RT1050_1.1\Tools\mfgtools-rel

内容为:

[profiles]

chip =MXRT105X

[platform]

board =

[LIST]

name =MXRT105X-SecureBoot

选择为MXRT105X-SecureBoot烧录。

然后打开MfgTool2.exe,开发板MIMXRT1050-EVKB(修改外部电阻为qspi flash)的boot模式为serial download模式,SW7:1-OFF,2-OFF,3-OFF, 4-ON, 找两根USB线连接PCJ28以及J9。连接完成后,可以在MfgTool2.exe发现HID接口:

12.jpg

12. MFG tool 烧录

烧录完成后,断电, 启动模式改为 Internal bootSW7:1-OFF,2-OFF,3-ON, 4-OFF,连接串口,上电EVKB板子,复位之后,按下SW8可以看到如下打印信息:

BOARD RESET start.

Helloworld.

WAKEUP key pressed, will do software system reset.


?

BOARD RESETstart.

Helloworld.

板上D18 LED闪烁,所以加密之后功能还是可以工作的。

三,app加密文件结构分析

3.1 MCUBootUtility查看RT芯片数据配置

     这里,我们也可以使用MCUBootUtility工具去查看我们的fuse data,以及烧录之后的memory情况。

     如果是自行配置的CST 以及key,请将下面做下面文件配置:

   1)所有生产好的cst文件夹拷贝到:

NXP-MCUBootUtility-2.0.0\tools

替换原有cst文件夹

2SRK_1_2_3_4_fuse.binSRK_1_2_3_4_table.bin 拷贝到

NXP-MCUBootUtility-2.0.0\gen\hab_cert

这样,就可以直接使用修改后的MCUBootUtility去连接做过HAB加密的板子了.

3.1 RT1050烧录前后fuse对比

烧录前使用MCUBootUtility读出来的fuse map数据如下:

13.jpg

13. MIMXRT1050-EVKB加密前fuse map

14.jpg

14. MIMXRT1050-EVKB加密后fuse map

对比烧录前后数据,可以发现共有两处地方改变:

  • HAB模式0X460 bit1:0 open, 1 close
  • SRK区域


可以发现fuse修改后,和前面enable_hab.bd定义的数据是一样的。

3.2 APP RT QSPI 读出来的文件结构分析

MCUBootUtility的软件中,我们可以看到HAB 加密的内存结构如下:

15.jpg

15. HAB 加密image结构

那么实际情况是否是这样呢?下面我们用MCUBOOTUTILITY工具的读代码功能,从0X60000000读取0XB000大小。具体结构如下:

16.jpg

16. HAB 加密image实例结构

1):IVT: hdr IVT的头,具体见hab_hdr

2):   IVT: entry app entrypointAddress, 一般设为复位中断地址。也就是 0XA004复位中断地址的值,明文数据为0X00A2DD,不过由于HAB加密之后,看到的0X60002004的值已经是密文。

3):  IVT: reserved

4):  IVT: DCD 用于SDRAM SEMC的配置,如果没有用SDRAM,则没有。

5):  IVT: BOOT_DATA 指定BOOT_DATA的起始地址0X9020

6):  IVT: self, ivt本身的起始地址为0X9000

7):  IVT:CSF,指定CSF的起始地址,这里为0X00010000,实际把CSF HAB数据拷贝到RAM对应的地址。

8):  IVT:reserved

9): BOOT_DATA: startimage的起始地址,这里最终为ITCM0X80000XA000-0X2000=0X8000

10): BOOT_DATA: size, APP的总size大小,0X0000A200, 可以看到整个有效image结束的位置的大小确实是0XA200,如标号14所示。

11):  HAB 加密APP数据,可以对应ivt_evkbimxrt1050_led_softwarereset_0xa000_encrypted.bin的0X2000-0X7250数据,完全一致。

12):  HAB data,包含了csf, certificate等数据,可以对比ivt_evkbimxrt1050_led_softwarereset_0xa000_encrypted.bin的0X8000-0x8f70,数据完全一致。

13):  DEK blob, 即DEK key blob对应的数据,偏移地址为0XA000,和图7完全一致。

FDCB,IVT,BOOT DATA,均是明文。

App image区域为密文。 HAB数据和DEK blob都是生成好的数据直接放到对应的存储区域。

四,总结

     本文讲了使用elftosb以及MFGTool工具生成HAB加密代码并下载的整个步骤,并且使用MCUBootUtility工具读出来查看具体HAB加密image的结构。经过对比生成的中间文件和最终读出来的flash nor image文件,所有的加密片段数据完全一致,而且经过测试,功能正确,代码空间结构也完全满足HAB 加密的布局图,本文将所有的相关文件都以附件形式上传,有兴趣的网友可以自行操作和对比。经过3.1章节的配置,也可以直接使用MCUBootutility工具下载HAB加密代码。


【经验分享】RT1050 HAB加密烧录实例讲解.pdf (1.12 MB, 下载次数: 59)
回复

使用道具 举报

该用户从未签到

12

主题

49

帖子

0

中级会员

Rank: 3Rank: 3

积分
326
最后登录
2023-3-23
发表于 2019-11-9 15:52:19 | 显示全部楼层
我采用另外的办法绑定硬件 这代码加密确实好 用起来还得下点功夫, 着急就先缓一缓. 对了我的问题呢
回复 支持 反对

使用道具 举报

该用户从未签到

712

主题

6371

帖子

0

超级版主

Rank: 8Rank: 8

积分
24866
最后登录
2025-7-18
 楼主| 发表于 2019-11-11 10:16:17 | 显示全部楼层
wwllzz 发表于 2019-11-9 15:52
我采用另外的办法绑定硬件 这代码加密确实好 用起来还得下点功夫, 着急就先缓一缓. 对了我的问题呢 ...

代码加密,如果CST配置好了,其实MCUBootUtility工具就可以直接用了,这样会方便很多,我这边是因为之前遇到些问题,所以才走elftosb的方式去做的。
你的问题,我们这个月有专门的工程师在论坛值班,他会给你具体回复,还请多关注你的问题贴,谢谢。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 注册/登录

本版积分规则

关闭

站长推荐上一条 /3 下一条

Archiver|手机版|小黑屋|恩智浦技术社区

GMT+8, 2025-7-19 14:22 , Processed in 0.097758 second(s), 22 queries , MemCache On.

Powered by Discuz! X3.4

Copyright © 2001-2024, Tencent Cloud.

快速回复 返回顶部 返回列表