请选择 进入手机版 | 继续访问电脑版
查看: 1527|回复: 0

[分享] RT1050 HAB 加密映像文件的生成和分析

[复制链接]
  • TA的每日心情
    开心
    2024-3-26 15:16
  • 签到天数: 266 天

    [LV.8]以坛为家I

    3298

    主题

    6545

    帖子

    0

    管理员

    Rank: 9Rank: 9Rank: 9

    积分
    32000
    最后登录
    2024-4-9
    发表于 2020-11-6 15:37:41 | 显示全部楼层 |阅读模式


    1,简介
    恩智浦 RT 系列可以支持多种引导模式,包括:无签名映像文件模式、HAB 有签名映像文件模式、HAB 加密映像文件模式和 BEE 加密映像文件模式。
    为了了解 HAB 加密应用程序的特定结构,本文将生成一个非 XIP 模式的应用程序映像文件,然后通过 flashloader i.MX-RT1050 中的 elftosb.exe 工具生成相关的烧录文件,并使用MFGTOOL 进入串行下载模式以下载该 .sb 文件。
    本文将重点介绍与 RT1050 HAB 加密操作有关的下载步骤,并分析 HAB 加密的应用程序映像文件的结构。
    2,RT1050 HAB 加密操作步骤
    首先,我们分析 MFGtool 烧录的步骤,需要哪些文件,以便进行具体的准备,请在flashloader 工具的以下路径中打开 ucl2.xml 文件:
    Flashloader_i.MXRT1050_GA\Flashloader_RT1050_1.1\Tools\mfgtools-rel\Profiles\MXRT105X\OS Firmware
    因为我们需要使用 HAB 加密启动模式,所以我们将使用 MXRT105X-SecureBoot。在ucl2.xml 文件中,我们会看到以下相关代码:
    1.png
    图 1. MXRT1050-SecureBoot 结构
    从上面可以看到,要实现 RT1050 的安全启动,您需要准备以下三个文件:
    • ivt_flashlloader_signed.bin:已签名的 Flashloader 二进制文件
    • enable_hab.sb:用于修改熔丝图中的 SRK 和 HABmode
    • boot_image.sb:HAB 加密的应用程序文件
    这是整个 HAB 加密操作步骤的流程图,查看完此流程图后,我们将逐步进行操作。
    2.png
    图 2. MXRT1050 HAB 映像加密流程图
    我们在本文中使用的应用程序映像文件是 RAM 应用程序,因此,我们首先需要准备一个基于 RAM 的应用程序映像文件。在本文档中,我们直接使用一个准备好的基于 RAM 的应用程序映像文件:evkbimxrt1050_led_softwarereset_0xa000.s19,此应用程序代码的功能为:
    将代码下载到 MIMXRT1050-EVKB(qspi flash)板上之后,板上的 D18 会闪烁并从串口打印信息;按下 WAKEUP 按钮 SW8 之后,代码将执行软复位并从串口打印相关信息。无签名代码的测试打印结果如下:
    板复位开始。
    Helloworld.
    按下 WAKEUP 键,将进行软件系统重置。
    板复位开始。
    Helloworld.
    2.1 CST 工具准备
    由于其中包含许多步骤,因此客户可以参考以下文档进行相关配置,此文档中,我们将不提供 CST 配置的详细步骤。请查看以下文件:
    https://www.cnblogs.com/henjay724/p/10219459.html
    https://community.nxp.com/docs/DOC-340904
    安全应用笔记 AN12079
    配置完 CST 工具后,请将 cst.exe,crts filder,关键文件夹从 cst 文件夹复制到包含 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.bin flashloader.elf
    4.png
    图 3. flashloader 签名
    此步骤将生成 ivt_flashlaoder_signed.bin 文件,需要将其放入 MFGtool OS 固件文件夹下,用于进入有签名的 Flashloader 模式。
    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:
    5.png
    图 4. enable_hab.bd SRK 和 HAB 模式下熔丝的修改
    然后,在 elftosb 窗口中,输入以下命令,用于生成 enable_hab.sb 程序文件:elftosb.exe -f kinetis -V -c enable_hab.bd -o enable_hab.sb
    6.png
    图 5. SRK 和 HAB 模式下程序文件的生成
    2.4 APP 加密映像文件
    如果要下载 HAB 加密的映像文件,则需要准备一个非 XIP 模式的应用程序映像文件,这里我们准备了一个基于 RAM 的应用程序 srec 文件。
    由于应用程序文件是 RAM 文件,因此我们还需要相关的 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;
    #注意:这是一个示例地址,它可以是 ITCM 区域中的任何非零地址
    startAddress = 0x8000;
    ivtOffset = 0x1000;
    initialLoadSize = 0x2000;
    #注意:如果 cst 和 elftsb 不在同一文件夹中,则这是必需的
    #注意:如果默认入口点不是 Reset_Handler,则这是必需的
    #请将 entryPointAddress 设置为 Reset_Handler 地址
    entryPointAddress = 0x0000a2dd;
    }
    在这里,我们需要注意以下两点:
    (1)ivtOffset = 0x1000;
    如果外部闪存是 flexspi 闪存,则我们需要将 ivtOffset 修改为 0X1000;如果是 nandflash,则需要使用 0X400。
    (2)entryPointAddress = 0x0000a2dd;
    entryPointsAddress 应该是应用程序代码复位处理程序入口,它是应用程序起始地址+ 4的数据,使用入口地址也可以,但是我们建议您使用应用程序 Reset_Handler 地址。
    7.png
    图 6.应用程序复位处理程序地址
    然后在 elftosb 窗口中输入以下命令:
    elftosb.exe -f imx -V -c imx-itcm-encrypted.bd -oivt_evkbimxrt1050_led_softwarereset_0xa000_encrypted.binevkbimx
    rt1050_led_softwarereset_0xa000.s19
    8.png
    图 7. 应用程序 HAB 加密文件生成
    请注意,我们需要记录生成的密钥的 blob 偏移地址,即 0XA00,就像上面红色框中的数据,该地址将在下一章的.bd 文件中使用。完成此步骤后,它将生成 7 个文件:
    (1)ivt_evkbimxrt1050_led_softwarereset_0xa000_encrypted.bin,此文件包含填充为 0的 FDCB,IVT,BD,DCD,APP HAB 加密映像文件数据,CSF 数据
    (2)ivt_evkbimxrt1050_led_softwarereset_0xa000_encrypted_nopadding.bin , 与ivt_evkbimxrt1050_led_softwarereset
    _0xa000_encrypted.bin 比较,此文件将删除上述 IVT 范围中的 0。
    (3)Csf.bin , 它 是 HAB 数 据 区 域 , 您 可 以 在 生 成 的ivt_evkbimxrt1050_led_softwarereset_0xa000_encrypted.bin 文件中找到包含 csf 数据的内容,地址是从 0X8000 到 0X8F80。
    9.png
    图 8. Csf 数据与加密的应用程序关系
    (4) dek.bin
    10.png
    图 9. Dek 数据
    DEK 数据是 AES-128 位密钥,不是由客户定义的,它是由 HAB 加密工具自动随机生成的。
    (5) input.csf
    打开它,您可以看到以下内容:
    11.png
    图 10. 输入 csf 文件内容
    (6) rawbytes.bin,这是应用映像文件的纯文本数据,不包含 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 软件包中未包含该软件包,因此我们贴出了所有相关内容,并将其放在附件中。
    1. # The source block assign file name to identifiers
    2. sources {
    3. myBinFile = extern (0);
    4. dekFile = extern (1);
    5. }
    6. constants {
    7. kAbsAddr_Start= 0x60000000;
    8. kAbsAddr_Ivt = 0x60001000;
    9. kAbsAddr_App = 0x60002000;
    10. }
    11. # The section block specifies the sequence of boot commands to be written to the SB file
    12. section (0) {
    13. #1. Prepare Flash option
    14. # 0xc0000006 is the tag for Serial NOR parameter selection
    15. # bit [31:28] Tag fixed to 0x0C
    16. # bit [27:24] Option size fixed to 0
    17. # bit [23:20] Flash type option
    18. # 0 - QuadSPI SDR NOR
    19. # 1 - QUadSPI DDR NOR
    20. # 2 - HyperFLASH 1V8
    21. # 3 - HyperFLASH 3V
    22. # 4 - Macronix Octal DDR
    23. # 6 - Micron Octal DDR
    24. # 8 - Adesto EcoXIP DDR
    25. # bit [19:16] Query pads (Pads used for query Flash Parameters)
    26. # 0 - 1
    27. # 2 - 4
    28. # 3 - 8
    29. # bit [15:12] CMD pads (Pads used for query Flash Parameters)
    30. # 0 - 1
    31. # 2 - 4
    32. # 3 - 8
    33. # bit [11: 08] Quad Mode Entry Setting
    34. # 0 - Not Configured, apply to devices:
    35. # - With Quad Mode enabled by default or
    36. # - Compliant with JESD216A/B or later revision
    37. # 1 - Set bit 6 in Status Register 1
    38. # 2 - Set bit 1 in Status Register 2
    39. # 3 - Set bit 7 in Status Register 2
    40. # 4 - Set bit 1 in Status Register 2 by 0x31 command
    41. # bit [07: 04] Misc. control field
    42. # 3 - Data Order swapped, used for Macronix OctaFLASH devcies only (except
    43. MX25UM51345G)
    44. # 4 - Second QSPI NOR Pinmux
    45. # bit [03: 00] Flash Frequency, device specific
    46. load 0xc0000006 > 0x2000;
    47. # Configure QSPI NOR FLASH using option a address 0x2000
    48. enable flexspinor 0x2000;
    49. #2 Erase flash as needed.
    50. erase 0x60000000..0x60020000;
    51. #3. Program config block
    52. # 0xf000000f is the tag to notify Flashloader to program FlexSPI NOR config block to the start
    53. of device
    54. load 0xf000000f > 0x3000;
    55. # Notify Flashloader to response the option at address 0x3000
    56. enable flexspinor 0x3000;
    57. #5. Program image
    58. load myBinFile > kAbsAddr_Ivt;
    59. #6. Generate KeyBlob and program it to flexspinor
    60. # Load DEK to RAM
    61. load dekFile > 0x10100;
    62. # Construct KeyBlob Option
    63. #---------------------------------------------------------------------------
    64. # bit [31:28] tag, fixed to 0x0b
    65. # bit [27:24] type, 0 - Update KeyBlob context, 1 Program Keyblob to flexspinor
    66. # bit [23:20] keyblob option block size, must equal to 3 if type =0,
    67. # reserved if type = 1
    68. # bit [19:08] Reserved
    69. # bit [07:04] DEK size, 0-128bit 1-192bit 2-256 bit, only applicable if type=0
    70. # bit [03:00] Firmware Index, only applicable if type = 1
    71. # if type = 0, next words indicate the address that holds dek
    72. # the 3rd word
    73. #----------------------------------------------------------------------------
    74. # tag = 0x0b, type=0, block size=3, DEK size=128bit
    75. load 0xb0300000 > 0x10200;
    76. # dek address = 0x10100
    77. load 0x00010100 > 0x10204;
    78. # keyblob offset in boot image
    79. # Note: this is only an example bd file, the value must be replaced with actual
    80. # value in users project
    81. load 0x0000a000 > 0x10208;
    82. enable flexspinor 0x10200;
    83. #7. Program KeyBlob to firmware0 region
    84. load 0xb1000000 > 0x10300;
    85. enable flexspinor 0x10300;
    86. }
    复制代码
    请注意,在上一章的图 7 中,我们提到了密钥 blob 偏移地址,我们需要在以下代码中对其
    进行修改:
    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.sb ivt_evkbimxrt1050_led_softwarereset_0xa000_encrypted
    _nopadding.bin dek.bin
    12.png
    图 11. 应用程序 HAB 加密程序文件的生成
    至止,我们可以看到所有相关的 HAB 加密文件都已准备好。
    2.6 用 MFG 工具将 HAB 加密文件编程至 RT1050-EVKB
    在对它进行编程之前,请复制 elftosb 文件夹中的以下 3 个文件:
    ivt_flashloader_signed.bin
    enable_hab.sb
    boot_image.sb
    到此文件夹:
    Flashloader_i.MXRT1050_GA\Flashloader_RT1050_1.1\Tools\mfgtools-rel\Profiles\MXRT
    105X\OS Firmware
    请修改 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闪存)模式应为串行下载模式,只需修改 SW7:1-OFF,2-OFF,3-OFF, 4-ON,在 PC 与板上的 J28 和 J9 之间连接两根 USB 电缆。连接后,您会看到 MfgTool2.exe 可以检测到 HID
    设备:
    13.png
    图 12. MFG 工具编程
    编程完成后,关闭电路板电源,将启动模式更改为内部启动,即 SW7:1-OFF,2-OFF,3-ON,4-OFF,连接 COM 端,给 EVKB 板上电,复位后,您会看到 D18 指示灯闪烁,按下 SW8后,您会看到以下打印信息:
    1. BOARD RESET start.
    2. Helloworld.
    3. WAKEUP key pressed, will do software system reset.
    4. ?
    5. BOARD RESET start.
    6. Helloworld.
    复制代码
    至此,HAB 加密的映像文件可以正常工作了。
    3. HAB 加密的应用程序映像文件结构分析
    3.1 MCUBootUtility 配置以查看 RT 加密映像文件
    在这里,我们还可以使用 MCUBootUtility 工具查看 RT 芯片的加密映像文件和熔丝数据。
    如果 cst 是您自己配置的,请先进行以下配置:
    (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 熔丝图比较
    在进行 HAB 加密映像文件编程之前,我已经读取了整个熔丝图,如下图所示:

    14.png
    图 13. HAB 加密映像文件之前的 MIMXRT1050-EVKB 熔丝图
    15.png
    图 14. HAB 加密映像文件后的 MIMXRT1050-EVKB 熔丝图
    比较做过 HAB 加密的映像文件和不做 HAB 加密的映像文件之间的熔丝图,我们可以发现
    两个区别:
    ⚫ HAB 模式,0X460 位 1:0 打开,1 关闭
    ⚫ SRK 区域
    我们可以看到,在对 HAB 加密的映像文件进行编程之后,SRK 的熔丝数据与 enable_hab.bd
    中定义的 SRK 数据相同。
    3.2 读出的 HAB 加密的 QSPI 应用程序映像文件的结构分析
    通过 MCUBootUtility 工具,我们可以看到 HAB 加密映像文件的结构应如下所示:
    16.png
    图 15. HAB 加密的映像文件结构
    那么真正的映像文件的例子是怎样的呢?现在,我们使用 MCUbootUtility 工具从地址0X60000000 读取我们的 HAB 加密映像文件,读取大小为 0XB000。详细映像文件结构如下:
    17.png
    图 16. HAB 加密映像文件示例结构
    1):IVT:hdr,IVT 标头,更多详细信息请查看 hab_hdr
    2):IVT:entry,应用程序的入口地址,应该是 reset_handler 地址,在本文示例中,它是地址 0xa004 中的数据,明文是 0X00A2DD,但是经过 HAB 加密后,我们可以看到此地址数据为-x60002004,是个加密数据
    3):IVT:保留
    4):IVT:DCD,用于 DRAM SEMC 配置,在此示例中,我们未使用 SDDRAM,因此该数据为 0。
    5):IVT:BOOT_DATA,用于指示 BOOT_DATA RAM 的起始地址 0X9020。
    6):IVT:self,ivt 自有 RAM 的起始地址是 0X9000
    7):IVT:CSF,用于指示 CST 的起始地址,本例中的 csf ram 地址为 0X00010000。
    8):IVT:保留
    9):BOOT_DATA:RAM 映像文件开始,整个映像文件的 RAM 起始地址,此 RAM示例的 BOOT_DATA 为 0X8000, 0XA000-0X2000 = 0X8000
    10):BOOT_DATA:大小,应用程序的大小为 0X0000A200,检查生成的 HAB 加密的应用程序映像文件的大小后,可以发现映像文件的最终大小为 0XA200,就像图 16 所示。
    11):HAB 加密的应用程序数据,请查看ivt_evkbimxrt1050_led_softwarereset_0xa000_encrypted.bin 文件,地址 0X2000-0X7250,您会发现它是相同的。
    12):HAB 数据,其中包含 csf,certificate 等数据,可以比较文件ivt_evkbimxrt1050_led_softwarereset_0xa000_encrypted
    .bin 中 0X8000-0x8f70 地址的数据,
    它们是相同的。
    13):DEK blob,它是 DEK 密钥 blob 相关数据,偏移地址为 0XA000,与图 7 相同。FDCB,IVT,BOOT DATA 都是纯文本数据,但是应用程序映像文件区域是 HAB 加密的数据,HAB 和 DEK 块是要放入相关内存中的所生成的数据。
    4. 结论
    本文主要使用 elftosb 和 MFGTool 生成 HAB 加密的映像文件,并将其下载到 RT1050EVKB 板上,给出了整个过程的详细步骤,同时利用 MCUBootutility 工具读取 HAB 加密的映像文件,并结合实例分析了 HAB 加密的映像文件的结构。通过与生成的中间文件进行比较,我们可以发现所有数据都是一致的,并且所有加密的数据范围都是相同的。测试结果也证明了 HAB 加密代码的功能是有效的,HAB 加密的启动也没有问题。所有相关文件都在附件中。


    签到签到
    回复

    使用道具 举报

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

    本版积分规则

    关闭

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

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

    GMT+8, 2024-4-18 11:18 , Processed in 0.120833 second(s), 22 queries , MemCache On.

    Powered by Discuz! X3.4

    Copyright © 2001-2021, Tencent Cloud.

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