查看: 3557|回复: 9

[原创] 【经验分享】RT1015 APP BEE加密烧录

[复制链接]

该用户从未签到

656

主题

6312

帖子

0

超级版主

Rank: 8Rank: 8

积分
19991
最后登录
2024-4-23
发表于 2020-8-19 16:09:37 | 显示全部楼层 |阅读模式
本帖最后由 小恩GG 于 2021-10-15 10:02 编辑

【经验分享】RT1015 APP BEE加密烧录
一 文档说明
   之前写过一篇RT1020使用MCUBootUtility工具实现BEE master key即fixed OTPMKSNVS key方式加密:
    在实际使用中,也有很多的客户需要使用flexible User key方式实现BEE加密,并且有些客户还想使用命令行方式,然后用MFGTool工具去下载代码。所以本篇文章,为了大家能够方便使用BEE模式,在MIMXRT1015-EVK的开发板上,使用user key,分别演示使用MCUBootUtility工具以及命令行模式去实现BEE的加密。
    本篇文章只做BEE加密,不做HAB签名。

二 相关准备
2.1 工具准备
   MCUBootUtility下载:
image_enc2.zip下载:
下载后放到NXP-MCUBootUtility-2.3.0\tools\image_enc2\win
SDK下载:

2.2 app文件准备
   本文以官方SDK_2.8.0_EVK-MIMXRT1015中的iled_blinky MCUXpresso IDE工程为例,生成不带BOOTHEADER的app文件:
1.jpg
图 1
生成evkmimxrt1015_igpio_led_output.s19原文件供后续使用。

三 MCUBootUtility BEE userkey加密
   本章使用MCUBootUtility工具实现BEEuser key加密,并且不是能HAB认证。
3.1 MIMXRT1015-EVK原始fuse状态
    读取未做加密的fuse状态,为了后续查看对比使用,使用MCUBootUtility工具的efuse operation utility可以把整个fuse map读取出来。
2.jpg
图 2
3.2 MCUbootutility BEE加密配置
3.jpg
图 3
由于本文只做BEE加密,不做HAB认证,所以,选择certificate 为no。
4.jpg
图 4
选择key storage region 为flexible user keys,即可变用户密钥。
这里保护区域只是从地址0X60001000开始,长度为0X2000,并没有把所有的app区域都做加密,这样可以对比生成的BEE加密文件,和原始文件从0X60003000开始,会是明文,前面区域0X60001000开始到0X60002FFF将是密文。
然后点击all in one action烧录代码:
5.jpg
图5
SW_GP2 region可以额外去烧录,点击burnDEK data即可。
烧完后,读取fuse map。
6.jpg
图6
可以看到cfg1已经改变,选择的BEE_KEY0_SEL来源为SW-GP2。
7.jpg
图7
对比BEE烧录后读出的文件和未加密的文件情况:
8.jpg
图8
9.jpg
图9
                                                                               10.jpg
图10
11.jpg
图11
                                                                               12.jpg
图12
可以发现,加密后的文件,确实是0X60001000到0X60002FFF被加密了。另外,在0X6000400区域添加了EKIB0, 0X6000480区域添加了EPRDB0。因为没有选择BEE engine1,只选择了BEE engine0,所以 0X60008000开始的EKIB1,EPRDB1区域没有有效数据。
到目前为止,已经实现了MCUBootUtility工具的BEE加密。退出serial download模式,配置MIMXRT1015-EVK板上sw8 1-ON,2-OFF,3-ON,4-OFF,复位开发板,可以看到小灯能够闪烁。

四 命令行模式
由于有些客户需要使用命令行模式实现BEE加密,并且选择MFGTool下载方式,所以本文给出如何使用SDK里SDK_2.8.0_EVK-MIMXRT1015\middleware\mcu-boot\bin\Tools去实现BEE命令行以及image_enc工具加密app,并且使用MFGTool烧录到RT1015中。
由于从SDK2.8.0开始,blhost, elftosb等工具不再打包到SDK中,所以需要额外到官网:www.nxp.com/mcuboot 下载。

4.1 命令行文件准备
准备一个文件夹,把elftosb.exe,image_enc.exe,app文件
evkmimxrt1015_iled_blinky_0x60002000.s19,RemoveBinaryBytes.exe都拷贝进去。
RemoveBinaryBytes.exe是用来修改bin文件的,该文件会在附件中给出。
然后准备如下几个文件:
imx-flexspinor-normal-unsigned.bd
imxrt1015_app_flash_sb_gen.bd
burn_fuse.bd

4.1.1imx-flexspinor-normal-unsigned.bd
imx-flexspinor-normal-unsigned.bd 文件用于生成evkmimxrt1015_iled_blinky_0x60002000.s19对应的bootable .bin文件,即带有IVT头的文件:
ivt_evkmimxrt1015_iled_blinky_0x60002000.bin
ivt_evkmimxrt1015_iled_blinky_0x60002000_nopadding.bin
bd内容为:
  1. <p>options {
  2.     flags = 0x00;
  3.     startAddress = 0x60000000;
  4.     ivtOffset = 0x1000;
  5.     initialLoadSize = 0x2000;
  6.     //DCDFilePath = "dcd.bin";
  7.     # Note: This is required if the default entrypoint is not the Reset_Handler
  8.     #       Please set the entryPointAddress to Reset_Handler address
  9.     // entryPointAddress = 0x60002000;
  10. }</p><p>sources {
  11.     elfFile = extern(0);
  12. }</p><p>section (0)
  13. {
  14. }
  15. </p>
复制代码

4.1.2 imxrt1015_app_flash_sb_gen.bd
  该文件用于配置外部QSPIflash,并且实现烧录功能,通常用该文件生成.sb文件,最后用MFGTool去下载.SB文件。
  1. sources {
  2.     myBinFile = extern (0);
  3. }

  4. section (0) {
  5.     load 0xc0000007 > 0x20202000;
  6.     load 0x0 > 0x20202004;
  7.     enable flexspinor 0x20202000;
  8.     erase  0x60000000..0x60005000;
  9.     load 0xf000000f > 0x20203000;
  10.     enable flexspinor 0x20203000;
  11.     load  myBinFile > 0x60000400;
  12. }
复制代码

4.1.3 burn_fuse.bd
BEE方式需要修改fuse数据,但是Fuse是只写一次的,所以这里将写fuse的操作分开,第一次BEE没有烧录Fuse的情况下,去烧录对应的fuse,否则后续更改app烧录,就不加fuse烧录步骤。Burn_fuse.bd主要用于配置需要烧录的fuse值到具体fuse区域,然后生成.sb文件,最后用MFGTool和烧录app一并烧录。

  1. # The source block assign file name to identifiers
  2. sources {
  3. }

  4. constants {
  5. }

  6. #                !!!!!!!!!!!! WARNING !!!!!!!!!!!!
  7. # The section block specifies the sequence of boot commands to be written to the SB file
  8. # Note: this is just a template, please update it to actual values in users' project
  9. section (0) {

  10.     # program SW_GP2
  11.     load fuse 0x76543210 > 0x29;
  12.     load fuse 0xfedcba98 > 0x2a;
  13.     load fuse 0x89abcdef > 0x2b;
  14.     load fuse 0x01234567 > 0x2c;
  15.    
  16.     # Program BEE_KEY0_SEL
  17.     load fuse 0x00003000 > 0x6;
  18.    
  19. }
复制代码

4.2 BEE命令行步骤
新建rt1015_bee_userkey_gp2.bat文件,内容为:
  1. elftosb.exe -f imx -V -c imx-flexspinor-normal-unsigned.bd -o ivt_evkmimxrt1015_iled_blinky_0x60002000.bin evkmimxrt1015_iled_blinky_0x60002000.s19

  2. image_enc.exe hw_eng=bee ifile=ivt_evkmimxrt1015_iled_blinky_0x60002000.bin ofile=evkmimxrt1015_iled_blinky_0x60002000_bee_encrypted.bin base_addr=0x60000000 region0_key=0123456789abcdeffedcba9876543210 region0_arg=1,[0x60001000,0x2000,0] region0_lock=0 use_zero_key=1 is_boot_image=1

  3. RemoveBinaryBytes.exe evkmimxrt1015_iled_blinky_0x60002000_bee_encrypted.bin evkmimxrt1015_iled_blinky_0x60002000_bee_encrypted_remove1K.bin 1024

  4. elftosb.exe -f kinetis -V -c program_imxrt1015_qspi_encrypt_sw_gp2.bd -o boot_image_encrypt.sb evkmimxrt1015_iled_blinky_0x60002000_bee_encrypted_remove1K.bin

  5. elftosb.exe -f kinetis -V -c burn_fuse.bd -o burn_fuse.sb

  6. pause
复制代码
一共分为五步:

4.2.1 elftosb生成app带IVT文件
elftosb.exe -f imx -V -cimx-flexspinor-normal-unsigned.bd -oivt_evkmimxrt1015_iled_blinky_0x60002000.binevkmimxrt1015_iled_blinky_0x60002000.s19
该命令执行后会产生两个带IVT头的文件:ivt_evkmimxrt1015_iled_blinky_0x60002000.bin,ivt_evkmimxrt1015_iled_blinky_0x60002000_nopadding.bin
这里使用ivt_evkmimxrt1015_iled_blinky_0x60002000.bin

4.2.2 image_enc 生成app对应的BEE加密文件
image_enc.exe hw_eng=beeifile=ivt_evkmimxrt1015_iled_blinky_0x60002000.binofile=evkmimxrt1015_iled_blinky_0x60002000_bee_encrypted.binbase_addr=0x60000000 region0_key=0123456789abcdeffedcba9876543210region0_arg=1,[0x60001000,0x2000,0] region0_lock=0 use_zero_key=1is_boot_image=1
关于image_enc中每一项关键字的含义,可以直接运行image_enc查看:
13.jpg

图13
该命令执行的结果将会和MCUBOOTutility的配置一样。加密区域从0X60001000开始,长度为0X2000。具体项目也可以参考图4.
运行之后获得文件:
evkmimxrt1015_iled_blinky_0x60002000_bee_encrypted.bin

4.2.3 RemoveBinaryBytes去掉BEE加密文件开头1024字节
RemoveBinaryBytes.exe evkmimxrt1015_iled_blinky_0x60002000_bee_encrypted.binevkmimxrt1015_iled_blinky_0x60002000_bee_encrypted_remove1K.bin 1024
该命令用于去掉BEE加密文件开始的0X400长度的数据,这样修改后的加密文件将会直接从EKIB0开始。
运行之后,获得:
evkmimxrt1015_iled_blinky_0x60002000_bee_encrypted_remove1K.bin

4.2.4 elftosb生成BEE加密app对应的sb文件
elftosb.exe -f kinetis -V -cprogram_imxrt1015_qspi_encrypt_sw_gp2.bd -o boot_image_encrypt.sbevkmimxrt1015_iled_blinky_0x60002000_bee_encrypted_remove1K.bin
该命令用于把evkmimxrt1015_iled_blinky_0x60002000_bee_encrypted_remove1K.bin文件结合program_imxrt1015_qspi_encrypt_sw_gp2.bd生成可以使用MFGTool烧录到外部QSPI的sb文件。
运行之后获得:
boot_image_encrypt.sb

4.2.5 elftosb生成fuse烧写对应的sb文件
elftosb.exe -f kinetis -V -cburn_fuse.bd -o burn_fuse.sb
该命令用于生成BEE需要烧写fuse的对应sb文件,后续将会和boot_image_encrypt.sb
一并使用MFGTool烧录。但是一旦fuse已经烧录之后,将不在需要这个sb文件,直接烧录对应的app加密文件即可。
运行之后获得:
burn_fuse.sb

4.3 MFGTool烧录
  MIMXRT1015-EVK开发板进入serial downloader模式,找两根USB分别接到J41,J9。
  MFGTool可以在SDK_2.8.0_EVK-MIMXRT1015\middleware\mcu-boot\bin\Tools\mfgtools-rel找到。
  如果要烧写burn_fuse.sb,需要修改ucl2.xml,路径:
\SDK_2.8.0_EVK-MIMXRT1015\middleware\mcu-boot\bin\Tools\mfgtools-rel\Profiles\MXRT1015\OSFirmware
  可以添加如下项目实现
  1. <LIST name="MXRT1015-beefuse_DevBoot" desc="Boot Flashloader">
  2. <!-- Stage 1, load and execute Flashloader -->   
  3.     <CMD state="BootStrap" type="boot" body="BootStrap" file="ivt_flashloader.bin" > Loading Flashloader. </CMD>
  4.     <CMD state="BootStrap" type="jump"  onError = "ignore"> Jumping to Flashloader. </CMD>

  5. <!-- Stage 2, burn BEE related fuse using Flashloader -->  
  6.     <CMD state="Blhost" type="blhost" body="get-property 1" > Get Property 1. </CMD> <!--Used to test if flashloader runs successfully-->
  7.     <CMD state="Blhost" type="blhost" body="receive-sb-file "Profiles\\MXRT1015\\OS Firmware\\burn_fuse.sb"" > Program Boot Image. </CMD>
  8.     <CMD state="Blhost" type="blhost" body="reset" > Reset. </CMD> <!--Reset device-->

  9. <!-- Stage 3, Program boot image into external memory using Flashloader -->   
  10.     <CMD state="Blhost" type="blhost" body="get-property 1" > Get Property 1. </CMD> <!--Used to test if flashloader runs successfully-->
  11.     <CMD state="Blhost" type="blhost" timeout="15000" body="receive-sb-file "Profiles\\MXRT1015\\OS Firmware\\boot_image.sb"" > Program Boot Image. </CMD>
  12.     <CMD state="Blhost" type="blhost" body="Update Completed!">Done</CMD>
  13. </list>
复制代码
如果已经烧录过Fuse,再更新app,只需要用MIMXRT1015-DevBoot
  1. <LIST name="MXRT1015-DevBoot" desc="Boot Flashloader">
  2. <!-- Stage 1, load and execute Flashloader -->   
  3.     <CMD state="BootStrap" type="boot" body="BootStrap" file="ivt_flashloader.bin" > Loading Flashloader. </CMD>
  4.     <CMD state="BootStrap" type="jump"  onError = "ignore"> Jumping to Flashloader. </CMD>

  5. <!-- Stage 2, Program boot image into external memory using Flashloader -->   
  6.     <CMD state="Blhost" type="blhost" body="get-property 1" > Get Property 1. </CMD> <!--Used to test if flashloader runs successfully-->
  7.     <CMD state="Blhost" type="blhost" timeout="15000" body="receive-sb-file "Profiles\\MXRT1015\\OS Firmware\\boot_image.sb"" > Program Boot Image. </CMD>
  8.     <CMD state="Blhost" type="blhost" body="Update Completed!">Done</CMD>
  9. </list>
复制代码
具体选择哪个list,可以在cfg.ini中的name去配置:
  1. [profiles]

  2. chip = MXRT1015

  3. [platform]

  4. board =

  5. [LIST]

  6. name = MXRT1015-DevBoot
复制代码
由于我这边已经用MCUBootUtility烧录过fuse,所以直接使用MXRT1015-DevBoot下载app.sb
14.jpg
图14
可以看到,能够成功烧录。
点击stop,配置MIMXRT1015-EVK板上sw8 1-ON,2-OFF,3-ON,4-OFF,复位开发板,可以看到小灯能够闪烁。命令行也成完成BEE代码的烧录。
kerry rt1015 bee file.zip (68.8 KB, 下载次数: 22)
回复

使用道具 举报

该用户从未签到

4

主题

10

帖子

0

注册会员

Rank: 2

积分
105
最后登录
2022-5-12
发表于 2020-9-1 12:15:01 | 显示全部楼层
小管,我也写了类似的,帮忙置顶啊,谢谢
http://www.cnblogs.com/technology-jingxinwen/p/12851247.html
回复 支持 反对

使用道具 举报

该用户从未签到

656

主题

6312

帖子

0

超级版主

Rank: 8Rank: 8

积分
19991
最后登录
2024-4-23
 楼主| 发表于 2020-9-11 14:42:31 | 显示全部楼层
文qwe 发表于 2020-9-1 12:15
小管,我也写了类似的,帮忙置顶啊,谢谢
http://www.cnblogs.com/technology-jingxinwen/p/12851247.html ...

https://www.nxpic.org.cn/module/forum/thread-620880-1-1.html
已经被搬过来啦!
回复 支持 反对

使用道具 举报

该用户从未签到

0

主题

2

帖子

0

新手上路

Rank: 1

积分
14
最后登录
2021-10-26
发表于 2020-11-4 15:06:18 | 显示全部楼层
您好,3.2中图4设置加密区域时,可以对image占用区域以外的地址加密吗?
回复 支持 反对

使用道具 举报

该用户从未签到

656

主题

6312

帖子

0

超级版主

Rank: 8Rank: 8

积分
19991
最后登录
2024-4-23
 楼主| 发表于 2020-11-4 18:08:55 | 显示全部楼层
wwwla5df58 发表于 2020-11-4 15:06
您好,3.2中图4设置加密区域时,可以对image占用区域以外的地址加密吗?

签名FDBC IVT, DCD 等你不用加密,其他区域随便加密。
回复 支持 反对

使用道具 举报

该用户从未签到

0

主题

2

帖子

0

新手上路

Rank: 1

积分
14
最后登录
2021-10-26
发表于 2020-11-4 19:34:17 | 显示全部楼层
小恩GG 发表于 2020-11-4 18:08
签名FDBC IVT, DCD 等你不用加密,其他区域随便加密。

再请教个问题:我现在有两个app:app_1、app_2,用MCUBootUtility工具BEE加密下传了app_1,同时加密了另一块区域Z(准备放app2);app_2.bin 通过上文4.2.2中的方法用image_enc 生成对应的BEE加密文件app_2_bee.bin。运行app_1时,把app_2_bee.bin写入了区域Z,那app_1运行中读取加密区域Z的内容应该是非加密的app_2.bin的数据吗?打印出来的区域Z数据既不是app_2加密前也不是加密后的数据,请问会是哪的问题?(用的用户密码一样)
期待您的回复,谢谢
回复 支持 反对

使用道具 举报

  • TA的每日心情
    开心
    2023-7-27 16:05
  • 签到天数: 1 天

    [LV.1]初来乍到

    17

    主题

    81

    帖子

    0

    金牌会员

    Rank: 6Rank: 6

    积分
    1276
    最后登录
    2024-4-17
    发表于 2021-10-12 11:05:14 | 显示全部楼层
    请问 这个文件如何获得?program_imxrt1015_qspi_encrypt_sw_gp2.bd
    哎...今天够累的,签到来了~
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    656

    主题

    6312

    帖子

    0

    超级版主

    Rank: 8Rank: 8

    积分
    19991
    最后登录
    2024-4-23
     楼主| 发表于 2021-10-15 10:03:30 | 显示全部楼层
    爱喝柠檬水 发表于 2021-10-12 11:05
    请问 这个文件如何获得?program_imxrt1015_qspi_encrypt_sw_gp2.bd

    楼主你好,可能当时打包给打漏了。
    现在放到附件里面了,
    program_imxrt1015_qspi_encrypt_sw_gp2.bd内容是这样的:

    sources {
        myBinFile = extern (0);
    }

    section (0) {
        load 0xc0000007 > 0x20202000;
        load 0x0 > 0x20202004;
        enable flexspinor 0x20202000;
        erase  0x60000000..0x60005000;
        load 0xf000000f > 0x20203000;
        enable flexspinor 0x20203000;
        load  myBinFile > 0x60000400;
    }
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    656

    主题

    6312

    帖子

    0

    超级版主

    Rank: 8Rank: 8

    积分
    19991
    最后登录
    2024-4-23
     楼主| 发表于 2021-10-15 10:07:38 | 显示全部楼层
    wwwla5df58 发表于 2020-11-4 19:34
    再请教个问题:我现在有两个app:app_1、app_2,用MCUBootUtility工具BEE加密下传了app_1,同时加密了另 ...

    楼主你好!
    BEE加密引擎的地方选择了加密区域,如果你Z区域本身是加密的,那么你直接打印应该也是加密的。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    0

    主题

    1

    帖子

    0

    新手上路

    Rank: 1

    积分
    30
    最后登录
    2022-7-27
    发表于 2022-7-15 22:46:23 | 显示全部楼层
    小恩GG你好,想问下这个BEE加密烧录,是在PC端的工具里使用master key软件算法加密文件么?加密文件后再通过sram的flashloader下载到片外nor flash么?
    回复 支持 反对

    使用道具 举报

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

    本版积分规则

    关闭

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

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

    GMT+8, 2024-4-23 19:59 , Processed in 0.143393 second(s), 28 queries , MemCache On.

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.

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