本帖最后由 小恩GG 于 2019-11-9 15:26 编辑
【经验分享】RT1050 HAB加密烧录实例讲解
一,文档介绍
恩智浦RT系列可以支持多种启动模式,有无签名明文模式、HAB签名模式、HAB加密模式、BEE加密模式。
为了搞清楚HAB加密app的具体结构情况,本文生成非XIP的app文件,然后通过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 MXRT1050-SecureBoot结构
从上面可以看到,要实现RT1050 的secure boot,需要准备三个文件,分别为:
ivt_flashlloader_signed.bin:签名的flashloader文件 enable_hab.sb:修改SRK和HAB模式的fuse烧录文件 boot_image.sb: HAB加密的app烧录文件
这里先给出一个整体HAB加密步骤的流程图,然后再详细分步讲解。
图2 MXRT1050 HAB加密流程图
本文所使用的app是RAM app,和之前分享的RT105x烧录RAM APP到qspi 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.bin和SRK_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. flashloader 签名
生成的ivt_flashlaoder_signed.bin后面需要放到MFGtool的OS 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. enable_hab.bd SRK HAB模式 fuse修改
然后在elftosb中输入如下命令,生成enable_hab.sb烧录文件:
elftosb.exe-f kinetis -V -c enable_hab.bd -o enable_hab.sb
图5. SRK HAB模式修改烧录文件生成
2.4 APP加密文件
HAB加密需要app为none XIP,所以这里准备一个RAM app的srec文件。
因为是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;
这个最好指定为APP的reset handler,也就是代码起始地址+4对应的数据:
图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. App HAB加密文件生成
这里要记录下生成的Key blob的偏移地址为0xa000,后面要修改到烧录bd文件中去。这步生成了一共7个文件:
(1)ivt_evkbimxrt1050_led_softwarereset_0xa000_encrypted.bin,该文件包含了FDCB填0区域,IVT, BD, DCD, APP HAB 加密image,CSF区域数据。
(2)ivt_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中从0X8000到0x8F80的数据:
图8. Csf数据和加密app的关系
(4) dek.bin,
图9. Dek 数据
DEK数据是128bits的key,是HAB加密工具自动随机生成的。
(5)input.csf
打开内容如下:
图10. Dek 数据
(6)rawbytes.bin, 正是image的明文数据,不带有FDCB,IVT,BOOTDATA, DCD, csf等。
(7)temp.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. 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线连接PC和J28以及J9。连接完成后,可以在MfgTool2.exe发现HID接口:
图12. MFG tool 烧录
烧录完成后,断电, 启动模式改为 Internal boot,SW7: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芯片数据配置
如果是自行配置的CST 以及key,请将下面做下面文件配置:
(1)所有生产好的cst文件夹拷贝到:
NXP-MCUBootUtility-2.0.0\tools
替换原有cst文件夹
(2)SRK_1_2_3_4_fuse.bin和SRK_1_2_3_4_table.bin 拷贝到
NXP-MCUBootUtility-2.0.0\gen\hab_cert
这样,就可以直接使用修改后的MCUBootUtility去连接做过HAB加密的板子了.
3.1 RT1050烧录前后fuse对比
烧录前使用MCUBootUtility读出来的fuse map数据如下:
图13. MIMXRT1050-EVKB加密前fuse map
图14. MIMXRT1050-EVKB加密后fuse map
对比烧录前后数据,可以发现共有两处地方改变:
可以发现fuse修改后,和前面enable_hab.bd定义的数据是一样的。
3.2 APP 从RT QSPI 读出来的文件结构分析
从MCUBootUtility的软件中,我们可以看到HAB 加密的内存结构如下:
图15. HAB 加密image结构
那么实际情况是否是这样呢?下面我们用MCUBOOTUTILITY工具的读代码功能,从0X60000000读取0XB000大小。具体结构如下:
图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: start,image的起始地址,这里最终为ITCM的0X8000,0XA000-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加密代码。
|